[tryton-debian-vcs] tryton-client branch upstream updated. upstream/3.2.4-1-gda60d82
Mathias Behrle
tryton-debian-vcs at alioth.debian.org
Thu Oct 23 12:11:38 UTC 2014
The following commit has been merged in the upstream branch:
https://alioth.debian.org/plugins/scmgit/cgi-bin/gitweb.cgi/?p=tryton/tryton-client.git;a=commitdiff;h=upstream/3.2.4-1-gda60d82
commit da60d82586cc542263bc305e34cacaf0642e0510
Author: Mathias Behrle <mathiasb at m9s.biz>
Date: Tue Oct 21 11:29:01 2014 +0200
Adding upstream version 3.4.0.
Signed-off-by: Mathias Behrle <mathiasb at m9s.biz>
diff --git a/CHANGELOG b/CHANGELOG
index be6184e..26291ea 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,14 +1,15 @@
-Version 3.2.4 - 2014-09-29
-* Bug fixes (see mercurial logs for details)
-
-Version 3.2.3 - 2014-08-03
-* Bug fixes (see mercurial logs for details)
-
-Version 3.2.2 - 2014-07-02
-* Bug fixes (see mercurial logs for details)
-
-Version 3.2.1 - 2014-05-07
+Version 3.4.0 - 2014-10-20
* Bug fixes (see mercurial logs for details)
+* Add DnD on export window
+* Allow to overide predefined export
+* Prefill export window with current view fields
+* Manage field context on Group value
+* Add export of selection string
+* Load plugins from local user directory
+* Manage tree_state attribute
+* Add simple tree_state support on form view
+* Change range operator of search widget to be included
+* Explicitly set value of parent field
Version 3.2.0 - 2014-04-21
* Bug fixes (see mercurial logs for details)
diff --git a/PKG-INFO b/PKG-INFO
index 8bd6c16..d23ca40 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: tryton
-Version: 3.2.4
+Version: 3.4.0
Summary: Tryton client
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: issue_tracker at tryton.org
License: GPL-3
-Download-URL: http://downloads.tryton.org/3.2/
+Download-URL: http://downloads.tryton.org/3.4/
Description: tryton
======
diff --git a/doc/conf.py b/doc/conf.py
index 22adaab..27e91e8 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -46,9 +46,9 @@ copyright = u'2008-2011, Anne Krings, Bertrand Chenal, Cédric Krier, \
# built documents.
#
# The short X.Y version.
-version = '3.2'
+version = '3.4'
# The full version, including alpha/beta/rc tags.
-release = '3.2'
+release = '3.4'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
diff --git a/doc/usage.rst b/doc/usage.rst
index 16f0120..863c8f3 100644
--- a/doc/usage.rst
+++ b/doc/usage.rst
@@ -474,7 +474,7 @@ Save Width/Height:
.. _Menu-Options-Form-Save_Tree_State:
Save Tree Expanded State:
- Check box to enable saving of manually expanded nodes in trees.
+ Check box to enable saving of expanded and selected nodes in trees/lists.
.. _Menu-Options-Form-Spell_Checking:
@@ -616,10 +616,10 @@ Search:
View Logs...:
Shows generic information of the current record.
-.. _Toolbar-Go_to_Record_ID:
+.. _Toolbar-Show revisions:
-Go to Record ID...:
- Opens specific record id in the current view.
+Show revisions...:
+ Reload the current view/record at a specific revision.
.. _Toolbar-Close:
@@ -794,8 +794,7 @@ A range of number values can be set using `..`.
For example: ``Amount: 100..500``
- It will find all records with `Amount` between `100` and `500` (left
- included and right excluded)
+ It will find all records with `Amount` between `100` and `500` included.
There are two wildcards:
@@ -878,4 +877,4 @@ Configuration File
~/.config/tryton/x.y/known_hosts # Fingerprints
~/.config/tryton/x.y/ca_certs # Certification Authority (http://docs.python.org/library/ssl.html#ssl-certificates)
~/.config/tryton/x.y/profiles.cfg # Profile configuration
-
+ ~/.config/tryton/x.y/plugins # Local user plugins directory
diff --git a/setup.py b/setup.py
index de7b229..05957e0 100644
--- a/setup.py
+++ b/setup.py
@@ -40,6 +40,7 @@ languages = (
'de_DE',
'es_AR',
'es_CO',
+ 'es_EC',
'es_ES',
'fr_FR',
'ja_JP',
@@ -374,8 +375,14 @@ elif sys.platform == 'darwin':
with open(immodules_path, 'w') as immodules:
immodules.write(query_immodules)
- shutil.copy(os.path.join(gtk_dir, 'share', 'themes', 'Clearlooks',
- 'gtk-2.0', 'gtkrc'), os.path.join(resources_dir, 'gtkrc'))
+ with open(os.path.join(resources_dir, 'gtkrc'), 'w') as gtkrc:
+ for name, dirname in (
+ ('Clearlooks', 'gtk-2.0'),
+ ('Mac', 'gtk-2.0-key'),
+ ):
+ rcfile = os.path.join(gtk_dir, 'share', 'themes', name,
+ dirname, 'gtkrc')
+ gtkrc.write(open(rcfile).read())
for lang in all_languages():
if os.path.isdir(os.path.join(resources_dir, 'share', 'locale',
diff --git a/share/locale/bg_BG/LC_MESSAGES/tryton.mo b/share/locale/bg_BG/LC_MESSAGES/tryton.mo
index 9d9f899..2b7ade2 100644
Binary files a/share/locale/bg_BG/LC_MESSAGES/tryton.mo and b/share/locale/bg_BG/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/bg_BG/LC_MESSAGES/tryton.po b/share/locale/bg_BG/LC_MESSAGES/tryton.po
index 21147c3..c7898c6 100644
--- a/share/locale/bg_BG/LC_MESSAGES/tryton.po
+++ b/share/locale/bg_BG/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 1.5.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2012-04-23 11:06+0200\n"
"Last-Translator: Nickolay Kolev <nickyk at gmx.net>\n"
"Language-Team: bg_BG <LL at li.org>\n"
@@ -15,46 +15,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "укажете друг конфигурационен файл"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr ""
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "записване на всичко на ниво INFO "
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr ""
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "укажете потребителското име"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "укажете порт на сървъра"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "укажете адреса на сървъра"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Твърде много аргументи"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "Файла \"%s\" не е намерен"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "Не може да запише конфигурационен файл %s!"
@@ -84,42 +84,42 @@ msgstr "Сървър:"
msgid "Port:"
msgstr "Порт:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Избор:"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Вашия избор"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Запис като ..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Винаги игнорирай това предупреждение."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr ""
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Потвърждение"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Грешка при достъп"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -137,50 +137,50 @@ msgstr ""
" - \"Сравняване\" за да видите променената версия;\n"
" - \"Запис \" за да запишете вашата текуща версия."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Сравняване"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Запис"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Грешка"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Съобщаване за грешка"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Грешка в приложението!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Грешка: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "За да съобщите за грешка трябва да имате сметка на <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr ""
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Потребител: "
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Парола:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -188,11 +188,11 @@ msgstr ""
"Тази грешка е вече съобщена от друг потребител..\n"
"За да бъдете информирани потребителя ви е добавен списъка за този проблем"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Създадена е нова грешка с ID"
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -200,11 +200,11 @@ msgstr ""
"Грешка при свързване!\n"
"Грешно потребителско име или парола!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Грешка:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -214,12 +214,12 @@ msgstr ""
"Приложението ще спре да се връзва към сървъра докато не бъде оправен "
"идентификатора му."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Риск за сигурността"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -227,31 +227,31 @@ msgstr ""
"Грешка при свързване!\n"
"Невъзможност да се свърже със сървъра!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Мрежова грешка!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "Г"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "М"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "с"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "д"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "ч"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "м"
@@ -272,59 +272,59 @@ msgstr "Отваряне на календара"
msgid "Date Selection"
msgstr "Избор на дата"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "г"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "да"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "Истина"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Истина"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Лъжа"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
#, fuzzy
msgid "Edit..."
msgstr "Изход..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Прикачен файл:"
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Действия..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
#, fuzzy
msgid "Relate..."
msgstr "Свързани..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Справки..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Email..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Печат..."
@@ -349,10 +349,10 @@ msgid "_Help"
msgstr "Помощ"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Търсене"
@@ -523,7 +523,7 @@ msgstr "Относно..."
msgid "Manage Favorites"
msgstr "Управление на профили"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -531,11 +531,11 @@ msgstr ""
"Следващите действия изискват затваряне на всички прозорци.\n"
"Искате ли да продължите?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Затваряне на таб"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -543,7 +543,7 @@ msgstr ""
"Ще изтриете Tryton база данни.\n"
"Сигурни ли сте че искате да продължите?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -551,28 +551,28 @@ msgstr ""
"Грешна парола за Tryton сървъра\n"
"Моля опитайте отново."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Достъпа отказан!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "Изтриването на базата данни неуспя с грешка:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Изтриването на базата данни неуспешно!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "Базата данни изтрита успешно!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Отваряне на архивиран файл за възтановяване..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -580,11 +580,11 @@ msgstr ""
"Не може да се възтановяви база данни защитена с парола.\n"
"Архивирането и възтановяването трябва да стане ръчно."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "Базата данни е защитена с парола!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -592,19 +592,19 @@ msgstr ""
"Грешна парола за Tryton сървъра.\n"
"Моля опитайте отново."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "Възтановяването на базата данни неуспя с грешка:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Възтановяването на базата неуспешно"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "Възтановяването на базата данни неуспешно"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -612,15 +612,15 @@ msgstr ""
"Не е възможно да се извлече база данни защитена с парола.\n"
"Архивирането и възтановяването трябва да стане ръчно."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Извличането на базата данни неуспя с грешка:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Извличането на базата данни неуспешно!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "Базата данни архивирана успешно!"
@@ -633,7 +633,7 @@ msgid "Create a new record"
msgstr "Създаване на нов запис"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Съхраняване"
@@ -643,7 +643,7 @@ msgstr "Съхраняване на този запис"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Превключване"
@@ -824,39 +824,17 @@ msgstr "Потвърждаване на паролата:"
msgid "Type the Admin password again"
msgstr "Напишете отново паролата на администратора"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Името на базата данни е ограничено до латински букви, цифри и \"_\" (под "
-"черта). Избягвайте акценти, празен символ или специални символи."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Грешни символи в името на базата данни!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"Новата парола на администратора не съвпада с тази в полето за "
"потвърждение.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Паролата не съвпада!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"За зъздаване на нова база данни са необходими парола за администратор и "
-"парола за потвърждение."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Липсва парола за администратор!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -864,15 +842,15 @@ msgstr ""
"Вече съществува база данни с това име.\n"
"Опитайте с друго име на базата данни."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Вече съществува база данни с такова име!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Грешна парола за Tryton сървъра. Моля опитайте отново."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -884,7 +862,7 @@ msgstr ""
"тази база данни! За повече информация вижте съобщинието за грешка.\n"
"Съобщение за грешка:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Грешка при създаване на база данни!"
@@ -949,12 +927,12 @@ msgstr "Редактор на профили"
msgid "Profile"
msgstr "Профил"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "Добавяне"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "Изтриване"
@@ -979,7 +957,7 @@ msgstr "Потребителско име:"
msgid "Could not connect to the server"
msgstr "Не може да се свърже със сървъра!"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "Несъвместима версия на сървъра!"
@@ -1105,8 +1083,8 @@ msgstr "Прикачен файл:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Предишен"
@@ -1116,8 +1094,8 @@ msgstr "Предишен запис"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Следващ"
@@ -1224,23 +1202,23 @@ msgstr "Дата на последна промяна:"
msgid "Model:"
msgstr "Модел:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Наистина ли искате да изтриете този запис?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Наистина ли искате да изтриете тези записи?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Записа не е изтрит!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Записите изтрити!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Работите върху дублиран(и) запис(и)!"
@@ -1252,11 +1230,11 @@ msgstr "Записа съхранен!"
msgid "Invalid form!"
msgstr "Невалидна форма!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " от"
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1264,49 +1242,48 @@ msgstr ""
"Този запис е променен\n"
"искате ли да го запишете ?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Действие"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Започване на действие"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Свързани"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Отваряне на свързани записи"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Справки"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Отваряне на справка"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Изращане на справка по Email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Печат"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Отпечатване на справка"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Неизвестен"
@@ -1484,67 +1461,77 @@ msgstr "Подсказки"
msgid "_Display a new tip next time"
msgstr "Показвай нова подсказка следващия път"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Извличане в CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Предварително зададени извличания</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Всички полета</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Изчистване"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Запис на извличане"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Изтриване на извличане"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Полета за извличане</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Настройки</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Отваряне"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Добавяне на имена на полета"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Име"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Какво е името на това извличане?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d заспис съхранен!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d записа съхранени!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1568,18 +1555,17 @@ msgid "Remove <Del>"
msgstr "Изтриване <Del>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Създаване на нов запис <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Изтриване на избрания запис <Del>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Възтановяване на избрания запис <Ins>"
@@ -1601,10 +1587,10 @@ msgstr "Файл за вмъкване:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Отваряне..."
@@ -1655,74 +1641,104 @@ msgstr "%d запис вмъкнат!"
msgid "%d records imported!"
msgstr "%d записи вмъкнати!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Помощник"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Няма атрибут низ"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
#, fuzzy
msgid "ID"
msgstr "д"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
#, fuzzy
msgid "Creation User"
msgstr "Потребител създал:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
#, fuzzy
msgid "Creation Date"
msgstr "Дата на създаване:"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
#, fuzzy
msgid "Modification User"
msgstr "Дата на последна промяна:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
#, fuzzy
msgid "Modification Date"
msgstr "Дата на последна промяна:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
#, fuzzy
msgid "Unable to set view tree state"
msgstr "Не може да зададе локални настройки %s"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Запис като"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Размер на изображение"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Ширина:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Височина:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG изображение (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Размера на изображението е много голям!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "Филтри"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Търсене"
@@ -1753,83 +1769,52 @@ msgstr "Избор на файл"
msgid "Show plain text"
msgstr "Показване само на текст"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Избор на картинка"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Всички файлове"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Изображения"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "Добавяне на превод"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Редактиране"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Неясно"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Трябва да съхраните записа преди да добавите преводи!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Няма наличен друг език!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
#, fuzzy
msgid "Add existing record"
msgstr "Съхраняване на този запис"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
#, fuzzy
msgid "Remove selected record <Del>"
msgstr "Изтриване на избрания запис <Del>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Отваряне на запис"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Тъсене на запис"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
#, fuzzy
msgid "Remove selected record"
msgstr "Изтриване на избрания запис <Del>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Редактиране на избрания запис"
@@ -1889,35 +1874,27 @@ msgstr ""
msgid "Select a background color"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Запис като"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Размер на изображение"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Ширина:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "Добавяне на превод"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Височина:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Редактиране"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG изображение (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Неясно"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Размера на изображението е много голям!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Трябва да съхраните записа преди да добавите преводи!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Няма наличен друг език!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
msgstr "Превод на изглед"
-
diff --git a/share/locale/ca_ES/LC_MESSAGES/tryton.mo b/share/locale/ca_ES/LC_MESSAGES/tryton.mo
index a84d937..2e044eb 100644
Binary files a/share/locale/ca_ES/LC_MESSAGES/tryton.mo and b/share/locale/ca_ES/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/ca_ES/LC_MESSAGES/tryton.po b/share/locale/ca_ES/LC_MESSAGES/tryton.po
index bbc5dd8..983a981 100644
--- a/share/locale/ca_ES/LC_MESSAGES/tryton.po
+++ b/share/locale/ca_ES/LC_MESSAGES/tryton.po
@@ -9,54 +9,54 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 2.4.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-17 18:49+0200\n"
-"Last-Translator: \n"
-"Language-Team: Catalan <kde-i18n-ca at kde.org>\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-17 09:35+0100\n"
+"Last-Translator: Sergi Almacellas Abellana <sergi at koolpi.com>\n"
+"Language-Team: Catalan <tryton-ca at googlegroups.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "Indica un fitxer de configuració alternatiu"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "mode desenvolupament"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "Registra tota la informació amb nivell INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "indica el nivell de log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "Indica l'usuari"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "Indica el port del servidor"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "Indica el nom del servidor"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Massa arguments"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "No s'ha trobat el fitxer \"%s\""
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "No s'ha pogut escriure el fitxer configuració %s"
@@ -86,42 +86,42 @@ msgstr "Servidor:"
msgid "Port:"
msgstr "Port:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Selecció"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "La vostra selecció:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Desa com..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Ignora sempre aquest advertiment."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "Voleu continuar?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Confirmació"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Excepció de concurrència"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -139,50 +139,50 @@ msgstr ""
" - \"Compara\" per veure la versió modificada:\n"
" - \"Desa de totes formes\" per desar els vostres canvis."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Compara"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Desa de totes formes"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Error"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Informa de l'error"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Error d'aplicació."
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Error: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Per informar d'errors heu de tenir un compte a <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Seguiment d'errors"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Usuari:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Contrasenya:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -191,11 +191,11 @@ msgstr ""
"Per mantenir-vos informat afegirem el vostre usuari a la llista "
"d'interessats en aquest assumpte."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "S'ha creat una nou informe d'error amb l'identificador "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -203,11 +203,11 @@ msgstr ""
"Error de connexió.\n"
"Nom d'usuari o contrasenya incorrectes."
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Excepció:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -217,12 +217,12 @@ msgstr ""
"L'aplicació no es podrà connectar a aquest servidor fins que es "
"corregeixi l'empremta digital del servidor."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Risc de seguretat."
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -230,31 +230,31 @@ msgstr ""
"Error de connexió.\n"
"No ha estat possible connectar-se al servidor."
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Error de xarxa."
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "A"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "s"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -274,57 +274,57 @@ msgstr "Obre el calendari <F2>"
msgid "Date Selection"
msgstr "Selecció de data"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "a"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "sí"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "verdader"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "v"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Verdader"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Fals"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr "Edita..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Adjunts..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Accions..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Relacionat..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Informe..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Correu electrònic..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Imprimeix..."
@@ -349,10 +349,10 @@ msgid "_Help"
msgstr "Aj_uda"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Cerca"
@@ -520,7 +520,7 @@ msgstr "_Quant a..."
msgid "Manage Favorites"
msgstr "_Gestiona els preferits"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -528,11 +528,11 @@ msgstr ""
"L'acció seleccionada requereix tancar totes les pestanyes.\n"
"Voleu continuar?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Tanca pestanya"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -540,7 +540,7 @@ msgstr ""
"Esteu a punt d'eliminar una base de dades de Tryton.\n"
"Esteu segur que voleu continuar?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -548,28 +548,28 @@ msgstr ""
"La contrasenya del servidor Tryton és incorrecta.\n"
"Intenteu-ho de nou."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Accés denegat."
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "L'eliminació de la base de dades ha fallat amb el missatge d'error:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Ha fallat l'eliminació de la base de dades."
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "La base de dades s'ha eliminat correctament."
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Obre una còpia de seguretat per restaurar..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -577,11 +577,11 @@ msgstr ""
"No és possible restaurar una base de dades protegida amb contrasenya.\n"
"La còpia de seguretat i la seva restauració ha de ser manual."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "La base de dades està protegida amb contrasenya."
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -589,19 +589,19 @@ msgstr ""
"La contrasenya del servidor Tryton és incorrecta.\n"
"Intenteu-ho de nou."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "La restauració de la base de dades ha fallat amb l'error:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "La restauració de la base de dades ha fallat."
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "La base de dades s'ha restaurat correctament."
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -609,15 +609,15 @@ msgstr ""
"No és possible fer còpia d'una base de dades protegida amb contrasenya.\n"
"La còpia de seguretat i la seva restauració ha de ser manual."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "L'extracció de la base de dades ha fallat amb el missatge d'error:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "L'extracció de la base de dades ha fallat."
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "La còpia de seguretat de la base de dades ha finalitzat correctament."
@@ -630,7 +630,7 @@ msgid "Create a new record"
msgstr "Crea un nou registre"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Desa"
@@ -640,7 +640,7 @@ msgstr "Desa aquest registre"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Canvia la vista"
@@ -823,40 +823,17 @@ msgstr "Confirmeu la contrasenya de l'administrador:"
msgid "Type the Admin password again"
msgstr "Teclegeu la contrasenya de l'administrador de nou"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nom de la base de dades està restringit a caràcters alfanumèrics i "
-"\"_\" (guió baix). Eviteu tots els accents, espais i qualsevol altre "
-"caràcter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Heu introduït caràcters incorrectes al nom de la base de dades."
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"La nova contrasenya de l'administrador no coincideix amb el camp de "
"confirmació.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Les contrasenyes no coincideixen."
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contrasenya de l'administrador i la seva confirmació són necessàries "
-"per crear una nova base de dades."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Falta la contrasenya de l'administrador."
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -864,15 +841,15 @@ msgstr ""
"Ja existeix una base de dades amb el mateix nom.\n"
"Intenteu-ho amb un altre nom de base de dades."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Ja existeix una base de dades amb aquest nom."
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "La contrasenya del servidor Tryton no és correcta. Intenteu-ho de nou."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -885,7 +862,7 @@ msgstr ""
" informació addicional.\n"
"Missatge d'error:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "S'ha produït un error al crear la base de dades."
@@ -950,12 +927,12 @@ msgstr "Editor de perfils"
msgid "Profile"
msgstr "Perfil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Afegeix"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Elimina"
@@ -980,7 +957,7 @@ msgstr "Nom d'usuari:"
msgid "Could not connect to the server"
msgstr "No s'ha pogut connectar al servidor"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "El client no és compatible amb la versió del servidor"
@@ -1107,8 +1084,8 @@ msgstr "Adjunt:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Anterior"
@@ -1118,8 +1095,8 @@ msgstr "Registre anterior"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Següent"
@@ -1224,23 +1201,23 @@ msgstr "Última data de modificació:"
msgid "Model:"
msgstr "Model:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Esteu segur que voleu eliminar aquest registre?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Esteu segur que voleu eliminar aquests registres?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Els registres no s'han eliminat."
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Registres eliminats."
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Ara esteu treballant en el registre duplicat."
@@ -1252,11 +1229,11 @@ msgstr "Registre desat."
msgid "Invalid form!"
msgstr "Formulari incorrecte."
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " de "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1264,49 +1241,48 @@ msgstr ""
"Aquest registre ha estat modificat.\n"
"Voleu desar-lo?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Acció"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Executa acció"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "_Relacionat"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Obre registres relacionats"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Informes"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Obre informe"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Correu electrònic"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Informe per email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Imprimeix"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Imprimeix informe"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Desconegut"
@@ -1482,67 +1458,77 @@ msgstr "Consells"
msgid "_Display a new tip next time"
msgstr "_Mostra un nou consell la propera vegada"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exporta a CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Exportacions predeterminades</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Tots els camps</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Neteja"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Desa exportació"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Elimina exportació"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Camps a exportar</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Opcions</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Obre"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Afegeix noms de _camp"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Nom"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (text)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Quin és el nom d'aquesta exportació?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Voleu sobrescriure la definició de '%s'?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "S'ha desat %d registre."
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "S'han desat %d registres."
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1566,18 +1552,17 @@ msgid "Remove <Del>"
msgstr "Elimina <Supr>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Crea un nou registre <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Elimina el registre seleccionat <Supr>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Recupera el registre seleccionat <Ins>"
@@ -1599,10 +1584,10 @@ msgstr "Fitxer a importar:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Obre..."
@@ -1653,68 +1638,98 @@ msgstr "S'ha importat %d registre."
msgid "%d records imported!"
msgstr "S'han importat %d registres."
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Assistent"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No té una cadena com atribut."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Creat per"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Data de creació"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Modificat per"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Data de modificació"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "No s'ha pogut obtenir l'estat de la vista d'arbre"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "No s'ha pogut desar l'estat de la vista d'arbre"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Anomena i desa"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Mida de la imatge"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Amplada:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imatge PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "La mida de la imatge és massa gran."
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltres"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Mostra les cerques preferides"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Elimina de les cerques preferides"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Desa com a cerca preferida"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Nom de la cerca preferida:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Cerca"
@@ -1742,79 +1757,49 @@ msgstr "Selecciona un fitxer..."
msgid "Show plain text"
msgstr "Mostra com a text pla"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Afegeix un valor"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Eliminar \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Selecciona una imatge..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Tots els fitxers"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Imatges"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducció"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Edita"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Dubtós"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Heu de desar el registre abans d'afegir traduccions."
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hi ha cap altre idioma disponible."
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Afegeix un registre existent"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Elimina el registre seleccionat <Supr>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Obre el registre <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Cerca un registre <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Elimina el registre seleccionat"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Edita registre seleccionat <F2>"
@@ -1874,33 +1859,25 @@ msgstr "Selecciona color principal"
msgid "Select a background color"
msgstr "Selecciona color de fons"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Anomena i desa"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Grandària de la imatge"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Amplada:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducció"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Edita"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imatge PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Dubtós"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "La mida de la imatge és massa gran."
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Heu de desar el registre abans d'afegir traduccions."
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hi ha cap altre idioma disponible."
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/cs_CZ/LC_MESSAGES/tryton.mo b/share/locale/cs_CZ/LC_MESSAGES/tryton.mo
index abe3177..3a4ad81 100644
Binary files a/share/locale/cs_CZ/LC_MESSAGES/tryton.mo and b/share/locale/cs_CZ/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/cs_CZ/LC_MESSAGES/tryton.po b/share/locale/cs_CZ/LC_MESSAGES/tryton.po
index 9338785..ef2dd58 100644
--- a/share/locale/cs_CZ/LC_MESSAGES/tryton.po
+++ b/share/locale/cs_CZ/LC_MESSAGES/tryton.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2012-04-23 11:06+0200\n"
"Last-Translator: Dan Horák <dan at danny.cz>\n"
"Language-Team: Czech\n"
@@ -12,46 +12,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "zadejte alternativní konfigurační soubor"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr ""
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr ""
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr ""
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "zadejte uživatelské jméno"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "zadejte číslo portu síťového serveru"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "zadejte název hostitele pro server"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr ""
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr ""
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "Nelze zapsat konfigurační soubor %s!"
@@ -81,42 +81,42 @@ msgstr "Server:"
msgid "Port:"
msgstr "Port:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Výběr"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Váš výběr:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Uložit jako..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "zadejte alternativní konfigurační soubor"
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr ""
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Potvrzení"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Výjimka při souběhu"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
#, fuzzy
msgid ""
"<b>Write Concurrency Warning:</b>\n"
@@ -135,50 +135,50 @@ msgstr ""
" - \"Porovnat\" pro zobrazení změněné verze,\n"
" - \"Přesto zapsat\" pro zapsání vaší verze."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Porovnat"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Přesto zapsat"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Chyba"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Nahlásit chybu"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Chyba aplikace!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Chyba:"
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, fuzzy, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Pro hlášení chyb musíte mít účet na <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Sledování chyb"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Uživatel:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Heslo:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -186,11 +186,11 @@ msgstr ""
"Ta samá chyba již byla nahlášena jiným uživatelem.\n"
"Vaše uživatelské jméno bylo přidáno na její seznam."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Založena nová chyba s ID"
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -198,23 +198,23 @@ msgstr ""
"Chyba při spojení!\n"
"Špatné uživatelské jméno nebo heslo!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Výjimka:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
" is fixed."
msgstr ""
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr ""
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -222,31 +222,31 @@ msgstr ""
"Chyba spojení!\n"
"Nelze se připojit k serveru!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Chyba sítě!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr ""
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr ""
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr ""
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr ""
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr ""
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr ""
@@ -267,65 +267,65 @@ msgstr "Otevřít kalendář"
msgid "Date Selection"
msgstr "Výběr datumu"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
#, fuzzy
msgid "yes"
msgstr "bajtů"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
#, fuzzy
msgid "true"
msgstr "Pravda"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Pravda"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Nepravda"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
#, fuzzy
msgid "Edit..."
msgstr "Konec..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
#, fuzzy
msgid "Attachments..."
msgstr "Příloha:"
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
#, fuzzy
msgid "Actions..."
msgstr "Akce..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
#, fuzzy
msgid "Relate..."
msgstr "_Odstranit..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
#, fuzzy
msgid "Report..."
msgstr "Importovat data..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
#, fuzzy
msgid "E-Mail..."
msgstr "_Email..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
#, fuzzy
msgid "Print..."
msgstr "_Tisk..."
@@ -351,10 +351,10 @@ msgid "_Help"
msgstr "Nápo_věda"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Hledat"
@@ -525,17 +525,17 @@ msgstr "_O programu..."
msgid "Manage Favorites"
msgstr ""
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
msgstr ""
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Zavřít záložku"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -543,7 +543,7 @@ msgstr ""
"Bude smazána Tryton databáze.\n"
"Opravdu chcete pokračovat?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -551,28 +551,28 @@ msgstr ""
"Špatné heslo Tryton serveru\n"
"Zkuste to znovu."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Přístup odepřen!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "Odstranění databáze selhalo s chybovou zprávou:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Odstranění databáze selhalo!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "Databáze úspěšné odstraněna!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Otevřít soubor se zálohou pro obnovu..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -580,11 +580,11 @@ msgstr ""
"Není možné obnovit databázi chráněnou heslem.\n"
"Záloha a obnova musí být provedeny ručně."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "Databáze je chráněna heslem!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -592,19 +592,19 @@ msgstr ""
"Špatné heslo Tryton serveru\n"
"Zkuste to znovu."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "Obnovení databáze selhalo s chybovou zprávou:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Obnova databáze selhala!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "Databáze úspěšně obnovena!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -612,15 +612,15 @@ msgstr ""
"Není možné zálohovat databázi chráněnou heslem.\n"
"Záloha a obnova musí být provedeny ručně."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Záloha databáze selhala s chybovou zprávou:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Záloha databáze selhala!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "Databáze úspěšně zazálohována!"
@@ -633,7 +633,7 @@ msgid "Create a new record"
msgstr "Vytvořit nový záznam"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
#, fuzzy
msgid "Save"
msgstr "_Uložit"
@@ -644,7 +644,7 @@ msgstr "Uložit tento záznam"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Přepnout"
@@ -830,37 +830,15 @@ msgstr "Potvrzení hesla správce:"
msgid "Type the Admin password again"
msgstr "Zadejte znovu heslo správce"
-#: tryton/gui/window/dbcreate.py:332
-#, fuzzy
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Název databáze je omezen na alfanumercké znaky a _ (podtržítko). Musí "
-"začínat písmenem a být maximálně 63 znaků dlouhý.\n"
-"Nepoužívejte znaky s akcenty, mezeru nebo jiné speciální znaky."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Neplatný znak v názvu databáze!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "Heslo správce a jeho zopakování nejsou shodné.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Hesla nesouhlasí!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr "Heslo správce a jeho zopakování jsou nutné pro vytvoření nové databáze."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Chybí heslo administrátora!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -868,15 +846,15 @@ msgstr ""
"Databáze se stejným názvem již existuje.\n"
"Použijte jiný název."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Databáze s tímto názvem již existuje!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Zadali jste špatné heslo pro Tryton server. Zkuste to znovu."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -888,7 +866,7 @@ msgstr ""
" Zkontrolujte chybové hlášení pro případné další informace.\n"
"Chybová zpráva:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Chyba při vytváření databáze!"
@@ -953,12 +931,12 @@ msgstr ""
msgid "Profile"
msgstr ""
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Přidat"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Odstranit"
@@ -988,7 +966,7 @@ msgstr "Uživatelské jméno:"
msgid "Could not connect to the server"
msgstr "Nelze se spojit se serverem!"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
#, fuzzy
msgid "Incompatible version of the server"
msgstr "Verze serveru není kompatibilní!"
@@ -1115,8 +1093,8 @@ msgstr "Příloha:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Předchozí"
@@ -1126,8 +1104,8 @@ msgstr "Předchozí záznam"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Další"
@@ -1237,23 +1215,23 @@ msgstr "Datum poslední úpravy:"
msgid "Model:"
msgstr "Model:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Opravdu chcete odstranit tento záznam?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Opravdu chcete odstranit tyto záznamy?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Záznamy neodstraněny!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Záznamy odstraněny!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Nyní pracujete s duplicitním záznamem!"
@@ -1265,11 +1243,11 @@ msgstr "Záznam uložen!"
msgid "Invalid form!"
msgstr "Neplatný formulář!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " z "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1277,54 +1255,53 @@ msgstr ""
"Tento záznam byl upraven\n"
"chcete ho uložit?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Akce"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr ""
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
#, fuzzy
msgid "Relate"
msgstr "_Vytvořit"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
#, fuzzy
msgid "Open related records"
msgstr "Otevřít záznam"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
#, fuzzy
msgid "Report"
msgstr "Sestavy"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
#, fuzzy
msgid "Open report"
msgstr "Otevřít záznam"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
#, fuzzy
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr ""
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Tisk"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr ""
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Neznámý"
@@ -1502,67 +1479,77 @@ msgstr "Tipy"
msgid "_Display a new tip next time"
msgstr "Zobrazit příště další tip"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exportovat do CSV souboru"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Předdefinované exporty</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Všechna pole</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Vymazat"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Uložit exportu"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Smazat exportu"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Pole pro export</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Možnosti</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Otevřít"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Přidat jména polí"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr ""
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr ""
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d záznam uložen!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d záznamů uloženo!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1586,20 +1573,19 @@ msgid "Remove <Del>"
msgstr ""
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
#, fuzzy
msgid "Create a new record <F3>"
msgstr "Vytvořit nový záznam"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
#, fuzzy
msgid "Delete selected record <Del>"
msgstr "Smazat vybraný záznam"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
#, fuzzy
msgid "Undelete selected record <Ins>"
msgstr "Smazat vybraný záznam"
@@ -1622,10 +1608,10 @@ msgstr "Soubor k importu:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Otevřít..."
@@ -1677,75 +1663,105 @@ msgstr "%d záznam načten!"
msgid "%d records imported!"
msgstr "%d záznamů načteno!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Průvodce"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Žádný řetězcový atribut"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
#, fuzzy
msgid "ID"
msgstr "Najít"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
#, fuzzy
msgid "Creation User"
msgstr "Vytvořeno uživatelem:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
#, fuzzy
msgid "Creation Date"
msgstr "Datum vytvoření:"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
#, fuzzy
msgid "Modification User"
msgstr "Datum poslední úpravy:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
#, fuzzy
msgid "Modification Date"
msgstr "Datum poslední úpravy:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
#, fuzzy
msgid "Unable to set view tree state"
msgstr "Nemohu nastavit lokalizaci %s"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Uložit jako"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Velikost obrázku"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Šířka:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Výška:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Obrázek PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Rozměry obrázku jsou příliš velké!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
#, fuzzy
msgid "F_ilters"
msgstr "_Soubor"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Najít"
@@ -1777,86 +1793,55 @@ msgstr "Vyberte soubor"
msgid "Show plain text"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
#, fuzzy
msgid "Select an Image..."
msgstr "Vyberte soubor"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Všechny soubory"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Obrázky"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "Přidat překlad"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Musíte uložit záznam před přidáváním překladů!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Jiný jazyk není k dispozici!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
#, fuzzy
msgid "Add existing record"
msgstr "Uložit tento záznam"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
#, fuzzy
msgid "Remove selected record <Del>"
msgstr "Smazat vybraný záznam"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
#, fuzzy
msgid "Open a record <F2>"
msgstr "Otevřít záznam"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
#, fuzzy
msgid "Search a record <F2>"
msgstr "Hledat záznam"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
#, fuzzy
msgid "Remove selected record"
msgstr "Smazat vybraný záznam"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
#, fuzzy
msgid "Edit selected record <F2>"
msgstr "Upravit vybraný záznam"
@@ -1917,34 +1902,26 @@ msgstr ""
msgid "Select a background color"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Uložit jako"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Velikost obrázku"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Šířka:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "Přidat překlad"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Výška:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Obrázek PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Rozměry obrázku jsou příliš velké!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Musíte uložit záznam před přidáváním překladů!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-#, fuzzy
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Jiný jazyk není k dispozici!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/de_DE/LC_MESSAGES/tryton.mo b/share/locale/de_DE/LC_MESSAGES/tryton.mo
index 53bb90b..57f5460 100644
Binary files a/share/locale/de_DE/LC_MESSAGES/tryton.mo and b/share/locale/de_DE/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/de_DE/LC_MESSAGES/tryton.po b/share/locale/de_DE/LC_MESSAGES/tryton.po
index 5cdcaa4..137ff6d 100644
--- a/share/locale/de_DE/LC_MESSAGES/tryton.po
+++ b/share/locale/de_DE/LC_MESSAGES/tryton.po
@@ -8,54 +8,54 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 3.2.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-14 12:23+0100\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-02 23:42+0100\n"
"Last-Translator: Mathias Behrle <mbehrle at m9s.biz>\n"
"Language-Team: de_DE <tryton-de at googlegroups.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "Alternative Konfigurationsdatei angeben"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "Entwicklungsmodus"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "Allgemeiner Log-Level: INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "Log Level angeben: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "Anmeldename angeben"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "Port des Servers angeben"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "Name des Servers angeben"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Zu viele Argumente"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "Datei \"%s\" nicht gefunden"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "Kann Konfigurationsdatei '%s' nicht schreiben!"
@@ -85,42 +85,42 @@ msgstr "Server:"
msgid "Port:"
msgstr "Port:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Auswahl"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Ihre Auswahl:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Speichern unter..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Diese Warnung künftig nicht mehr anzeigen"
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "Fortfahren?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Bestätigung"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Aktualisierungskonflikt"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -141,52 +141,52 @@ msgstr ""
" - \"Überschreiben\" um die gespeicherte Version mit Ihrer Version zu "
"überschreiben"
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Vergleichen"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Überschreiben"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Fehler"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Fehler berichten"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Anwendungsfehler!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Fehler:"
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr ""
"Um Fehler online berichten zu können, benötigen Sie ein Konto auf "
"<u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Fehler melden"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Anmeldename:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Passwort:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -196,11 +196,11 @@ msgstr ""
"Zu Ihrer Information wurde Ihr Benutzername auf der Interessentenliste "
"eingetragen."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Neuer Fehlerbericht angelegt mit ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -208,11 +208,11 @@ msgstr ""
"Verbindungsfehler!\n"
"Anmeldename oder Passwort fehlerhaft."
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Ausnahme: "
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -223,12 +223,12 @@ msgstr ""
"Der Client wird sich nicht mehr zu diesem Server verbinden bis der "
"Fingerabdruck wieder dem des Servers entspricht."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Sicherheitsrisiko!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -236,31 +236,31 @@ msgstr ""
"Verbindungsfehler!\n"
"Kann nicht zum Server verbinden."
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Netzwerkfehler!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "J"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "W"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "t"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -280,57 +280,57 @@ msgstr "Kalender öffnen <F2>"
msgid "Date Selection"
msgstr "Auswahl Datum"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "J"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "Ja"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "Wahr"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "w"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Wahr"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Falsch"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr "Bearbeiten..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Anhänge..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Aktionen..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Beziehungen..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Berichte..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "E-Mail..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Drucken..."
@@ -355,10 +355,10 @@ msgid "_Help"
msgstr "_Hilfe"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Suchen"
@@ -526,7 +526,7 @@ msgstr "_Über..."
msgid "Manage Favorites"
msgstr "Favoriten verwalten"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -534,11 +534,11 @@ msgstr ""
"Die folgende Aktion erfordert die Schließung aller Tabs.\n"
"Fortfahren?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Tab schließen"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -546,7 +546,7 @@ msgstr ""
"Sie werden eine Tryton Datenbank löschen.\n"
"Wirklich fortfahren?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -554,30 +554,30 @@ msgstr ""
"Falsches Passwort für den Tryton Server\n"
"Bitte geben Sie es noch einmal ein."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Zugang verweigert!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr ""
"Das Löschen der Datenbank ist fehlgeschlagen mit der folgenden "
"Fehlermeldung:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Datenbank konnte nicht gelöscht werden!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "Datenbank erfolgreich gelöscht."
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Backup Datei für Wiederherstellung öffnen..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -587,11 +587,11 @@ msgstr ""
"Backup und Wiederherstellung müssen in diesem Fall manuell durchgeführt "
"werden."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "Datenbank ist passwortgeschützt!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -599,21 +599,21 @@ msgstr ""
"Falsches Passwort für den Tryton Server\n"
"Bitte geben Sie es noch einmal ein."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr ""
"Wiederherstellung der Datenbank ist fehlgeschlagen mit der Fehlermeldung:"
"\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Wiederherstellung der Datenbank ist fehlgeschlagen!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "Datenbank wurde erfolgreich wiederhergestellt."
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -622,15 +622,15 @@ msgstr ""
"Backup und Wiederherstellung müssen in diesem Fall manuell durchgeführt "
"werden."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Die Datenbanksicherung ist fehlgeschlagen mit der Fehlermeldung:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Datenbank konnte nicht gesichert werden!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "Datenbank erfolgreich gesichert."
@@ -643,7 +643,7 @@ msgid "Create a new record"
msgstr "Neuen Datensatz erstellen"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Speichern"
@@ -653,7 +653,7 @@ msgstr "Diesen Datensatz speichern"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Ansicht wechseln"
@@ -846,41 +846,17 @@ msgstr ""
"Wiederholen Sie die Eingabe des Administrator Passworts um sicher zu "
"gehen, dass Sie sich beim ersten Mal nicht vertippt haben."
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Die erlaubten Zeichen des Datenbanknamens sind auf Buchstaben, Zahlen und"
-" \"_\" (Unterstrich) beschränkt. Akzente, Leerzeichen und andere "
-"Spezialzeichen sollten nicht benutzt werden. Umlaute, Akzente und 'ß' "
-"sind ebenfalls verboten."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Unerlaubte Zeichen im Namen für die Datenbank!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"Die beiden Eingaben für das neue Administrator Passwort stimmen nicht "
"überein.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Passwörter sind nicht identisch!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Das Administrator Passwort und dessen Wiederholung werden benötigt um "
-"eine neue Datenbank für Tryton anlegen zu können."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Administrator Passwort fehlt!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -888,17 +864,17 @@ msgstr ""
"Eine Datenbank mit diesem Namen existiert bereits.\n"
"Versuchen Sie einen anderen Datenbanknamen."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Eine Datenbank mit diesem Namen existiert bereits!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr ""
"Das für den Tryton Server eingegebene Passwort scheint falsch zu sein. "
"Bitte nochmals eingeben."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -913,7 +889,7 @@ msgstr ""
"zu diesem Fehler.\n"
"Fehlermeldung:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Fehler bei der Datenbankerstellung!"
@@ -978,12 +954,12 @@ msgstr "Profilbearbeitung"
msgid "Profile"
msgstr "Profil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Hinzufügen"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Entfernen"
@@ -1008,7 +984,7 @@ msgstr "Anmeldename:"
msgid "Could not connect to the server"
msgstr "Kann nicht zum Server verbinden!"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "Inkompatible Serverversion"
@@ -1135,8 +1111,8 @@ msgstr "Anhang:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Vorheriger"
@@ -1146,8 +1122,8 @@ msgstr "Vorheriger Datensatz"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Nächster"
@@ -1252,23 +1228,23 @@ msgstr "Zuletzt verändert am"
msgid "Model:"
msgstr "Modell:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Möchten Sie diesen Datensatz wirklich löschen?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Möchten Sie diese Datensätze wirklich löschen?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Datensätze nicht gelöscht!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Datensätze gelöscht"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Sie arbeiten nun an dem duplizierten Datensatz"
@@ -1280,11 +1256,11 @@ msgstr "Datensatz gespeichert"
msgid "Invalid form!"
msgstr "Ungültiges Formular!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " von "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1292,49 +1268,48 @@ msgstr ""
"Datensatz geändert\n"
"Soll der Datensatz gespeichert werden?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Aktion"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Aktion ausführen"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Beziehung"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Datensätze einer Beziehung öffnen"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Bericht"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Bericht öffnen"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "E-Mail"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Bericht per E-Mail senden"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Drucken"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Bericht drucken"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Unbekannt"
@@ -1511,67 +1486,77 @@ msgstr "Tipps"
msgid "_Display a new tip next time"
msgstr "_Tipps beim Start von Tryton anzeigen"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Als CSV exportieren"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Vordefinierte Exporte</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Alle Felder</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Leeren"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Export speichern"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Export löschen"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Zu exportierende Felder</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Optionen</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Öffnen"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Feldnamen _hinzufügen"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Name"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (string)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Wie soll der Name des Exports lauten?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Definition von '%s' nicht berücksichtigen?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d Datensatz gespeichert"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d Datensätze gespeichert"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1595,18 +1580,17 @@ msgid "Remove <Del>"
msgstr "Entfernen <Entf>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Neuen Datensatz erstellen <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Ausgewählte Datensätze löschen <Entf>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Löschung der ausgewählten Datensätze rückgängig machen <Einfg>"
@@ -1628,10 +1612,10 @@ msgstr "Importdatei:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Öffnen..."
@@ -1682,68 +1666,98 @@ msgstr "%d Datensatz importiert"
msgid "%d records imported!"
msgstr "%d Datensätze importiert"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Wizard"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Kein Zeichen Attr."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Erstellt von"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Erstellt am"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Zuletzt verändert von"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Zuletzt verändert am"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "Kann Sicht für den Menübaum nicht finden"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "Kann Sicht für den Menübaum nicht anwenden"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Speichern unter..."
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Bildgröße"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Breite:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Höhe:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG Bild (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Bild ist zu groß!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_ilter"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Filterlesezeichen anzeigen"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Dieses Lesezeichen entfernen"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Diesen Filter als Lesezeichen hinzufügen"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Lesezeichenname:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Suchen"
@@ -1771,81 +1785,49 @@ msgstr "Datei auswählen..."
msgid "Show plain text"
msgstr "Klartext anzeigen"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Wert hinzufügen"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "\"%s\" entfernen"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Bild auswählen..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Alle Dateien"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Bilder"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Übersetzung"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Unscharf"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr ""
-"Der Datensatz muss gespeichert werden, bevor eine Übersetzung hinzugefügt"
-" werden kann!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Keine anderen Sprachen verfügbar!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Bestehenden Datensatz hinzufügen"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Ausgewählten Datensatz löschen <Entf>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Datensatz öffnen <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Datensatz suchen <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Ausgewählten Datensatz löschen <Entf>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Ausgewählten Datensatz bearbeiten <F2>"
@@ -1905,33 +1887,27 @@ msgstr "Zeichenfarbe"
msgid "Select a background color"
msgstr "Hintergrundfarbe"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Speichern unter..."
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Bildgröße"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Breite:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Übersetzung"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Höhe:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Bearbeiten"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG Bild (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Unscharf"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Bild ist zu groß!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr ""
+"Der Datensatz muss gespeichert werden, bevor eine Übersetzung hinzugefügt"
+" werden kann!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Keine anderen Sprachen verfügbar!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/es_AR/LC_MESSAGES/tryton.mo b/share/locale/es_AR/LC_MESSAGES/tryton.mo
index 2b5f699..f297ec2 100644
Binary files a/share/locale/es_AR/LC_MESSAGES/tryton.mo and b/share/locale/es_AR/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_AR/LC_MESSAGES/tryton.po b/share/locale/es_AR/LC_MESSAGES/tryton.po
index 6e9c5b7..4328ce6 100644
--- a/share/locale/es_AR/LC_MESSAGES/tryton.po
+++ b/share/locale/es_AR/LC_MESSAGES/tryton.po
@@ -5,56 +5,56 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: tryton 3.2.0\n"
+"Project-Id-Version: tryton 3.4.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-17 16:35-0300\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-16 23:39-0300\n"
"Last-Translator: Bruno M. Villasanti <bvillasanti at thymbra.com>\n"
"Language-Team: Argentina\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "Indica un archivo de configuración alternativo"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "Modo desarrollo"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "Registra toda la información con nivel INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "Indica el nivel de registro: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "Indica el usuario"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "Indica el puerto del servidor"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "Indica el nombre del servidor"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Demasiados argumentos"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "El archivo «%s» no se ha encontrado"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "¡No se ha podido escribir el archivo de configuración %s!"
@@ -84,42 +84,42 @@ msgstr "Servidor:"
msgid "Port:"
msgstr "Puerto:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Selección"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Su selección:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Guardar como..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Ignorar siempre esta advertencia."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "¿Desea continuar?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Confirmación"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Excepción de concurrencia"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -137,50 +137,50 @@ msgstr ""
" - \"Comparar\" para ver la versión modificada:\n"
" - \"Guardar de todas formas\" para guardar sus cambios."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Comparar"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Guardar de todas formas"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Error"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Informar de un error"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "¡Error de aplicación!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Error: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Para informar de errores debe tener una cuenta en <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Seguimiento de errores"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Usuario:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Contraseña:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -189,11 +189,11 @@ msgstr ""
"Para mantenerle informado añadiremos su usuario a la lista de interesados"
" en este asunto."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Se creó un nuevo error con ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -201,11 +201,11 @@ msgstr ""
"¡Error de conexión!\n"
"¡Nombre de usuario o contraseña incorrectos!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Excepción:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -216,12 +216,12 @@ msgstr ""
"La aplicación no se podrá conectar a este servidor hasta que se corrija "
"la huella de seguridad del servidor."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "¡Riesgo de seguridad!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -229,31 +229,31 @@ msgstr ""
"¡Error de conexión!\n"
"¡No ha sido posible conectarse al servidor!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "¡Error de red!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "A"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "s"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -273,57 +273,57 @@ msgstr "Abrir el calendario <F2>"
msgid "Date Selection"
msgstr "Selección de fecha"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "a"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "sí"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "verdadero"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "v"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Verdadero"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Falso"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr "Editar..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Adjuntos..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Acciones..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Relacionado..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
-msgstr "Informes..."
+msgstr "Informe..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Correo electrónico..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Imprimir..."
@@ -348,10 +348,10 @@ msgid "_Help"
msgstr "Ay_uda"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Buscar"
@@ -519,7 +519,7 @@ msgstr "_Acerca de..."
msgid "Manage Favorites"
msgstr "_Administrar favoritos"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -527,11 +527,11 @@ msgstr ""
"La acción seleccionada requiere cerrar todas las pestañas. \n"
"¿Desea continuar?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Cerrar pestaña"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -539,7 +539,7 @@ msgstr ""
"Va a eliminar una base de datos de Tryton.\n"
"¿Está seguro que quiere continuar?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -547,28 +547,28 @@ msgstr ""
"La contraseña del servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "¡Acceso denegado!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "¡Falló la eliminación de la base de datos!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "¡La base de datos se ha eliminado satisfactoriamente!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Abrir una copia de seguridad para restaurar..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -576,11 +576,11 @@ msgstr ""
"No es posible restaurar una base de datos protegida con contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "¡La base de datos está protegida por contraseña!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -588,19 +588,19 @@ msgstr ""
"La contraseña del servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "La restauración de la base de datos ha fallado con el error:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "¡La restauración de la base de datos ha fallado!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "¡La base de datos se ha restaurado correctamente!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -608,15 +608,15 @@ msgstr ""
"No es posible hacer copia de una base de datos protegida por contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "¡La extracción de la base de datos ha fallado!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "¡La copia de seguridad de la base de datos ha finalizado correctamente!"
@@ -629,7 +629,7 @@ msgid "Create a new record"
msgstr "Crear un nuevo registro"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Guardar"
@@ -639,7 +639,7 @@ msgstr "Guardar este registro"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Cambiar vista"
@@ -822,40 +822,17 @@ msgstr "Confirme la contraseña del Administrador:"
msgid "Type the Admin password again"
msgstr "Teclee la contraseña del Administrador de nuevo"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "¡Ha introducido caracteres incorrectos en el nombre de la base de datos!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"La nueva contraseña del Administrador no coincide con el campo de "
"confirmación.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "¡Las contraseñas no coinciden!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del Administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "¡Falta la contraseña del Administrador!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -863,15 +840,15 @@ msgstr ""
"Ya existe una base de datos con el mismo nombre.\n"
"Inténtelo con otro nombre de base de datos."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "¡Ya existe una base de datos con este nombre!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -884,7 +861,7 @@ msgstr ""
"adicional.\n"
"Mensaje de error:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "¡Se ha producido un error al crear la base de datos!"
@@ -949,12 +926,12 @@ msgstr "Editor de perfiles"
msgid "Profile"
msgstr "Perfil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Añadir"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Eliminar"
@@ -979,7 +956,7 @@ msgstr "Nombre de usuario:"
msgid "Could not connect to the server"
msgstr "No se ha podido conectar al servidor"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "El cliente no es compatible con la versión del servidor"
@@ -1105,8 +1082,8 @@ msgstr "Adjunto:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Anterior"
@@ -1116,8 +1093,8 @@ msgstr "Registro anterior"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Siguiente"
@@ -1171,7 +1148,7 @@ msgstr "_Relacionado..."
#: tryton/gui/window/form.py:78
msgid "_Report..."
-msgstr "_Informes..."
+msgstr "_Informe..."
#: tryton/gui/window/form.py:80
msgid "_E-Mail..."
@@ -1222,23 +1199,23 @@ msgstr "Última fecha de modificación:"
msgid "Model:"
msgstr "Modelo:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "¿Está seguro que quiere eliminar este registro?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "¿Está seguro que quiere eliminar estos registros?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "¡Los registros no se han eliminado!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "¡Registros eliminados!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "¡Ahora está trabajando en el registro duplicado!"
@@ -1250,11 +1227,11 @@ msgstr "¡Registro guardado!"
msgid "Invalid form!"
msgstr "¡Formulario no válido!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " de "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1262,49 +1239,48 @@ msgstr ""
"Este registro ha sido modificado.\n"
"¿Desea guardarlo?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Acción"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Ejecutar acción"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
-msgstr "Relacionado"
+msgstr "_Relacionado"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Abrir registros relacionados"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Informes"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Abrir informe"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Informe por email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Imprimir"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Imprimir informe"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Desconocido"
@@ -1470,7 +1446,7 @@ msgid ""
msgstr ""
"<b>Exportar gráficos</b>\n"
"\n"
-"Puedes guardar los gráficos como imagen PNG haciendo clic con el botón "
+"Puede guardar los gráficos como imagen PNG haciendo clic con el botón "
"derecho sobre el mismo.\n"
#: tryton/gui/window/tips.py:46
@@ -1481,67 +1457,77 @@ msgstr "Consejos"
msgid "_Display a new tip next time"
msgstr "_Mostrar un nuevo consejo la próxima vez"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exportar a CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Exportaciones predeterminadas</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Todos los campos</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Limpiar"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Guardar exportación"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Eliminar exportación"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Campos a exportar</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Opciones</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Abrir"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Añadir nombres de _campo"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Nombre"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "¿Cuál es el nombre de esta exportación?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "¿Sobrescribir definición de '%s'?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "¡Se ha guardado %d registro!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "¡Se han guardado %d registros!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1565,18 +1551,17 @@ msgid "Remove <Del>"
msgstr "Eliminar <Supr>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Crear un nuevo registro <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Recuperar registro seleccionado <Ins>"
@@ -1598,10 +1583,10 @@ msgstr "Archivo a importar:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Abrir..."
@@ -1652,68 +1637,98 @@ msgstr "¡Se ha importado %d registro!"
msgid "%d records imported!"
msgstr "¡Se han importado %d registros!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Asistente"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Creado por:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Fecha de creación:"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Última modificación por:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Última fecha de modificación:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "No se ha podido obtener el estado del árbol"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "No se ha podido establecer el estado del árbol"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "¡El tamaño de la imagen es muy grande!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltros"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Muestra las búsquedas favoritas"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Eliminar de las búsquedas favoritas"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Guardar como búsqueda favorita"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Nombre de la búsqueda favorita:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Buscar"
@@ -1741,79 +1756,49 @@ msgstr "Seleccione un archivo..."
msgid "Show plain text"
msgstr "Mostrar como texto plano"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Añadir un valor"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Eliminar \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Seleccione una imagen..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Todos los archivos"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Imágenes"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "¡Debe guardar el registro antes de añadir traducciones!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "¡No hay otro idioma disponible!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Añadir un registro existente"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Abrir registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Buscar registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Eliminar registro seleccionado <Supr>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Editar registro seleccionado <F2>"
@@ -1873,33 +1858,25 @@ msgstr "Seleccionar color principal"
msgid "Select a background color"
msgstr "Seleccionar color de fondo"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "¡El tamaño de la imagen es muy grande!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "¡Debe guardar el registro antes de añadir traducciones!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "¡No hay otro idioma disponible!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/es_CO/LC_MESSAGES/tryton.mo b/share/locale/es_CO/LC_MESSAGES/tryton.mo
index 00ba0f5..ed0df30 100644
Binary files a/share/locale/es_CO/LC_MESSAGES/tryton.mo and b/share/locale/es_CO/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_CO/LC_MESSAGES/tryton.po b/share/locale/es_CO/LC_MESSAGES/tryton.po
index 0a847b3..828f3d8 100644
--- a/share/locale/es_CO/LC_MESSAGES/tryton.po
+++ b/share/locale/es_CO/LC_MESSAGES/tryton.po
@@ -1,61 +1,61 @@
# Spanish (Colombia) translations for tryton.
-# Copyright (C) 2012 Prexik
+# Copyright (C) 2014 Presik Technologies
# This file is distributed under the same license as the tryton project.
# FIRST AUTHOR <EMAIL at ADDRESS>, 2012.
# Oscar Alvarez <oscar.alvarez.montero at gmail.com>, 2012.
#
msgid ""
msgstr ""
-"Project-Id-Version: tryton 2.4.0\n"
+"Project-Id-Version: tryton 3.4.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-02 22:45-0500\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-14 22:25-0500\n"
"Last-Translator: Oscar Alvarez <oscar.alvarez.montero at gmail.com>\n"
-"Language-Team: Colombia\n"
+"Language-Team: Colombia <oscar.alvarez.montero at gmail.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "Especifique un archivo de configuración alternativo"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "modo desarrollo"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "Registra toda la información con nivel INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "especifique el nivel log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "especifique el usuario"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "especifique el puerto del servidor"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "especifique el nombre del servidor"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Demasiados argumentos"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "No se ha encontró el archivo \"%s\""
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "No es posible modificar el archivo de configuración %s!"
@@ -85,42 +85,42 @@ msgstr "Servidor:"
msgid "Port:"
msgstr "Puerto:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Selección"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Su selección:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Guardar como..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Ignorar siempre esta advertencia."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "Desea continuar?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Confirmación"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Excepción de Concurrencia"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -138,50 +138,50 @@ msgstr ""
" - \"Comparar\" para ver la versión modificada:\n"
" - \"Guardar de todas formas\" para guardar sus cambios."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Comparar"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Guardar de todas formas"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Error"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Reportar Fallo"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Error de Aplicación!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Error: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Para reportar fallos debe tener una cuenta en <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Seguimiento de Fallos"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Usuario:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Contraseña:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
"Para mantenerle informado añadiremos su usuario a la lista de interesados"
" en este asunto."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Se creó un nuevo fallo con ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
"Error de conexión!\n"
"Nombre de usuario o contraseña incorrectos!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Excepción:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -217,12 +217,12 @@ msgstr ""
"La aplicación detendrá la conexión al servidor hasta que se corrija la "
"huella de seguridad."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
-msgstr "Riesgo de Seguridad!"
+msgstr "Riesgo de seguridad!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -230,31 +230,31 @@ msgstr ""
"Error de conexión!\n"
"No ha sido posible conectarse al servidor!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
-msgstr "¡Error de Red!"
+msgstr "Error de Red!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "A"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "s"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -274,58 +274,57 @@ msgstr "Abrir el calendario <F2>"
msgid "Date Selection"
msgstr "Selección de Fecha"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "s"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "sí"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "verdadero"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "v"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Verdadero"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Falso"
-#: tryton/common/popup_menu.py:72
-#, fuzzy
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
-msgstr "_Salir..."
+msgstr "_Editar..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Adjuntos..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Acciones..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Relacionado..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
-msgstr "Informes..."
+msgstr "Reporte..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Correo Electrónico..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Imprimir..."
@@ -350,10 +349,10 @@ msgid "_Help"
msgstr "Ay_uda"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Buscar"
@@ -521,7 +520,7 @@ msgstr "_Acerca de..."
msgid "Manage Favorites"
msgstr "_Administrar Favoritos"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -529,11 +528,11 @@ msgstr ""
"La acción seleccionada requiere cerrar todas las pestañas. \n"
"¿Desea continuar?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Cerrar pestaña"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -541,7 +540,7 @@ msgstr ""
"Va a eliminar una base de datos de Tryton.\n"
"Está seguro que quiere continuar?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -549,28 +548,28 @@ msgstr ""
"La contraseña del Servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "¡Acceso denegado!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Falló la eliminación de la base de datos!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "La base de datos se ha eliminado satisfactoriamente!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Abrir una Copia de Seguridad a Restaurar..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -578,11 +577,11 @@ msgstr ""
"No es posible restaurar una base de datos protegida con contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "La base de datos está protegida por contraseña!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -590,19 +589,19 @@ msgstr ""
"La contraseña del servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "La restauración de la base de datos ha fallado con el error:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "¡La restauración de la base de datos ha fallado!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "¡La base de datos se ha restaurado correctamente!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -610,15 +609,15 @@ msgstr ""
"No es posible hacer copia de una base de datos protegida por contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "La extracción de la base de datos ha fallado!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "¡La copia de seguridad de la base de datos ha finalizado correctamente!"
@@ -631,7 +630,7 @@ msgid "Create a new record"
msgstr "Crear un nuevo registro"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Guardar"
@@ -641,9 +640,9 @@ msgstr "Guardar este registro"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
-msgstr "Cambiar vista"
+msgstr "Cambiar"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
msgid "Switch view"
@@ -824,40 +823,17 @@ msgstr "Confirme la contraseña del Administrador:"
msgid "Type the Admin password again"
msgstr "Teclee la contraseña del Administrador de nuevo"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "¡Ha introducido caracteres incorrectos en el nombre de la base de datos!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"La nueva contraseña del Administrador no coincide con el campo de "
"confirmación.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "¡Las contraseñas no coinciden!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del Administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "¡Falta la contraseña del Administrador!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -865,15 +841,15 @@ msgstr ""
"Ya existe una base de datos con el mismo nombre.\n"
"Inténtelo con otro nombre de base de datos."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Ya existe una base de datos con este nombre!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -886,7 +862,7 @@ msgstr ""
"adicional.\n"
"Mensaje de error:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Se ha producido un error al crear la base de datos!"
@@ -951,12 +927,12 @@ msgstr "Perfiles"
msgid "Profile"
msgstr "Perfil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Agregar"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Eliminar"
@@ -981,7 +957,7 @@ msgstr "Nombre de usuario:"
msgid "Could not connect to the server"
msgstr "No se ha podido conectar al servidor"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "Incompatible versión del servidor"
@@ -1107,8 +1083,8 @@ msgstr "Adjunto:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Anterior"
@@ -1118,8 +1094,8 @@ msgstr "Registro Anterior"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Siguiente"
@@ -1157,7 +1133,7 @@ msgstr "Ver _Registro..."
#: tryton/gui/window/form.py:66
msgid "Show revisions..."
-msgstr ""
+msgstr "Mostrar revisiones..."
#: tryton/gui/window/form.py:71
msgid "A_ttachments..."
@@ -1224,23 +1200,23 @@ msgstr "Fecha de Última Modificación:"
msgid "Model:"
msgstr "Modelo:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Está seguro que quiere eliminar este registro?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Está seguro que quiere eliminar estos registros?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Los registros no se han eliminado!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Registros eliminados!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Está trabajando ahora registro(s) duplicado(s)!"
@@ -1252,11 +1228,11 @@ msgstr "¡Registro guardado!"
msgid "Invalid form!"
msgstr "¡Formulario no válido!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " de "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1264,49 +1240,48 @@ msgstr ""
"Este registro ha sido modificado.\n"
"¿Desea guardarlo?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Acción"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Lanzar acción"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Relacionado"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Abrir registros relacionados"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Informes"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
-msgstr "Abrir informe"
+msgstr "Abrir reporte"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
-msgstr "Informe por email"
+msgstr "Reporte por email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Imprimir"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
-msgstr "Imprimir informe"
+msgstr "Imprimir reporte"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Desconocido"
@@ -1339,18 +1314,16 @@ msgid "Current Password:"
msgstr "Contraseña Actual:"
#: tryton/gui/window/revision.py:20
-#, fuzzy
msgid "Revision"
-msgstr "Anterior"
+msgstr "Revisión"
#: tryton/gui/window/revision.py:29
-#, fuzzy
msgid "Select a revision"
-msgstr "Selección"
+msgstr "Seleccione una revisión"
#: tryton/gui/window/revision.py:32
msgid "Revision:"
-msgstr ""
+msgstr "Revisión:"
#: tryton/gui/window/shortcuts.py:17
msgid "Keyboard Shortcuts"
@@ -1414,7 +1387,7 @@ msgstr "Desmarcar línea para eliminación"
#: tryton/gui/window/shortcuts.py:44
msgid "Edition Widgets"
-msgstr "Controles de Edición"
+msgstr "Widgets de Edición"
#: tryton/gui/window/tips.py:17
msgid ""
@@ -1485,67 +1458,77 @@ msgstr "Consejos"
msgid "_Display a new tip next time"
msgstr "_Mostrar un nuevo consejo la próxima vez"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exportar a CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Exportaciones predeterminadas</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Todos los campos</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Limpiar"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Guardar Exportación"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Eliminar Exportación"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Campos a exportar</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Opciones</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Abrir"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Añadir nombres de _campo"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Nombre"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "¿Cuál es el nombre de esta exportación?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Sobreescribir '%s' definición?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d registro guardado!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d registros guardados!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1569,18 +1552,17 @@ msgid "Remove <Del>"
msgstr "Eliminar <Supr>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Crear un nuevo registro <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Recuperar registro seleccionado <Ins>"
@@ -1602,10 +1584,10 @@ msgstr "Archivo a importar:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Abrir..."
@@ -1656,68 +1638,98 @@ msgstr "%d registro importado!"
msgid "%d records imported!"
msgstr "%d registros importados!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Asistente"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Creado por Usuario"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Fecha de Creación"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Modificado por Usuario"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Fecha de Modificación"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "No es posible encontrar el estado de la vista de árbol"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "No se puede fijar la vista de estado del árbol"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la Imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "La imagen es muy grande!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltros"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Mostrar marcadores de filtros"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Eliminar este marcador"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Marcar este filtro"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Nombre del Marcador:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Buscar"
@@ -1745,79 +1757,49 @@ msgstr "Seleccione un archivo..."
msgid "Show plain text"
msgstr "Mostrar como texto plano"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Agregar valor"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Remover \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Seleccione una Imagen..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Todos los archivos"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Imágenes"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Debe guardar el registro antes de añadir traducciones!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hay otro idioma disponible!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Agregar registro existente"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Abrir registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Buscar registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Eliminar registro seleccionado"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Editar registro seleccionado <F2>"
@@ -1877,33 +1859,25 @@ msgstr "Seleccionar color principal"
msgid "Select a background color"
msgstr "Seleccionar color de fondo"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar Como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la Imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "La imagen es muy grande!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Debe guardar el registro antes de añadir traducciones!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hay otro idioma disponible!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/es_EC/LC_MESSAGES/tryton.mo b/share/locale/es_EC/LC_MESSAGES/tryton.mo
new file mode 100644
index 0000000..d8b0f3c
Binary files /dev/null and b/share/locale/es_EC/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_CO/LC_MESSAGES/tryton.po b/share/locale/es_EC/LC_MESSAGES/tryton.po
similarity index 78%
copy from share/locale/es_CO/LC_MESSAGES/tryton.po
copy to share/locale/es_EC/LC_MESSAGES/tryton.po
index 0a847b3..a43c698 100644
--- a/share/locale/es_CO/LC_MESSAGES/tryton.po
+++ b/share/locale/es_EC/LC_MESSAGES/tryton.po
@@ -1,64 +1,64 @@
-# Spanish (Colombia) translations for tryton.
-# Copyright (C) 2012 Prexik
+# Spanish (Ecuador) translations for tryton.
+# Copyright (C) 2014 Fabyc
# This file is distributed under the same license as the tryton project.
-# FIRST AUTHOR <EMAIL at ADDRESS>, 2012.
-# Oscar Alvarez <oscar.alvarez.montero at gmail.com>, 2012.
+# FIRST AUTHOR <fabianc7 at gmail.com>, 2014.
+# Fabian Calle <fabianc7 at gmail.com>, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: tryton 2.4.0\n"
+"Project-Id-Version: tryton 3.3.dev0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-02 22:45-0500\n"
-"Last-Translator: Oscar Alvarez <oscar.alvarez.montero at gmail.com>\n"
-"Language-Team: Colombia\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-09-01 15:13-0500\n"
+"Last-Translator: Fabian Calle <fabianc7 at gmail.com>\n"
+"Language-Team: Ecuador <fabianc7 at gmail.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "Especifique un archivo de configuración alternativo"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "modo desarrollo"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "Registra toda la información con nivel INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "especifique el nivel log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "especifique el usuario"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "especifique el puerto del servidor"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "especifique el nombre del servidor"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Demasiados argumentos"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "No se ha encontró el archivo \"%s\""
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
-msgstr "No es posible modificar el archivo de configuración %s!"
+msgstr "¡No es posible escribir el archivo de configuración %s!"
#: tryton/translate.py:184
#, python-format
@@ -71,7 +71,7 @@ msgstr "Seleccione su acción"
#: tryton/action/main.py:177
msgid "No action defined!"
-msgstr "No hay acción definida!"
+msgstr "¡No se ha definido ninguna acción!"
#: tryton/common/common.py:284
msgid "Tryton Connection"
@@ -85,42 +85,42 @@ msgstr "Servidor:"
msgid "Port:"
msgstr "Puerto:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Selección"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Su selección:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Guardar como..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Ignorar siempre esta advertencia."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
-msgstr "Desea continuar?"
+msgstr "¿Desea continuar?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Confirmación"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Excepción de Concurrencia"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -138,75 +138,75 @@ msgstr ""
" - \"Comparar\" para ver la versión modificada:\n"
" - \"Guardar de todas formas\" para guardar sus cambios."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Comparar"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Guardar de todas formas"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Error"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
-msgstr "Reportar Fallo"
+msgstr "Informar Error"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
-msgstr "Error de Aplicación!"
+msgstr "¡Error de Aplicación!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Error: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
-msgstr "Para reportar fallos debe tener una cuenta en <u>%s</u>"
+msgstr "Para informar errores debe tener una cuenta en <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
-msgstr "Seguimiento de Fallos"
+msgstr "Seguimiento de Errores"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Usuario:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Contraseña:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
msgstr ""
-"El mismo fallo ya fue notificado por otro usuario.\n"
+"El mismo error ya fue notificado por otro usuario.\n"
"Para mantenerle informado añadiremos su usuario a la lista de interesados"
" en este asunto."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
-msgstr "Se creó un nuevo fallo con ID "
+msgstr "Se creó un nuevo error con ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
msgstr ""
"Error de conexión!\n"
-"Nombre de usuario o contraseña incorrectos!"
+"¡Nombre de usuario o contraseña incorrectos!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Excepción:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -217,44 +217,44 @@ msgstr ""
"La aplicación detendrá la conexión al servidor hasta que se corrija la "
"huella de seguridad."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
-msgstr "Riesgo de Seguridad!"
+msgstr "¡Riesgo de Seguridad!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
msgstr ""
-"Error de conexión!\n"
-"No ha sido posible conectarse al servidor!"
+"¡Error de conexión!\n"
+"¡No ha sido posible conectarse al servidor!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "¡Error de Red!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "A"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "s"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -274,58 +274,57 @@ msgstr "Abrir el calendario <F2>"
msgid "Date Selection"
msgstr "Selección de Fecha"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "s"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "sí"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "verdadero"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "v"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Verdadero"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Falso"
-#: tryton/common/popup_menu.py:72
-#, fuzzy
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
-msgstr "_Salir..."
+msgstr "Editar..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Adjuntos..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Acciones..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Relacionado..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
-msgstr "Informes..."
+msgstr "Informe..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Correo Electrónico..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Imprimir..."
@@ -350,16 +349,16 @@ msgid "_Help"
msgstr "Ay_uda"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Buscar"
#: tryton/gui/main.py:374
msgid "No result found."
-msgstr "No hay resultados."
+msgstr "No se han encontrado resultados."
#: tryton/gui/main.py:396
msgid "_Connect..."
@@ -383,7 +382,7 @@ msgstr "_Restaurar Base de Datos..."
#: tryton/gui/main.py:444
msgid "_Backup Database..."
-msgstr "_Copia de Seguridad de la Base de Datos..."
+msgstr "Realizar _Copia de Seguridad de la Base de Datos..."
#: tryton/gui/main.py:453
msgid "Dro_p Database..."
@@ -407,7 +406,7 @@ msgstr "Conmutar _Menú"
#: tryton/gui/main.py:504
msgid "_Global Search"
-msgstr "_Busqueda Global"
+msgstr "Búsqueda _Global"
#: tryton/gui/main.py:519
msgid "_Toolbar"
@@ -467,7 +466,7 @@ msgstr "Corrección Ortográfica"
#: tryton/gui/main.py:646
msgid "Tabs Position"
-msgstr "Posición de Pestañas"
+msgstr "Posición de las Pestañas"
#: tryton/gui/main.py:654
msgid "Top"
@@ -519,9 +518,9 @@ msgstr "_Acerca de..."
#: tryton/gui/main.py:799
msgid "Manage Favorites"
-msgstr "_Administrar Favoritos"
+msgstr "_Administrar Menús Favoritos"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -529,19 +528,19 @@ msgstr ""
"La acción seleccionada requiere cerrar todas las pestañas. \n"
"¿Desea continuar?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Cerrar pestaña"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
msgstr ""
"Va a eliminar una base de datos de Tryton.\n"
-"Está seguro que quiere continuar?"
+"¿Está seguro que quiere continuar?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -549,28 +548,28 @@ msgstr ""
"La contraseña del Servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "¡Acceso denegado!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Falló la eliminación de la base de datos!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "La base de datos se ha eliminado satisfactoriamente!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
-msgstr "Abrir una Copia de Seguridad a Restaurar..."
+msgstr "Abrir una Copia de Seguridad para Restaurar..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -578,11 +577,11 @@ msgstr ""
"No es posible restaurar una base de datos protegida con contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "La base de datos está protegida por contraseña!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -590,19 +589,19 @@ msgstr ""
"La contraseña del servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "La restauración de la base de datos ha fallado con el error:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "¡La restauración de la base de datos ha fallado!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "¡La base de datos se ha restaurado correctamente!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -610,15 +609,15 @@ msgstr ""
"No es posible hacer copia de una base de datos protegida por contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
-msgstr "La extracción de la base de datos ha fallado!"
+msgstr "¡La extracción de la base de datos ha fallado!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "¡La copia de seguridad de la base de datos ha finalizado correctamente!"
@@ -631,7 +630,7 @@ msgid "Create a new record"
msgstr "Crear un nuevo registro"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Guardar"
@@ -641,7 +640,7 @@ msgstr "Guardar este registro"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Cambiar vista"
@@ -694,7 +693,7 @@ msgstr ""
#: tryton/gui/window/dbcreate.py:45
msgid "No connection!"
-msgstr "No hay conexión!"
+msgstr "¡No hay conexión!"
#: tryton/gui/window/dbcreate.py:48
msgid ""
@@ -705,7 +704,7 @@ msgid ""
"that the server address and port (usually 8000) are not blocked.\n"
"Click on 'Change' to change the address."
msgstr ""
-"No se ha podido conectar al servidor!\n"
+"¡No se ha podido conectar al servidor!\n"
"1. Revise si el servidor se está ejecutando.\n"
"2. Averigüe en qué dirección y puerto está escuchando.\n"
"3. Si hay un cortafuegos entre el servidor y este cliente, asegúrese que "
@@ -824,40 +823,17 @@ msgstr "Confirme la contraseña del Administrador:"
msgid "Type the Admin password again"
msgstr "Teclee la contraseña del Administrador de nuevo"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "¡Ha introducido caracteres incorrectos en el nombre de la base de datos!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"La nueva contraseña del Administrador no coincide con el campo de "
"confirmación.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "¡Las contraseñas no coinciden!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del Administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "¡Falta la contraseña del Administrador!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -865,15 +841,15 @@ msgstr ""
"Ya existe una base de datos con el mismo nombre.\n"
"Inténtelo con otro nombre de base de datos."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Ya existe una base de datos con este nombre!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -886,7 +862,7 @@ msgstr ""
"adicional.\n"
"Mensaje de error:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Se ha producido un error al crear la base de datos!"
@@ -945,18 +921,18 @@ msgstr "Base de Datos:"
#: tryton/gui/window/dblogin.py:31
msgid "Profile Editor"
-msgstr "Perfiles"
+msgstr "Editor de Perfiles"
#: tryton/gui/window/dblogin.py:46
msgid "Profile"
msgstr "Perfil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Agregar"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Eliminar"
@@ -981,9 +957,9 @@ msgstr "Nombre de usuario:"
msgid "Could not connect to the server"
msgstr "No se ha podido conectar al servidor"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
-msgstr "Incompatible versión del servidor"
+msgstr "El cliente no es compatible con la versión del servidor"
#: tryton/gui/window/dblogin.py:370
msgid "Login"
@@ -1058,7 +1034,7 @@ msgid ""
"Check for an automatic database update after restoring a database from a "
"previous Tryton version."
msgstr ""
-"Confirme si desea realizar una actualización automática de la base de "
+"Márquelo para que se realice una actualización automática de la base de "
"datos desde una versión anterior de Tryton, después de restaurarla."
#: tryton/gui/window/dbrestore.py:156
@@ -1107,8 +1083,8 @@ msgstr "Adjunto:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Anterior"
@@ -1118,8 +1094,8 @@ msgstr "Registro Anterior"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Siguiente"
@@ -1157,7 +1133,7 @@ msgstr "Ver _Registro..."
#: tryton/gui/window/form.py:66
msgid "Show revisions..."
-msgstr ""
+msgstr "Mostrar versiones..."
#: tryton/gui/window/form.py:71
msgid "A_ttachments..."
@@ -1198,7 +1174,7 @@ msgstr "Adjunto(%d)"
#: tryton/gui/window/form.py:234
msgid "You have to select one record!"
-msgstr "Debe seleccionar un registro!"
+msgstr "¡Debe seleccionar un registro!"
#: tryton/gui/window/form.py:238
msgid "ID:"
@@ -1224,25 +1200,25 @@ msgstr "Fecha de Última Modificación:"
msgid "Model:"
msgstr "Modelo:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
-msgstr "Está seguro que quiere eliminar este registro?"
+msgstr "¿Está seguro que quiere eliminar este registro?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
-msgstr "Está seguro que quiere eliminar estos registros?"
+msgstr "¿Está seguro que quiere eliminar estos registros?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
-msgstr "Los registros no se han eliminado!"
+msgstr "¡Los registros no se han eliminado!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
-msgstr "Registros eliminados!"
+msgstr "¡Registros eliminados!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
-msgstr "Está trabajando ahora registro(s) duplicado(s)!"
+msgstr "¡Ahora está trabajando en registro(s) duplicado(s)!"
#: tryton/gui/window/form.py:352
msgid "Record saved!"
@@ -1252,11 +1228,11 @@ msgstr "¡Registro guardado!"
msgid "Invalid form!"
msgstr "¡Formulario no válido!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " de "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1264,49 +1240,48 @@ msgstr ""
"Este registro ha sido modificado.\n"
"¿Desea guardarlo?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Acción"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Lanzar acción"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Relacionado"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Abrir registros relacionados"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Informes"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Abrir informe"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Informe por email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Imprimir"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Imprimir informe"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Desconocido"
@@ -1339,18 +1314,16 @@ msgid "Current Password:"
msgstr "Contraseña Actual:"
#: tryton/gui/window/revision.py:20
-#, fuzzy
msgid "Revision"
-msgstr "Anterior"
+msgstr "Versión"
#: tryton/gui/window/revision.py:29
-#, fuzzy
msgid "Select a revision"
-msgstr "Selección"
+msgstr "Seleccione una versión"
#: tryton/gui/window/revision.py:32
msgid "Revision:"
-msgstr ""
+msgstr "Versión:"
#: tryton/gui/window/shortcuts.py:17
msgid "Keyboard Shortcuts"
@@ -1485,67 +1458,77 @@ msgstr "Consejos"
msgid "_Display a new tip next time"
msgstr "_Mostrar un nuevo consejo la próxima vez"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exportar a CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Exportaciones predeterminadas</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Todos los campos</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Limpiar"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Guardar Exportación"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Eliminar Exportación"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Campos a exportar</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Opciones</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Abrir"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Añadir nombres de _campo"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Nombre"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "¿Cuál es el nombre de esta exportación?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "¿Desea sobreescribir la definición '%s'?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
-msgstr "%d registro guardado!"
+msgstr "¡%d registro guardado!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
-msgstr "%d registros guardados!"
+msgstr "¡%d registros guardados!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1562,25 +1545,24 @@ msgstr "Enlace"
#: tryton/gui/window/win_form.py:136
msgid "Add"
-msgstr "Añadir"
+msgstr "Agregar"
#: tryton/gui/window/win_form.py:149
msgid "Remove <Del>"
msgstr "Eliminar <Supr>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Crear un nuevo registro <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Recuperar registro seleccionado <Ins>"
@@ -1602,10 +1584,10 @@ msgstr "Archivo a importar:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Abrir..."
@@ -1649,75 +1631,105 @@ msgstr "Se ha producido un error al procesar el archivo en el campo %s."
#: tryton/gui/window/win_import.py:364
#, python-format
msgid "%d record imported!"
-msgstr "%d registro importado!"
+msgstr "¡%d registro importado!"
#: tryton/gui/window/win_import.py:366
#, python-format
msgid "%d records imported!"
-msgstr "%d registros importados!"
+msgstr "¡%d registros importados!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Asistente"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Creado por Usuario"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Fecha de Creación"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Modificado por Usuario"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Fecha de Modificación"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
-msgstr "No es posible encontrar el estado de la vista de árbol"
+msgstr "No es posible obtener el estado de la vista de árbol"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
-msgstr "No se puede fijar la vista de estado del árbol"
+msgstr "No se puede establecer la vista de estado del árbol"
+
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar Como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la Imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "¡El tamaño de la imagen es muy grande.!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltros"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Mostrar marcadores de filtros"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Eliminar este marcador"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Marcar este filtro"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Nombre del Marcador:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Buscar"
@@ -1739,85 +1751,55 @@ msgstr "Semana"
#: tryton/gui/window/view_form/view/form_gtk/binary.py:47
msgid "Select a File..."
-msgstr "Seleccione un archivo..."
+msgstr "Seleccionar un archivo..."
#: tryton/gui/window/view_form/view/form_gtk/char.py:161
msgid "Show plain text"
msgstr "Mostrar como texto plano"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Agregar valor"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Remover \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
-msgstr "Seleccione una Imagen..."
+msgstr "Seleccionar una Imagen..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Todos los archivos"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Imágenes"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Debe guardar el registro antes de añadir traducciones!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hay otro idioma disponible!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Agregar registro existente"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Abrir registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Buscar registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Eliminar registro seleccionado"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Editar registro seleccionado <F2>"
@@ -1877,33 +1859,25 @@ msgstr "Seleccionar color principal"
msgid "Select a background color"
msgstr "Seleccionar color de fondo"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar Como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la Imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "La imagen es muy grande!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Debe guardar el registro antes de añadir traducciones!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hay otro idioma disponible!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/es_ES/LC_MESSAGES/tryton.mo b/share/locale/es_ES/LC_MESSAGES/tryton.mo
index 6342c42..09fb6c3 100644
Binary files a/share/locale/es_ES/LC_MESSAGES/tryton.mo and b/share/locale/es_ES/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/es_ES/LC_MESSAGES/tryton.po b/share/locale/es_ES/LC_MESSAGES/tryton.po
index ab03387..3d8cbcd 100644
--- a/share/locale/es_ES/LC_MESSAGES/tryton.po
+++ b/share/locale/es_ES/LC_MESSAGES/tryton.po
@@ -12,54 +12,54 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 2.4.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-04-18 00:04+0100\n"
-"Last-Translator: Jordi Esteve <jesteve at zikzakmedia.com>\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-17 17:31+0100\n"
+"Last-Translator: Jordi Esteve (Zikzakmedia) <jesteve at zikzakmedia.com>\n"
"Language-Team: <tryton-es at googlegroups.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "Indica un archivo de configuración alternativo"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "Modo desarrollo"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "Registra toda la información con nivel INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "Indica el nivel de log: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "Indica el usuario"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "Indica el puerto del servidor"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "Indica el nombre del servidor"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Demasiados argumentos"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "El archivo «%s» no se ha encontrado"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "No se ha podido escribir el archivo de configuración %s."
@@ -89,42 +89,42 @@ msgstr "Servidor:"
msgid "Port:"
msgstr "Puerto:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Selección"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Su selección:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Guardar como..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Ignorar siempre esta advertencia."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "¿Desea continuar?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Confirmación"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Excepción de concurrencia"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -142,50 +142,50 @@ msgstr ""
" - \"Comparar\" para ver la versión modificada:\n"
" - \"Guardar de todas formas\" para guardar sus cambios."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Comparar"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Guardar de todas formas"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Error"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Informar de un error"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Error de aplicación."
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Error: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Para informar de errores debe tener una cuenta en <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Seguimiento de errores"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Usuario:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Contraseña:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -194,11 +194,11 @@ msgstr ""
"Para mantenerle informado añadiremos su usuario a la lista de interesados"
" en esta incidencia."
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Se creó un nuevo error con identificador"
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -206,11 +206,11 @@ msgstr ""
"Error de conexión.\n"
"Nombre de usuario o contraseña incorrectos."
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Excepción:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -221,12 +221,12 @@ msgstr ""
"La aplicación no se podrá conectar a este servidor hasta que se corrija "
"la huella de seguridad del servidor."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Riesgo de seguridad."
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -234,31 +234,31 @@ msgstr ""
"Error de conexión.\n"
"No ha sido posible conectarse al servidor."
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Error de red."
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "A"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "s"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -278,57 +278,57 @@ msgstr "Abrir el calendario <F2>"
msgid "Date Selection"
msgstr "Selección de fecha"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "a"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "sí"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "verdadero"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "v"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Verdadero"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Falso"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr "Editar..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Adjuntos..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Acciones..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Relacionado..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Informe..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Correo electrónico..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Imprimir..."
@@ -353,10 +353,10 @@ msgid "_Help"
msgstr "Ay_uda"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Buscar"
@@ -524,7 +524,7 @@ msgstr "_Acerca de..."
msgid "Manage Favorites"
msgstr "_Administrar menús favoritos"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -532,11 +532,11 @@ msgstr ""
"La acción seleccionada requiere cerrar todas las pestañas. \n"
"¿Desea continuar?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Cerrar pestaña"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -544,7 +544,7 @@ msgstr ""
"Va a eliminar una base de datos de Tryton.\n"
"¿Está seguro que quiere continuar?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -552,28 +552,28 @@ msgstr ""
"La contraseña del servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Acceso denegado."
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "La eliminación de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Falló la eliminación de la base de datos."
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "La base de datos se ha eliminado correctamente."
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Abrir una copia de seguridad para restaurar..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -581,11 +581,11 @@ msgstr ""
"No es posible restaurar una base de datos protegida con contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "La base de datos está protegida con contraseña."
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -593,19 +593,19 @@ msgstr ""
"La contraseña del servidor Tryton es incorrecta.\n"
"Inténtelo de nuevo."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "La restauración de la base de datos ha fallado con el error:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "La restauración de la base de datos ha fallado."
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "La base de datos se ha restaurado correctamente."
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -613,15 +613,15 @@ msgstr ""
"No es posible hacer copia de una base de datos protegida con contraseña.\n"
"La copia de seguridad y su restauración tiene que ser manual."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "La extracción de la base de datos ha fallado con el mensaje de error:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "La extracción de la base de datos ha fallado."
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "La copia de seguridad de la base de datos ha finalizado correctamente."
@@ -634,7 +634,7 @@ msgid "Create a new record"
msgstr "Crear un nuevo registro"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Guardar"
@@ -644,7 +644,7 @@ msgstr "Guardar este registro"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Cambiar vista"
@@ -827,40 +827,17 @@ msgstr "Confirme la contraseña del administrador:"
msgid "Type the Admin password again"
msgstr "Teclee la contraseña del administrador de nuevo"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"El nombre de la base de datos está restringido a caracteres alfanuméricos"
-" y \"_\" (subrayado). Evite todos los acentos, espacios y cualquier otro "
-"carácter especial."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Ha introducido caracteres incorrectos en el nombre de la base de datos."
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
"La nueva contraseña del administrador no coincide con el campo de "
"confirmación.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Las contraseñas no coinciden."
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"La contraseña del administrador y su confirmación son necesarias para "
-"crear una nueva base de datos."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Falta la contraseña del administrador."
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -868,15 +845,15 @@ msgstr ""
"Ya existe una base de datos con el mismo nombre.\n"
"Inténtelo con otro nombre de base de datos."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Ya existe una base de datos con este nombre."
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "La contraseña del servidor Tryton no es correcta. Inténtelo de nuevo."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -889,7 +866,7 @@ msgstr ""
"adicional.\n"
"Mensaje de error:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Se ha producido un error al crear la base de datos."
@@ -954,12 +931,12 @@ msgstr "Editor de perfiles"
msgid "Profile"
msgstr "Perfil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Añadir"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Eliminar"
@@ -984,7 +961,7 @@ msgstr "Nombre de usuario:"
msgid "Could not connect to the server"
msgstr "No se ha podido conectar al servidor"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "El cliente no es compatible con la versión del servidor"
@@ -1110,8 +1087,8 @@ msgstr "Adjunto:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Anterior"
@@ -1121,8 +1098,8 @@ msgstr "Registro anterior"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Siguiente"
@@ -1227,23 +1204,23 @@ msgstr "Última fecha de modificación:"
msgid "Model:"
msgstr "Modelo:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "¿Está seguro que quiere eliminar este registro?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "¿Está seguro que quiere eliminar estos registros?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Los registros no se han eliminado."
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Registros eliminados."
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Ahora está trabajando en el registro duplicado."
@@ -1255,11 +1232,11 @@ msgstr "Registro guardado."
msgid "Invalid form!"
msgstr "Formulario incorrecto."
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " de "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1267,49 +1244,48 @@ msgstr ""
"Este registro ha sido modificado.\n"
"¿Desea guardarlo?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Acción"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Ejecutar acción"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "_Relacionado"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Abrir registros relacionados"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Informes"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Abrir informe"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Informe por email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Imprimir"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Imprimir informe"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Desconocido"
@@ -1475,7 +1451,7 @@ msgid ""
msgstr ""
"<b>Exportar gráficos</b>\n"
"\n"
-"Puedes guardar los gráficos como imagen PNG haciendo clic con el botón "
+"Puede guardar los gráficos como imagen PNG haciendo clic con el botón "
"derecho sobre el mismo.\n"
#: tryton/gui/window/tips.py:46
@@ -1486,67 +1462,77 @@ msgstr "Consejos"
msgid "_Display a new tip next time"
msgstr "_Mostrar un nuevo consejo la próxima vez"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exportar a CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Exportaciones predeterminadas</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Todos los campos</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Limpiar"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Guardar exportación"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Eliminar exportación"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Campos a exportar</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Opciones</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Abrir"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Añadir nombres de _campo"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Nombre"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (cadena)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "¿Cuál es el nombre de esta exportación?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Sobrescribir la definición de '%s'?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "Se ha guardado %d registro."
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "Se han guardado %d registros."
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1570,18 +1556,17 @@ msgid "Remove <Del>"
msgstr "Eliminar <Supr>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Crear un nuevo registro <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Recuperar registro seleccionado <Ins>"
@@ -1603,10 +1588,10 @@ msgstr "Archivo a importar:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Abrir..."
@@ -1657,68 +1642,98 @@ msgstr "Se ha importado %d registro."
msgid "%d records imported!"
msgstr "Se han importado %d registros."
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Asistente"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "No tiene una cadena como atributo."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Creado por:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Fecha de creación:"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Última modificación por:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Última fecha de modificación:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "No se ha podido obtener el estado de expansión del árbol"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "No se ha podido establecer el estado de expansión del árbol"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Guardar como"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Tamaño de la imagen"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Anchura:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Altura:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "Imagen PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "El tamaño de la imagen es muy grande."
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltros"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Muestra las búsquedas favoritas"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Eliminar de las búsquedas favoritas"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Guardar como búsqueda favorita"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Nombre de la búsqueda favorita:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Buscar"
@@ -1746,79 +1761,49 @@ msgstr "Seleccionar un archivo..."
msgid "Show plain text"
msgstr "Mostrar como texto plano"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Añadir un valor"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Eliminar \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Seleccionar una imagen..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Todos los archivos"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Imágenes"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traducción"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Editar"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Confuso"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Debe guardar el registro antes de añadir traducciones."
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "No hay otro idioma disponible."
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Añadir un registro existente"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Eliminar registro seleccionado <Supr>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Abrir registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Buscar registro <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Eliminar registro seleccionado"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Editar registro seleccionado <F2>"
@@ -1878,33 +1863,25 @@ msgstr "Seleccionar color principal"
msgid "Select a background color"
msgstr "Seleccionar color de fondo"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Guardar como"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Tamaño de la imagen"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Anchura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traducción"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Altura:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Editar"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "Imagen PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Confuso"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "El tamaño de la imagen es muy grande."
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Debe guardar el registro antes de añadir traducciones."
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "No hay otro idioma disponible."
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/fr_FR/LC_MESSAGES/tryton.mo b/share/locale/fr_FR/LC_MESSAGES/tryton.mo
index 2550dde..1f5ca02 100644
Binary files a/share/locale/fr_FR/LC_MESSAGES/tryton.mo and b/share/locale/fr_FR/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/fr_FR/LC_MESSAGES/tryton.po b/share/locale/fr_FR/LC_MESSAGES/tryton.po
index 7bcaffa..0a4cf6e 100644
--- a/share/locale/fr_FR/LC_MESSAGES/tryton.po
+++ b/share/locale/fr_FR/LC_MESSAGES/tryton.po
@@ -7,57 +7,57 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 0.0.1\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2013-04-19 23:58+0200\n"
-"Last-Translator: Nicolas Évrard <nicolas.evrard at b2ck.com>\n"
+"Last-Translator: Cédric Krier <cedric.krier at b2ck.com>\n"
"Language-Team: fr_FR\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "spécifier un fichier de configuration alternatif"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "mode développement"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "logger tout au niveau INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-msgstr "Spécifie le niveau de log : DEBUG, INFO, WARNING, ERROR, CRITICAL"
+msgstr "Spécifie le niveau de log : DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "spécifier l'utilisateur de login"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "spécifier le port du serveur"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "spécifier le nom du serveur"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Trop d'arguments"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "Fichier \"%s\" non trouvé"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
-msgstr "Impossible d'écrire le fichier de configuration %s !"
+msgstr "Impossible d'écrire le fichier de configuration %s !"
#: tryton/translate.py:184
#, python-format
@@ -70,7 +70,7 @@ msgstr "Sélectionnez votre action"
#: tryton/action/main.py:177
msgid "No action defined!"
-msgstr "Pas d'action définie !"
+msgstr "Pas d'action définie !"
#: tryton/common/common.py:284
msgid "Tryton Connection"
@@ -78,48 +78,48 @@ msgstr "Connexion Tryton"
#: tryton/common/common.py:295
msgid "Server:"
-msgstr "Serveur :"
+msgstr "Serveur :"
#: tryton/common/common.py:313 tryton/gui/window/dblogin.py:79
msgid "Port:"
-msgstr "Port :"
+msgstr "Port :"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Sélection"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
-msgstr "Votre sélection :"
+msgstr "Votre sélection :"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Enregistrer sous..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Toujours ignorer cet avertissement."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
-msgstr "Souhaitez-vous continuer ?"
+msgstr "Souhaitez-vous continuer ?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Confirmation"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Erreur d'accès concurrent"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -138,50 +138,50 @@ msgstr ""
" - \"Comparer\" pour voir la nouvelle version;\n"
" - \"Écraser\" pour sauver vos modifications."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Comparer"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Écraser"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Erreur"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Rapporter un bogue"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
-msgstr "Erreur Applicative !"
+msgstr "Erreur Applicative !"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
-msgstr "Erreur : "
+msgstr "Erreur : "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Pour rapporter un bogue vous devez avoir un compte sur <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Bug Tracker"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
-msgstr "Utilisateur :"
+msgstr "Utilisateur :"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
-msgstr "Mot de passe :"
+msgstr "Mot de passe :"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -190,70 +190,70 @@ msgstr ""
"Pour vous garder informé, votre nom d'utilisateur a été ajouté à la liste"
" de suivi de ce bogue"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Un nouveau bogue a été créé avec l'ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
msgstr ""
-"Erreur de connexion !\n"
-"Mauvais nom d'utilisateur ou mot de passe !"
+"Erreur de connexion !\n"
+"Mauvais nom d'utilisateur ou mot de passe !"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
-msgstr "Exception :"
+msgstr "Exception :"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
" is fixed."
msgstr ""
-"L'empreinte digitale du serveur a changé depuis la dernière connection !\n"
+"L'empreinte digitale du serveur a changé depuis la dernière connection !\n"
"Les connections à ce serveur sont annulées tant que son empreinte n'est "
"pas corrigée."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
-msgstr "Alerte sécurité !"
+msgstr "Alerte sécurité !"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
msgstr ""
-"Erreur de connexion !\n"
-"Impossible de se connecter au serveur !"
+"Erreur de connexion !\n"
+"Impossible de se connecter au serveur !"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Erreur réseau"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "A"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "s"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "j"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -273,57 +273,57 @@ msgstr "Ouvrir le calendrier <F2>"
msgid "Date Selection"
msgstr "Sélection de la date"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "y"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "oui"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "vrai"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "v"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Vrai"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Faux"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr "Éditer..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Pièces jointes..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Actions..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Relation..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Rapport..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Email..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Imprimer..."
@@ -348,10 +348,10 @@ msgid "_Help"
msgstr "_Aide"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Recherche"
@@ -519,7 +519,7 @@ msgstr "_À Propos..."
msgid "Manage Favorites"
msgstr "_Gérer les favoris"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -527,19 +527,19 @@ msgstr ""
"L'action suivante nécessite de fermer tous les onglets.\n"
"Voulez-vous continuer?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Fermer l'onglet"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
msgstr ""
"Vous allez supprimer une base de données Tryton.\n"
-"Êtes-vous sûr de vouloir continuer ?"
+"Êtes-vous sûr de vouloir continuer ?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -547,30 +547,30 @@ msgstr ""
"Mauvais mot de passe du serveur Tryton.\n"
"Essayez à nouveau."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
-msgstr "Accès refusé !"
+msgstr "Accès refusé !"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr ""
-"La suppression de la base de données a échouée avec le message d'erreur :"
+"La suppression de la base de données a échouée avec le message d'erreur :"
"\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
-msgstr "La suppression de la base de données a échouée !"
+msgstr "La suppression de la base de données a échouée !"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
-msgstr "La base de données a été supprimée avec succès !"
+msgstr "La base de données a été supprimée avec succès !"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Ouvrir le Fichier de Sauvergarde..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -579,11 +579,11 @@ msgstr ""
"mot de passe.\n"
"La sauvegarde et la restauration doivent être faites manuellement."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
-msgstr "La base de données est protégée par un mot de passe !"
+msgstr "La base de données est protégée par un mot de passe !"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -591,21 +591,21 @@ msgstr ""
"Mauvais mot de passe du serveur Tryton.\n"
"Essayez à nouveau."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr ""
"La restauration de la base de données a échouée avec le message d'erreur "
":\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
-msgstr "La restauration de la base de données a échoué !"
+msgstr "La restauration de la base de données a échoué !"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
-msgstr "La base de données a été restaurée avec succès !"
+msgstr "La base de données a été restaurée avec succès !"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -614,17 +614,17 @@ msgstr ""
" mot de passe.\n"
"La sauvegarde et la restauration doivent être faites manuellement."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
-msgstr "La sauvegarde de la base de donnée a échouée avec le message d'erreur :\n"
+msgstr "La sauvegarde de la base de donnée a échouée avec le message d'erreur :\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
-msgstr "La sauvegarde de la base de données a échouée !"
+msgstr "La sauvegarde de la base de données a échouée !"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
-msgstr "La base de données a été sauvegardée avec succès !"
+msgstr "La base de données a été sauvegardée avec succès !"
#: tryton/gui/window/board.py:19 tryton/gui/window/form.py:32
msgid "New"
@@ -635,7 +635,7 @@ msgid "Create a new record"
msgstr "Créer un nouvel enregistrement"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Sauver"
@@ -645,7 +645,7 @@ msgstr "Sauver cet enregistrement"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Basculer"
@@ -692,13 +692,13 @@ msgid ""
"'8000' if the server is installed on this computer. Click on 'Change' to "
"change the address."
msgstr ""
-"Ceci est l'URL du serveur Tryton. Utilisez le serveur 'localhost' et le "
-"port '8000' si le serveur est installé sur cette machine. Cliquez sur "
-"'Changer' pour changer l'adresse."
+"Ceci est l'URL du serveur Tryton. Utilisez le serveur « localhost » et le"
+" port « 8000 » si le serveur est installé sur cette machine. Cliquez sur "
+"« Changer » pour changer l'adresse."
#: tryton/gui/window/dbcreate.py:45
msgid "No connection!"
-msgstr "Pas de connexion !"
+msgstr "Pas de connexion !"
#: tryton/gui/window/dbcreate.py:48
msgid ""
@@ -709,13 +709,13 @@ msgid ""
"that the server address and port (usually 8000) are not blocked.\n"
"Click on 'Change' to change the address."
msgstr ""
-"Impossible de se connecter au serveur !\n"
+"Impossible de se connecter au serveur !\n"
"1. Vérifiez si le serveur est en train de tourner.\n"
"2. Trouvez sur quelle adresse et port il écoute.\n"
"3. Si il y a un firewall entre le serveur et ce client, vérifiez que "
"l'adresse du serveur et le port (habituellement 8000) ne sont pas "
"bloqués.\n"
-"Cliquez sur 'Changer' pour changer l'adresse."
+"Cliquez sur « Changer » pour changer l'adresse."
#: tryton/gui/window/dbcreate.py:139
msgid "Create new database"
@@ -731,11 +731,11 @@ msgstr "Créer une nouvelle base de données"
#: tryton/gui/window/dbcreate.py:168
msgid "Server Setup:"
-msgstr "Configuration du serveur :"
+msgstr "Configuration du serveur :"
#: tryton/gui/window/dbcreate.py:173
msgid "Server connection:"
-msgstr "Connexion au serveur :"
+msgstr "Connexion au serveur :"
#: tryton/gui/window/dbcreate.py:182 tryton/gui/window/dbdumpdrop.py:140
#: tryton/gui/window/dbrestore.py:88
@@ -744,9 +744,9 @@ msgid ""
"the server is installed on this computer. Click on 'Change' to change the"
" address."
msgstr ""
-"Ceci est l'URL du serveur. Utilisez le serveur 'localhost' et port '8000'"
-" si le serveur est installé sur cette machine. Cliquez sur 'Changer' pour"
-" changer l'adresse."
+"Ceci est l'« URL » du serveur. Utilisez le serveur « localhost » et port "
+"« 8000 » si le serveur est installé sur cette machine. Cliquez sur "
+"« Changer » pour changer l'adresse."
#: tryton/gui/window/dbcreate.py:185 tryton/gui/window/dbdumpdrop.py:147
#: tryton/gui/window/dbrestore.py:93
@@ -760,7 +760,7 @@ msgstr "Configurer la connexion au serveur"
#: tryton/gui/window/dbcreate.py:197 tryton/gui/window/dbdumpdrop.py:186
#: tryton/gui/window/dbrestore.py:102
msgid "Tryton Server Password:"
-msgstr "Mot de passe du serveur Tryton :"
+msgstr "Mot de passe du serveur Tryton :"
#: tryton/gui/window/dbcreate.py:207 tryton/gui/window/dbdumpdrop.py:196
#: tryton/gui/window/dbrestore.py:111
@@ -774,11 +774,11 @@ msgstr ""
#: tryton/gui/window/dbcreate.py:218
msgid "New database setup:"
-msgstr "Configuration de la nouvelle base de données :"
+msgstr "Configuration de la nouvelle base de données :"
#: tryton/gui/window/dbcreate.py:224
msgid "Database name:"
-msgstr "Nom de la base de données :"
+msgstr "Nom de la base de données :"
#: tryton/gui/window/dbcreate.py:236
msgid ""
@@ -790,12 +790,12 @@ msgstr ""
"Choisissez le nom de la nouvelle base de données.\n"
"Seuls sont permis les caractères alphanumériques ou _ (caractère "
"souligné)\n"
-"Vous devez proscrire les accents, espaces ou caractères spéciaux ! "
-"Example : tryton"
+"Vous devez proscrire les accents, espaces ou caractères spéciaux ! "
+"Example : tryton"
#: tryton/gui/window/dbcreate.py:243
msgid "Default language:"
-msgstr "Langue par défaut :"
+msgstr "Langue par défaut :"
#: tryton/gui/window/dbcreate.py:253
msgid ""
@@ -809,7 +809,7 @@ msgstr ""
#: tryton/gui/window/dbcreate.py:257
msgid "Admin password:"
-msgstr "Mot de passe admin :"
+msgstr "Mot de passe admin :"
#: tryton/gui/window/dbcreate.py:267
msgid ""
@@ -820,51 +820,27 @@ msgid ""
msgstr ""
"Choisissez un mot de passe pour l'utilisateur admin de la nouvelle base "
"de données. Avec ce mot de passe, vous pourrez ensuite vous connecter à "
-"la base de données :\n"
-"Nom d'utilisateur : admin\n"
-"Mot de passe : <Le mot de passe que vous avez choisi>"
+"la base de données :\n"
+"Nom d'utilisateur : admin\n"
+"Mot de passe : <Le mot de passe que vous avez choisi>"
#: tryton/gui/window/dbcreate.py:275
msgid "Confirm admin password:"
-msgstr "Confirmer le mot de passe admin :"
+msgstr "Confirmer le mot de passe admin :"
#: tryton/gui/window/dbcreate.py:284
msgid "Type the Admin password again"
msgstr "Entrer le mot de passe admin à nouveau"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Le nom de la base de données est restreint aux caractères alphanumériques"
-" et \"_\" (souligné). Il doit commencer par une lettre et ne pas dépasser"
-" 63 caractères.\n"
-"Les accents, espaces et autres caractères spéciaux sont proscrit."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Mauvais caractères dans le nom de base de données !"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "Le mot de passe admin ne correspond pas au mot de passe de confirmation.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
-msgstr "Les mots de passe ne correspondent pas !"
+msgstr "Les mots de passe ne correspondent pas !"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Le mot de passe admin et de confirmation sont requis pour créer une "
-"nouvelle base de données."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Mot de passe admin manquant !"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -872,17 +848,17 @@ msgstr ""
"Une base de données avec le même nom existe déjà.\n"
"Essayer un autre nom de base de données."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
-msgstr "La base de données existe déjà !"
+msgstr "La base de données existe déjà !"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr ""
"Désolé, le mot de passe du serveur Tryton est incorrect. Veuillez "
"réessayer."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -891,24 +867,24 @@ msgid ""
msgstr ""
"Impossible de créer une base de données pour une raison inconnue.\n"
"Si une base de données a été créée, elle pourrait être inutilisable. "
-"Supprimer la ! Vérifiez le message d'erreur pour plus d'information.\n"
-"Message d'erreur :\n"
+"Supprimer la ! Vérifiez le message d'erreur pour plus d'information.\n"
+"Message d'erreur :\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
-msgstr "Erreur de création de base de données !"
+msgstr "Erreur de création de base de données !"
#: tryton/gui/window/dbdumpdrop.py:26
msgid "Could not connect to server!"
-msgstr "Impossible de se connecter au serveur !"
+msgstr "Impossible de se connecter au serveur !"
#: tryton/gui/window/dbdumpdrop.py:30
msgid "This client version is not compatible with the server!"
-msgstr "Cette version du client n'est pas compatible avec le serveur !"
+msgstr "Cette version du client n'est pas compatible avec le serveur !"
#: tryton/gui/window/dbdumpdrop.py:39
msgid "No database found, you must create one!"
-msgstr "Pas de base de donnée trouvée, vous devez en créer une !"
+msgstr "Pas de base de donnée trouvée, vous devez en créer une !"
#: tryton/gui/window/dbdumpdrop.py:77
msgid "Backup a database"
@@ -944,12 +920,12 @@ msgstr "Choisissez la base de données à supprimer"
#: tryton/gui/window/dbdumpdrop.py:130 tryton/gui/window/dbrestore.py:77
msgid "Server Connection:"
-msgstr "Connexion au serveur :"
+msgstr "Connexion au serveur :"
#: tryton/gui/window/dbdumpdrop.py:156 tryton/gui/window/dblogin.py:89
#: tryton/gui/window/dblogin.py:444
msgid "Database:"
-msgstr "Base de données :"
+msgstr "Base de données :"
#: tryton/gui/window/dblogin.py:31
msgid "Profile Editor"
@@ -959,19 +935,19 @@ msgstr "Éditeur de profil"
msgid "Profile"
msgstr "Profil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Ajouter"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Enlever"
#: tryton/gui/window/dblogin.py:70
msgid "Hostname:"
-msgstr "Hôte :"
+msgstr "Hôte :"
#: tryton/gui/window/dblogin.py:107
msgid "Create"
@@ -983,15 +959,15 @@ msgstr "Récupération de la liste des bases de données"
#: tryton/gui/window/dblogin.py:128
msgid "Username:"
-msgstr "Nom d'utilisateur :"
+msgstr "Nom d'utilisateur :"
#: tryton/gui/window/dblogin.py:308
msgid "Could not connect to the server"
-msgstr "Impossible de se connecter au serveur !"
+msgstr "Impossible de se connecter au serveur !"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
-msgstr "Version du serveur incompatible !"
+msgstr "Version du serveur incompatible !"
#: tryton/gui/window/dblogin.py:370
msgid "Login"
@@ -1015,7 +991,7 @@ msgstr "Se connecter au serveur Tryton"
#: tryton/gui/window/dblogin.py:417
msgid "Profile:"
-msgstr "Profil :"
+msgstr "Profil :"
#: tryton/gui/window/dblogin.py:421
msgid "_Manage profiles"
@@ -1027,11 +1003,11 @@ msgstr "Hôte / Port"
#: tryton/gui/window/dblogin.py:434
msgid "Host:"
-msgstr "Hôte :"
+msgstr "Hôte :"
#: tryton/gui/window/dblogin.py:467
msgid "User name:"
-msgstr "Nom d'utilisateur :"
+msgstr "Nom d'utilisateur :"
#: tryton/gui/window/dbrestore.py:66
msgid "Restore Database"
@@ -1039,7 +1015,7 @@ msgstr "Restaurer une base de données"
#: tryton/gui/window/dbrestore.py:119
msgid "File to Restore:"
-msgstr "Fichier à restaurer :"
+msgstr "Fichier à restaurer :"
#: tryton/gui/window/dbrestore.py:133
msgid ""
@@ -1051,16 +1027,16 @@ msgstr ""
"Choisissez le nom de la base de données à restaurer.\n"
"Seul sont permis les caractères alphanumériques ou _ (caractère souligné)"
"\n"
-"Vous devez proscrire les accents, espaces ou caractères spéciaux !\n"
-"Example : tryton"
+"Vous devez proscrire les accents, espaces ou caractères spéciaux !\n"
+"Example : tryton"
#: tryton/gui/window/dbrestore.py:139
msgid "New Database Name:"
-msgstr "Nom de la nouvelle base de données :"
+msgstr "Nom de la nouvelle base de données :"
#: tryton/gui/window/dbrestore.py:142
msgid "Update Database:"
-msgstr "Mettre à jour la base de données :"
+msgstr "Mettre à jour la base de données :"
#: tryton/gui/window/dbrestore.py:146
msgid ""
@@ -1088,36 +1064,36 @@ msgstr "Paramètres d'email"
#: tryton/gui/window/email.py:28
msgid "Command Line:"
-msgstr "Commande :"
+msgstr "Commande :"
#: tryton/gui/window/email.py:37
msgid "Legend of Available Placeholders:"
-msgstr "Légende des symboles :"
+msgstr "Légende des symboles :"
#: tryton/gui/window/email.py:44
msgid "To:"
-msgstr "À :"
+msgstr "À :"
#: tryton/gui/window/email.py:48
msgid "CC:"
-msgstr "CC :"
+msgstr "CC :"
#: tryton/gui/window/email.py:52
msgid "Subject:"
-msgstr "Sujet :"
+msgstr "Sujet :"
#: tryton/gui/window/email.py:56
msgid "Body:"
-msgstr "Corps :"
+msgstr "Corps :"
#: tryton/gui/window/email.py:60
msgid "Attachment:"
-msgstr "Attachement :"
+msgstr "Attachement :"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Précédent"
@@ -1127,8 +1103,8 @@ msgstr "Enregistrement précédent"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Suivant"
@@ -1207,115 +1183,115 @@ msgstr "Attachement(%d)"
#: tryton/gui/window/form.py:234
msgid "You have to select one record!"
-msgstr "Vous devez sélectionner un enregistrement !"
+msgstr "Vous devez sélectionner un enregistrement !"
#: tryton/gui/window/form.py:238
msgid "ID:"
-msgstr "ID :"
+msgstr "ID :"
#: tryton/gui/window/form.py:239
msgid "Creation User:"
-msgstr "Créé par l'utilisateur :"
+msgstr "Créé par l'utilisateur :"
#: tryton/gui/window/form.py:240
msgid "Creation Date:"
-msgstr "Date de création :"
+msgstr "Date de création :"
#: tryton/gui/window/form.py:241
msgid "Latest Modification by:"
-msgstr "Dernière modification par :"
+msgstr "Dernière modification par :"
#: tryton/gui/window/form.py:242
msgid "Latest Modification Date:"
-msgstr "Date de dernière modification :"
+msgstr "Date de dernière modification :"
#: tryton/gui/window/form.py:260
msgid "Model:"
-msgstr "Modèle :"
+msgstr "Modèle :"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
-msgstr "Êtes-vous sûr de vouloir supprimer cet enregistrement ?"
+msgstr "Êtes-vous sûr de vouloir supprimer cet enregistrement ?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
-msgstr "Êtes-vous sûr de vouloir supprimer ces enregistrements ?"
+msgstr "Êtes-vous sûr de vouloir supprimer ces enregistrements ?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
-msgstr "Enregistrements non supprimés !"
+msgstr "Enregistrements non supprimés !"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
-msgstr "Enregistrements supprimés !"
+msgstr "Enregistrements supprimés !"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
-msgstr "Sur les enregistrement(s) dupliqué(s) maintenant !"
+msgstr "Sur les enregistrement(s) dupliqué(s) maintenant !"
#: tryton/gui/window/form.py:352
msgid "Record saved!"
-msgstr "Enregistrement sauvé !"
+msgstr "Enregistrement sauvé !"
#: tryton/gui/window/form.py:355
msgid "Invalid form!"
-msgstr "Formulaire non-valide !"
+msgstr "Formulaire non-valide !"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " de "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
+#, fuzzy
msgid ""
"This record has been modified\n"
"do you want to save it ?"
msgstr ""
"Cet enregistrement a été modifié\n"
-"Voulez-vous le sauvegarder ?"
+"Voulez-vous le sauvegarder ?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Actions"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Lancer une action"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Relation"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Ouvrir les enregistrements liés"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Rapport"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Ouvrir un rapport"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Email"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Rapport par email"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Imprimer"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Imprimer un rapport"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Inconnu"
@@ -1329,7 +1305,7 @@ msgstr "Limite de recherche"
#: tryton/gui/window/limit.py:29
msgid "Limit:"
-msgstr "Limite :"
+msgstr "Limite :"
#: tryton/gui/window/preference.py:23
msgid "Preferences"
@@ -1345,7 +1321,7 @@ msgstr "Préférence"
#: tryton/gui/window/preference.py:88
msgid "Current Password:"
-msgstr "Mot de passe actuel :"
+msgstr "Mot de passe actuel :"
#: tryton/gui/window/revision.py:20
msgid "Revision"
@@ -1357,7 +1333,7 @@ msgstr "Sélectionner une révision"
#: tryton/gui/window/revision.py:32
msgid "Revision:"
-msgstr "Révision :"
+msgstr "Révision :"
#: tryton/gui/window/shortcuts.py:17
msgid "Keyboard Shortcuts"
@@ -1491,75 +1467,85 @@ msgstr "Astuces"
msgid "_Display a new tip next time"
msgstr "_Afficher une nouvelle astuce la prochaine fois"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exporter en CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Exportations prédéfinies</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Tout les champs</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Effacer"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Sauver l'exportation"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Supprimer l'exportation"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Champs à exporter</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Options</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Ouvrir"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Ajouter les noms des champs"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Nom"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (string)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
-msgstr "Quel est le nom de cet export ?"
+msgstr "Quel est le nom de cet export ?"
+
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Surcharger la définition « %s » ?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d enregistrement sauvé!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d enregistrements sauvés!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
"Error message:\n"
"%s"
msgstr ""
-"Échec de l'opération !\n"
-"Message d'erreur :\n"
+"Échec de l'opération !\n"
+"Message d'erreur :\n"
"%s"
#: tryton/gui/window/win_form.py:36
@@ -1575,18 +1561,17 @@ msgid "Remove <Del>"
msgstr "Supprimer <Del>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Créer un nouvel enregistrement<F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Supprimer l'enregistrement sélectionné<Del>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Restaurer l'enregistrement sélectionné<Ins>"
@@ -1608,10 +1593,10 @@ msgstr "Fichier à importer"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Ouvrir..."
@@ -1621,19 +1606,19 @@ msgstr "Paramètres CSV"
#: tryton/gui/window/win_import.py:124
msgid "Field Separator:"
-msgstr "Séparateur de champs :"
+msgstr "Séparateur de champs :"
#: tryton/gui/window/win_import.py:133
msgid "Text Delimiter:"
-msgstr "Délimiteur de texte :"
+msgstr "Délimiteur de texte :"
#: tryton/gui/window/win_import.py:141
msgid "Encoding:"
-msgstr "Codage :"
+msgstr "Codage :"
#: tryton/gui/window/win_import.py:150
msgid "Lines to Skip:"
-msgstr "Lignes à ignorer :"
+msgstr "Lignes à ignorer :"
#: tryton/gui/window/win_import.py:185 tryton/gui/window/win_import.py:190
msgid "Field name"
@@ -1641,7 +1626,7 @@ msgstr "Nom du champ"
#: tryton/gui/window/win_import.py:251
msgid "You must select an import file first!"
-msgstr "Vous devez d'abord sélectionner un fichier d'import !"
+msgstr "Vous devez d'abord sélectionner un fichier d'import !"
#: tryton/gui/window/win_import.py:262
msgid "Error opening CSV file"
@@ -1662,68 +1647,98 @@ msgstr "%d enregistrement importé!"
msgid "%d records imported!"
msgstr "%d enregistrements importés!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Wizard"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Pas d'attribut string."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Créé par l'utilisateur"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Date de création"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Modifié par l'utilisateur"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Date de modification"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "Impossible d'obtenir l'état de la vue arbre"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "Impossible de définir l'état de la vue arbre"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr " :"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Enregistrer sous"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Taille de l'image"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Largeur :"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Hauteur :"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "image PNG (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Taille de l'image trop grande !"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltrer"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Montrer les marques-pages des filtres"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Supprimer ce marque-page"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Sauver ce filtre"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Nom du marque-page"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Chercher"
@@ -1751,79 +1766,49 @@ msgstr "Sélectionner un fichier ..."
msgid "Show plain text"
msgstr "Montrer en text clair"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Ajouter une valeur"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr " :"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Supprimer \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Sélectionner une image ..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Tous les fichiers"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Images"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Traduction"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Éditer"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Floue"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Vous devez sauvegarder l'enregistrement avant d'ajouter des traductions !"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Pas d'autre langue disponible !"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Ajouter un enregistrement existant"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Supprimer l'enregistrement sélectionné<Del>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Ouvrir un enregistrement<F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Chercher un enregistrement<F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Supprimer l'enregistrement sélectionné"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Éditer l'enregistrement sélectionné<F2>"
@@ -1883,33 +1868,25 @@ msgstr "Couleur du texte"
msgid "Select a background color"
msgstr "Couleur de l'arrière plan"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Enregistrer sous"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Taille de l'image"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Largeur :"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Traduction"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Hauteur :"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Éditer"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "image PNG (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Floue"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Taille de l'image trop grande !"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Vous devez sauvegarder l'enregistrement avant d'ajouter des traductions !"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Pas d'autre langue disponible !"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/ja_JP/LC_MESSAGES/tryton.mo b/share/locale/ja_JP/LC_MESSAGES/tryton.mo
index 4bab3a1..719b660 100644
Binary files a/share/locale/ja_JP/LC_MESSAGES/tryton.mo and b/share/locale/ja_JP/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/ja_JP/LC_MESSAGES/tryton.po b/share/locale/ja_JP/LC_MESSAGES/tryton.po
index 25179f6..81f0923 100644
--- a/share/locale/ja_JP/LC_MESSAGES/tryton.po
+++ b/share/locale/ja_JP/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 1.5.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2012-04-23 11:07+0200\n"
"Last-Translator: TANIGUCHI Takaki <takaki at asis.media-as.org>\n"
"Language-Team: ja_JP <LL at li.org>\n"
@@ -15,46 +15,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "代替設定ファイルを指定"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr ""
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "全てをINFOレベルでログを取る"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr ""
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "ログインユーザーを指定"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "サーバーポートを指定"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "サーバーホスト名を指定"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr ""
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "ファイル \"%s\" が見つかりません"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "設定ファイル %s が書きこめません!"
@@ -84,42 +84,42 @@ msgstr "サーバー名:"
msgid "Port:"
msgstr "ポート番号:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "選択"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "あなたの選択:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "名前を付けて保存"
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "常にこの警告を無視する。"
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr ""
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "確認"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "並列性例外"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
#, fuzzy
msgid ""
"<b>Write Concurrency Warning:</b>\n"
@@ -138,50 +138,50 @@ msgstr ""
" - \"比較\"で変更されたものを見る\n"
" - \"とにかく書き込む\"で現在の物を書き込む。\n"
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "比較"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "とにかく書き込む"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "エラー"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "バグ報告"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "アプリケーションエラー!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "エラー:"
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, fuzzy, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "記録しておきたいバグを報告<u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "バグトラッカー"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "ユーザー:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "パスワード:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -189,11 +189,11 @@ msgstr ""
"別のユーザーに同じバグが報告されています。\n"
"お知らせするためにこの問題の通知リストにあなたのユーザー名を追加しました。"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "新しいバグがID番号と一緒に作成されました"
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -201,11 +201,11 @@ msgstr ""
"接続エラー!\n"
"ユーザー名またはパスワードが違います!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "例外:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -214,12 +214,12 @@ msgstr ""
"このサーバーのフィンガープリントが最後の接続から変化しています!\n"
"フィンガープリントが訂正されるまで接続を停止します。"
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "セキュリティリスク!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -227,31 +227,31 @@ msgstr ""
"接続エラー!\n"
"サーバーに接続できません!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "ネットワーク エラー!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "年"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "月"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "週"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "日"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "時"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "分"
@@ -272,65 +272,65 @@ msgstr "カレンダーを開く"
msgid "Date Selection"
msgstr "日付を選択"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
#, fuzzy
msgid "yes"
msgstr "バイト"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
#, fuzzy
msgid "true"
msgstr "真"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "真"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "偽"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
#, fuzzy
msgid "Edit..."
msgstr "終了(_Q)"
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
#, fuzzy
msgid "Attachments..."
msgstr "添付:"
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
#, fuzzy
msgid "Actions..."
msgstr "実行(_A)"
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
#, fuzzy
msgid "Relate..."
msgstr "削除(_D)"
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
#, fuzzy
msgid "Report..."
msgstr "データのインポート(_I)"
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
#, fuzzy
msgid "E-Mail..."
msgstr "Eメール(_E)"
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
#, fuzzy
msgid "Print..."
msgstr "印刷(_P)"
@@ -356,10 +356,10 @@ msgid "_Help"
msgstr "ヘルプ(_H)"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "検索"
@@ -529,17 +529,17 @@ msgstr "Trytonについて"
msgid "Manage Favorites"
msgstr ""
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
msgstr ""
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "タブを閉じる"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -547,7 +547,7 @@ msgstr ""
"Trytonデータベースを削除します。\n"
"本当に実行しますか?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -555,28 +555,28 @@ msgstr ""
"Trytonサーバのパスワードが違います\n"
"もう一度試して下さい。"
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "アクセスが拒否されました!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "データベースの削除に失敗しました。エラーメッセージ:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "データベースの削除に失敗しました!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "データベースの削除に成功しました!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "復元のためバックアップファイルを開く"
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -584,11 +584,11 @@ msgstr ""
"パスワードで保護されたデータベースを復元できません。\n"
"バックアップと復元は手動でする必要があります。"
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "データベースはパスワードで保護されています!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -596,19 +596,19 @@ msgstr ""
"Trytonサーバーのパスワードが違います。\n"
"もう一度試して下さい。"
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "データベースの復元に失敗しました。エラーメッセージ:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "データベースの復元に失敗しました!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "データベースの復元に成功しました!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -616,15 +616,15 @@ msgstr ""
"パスワードで保護されたデータベースのダンプはできません。\n"
"バックアップと復元は手動でする必要があります。"
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "データベースのダンプに失敗しました。エラーメッセージ:"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "データベースのダンプに失敗しました!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "データベースのバックアップに成功しました!"
@@ -637,7 +637,7 @@ msgid "Create a new record"
msgstr "レコードの新規作成"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "保存"
@@ -647,7 +647,7 @@ msgstr "レコードの保存"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "切替"
@@ -820,47 +820,29 @@ msgstr "管理者パスワードを確認:"
msgid "Type the Admin password again"
msgstr "管理者パスワードを再入力して下さい"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr "データベース名は英数字と\"_\"(アンダースコア)に制限されています。アセントや空白や特殊文字は避けて下さい。"
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "データベース名に正しくない文字があります!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "管理者パスワードが再確認入力と一致しません\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "パスワードが一致しません!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr "新しいデータベースを作成するのに管理者パスワードと確認用パスワードが必要です。"
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "管理者パスワードがありません!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
msgstr "同じ名前のデータベースが存在します。別の名前を試して下さい。"
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "このデータベース名は存在します!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Trytonサーバーのパスワードが違います。再び試して下さい。"
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -871,7 +853,7 @@ msgstr ""
"作成されていたとしても壊れているでしょう。データベースが削除されているかもしれません。可能な情報をエラーメッセージでチェックして下さい。\n"
"エラーメッセージ:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "データベースの作成エラー!"
@@ -936,12 +918,12 @@ msgstr ""
msgid "Profile"
msgstr ""
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "追加(_A)"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "削除(_R)"
@@ -971,7 +953,7 @@ msgstr "ユーザー名:"
msgid "Could not connect to the server"
msgstr "サーバーに接続できませんでした!"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
#, fuzzy
msgid "Incompatible version of the server"
msgstr "サーバのバージョンが非互換です!"
@@ -1097,8 +1079,8 @@ msgstr "添付:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "前"
@@ -1108,8 +1090,8 @@ msgstr "前のレコード"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "次"
@@ -1219,23 +1201,23 @@ msgstr "最終更新日:"
msgid "Model:"
msgstr "モデル:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "このレコードを削除しますか?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "このレコードを削除しますか?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "レコードが削除されませんでした!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "レコードが削除されました!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "重複したレコードで作業中です!"
@@ -1247,11 +1229,11 @@ msgstr "レコードが保存されました!"
msgid "Invalid form!"
msgstr "不正なフォームです!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " 中 "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1259,54 +1241,53 @@ msgstr ""
"レコードが変更されています\n"
"保存しますか?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "実行"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr ""
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
#, fuzzy
msgid "Relate"
msgstr "作成(_C)"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
#, fuzzy
msgid "Open related records"
msgstr "レコードを開く"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
#, fuzzy
msgid "Report"
msgstr "レポート"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
#, fuzzy
msgid "Open report"
msgstr "レコードを開く"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
#, fuzzy
msgid "E-Mail"
msgstr "Eメール"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr ""
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "印刷"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr ""
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "未知"
@@ -1482,67 +1463,77 @@ msgstr "技"
msgid "_Display a new tip next time"
msgstr "新しい技を次回も表示する(_D)"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "CSVにエクスポート"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>定義済みエキスポート</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>全てのフィールド</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "クリア"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "エクスポートを保存"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "エクスポートを削除"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>エクスポートするフィールド</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>オプション</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "開く"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "フィールド名を追加(_F)"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "名前"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "このエクスポートの名前は何ですか?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d レコード保存されました!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d レコード保存されました!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1566,20 +1557,19 @@ msgid "Remove <Del>"
msgstr ""
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
#, fuzzy
msgid "Create a new record <F3>"
msgstr "レコードの新規作成"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
#, fuzzy
msgid "Delete selected record <Del>"
msgstr "選択したレコードを削除"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
#, fuzzy
msgid "Undelete selected record <Ins>"
msgstr "選択したレコードを削除"
@@ -1602,10 +1592,10 @@ msgstr "インポートするファイル:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "開く"
@@ -1657,75 +1647,105 @@ msgstr "%d レコードをインポートしました!"
msgid "%d records imported!"
msgstr "%d レコードをインポートしました。"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "ウィザード"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "文字属性なし。"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
#, fuzzy
msgid "ID"
msgstr "日"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
#, fuzzy
msgid "Creation User"
msgstr "作成ユーザー:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
#, fuzzy
msgid "Creation Date"
msgstr "作成日:"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
#, fuzzy
msgid "Modification User"
msgstr "最終更新日:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
#, fuzzy
msgid "Modification Date"
msgstr "最終更新日:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
#, fuzzy
msgid "Unable to set view tree state"
msgstr "%s ロケールに設定できません"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "名前をつけて保存"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "画像サイズ"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "幅:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "高さ:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG画像 (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "画像サイズが大きすぎます!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
#, fuzzy
msgid "F_ilters"
msgstr "ファイル(_F)"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "検索"
@@ -1757,86 +1777,55 @@ msgstr "ファイルを選択"
msgid "Show plain text"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
#, fuzzy
msgid "Select an Image..."
msgstr "ファイルを選択"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "全てのファイル"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "画像"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "翻訳を追加"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "翻訳を追加する前にレコードを保存して下さい!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "他の利用できる言語はありません"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
#, fuzzy
msgid "Add existing record"
msgstr "レコードの保存"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
#, fuzzy
msgid "Remove selected record <Del>"
msgstr "選択したレコードを削除"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
#, fuzzy
msgid "Open a record <F2>"
msgstr "レコードを開く"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
#, fuzzy
msgid "Search a record <F2>"
msgstr "レコードを検索する"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
#, fuzzy
msgid "Remove selected record"
msgstr "選択したレコードを削除"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
#, fuzzy
msgid "Edit selected record <F2>"
msgstr "選択したレコードを編集"
@@ -1897,33 +1886,26 @@ msgstr ""
msgid "Select a background color"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "名前をつけて保存"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "画像サイズ"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "幅:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "翻訳を追加"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "高さ:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG画像 (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "画像サイズが大きすぎます!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "翻訳を追加する前にレコードを保存して下さい!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "他の利用できる言語はありません"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/lt_LT/LC_MESSAGES/tryton.mo b/share/locale/lt_LT/LC_MESSAGES/tryton.mo
index ae0f525..0c3e6cd 100644
Binary files a/share/locale/lt_LT/LC_MESSAGES/tryton.mo and b/share/locale/lt_LT/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/lt_LT/LC_MESSAGES/tryton.po b/share/locale/lt_LT/LC_MESSAGES/tryton.po
index c00e29f..bc6c7ac 100644
--- a/share/locale/lt_LT/LC_MESSAGES/tryton.po
+++ b/share/locale/lt_LT/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 2.3.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2013-04-18 11:37+0300\n"
"Last-Translator: Giedrius Slavinskas <giedrius at inovera.lt>\n"
"Language-Team: lt_LT <LL at li.org>\n"
@@ -16,46 +16,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr ""
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr ""
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr ""
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr ""
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr ""
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr ""
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr ""
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr ""
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr ""
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr ""
@@ -85,42 +85,42 @@ msgstr "Serveris:"
msgid "Port:"
msgstr "Prievadas:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Pasirinkimas"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Jūsų pasirinkimas:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Įrašyti kaip..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Daugiau nepaisyti šio pranešimo."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "Ar tikrai norite vykdyti?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Patvirtinimas"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Lygiagretaus duomenų rašymo klaida"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -138,50 +138,50 @@ msgstr ""
" - \"Palyginti\", kad peržiūrėti pakeistą versiją;\n"
" - \"Rašyti visvien\", kad išsaugoti jūsų turimą versiją."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Palyginti"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Rašyti visvien"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Klaida"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Pranešti apie klaidą"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Programos klaida!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Klaida: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Klaidų pranešimui reikalinga naudotojo paskyra <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Klaidų pėdsekys"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Naudotojas:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Slaptažodis:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
"Norėdami informuoti apie klaidos tvarkymo eigą, jūsų naudotojo vardas "
"buvo pridėtas prie klaidos pranešimo sąrašo"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Užregistruoti naują klaidą su ID"
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
"Prisijungimo klaida!\n"
"Neteisingas naudotojo vardas arba slaptažodis!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Klaida:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -217,12 +217,12 @@ msgstr ""
"Programa nustos jungtis su šiuos serveriui, kol bus sutvarkytas "
"identifikatorius."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Saugumo pavojus!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -230,31 +230,31 @@ msgstr ""
"Prisijungimo klaida!\n"
"Nepavyko prisijungti prie serverio!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Tinklo klaida!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "Y"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "w"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "h"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -274,58 +274,58 @@ msgstr "Atverti kalendorių <F2>"
msgid "Date Selection"
msgstr "Datos pasirinkimas"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "t"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "taip"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "teisa"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "t"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Tiesa"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Netiesa"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
#, fuzzy
msgid "Edit..."
msgstr "Išei_ti..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Priedai..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Veiksmai..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Susiję įrašai..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Ataskaita..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "El. paštas..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Spausdinti..."
@@ -350,10 +350,10 @@ msgid "_Help"
msgstr "_Žinynas"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Ieškoti"
@@ -522,7 +522,7 @@ msgstr "_Apie..."
msgid "Manage Favorites"
msgstr "_Tvarkyti mėgstamus"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -530,11 +530,11 @@ msgstr ""
"Atliekant šį veiksmą bus uždarytos visos kortelės.\n"
"Ar norite tęsti?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Uždaryti kortelę"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -542,7 +542,7 @@ msgstr ""
"Bus ištrinta Tryton duomenų bazė.\n"
"Ar jūs tikrai norite tęsti?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -550,28 +550,28 @@ msgstr ""
"Neteisingas Tryon serverio slaptažodis\n"
"Bandykite iš naujo."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Neturite teisių!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "Nepavyko sunaikinti duomenų bazės. Klaidos pranešimas:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Nepavyko sunaikinti duomenų bazės!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "Sėkmingai sunaikinta duomenų bazė!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Atverti atsarginę kopiją atkūrimui..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -579,11 +579,11 @@ msgstr ""
"Negalima atkurti duomenų bazės apsaugotos slaptažodžiu.\n"
"Atsarginės kopijos sukūrimą bei atkūrimą atlikite savarankiškai."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "Duomenų bazės slaptažodis yra apsaugotas!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -591,19 +591,19 @@ msgstr ""
"Neteisingas Tryton serverio slaptažodis.\n"
"Bandykite iš naujo."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "Nepavyko sunaikinti duomenų bazės. Klaidos pranešimas:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Nepavyko sunaikinti duomenų bazės!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "Sėkmingai sunaikinta duomenų bazė!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -612,15 +612,15 @@ msgstr ""
"kopijos.\n"
"Atsarginės kopijos sukūrimą bei atkūrimą atlikite savarankiškai."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Nepavyko padaryti duomenų bazės atsarginės kopijos.Klaidos pranešimas:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Nepavyko padaryti duomenų bazės atsarginės kopijos!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "Sėkmingai padaryta duomenų bazės atsarginė kopija!"
@@ -633,7 +633,7 @@ msgid "Create a new record"
msgstr "Sukurti naują įrašą"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Išsaugoti"
@@ -643,7 +643,7 @@ msgstr "Išsaugoti šį įrašą"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Perjungti"
@@ -828,38 +828,15 @@ msgstr "Pakartokite slaptažodį:"
msgid "Type the Admin password again"
msgstr "Pakartotinai įrašykite administratoriaus slaptažodį"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Duomenų bazės pavadinime leidžiami simboliai yra šie: lotyniškos raidės, "
-"skaičiai ir \"_\" (pabraukimas). Venkite nelotyniškų raidžių, tarpų bei "
-"skyrybos ženklų."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Negalima simbolis duomenų bazės pavadinime!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "Naujas administratoriaus slaptažodis nesutampa su pakartotinu.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Slaptažodžiai nesutampa!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Administratoriaus slaptažodis kartu su pakartotinu slaptažodžiu yrabūtini"
-" norint sukurti naują duomenų bazę."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Neįvestas administratoriaus slaptažodis!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -867,15 +844,15 @@ msgstr ""
"Duomenų bazė tokiu pavadinimu jau yra sukurta.\n"
"Pasirinkite kitą pavadinimą."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Duomenų bazė tokiu pavadinimu jau yra sukurta!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Neteisingas Tryton serverio slaptažodis. Bandykite iš naujo."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -888,7 +865,7 @@ msgstr ""
"papildomos informacijos.\n"
"Klaidos pranešimas:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Klaida kuriant duomenų bazę!"
@@ -953,12 +930,12 @@ msgstr "Profilių tvarkymas"
msgid "Profile"
msgstr "Profilis"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Pridėti"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Ištrinti"
@@ -983,7 +960,7 @@ msgstr "Naudotojas:"
msgid "Could not connect to the server"
msgstr "Nepavyko prisijungti prie serverio"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "Nesuderinama serverio versija"
@@ -1110,8 +1087,8 @@ msgstr "Priedas:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Buvęs"
@@ -1121,8 +1098,8 @@ msgstr "Buvęs įrašas"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Kitas"
@@ -1227,23 +1204,23 @@ msgstr "Paskutinio redagavimo data:"
msgid "Model:"
msgstr "Modelis:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Ar tikrai norite ištrinti šį įrašą?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Ar tikrai norite ištrinti šiuos įrašus?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Įrašai nebuvo ištrinti!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Įrašai ištrinti!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Dabar dirbate su įrašo(-ų) kopija(-omis)!"
@@ -1255,11 +1232,11 @@ msgstr "Įrašas išsaugotas!"
msgid "Invalid form!"
msgstr "Netinkama forma!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " iš "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1267,49 +1244,48 @@ msgstr ""
"Šis įrašas buvo pakeistas\n"
"Ar norite jį išsaugoti?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Veiksmai"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Vykdyti veiksmą"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Susijęs"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Atverti susijusius įrašus"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Ataskaitos"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Atverti ataskaitą"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Siuntimas"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Siųsti ataskaitą el. paštu"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Spausdinimas"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Spausdinti ataskaitą"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Nežinomas"
@@ -1492,67 +1468,77 @@ msgstr "Patarimai"
msgid "_Display a new tip next time"
msgstr "_Rodyti patarimus ir kitą kartą"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Eksportuoti CSV formatu"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Išsaugoti eksportavimo šablonai</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Galimi laukai</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Valyti"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Išsaugoti šabloną"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Ištrinti šabloną"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Eksportuojami laukai</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Nustatymai</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Atvėrimas"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Pridėti laukų pavadinimus"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Pavadinimas"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Kokiu pavadinimu išsaugoti šį eksportavimo šabloną?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d įrašas išsaugotas!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d įrašai išsaugoti!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1576,18 +1562,17 @@ msgid "Remove <Del>"
msgstr "Šalinti <Del>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Sukurti naują įrašą <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Pašalinti pasirinktą įrašą <Del>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Atkurti pasirinktą įrašą <Ins>"
@@ -1609,10 +1594,10 @@ msgstr "Importuoti iš failo:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Atverti..."
@@ -1663,73 +1648,103 @@ msgstr "%d įrašas importuotas!"
msgid "%d records imported!"
msgstr "%d įrašai importuoti!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Vedlys"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Be pavadinimo"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
#, fuzzy
msgid "Creation User"
msgstr "Sukūrė naudotojas:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
#, fuzzy
msgid "Creation Date"
msgstr "Sukūrimo data:"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
#, fuzzy
msgid "Modification User"
msgstr "Paskutinio redagavimo data:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
#, fuzzy
msgid "Modification Date"
msgstr "Paskutinio redagavimo data:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
#, fuzzy
msgid "Unable to set view tree state"
msgstr "Nepavyko nustatyti lokalės %s"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Įrašyti kaip"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Paveiklėlio dydis"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Plotis:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Aukštis"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG paveikslėlis (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Paveikslėlis yra per didelis!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "F_iltras"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Rodyti filtrų žymeles"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Šalinti šią žymelę"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Sukurti šio filtro žymelę"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Žymelės pavadinimas:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Rasti"
@@ -1760,79 +1775,49 @@ msgstr "Pasirinkite failą..."
msgid "Show plain text"
msgstr "Rodyti paprastą tekstą"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Pridėti reikšmę"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Šalinti \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Pasirinkite paveikslėlį..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Visi failai"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Paveikslėliai"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Vertimas"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Keisti"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Neaiškus"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Išsaugokite įrašą prieš pridedant vertimą!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Jokia kita kalba nėra prieinama!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Pridėti turimą įrašą"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Pašalinti pasirinktą įrašą <Del>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Atverti įrašą <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Ieškoti įrašo <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Pašalinti pasirinktą įrašą"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Keisti pasirinktą įrašą <F2>"
@@ -1892,33 +1877,25 @@ msgstr "Pasirinkite teksto spalvą"
msgid "Select a background color"
msgstr "Pasirinkite fono spalvą"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Įrašyti kaip"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Paveiklėlio dydis"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Plotis:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Vertimas"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Aukštis"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Keisti"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG paveikslėlis (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Neaiškus"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Paveikslėlis yra per didelis!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Išsaugokite įrašą prieš pridedant vertimą!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Jokia kita kalba nėra prieinama!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/nl_NL/LC_MESSAGES/tryton.mo b/share/locale/nl_NL/LC_MESSAGES/tryton.mo
index edd81bc..a8d6b3b 100644
Binary files a/share/locale/nl_NL/LC_MESSAGES/tryton.mo and b/share/locale/nl_NL/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/nl_NL/LC_MESSAGES/tryton.po b/share/locale/nl_NL/LC_MESSAGES/tryton.po
index e726389..e4c5d0a 100644
--- a/share/locale/nl_NL/LC_MESSAGES/tryton.po
+++ b/share/locale/nl_NL/LC_MESSAGES/tryton.po
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Tryton 1.8\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2012-04-23 11:07+0200\n"
"Last-Translator: Bram van der Sar <avdsar at telfort.nl>\n"
"Language-Team: \n"
@@ -11,46 +11,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "specificeer een vervangend configuratiebestand"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr ""
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "logboek bijhouden op INFO niveau"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr ""
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "specificeer de inlog gebruiker"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr " Stel de serverpoort in"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "Stel de servernaam in"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr ""
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "Bestand \"%s\" niet gevonden"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "Kan configuratiebestand %s niet opslaan! "
@@ -80,42 +80,42 @@ msgstr "Server:"
msgid "Port:"
msgstr "Poort:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Selectie"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Uw selectie:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Opslaan als..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Altijd deze waarschuwing negeren."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr ""
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Bevestiging"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Simultaan gebruik"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
#, fuzzy
msgid ""
"<b>Write Concurrency Warning:</b>\n"
@@ -134,50 +134,50 @@ msgstr ""
" - \"Vergelijk\" om de verschillen te vergelijken;\n"
" - \"Toch opslaan\" om deze versie op te slaan. "
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Vergelijk"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Overschrijven"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Fout"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Programmafout melden"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Programmafout"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Fout: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, fuzzy, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Om programmafouten aan te melden moet je een account hebben bij <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Foutrapportage"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Gebruiker:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Wachtwoord:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -186,11 +186,11 @@ msgstr ""
"Om je op de hoogte te houden is je gebuikersnaam toegevoegd aan de lijst "
"van belangstellenden"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Nieuwe foutmelding gemaakt met ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -198,11 +198,11 @@ msgstr ""
"Geen verbinding!\n"
"Verkeerde gebruikersnaam of wachtwoord!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Uitzondering:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -213,12 +213,12 @@ msgstr ""
"Het programma maakt geen verbinding meer met de server totdat de "
"identificatiecode is hersteld."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Beveiligingsrisico!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -226,31 +226,31 @@ msgstr ""
"Verbinding mislukt!\n"
"Verbinden met de server niet mogelijk!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Netwerkfout."
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr " J"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "w"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr " d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "u"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -271,65 +271,65 @@ msgstr "Open de kalender"
msgid "Date Selection"
msgstr "Datum selecteren"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
#, fuzzy
msgid "yes"
msgstr "bytes"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
#, fuzzy
msgid "true"
msgstr "Waar"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Waar"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Niet waar"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
#, fuzzy
msgid "Edit..."
msgstr "Afsluiten"
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
#, fuzzy
msgid "Attachments..."
msgstr "Bijlage:"
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
#, fuzzy
msgid "Actions..."
msgstr "_Acties.."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
#, fuzzy
msgid "Relate..."
msgstr "Verwijderen... "
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
#, fuzzy
msgid "Report..."
msgstr "_Importeer gegevens... "
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
#, fuzzy
msgid "E-Mail..."
msgstr "E-mail"
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
#, fuzzy
msgid "Print..."
msgstr "Afdrukken"
@@ -355,10 +355,10 @@ msgid "_Help"
msgstr "_Help"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Zoeken"
@@ -528,17 +528,17 @@ msgstr "I_nfo..."
msgid "Manage Favorites"
msgstr ""
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
msgstr ""
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Tabblad sluiten"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -546,7 +546,7 @@ msgstr ""
"U gaat een Tryton database verwijderen.\n"
"Weet u zeker dat u door wil gaan?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -554,28 +554,28 @@ msgstr ""
"Verkeerde wachtwoord voor de Tryton server\n"
"Probeer het opnieuw."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Geen toegang!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "Verwijderen database is mislukt met foutmelding:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Database kan niet worden verwijderd."
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "Database succesvol verwijderd!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Open reservekopie om te herstellen..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -583,11 +583,11 @@ msgstr ""
"Een met een wachtwoord beveiligde database kan niet terug gezet worden.\n"
"Voer deze handeling handmatig uit."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "Database beveiligd met een wachtwoord!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -595,19 +595,19 @@ msgstr ""
"Verkeerde wachtwoord voor de Tryton server\n"
"Probeer het opnieuw."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "Herstellen database is mislukt met foutmelding:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Database terugzetten mislukt!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "Database succesvol teruggezet!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -615,15 +615,15 @@ msgstr ""
"Een met een wachtwoord beveiligde database kan niet verwijderd worden.\n"
"Voer deze handeling handmatig uit."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Verwijderen database is mislukt met foutmelding:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Database verwijderen mislukt!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "Reservekopie van database gemaakt!"
@@ -636,7 +636,7 @@ msgid "Create a new record"
msgstr "Maak een nieuw item"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Opslaan"
@@ -646,7 +646,7 @@ msgstr "Bewaar dit item"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Omschakelen"
@@ -832,38 +832,15 @@ msgstr "Bevestig admin wachtwoord:"
msgid "Type the Admin password again"
msgstr "Admin wachtwoord opnieuw invoeren"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"De naam van de database is beperkt tot alfa-numerieke karakters en \"_\" "
-"(underscore). Vermijd alle accenten, spaties en andere bijzondere "
-"karakters."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Ongeldige tekens in database naam!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "Het nieuwe wachtwoord voor admin komt niet overeen met de bevestiging.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Wachtwoorden komen niet overeen!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Admin wachtwoord en bevestiging zijn nodig om een nieuwe database te "
-"maken."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Wachtwoord admin ontbreekt!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -871,15 +848,15 @@ msgstr ""
"Een database met deze naam bestaat al.\n"
"Probeer een andere database naam. "
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Deze database bestaat al!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Sorry, verkeerde wachtwoord voor de Tryton server. Probeer het opnieuw. "
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -892,7 +869,7 @@ msgstr ""
"informatie.\n"
"Foutmelding:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Database maken mislukt!"
@@ -959,12 +936,12 @@ msgstr ""
msgid "Profile"
msgstr ""
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Toevoegen"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Verwijderen"
@@ -994,7 +971,7 @@ msgstr "Gebruikersnaam:"
msgid "Could not connect to the server"
msgstr "Geen verbinding met de server!"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
#, fuzzy
msgid "Incompatible version of the server"
msgstr "Deze versie is onverenigbaar met de server! "
@@ -1122,8 +1099,8 @@ msgstr "Bijlage:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Vorige"
@@ -1133,8 +1110,8 @@ msgstr "Vorige item"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Volgende"
@@ -1244,23 +1221,23 @@ msgstr "Laatste wijzigingsdatum:"
msgid "Model:"
msgstr "Model:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Weet je zeker dat je dit item wilt verwijderen?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Weet je zeker dat je deze items wilt verwijderen?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Items niet verwijderd!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Items verwijderd!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Je werkt nu met het gekopieerde item!"
@@ -1272,11 +1249,11 @@ msgstr "Item opgeslagen!"
msgid "Invalid form!"
msgstr "Ongeldige invoer in formulier!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " van "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1284,54 +1261,53 @@ msgstr ""
"Item is aangepast.\n"
"Wil je de wijzigingen opslaan?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Actie"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr ""
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
#, fuzzy
msgid "Relate"
msgstr "Aan_maken"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
#, fuzzy
msgid "Open related records"
msgstr "Item openen"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
#, fuzzy
msgid "Report"
msgstr "Rapporten"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
#, fuzzy
msgid "Open report"
msgstr "Item openen"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
#, fuzzy
msgid "E-Mail"
msgstr "E-mail"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr ""
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Afdrukken"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr ""
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Onbekend"
@@ -1516,67 +1492,77 @@ msgstr "Tips"
msgid "_Display a new tip next time"
msgstr "Volgende keer een tip"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Exporteer naar CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Voorgedefinieerde exportinstellingen</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Alle velden</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Wissen"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Exportgegevens opslaan"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Exportgegevens verwijderen"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Velden om te exporteren</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Opties</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Open"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Voeg veldnamen toe"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Naam"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Wat is de naam voor deze export?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d item opgeslagen!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d items opgeslagen!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1600,20 +1586,19 @@ msgid "Remove <Del>"
msgstr ""
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
#, fuzzy
msgid "Create a new record <F3>"
msgstr "Maak een nieuw item"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
#, fuzzy
msgid "Delete selected record <Del>"
msgstr "Geselecteerd item verwijderen"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
#, fuzzy
msgid "Undelete selected record <Ins>"
msgstr "Geselecteerd item verwijderen"
@@ -1636,10 +1621,10 @@ msgstr "Bestand om te importeren:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Openen..."
@@ -1691,75 +1676,105 @@ msgstr "%d item geïmporteerd!"
msgid "%d records imported!"
msgstr "%d items geïmporteerd!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Assistent"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Lege opdracht"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
#, fuzzy
msgid "ID"
msgstr " d"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
#, fuzzy
msgid "Creation User"
msgstr "Aangemaakt door:"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
#, fuzzy
msgid "Creation Date"
msgstr "Aanmaakdatum"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
#, fuzzy
msgid "Modification User"
msgstr "Laatste wijzigingsdatum:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
#, fuzzy
msgid "Modification Date"
msgstr "Laatste wijzigingsdatum:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
#, fuzzy
msgid "Unable to set view tree state"
msgstr "Kan omgeving %s niet instellen"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Opslaan als"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Afbeeldingsgrootte"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Breedte:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Hoogte:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG afbeelding (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Afbeelding te groot!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
#, fuzzy
msgid "F_ilters"
msgstr "_Bestand"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Vind"
@@ -1791,86 +1806,55 @@ msgstr "Kies een bestand"
msgid "Show plain text"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
#, fuzzy
msgid "Select an Image..."
msgstr "Kies een bestand"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Alle bestanden"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Afbeeldingen"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-#, fuzzy
-msgid "Translation"
-msgstr "Voeg vertaling toe"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Gegevens eerst opslaan voordat u een vertaling toevoegt! "
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Geen andere taal beschikbaar!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
#, fuzzy
msgid "Add existing record"
msgstr "Bewaar dit item"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
#, fuzzy
msgid "Remove selected record <Del>"
msgstr "Geselecteerd item verwijderen"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
#, fuzzy
msgid "Open a record <F2>"
msgstr "Item openen"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
#, fuzzy
msgid "Search a record <F2>"
msgstr "Item zoeken"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
#, fuzzy
msgid "Remove selected record"
msgstr "Geselecteerd item verwijderen"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
#, fuzzy
msgid "Edit selected record <F2>"
msgstr "Geselecteerd item aanpassen"
@@ -1931,33 +1915,26 @@ msgstr ""
msgid "Select a background color"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Opslaan als"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Afbeeldingsgrootte"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Breedte:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+#, fuzzy
+msgid "Translation"
+msgstr "Voeg vertaling toe"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Hoogte:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG afbeelding (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Afbeelding te groot!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Gegevens eerst opslaan voordat u een vertaling toevoegt! "
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ":"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Geen andere taal beschikbaar!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/ru_RU/LC_MESSAGES/tryton.mo b/share/locale/ru_RU/LC_MESSAGES/tryton.mo
index 528c04b..be768b8 100644
Binary files a/share/locale/ru_RU/LC_MESSAGES/tryton.mo and b/share/locale/ru_RU/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/ru_RU/LC_MESSAGES/tryton.po b/share/locale/ru_RU/LC_MESSAGES/tryton.po
index 42f18b1..59df63b 100644
--- a/share/locale/ru_RU/LC_MESSAGES/tryton.po
+++ b/share/locale/ru_RU/LC_MESSAGES/tryton.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 1.3.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: 2013-04-12 23:16+0500\n"
"Last-Translator: Ilya Melnikov <rayanayar at mail.ru>\n"
"Language-Team: ru_RU <k-dmitry2 at narod.ru>\n"
@@ -16,46 +16,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "указать альтернативный конфигурационный файл"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "режим разработки"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "все сообщения на уровне INFO"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "указать уровень вывода сообщений: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "указать имя пользователя"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "укажите порт сервера"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "укажите имя сервера"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Слишком много аргументов"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "Файл \"%s\" не найден"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "Невозможно записать файл конфигурации %s!"
@@ -85,42 +85,42 @@ msgstr "Сервер:"
msgid "Port:"
msgstr "Порт:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Выбор"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Ваш выбор:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Сохранить как..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Всегда игнорировать это предупреждение."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "Вы хотите продолжить?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Подтвердите"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Прерывание конкурентных записей"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -138,50 +138,50 @@ msgstr ""
"- \" Сравнить \", чтобы увидеть модифицированный вариант;\n"
"- \" Переписать \", чтобы сохранить вашу текущую версию."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Сравнить"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Записать все равно"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Ошибка"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Сообщить об ошибке"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Ошибка приложения!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Ошибка: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Вы можете отправить отчет об ошибке если вы зарегистрированны на <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Система сбора ошибок"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Пользователь:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Пароль:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
"Чтобы держать вас в курсе ваше имя пользователя будет добавлен в список "
"перечень по этому вопросу"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Создан новый отчет об ошибке с идентификатором"
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
"Ошибка соединения!\n"
"Неверное имя пользователя или пароль!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Исключительная ситуация:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -216,12 +216,12 @@ msgstr ""
"Подключение к серверу приостановлено до тех пор пока сертификат не будет "
"исправлен."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Угроза безопасности!"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -229,31 +229,31 @@ msgstr ""
"Ошибка соединения!\n"
"Невозможно соединиться с сервером!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Сетевая ошибка!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "Г"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "М"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "н"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "д"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "ч"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "м"
@@ -273,58 +273,58 @@ msgstr "Открыть календарь <F2>"
msgid "Date Selection"
msgstr "Выбор даты"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "да"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "истинный"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Истинный"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Ложный"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
#, fuzzy
msgid "Edit..."
msgstr "_Выход..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Вложения..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "Действия..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "Связанные..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Отчет..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "Эл.почта..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "Печать..."
@@ -349,10 +349,10 @@ msgid "_Help"
msgstr "Помощь"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Поиск"
@@ -521,7 +521,7 @@ msgstr "О программе"
msgid "Manage Favorites"
msgstr "Управление закладками"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -529,11 +529,11 @@ msgstr ""
"Данное действие приведет к закрытию всех вкладок.\n"
"Продолжить?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Закрыть вкладку"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -541,7 +541,7 @@ msgstr ""
"Вы собираетесь удалить базу данных.\n"
"Вы действительно уверены, продолжить?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -549,28 +549,28 @@ msgstr ""
"Неверный административный пароль сервера Tryton\n"
"Пожалуйста, попробуйте снова"
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Доступ запрещен!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "Удаление базы данных завершено с сообщением об ошибке:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Не удалось удалить базу данных!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "База успешно удалена!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Открыть файл для восстановления..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -578,11 +578,11 @@ msgstr ""
"Не возможно восстановить на защищенной паролем базе данных.\n"
"Резервное копирование и восстановление необходимо выполнить вручную."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "База данных защищена паролем!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -590,19 +590,19 @@ msgstr ""
"Неверный административный пароль сервера Tryton\n"
"Пожалуйста, попробуйте снова"
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "Восстановление базы данных с сообщением об ошибке:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Базу данных восстановить не удалось!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "База данных восстановлена полностью!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -610,15 +610,15 @@ msgstr ""
"Не возможно сделать снимок на защищенной паролем базе данных. \n"
"Резервное копирование и восстановление необходимо выполнить вручную."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Резервное копирование базы данных завершилось с сообщением об ошибке:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Не удалось выполнить резервное копирование базы данных!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "База данных сохранена успешно!"
@@ -631,7 +631,7 @@ msgid "Create a new record"
msgstr "Создать новую запись"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Сохранить"
@@ -641,7 +641,7 @@ msgstr "Сохранить эту запись"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Переключить"
@@ -825,36 +825,15 @@ msgstr "Подтвердите пароль администратора:"
msgid "Type the Admin password again"
msgstr "Введите административный пароль повторно"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Имя базы данных ограничивается символами, цифрами и \" _ \" "
-"(Подчеркивание). Недопустимо использование пробелов и других специальных "
-"символов."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Недопустимые символы в имени базы данных!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "Новый пароль не совпадает с полем подтверждения.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Пароли не совпадают!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr "Пароль администратора необходим для создания новой базы данных."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Отсутствует административный пароль!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -862,15 +841,15 @@ msgstr ""
"База данных с таким же названием уже существует.\n"
"Попробуйте другое имя базы данных."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "Такая база данных уже существует!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Извините, неверный пароль для сервера. Попробуйте еще раз."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -882,7 +861,7 @@ msgstr ""
"данных! Дополнительная информация может быть в сообщении об ошибке.\n"
"Сообщение об ошибке:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Ошибка создания базы данных!"
@@ -947,12 +926,12 @@ msgstr "Редактор профилей"
msgid "Profile"
msgstr "Профиль"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Добавить"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Удалить"
@@ -977,7 +956,7 @@ msgstr "Имя пользователя:"
msgid "Could not connect to the server"
msgstr "Не удается подключиться к серверу!"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "Несовместимая версия сервера"
@@ -1103,8 +1082,8 @@ msgstr "Вложение:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Предыдущий"
@@ -1114,8 +1093,8 @@ msgstr "Предыдущая запись"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Следующий"
@@ -1220,23 +1199,23 @@ msgstr "Дата изменения:"
msgid "Model:"
msgstr "Модель:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Вы уверены что хотите удалить эту запись?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Вы уверены что хотите удалить эти записи?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Записи не удалены!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Записи удалены!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Сейчас работает на дублирующихся записях!"
@@ -1248,11 +1227,11 @@ msgstr "Запись сохранена!"
msgid "Invalid form!"
msgstr "Недопустимая форма!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr "из"
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1260,49 +1239,48 @@ msgstr ""
"Эта запись была изменена\n"
"Вы хотите её сохранить?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Действие"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Выполнить действие"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Связанные"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Открыть связанные записи"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Отчет"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Открыть отчет"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Эл.почта"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Отправить отчет по Эл.почте"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Печать"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Печать отчета"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Неизвестно"
@@ -1482,67 +1460,77 @@ msgstr "Советы"
msgid "_Display a new tip next time"
msgstr "Показывать новый совет при следующем запуске"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Экспорт в CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Предопределенные экспорты</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Все поля</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Очистить"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Сохранить настройку экспорта"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Удалить настройку экспорта"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Поля для экспорта</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Опции</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Открыть"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Добавить имя поля"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Имя"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Укажите имя для экспорта."
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d запись сохранена!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d записей сохранено!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1566,18 +1554,17 @@ msgid "Remove <Del>"
msgstr "Удалить <Del>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Создать новую запись <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Удалить выбраную запись <Del>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Восстановить выбраную запись <Ins>"
@@ -1599,10 +1586,10 @@ msgstr "Файл для импорта:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Открыть..."
@@ -1653,73 +1640,103 @@ msgstr "%d запись импортирована!"
msgid "%d records imported!"
msgstr "%d записей импортировано!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Мастер"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Нет строковых атрибутов"
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
#, fuzzy
msgid "Creation User"
msgstr "Создано пользователем"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
#, fuzzy
msgid "Creation Date"
msgstr "Дата создания"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
#, fuzzy
msgid "Modification User"
msgstr "Дата изменения:"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
#, fuzzy
msgid "Modification Date"
msgstr "Дата изменения:"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
#, fuzzy
msgid "Unable to set view tree state"
msgstr "Не удается установить локализацию %s"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Размер изображения"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Ширина:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Ввысота:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG изображение (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Размер изображения слишком большой!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "Фильтры"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Показать сохраненные фильтры"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Удалить эту закладку"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Запомнить этот фильтр"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Имя закладки:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Найти"
@@ -1750,79 +1767,49 @@ msgstr "Выбрать файл..."
msgid "Show plain text"
msgstr "Показать в виде текста"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Добавить значение"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Удалить \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Выбрать изображение..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Все фалы"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Изображения"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Перевод"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Редактировать"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Неточный"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Необходимо сохранить запись перед добавлением перевода!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Отсутствуют другие доступные языки!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Добавить существующую запись"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Удалить выбраную запись <Del>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Открыть запись <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Поиск записи <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Удалить выбраную запись"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Изменить выбранную запись <F2>"
@@ -1882,33 +1869,25 @@ msgstr "Выбрать цвет"
msgid "Select a background color"
msgstr "Выбрать цвет фона"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Сохранить как"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Размер изображения"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Ширина:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Перевод"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Ввысота:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Редактировать"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG изображение (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Неточный"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Размер изображения слишком большой!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Необходимо сохранить запись перед добавлением перевода!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Отсутствуют другие доступные языки!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/sl_SI/LC_MESSAGES/tryton.mo b/share/locale/sl_SI/LC_MESSAGES/tryton.mo
index 06bef10..8016491 100644
Binary files a/share/locale/sl_SI/LC_MESSAGES/tryton.mo and b/share/locale/sl_SI/LC_MESSAGES/tryton.mo differ
diff --git a/share/locale/sl_SI/LC_MESSAGES/tryton.po b/share/locale/sl_SI/LC_MESSAGES/tryton.po
index 29fa4e8..5c6addb 100644
--- a/share/locale/sl_SI/LC_MESSAGES/tryton.po
+++ b/share/locale/sl_SI/LC_MESSAGES/tryton.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: tryton 3.0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
-"PO-Revision-Date: 2014-03-22 17:10+0100\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
+"PO-Revision-Date: 2014-10-15 11:36+0200\n"
"Last-Translator: Venceslav Vezjak <vezjakv at gmail.com>\n"
"Language-Team: sl_SI <LL at li.org>\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 "
@@ -16,46 +16,46 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr "določi alterntivno konfiguracijsko datoteko"
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr "Razvijalski način"
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr "beleženje vsega na INFO ravni"
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr "določi nivo beleženja: DEBUG, INFO, WARNING, ERROR, CRITICAL"
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr "določi uporabniško ime"
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr "določi strežniška vrata"
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr "določi strežniškega gostitelja"
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr "Preveč argumentov"
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr "Datoteke \"%s\" ni moč najti"
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr "Ni možno zapisati konfiguracijske datoteke %s!"
@@ -85,42 +85,42 @@ msgstr "Strežnik:"
msgid "Port:"
msgstr "Vrata:"
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr "Izbira"
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr "Vaša izbira:"
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr "Shrani kot..."
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr "Vedno prezri to opozorilo."
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr "Ali želite nadaljevati?"
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr "Potrditev"
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr "Izjema sočasnega izvajanja"
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -138,50 +138,50 @@ msgstr ""
" - \"Primerjaj\" za vpogled v spremenjeno inačico;\n"
" - \"Vseeno zapiši\" za shranitev vaše trenutne inačice."
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr "Primerjaj"
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr "Vseeno zapiši"
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr "Napaka"
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr "Prijava programske napake"
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr "Napaka programa!"
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr "Napaka: "
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr "Za prijavo programskih napak morate imeti odprt račun pri <u>%s</u>"
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr "Sledilnik programskih napak"
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr "Uporabnik:"
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr "Geslo:"
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
@@ -190,11 +190,11 @@ msgstr ""
"Zaradi obveščanja je vaše uporabniško ime dodano na seznam te programske "
"napake"
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr "Evidentirana je nova programska napaka z ID "
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
@@ -202,11 +202,11 @@ msgstr ""
"Napaka pri povezavovanju!\n"
"Napačno uporabniško ime ali geslo!"
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr "Izjema:"
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
@@ -216,12 +216,12 @@ msgstr ""
"Program bo ustavil povezovanje na ta strežnik, dokler ne bo njegov prstni"
" odtis popravljen."
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr "Varnostno tveganje"
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
@@ -229,31 +229,31 @@ msgstr ""
"Napaka pri povezovanju!\n"
"Ni se možno povezati na strežnik!"
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr "Napaka mreže!"
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr "l"
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr "M"
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr "t"
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr "d"
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr "u"
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr "m"
@@ -273,57 +273,57 @@ msgstr "Odpri koledar <F2>"
msgid "Date Selection"
msgstr "Izbira datuma"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr "d"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr "da"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr "da"
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr "t"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr "Da"
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr "Ne"
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr "Uredi ..."
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr "Priponke..."
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr "_Ukrepi..."
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr "_Veze..."
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr "Poročila..."
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr "_Elektronska pošta..."
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr "_Izpis..."
@@ -348,10 +348,10 @@ msgid "_Help"
msgstr "_Pomoč"
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr "Išči"
@@ -519,7 +519,7 @@ msgstr "_Vizitka..."
msgid "Manage Favorites"
msgstr "_Upravljaj zaznamke"
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
@@ -527,11 +527,11 @@ msgstr ""
"Za naslednji ukrep morajo biti vsi zavihki zaprti.\n"
"Ali želite nadaljevati?"
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr "Zapri zavihek"
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
@@ -539,7 +539,7 @@ msgstr ""
"Nameravate izbrisati Tryton podatkovno bazo.\n"
"Ali ste res želite nadaljevati?"
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
@@ -547,28 +547,28 @@ msgstr ""
"Napačno geslo za Tryton strežnik.\n"
"Prosimo, poskusite še enkrat."
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr "Dostop zavrnjen!"
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr "Brisanje podatkovne baze je odpovedalo z napako:\n"
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr "Brisanje podatkovne baze je odpovedalo!"
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr "Brisanje podatkovne baze uspešno zaključeno!"
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr "Odpri varnostno kopijo za obnovitev..."
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
@@ -576,11 +576,11 @@ msgstr ""
"Ni možno obnoviti podatkovne baze, ki so zaščitene z geslom.\n"
"Varnostno kopiranje in obnovitev se mora ročno izvesti."
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr "Podatkovna baza je zaščitena z geslom!"
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
@@ -588,19 +588,19 @@ msgstr ""
"Napačno geslo za Tryton strežnik.\n"
"Prosimo, poskusite še enkrat."
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr "Obnovitev podatkovne baze je odpovedala z napako:\n"
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr "Obnovitev podatkovne baze je odpovedala!"
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr "Obnovitev podatkovne baze uspešno zaključena!"
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
@@ -608,15 +608,15 @@ msgstr ""
"Ni možno zapisati podatkovne baze, ki je zaščitena z geslom.\n"
"Varnostno kopiranje in obnovitev se mora ročno izvesti."
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr "Zapisovanje podatkovne baze je odpovedalo z napako:\n"
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr "Zapisovanje podatkovne baze odpovedalo!"
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr "Varnostno kopiranje podatkovne baze uspešno zaključeno!"
@@ -629,7 +629,7 @@ msgid "Create a new record"
msgstr "Ustvari nov zapis"
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr "Shrani"
@@ -639,7 +639,7 @@ msgstr "Shrani ta zapis"
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr "Preklopi"
@@ -821,38 +821,15 @@ msgstr "Potrdi skrbniško geslo:"
msgid "Type the Admin password again"
msgstr "Ponovno vtipkaj skrbniško geslo"
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-"Ime podatkovne baze je omejeno na alfanumerične znake in \"_\" "
-"(podčrtaj). Izogibaj se vsem znakom za naglaševanje, presledku ali drugim"
-" posebnim znakom."
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr "Nedovoljeni znaki v imenu podatkovne baze!"
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr "Novo skrbniško geslo se ne ujema s tistim v potrditvenem polju.\n"
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr "Gesli se ne ujemata!"
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-"Skrbniško geslo in potrditev gesla sta potrebna za izdelavo podatkovne "
-"baze."
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr "Manjka skrbniško geslo!"
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
@@ -860,15 +837,15 @@ msgstr ""
"Podatkovna baza s tem imenom že obstaja.\n"
"Poskusi z drugim imenom."
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr "To ime podatkovne baze že obstaja!"
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr "Žal napačno geslo za Tryton strežnik. Prosim, poskusi znova."
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -880,7 +857,7 @@ msgstr ""
"zbrišete! Prosimo, preveri sporočilo napake za dodatne informacije.\n"
"Sporočilo napake:\n"
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr "Napaka pri izdelavi podatkovne baze!"
@@ -945,12 +922,12 @@ msgstr "Urejevalnik profilov"
msgid "Profile"
msgstr "Profil"
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr "_Dodaj"
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr "_Odstrani"
@@ -975,7 +952,7 @@ msgstr "Uporabniško ime:"
msgid "Could not connect to the server"
msgstr "Ni se možno povezati s strežnikom"
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr "Nezdružljiva inačica strežnika"
@@ -1102,8 +1079,8 @@ msgstr "Priponka:"
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr "Prejšnji"
@@ -1113,8 +1090,8 @@ msgstr "Prejšnji zapis"
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr "Naslednji"
@@ -1219,23 +1196,23 @@ msgstr "Nazadnje popravljeno:"
msgid "Model:"
msgstr "Model:"
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr "Ali res želiš izbrisati ta zapis?"
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr "Ali res želiš izbrisati te zapise?"
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr "Zapisi niso izbrisani!"
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr "Zapisi izbrisani!"
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr "Sedaj se dela na podvojenih zapisih!"
@@ -1247,11 +1224,11 @@ msgstr "Zapis shranjen!"
msgid "Invalid form!"
msgstr "Neveljaven obrazec!"
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr " od "
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
@@ -1259,49 +1236,48 @@ msgstr ""
"Ta zapis je bil spremenjen,\n"
"ga želiš shraniti?"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr "Ukrep"
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr "Zaženi ukrep"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr "Veza"
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr "Odpri vezo"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr "Poročila"
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr "Odpri poročilo"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr "Pošlji"
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr "Pošlji poročilo"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr "Tisk"
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr "Izpis poročila"
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr "Neznano"
@@ -1476,67 +1452,77 @@ msgstr "Namigi"
msgid "_Display a new tip next time"
msgstr "Naslednjič _prikaži nov namig"
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr "Izvozi v CSV"
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr "<b>Predefinirani izvozi</b>"
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr "<b>Vsa polja</b>"
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr "Počisti"
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr "Shrani izvoz"
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr "Izbriši izvoz"
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr "<b>Polja za izvoz</b>"
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr "<b>Možnosti</b>"
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr "Odpri"
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr "Dodaj imena _polj"
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr "Naziv"
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr "%s (niz)"
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr "Kako se imenuje ta izvoz?"
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr "Prepišem definicijo izvoza '%s'?"
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr "%d zapis shranjen!"
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr "%d zapisov shranjenih!"
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1560,18 +1546,17 @@ msgid "Remove <Del>"
msgstr "Odstrani <Del>"
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr "Ustvari nov zapis <F3>"
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr "Zbriši izbran zapis <Del>"
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr "Povrni izbran zapis <Ins>"
@@ -1593,10 +1578,10 @@ msgstr "Datoteka za uvoz:"
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr "Odpri..."
@@ -1647,68 +1632,98 @@ msgstr "%d zapis uvožen!"
msgid "%d records imported!"
msgstr "%d zapisov uvoženih!"
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr "Čarovnik"
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr "Ni atributov."
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr "ID"
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr "Ustvaril"
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr "Ustvarjeno"
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr "Popravil"
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr "Popravljeno"
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr "Stanja obrazca ni možno dobiti"
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr "Ni možno nastaviti stanja obrazca"
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ":"
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr "Shrani kot"
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr "Velikost slike"
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr "Širina:"
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr "Velikost:"
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr "PNG slika (*.png)"
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr "Slika je prevelika!"
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ".."
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr "_Filtri"
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr "Prikaži zaznamke filtrov"
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr "Odstrani ta zaznamek"
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr "Shrani ta filter"
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr "Ime zaznamka:"
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr "Najdi"
@@ -1736,79 +1751,49 @@ msgstr "Izberi datoteko..."
msgid "Show plain text"
msgstr "Prikaži navadno besedilo"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr "Dodaj vrednost"
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ":"
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr "Odstrani \"%s\""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr "Izberi sliko..."
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr "Vse datoteke"
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr "Slike"
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr "Prevod"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr "Uredi"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr "Nejasno"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr "Pred dodajanjem prevodov morate zapis shraniti!"
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr "Drugih jezikov ni na voljo!"
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr "Dodaj obstoječi zapis"
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr "Odstrani izbran zapis <Del>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr "Odpri zapis <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr "Poišči zapis <F2>"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr "Odstrani izbran zapis"
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr "Uredi izbran zapis <F2>"
@@ -1868,33 +1853,25 @@ msgstr "Izberi barvo besedila"
msgid "Select a background color"
msgstr "Izberi barvo ozadja"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr "Shrani kot"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr "Velikost slike"
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
-msgstr "Širina:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
+msgstr "Prevod"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
-msgstr "Velikost:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
+msgstr "Uredi"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
-msgstr "PNG slika (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
+msgstr "Nejasno"
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
-msgstr "Slika je prevelika!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
+msgstr "Pred dodajanjem prevodov morate zapis shraniti!"
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
-msgstr ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
+msgstr "Drugih jezikov ni na voljo!"
#: tryton/plugins/translation/__init__.py:18
msgid "Translate view"
diff --git a/share/locale/tryton.pot b/share/locale/tryton.pot
index f479a6b..266ef12 100644
--- a/share/locale/tryton.pot
+++ b/share/locale/tryton.pot
@@ -6,55 +6,55 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: tryton 3.1.dev0\n"
+"Project-Id-Version: tryton 3.3.dev0\n"
"Report-Msgid-Bugs-To: issue_tracker at tryton.org\n"
-"POT-Creation-Date: 2014-04-18 22:49+0200\n"
+"POT-Creation-Date: 2014-10-19 12:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
"Language-Team: LANGUAGE <LL at li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Generated-By: Babel 0.9.6\n"
+"Generated-By: Babel 1.3\n"
-#: tryton/config.py:83
+#: tryton/config.py:84
msgid "specify alternate config file"
msgstr ""
-#: tryton/config.py:86
+#: tryton/config.py:87
msgid "development mode"
msgstr ""
-#: tryton/config.py:89
+#: tryton/config.py:90
msgid "logging everything at INFO level"
msgstr ""
-#: tryton/config.py:91
+#: tryton/config.py:92
msgid "specify the log level: DEBUG, INFO, WARNING, ERROR, CRITICAL"
msgstr ""
-#: tryton/config.py:94
+#: tryton/config.py:95
msgid "specify the login user"
msgstr ""
-#: tryton/config.py:96
+#: tryton/config.py:97
msgid "specify the server port"
msgstr ""
-#: tryton/config.py:98
+#: tryton/config.py:99
msgid "specify the server hostname"
msgstr ""
-#: tryton/config.py:102
+#: tryton/config.py:103
msgid "Too much arguments"
msgstr ""
-#: tryton/config.py:105
+#: tryton/config.py:106
#, python-format
msgid "File \"%s\" not found"
msgstr ""
-#: tryton/config.py:143
+#: tryton/config.py:144
#, python-format
msgid "Unable to write config file %s!"
msgstr ""
@@ -84,42 +84,42 @@ msgstr ""
msgid "Port:"
msgstr ""
-#: tryton/common/common.py:383
+#: tryton/common/common.py:381
msgid "Selection"
msgstr ""
-#: tryton/common/common.py:392
+#: tryton/common/common.py:390
msgid "Your selection:"
msgstr ""
-#: tryton/common/common.py:528 tryton/gui/main.py:1420
-#: tryton/gui/window/win_export.py:409
+#: tryton/common/common.py:526 tryton/gui/main.py:1422
+#: tryton/gui/window/win_export.py:459
+#: tryton/gui/window/view_form/view/graph.py:178
#: tryton/gui/window/view_form/view/form_gtk/binary.py:69
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:150
-#: tryton/gui/window/view_form/view/form_gtk/image.py:74
-#: tryton/gui/window/view_form/view/form_gtk/image.py:161
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:105
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:686
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:144
+#: tryton/gui/window/view_form/view/form_gtk/image.py:71
+#: tryton/gui/window/view_form/view/form_gtk/image.py:155
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:498
msgid "Save As..."
msgstr ""
-#: tryton/common/common.py:675
+#: tryton/common/common.py:673
msgid "Always ignore this warning."
msgstr ""
-#: tryton/common/common.py:680
+#: tryton/common/common.py:678
msgid "Do you want to proceed?"
msgstr ""
-#: tryton/common/common.py:699
+#: tryton/common/common.py:697
msgid "Confirmation"
msgstr ""
-#: tryton/common/common.py:805 tryton/common/common.py:1114
+#: tryton/common/common.py:803 tryton/common/common.py:1111
msgid "Concurrency Exception"
msgstr ""
-#: tryton/common/common.py:819
+#: tryton/common/common.py:817
msgid ""
"<b>Write Concurrency Warning:</b>\n"
"\n"
@@ -130,112 +130,112 @@ msgid ""
" - \"Write Anyway\" to save your current version."
msgstr ""
-#: tryton/common/common.py:828
+#: tryton/common/common.py:826
msgid "Compare"
msgstr ""
-#: tryton/common/common.py:833
+#: tryton/common/common.py:831
msgid "Write Anyway"
msgstr ""
-#: tryton/common/common.py:859 tryton/gui/window/win_export.py:442
+#: tryton/common/common.py:857 tryton/gui/window/win_export.py:492
#: tryton/gui/window/win_import.py:262 tryton/gui/window/win_import.py:290
msgid "Error"
msgstr ""
-#: tryton/common/common.py:863
+#: tryton/common/common.py:861
msgid "Report Bug"
msgstr ""
-#: tryton/common/common.py:870
+#: tryton/common/common.py:868
msgid "Application Error!"
msgstr ""
-#: tryton/common/common.py:893
+#: tryton/common/common.py:891
msgid "Error: "
msgstr ""
-#: tryton/common/common.py:913
+#: tryton/common/common.py:911
#, python-format
msgid "To report bugs you must have an account on <u>%s</u>"
msgstr ""
-#: tryton/common/common.py:943
+#: tryton/common/common.py:941
msgid "Bug Tracker"
msgstr ""
-#: tryton/common/common.py:961
+#: tryton/common/common.py:959
msgid "User:"
msgstr ""
-#: tryton/common/common.py:969 tryton/common/common.py:1132
+#: tryton/common/common.py:967 tryton/common/common.py:1129
#: tryton/gui/window/dblogin.py:462
msgid "Password:"
msgstr ""
-#: tryton/common/common.py:1024
+#: tryton/common/common.py:1022
msgid ""
"The same bug was already reported by another user.\n"
"To keep you informed your username is added to the nosy-list of this issue"
msgstr ""
-#: tryton/common/common.py:1035
+#: tryton/common/common.py:1033
msgid "Created new bug with ID "
msgstr ""
-#: tryton/common/common.py:1043 tryton/gui/main.py:928
+#: tryton/common/common.py:1041 tryton/gui/main.py:935
msgid ""
"Connection error!\n"
"Bad username or password!"
msgstr ""
-#: tryton/common/common.py:1048
+#: tryton/common/common.py:1046
msgid "Exception:"
msgstr ""
-#: tryton/common/common.py:1065
+#: tryton/common/common.py:1063
msgid ""
"The server fingerprint has changed since last connection!\n"
"The application will stop connecting to this server until its fingerprint"
" is fixed."
msgstr ""
-#: tryton/common/common.py:1067
+#: tryton/common/common.py:1065
msgid "Security risk!"
msgstr ""
-#: tryton/common/common.py:1073 tryton/common/common.py:1139
-#: tryton/gui/main.py:925
+#: tryton/common/common.py:1070 tryton/common/common.py:1135
+#: tryton/gui/main.py:932
msgid ""
"Connection error!\n"
"Unable to connect to the server!"
msgstr ""
-#: tryton/common/common.py:1154
+#: tryton/common/common.py:1150
msgid "Network Error!"
msgstr ""
-#: tryton/common/common.py:1409
+#: tryton/common/common.py:1405
msgid "Y"
msgstr ""
-#: tryton/common/common.py:1410
+#: tryton/common/common.py:1406
msgid "M"
msgstr ""
-#: tryton/common/common.py:1411
+#: tryton/common/common.py:1407
msgid "w"
msgstr ""
-#: tryton/common/common.py:1412
+#: tryton/common/common.py:1408
msgid "d"
msgstr ""
-#: tryton/common/common.py:1413
+#: tryton/common/common.py:1409
msgid "h"
msgstr ""
-#: tryton/common/common.py:1414
+#: tryton/common/common.py:1410
msgid "m"
msgstr ""
@@ -255,57 +255,57 @@ msgstr ""
msgid "Date Selection"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "y"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "yes"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "true"
msgstr ""
-#: tryton/common/domain_parser.py:221
+#: tryton/common/domain_parser.py:229
msgid "t"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "True"
msgstr ""
-#: tryton/common/domain_parser.py:422
-#: tryton/gui/window/view_form/view/screen_container.py:461
+#: tryton/common/domain_parser.py:430
+#: tryton/gui/window/view_form/view/screen_container.py:464
msgid "False"
msgstr ""
-#: tryton/common/popup_menu.py:72
+#: tryton/common/popup_menu.py:77
msgid "Edit..."
msgstr ""
-#: tryton/common/popup_menu.py:77
+#: tryton/common/popup_menu.py:82
msgid "Attachments..."
msgstr ""
-#: tryton/common/popup_menu.py:87
+#: tryton/common/popup_menu.py:92
msgid "Actions..."
msgstr ""
-#: tryton/common/popup_menu.py:88
+#: tryton/common/popup_menu.py:93
msgid "Relate..."
msgstr ""
-#: tryton/common/popup_menu.py:89
+#: tryton/common/popup_menu.py:94
msgid "Report..."
msgstr ""
-#: tryton/common/popup_menu.py:90
+#: tryton/common/popup_menu.py:95
msgid "E-Mail..."
msgstr ""
-#: tryton/common/popup_menu.py:91
+#: tryton/common/popup_menu.py:96
msgid "Print..."
msgstr ""
@@ -330,10 +330,10 @@ msgid "_Help"
msgstr ""
#: tryton/gui/main.py:286 tryton/gui/window/win_search.py:26
-#: tryton/gui/window/view_form/view/screen_container.py:100
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:332
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:40
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:45
+#: tryton/gui/window/view_form/view/screen_container.py:102
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:334
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:39
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:44
msgid "Search"
msgstr ""
@@ -501,92 +501,92 @@ msgstr ""
msgid "Manage Favorites"
msgstr ""
-#: tryton/gui/main.py:942
+#: tryton/gui/main.py:949
msgid ""
"The following action requires to close all tabs.\n"
"Do you want to continue?"
msgstr ""
-#: tryton/gui/main.py:1206
+#: tryton/gui/main.py:1208
msgid "Close Tab"
msgstr ""
-#: tryton/gui/main.py:1327
+#: tryton/gui/main.py:1329
msgid ""
"You are going to delete a Tryton database.\n"
"Are you really sure to proceed?"
msgstr ""
-#: tryton/gui/main.py:1337
+#: tryton/gui/main.py:1339
msgid ""
"Wrong Tryton Server Password\n"
"Please try again."
msgstr ""
-#: tryton/gui/main.py:1339 tryton/gui/main.py:1375 tryton/gui/main.py:1411
-#: tryton/gui/window/dbcreate.py:384
+#: tryton/gui/main.py:1341 tryton/gui/main.py:1377 tryton/gui/main.py:1413
+#: tryton/gui/window/dbcreate.py:362
msgid "Access denied!"
msgstr ""
-#: tryton/gui/main.py:1342
+#: tryton/gui/main.py:1344
msgid "Database drop failed with error message:\n"
msgstr ""
-#: tryton/gui/main.py:1343
+#: tryton/gui/main.py:1345
msgid "Database drop failed!"
msgstr ""
-#: tryton/gui/main.py:1345
+#: tryton/gui/main.py:1347
msgid "Database dropped successfully!"
msgstr ""
-#: tryton/gui/main.py:1350
+#: tryton/gui/main.py:1352
msgid "Open Backup File to Restore..."
msgstr ""
-#: tryton/gui/main.py:1367
+#: tryton/gui/main.py:1369
msgid ""
"It is not possible to restore a password protected database.\n"
"Backup and restore needed to be proceed manual."
msgstr ""
-#: tryton/gui/main.py:1371 tryton/gui/main.py:1407
+#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
msgid "Database is password protected!"
msgstr ""
-#: tryton/gui/main.py:1373 tryton/gui/main.py:1409
+#: tryton/gui/main.py:1375 tryton/gui/main.py:1411
msgid ""
"Wrong Tryton Server Password.\n"
"Please try again."
msgstr ""
-#: tryton/gui/main.py:1378
+#: tryton/gui/main.py:1380
msgid "Database restore failed with error message:\n"
msgstr ""
-#: tryton/gui/main.py:1380 tryton/gui/main.py:1385
+#: tryton/gui/main.py:1382 tryton/gui/main.py:1387
msgid "Database restore failed!"
msgstr ""
-#: tryton/gui/main.py:1383
+#: tryton/gui/main.py:1385
msgid "Database restored successfully!"
msgstr ""
-#: tryton/gui/main.py:1404
+#: tryton/gui/main.py:1406
msgid ""
"It is not possible to dump a password protected Database.\n"
"Backup and restore needed to be proceed manual."
msgstr ""
-#: tryton/gui/main.py:1414
+#: tryton/gui/main.py:1416
msgid "Database dump failed with error message:\n"
msgstr ""
-#: tryton/gui/main.py:1416
+#: tryton/gui/main.py:1418
msgid "Database dump failed!"
msgstr ""
-#: tryton/gui/main.py:1427
+#: tryton/gui/main.py:1429
msgid "Database backuped successfully!"
msgstr ""
@@ -599,7 +599,7 @@ msgid "Create a new record"
msgstr ""
#: tryton/gui/window/board.py:20 tryton/gui/window/form.py:34
-#: tryton/gui/window/win_export.py:142
+#: tryton/gui/window/win_export.py:143
msgid "Save"
msgstr ""
@@ -609,7 +609,7 @@ msgstr ""
#: tryton/gui/window/board.py:21 tryton/gui/window/form.py:36
#: tryton/gui/window/win_form.py:232
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:154
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:153
msgid "Switch"
msgstr ""
@@ -767,47 +767,29 @@ msgstr ""
msgid "Type the Admin password again"
msgstr ""
-#: tryton/gui/window/dbcreate.py:332
-msgid ""
-"The database name is restricted to alpha-nummerical characters and \"_\" "
-"(underscore). Avoid all accents, space and any other special characters."
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:337
-msgid "Wrong characters in database name!"
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:341
+#: tryton/gui/window/dbcreate.py:333
msgid "The new admin password doesn't match the confirmation field.\n"
msgstr ""
-#: tryton/gui/window/dbcreate.py:343
+#: tryton/gui/window/dbcreate.py:335
msgid "Passwords doesn't match!"
msgstr ""
-#: tryton/gui/window/dbcreate.py:346
-msgid "Admin password and confirmation are required to create a new database."
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:348
-msgid "Missing admin password!"
-msgstr ""
-
-#: tryton/gui/window/dbcreate.py:363
+#: tryton/gui/window/dbcreate.py:343
msgid ""
"A database with the same name already exists.\n"
"Try another database name."
msgstr ""
-#: tryton/gui/window/dbcreate.py:366
+#: tryton/gui/window/dbcreate.py:346
msgid "This database name already exist!"
msgstr ""
-#: tryton/gui/window/dbcreate.py:381
+#: tryton/gui/window/dbcreate.py:359
msgid "Sorry, wrong password for the Tryton server. Please try again."
msgstr ""
-#: tryton/gui/window/dbcreate.py:389
+#: tryton/gui/window/dbcreate.py:367
msgid ""
"Can't create the database, caused by an unknown reason.\n"
"If there is a database created, it could be broken. Maybe drop this "
@@ -815,7 +797,7 @@ msgid ""
"Error message:\n"
msgstr ""
-#: tryton/gui/window/dbcreate.py:397
+#: tryton/gui/window/dbcreate.py:375
msgid "Error creating database!"
msgstr ""
@@ -880,12 +862,12 @@ msgstr ""
msgid "Profile"
msgstr ""
-#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:65
+#: tryton/gui/window/dblogin.py:52 tryton/gui/window/win_export.py:66
#: tryton/gui/window/win_import.py:47
msgid "_Add"
msgstr ""
-#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:73
+#: tryton/gui/window/dblogin.py:57 tryton/gui/window/win_export.py:74
#: tryton/gui/window/win_import.py:55
msgid "_Remove"
msgstr ""
@@ -910,7 +892,7 @@ msgstr ""
msgid "Could not connect to the server"
msgstr ""
-#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:631
+#: tryton/gui/window/dblogin.py:310 tryton/gui/window/dblogin.py:616
msgid "Incompatible version of the server"
msgstr ""
@@ -1030,8 +1012,8 @@ msgstr ""
#: tryton/gui/window/form.py:41 tryton/gui/window/tips.py:74
#: tryton/gui/window/win_form.py:205
-#: tryton/gui/window/view_form/view/screen_container.py:163
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:128
+#: tryton/gui/window/view_form/view/screen_container.py:165
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:127
msgid "Previous"
msgstr ""
@@ -1041,8 +1023,8 @@ msgstr ""
#: tryton/gui/window/form.py:43 tryton/gui/window/tips.py:81
#: tryton/gui/window/win_form.py:219
-#: tryton/gui/window/view_form/view/screen_container.py:175
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:142
+#: tryton/gui/window/view_form/view/screen_container.py:177
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:141
msgid "Next"
msgstr ""
@@ -1147,23 +1129,23 @@ msgstr ""
msgid "Model:"
msgstr ""
-#: tryton/gui/window/form.py:304
+#: tryton/gui/window/form.py:308
msgid "Are you sure to remove this record?"
msgstr ""
-#: tryton/gui/window/form.py:306
+#: tryton/gui/window/form.py:310
msgid "Are you sure to remove those records?"
msgstr ""
-#: tryton/gui/window/form.py:309
+#: tryton/gui/window/form.py:313
msgid "Records not removed!"
msgstr ""
-#: tryton/gui/window/form.py:311
+#: tryton/gui/window/form.py:315
msgid "Records removed!"
msgstr ""
-#: tryton/gui/window/form.py:345
+#: tryton/gui/window/form.py:342
msgid "Working now on the duplicated record(s)!"
msgstr ""
@@ -1175,59 +1157,58 @@ msgstr ""
msgid "Invalid form!"
msgstr ""
-#: tryton/gui/window/form.py:462
+#: tryton/gui/window/form.py:464
msgid " of "
msgstr ""
-#: tryton/gui/window/form.py:483
+#: tryton/gui/window/form.py:485
msgid ""
"This record has been modified\n"
"do you want to save it ?"
msgstr ""
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Action"
msgstr ""
-#: tryton/gui/window/form.py:536
+#: tryton/gui/window/form.py:538
msgid "Launch action"
msgstr ""
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Relate"
msgstr ""
-#: tryton/gui/window/form.py:537
+#: tryton/gui/window/form.py:539
msgid "Open related records"
msgstr ""
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Report"
msgstr ""
-#: tryton/gui/window/form.py:539
+#: tryton/gui/window/form.py:541
msgid "Open report"
msgstr ""
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail"
msgstr ""
-#: tryton/gui/window/form.py:540
+#: tryton/gui/window/form.py:542
msgid "E-Mail report"
msgstr ""
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print"
msgstr ""
-#: tryton/gui/window/form.py:541
+#: tryton/gui/window/form.py:543
msgid "Print report"
msgstr ""
-#: tryton/gui/window/form.py:607
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:257
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:1050
+#: tryton/gui/window/form.py:609
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:848
msgid "Unknown"
msgstr ""
@@ -1381,67 +1362,77 @@ msgstr ""
msgid "_Display a new tip next time"
msgstr ""
-#: tryton/gui/window/win_export.py:24
+#: tryton/gui/window/win_export.py:25
msgid "Export to CSV"
msgstr ""
-#: tryton/gui/window/win_export.py:39
+#: tryton/gui/window/win_export.py:40
msgid "<b>Predefined exports</b>"
msgstr ""
-#: tryton/gui/window/win_export.py:51 tryton/gui/window/win_import.py:38
+#: tryton/gui/window/win_export.py:52 tryton/gui/window/win_import.py:38
msgid "<b>All fields</b>"
msgstr ""
-#: tryton/gui/window/win_export.py:82 tryton/gui/window/win_import.py:64
+#: tryton/gui/window/win_export.py:83 tryton/gui/window/win_import.py:64
#: tryton/gui/window/view_form/view/form_gtk/binary.py:78
-#: tryton/gui/window/view_form/view/form_gtk/image.py:84
+#: tryton/gui/window/view_form/view/form_gtk/image.py:81
msgid "Clear"
msgstr ""
-#: tryton/gui/window/win_export.py:94
+#: tryton/gui/window/win_export.py:95
msgid "Save Export"
msgstr ""
-#: tryton/gui/window/win_export.py:103
+#: tryton/gui/window/win_export.py:104
msgid "Delete Export"
msgstr ""
-#: tryton/gui/window/win_export.py:114
+#: tryton/gui/window/win_export.py:115
msgid "<b>Fields to export</b>"
msgstr ""
-#: tryton/gui/window/win_export.py:131
+#: tryton/gui/window/win_export.py:132
msgid "<b>Options</b>"
msgstr ""
-#: tryton/gui/window/win_export.py:141
+#: tryton/gui/window/win_export.py:142
msgid "Open"
msgstr ""
-#: tryton/gui/window/win_export.py:146
+#: tryton/gui/window/win_export.py:147
msgid "Add _field names"
msgstr ""
-#: tryton/gui/window/win_export.py:201
+#: tryton/gui/window/win_export.py:217
msgid "Name"
msgstr ""
-#: tryton/gui/window/win_export.py:309
+#: tryton/gui/window/win_export.py:249
+#, python-format
+msgid "%s (string)"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:350
msgid "What is the name of this export?"
msgstr ""
-#: tryton/gui/window/win_export.py:436
+#: tryton/gui/window/win_export.py:356
+#, python-format
+msgid "Override '%s' definition?"
+msgstr ""
+
+#: tryton/gui/window/win_export.py:486
#, python-format
msgid "%d record saved!"
msgstr ""
-#: tryton/gui/window/win_export.py:438
+#: tryton/gui/window/win_export.py:488
#, python-format
msgid "%d records saved!"
msgstr ""
-#: tryton/gui/window/win_export.py:441
+#: tryton/gui/window/win_export.py:491
#, python-format
msgid ""
"Operation failed!\n"
@@ -1462,18 +1453,17 @@ msgid "Remove <Del>"
msgstr ""
#: tryton/gui/window/win_form.py:164
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:75
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:86
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:85
msgid "Create a new record <F3>"
msgstr ""
#: tryton/gui/window/win_form.py:176
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:106
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:105
msgid "Delete selected record <Del>"
msgstr ""
#: tryton/gui/window/win_form.py:190
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:116
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:115
msgid "Undelete selected record <Ins>"
msgstr ""
@@ -1495,10 +1485,10 @@ msgstr ""
#: tryton/gui/window/win_import.py:111
#: tryton/gui/window/view_form/view/form_gtk/binary.py:57
-#: tryton/gui/window/view_form/view/form_gtk/binary.py:118
-#: tryton/gui/window/view_form/view/form_gtk/image.py:62
-#: tryton/gui/window/view_form/view/form_gtk/image.py:131
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:650
+#: tryton/gui/window/view_form/view/form_gtk/binary.py:112
+#: tryton/gui/window/view_form/view/form_gtk/image.py:59
+#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/list_gtk/widget.py:462
msgid "Open..."
msgstr ""
@@ -1549,68 +1539,98 @@ msgstr ""
msgid "%d records imported!"
msgstr ""
-#: tryton/gui/window/wizard.py:286
+#: tryton/gui/window/wizard.py:289
msgid "Wizard"
msgstr ""
-#: tryton/gui/window/view_board/parser.py:108
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:354
-msgid "No String Attr."
-msgstr ""
-
-#: tryton/gui/window/view_form/screen/screen.py:129
+#: tryton/gui/window/view_form/screen/screen.py:130
msgid "ID"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:130
+#: tryton/gui/window/view_form/screen/screen.py:131
msgid "Creation User"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:131
+#: tryton/gui/window/view_form/screen/screen.py:132
msgid "Creation Date"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:132
+#: tryton/gui/window/view_form/screen/screen.py:133
msgid "Modification User"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:133
+#: tryton/gui/window/view_form/screen/screen.py:134
msgid "Modification Date"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:631
+#: tryton/gui/window/view_form/screen/screen.py:632
msgid "Unable to get view tree state"
msgstr ""
-#: tryton/gui/window/view_form/screen/screen.py:668
+#: tryton/gui/window/view_form/screen/screen.py:691
msgid "Unable to set view tree state"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:23
+#: tryton/gui/window/view_form/view/form.py:180
+#: tryton/gui/window/view_form/view/form.py:182
+#: tryton/gui/window/view_form/view/list.py:511
+#: tryton/gui/window/view_form/view/list.py:513
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:450
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:452
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:199
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:201
+msgid ":"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:100
+msgid "Save As"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:111
+msgid "Image Size"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:120
+msgid "Width:"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:127
+msgid "Height:"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:139
+msgid "PNG image (*.png)"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/graph.py:168
+msgid "Image size too large!"
+msgstr ""
+
+#: tryton/gui/window/view_form/view/screen_container.py:24
msgid ".."
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:93
+#: tryton/gui/window/view_form/view/screen_container.py:95
msgid "F_ilters"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:147
+#: tryton/gui/window/view_form/view/screen_container.py:149
msgid "Show bookmarks of filters"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:312
+#: tryton/gui/window/view_form/view/screen_container.py:314
msgid "Remove this bookmark"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:319
+#: tryton/gui/window/view_form/view/screen_container.py:321
msgid "Bookmark this filter"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:384
+#: tryton/gui/window/view_form/view/screen_container.py:386
msgid "Bookmark Name:"
msgstr ""
-#: tryton/gui/window/view_form/view/screen_container.py:490
+#: tryton/gui/window/view_form/view/screen_container.py:493
msgid "Find"
msgstr ""
@@ -1638,79 +1658,49 @@ msgstr ""
msgid "Show plain text"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:348
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:350
msgid "Add value"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:458
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:460
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:202
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:204
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:255
-#: tryton/gui/window/view_form/view/form_gtk/parser.py:259
-msgid ":"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:470
+#: tryton/gui/window/view_form/view/form_gtk/dictionary.py:462
#, python-format
msgid "Remove \"%s\""
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:51
+#: tryton/gui/window/view_form/view/form_gtk/image.py:48
msgid "Select an Image..."
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:121
+#: tryton/gui/window/view_form/view/form_gtk/image.py:115
msgid "All files"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/image.py:125
+#: tryton/gui/window/view_form/view/form_gtk/image.py:119
msgid "Images"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:178
-msgid "Translation"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:234
-msgid "Edit"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:239
-msgid "Fuzzy"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:308
-msgid "You need to save the record before adding translations!"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/interface.py:319
-msgid "No other language available!"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:58
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:61
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:57
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:60
msgid "Add existing record"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/many2many.py:69
+#: tryton/gui/window/view_form/view/form_gtk/many2many.py:68
msgid "Remove selected record <Del>"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:76
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:356
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:296
msgid "Open a record <F2>"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/many2one.py:359
+#: tryton/gui/window/view_form/view/form_gtk/many2one.py:298
msgid "Search a record <F2>"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:73
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:72
msgid "Remove selected record"
msgstr ""
-#: tryton/gui/window/view_form/view/form_gtk/one2many.py:96
+#: tryton/gui/window/view_form/view/form_gtk/one2many.py:95
msgid "Edit selected record <F2>"
msgstr ""
@@ -1770,32 +1760,24 @@ msgstr ""
msgid "Select a background color"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:26
-msgid "Save As"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:36
-msgid "Image Size"
-msgstr ""
-
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:45
-msgid "Width:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:175
+msgid "Translation"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:52
-msgid "Height:"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:231
+msgid "Edit"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:64
-msgid "PNG image (*.png)"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:236
+msgid "Fuzzy"
msgstr ""
-#: tryton/gui/window/view_form/view/graph_gtk/parser.py:93
-msgid "Image size too large!"
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:305
+msgid "You need to save the record before adding translations!"
msgstr ""
-#: tryton/gui/window/view_form/view/list_gtk/parser.py:244
-msgid ": "
+#: tryton/gui/window/view_form/view/form_gtk/widget.py:316
+msgid "No other language available!"
msgstr ""
#: tryton/plugins/translation/__init__.py:18
diff --git a/tryton.desktop b/tryton.desktop
index c7d0b24..9339198 100644
--- a/tryton.desktop
+++ b/tryton.desktop
@@ -6,6 +6,7 @@ GenericName=Client for the Tryton Application Platform
GenericName[ca_ES]=Client per l'aplicació Tryton
GenericName[de]=Client für die Tryton Applikationsplattform
GenericName[es_AR]=Cliente para la aplicación Tryton
+GenericName[es_EC]=Cliente para la aplicación Tryton
GenericName[es_ES]=Cliente para la aplicación Tryton
GenericName[es_CO]=Cliente para la Aplicación Tryton
GenericName[fr]=Client de la plate-forme applicative Tryton
@@ -14,6 +15,7 @@ GenericName[sl]=Odjemalec za Tryton programsko platformo
Comment=Access Tryton server
Comment[de]=Verbindet zu einem Tryton Server
Comment[es_AR]=Acceso al servidor Tryton
+Comment[es_EC]=Acceso al servidor Tryton
Comment[ca_ES]=Accés al servidor Tryton
Comment[es_ES]=Acceso al servidor Tryton
Comment[es_CO]=Acceso al servidor Tryton
diff --git a/tryton.egg-info/PKG-INFO b/tryton.egg-info/PKG-INFO
index 8bd6c16..d23ca40 100644
--- a/tryton.egg-info/PKG-INFO
+++ b/tryton.egg-info/PKG-INFO
@@ -1,12 +1,12 @@
Metadata-Version: 1.1
Name: tryton
-Version: 3.2.4
+Version: 3.4.0
Summary: Tryton client
Home-page: http://www.tryton.org/
Author: Tryton
Author-email: issue_tracker at tryton.org
License: GPL-3
-Download-URL: http://downloads.tryton.org/3.2/
+Download-URL: http://downloads.tryton.org/3.4/
Description: tryton
======
diff --git a/tryton.egg-info/SOURCES.txt b/tryton.egg-info/SOURCES.txt
index 136190b..a4daab6 100644
--- a/tryton.egg-info/SOURCES.txt
+++ b/tryton.egg-info/SOURCES.txt
@@ -56,6 +56,8 @@ share/locale/es_AR/LC_MESSAGES/tryton.mo
share/locale/es_AR/LC_MESSAGES/tryton.po
share/locale/es_CO/LC_MESSAGES/tryton.mo
share/locale/es_CO/LC_MESSAGES/tryton.po
+share/locale/es_EC/LC_MESSAGES/tryton.mo
+share/locale/es_EC/LC_MESSAGES/tryton.po
share/locale/es_ES/LC_MESSAGES/tryton.mo
share/locale/es_ES/LC_MESSAGES/tryton.po
share/locale/fr_FR/LC_MESSAGES/tryton.mo
@@ -169,6 +171,7 @@ tryton/common/focus.py
tryton/common/placeholder_entry.py
tryton/common/popup_menu.py
tryton/common/selection.py
+tryton/common/treeviewcontrol.py
tryton/gui/__init__.py
tryton/gui/main.py
tryton/gui/window/__init__.py
@@ -196,7 +199,6 @@ tryton/gui/window/window.py
tryton/gui/window/wizard.py
tryton/gui/window/view_board/__init__.py
tryton/gui/window/view_board/action.py
-tryton/gui/window/view_board/parser.py
tryton/gui/window/view_board/view_board.py
tryton/gui/window/view_form/__init__.py
tryton/gui/window/view_form/model/__init__.py
@@ -209,14 +211,11 @@ tryton/gui/window/view_form/view/__init__.py
tryton/gui/window/view_form/view/calendar_.py
tryton/gui/window/view_form/view/form.py
tryton/gui/window/view_form/view/graph.py
-tryton/gui/window/view_form/view/interface.py
tryton/gui/window/view_form/view/list.py
tryton/gui/window/view_form/view/screen_container.py
-tryton/gui/window/view_form/view/widget_parse.py
tryton/gui/window/view_form/view/calendar_gtk/__init__.py
tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
tryton/gui/window/view_form/view/calendar_gtk/dates_period.py
-tryton/gui/window/view_form/view/calendar_gtk/parser.py
tryton/gui/window/view_form/view/calendar_gtk/toolbar.py
tryton/gui/window/view_form/view/form_gtk/__init__.py
tryton/gui/window/view_form/view/form_gtk/binary.py
@@ -228,27 +227,26 @@ tryton/gui/window/view_form/view/form_gtk/float.py
tryton/gui/window/view_form/view/form_gtk/float_time.py
tryton/gui/window/view_form/view/form_gtk/image.py
tryton/gui/window/view_form/view/form_gtk/integer.py
-tryton/gui/window/view_form/view/form_gtk/interface.py
tryton/gui/window/view_form/view/form_gtk/many2many.py
tryton/gui/window/view_form/view/form_gtk/many2one.py
tryton/gui/window/view_form/view/form_gtk/multiselection.py
tryton/gui/window/view_form/view/form_gtk/one2many.py
tryton/gui/window/view_form/view/form_gtk/one2one.py
-tryton/gui/window/view_form/view/form_gtk/parser.py
tryton/gui/window/view_form/view/form_gtk/progressbar.py
tryton/gui/window/view_form/view/form_gtk/reference.py
tryton/gui/window/view_form/view/form_gtk/richtextbox.py
tryton/gui/window/view_form/view/form_gtk/selection.py
+tryton/gui/window/view_form/view/form_gtk/state_widget.py
tryton/gui/window/view_form/view/form_gtk/textbox.py
tryton/gui/window/view_form/view/form_gtk/url.py
+tryton/gui/window/view_form/view/form_gtk/widget.py
tryton/gui/window/view_form/view/graph_gtk/__init__.py
tryton/gui/window/view_form/view/graph_gtk/bar.py
tryton/gui/window/view_form/view/graph_gtk/graph.py
tryton/gui/window/view_form/view/graph_gtk/line.py
-tryton/gui/window/view_form/view/graph_gtk/parser.py
tryton/gui/window/view_form/view/graph_gtk/pie.py
tryton/gui/window/view_form/view/list_gtk/__init__.py
tryton/gui/window/view_form/view/list_gtk/editabletree.py
-tryton/gui/window/view_form/view/list_gtk/parser.py
+tryton/gui/window/view_form/view/list_gtk/widget.py
tryton/plugins/__init__.py
tryton/plugins/translation/__init__.py
\ No newline at end of file
diff --git a/tryton/common/cellrendererbinary.py b/tryton/common/cellrendererbinary.py
index 792593d..a4e96c7 100644
--- a/tryton/common/cellrendererbinary.py
+++ b/tryton/common/cellrendererbinary.py
@@ -10,9 +10,9 @@ BUTTON_SPACING = 2
class CellRendererBinary(gtk.GenericCellRenderer):
__gproperties__ = {
- 'visible': (gobject.TYPE_INT, 'Visible', 'Visible', 0, 10, 0,
+ 'visible': (gobject.TYPE_BOOLEAN, 'Visible', 'Visible', True,
gobject.PARAM_READWRITE),
- 'editable': (gobject.TYPE_INT, 'Editable', 'Editable', 0, 10, 0,
+ 'editable': (gobject.TYPE_BOOLEAN, 'Editable', 'Editable', False,
gobject.PARAM_READWRITE),
'size': (gobject.TYPE_STRING, 'Size', 'Size', '',
gobject.PARAM_READWRITE),
@@ -31,6 +31,7 @@ class CellRendererBinary(gtk.GenericCellRenderer):
def __init__(self, use_filename):
self.__gobject_init__()
self.visible = True
+ self.editable = False
self.set_property('mode', gtk.CELL_RENDERER_MODE_EDITABLE)
self.use_filename = use_filename
if use_filename:
diff --git a/tryton/common/common.py b/tryton/common/common.py
index efc39ae..03e65d1 100644
--- a/tryton/common/common.py
+++ b/tryton/common/common.py
@@ -322,19 +322,17 @@ def request_server(server_widget):
dialog.show_all()
dialog.set_default_response(gtk.RESPONSE_OK)
- url_m = re.match('^([\w.-]+):(\d{1,5})',
- server_widget.get_text())
- if url_m:
- entry_server.set_text(url_m.group(1))
- entry_port.set_text(url_m.group(2))
+ netloc = server_widget.get_text()
+ entry_server.set_text(get_hostname(netloc))
+ entry_port.set_text(str(get_port(netloc)))
res = dialog.run()
if res == gtk.RESPONSE_OK:
host = entry_server.get_text()
- port = int(entry_port.get_text())
- url = '%s:%d' % (host, port)
+ port = entry_port.get_text()
+ url = '%s:%s' % (host, port)
server_widget.set_text(url)
- result = (host, port)
+ result = (get_hostname(url), get_port(url))
parent.present()
dialog.destroy()
return result
@@ -1067,7 +1065,6 @@ def process_exception(exception, *args, **kwargs):
'until its fingerprint is fixed.'), _('Security risk!'))
from tryton.gui.main import Main
Main.sig_quit()
- sys.exit()
elif exception.faultCode == 'NotLogged':
if rpc.CONNECTION is None:
message(_('Connection error!\n'
@@ -1131,8 +1128,7 @@ def process_exception(exception, *args, **kwargs):
while True:
password = ask(_('Password:'), visibility=False)
if password is None:
- Main.get_main().sig_logout()
- return False
+ Main.get_main().sig_quit()
res = rpc.login(rpc._USERNAME, password, hostname, port,
rpc._DATABASE)
if res == -1:
@@ -1534,3 +1530,55 @@ def humanize(size):
if size < 1000:
return '%3.1f%s' % (size, x)
size /= 1000.0
+
+
+def get_hostname(netloc):
+ if '[' in netloc and ']' in netloc:
+ return netloc.split(']')[0][1:]
+ elif ':' in netloc:
+ return netloc.split(':')[0]
+ else:
+ return netloc
+
+
+def get_port(netloc):
+ netloc = netloc.split(']')[-1]
+ if ':' in netloc:
+ try:
+ return int(netloc.split(':')[1])
+ except ValueError:
+ pass
+ return 8000
+
+
+def resize_pixbuf(pixbuf, width, height):
+ img_height = pixbuf.get_height()
+ height = min(img_height, height) if height != -1 else img_height
+ img_width = pixbuf.get_width()
+ width = min(img_width, width) if width != -1 else img_width
+
+ if img_width / width < img_height / height:
+ width = float(img_width) / float(img_height) * float(height)
+ else:
+ height = float(img_height) / float(img_width) * float(width)
+ return pixbuf.scale_simple(int(width), int(height),
+ gtk.gdk.INTERP_BILINEAR)
+
+
+def _data2pixbuf(data):
+ loader = gtk.gdk.PixbufLoader()
+ loader.write(data, len(data))
+ loader.close()
+ return loader.get_pixbuf()
+
+BIG_IMAGE_SIZE = 10 ** 6
+with open(os.path.join(PIXMAPS_DIR, 'tryton-noimage.png'), 'rb') as no_image:
+ NO_IMG_PIXBUF = _data2pixbuf(no_image.read())
+
+
+def data2pixbuf(data):
+ try:
+ pixbuf = _data2pixbuf(data)
+ except glib.GError:
+ pixbuf = NO_IMG_PIXBUF
+ return pixbuf
diff --git a/tryton/common/domain_parser.py b/tryton/common/domain_parser.py
index 935b245..6006702 100644
--- a/tryton/common/domain_parser.py
+++ b/tryton/common/domain_parser.py
@@ -117,12 +117,20 @@ def quote(value):
"Quote string if needed"
if not isinstance(value, basestring):
return value
+ if '"' in value:
+ value = value.replace('"', '\\"')
for test in (':', ' ', '(', ')') + OPERATORS:
if test in value:
return '"%s"' % value
return value
+def test_quote():
+ assert quote('test') == 'test'
+ assert quote('foo bar') == '"foo bar"'
+ assert quote('"foo"') == '\\\"foo\\\"'
+
+
def ending_clause(domain, deep=0):
"Return the ending clause"
if not domain:
@@ -1082,7 +1090,7 @@ class DomainParser(object):
rvalue = convert_value(field, rvalue)
yield iter([
(field_name, '>=', lvalue),
- (field_name, '<', rvalue),
+ (field_name, '<=', rvalue),
])
continue
if isinstance(value, list):
@@ -1284,6 +1292,9 @@ def test_group():
('Name', '=', None),
('Name', None, 'Doe'),
]
+ assert rlist(dom.group(udlex(u'Name: \\"foo\\"'))) == [
+ ('Name', None, '"foo"'),
+ ]
def test_parse_clause():
@@ -1355,7 +1366,7 @@ def test_parse_clause():
]
assert rlist(dom.parse_clause([('Integer', None, '3..5')])) == [[
('integer', '>=', 3),
- ('integer', '<', 5),
+ ('integer', '<=', 5),
]]
assert rlist(dom.parse_clause([('Reference', None, 'foo')])) == [
('reference', 'ilike', '%foo%'),
diff --git a/tryton/common/focus.py b/tryton/common/focus.py
index c2150f9..9d54df1 100644
--- a/tryton/common/focus.py
+++ b/tryton/common/focus.py
@@ -1,5 +1,8 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+from functools import cmp_to_key
+
+import gtk
def get_invisible_ancestor(widget):
@@ -21,6 +24,23 @@ def find_focused_child(widget):
return focused_widget
+def tab_compare(a, b):
+ text_direction = gtk.widget_get_default_direction()
+ y1 = a.allocation.y + a.allocation.height // 2
+ y2 = b.allocation.y + b.allocation.height // 2
+
+ if y1 == y2:
+ x1 = a.allocation.x + a.allocation.width // 2
+ x2 = b.allocation.x + b.allocation.width // 2
+
+ if text_direction == gtk.TEXT_DIR_RTL:
+ return (x2 > x1) - (x2 < x1)
+ else:
+ return (x1 > x2) - (x1 < x2)
+ else:
+ return (y1 > y2) - (y1 < y2)
+
+
def find_focusable_child(widget):
if not widget.get_visible():
return None
@@ -33,7 +53,7 @@ def find_focusable_child(widget):
# search into all its children widgets
widgets = (focus_chain
if focus_chain is not None
- else widget.get_children())
+ else sorted(widget.get_children(), key=cmp_to_key(tab_compare)))
for child in widgets:
focusable = find_focusable_child(child)
if focusable:
diff --git a/tryton/common/selection.py b/tryton/common/selection.py
index a05ed71..fe62052 100644
--- a/tryton/common/selection.py
+++ b/tryton/common/selection.py
@@ -21,17 +21,18 @@ class SelectionMixin(object):
self._values2selection = {}
self._domain_cache = {}
- def init_selection(self, key=None):
- if key is None:
- key = tuple(sorted((k, None)
- for k in self.attrs.get('selection_change_with') or []))
+ def init_selection(self, value=None):
+ if value is None:
+ value = dict((k, None)
+ for k in self.attrs.get('selection_change_with') or [])
+ key = freeze_value(value)
selection = self.attrs.get('selection', [])[:]
if (not isinstance(selection, (list, tuple))
and key not in self._values2selection):
try:
if self.attrs.get('selection_change_with'):
selection = RPCExecute('model', self.model_name, selection,
- dict(key))
+ value)
else:
selection = RPCExecute('model', self.model_name, selection)
except RPCException:
@@ -55,15 +56,13 @@ class SelectionMixin(object):
domain = []
if 'relation' not in self.attrs:
change_with = self.attrs.get('selection_change_with') or []
- args = record._get_on_change_args(change_with)
- del args['id']
- key = args.items()
- key.sort()
- self.init_selection(tuple(key))
+ value = record._get_on_change_args(change_with)
+ del value['id']
+ self.init_selection(value)
self.filter_selection(domain, record, field)
else:
- context = record[self.field_name].context_get(record)
- domain_cache_key = str(domain) + str(context)
+ context = field.context_get(record)
+ domain_cache_key = (freeze_value(domain), freeze_value(context))
if domain_cache_key in self._domain_cache:
self.selection = self._domain_cache[domain_cache_key]
self._last_domain = (domain, context)
@@ -123,6 +122,16 @@ def selection_shortcuts(entry):
return entry
+def freeze_value(value):
+ if isinstance(value, dict):
+ return tuple(sorted((k, freeze_value(v))
+ for k, v in value.iteritems()))
+ elif isinstance(value, (list, set)):
+ return tuple(freeze_value(v) for v in value)
+ else:
+ return value
+
+
class PopdownMixin(object):
def set_popdown(self, selection, entry):
@@ -190,3 +199,10 @@ class PopdownMixin(object):
return False
entry.set_active(active)
return True
+
+
+def test_freeze_value():
+ assert freeze_value({'foo': 'bar'}) == (('foo', 'bar'),)
+ assert freeze_value([1, 42, 2, 3]) == (1, 42, 2, 3)
+ assert freeze_value('foo') == 'foo'
+ assert freeze_value({'foo': {'bar': 42}}) == (('foo', (('bar', 42),)),)
diff --git a/tryton/common/treeviewcontrol.py b/tryton/common/treeviewcontrol.py
new file mode 100644
index 0000000..79c4192
--- /dev/null
+++ b/tryton/common/treeviewcontrol.py
@@ -0,0 +1,32 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of this
+# repository contains the full copyright notices and license terms.
+import gtk
+import gobject
+
+MOVEMENT_KEYS = {gtk.keysyms.Up, gtk.keysyms.Down, gtk.keysyms.space,
+ gtk.keysyms.Left, gtk.keysyms.KP_Left,
+ gtk.keysyms.Right, gtk.keysyms.KP_Right,
+ gtk.keysyms.Home, gtk.keysyms.KP_Home,
+ gtk.keysyms.End, gtk.keysyms.KP_End}
+
+__all__ = ['TreeViewControl']
+
+
+class TreeViewControl(gtk.TreeView):
+ __gsignals__ = {
+ 'button-press-event': 'override',
+ 'key-press-event': 'override',
+ }
+
+ def do_button_press_event(self, event):
+ self.grab_focus() # grab focus because it doesn't whith CONTROL MASK
+ if event.button == 1:
+ event.state ^= gtk.gdk.CONTROL_MASK
+ return gtk.TreeView.do_button_press_event(self, event)
+
+ def do_key_press_event(self, event):
+ if event.keyval in MOVEMENT_KEYS:
+ event.state ^= gtk.gdk.CONTROL_MASK
+ return gtk.TreeView.do_key_press_event(self, event)
+
+gobject.type_register(TreeViewControl)
diff --git a/tryton/config.py b/tryton/config.py
index f6a6d58..cbd13de 100644
--- a/tryton/config.py
+++ b/tryton/config.py
@@ -10,6 +10,7 @@ import logging
import sys
import locale
import gtk
+import site
from tryton.exceptions import TrytonError
@@ -179,9 +180,11 @@ else:
CURRENT_DIR = os.path.abspath(os.path.normpath(os.path.join(
unicode(os.path.dirname(__file__), sys.getfilesystemencoding()),
'..')))
-PIXMAPS_DIR = os.path.join(CURRENT_DIR, 'share', 'pixmaps', 'tryton')
-if not os.path.isdir(PIXMAPS_DIR):
- PIXMAPS_DIR = os.path.join(sys.prefix, 'share', 'pixmaps', 'tryton')
+
+for dir in [CURRENT_DIR, site.USER_BASE, sys.prefix]:
+ PIXMAPS_DIR = os.path.join(dir, 'share', 'pixmaps', 'tryton')
+ if os.path.isdir(PIXMAPS_DIR):
+ break
TRYTON_ICON = gtk.gdk.pixbuf_new_from_file(
os.path.join(PIXMAPS_DIR, 'tryton-icon.png').encode('utf-8'))
diff --git a/tryton/gui/main.py b/tryton/gui/main.py
index c7c3d42..fcdaec0 100644
--- a/tryton/gui/main.py
+++ b/tryton/gui/main.py
@@ -144,9 +144,6 @@ class Main(object):
self.menuitem_user = None
self.menuitem_favorite = None
- if self.macapp is not None:
- self.macapp.ready()
-
self.buttons = {}
self.pane = gtk.HPaned()
@@ -204,6 +201,9 @@ class Main(object):
# Register plugins
tryton.plugins.register()
+ if self.macapp is not None:
+ self.macapp.ready()
+
_MAIN.append(self)
def set_menubar(self):
@@ -358,9 +358,9 @@ class Main(object):
widget.emit('changed')
end()
- RPCExecute('model', 'ir.model', 'global_search',
- search_text, CONFIG['client.limit'],
- self.menu_screen.model_name, callback=set_result)
+ RPCExecute('model', 'ir.model', 'global_search', search_text,
+ CONFIG['client.limit'], self.menu_screen.model_name,
+ context=self.menu_screen.context, callback=set_result)
return False
def changed(widget):
@@ -764,7 +764,7 @@ class Main(object):
def favorite_set(self):
if not self.menu_screen:
- return
+ return False
def _action_favorite(widget, id_):
Action.exec_keyword('tree_open', {
@@ -801,12 +801,19 @@ class Main(object):
menu.add(manage_favorites)
menu.show_all()
self.menuitem_favorite.set_submenu(menu)
+ return True
def favorite_unset(self):
+ had_submenu = self.menuitem_favorite.get_submenu()
self.menuitem_favorite.remove_submenu()
# Set a submenu to get keyboard shortcut working
self.menuitem_favorite.set_submenu(gtk.Menu())
+ if self.macapp and had_submenu:
+ # As the select event is not managed by the mac menu,
+ # it is done using a timeout
+ gobject.timeout_add(1000, lambda: not self.favorite_set())
+
def sig_accel_change(self, value):
CONFIG['client.can_change_accelerators'] = value
return self.sig_accel()
@@ -1044,21 +1051,23 @@ class Main(object):
elif action.get('view_id', False):
view_ids = [action['view_id'][0]]
ctx = rpc.CONTEXT.copy()
- domain = PYSONDecoder(ctx).decode(action['pyson_domain'])
- screen = Screen(action['res_model'], mode=['tree'],
- view_ids=view_ids, domain=domain, readonly=True)
+ decoder = PYSONDecoder(ctx)
+ action_ctx = decoder.decode(action.get('pyson_context') or '{}')
+ domain = decoder.decode(action['pyson_domain'])
+ screen = Screen(action['res_model'], mode=['tree'], view_ids=view_ids,
+ domain=domain, context=action_ctx, readonly=True)
# Use alternate view to not show search box
screen.screen_container.alternate_view = True
screen.switch_view(view_type=screen.current_view.view_type)
vbox.pack_start(screen.screen_container.alternate_viewport, True, True)
- screen.current_view.widget_tree.set_headers_visible(False)
+ treeview = screen.current_view.treeview
+ treeview.set_headers_visible(False)
self.menu_expander.add(vbox)
self.menu_expander.show()
# Favorite column
- treeview = screen.current_view.widget_tree
column = gtk.TreeViewColumn()
column.name = None
column._type = None
@@ -1123,6 +1132,7 @@ class Main(object):
gtk.accel_map_save(os.path.join(get_config_dir(), 'accel.map'))
cls.tryton_client.quit_mainloop()
+ sys.exit()
def sig_close(self, widget, event=None):
if not self.sig_logout(widget):
@@ -1139,14 +1149,6 @@ class Main(object):
def sig_window_state(self, widget, event):
CONFIG['client.maximize'] = (event.new_window_state ==
gtk.gdk.WINDOW_STATE_MAXIMIZED)
-
- if event.new_window_state == gtk.gdk.WINDOW_STATE_ICONIFIED:
- meth = 'iconify'
- else:
- meth = 'deiconify'
- for toplevel in gtk.window_list_toplevels():
- getattr(toplevel, meth)()
-
return False
def win_add(self, page, hide_current=False, allow_similar=True):
diff --git a/tryton/gui/window/dbcreate.py b/tryton/gui/window/dbcreate.py
index 739bcf9..6dd4ee3 100644
--- a/tryton/gui/window/dbcreate.py
+++ b/tryton/gui/window/dbcreate.py
@@ -3,7 +3,7 @@
import gtk
import gobject
import gettext
-import re
+
import tryton.common as common
from tryton.config import CONFIG, TRYTON_ICON
from tryton.exceptions import TrytonServerError
@@ -320,95 +320,72 @@ class DBCreate(object):
self.dialog.props.sensitive = True
res = self.dialog.run()
dbname = self.entry_dbname.get_text()
- url = self.entry_server_connection.get_text()
- url_m = re.match('^([\w.\-]+):(\d{1,5})', url or '')
+ netloc = self.entry_server_connection.get_text()
+ host = common.get_hostname(netloc)
+ port = common.get_port(netloc)
langidx = self.combo_language.get_active_iter()
langreal = langidx \
and self.combo_language.get_model().get_value(langidx, 1)
passwd = pass_widget.get_text()
if res == gtk.RESPONSE_OK:
- if (not dbname
- or not re.match('^[a-zA-Z0-9_]+$', dbname)):
- common.warning(_('The database name is restricted to '
- 'alpha-nummerical characters '
- 'and "_" (underscore). '
- 'Avoid all accents, space '
- 'and any other special characters.'),
- _('Wrong characters in database name!'))
- continue
- elif admin_passwd.get_text() != admin_passwd2.get_text():
+ if admin_passwd.get_text() != admin_passwd2.get_text():
common.warning(
_("The new admin password "
"doesn't match the confirmation field.\n"),
_("Passwords doesn't match!"))
continue
- elif not admin_passwd.get_text():
- common.warning(_("Admin password and confirmation are "
- "required to create a new database."),
- _('Missing admin password!'))
+ try:
+ exist = rpc.db_exec(host, port, 'db_exist', dbname)
+ except TrytonServerError, exception:
+ common.process_exception(exception)
continue
- elif url_m.group(1) \
- and int(url_m.group(2)) \
- and dbname \
- and langreal \
- and passwd \
- and admin_passwd.get_text():
+ if exist:
+ common.warning(_("A database with the same name "
+ "already exists.\n"
+ "Try another database name."),
+ _("This database name already exist!"))
+ self.entry_dbname.set_text("")
+ self.entry_dbname.grab_focus()
+ continue
+ else: # Everything runs fine, break the block here
+ self.dialog.props.sensitive = False
try:
- exist = rpc.db_exec(url_m.group(1),
- int(url_m.group(2)), 'db_exist', dbname)
+ rpcprogress = common.RPCProgress('db_exec',
+ (host, port, 'create', dbname, passwd, langreal,
+ admin_passwd.get_text()))
+ rpcprogress.run(False)
except TrytonServerError, exception:
- common.process_exception(exception)
- continue
- if exist:
- common.warning(_("A database with the same name "
- "already exists.\n"
- "Try another database name."),
- _("This database name already exist!"))
- self.entry_dbname.set_text("")
- self.entry_dbname.grab_focus()
- continue
- else: # Everything runs fine, break the block here
- host = url_m.group(1)
- port = url_m.group(2)
- self.dialog.props.sensitive = False
- try:
- rpcprogress = common.RPCProgress('db_exec',
- (host, int(port), 'create', dbname, passwd,
- langreal, admin_passwd.get_text()))
- rpcprogress.run(False)
- except TrytonServerError, exception:
- if str(exception.faultCode) == "AccessDenied":
- common.warning(_("Sorry, wrong password for "
- "the Tryton server. "
- "Please try again."),
- _("Access denied!"))
- self.entry_serverpasswd.set_text("")
- self.entry_serverpasswd.grab_focus()
- continue
- else: # Unclassified error
- common.warning(_("Can't create the "
- "database, caused by an unknown reason.\n"
- "If there is a database created, it could "
- "be broken. Maybe drop this database! "
- "Please check the error message for "
- "possible informations.\n"
- "Error message:\n")
- + str(exception.faultCode),
- _("Error creating database!"))
- parent.present()
- self.dialog.destroy()
- rpc.logout()
- break
+ if str(exception.faultCode) == "AccessDenied":
+ common.warning(_("Sorry, wrong password for "
+ "the Tryton server. "
+ "Please try again."),
+ _("Access denied!"))
+ self.entry_serverpasswd.set_text("")
+ self.entry_serverpasswd.grab_focus()
+ continue
+ else: # Unclassified error
+ common.warning(_("Can't create the "
+ "database, caused by an unknown reason.\n"
+ "If there is a database created, it could "
+ "be broken. Maybe drop this database! "
+ "Please check the error message for "
+ "possible informations.\n"
+ "Error message:\n")
+ + str(exception.faultCode),
+ _("Error creating database!"))
parent.present()
self.dialog.destroy()
- if self.sig_login:
- CONFIG['login.server'] = host
- CONFIG['login.port'] = port
- CONFIG['login.db'] = dbname
- CONFIG['login.login'] = 'admin'
- self.sig_login()
+ rpc.logout()
break
-
+ parent.present()
+ self.dialog.destroy()
+ if self.sig_login:
+ CONFIG['login.server'] = host
+ CONFIG['login.port'] = str(port)
+ CONFIG['login.db'] = dbname
+ CONFIG['login.login'] = 'admin'
+ self.sig_login()
+ break
break
parent.present()
self.dialog.destroy()
diff --git a/tryton/gui/window/dblogin.py b/tryton/gui/window/dblogin.py
index 272d95e..5a6cae6 100644
--- a/tryton/gui/window/dblogin.py
+++ b/tryton/gui/window/dblogin.py
@@ -528,9 +528,9 @@ class DBLogin(object):
def clear_profile_combo(self, entry, event):
netloc = self.entry_host.get_text()
- host = self.get_hostname(netloc)
+ host = common.get_hostname(netloc)
try:
- port = str(self.get_port(netloc))
+ port = str(common.get_port(netloc))
except ValueError:
host = ''
port = ''
@@ -555,21 +555,6 @@ class DBLogin(object):
self.entry_database.props.visible = visibility
self.label_database.props.visible = visibility
- def get_hostname(self, netloc):
- if '[' in netloc and ']' in netloc:
- return netloc.split(']')[0][1:]
- elif ':' in netloc:
- return netloc.split(':')[0]
- else:
- return netloc
-
- def get_port(self, netloc):
- netloc = netloc.split(']')[-1]
- if ':' in netloc:
- return int(netloc.split(':')[1])
- else:
- return 8000
-
def run(self):
profile_name = CONFIG['login.profile']
can_use_profile = self.profiles.has_section(profile_name)
@@ -620,9 +605,9 @@ class DBLogin(object):
profile = self.profile_store[active_profile][0]
CONFIG['login.profile'] = profile
netloc = self.entry_host.get_text()
- host = self.get_hostname(netloc)
+ host = common.get_hostname(netloc)
try:
- port = self.get_port(netloc)
+ port = common.get_port(netloc)
except ValueError:
continue
try:
diff --git a/tryton/gui/window/form.py b/tryton/gui/window/form.py
index 76caded..e347dd8 100644
--- a/tryton/gui/window/form.py
+++ b/tryton/gui/window/form.py
@@ -273,6 +273,10 @@ class Form(SignalEvent, TabContent):
return
revision = self.screen.context.get('_datetime')
revision = Revision(revisions, revision).run()
+ # Prevent too old revision in form view
+ if (self.screen.current_view.view_type == 'form'
+ and revision < revisions[-1][0]):
+ revision = revisions[-1][0]
if revision != self.screen.context.get('_datetime'):
self.screen.clear()
# Update root group context that will be propagated
@@ -311,20 +315,13 @@ class Form(SignalEvent, TabContent):
self.message_info(_('Records removed!'), 'green')
def sig_import(self, widget=None):
- while(self.screen.view_to_load):
- self.screen.load_view_to_load()
- fields = {}
- for name, field in self.screen.group.fields.iteritems():
- fields[name] = field.attrs
WinImport(self.model, self.screen.context)
def sig_save_as(self, widget=None):
- while self.screen.view_to_load:
- self.screen.load_view_to_load()
- fields = {}
- for name, field in self.screen.group.fields.iteritems():
- fields[name] = field.attrs
- WinExport(self.model, self.ids_get(), context=self.screen.context)
+ export = WinExport(self.model, self.ids_get(),
+ context=self.screen.context)
+ for name in self.screen.current_view.get_fields():
+ export.sel_field(name)
def sig_new(self, widget=None, autosave=True):
if not common.MODELACCESS[self.model]['create']:
@@ -346,6 +343,9 @@ class Form(SignalEvent, TabContent):
'green')
def sig_save(self, widget=None):
+ if widget:
+ # Called from button so we must save the tree state
+ self.screen.save_tree_state()
if not common.MODELACCESS[self.model]['write']:
return
if self.screen.save_current():
@@ -370,11 +370,13 @@ class Form(SignalEvent, TabContent):
self.activate_save()
def sig_reload(self, test_modified=True):
- if test_modified and not self.modified_save():
+ if test_modified:
+ if not self.modified_save():
return False
+ else:
+ self.screen.save_tree_state(store=False)
self.screen.cancel_current()
set_cursor = False
- self.screen.save_tree_state(store=False)
record_id = (self.screen.current_record.id
if self.screen.current_record else None)
if self.screen.current_view.view_type != 'form':
diff --git a/tryton/gui/window/view_board/action.py b/tryton/gui/window/view_board/action.py
index 77b17c0..747815d 100644
--- a/tryton/gui/window/view_board/action.py
+++ b/tryton/gui/window/view_board/action.py
@@ -94,7 +94,7 @@ class Action(SignalEvent):
return
if (self.screen.current_view.view_type == 'tree' and
- self.screen.current_view.widget_tree.keyword_open):
+ self.screen.current_view.treeview.keyword_open):
GenericAction.exec_keyword('tree_open', {
'model': self.screen.model_name,
'id': self.screen.id_get(),
diff --git a/tryton/gui/window/view_board/parser.py b/tryton/gui/window/view_board/parser.py
deleted file mode 100644
index e22021c..0000000
--- a/tryton/gui/window/view_board/parser.py
+++ /dev/null
@@ -1,161 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-'Parser'
-import gtk
-import gettext
-from tryton.gui.window.view_form.view.form_gtk.parser import _container, VBox
-import tryton.common as common
-from action import Action
-from tryton.config import CONFIG
-
-_ = gettext.gettext
-
-
-class ParserBoard(object):
-
- def __init__(self, context=None):
- self.title = None
- self.context = context
-
- def parse(self, root_node, notebook=None, paned=None, tooltips=None):
- widgets = []
-
- attrs = common.node_attributes(root_node)
- if not tooltips:
- tooltips = common.Tooltips()
-
- container = _container(tooltips)
- container.new(col=int(attrs.get('col', 4)))
-
- if not self.title:
- self.title = attrs.get('string', 'Unknown')
-
- for node in root_node.childNodes:
- if not node.nodeType == node.ELEMENT_NODE:
- continue
- attrs = common.node_attributes(node)
- yexpand = int(attrs.get('yexpand', 0))
- yfill = int(attrs.get('yfill', 0))
- xexpand = int(attrs.get('xexpand', 1))
- xfill = int(attrs.get('xfill', 1))
- colspan = int(attrs.get('colspan', 1))
- if node.localName == 'image':
- common.ICONFACTORY.register_icon(attrs['name'])
- icon = gtk.Image()
- icon.set_from_stock(attrs['name'], gtk.ICON_SIZE_DIALOG)
- container.wid_add(icon,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill, ypadding=10,
- xexpand=xexpand, xfill=xfill)
- elif node.localName == 'separator':
- text = attrs.get('string', '')
- vbox = VBox(attrs=attrs)
- if text:
- label = gtk.Label(text)
- label.set_use_markup(True)
- label.set_alignment(float(attrs.get('align', 0.0)), 0.5)
- vbox.pack_start(label)
- vbox.pack_start(gtk.HSeparator())
- container.wid_add(vbox,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill, ypadding=10,
- xexpand=xexpand, xfill=xfill)
- elif node.localName == 'label':
- text = attrs.get('string', '')
- if not text:
- container.empty_add(int(attrs.get('colspan', 1)))
- continue
- label = gtk.Label(text)
- label.set_use_markup(True)
- label.set_alignment(float(attrs.get('xalign', 1.0)),
- float(attrs.get('yalign', 0.0)))
- label.set_angle(int(attrs.get('angle', 0)))
- xexpand = bool(attrs.get('xexpand', 0))
- container.wid_add(label,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill,
- xexpand=xexpand, xfill=xfill)
- elif node.localName == 'newline':
- container.newline()
- elif node.localName == 'notebook':
- notebook = gtk.Notebook()
- if CONFIG['client.form_tab'] == 'top':
- pos = gtk.POS_TOP
- elif CONFIG['client.form_tab'] == 'left':
- pos = gtk.POS_LEFT
- elif CONFIG['client.form_tab'] == 'right':
- pos = gtk.POS_RIGHT
- elif CONFIG['client.form_tab'] == 'bottom':
- pos = gtk.POS_BOTTOM
- notebook.set_tab_pos(pos)
- notebook.set_border_width(3)
- container.wid_add(notebook,
- colspan=int(attrs.get('colspan', 4)),
- yexpand=True, yfill=True)
- widget, new_widgets = self.parse(node, notebook,
- tooltips=tooltips)
- widgets += new_widgets
- elif node.localName == 'page':
- if CONFIG['client.form_tab'] == 'left':
- angle = 90
- elif CONFIG['client.form_tab'] == 'right':
- angle = -90
- else:
- angle = 0
- label = gtk.Label(attrs.get('string', _('No String Attr.')))
- label.set_angle(angle)
- widget, new_widgets = self.parse(node, notebook,
- tooltips=tooltips)
- widgets += new_widgets
- notebook.append_page(widget, label)
- elif node.localName == 'group':
- widget, new_widgets = self.parse(node, tooltips=tooltips)
- widgets += new_widgets
- if attrs.get('string', None):
- frame = gtk.Frame(attrs['string'])
- frame.add(widget)
- else:
- frame = widget
- container.wid_add(frame,
- colspan=colspan,
- yexpand=yexpand, yfill=yfill, ypadding=0,
- xexpand=xexpand, xfill=xfill, xpadding=0)
- elif node.localName == 'hpaned':
- hpaned = gtk.HPaned()
- container.wid_add(hpaned, colspan=int(attrs.get('colspan', 4)),
- yexpand=True, yfill=True)
- widget, new_widgets = self.parse(node, paned=hpaned,
- tooltips=tooltips)
- widgets += new_widgets
- if 'position' in attrs:
- hpaned.set_position(int(attrs['position']))
- elif node.localName == 'vpaned':
- vpaned = gtk.VPaned()
- container.wid_add(vpaned, colspan=int(attrs.get('colspan', 4)),
- yexpand=True, yfill=True)
- widget, new_widgets = self.parse(node, paned=vpaned,
- tooltips=tooltips)
- widgets += new_widgets
- if 'position' in attrs:
- vpaned.set_position(int(attrs['position']))
- elif node.localName == 'child':
- widget, new_widgets = self.parse(node, paned=paned,
- tooltips=tooltips)
- widgets += new_widgets
- if not paned.get_child1():
- paned.pack1(widget, resize=True, shrink=True)
- elif not paned.get_child2():
- paned.pack2(widget, resize=True, shrink=True)
- elif node.localName == 'action':
- widget_act = Action(attrs, self.context)
- widgets.append(widget_act)
- yexpand = bool(attrs.get('yexpand', 1))
- yfill = bool(attrs.get('yfill', 1))
- container.wid_add(widget_act.widget,
- colspan=colspan,
- yexpand=yexpand, yfill=yfill,
- xexpand=xexpand, xfill=xfill)
- return container.pop(), widgets
diff --git a/tryton/gui/window/view_board/view_board.py b/tryton/gui/window/view_board/view_board.py
index 688e0cf..10d3ddb 100644
--- a/tryton/gui/window/view_board/view_board.py
+++ b/tryton/gui/window/view_board/view_board.py
@@ -1,10 +1,15 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-'View board'
+import gtk
+import gettext
import xml.dom.minidom
-from parser import ParserBoard
-from tryton.gui.window.view_board.action import Action
+from tryton.gui.window.view_form.view.form import Container
+from tryton.common import node_attributes, ICONFACTORY
+from tryton.config import CONFIG
+from .action import Action
+
+_ = gettext.gettext
class ViewBoard(object):
@@ -12,21 +17,174 @@ class ViewBoard(object):
def __init__(self, arch, context=None):
self.context = context
+ self.widgets = []
+ self.actions = []
xml_dom = xml.dom.minidom.parseString(arch)
- parser = ParserBoard(context)
for node in xml_dom.childNodes:
- if not node.nodeType == node.ELEMENT_NODE:
- continue
- self.widget, self.widgets = parser.parse(node)
- break
- self.actions = [x for x in self.widgets if isinstance(x, Action)]
- for action in self.actions:
- action.signal_connect(self, 'active-changed',
- self._active_changed)
+ if node.nodeType == node.ELEMENT_NODE:
+ break
+
+ self.attributes = node_attributes(node)
+ self.widget = self.parse(node).table
self.widget.show_all()
+
self._active_changed(None)
+ def parse(self, node, container=None):
+ if not container:
+ node_attrs = node_attributes(node)
+ container = Container(int(node_attrs.get('col', 4)))
+ for node in node.childNodes:
+ if node.nodeType != node.ELEMENT_NODE:
+ continue
+ node_attrs = node_attributes(node)
+ for i_field in ('yexpand', 'yfill', 'xexpand', 'xfill', 'colspan',
+ 'position'):
+ if i_field in node_attrs:
+ node_attrs[i_field] = int(node_attrs[i_field])
+
+ parser = getattr(self, '_parse_%s' % node.tagName)
+ parser(node, container, node_attrs)
+ return container
+
+ def _parse_image(self, node, container, attributes):
+ ICONFACTORY.register_icon(attributes['name'])
+ image = gtk.Image()
+ image.set_from_stock(attributes['name'], gtk.ICON_SIZE_DIALOG)
+ container.add(image, attributes)
+
+ def _parse_separator(self, node, container, attributes):
+ vbox = gtk.VBox()
+ if attributes.get('string'):
+ label = gtk.Label(attributes['string'])
+ label.set_alignment(float(attributes.get('xalign', 0.0)),
+ float(attributes.get('yalign', 0.5)))
+ vbox.pack_start(label)
+ vbox.pack_start(gtk.HSeparator())
+ container.add(vbox, attributes)
+
+ def _parse_label(self, node, container, attributes):
+ if not attributes.get('string'):
+ container.add(None, attributes)
+ return
+ label = gtk.Label(attributes['string'])
+ label.set_alignment(float(attributes.get('xalign', 0.0)),
+ float(attributes.get('yalign', 0.5)))
+ label.set_angle(int(attributes.get('angle', 0)))
+ attributes.setdefault('xexpand', 0)
+ container.add(label, attributes)
+
+ def _parse_newline(self, node, container, attributes):
+ container.add_row()
+
+ def _parse_notebook(self, node, container, attributes):
+ attributes.setdefault('yexpand', True)
+ attributes.setdefault('yfill', True)
+ notebook = gtk.Notebook()
+ notebook.set_scrollable(True)
+ positions = {
+ 'top': gtk.POS_TOP,
+ 'left': gtk.POS_LEFT,
+ 'right': gtk.POS_RIGHT,
+ 'bottom': gtk.POS_BOTTOM,
+ }
+ notebook.set_tab_pos(positions[CONFIG['client.form_tab']])
+ container.add(notebook, attributes)
+ self.parse(node, notebook)
+
+ def _parse_page(self, node, notebook, attributes):
+ if CONFIG['client.form_tab'] == 'left':
+ angle = 90
+ tab_box = gtk.VBox(spacing=3)
+ image_pos, image_rotate = ('end',
+ gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE)
+ elif CONFIG['client.form_tab'] == 'right':
+ angle = -90
+ tab_box = gtk.VBox(spacing=3)
+ image_pos, image_rotate = ('start',
+ gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
+ else:
+ angle = 0
+ tab_box = gtk.HBox(spacing=3)
+ image_pos, image_rotate = ('start',
+ gtk.gdk.PIXBUF_ROTATE_NONE)
+ if '_' not in attributes['string']:
+ attributes['string'] = '_' + attributes['string']
+ label = gtk.Label(attributes['string'])
+ label.set_angle(angle)
+ label.set_use_underline(True)
+ tab_box.pack_start(label)
+
+ if 'icon' in attributes:
+ ICONFACTORY.register_icon(attributes['icon'])
+ pixbuf = tab_box.render_icon(attributes['icon'],
+ gtk.ICON_SIZE_SMALL_TOOLBAR)
+ pixbuf = pixbuf.rotate_simple(image_rotate)
+ icon = gtk.Image()
+ icon.set_from_pixbuf(pixbuf)
+ if image_pos == 'end':
+ tab_box.pack_end(icon)
+ else:
+ tab_box.pack_start(icon)
+ tab_box.show_all()
+
+ viewport = gtk.Viewport()
+ viewport.set_shadow_type(gtk.SHADOW_NONE)
+ scrolledwindow = gtk.ScrolledWindow()
+ scrolledwindow.set_shadow_type(gtk.SHADOW_NONE)
+ scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ scrolledwindow.add(viewport)
+ scrolledwindow.show_all()
+ notebook.append_page(scrolledwindow, tab_box)
+ container = self.parse(node)
+ viewport.add(container.table)
+
+ def _parse_group(self, node, container, attributes):
+ group = self.parse(node)
+ group.table.set_homogeneous(attributes.get('homogeneous', False))
+ frame = gtk.Frame(attributes.get('string'))
+ if not attributes.get('string'):
+ frame.set_shadow_type(gtk.SHADOW_NONE)
+ frame.set_border_width(0)
+ frame.add(group.table)
+ container.add(frame, attributes)
+
+ def _parse_paned(self, node, container, attributes, Paned):
+ attributes.setdefault('yexpand', True)
+ attributes.setdefault('yfill', True)
+ paned = Paned()
+ if 'position' in attributes:
+ paned.set_position(attributes['position'])
+ container.add(paned, attributes)
+ self.parse(node, paned)
+
+ def _parse_hpaned(self, node, container, attributes):
+ self._parse_paned(node, container, attributes, gtk.HPaned)
+
+ def _parse_vpaned(self, node, container, attributes):
+ self._parse_paned(node, container, attributes, gtk.VPaned)
+
+ def _parse_child(self, node, paned, attributes):
+ container = self.parse(node)
+ if not paned.get_child1():
+ pack = paned.pack1
+ else:
+ pack = paned.pack2
+ pack(container.table, resize=True, shrink=True)
+
+ def _parse_action(self, node, container, attributes):
+ attributes.setdefault('yexpand', True)
+ attributes.setdefault('yfill', True)
+ action = Action(attributes, self.context)
+ action.signal_connect(self, 'active-changed', self._active_changed)
+ self.actions.append(action)
+ container.add(action.widget, attributes)
+
+ @property
+ def title(self):
+ self.attributes.get('string', '')
+
def widget_get(self):
return self.widget
diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py
index 452d573..24ae6aa 100644
--- a/tryton/gui/window/view_form/model/field.py
+++ b/tryton/gui/window/view_form/model/field.py
@@ -37,13 +37,14 @@ class Field(object):
def sig_changed(self, record):
if self.get_state_attrs(record).get('readonly', False):
return
- if self.attrs.get('on_change', False):
- record.on_change(self.name, self.attrs['on_change'])
- record.on_change_with(self.name)
+ record.on_change([self.name])
+ record.on_change_with([self.name])
record.autocomplete_with(self.name)
+ record.set_field_context()
- def domains_get(self, record):
- screen_domain = domain_inversion(record.group.domain4inversion,
+ def domains_get(self, record, pre_validate=None):
+ screen_domain = domain_inversion(
+ [record.group.domain4inversion, pre_validate or []],
self.name, EvalEnvironment(record))
if isinstance(screen_domain, bool) and not screen_domain:
screen_domain = [('id', '=', None)]
@@ -56,8 +57,8 @@ class Field(object):
screen_domain, attr_domain = self.domains_get(record)
return concat(localize_domain(screen_domain), attr_domain)
- def validation_domains(self, record):
- return concat(*self.domains_get(record))
+ def validation_domains(self, record, pre_validate=None):
+ return concat(*self.domains_get(record, pre_validate))
def context_get(self, record):
context = record.context_get().copy()
@@ -74,12 +75,12 @@ class Field(object):
return False
return True
- def validate(self, record, softvalidation=False):
+ def validate(self, record, softvalidation=False, pre_validate=None):
if self.attrs.get('readonly'):
return True
res = True
self.get_state_attrs(record)['domain_readonly'] = False
- domain = simplify(self.validation_domains(record))
+ domain = simplify(self.validation_domains(record, pre_validate))
if not softvalidation:
res = res and self.check_required(record)
if isinstance(domain, bool):
@@ -155,7 +156,7 @@ class Field(object):
def set_on_change(self, record, value):
record.modified_fields.setdefault(self.name)
- return self.set(record, value)
+ self.set(record, value)
def state_set(self, record, states=('readonly', 'required', 'invisible')):
state_changes = record.expr_eval(self.attrs.get('states', {}))
@@ -377,13 +378,6 @@ class M2OField(Field):
_default = None
- def get(self, record):
- value = record.value.get(self.name)
- if (record.parent_name == self.name
- and self.attrs['relation'] == record.group.parent.model_name):
- value = record.parent.id if record.parent else None
- return value
-
def get_client(self, record):
rec_name = record.value.get(self.name + '.rec_name')
if rec_name is None:
@@ -405,30 +399,15 @@ class M2OField(Field):
def set(self, record, value):
rec_name = record.value.get(self.name + '.rec_name') or ''
- if value is False:
- value = None
- if (record.parent_name == self.name
- and self.attrs['relation'] == record.group.parent.model_name):
- if record.parent:
- value = record.parent.id
- if 'rec_name' in record.parent.value:
- rec_name = record.parent.value['rec_name'] or ''
- else:
- value = None
if not rec_name and value >= 0:
try:
result, = RPCExecute('model', self.attrs['relation'], 'read',
[value], ['rec_name'])
except RPCException:
- return False
+ return
rec_name = result['rec_name'] or ''
record.value[self.name + '.rec_name'] = rec_name
record.value[self.name] = value
- if (record.parent_name == self.name
- and self.attrs['relation'] == record.group.parent.model_name):
- if record.parent:
- if 'rec_name' not in record.parent.value:
- record.parent.value['rec_name'] = rec_name
def context_get(self, record):
context = super(M2OField, self).context_get(record)
@@ -437,8 +416,8 @@ class M2OField(Field):
)[self.attrs.get('datetime_field')]
return context
- def validation_domains(self, record):
- screen_domain, attr_domain = self.domains_get(record)
+ def validation_domains(self, record, pre_validate=None):
+ screen_domain, attr_domain = self.domains_get(record, pre_validate)
return screen_domain
def domain_get(self, record):
@@ -446,13 +425,11 @@ class M2OField(Field):
return concat(localize_domain(inverse_leaf(screen_domain), self.name),
attr_domain)
- def get_state_attrs(self, record):
- result = super(M2OField, self).get_state_attrs(record)
- if (record.parent_name == self.name
- and self.attrs['relation'] == record.group.parent.model_name):
- result = result.copy()
- result['readonly'] = True
- return result
+ def get_on_change_value(self, record):
+ if record.parent_name == self.name and record.parent:
+ return record.parent.get_on_change_value(
+ skip={record.group.child_name})
+ return super(M2OField, self).get_on_change_value(record)
class O2OField(M2OField):
@@ -469,7 +446,6 @@ class O2MField(Field):
def __init__(self, attrs):
super(O2MField, self).__init__(attrs)
self.in_on_change = False
- self.context = {}
def sig_changed(self, record):
if not self.in_on_change:
@@ -504,11 +480,12 @@ class O2MField(Field):
from group import Group
parent_name = self.attrs.get('relation_field', '')
fields = fields or {}
+ context = record.expr_eval(self.attrs.get('context', {}))
group = Group(self.attrs['relation'], fields,
parent=record,
parent_name=parent_name,
child_name=self.name,
- context=self.context,
+ context=context,
parent_datetime_field=self.attrs.get('datetime_field'))
if not fields and record.model_name == self.attrs['relation']:
group.fields = record.group.fields
@@ -586,7 +563,8 @@ class O2MField(Field):
for record2 in record.value[self.name]:
if not (record2.deleted or record2.removed):
result.append(
- record2.get_on_change_value())
+ record2.get_on_change_value(
+ skip={self.attrs.get('relation_field', '')}))
return result
def _set_value(self, record, value, default=False):
@@ -671,11 +649,12 @@ class O2MField(Field):
record.modified_fields.setdefault(self.name)
def set_on_change(self, record, value):
+ self._set_default_value(record)
if isinstance(value, (list, tuple)):
self._set_value(record, value)
record.modified_fields.setdefault(self.name)
record.signal('record-modified')
- return True
+ return
if value and (value.get('add') or value.get('update')):
context = self.context_get(record)
@@ -689,7 +668,7 @@ class O2MField(Field):
fields = RPCExecute('model', self.attrs['relation'],
'fields_get', list(field_names), context=context)
except RPCException:
- return False
+ return
else:
fields = {}
@@ -710,8 +689,10 @@ class O2MField(Field):
record.value[self.name].add_fields(fields, signal=False)
for index, vals in value.get('add', []):
new_record = record.value[self.name].new(default=False)
- record.value[self.name].add(new_record, index)
+ record.value[self.name].add(new_record, index, signal=False)
new_record.set_on_change(vals)
+ if value.get('add'):
+ record.value[self.name].signal('group-changed', new_record)
for vals in value.get('update', []):
if 'id' not in vals:
@@ -719,28 +700,32 @@ class O2MField(Field):
record2 = record.value[self.name].get(vals['id'])
if record2 is not None:
record2.set_on_change(vals)
- return True
- def validation_domains(self, record):
- screen_domain, attr_domain = self.domains_get(record)
+ def validation_domains(self, record, pre_validate=None):
+ screen_domain, attr_domain = self.domains_get(record, pre_validate)
return screen_domain
- def validate(self, record, softvalidation=False):
+ def validate(self, record, softvalidation=False, pre_validate=None):
if self.attrs.get('readonly'):
return True
- res = True
+ test = True
+ ldomain = localize_domain(domain_inversion(
+ record.group.clean4inversion(pre_validate or []), self.name,
+ EvalEnvironment(record)), self.name)
+ if isinstance(ldomain, bool):
+ if ldomain:
+ ldomain = []
+ else:
+ ldomain = [('id', '=', None)]
for record2 in record.value.get(self.name, []):
if not record2.loaded and record2.id >= 0:
continue
- if not record2.validate(softvalidation=softvalidation):
- if not record2.modified:
- record.value[self.name].remove(record2)
- else:
- res = False
- if not super(O2MField, self).validate(record, softvalidation):
- res = False
- self.get_state_attrs(record)['valid'] = res
- return res
+ test &= record2.validate(softvalidation=softvalidation,
+ pre_validate=ldomain)
+ test &= super(O2MField, self).validate(record, softvalidation,
+ pre_validate)
+ self.get_state_attrs(record)['valid'] = test
+ return test
def state_set(self, record, states=('readonly', 'required', 'invisible')):
self._set_default_value(record)
@@ -776,12 +761,6 @@ class ReferenceField(Field):
return None
def get(self, record):
- if record.parent_name == self.name:
- if record.parent:
- return '%s,%s' % (record.group.parent.model_name,
- record.parent.id)
- else:
- return None
if (record.value.get(self.name)
and record.value[self.name][0]
and record.value[self.name][1] >= -1):
@@ -811,12 +790,6 @@ class ReferenceField(Field):
force_change=force_change)
def set(self, record, value):
- if record.parent_name == self.name:
- if record.parent:
- value = '%s,%s' % (record.group.parent.model_name,
- record.parent.id)
- else:
- value = None
if not value:
record.value[self.name] = self._default
return
@@ -847,6 +820,12 @@ class ReferenceField(Field):
record.value[self.name] = ref_model, ref_id
record.value[self.name + '.rec_name'] = rec_name
+ def get_on_change_value(self, record):
+ if record.parent_name == self.name and record.parent:
+ return record.parent.model_name, record.parent.get_on_change_value(
+ skip={record.group.child_name})
+ return super(ReferenceField, self).get_on_change_value(record)
+
class BinaryField(Field):
@@ -905,11 +884,14 @@ class DictField(Field):
_default = {}
+ def get(self, record):
+ return super(DictField, self).get(record) or self._default
+
def get_client(self, record):
return super(DictField, self).get_client(record) or self._default
- def validation_domains(self, record):
- screen_domain, attr_domain = self.domains_get(record)
+ def validation_domains(self, record, pre_validate=None):
+ screen_domain, attr_domain = self.domains_get(record, pre_validate)
return screen_domain
def domain_get(self, record):
diff --git a/tryton/gui/window/view_form/model/group.py b/tryton/gui/window/view_form/model/group.py
index cea94f5..be82c80 100644
--- a/tryton/gui/window/view_form/model/group.py
+++ b/tryton/gui/window/view_form/model/group.py
@@ -1,9 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from weakref import WeakSet
-
from record import Record
-from field import Field, O2MField
+from field import Field, M2OField, ReferenceField
from tryton.signal_event import SignalEvent
from tryton.common.domain_inversion import is_leaf
from tryton.common import RPCExecute, RPCException, MODELACCESS
@@ -37,7 +35,6 @@ class Group(SignalEvent, list):
self.__id2record = {}
self.__field_childs = None
self.exclude_field = None
- self.pool = WeakSet()
self.skip_model_access = False
if self.parent and self.parent.model_name == model_name:
@@ -80,9 +77,13 @@ class Group(SignalEvent, list):
return [head] + self.clean4inversion(tail)
def __get_domain4inversion(self):
- if self.__domain4inversion is None:
- self.__domain4inversion = self.clean4inversion(self.domain)
- return self.__domain4inversion
+ domain = self.domain
+ if (self.__domain4inversion is None
+ or self.__domain4inversion[0] != domain):
+ self.__domain4inversion = (
+ domain, self.clean4inversion(domain))
+ domain, domain4inversion = self.__domain4inversion
+ return domain4inversion
domain4inversion = property(__get_domain4inversion)
@@ -153,11 +154,6 @@ class Group(SignalEvent, list):
field = Field.get_field(attr['type'])
attr['name'] = name
self.fields[name] = field(attr)
- if isinstance(self.fields[name], O2MField) \
- and '_datetime' in self._context:
- self.fields[name].context.update({
- '_datetime': self._context['_datetime'],
- })
def save(self):
saved = []
@@ -246,7 +242,8 @@ class Group(SignalEvent, list):
self.current_idx = 0
return True
- def _get_context(self):
+ @property
+ def context(self):
ctx = self._context.copy()
if self.parent:
ctx.update(self.parent.context_get())
@@ -259,9 +256,11 @@ class Group(SignalEvent, list):
)[self.parent_datetime_field]
return ctx
- context = property(_get_context)
+ @context.setter
+ def context(self, value):
+ self._context = value.copy()
- def add(self, record, position=-1):
+ def add(self, record, position=-1, signal=True):
if record.group is not self:
record.signal_unconnect(record.group)
record.group = self
@@ -281,7 +280,16 @@ class Group(SignalEvent, list):
self.current_idx = position
record.modified_fields.setdefault('id')
record.signal('record-modified')
- self.signal('group-changed', record)
+ if signal:
+ self.signal('group-changed', record)
+ # Set parent field to trigger on_change
+ if self.parent and self.parent_name in self.fields:
+ field = self.fields[self.parent_name]
+ if isinstance(field, (M2OField, ReferenceField)):
+ value = self.parent.id, ''
+ if isinstance(field, ReferenceField):
+ value = self.parent.model_name, value
+ field.set_client(record, value)
return record
def set_sequence(self, field='sequence'):
diff --git a/tryton/gui/window/view_form/model/record.py b/tryton/gui/window/view_form/model/record.py
index 3241c0c..e47cfb8 100644
--- a/tryton/gui/window/view_form/model/record.py
+++ b/tryton/gui/window/view_form/model/record.py
@@ -36,7 +36,6 @@ class Record(SignalEvent):
self.autocompletion = {}
self.exception = False
self.destroyed = False
- self.pool.add(self)
def __getitem__(self, name):
if name not in self._loaded and self.id >= 0:
@@ -73,43 +72,39 @@ class Record(SignalEvent):
record_context = self.context_get()
if loading == 'eager':
- limit = CONFIG['client.limit']
- if not self.parent:
- # If not a children no need to load too much
- limit = int(limit / len(fnames))
+ limit = int(CONFIG['client.limit'] / len(fnames))
def filter_group(record):
return name not in record._loaded and record.id >= 0
- def filter_pool(record):
+ def filter_parent_group(record):
return (filter_group(record)
and record.id not in id2record
- and record.context_get() == record_context)
+ and ((record.group == self.group)
+ # Don't compute context for same group
+ or (record.context_get() == record_context)))
if self.parent:
- pool = list(self.pool)
+ group = sum(self.parent.group.children, [])
+ filter_ = filter_parent_group
else:
- # Don't look at the pool if it is the root
- pool = []
- for group, filter_ in (
- (self.group, filter_group),
- (pool, filter_pool),
- ):
- if self in group:
- idx = group.index(self)
- length = len(group)
- n = 1
- while len(id2record) < limit and (idx - n >= 0
- or idx + n < length) and n < 2 * limit:
- if idx - n >= 0:
- record = group[idx - n]
- if filter_(record):
- id2record[record.id] = record
- if idx + n < length:
- record = group[idx + n]
- if filter_(record):
- id2record[record.id] = record
- n += 1
+ group = self.group
+ filter_ = filter_group
+ if self in group:
+ idx = group.index(self)
+ length = len(group)
+ n = 1
+ while len(id2record) < limit and (idx - n >= 0
+ or idx + n < length) and n < 2 * limit:
+ if idx - n >= 0:
+ record = group[idx - n]
+ if filter_(record):
+ id2record[record.id] = record
+ if idx + n < length:
+ record = group[idx + n]
+ if filter_(record):
+ id2record[record.id] = record
+ n += 1
ctx = record_context.copy()
ctx.update(dict(('%s.%s' % (self.model_name, fname), 'size')
@@ -144,14 +139,6 @@ class Record(SignalEvent):
return bool(self.modified_fields)
@property
- def pool(self):
- group = self.group
- while (group.parent is not None
- and group.parent.model_name == self.model_name):
- group = group.parent
- return group.pool
-
- @property
def parent(self):
return self.group.parent
@@ -267,10 +254,14 @@ class Record(SignalEvent):
value['id'] = self.id
return value
- def get_on_change_value(self):
+ def get_on_change_value(self, skip=None):
value = {}
for name, field in self.group.fields.iteritems():
- if name not in self._loaded and self.id >= 0:
+ if skip and name in skip:
+ continue
+ if (self.id >= 0
+ and (name not in self._loaded
+ or name not in self.modified_fields)):
continue
value[name] = field.get_on_change_value(self)
value['id'] = self.id
@@ -387,7 +378,7 @@ class Record(SignalEvent):
except RPCException:
return ''
- def validate(self, fields=None, softvalidation=False):
+ def validate(self, fields=None, softvalidation=False, pre_validate=None):
if isinstance(fields, list) and fields:
self._check_load(fields)
elif fields is None:
@@ -400,7 +391,7 @@ class Record(SignalEvent):
continue
if field_name == self.group.exclude_field:
continue
- if not field.validate(self, softvalidation):
+ if not field.validate(self, softvalidation, pre_validate):
res = False
return res
@@ -417,6 +408,7 @@ class Record(SignalEvent):
return self.group.context
def set_default(self, val, signal=True):
+ fieldnames = []
for fieldname, value in val.items():
if fieldname not in self.group.fields:
continue
@@ -431,6 +423,9 @@ class Record(SignalEvent):
del self.value[field_rec_name]
self.group.fields[fieldname].set_default(self, value)
self._loaded.add(fieldname)
+ fieldnames.append(fieldname)
+ self.on_change(fieldnames)
+ self.on_change_with(fieldnames)
self.validate(softvalidation=True)
if signal:
self.signal('record-changed')
@@ -528,18 +523,25 @@ class Record(SignalEvent):
res['id'] = self.id
return res
- def on_change(self, fieldname, attr):
- if isinstance(attr, basestring):
- attr = PYSONDecoder().decode(attr)
- args = self._get_on_change_args(attr)
- try:
- res = RPCExecute('model', self.model_name, 'on_change_' +
- fieldname, args, context=self.context_get())
- except RPCException:
- return
- self.set_on_change(res)
+ def on_change(self, fieldnames):
+ values = {}
+ for fieldname in fieldnames:
+ on_change = self.group.fields[fieldname].attrs.get('on_change')
+ if not on_change:
+ continue
+ values.update(self._get_on_change_args(on_change))
+
+ if values:
+ try:
+ changes = RPCExecute('model', self.model_name, 'on_change',
+ values, fieldnames, context=self.context_get())
+ except RPCException:
+ return
+ for change in changes:
+ self.set_on_change(change)
- def on_change_with(self, field_name):
+ def on_change_with(self, field_names):
+ field_names = set(field_names)
fieldnames = set()
values = {}
later = set()
@@ -548,9 +550,7 @@ class Record(SignalEvent):
'on_change_with')
if not on_change_with:
continue
- if field_name not in on_change_with:
- continue
- if field_name == fieldname:
+ if not field_names & set(on_change_with):
continue
if fieldnames & set(on_change_with):
later.add(fieldname)
@@ -600,6 +600,16 @@ class Record(SignalEvent):
res = []
self.autocompletion[fieldname] = res
+ def set_field_context(self):
+ from .group import Group
+ for name, field in self.group.fields.iteritems():
+ value = self.value.get(name)
+ if not isinstance(value, Group):
+ continue
+ context = field.attrs.get('context')
+ if context:
+ value.context = self.expr_eval(context)
+
def get_attachment_count(self, reload=False):
if self.id < 0:
return 0
@@ -615,11 +625,8 @@ class Record(SignalEvent):
return self.attachment_count
def destroy(self):
- # Get reference to pool before unref group
- pool = self.pool
for v in self.value.itervalues():
if hasattr(v, 'destroy'):
v.destroy()
super(Record, self).destroy()
self.destroyed = True
- pool.remove(self)
diff --git a/tryton/gui/window/view_form/screen/screen.py b/tryton/gui/window/view_form/screen/screen.py
index c495db1..be8368a 100644
--- a/tryton/gui/window/view_form/screen/screen.py
+++ b/tryton/gui/window/view_form/screen/screen.py
@@ -18,6 +18,7 @@ import logging
from tryton.gui.window.view_form.model.group import Group
from tryton.gui.window.view_form.view.screen_container import ScreenContainer
+from tryton.gui.window.view_form.view import View
from tryton.signal_event import SignalEvent
from tryton.config import CONFIG
from tryton.exceptions import TrytonServerError, TrytonServerUnavailable
@@ -276,8 +277,8 @@ class Screen(SignalEvent):
if hasattr(view, 'group_list_changed'):
view.group_list_changed(group, signal)
- def _record_modified(self, group, signal, *args):
- self.signal('record-modified')
+ def _record_modified(self, group, signal):
+ self.signal('record-modified', signal)
def _group_changed(self, group, record):
if not self.parent:
@@ -329,7 +330,7 @@ class Screen(SignalEvent):
def default_row_activate(self):
if (self.current_view.view_type == 'tree' and
- self.current_view.widget_tree.keyword_open):
+ self.current_view.attributes.get('keyword_open')):
return Action.exec_keyword('tree_open', {
'model': self.model_name,
'id': self.id_get(),
@@ -372,7 +373,8 @@ class Screen(SignalEvent):
break
self.screen_container.set(self.current_view.widget)
self.display()
- self.set_cursor()
+ # Postpone set of the cursor to ensure widgets are allocated
+ gobject.idle_add(self.set_cursor)
def load_view_to_load(self):
if len(self.view_to_load):
@@ -402,14 +404,13 @@ class Screen(SignalEvent):
view_id = view['view_id']
xml_dom = xml.dom.minidom.parseString(arch)
- for node in xml_dom.childNodes:
- if node.localName == 'tree':
- self.fields_view_tree = view
- break
+ root, = xml_dom.childNodes
+ if root.tagName == 'tree':
+ self.fields_view_tree = view
# Ensure that loading is always lazy for fields on form view
# and always eager for fields on tree or graph view
- if node.localName == 'form':
+ if root.tagName == 'form':
loading = 'lazy'
else:
loading = 'eager'
@@ -419,18 +420,11 @@ class Screen(SignalEvent):
else:
fields[field]['loading'] = \
self.group.fields[field].attrs['loading']
-
- children_field = view.get('field_childs')
-
- from tryton.gui.window.view_form.view.widget_parse import WidgetParse
self.group.add_fields(fields)
-
- parser = WidgetParse(parent=self.parent)
- view = parser.parse(self, xml_dom, self.group.fields,
- children_field=children_field)
+ view = View.parse(self, xml_dom, view.get('field_childs'))
view.view_id = view_id
-
self.views.append(view)
+
return view
def new(self, default=True):
@@ -451,14 +445,14 @@ class Screen(SignalEvent):
previous_view.set_default_date(record, selected_date)
self.current_record = record
self.display()
- self.set_cursor(new=True)
+ # Postpone set of the cursor to ensure widgets are allocated
+ gobject.idle_add(self.set_cursor, True)
return self.current_record
def new_model_position(self):
position = -1
if (self.current_view and self.current_view.view_type == 'tree'
- and hasattr(self.current_view.widget_tree, 'editable')
- and self.current_view.widget_tree.editable == 'top'):
+ and self.current_view.attributes.get('editable') == 'top'):
position = 0
return position
@@ -609,53 +603,81 @@ class Screen(SignalEvent):
def set_tree_state(self):
view = self.current_view
- if (not CONFIG['client.save_tree_state']
- or not view
- or view.view_type != 'tree'
- or not self.group):
+ if view.view_type not in ('tree', 'form'):
return
if id(view) in self.tree_states_done:
return
+ if view.view_type == 'form' and self.tree_states_done:
+ return
parent = self.parent.id if self.parent else None
+ expanded_nodes, selected_nodes = [], []
+ timestamp = self.parent._timestamp if self.parent else None
state = self.tree_states[parent][view.children_field]
- if state is None:
+ if state:
+ state_timestamp, expanded_nodes, selected_nodes = state
+ if (timestamp != state_timestamp
+ and view.view_type != 'form'):
+ state = None
+ if state is None and CONFIG['client.save_tree_state']:
json_domain = self.get_tree_domain(parent)
try:
expanded_nodes, selected_nodes = RPCExecute('model',
'ir.ui.view_tree_state', 'get',
self.model_name, json_domain,
- self.current_view.children_field)
+ view.children_field)
expanded_nodes = json.loads(expanded_nodes)
selected_nodes = json.loads(selected_nodes)
except RPCException:
logging.getLogger(__name__).warn(
_('Unable to get view tree state'))
- expanded_nodes = []
- selected_nodes = []
self.tree_states[parent][view.children_field] = (
- expanded_nodes, selected_nodes)
+ timestamp, expanded_nodes, selected_nodes)
+ if view.view_type == 'tree':
+ view.expand_nodes(expanded_nodes)
+ view.select_nodes(selected_nodes)
else:
- expanded_nodes, selected_nodes = state
- view.expand_nodes(expanded_nodes)
- view.select_nodes(selected_nodes)
+ if selected_nodes:
+ record = None
+ for node in selected_nodes[0]:
+ new_record = self.group.get(node)
+ if node < 0 and -node < len(self.group):
+ # Negative id is the index of the new record
+ new_record = self.group[-node]
+ if not new_record:
+ break
+ else:
+ record = new_record
+ if record and record != self.current_record:
+ self.current_record = record
+ # Force a display of the view to synchronize the
+ # widgets with the new record
+ view.display()
self.tree_states_done.add(id(view))
def save_tree_state(self, store=True):
if not CONFIG['client.save_tree_state']:
return
+ parent = self.parent.id if self.parent else None
+ timestamp = self.parent._timestamp if self.parent else None
for view in self.views:
if view.view_type == 'form':
for widgets in view.widgets.itervalues():
for widget in widgets:
if hasattr(widget, 'screen'):
widget.screen.save_tree_state(store)
- elif (view.view_type == 'tree' and view.children_field):
- parent = self.parent.id if self.parent else None
+ if len(self.views) == 1 and self.current_record:
+ path = self.current_record.id
+ if path < 0:
+ path = -self.current_record.group.index(
+ self.current_record)
+ self.tree_states[parent][view.children_field] = (
+ timestamp, [], [[path]])
+ elif view.view_type == 'tree':
paths = view.get_expanded_paths()
selected_paths = view.get_selected_paths()
self.tree_states[parent][view.children_field] = (
- paths, selected_paths)
- if store:
+ timestamp, paths, selected_paths)
+ if store and view.attributes.get('tree_state', False):
json_domain = self.get_tree_domain(parent)
json_paths = json.dumps(paths)
json_selected_path = json.dumps(selected_paths)
@@ -681,7 +703,7 @@ class Screen(SignalEvent):
self.tree_states_done.clear()
self.group.load(ids, modified=modified)
self.current_view.reset()
- if ids:
+ if ids and self.current_view.view_type != 'calendar':
self.display(ids[0])
else:
self.current_record = None
@@ -696,7 +718,7 @@ class Screen(SignalEvent):
if (self.current_record
and self.current_record in self.current_record.group):
pass
- elif self.group:
+ elif self.group and self.current_view.view_type != 'calendar':
self.current_record = self.group[0]
else:
self.current_record = None
@@ -720,12 +742,14 @@ class Screen(SignalEvent):
view.set_value()
self.set_cursor(reset_view=False)
if view.view_type == 'tree' and len(self.group):
- start, end = view.widget_tree.get_visible_range()
- vadjustment = view.widget_tree.get_vadjustment()
- vadjustment.value = vadjustment.value + vadjustment.page_increment
- store = view.store
- iter_ = store.get_iter(end)
- self.current_record = store.get_value(iter_, 0)
+ start, end = view.treeview.get_visible_range()
+ vadjustment = view.treeview.get_vadjustment()
+ vadjustment.value = min(
+ vadjustment.value + vadjustment.page_increment,
+ vadjustment.get_upper())
+ model = view.treeview.get_model()
+ iter_ = model.get_iter(end)
+ self.current_record = model.get_value(iter_, 0)
elif (view.view_type == 'form'
and self.current_record
and self.current_record.group):
@@ -756,7 +780,7 @@ class Screen(SignalEvent):
self.current_record = record
elif view.view_type == 'calendar':
record = self.current_record
- goocalendar = view.children['goocalendar']
+ goocalendar = view.widgets['goocalendar']
date = goocalendar.selected_date
year = date.year
month = date.month
@@ -785,12 +809,14 @@ class Screen(SignalEvent):
view.set_value()
self.set_cursor(reset_view=False)
if view.view_type == 'tree' and len(self.group):
- start, end = view.widget_tree.get_visible_range()
- vadjustment = view.widget_tree.get_vadjustment()
- vadjustment.value = vadjustment.value - vadjustment.page_increment
- store = view.store
- iter_ = store.get_iter(start)
- self.current_record = store.get_value(iter_, 0)
+ start, end = view.treeview.get_visible_range()
+ vadjustment = view.treeview.get_vadjustment()
+ vadjustment.value = min(
+ vadjustment.value - vadjustment.page_increment,
+ vadjustment.get_lower())
+ model = view.treeview.get_model()
+ iter_ = model.get_iter(start)
+ self.current_record = model.get_value(iter_, 0)
elif (view.view_type == 'form'
and self.current_record
and self.current_record.group):
@@ -811,7 +837,7 @@ class Screen(SignalEvent):
self.current_record = record
elif view.view_type == 'calendar':
record = self.current_record
- goocalendar = view.children['goocalendar']
+ goocalendar = view.widgets['goocalendar']
date = goocalendar.selected_date
year = date.year
month = date.month
@@ -875,12 +901,22 @@ class Screen(SignalEvent):
return buttons
def button(self, button):
- 'Execute button on the current record'
+ 'Execute button on the selected records'
if button.get('confirm', False) and not sur(button['confirm']):
return
- record = self.current_record
- if not record.save(force_reload=False):
+ self.current_view.set_value()
+ if not self.current_record.save(force_reload=False):
return
+ fields = self.current_view.get_fields()
+ for record in self.selected_records:
+ domain = record.expr_eval(
+ button.get('states', {})).get('pre_validate', [])
+ if not record.validate(fields, pre_validate=domain):
+ self.display(set_cursor=True)
+ if domain:
+ # Reset valid state with normal domain
+ record.validate(fields)
+ return
ids = [r.id for r in self.selected_records]
try:
action = RPCExecute('model', self.model_name, button['name'],
diff --git a/tryton/gui/window/view_form/view/__init__.py b/tryton/gui/window/view_form/view/__init__.py
index c86640b..ef1268c 100644
--- a/tryton/gui/window/view_form/view/__init__.py
+++ b/tryton/gui/window/view_form/view/__init__.py
@@ -1,2 +1,49 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
+from tryton.common import node_attributes
+
+
+class View(object):
+ view_type = None
+ widget = None
+ view_id = None
+ modified = None
+ editable = None
+ children_field = None
+
+ def __init__(self, screen, xml):
+ self.screen = screen
+ self.fields = {}
+ self.attributes = node_attributes(xml)
+ screen.set_on_write(self.attributes.get('on_write'))
+
+ def set_value(self):
+ raise NotImplementedError
+
+ def get_fields(self):
+ raise NotImplementedError
+
+ def get_buttons(self):
+ raise NotImplementedError
+
+ @property
+ def title(self):
+ return self.attributes.get('string', '')
+
+ @staticmethod
+ def parse(screen, xml, children_field):
+ from .list import ViewTree
+ from .form import ViewForm
+ from .graph import ViewGraph
+ from .calendar_ import ViewCalendar
+
+ root, = xml.childNodes
+ tagname = root.tagName
+ if tagname == 'tree':
+ return ViewTree(screen, root, children_field)
+ elif tagname == 'form':
+ return ViewForm(screen, root)
+ elif tagname == 'graph':
+ return ViewGraph(screen, root)
+ elif tagname == 'calendar':
+ return ViewCalendar(screen, root)
diff --git a/tryton/gui/window/view_form/view/calendar_.py b/tryton/gui/window/view_form/view/calendar_.py
index 93d4c74..a3a8a24 100644
--- a/tryton/gui/window/view_form/view/calendar_.py
+++ b/tryton/gui/window/view_form/view/calendar_.py
@@ -2,27 +2,112 @@
#this repository contains the full copyright notices and license terms.
from functools import wraps
-from interface import ParserView
+import gtk
+import datetime
+import gettext
+
+from tryton.common import node_attributes
+from . import View
+try:
+ from .calendar_gtk.calendar_ import Calendar_
+ from .calendar_gtk.toolbar import Toolbar
+except ImportError:
+ Calendar_ = None
+ Toolbar = None
+
+_ = gettext.gettext
def goocalendar_required(func):
"Decorator for goocalendar required"
@wraps(func)
def wrapper(self, *args, **kwargs):
- if 'goocalendar' not in self.children:
+ if 'goocalendar' not in self.widgets:
return
return func(self, *args, **kwargs)
return wrapper
-class ViewCalendar(ParserView):
+class ViewCalendar(View):
- def __init__(self, screen, widget, children=None, buttons=None,
- notebooks=None, cursor_widget=None, children_field=None):
- super(ViewCalendar, self).__init__(screen, widget, children, buttons,
- notebooks, cursor_widget, children_field)
+ def __init__(self, screen, xml):
+ super(ViewCalendar, self).__init__(screen, xml)
self.view_type = 'calendar'
self.editable = False
+ self.widgets = {}
+ self.widget = self.parse(xml)
+
+ def parse(self, node):
+ vbox = gtk.VBox()
+ if not Calendar_:
+ return vbox
+ fields = []
+ for node in node.childNodes:
+ if node.nodeType != node.ELEMENT_NODE:
+ continue
+ if node.tagName == 'field':
+ fields.append(node_attributes(node))
+ goocalendar = Calendar_(attrs=self.attributes, screen=self.screen,
+ fields=fields)
+ toolbar = Toolbar(goocalendar)
+ self.widgets['toolbar'] = toolbar
+ goocalendar.connect('view-changed', self.on_view_changed, toolbar)
+ goocalendar.connect('page-changed', self.on_page_changed, toolbar)
+ goocalendar.connect('event-pressed', self.on_event_pressed)
+ goocalendar.connect('event-activated', self.on_event_activated)
+ goocalendar.connect('event-released', self.on_event_released)
+ goocalendar.connect('day-pressed', self.on_day_pressed)
+ goocalendar.connect('day-activated', self.on_day_activated)
+ self.widgets['goocalendar'] = goocalendar
+ scrolledWindow = gtk.ScrolledWindow()
+ scrolledWindow.add_with_viewport(goocalendar)
+ vbox.pack_start(toolbar, False, False)
+ vbox.pack_start(scrolledWindow, True, True)
+ return vbox
+
+ def on_page_changed(self, goocalendar, day, toolbar):
+ toolbar.update_displayed_date()
+ if goocalendar.update_domain():
+ self.screen.search_filter()
+
+ def on_view_changed(self, goocalendar, view, toolbar):
+ toolbar.update_displayed_date()
+ if goocalendar.update_domain():
+ self.screen.search_filter()
+
+ def on_event_pressed(self, goocalendar, event):
+ self.screen.current_record = event.record
+
+ def on_event_activated(self, goocalendar, event):
+ self.screen.switch_view('form')
+
+ def on_event_released(self, goocalendar, event):
+ dtstart = self.attributes.get('dtstart')
+ dtend = self.attributes.get('dtend') or dtstart
+ record = event.record
+ group = record.group
+ previous_start = record[dtstart].get(record)
+ new_start = event.start
+ new_end = event.end
+ if not isinstance(previous_start, datetime.datetime):
+ new_start = event.start.date()
+ new_end = event.end.date() if event.end else None
+ if previous_start <= new_start:
+ if new_end:
+ group.fields[dtend].set_client(record, new_end)
+ group.fields[dtstart].set_client(record, new_start)
+ else:
+ group.fields[dtstart].set_client(record, new_start)
+ if new_end:
+ group.fields[dtend].set_client(record, new_end)
+ goocalendar.select(new_start)
+ record.save()
+
+ def on_day_pressed(self, goocalendar, day):
+ self.screen.current_record = None
+
+ def on_day_activated(self, goocalendar, day):
+ self.screen.new()
def __getitem__(self, name):
return None
@@ -30,19 +115,19 @@ class ViewCalendar(ParserView):
@goocalendar_required
def destroy(self):
self.widget.destroy()
- self.children['goocalendar'].destroy()
+ self.widgets['goocalendar'].destroy()
@goocalendar_required
def get_selected_date(self):
- return self.children['goocalendar'].selected_date
+ return self.widgets['goocalendar'].selected_date
@goocalendar_required
def set_default_date(self, record, selected_date):
- self.children['goocalendar'].set_default_date(record, selected_date)
+ self.widgets['goocalendar'].set_default_date(record, selected_date)
def current_domain(self):
- if 'goocalendar' in self.children:
- return self.children['goocalendar'].current_domain()
+ if 'goocalendar' in self.widgets:
+ return self.widgets['goocalendar'].current_domain()
else:
# No need to load any record as nothing will be shown
return [('id', '=', -1)]
@@ -55,14 +140,14 @@ class ViewCalendar(ParserView):
@goocalendar_required
def display(self):
- self.children['goocalendar'].display(self.screen.group)
- gtkcal = self.children['toolbar'].gtkcal
+ self.widgets['goocalendar'].display(self.screen.group)
+ gtkcal = self.widgets['toolbar'].gtkcal
if gtkcal and not gtkcal.is_drawable():
import goocanvas
# disable gtk.Calendar if it is not drawable anymore
- self.children['toolbar'].gtkcal_item.set_property('visibility',
+ self.widgets['toolbar'].gtkcal_item.set_property('visibility',
goocanvas.ITEM_INVISIBLE)
- self.children['toolbar'].current_page.set_active(False)
+ self.widgets['toolbar'].current_page.set_active(False)
def set_cursor(self, new=False, reset_view=True):
pass
diff --git a/tryton/gui/window/view_form/view/calendar_gtk/__init__.py b/tryton/gui/window/view_form/view/calendar_gtk/__init__.py
index 5218f22..c86640b 100644
--- a/tryton/gui/window/view_form/view/calendar_gtk/__init__.py
+++ b/tryton/gui/window/view_form/view/calendar_gtk/__init__.py
@@ -1,3 +1,2 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from parser import *
diff --git a/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py b/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
index bc799ab..a30e262 100644
--- a/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
+++ b/tryton/gui/window/view_form/view/calendar_gtk/calendar_.py
@@ -3,27 +3,22 @@
import calendar
import datetime
import goocalendar
-import tryton.common as common
from dates_period import DatesPeriod
class Calendar_(goocalendar.Calendar):
'Calendar'
- def __init__(self, attrs, model, root_node, fields, screen,
- event_store=None):
+ def __init__(self, attrs, screen, fields, event_store=None):
super(Calendar_, self).__init__(event_store)
self.attrs = attrs
- self.model = model
- self.root_node = root_node
- self.fields = fields
self.screen = screen
+ self.fields = fields
self.event_store = event_store
self.current_domain_period = self.get_displayed_period()
def set_default_date(self, record, selected_date):
- attrs = common.node_attributes(self.root_node)
- dtstart = attrs.get('dtstart')
+ dtstart = self.attrs.get('dtstart')
record[dtstart].set(record, datetime.datetime.combine(selected_date,
datetime.time(0)))
@@ -54,9 +49,8 @@ class Calendar_(goocalendar.Calendar):
def current_domain(self):
first_datetime, last_datetime = \
self.current_domain_period.get_dates(True)
- attrs = common.node_attributes(self.root_node)
- dtstart = attrs.get('dtstart')
- dtend = attrs.get('dtend') or dtstart
+ dtstart = self.attrs.get('dtstart')
+ dtend = self.attrs.get('dtend') or dtstart
domain = ['OR',
['AND', (dtstart, '>=', first_datetime),
(dtstart, '<', last_datetime)],
@@ -67,9 +61,8 @@ class Calendar_(goocalendar.Calendar):
return domain
def display(self, group):
- attrs = common.node_attributes(self.root_node)
- dtstart = attrs.get('dtstart')
- dtend = attrs.get('dtend') or dtstart
+ dtstart = self.attrs.get('dtstart')
+ dtend = self.attrs.get('dtend') or dtstart
if self.screen.current_record:
record = self.screen.current_record
date = record[dtstart].get(record)
@@ -82,14 +75,6 @@ class Calendar_(goocalendar.Calendar):
event_store = goocalendar.EventStore()
self.event_store = event_store
- fields = []
- for node in self.root_node.childNodes:
- if not node.nodeType == node.ELEMENT_NODE:
- continue
- if node.localName == 'field':
- attrs = common.node_attributes(node)
- fields.append(attrs.get('name'))
-
for record in group:
if not record[dtstart].get(record):
continue
@@ -107,8 +92,8 @@ class Calendar_(goocalendar.Calendar):
all_day = True
# TODO define color code
- label = '\n'.join(record[name].get_client(record)
- for name in fields).rstrip()
+ label = '\n'.join(record[attrs['name']].get_client(record)
+ for attrs in self.fields).rstrip()
event = goocalendar.Event(label, start, end,
bg_color='lightblue', all_day=all_day)
event.record = record
diff --git a/tryton/gui/window/view_form/view/calendar_gtk/parser.py b/tryton/gui/window/view_form/view/calendar_gtk/parser.py
deleted file mode 100644
index 579f059..0000000
--- a/tryton/gui/window/view_form/view/calendar_gtk/parser.py
+++ /dev/null
@@ -1,85 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-import datetime
-import gettext
-import gtk
-from tryton.gui.window.view_form.view.interface import ParserInterface
-import tryton.common as common
-try:
- from calendar_ import Calendar_
- from toolbar import Toolbar
-except ImportError:
- Calendar_ = None
- Toolbar = None
-
-_ = gettext.gettext
-
-
-class ParserCalendar(ParserInterface):
-
- def on_page_changed(self, goocalendar, day, toolbar):
- toolbar.update_displayed_date()
- if goocalendar.update_domain():
- self.screen.search_filter()
-
- def on_view_changed(self, goocalendar, view, toolbar):
- toolbar.update_displayed_date()
- if goocalendar.update_domain():
- self.screen.search_filter()
-
- def on_event_pressed(self, goocalendar, event):
- self.screen.current_record = event.record
-
- def on_event_activated(self, goocalendar, event):
- self.screen.switch_view('form')
-
- def on_event_released(self, goocalendar, event, attrs):
- dtstart = attrs.get('dtstart')
- dtend = attrs.get('dtend') or dtstart
- record = event.record
- group = record.group
- previous_start = record[dtstart].get(record)
- new_start = event.start
- new_end = event.end
- if not isinstance(previous_start, datetime.datetime):
- new_start = event.start.date()
- new_end = event.end.date() if event.end else None
- if previous_start <= new_start:
- if new_end:
- group.fields[dtend].set_client(record, new_end)
- group.fields[dtstart].set_client(record, new_start)
- else:
- group.fields[dtstart].set_client(record, new_start)
- if new_end:
- group.fields[dtend].set_client(record, new_end)
- goocalendar.select(new_start)
- record.save()
-
- def on_day_pressed(self, goocalendar, day):
- self.screen.current_record = None
-
- def on_day_activated(self, goocalendar, day):
- self.screen.new()
-
- def parse(self, model, root_node, fields):
- attrs = common.node_attributes(root_node)
- self.title = attrs.get('string', 'Unknown')
- vbox = gtk.VBox()
- if not Calendar_:
- return vbox, {}, [], '', [], None
- goocalendar = Calendar_(attrs=attrs, model=model, root_node=root_node,
- fields=fields, screen=self.screen)
- toolbar = Toolbar(goocalendar)
- goocalendar.connect('view-changed', self.on_view_changed, toolbar)
- goocalendar.connect('page-changed', self.on_page_changed, toolbar)
- goocalendar.connect('event-pressed', self.on_event_pressed)
- goocalendar.connect('event-activated', self.on_event_activated)
- goocalendar.connect('event-released', self.on_event_released, attrs)
- goocalendar.connect('day-pressed', self.on_day_pressed)
- goocalendar.connect('day-activated', self.on_day_activated)
- scrolledWindow = gtk.ScrolledWindow()
- scrolledWindow.add_with_viewport(goocalendar)
- vbox.pack_start(toolbar, False, False)
- vbox.pack_start(scrolledWindow, True, True)
- return vbox, {'root': scrolledWindow, 'toolbar': toolbar,
- 'goocalendar': goocalendar}, [], '', [], None
diff --git a/tryton/gui/window/view_form/view/form.py b/tryton/gui/window/view_form/view/form.py
index 62a18f0..a19e6b4 100644
--- a/tryton/gui/window/view_form/view/form.py
+++ b/tryton/gui/window/view_form/view/form.py
@@ -1,48 +1,116 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import operator
-from functools import reduce
+from functools import cmp_to_key
import gtk
import gettext
-from interface import ParserView
+from collections import defaultdict
+
+from . import View
from tryton.common.focus import (get_invisible_ancestor, find_focused_child,
- next_focus_widget)
+ next_focus_widget, find_focusable_child, tab_compare)
+from tryton.common import Tooltips, node_attributes, ICONFACTORY
+from tryton.common.button import Button
+from tryton.config import CONFIG
+from .form_gtk.calendar import Calendar, DateTime, Time
+from .form_gtk.float import Float
+from .form_gtk.integer import Integer
+from .form_gtk.selection import Selection
+from .form_gtk.char import Char, Password
+from .form_gtk.float_time import FloatTime
+from .form_gtk.checkbox import CheckBox
+from .form_gtk.reference import Reference
+from .form_gtk.binary import Binary
+from .form_gtk.textbox import TextBox
+from .form_gtk.one2many import One2Many
+from .form_gtk.many2many import Many2Many
+from .form_gtk.many2one import Many2One
+from .form_gtk.url import Email, URL, CallTo, SIP
+from .form_gtk.image import Image as Image2
+from .form_gtk.progressbar import ProgressBar
+from .form_gtk.one2one import One2One
+from .form_gtk.richtextbox import RichTextBox
+from .form_gtk.dictionary import DictWidget
+from .form_gtk.multiselection import MultiSelection
+from .form_gtk.state_widget import (Label, VBox, Image, Frame, ScrolledWindow,
+ Notebook, Alignment)
_ = gettext.gettext
-class ViewForm(ParserView):
+class Container(object):
+ def __init__(self, col=4):
+ if CONFIG['client.modepda']:
+ col = 1
+ self.col = col
+ self.table = gtk.Table(1, col)
+ self.table.set_homogeneous(False)
+ self.table.set_col_spacings(0)
+ self.table.set_row_spacings(0)
+ self.table.set_border_width(0)
+ self.last = (0, 0)
+ self.tooltips = Tooltips()
+ self.tooltips.enable()
- def __init__(self, screen, widget, children=None, state_widgets=None,
- notebooks=None, cursor_widget='', children_field=None):
- super(ViewForm, self).__init__(screen, widget, children, state_widgets,
- notebooks, cursor_widget, children_field)
- self.view_type = 'form'
- self.editable = True
+ def add_row(self):
+ height, width = self.last
+ self.table.resize(height + 1, self.col)
+ self.last = (height + 1, 0)
- for button in self.get_buttons():
- button.connect('clicked', self.button_clicked)
+ def add(self, widget, attributes):
+ height, width = self.last
- # Force to display the first time it switches on a page
- # This avoids glitch in position of widgets
- display_done = {}
- for notebook in notebooks:
- def switch(notebook, page, page_num):
- if page_num not in display_done.setdefault(notebook, []):
- notebook.grab_focus()
- display_done[notebook].append(page_num)
- self.display()
- notebook.connect('switch-page', switch)
-
- self.widgets = children
- for widgets in self.widgets.itervalues():
- for widget in widgets:
- widget.view = self
+ colspan = attributes.get('colspan', 1)
+ if colspan > self.col:
+ colspan = self.col
+
+ if width + colspan > self.col:
+ self.add_row()
+ height, width = self.last
+ self.last = height, width + colspan
+
+ if not widget:
+ return
+
+ yopt = 0
+ if attributes.get('yexpand'):
+ yopt |= gtk.EXPAND
+ if attributes.get('yfill'):
+ yopt |= gtk.FILL
+
+ xopt = 0
+ if attributes.get('xexpand', True):
+ xopt |= gtk.EXPAND
+ if attributes.get('xfill', True):
+ xopt |= gtk.FILL
+
+ if attributes.get('help'):
+ self.tooltips.set_tip(widget, attributes['help'])
+
+ widget.show_all()
+ self.table.attach(widget,
+ width, width + colspan,
+ height, height + 1,
+ yoptions=yopt, xoptions=xopt,
+ ypadding=1, xpadding=2)
+
+
+class ViewForm(View):
+ editable = True
+
+ def __init__(self, screen, xml):
+ super(ViewForm, self).__init__(screen, xml)
+ self.view_type = 'form'
+ self.widgets = defaultdict(list)
+ self.state_widgets = []
+ self.notebooks = []
+
+ container = self.parse(xml)
vbox = gtk.VBox()
vp = gtk.Viewport()
vp.set_shadow_type(gtk.SHADOW_NONE)
- vp.add(self.widget)
+ vp.add(container.table)
scroll = gtk.ScrolledWindow()
scroll.add(vp)
scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
@@ -53,6 +121,286 @@ class ViewForm(ParserView):
vbox.pack_start(viewport, expand=True, fill=True)
self.widget = vbox
+ self._viewport = vp
+
+ def parse(self, node, container=None):
+ if not container:
+ node_attrs = node_attributes(node)
+ container = Container(int(node_attrs.get('col', 4)))
+ for node in node.childNodes:
+ if node.nodeType != node.ELEMENT_NODE:
+ continue
+ node_attrs = node_attributes(node)
+ for b_field in ('readonly', 'homogeneous'):
+ if b_field in node_attrs:
+ node_attrs[b_field] = bool(int(node_attrs[b_field]))
+ for i_field in ('yexpand', 'yfill', 'xexpand', 'xfill', 'colspan',
+ 'position'):
+ if i_field in node_attrs:
+ node_attrs[i_field] = int(node_attrs[i_field])
+
+ parser = getattr(self, '_parse_%s' % node.tagName)
+ parser(node, container, node_attrs)
+ return container
+
+ def _parse_image(self, node, container, attributes):
+ ICONFACTORY.register_icon(attributes['name'])
+ image = Image(attrs=attributes)
+ image.set_from_stock(attributes['name'], gtk.ICON_SIZE_DIALOG)
+ self.state_widgets.append(image)
+ container.add(image, attributes)
+
+ def _parse_separator(self, node, container, attributes):
+ if 'name' in attributes:
+ field = self.screen.group.fields[attributes['name']]
+ for attr in ('states', 'string'):
+ if attr not in attributes and attr in field.attrs:
+ attributes[attr] = field.attrs[attr]
+ vbox = VBox(attrs=attributes)
+ if attributes.get('string'):
+ label = gtk.Label(attributes['string'])
+ label.set_alignment(float(attributes.get('xalign', 0.0)),
+ float(attributes.get('yalign', 0.5)))
+ vbox.pack_start(label)
+ vbox.pack_start(gtk.HSeparator())
+ self.state_widgets.append(vbox)
+ container.add(vbox, attributes)
+
+ def _parse_label(self, node, container, attributes):
+ if 'name' in attributes:
+ field = self.screen.group.fields[attributes['name']]
+ if attributes['name'] == self.screen.exclude_field:
+ container.add(None, attributes)
+ return
+ if 'states' not in attributes and 'states' in field.attrs:
+ attributes['states'] = field.attrs['states']
+ if 'string' not in attributes:
+ if gtk.widget_get_default_direction() == \
+ gtk.TEXT_DIR_RTL:
+ attributes['string'] = _(':') + field.attrs['string']
+ else:
+ attributes['string'] = field.attrs['string'] + _(':')
+ if CONFIG['client.modepda']:
+ attributes['xalign'] = 0.0
+
+ label = Label(attributes.get('string', ''), attrs=attributes)
+ label.set_alignment(float(attributes.get('xalign', 1.0)),
+ float(attributes.get('yalign', 0.0)))
+ label.set_angle(int(attributes.get('angle', 0)))
+ attributes.setdefault('xexpand', 0)
+ self.state_widgets.append(label)
+ container.add(label, attributes)
+
+ def _parse_newline(self, node, container, attributes):
+ container.add_row()
+
+ def _parse_button(self, node, container, attributes):
+ button = Button(attributes)
+ button.connect('clicked', self.button_clicked)
+ self.state_widgets.append(button)
+ container.add(button, attributes)
+
+ def _parse_notebook(self, node, container, attributes):
+ attributes.setdefault('yexpand', True)
+ attributes.setdefault('yfill', True)
+ attributes.setdefault('colspan', 4)
+ notebook = Notebook(attrs=attributes)
+ notebook.set_scrollable(True)
+ positions = {
+ 'top': gtk.POS_TOP,
+ 'left': gtk.POS_LEFT,
+ 'right': gtk.POS_RIGHT,
+ 'bottom': gtk.POS_BOTTOM,
+ }
+ notebook.set_tab_pos(positions[CONFIG['client.form_tab']])
+ notebook.set_border_width(3)
+
+ # Force to display the first time it switches on a page
+ # This avoids glitch in position of widgets
+ def switch(notebook, page, page_num):
+ if not self.widget:
+ # Not yet finish to parse
+ return
+ notebook.grab_focus()
+ self.display()
+ notebook.disconnect(handler_id)
+ handler_id = notebook.connect('switch-page', switch)
+ self.state_widgets.append(notebook)
+
+ self.notebooks.append(notebook)
+ container.add(notebook, attributes)
+ self.parse(node, notebook)
+
+ def _parse_page(self, node, notebook, attributes):
+ if CONFIG['client.form_tab'] == 'left':
+ angle = 90
+ tab_box = gtk.VBox(spacing=3)
+ image_pos, image_rotate = ('end',
+ gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE)
+ elif CONFIG['client.form_tab'] == 'right':
+ angle = -90
+ tab_box = gtk.VBox(spacing=3)
+ image_pos, image_rotate = ('start',
+ gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
+ else:
+ angle = 0
+ tab_box = gtk.HBox(spacing=3)
+ image_pos, image_rotate = ('start',
+ gtk.gdk.PIXBUF_ROTATE_NONE)
+ if 'name' in attributes:
+ field = self.screen.group.fields[attributes['name']]
+ if attributes['name'] == self.screen.exclude_field:
+ return
+ for attr in ('states', 'string'):
+ if attr not in attributes and attr in field.attrs:
+ attributes[attr] = field.attrs[attr]
+ if '_' not in attributes['string']:
+ attributes['string'] = '_' + attributes['string']
+ label = gtk.Label(attributes['string'])
+ label.set_angle(angle)
+ label.set_use_underline(True)
+ tab_box.pack_start(label)
+
+ if 'icon' in attributes:
+ ICONFACTORY.register_icon(attributes['icon'])
+ pixbuf = tab_box.render_icon(attributes['icon'],
+ gtk.ICON_SIZE_SMALL_TOOLBAR)
+ pixbuf = pixbuf.rotate_simple(image_rotate)
+ icon = gtk.Image()
+ icon.set_from_pixbuf(pixbuf)
+ if image_pos == 'end':
+ tab_box.pack_end(icon)
+ else:
+ tab_box.pack_start(icon)
+ tab_box.show_all()
+
+ viewport = gtk.Viewport()
+ viewport.set_shadow_type(gtk.SHADOW_NONE)
+ scrolledwindow = ScrolledWindow(attrs=attributes)
+ scrolledwindow.set_shadow_type(gtk.SHADOW_NONE)
+ scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ scrolledwindow.add(viewport)
+ scrolledwindow.show_all()
+ self.state_widgets.append(scrolledwindow)
+ notebook.append_page(scrolledwindow, tab_box)
+ container = self.parse(node)
+ viewport.add(container.table)
+
+ def _parse_field(self, node, container, attributes):
+ name = attributes['name']
+ field = self.screen.group.fields[name]
+
+ if (name not in self.screen.group.fields
+ or name == self.screen.exclude_field):
+ container.add(None, attributes)
+ return
+
+ if 'widget' not in attributes:
+ attributes['widget'] = field.attrs['type']
+
+ for i_field in ('width', 'height'):
+ if i_field in attributes:
+ attributes[i_field] = int(attributes[i_field])
+
+ for attr in ('relation', 'domain', 'selection',
+ 'relation_field', 'string', 'help', 'views',
+ 'add_remove', 'sort', 'context', 'size', 'filename',
+ 'autocomplete', 'translate', 'create', 'delete',
+ 'selection_change_with', 'schema_model'):
+ if attr in field.attrs and attr not in attributes:
+ attributes[attr] = field.attrs[attr]
+
+ Widget = self.get_widget(attributes['widget'])
+ widget = Widget(self, attributes)
+ self.widgets[name].append(widget)
+
+ if Widget.expand:
+ attributes.setdefault('yexpand', True)
+ attributes.setdefault('yfill', True)
+
+ if attributes.get('height') or attributes.get('width'):
+ widget.widget.set_size_request(
+ int(attributes.get('width', -1)),
+ int(attributes.get('height', -1)))
+ container.add(Alignment(widget.widget, attributes), attributes)
+
+ def _parse_group(self, node, container, attributes):
+ group = self.parse(node)
+ group.table.set_homogeneous(attributes.get('homogeneous', False))
+ if 'name' in attributes:
+ field = self.screen.group.fields[attributes['name']]
+ if attributes['name'] == self.screen.exclude_field:
+ container.add(None, attributes)
+ return
+ for attr in ('states', 'string'):
+ if attr not in attributes and attr in field.attrs:
+ attributes[attr] = field.attrs[attr]
+
+ frame = Frame(attributes.get('string'), attrs=attributes)
+ frame.add(group.table)
+ self.state_widgets.append(frame)
+ container.add(frame, attributes)
+
+ def _parse_paned(self, node, container, attributes, Paned):
+ attributes.setdefault('yexpand', True)
+ attributes.setdefault('yfill', True)
+ paned = Paned()
+ if 'position' in attributes:
+ paned.set_position(attributes['position'])
+ container.add(paned, attributes)
+ self.parse(node, paned)
+
+ def _parse_hpaned(self, node, container, attributes):
+ self._parse_paned(node, container, attributes, gtk.HPaned)
+
+ def _parse_vpaned(self, node, container, attributes):
+ self._parse_paned(node, container, attributes, gtk.VPaned)
+
+ def _parse_child(self, node, paned, attributes):
+ container = self.parse(node)
+ if not paned.get_child1():
+ pack = paned.pack1
+ else:
+ pack = paned.pack2
+ pack(container.table, resize=True, shrink=True)
+
+ WIDGETS = {
+ 'date': Calendar,
+ 'datetime': DateTime,
+ 'time': Time,
+ 'float': Float,
+ 'numeric': Float,
+ 'integer': Integer,
+ 'biginteger': Integer,
+ 'selection': Selection,
+ 'char': Char,
+ 'password': Password,
+ 'float_time': FloatTime,
+ 'boolean': CheckBox,
+ 'reference': Reference,
+ 'binary': Binary,
+ 'text': TextBox,
+ 'one2many': One2Many,
+ 'many2many': Many2Many,
+ 'many2one': Many2One,
+ 'email': Email,
+ 'url': URL,
+ 'callto': CallTo,
+ 'sip': SIP,
+ 'image': Image2,
+ 'progressbar': ProgressBar,
+ 'one2one': One2One,
+ 'richtext': RichTextBox,
+ 'dict': DictWidget,
+ 'multiselection': MultiSelection,
+ }
+
+ @classmethod
+ def get_widget(cls, name):
+ return cls.WIDGETS[name]
+
+ def get_fields(self):
+ return self.widgets.keys()
def __getitem__(self, name):
return self.widgets[name][0]
@@ -135,39 +483,38 @@ class ViewForm(ParserView):
if reset_view:
for notebook in self.notebooks:
notebook.set_current_page(0)
- if self.cursor_widget in self.widgets:
- focus_widget = self.widgets[self.cursor_widget][0]
+ if self.attributes.get('cursor') in self.widgets:
+ focus_widget = find_focused_child(self.widgets[
+ self.attributes['cursor']][0].widget)
+ else:
+ child = find_focusable_child(self._viewport)
+ if child:
+ child.grab_focus()
record = self.screen.current_record
- position = reduce(lambda x, y: x + len(y), self.widgets, 0)
if record:
+ invalid_widgets = []
for name, widgets in self.widgets.iteritems():
for widget in widgets:
field = record.group.fields.get(name)
if not field:
continue
if not field.get_state_attrs(record).get('valid', True):
- if widget.position > position:
- continue
- position = widget.position
- focus_widget = widget
+ invalid_widgets.append(
+ find_focusable_child(widget.widget))
+ invalid_widgets.sort(key=cmp_to_key(tab_compare))
+ if invalid_widgets:
+ focus_widget = invalid_widgets[0]
if focus_widget:
for notebook in self.notebooks:
for i in range(notebook.get_n_pages()):
child = notebook.get_nth_page(i)
- if focus_widget.widget.is_ancestor(child):
+ if focus_widget.is_ancestor(child):
notebook.set_current_page(i)
focus_widget.grab_focus()
def button_clicked(self, widget):
- record = self.screen.current_record
- self.set_value()
- fields = self.get_fields()
- if not record.validate(fields):
- self.screen.display(set_cursor=True)
- return
- else:
- widget.handler_block_by_func(self.button_clicked)
- try:
- self.screen.button(widget.attrs)
- finally:
- widget.handler_unblock_by_func(self.button_clicked)
+ widget.handler_block_by_func(self.button_clicked)
+ try:
+ self.screen.button(widget.attrs)
+ finally:
+ widget.handler_unblock_by_func(self.button_clicked)
diff --git a/tryton/gui/window/view_form/view/form_gtk/__init__.py b/tryton/gui/window/view_form/view/form_gtk/__init__.py
index 5218f22..c86640b 100644
--- a/tryton/gui/window/view_form/view/form_gtk/__init__.py
+++ b/tryton/gui/window/view_form/view/form_gtk/__init__.py
@@ -1,3 +1,2 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from parser import *
diff --git a/tryton/gui/window/view_form/view/form_gtk/binary.py b/tryton/gui/window/view_form/view/form_gtk/binary.py
index 26f704a..50bc773 100644
--- a/tryton/gui/window/view_form/view/form_gtk/binary.py
+++ b/tryton/gui/window/view_form/view/form_gtk/binary.py
@@ -6,16 +6,16 @@ import os
import tempfile
from tryton.common import common
from tryton.common import file_selection, Tooltips, file_open, slugify
-from interface import WidgetInterface
+from .widget import Widget
_ = gettext.gettext
-class Binary(WidgetInterface):
+class Binary(Widget):
"Binary"
- def __init__(self, field_name, model_name, attrs=None):
- super(Binary, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Binary, self).__init__(view, attrs)
self.filename = attrs.get('filename')
@@ -103,12 +103,6 @@ class Binary(WidgetInterface):
focus_chain = [self.but_new, self.but_save_as, self.but_remove]
self.widget.set_focus_chain(focus_chain)
- def grab_focus(self):
- if self.wid_text:
- return self.wid_text.grab_focus()
- else:
- return self.wid_size.grab_focus()
-
def sig_new(self, widget=None):
filename = ''
if self.last_open_file:
diff --git a/tryton/gui/window/view_form/view/form_gtk/calendar.py b/tryton/gui/window/view_form/view/form_gtk/calendar.py
index bfab553..2739a5d 100644
--- a/tryton/gui/window/view_form/view/form_gtk/calendar.py
+++ b/tryton/gui/window/view_form/view/form_gtk/calendar.py
@@ -3,24 +3,25 @@
import gtk
import gettext
-from interface import WidgetInterface
+from .widget import Widget
from tryton.common.date_widget import DateEntry
from tryton.translate import date_format
_ = gettext.gettext
-class Calendar(WidgetInterface):
+class Calendar(Widget):
"Calendar"
- def __init__(self, field_name, model_name, attrs=None):
- super(Calendar, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Calendar, self).__init__(view, attrs)
self.widget = gtk.HBox()
self.entry = DateEntry('')
self.entry.set_property('activates_default', True)
self.entry.connect('key_press_event', self.sig_key_press)
self.entry.connect('activate', self.sig_activate)
+ self.entry.connect('changed', lambda _: self.send_modified())
self.entry.connect('focus-out-event', lambda x, y: self._focus_out())
self.widget.pack_start(self.entry, expand=False, fill=False)
@@ -44,9 +45,6 @@ class Calendar(WidgetInterface):
def sig_key_press(self, widget, event):
self.send_modified()
- def grab_focus(self):
- return self.entry.grab_focus()
-
def set_value(self, record, field):
field.set_client(record, self.get_value())
@@ -76,9 +74,6 @@ class Calendar(WidgetInterface):
class DateTime(Calendar):
"DateTime"
- def __init__(self, field_name, model_name, attrs=None):
- super(DateTime, self).__init__(field_name, model_name, attrs=attrs)
-
def get_format(self, record, field):
return date_format() + ' ' + field.time_format(record)
@@ -86,8 +81,8 @@ class DateTime(Calendar):
class Time(Calendar):
"Time"
- def __init__(self, field_name, model_name, attrs=None):
- super(Time, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Time, self).__init__(view, attrs)
self.entry.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, None)
def get_format(self, record, field):
diff --git a/tryton/gui/window/view_form/view/form_gtk/char.py b/tryton/gui/window/view_form/view/form_gtk/char.py
index 3cf5a2a..746b173 100644
--- a/tryton/gui/window/view_form/view/form_gtk/char.py
+++ b/tryton/gui/window/view_form/view/form_gtk/char.py
@@ -4,31 +4,28 @@ import gettext
import gobject
import gtk
-from interface import WidgetInterface, TranslateMixin
+from .widget import Widget, TranslateMixin
from tryton.common import Tooltips
from tryton.common.entry_position import manage_entry_position
+from tryton.common.selection import PopdownMixin, selection_shortcuts
_ = gettext.gettext
-class Char(WidgetInterface, TranslateMixin):
+class Char(Widget, TranslateMixin, PopdownMixin):
"Char"
- def __init__(self, field_name, model_name, attrs=None):
- super(Char, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Char, self).__init__(view, attrs)
self.widget = gtk.HBox()
self.autocomplete = bool(attrs.get('autocomplete'))
if self.autocomplete:
self.entry = gtk.ComboBoxEntry()
- self.entry_store = gtk.ListStore(gobject.TYPE_STRING)
- self.entry.set_model(self.entry_store)
- self.entry.set_text_column(0)
- completion = gtk.EntryCompletion()
- completion.set_model(self.entry_store)
- completion.set_text_column(0)
- self.entry.get_child().set_completion(completion)
+ selection_shortcuts(self.entry)
focus_entry = self.entry.get_child()
+ self.set_popdown([], self.entry)
+ self.entry.connect('changed', self.changed)
else:
self.entry = gtk.Entry()
focus_entry = self.entry
@@ -45,8 +42,9 @@ class Char(WidgetInterface, TranslateMixin):
self.button = None
if attrs.get('translate'):
- self.button = self.translate_button()
- self.widget.pack_start(self.button, False, False)
+ self.entry.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY,
+ 'tryton-locale')
+ self.entry.connect('icon-press', self.translate)
def translate_widget(self):
entry = gtk.Entry()
@@ -70,14 +68,20 @@ class Char(WidgetInterface, TranslateMixin):
widget.set_editable(not value)
widget.props.sensitive = not value
+ def changed(self, combobox):
+ def focus_out():
+ if combobox.props.window:
+ self._focus_out()
+ # Only when changed from pop list
+ if not combobox.get_child().has_focus():
+ # Must be deferred because it triggers a display of the form
+ gobject.idle_add(focus_out)
+
def _color_widget(self):
if self.autocomplete:
return self.entry.get_child()
return self.entry
- def grab_focus(self):
- return self.entry.grab_focus()
-
@property
def modified(self):
if self.record and self.field:
@@ -97,15 +101,12 @@ class Char(WidgetInterface, TranslateMixin):
def display(self, record, field):
super(Char, self).display(record, field)
- if record and self.autocomplete:
- autocompletion = record.autocompletion.get(self.field_name, [])
- current = [elem[0] for elem in self.entry_store]
- if autocompletion != current:
- self.entry_store.clear()
- for row in autocompletion:
- self.entry_store.append((row,))
- elif self.autocomplete:
- self.entry_store.clear()
+ if self.autocomplete:
+ if record:
+ selection = record.autocompletion.get(self.field_name, [])
+ else:
+ selection = []
+ self.set_popdown([(x, x) for x in selection], self.entry)
# Set size
if self.autocomplete:
@@ -128,12 +129,10 @@ class Char(WidgetInterface, TranslateMixin):
if not self.autocomplete:
self.entry.set_text(value)
else:
- for idx, row in enumerate(self.entry_store):
- if row[0] == value:
- self.entry.set_active(idx)
- return
- else:
+ self.entry.handler_block_by_func(self.changed)
+ if not self.set_popdown_value(self.entry, value) or not value:
self.entry.get_child().set_text(value)
+ self.entry.handler_unblock_by_func(self.changed)
def _readonly_set(self, value):
sensitivity = {True: gtk.SENSITIVITY_OFF, False: gtk.SENSITIVITY_AUTO}
@@ -153,8 +152,8 @@ class Char(WidgetInterface, TranslateMixin):
class Password(Char):
- def __init__(self, field_name, model_name, attrs=None):
- super(Password, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Password, self).__init__(view, attrs)
self.entry.props.visibility = False
self.visibility_checkbox = gtk.CheckButton()
diff --git a/tryton/gui/window/view_form/view/form_gtk/checkbox.py b/tryton/gui/window/view_form/view/form_gtk/checkbox.py
index e6f94e3..25a6b88 100644
--- a/tryton/gui/window/view_form/view/form_gtk/checkbox.py
+++ b/tryton/gui/window/view_form/view/form_gtk/checkbox.py
@@ -1,16 +1,16 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-from interface import WidgetInterface
+from .widget import Widget
import gettext
_ = gettext.gettext
-class CheckBox(WidgetInterface):
+class CheckBox(Widget):
- def __init__(self, field_name, model_name, attrs=None):
- super(CheckBox, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(CheckBox, self).__init__(view, attrs)
self.widget = gtk.CheckButton()
self.widget.connect('focus-out-event', lambda x, y: self._focus_out())
self.widget.connect_after('toggled', self.sig_activate)
diff --git a/tryton/gui/window/view_form/view/form_gtk/dictionary.py b/tryton/gui/window/view_form/view/form_gtk/dictionary.py
index f958067..faecc69 100644
--- a/tryton/gui/window/view_form/view/form_gtk/dictionary.py
+++ b/tryton/gui/window/view_form/view/form_gtk/dictionary.py
@@ -9,7 +9,7 @@ import decimal
import gettext
from decimal import Decimal
-from interface import WidgetInterface
+from .widget import Widget
from tryton.config import CONFIG
from tryton.gui.window.win_search import WinSearch
from tryton.common import RPCExecute, RPCException, timezoned_date, \
@@ -94,8 +94,10 @@ class DictSelectionEntry(DictEntry):
model.append(('',))
self._selection = {'': None}
width = 10
- for value, name in sorted(self.definition['selection'],
- key=operator.itemgetter(1)):
+ selection = self.definition['selection']
+ if self.definition.get('sorted', True):
+ selection.sort(key=operator.itemgetter(1))
+ for value, name in selection:
name = str(name)
self._selection[name] = value
model.append((name,))
@@ -304,10 +306,10 @@ DICT_ENTRIES = {
}
-class DictWidget(WidgetInterface):
+class DictWidget(Widget):
- def __init__(self, field_name, model_name, attrs=None):
- super(DictWidget, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(DictWidget, self).__init__(view, attrs)
self.schema_model = attrs['schema_model']
self.keys = {}
self.fields = {}
@@ -367,16 +369,8 @@ class DictWidget(WidgetInterface):
def _sig_add(self, *args):
context = self.field.context_get(self.record)
- value = self.wid_text.get_text()
+ value = self.wid_text.get_text().decode('utf-8')
domain = self.field.domain_get(self.record)
- dom = [('rec_name', 'ilike', '%%%s%%' % value)] if value else []
- dom.append(('id', 'not in',
- [self.keys[f]['id'] for f in self.fields]))
- try:
- ids = RPCExecute('model', self.schema_model, 'search',
- domain + dom, 0, CONFIG['client.limit'], None, context=context)
- except RPCException:
- return False
def callback(result):
if result:
@@ -393,11 +387,9 @@ class DictWidget(WidgetInterface):
self.add_line(new_field['name'])
self.wid_text.set_text('')
- if len(ids) != 1:
- WinSearch(self.schema_model, callback, sel_multi=True, ids=ids,
- context=context, domain=domain, new=False)
- else:
- callback([(id, None) for id in ids])
+ win = WinSearch(self.schema_model, callback, sel_multi=True,
+ context=context, domain=domain, new=False)
+ win.screen.search_filter(value)
def _sig_remove(self, button, key, modified=True):
del self.fields[key]
@@ -476,16 +468,25 @@ class DictWidget(WidgetInterface):
self.rows[key] = [label, alignment, remove_but]
self.buttons[key] = remove_but
- def add_key(self, key):
+ def add_keys(self, keys):
context = self.field.context_get(self.record)
- try:
- key_ids = RPCExecute('model', self.schema_model, 'search',
- [('name', '=', key)], 0, CONFIG['client.limit'],
- None, context=context)
- self.keys[key] = RPCExecute('model', self.schema_model,
- 'get_keys', key_ids, context=context)[0]
- except RPCException:
- pass
+ domain = self.field.domain_get(self.record)
+ batchlen = min(10, CONFIG['client.limit'])
+ for i in xrange(0, len(keys), batchlen):
+ sub_keys = keys[i:i + batchlen]
+ try:
+ key_ids = RPCExecute('model', self.schema_model, 'search',
+ [('name', 'in', sub_keys), domain], 0,
+ CONFIG['client.limit'], None, context=context)
+ if not key_ids:
+ continue
+ values = RPCExecute('model', self.schema_model,
+ 'get_keys', key_ids, context=context)
+ if not values:
+ continue
+ except RPCException:
+ pass
+ self.keys.update({k['name']: k for k in values})
def display(self, record, field):
super(DictWidget, self).display(record, field)
@@ -500,10 +501,12 @@ class DictWidget(WidgetInterface):
self._record_id = record_id
value = field.get_client(record) if field else {}
- for key in sorted(value.iterkeys()):
- val = value[key]
+ new_key_names = set(value.iterkeys()) - set(self.keys)
+ if new_key_names:
+ self.add_keys(list(new_key_names))
+ for key, val in sorted(value.iteritems()):
if key not in self.keys:
- self.add_key(key)
+ continue
if key not in self.fields:
self.add_line(key)
widget = self.fields[key]
diff --git a/tryton/gui/window/view_form/view/form_gtk/float.py b/tryton/gui/window/view_form/view/form_gtk/float.py
index 2ae2f77..c0555f3 100644
--- a/tryton/gui/window/view_form/view/form_gtk/float.py
+++ b/tryton/gui/window/view_form/view/form_gtk/float.py
@@ -2,14 +2,14 @@
#this repository contains the full copyright notices and license terms.
import gtk
import locale
-from integer import Integer
+from .integer import Integer
class Float(Integer):
"Float"
- def __init__(self, field_name, model_name, attrs=None):
- super(Float, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Float, self).__init__(view, attrs)
self.entry.connect('key-press-event', self.key_press_event)
def display(self, record, field):
diff --git a/tryton/gui/window/view_form/view/form_gtk/float_time.py b/tryton/gui/window/view_form/view/form_gtk/float_time.py
index 93d7592..c35cfde 100644
--- a/tryton/gui/window/view_form/view/form_gtk/float_time.py
+++ b/tryton/gui/window/view_form/view/form_gtk/float_time.py
@@ -1,15 +1,15 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-from interface import WidgetInterface
+from .widget import Widget
import tryton.common as common
import tryton.rpc as rpc
-class FloatTime(WidgetInterface):
+class FloatTime(Widget):
- def __init__(self, field_name, model_name, attrs=None):
- super(FloatTime, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(FloatTime, self).__init__(view, attrs)
self.widget = gtk.HBox()
self.entry = gtk.Entry()
@@ -28,9 +28,6 @@ class FloatTime(WidgetInterface):
def _color_widget(self):
return self.entry
- def grab_focus(self):
- return self.entry.grab_focus()
-
@property
def modified(self):
if self.record and self.field:
diff --git a/tryton/gui/window/view_form/view/form_gtk/image.py b/tryton/gui/window/view_form/view/form_gtk/image.py
index ba5bdd0..0410f2f 100644
--- a/tryton/gui/window/view_form/view/form_gtk/image.py
+++ b/tryton/gui/window/view_form/view/form_gtk/image.py
@@ -1,24 +1,21 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-import glib
import gettext
import os
import tempfile
-from tryton.common import file_selection, Tooltips, file_open, slugify
-from tryton.config import PIXMAPS_DIR
-from interface import WidgetInterface
+from tryton.common import (file_selection, Tooltips, file_open, slugify,
+ resize_pixbuf, data2pixbuf, BIG_IMAGE_SIZE)
+from .widget import Widget
import urllib
_ = gettext.gettext
-NOIMAGE = open(os.path.join(PIXMAPS_DIR, 'tryton-noimage.png'), 'rb').read()
+class Image(Widget):
-class Image(WidgetInterface):
-
- def __init__(self, field_name, model_name, attrs=None):
- super(Image, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Image, self).__init__(view, attrs)
self.filename = attrs.get('filename')
self.height = int(attrs.get('img_height', 100))
@@ -102,9 +99,6 @@ class Image(WidgetInterface):
def filename_field(self):
return self.record.group.fields.get(self.filename)
- def grab_focus(self):
- return self.image.grab_focus()
-
def _readonly_set(self, value):
self._readonly = value
if self.but_add:
@@ -199,52 +193,12 @@ class Image(WidgetInterface):
if self.field:
value = self.field.get_client(self.record)
if isinstance(value, (int, long)):
- if value > 10 ** 6:
+ if value > BIG_IMAGE_SIZE:
value = False
else:
value = self.field.get_data(self.record)
- if not value:
- data = NOIMAGE
- else:
- data = value
-
- pixbuf = None
- for ftype in ('jpeg', 'gif', 'png', 'bmp', 'svg'):
- try:
- loader = gtk.gdk.PixbufLoader(ftype)
- loader.write(data, len(data))
- loader.close()
- pixbuf = loader.get_pixbuf()
- except glib.GError:
- continue
- if pixbuf:
- break
- if not pixbuf:
- loader = gtk.gdk.PixbufLoader('png')
- loader.write(NOIMAGE, len(NOIMAGE))
- loader.close()
- pixbuf = loader.get_pixbuf()
-
- img_height = pixbuf.get_height()
- if img_height > self.height:
- height = self.height
- else:
- height = img_height
-
- img_width = pixbuf.get_width()
- if img_width > self.width:
- width = self.width
- else:
- width = img_width
-
- if (img_width / width) < (img_height / height):
- width = float(img_width) / float(img_height) * float(height)
- else:
- height = float(img_height) / float(img_width) * float(width)
-
- scaled = pixbuf.scale_simple(int(width), int(height),
- gtk.gdk.INTERP_BILINEAR)
- self.image.set_from_pixbuf(scaled)
+ pixbuf = resize_pixbuf(data2pixbuf(value), self.width, self.height)
+ self.image.set_from_pixbuf(pixbuf)
def display(self, record, field):
if not field:
diff --git a/tryton/gui/window/view_form/view/form_gtk/integer.py b/tryton/gui/window/view_form/view/form_gtk/integer.py
index cc8ee4d..256c344 100644
--- a/tryton/gui/window/view_form/view/form_gtk/integer.py
+++ b/tryton/gui/window/view_form/view/form_gtk/integer.py
@@ -1,14 +1,14 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from char import Char
+from .char import Char
import locale
class Integer(Char):
"Integer"
- def __init__(self, field_name, model_name, attrs=None):
- super(Integer, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Integer, self).__init__(view, attrs)
self.entry.set_width_chars(8)
_, _, padding, pack_type = self.widget.query_child_packing(
self.entry)
diff --git a/tryton/gui/window/view_form/view/form_gtk/many2many.py b/tryton/gui/window/view_form/view/form_gtk/many2many.py
index fbc0dd6..075f438 100644
--- a/tryton/gui/window/view_form/view/form_gtk/many2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2many.py
@@ -3,23 +3,22 @@
import gtk
from tryton.gui.window.view_form.screen import Screen
-from interface import WidgetInterface
+from .widget import Widget
from tryton.gui.window.win_search import WinSearch
from tryton.gui.window.win_form import WinForm
-from tryton.config import CONFIG
import tryton.common as common
import gettext
-from tryton.common import RPCExecute, RPCException
from tryton.common.placeholder_entry import PlaceholderEntry
from tryton.common.completion import get_completion, update_completion
_ = gettext.gettext
-class Many2Many(WidgetInterface):
+class Many2Many(Widget):
+ expand = True
- def __init__(self, field_name, model_name, attrs=None):
- super(Many2Many, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Many2Many, self).__init__(view, attrs)
self.widget = gtk.VBox(homogeneous=False, spacing=5)
self._readonly = True
@@ -97,13 +96,10 @@ class Many2Many(WidgetInterface):
self.wid_text.connect('key_press_event', self.on_keypress)
def _color_widget(self):
- if hasattr(self.screen.current_view, 'widget_tree'):
- return self.screen.current_view.widget_tree
+ if hasattr(self.screen.current_view, 'treeview'):
+ return self.screen.current_view.treeview
return super(Many2Many, self)._color_widget()
- def grab_focus(self):
- return self.wid_text.grab_focus()
-
def on_keypress(self, widget, event):
editable = self.wid_text.get_editable()
activate_keys = [gtk.keysyms.Tab, gtk.keysyms.ISO_Left_Tab]
@@ -140,7 +136,7 @@ class Many2Many(WidgetInterface):
widget.modify_text(gtk.STATE_INSENSITIVE,
self.colors['text_color_insensitive'])
- def _sig_add(self, *args, **kwargs):
+ def _sig_add(self, *args):
if not self.focus_out:
return
domain = self.field.domain_get(self.record)
@@ -148,19 +144,9 @@ class Many2Many(WidgetInterface):
if add_remove:
domain = [domain, add_remove]
context = self.field.context_get(self.record)
- value = self.wid_text.get_text()
+ value = self.wid_text.get_text().decode('utf-8')
self.focus_out = False
- try:
- if value:
- dom = [('rec_name', 'ilike', '%' + value + '%'), domain]
- else:
- dom = domain
- ids = RPCExecute('model', self.attrs['relation'], 'search',
- dom, 0, CONFIG['client.limit'], None, context=context)
- except RPCException:
- self.focus_out = True
- return False
def callback(result):
self.focus_out = True
@@ -170,14 +156,12 @@ class Many2Many(WidgetInterface):
self.screen.display(res_id=ids[0])
self.screen.set_cursor()
self.wid_text.set_text('')
- if len(ids) != 1 or not value or kwargs.get('win_search', False):
- WinSearch(self.attrs['relation'], callback, sel_multi=True,
- ids=ids, context=context, domain=domain,
- view_ids=self.attrs.get('view_ids', '').split(','),
- views_preload=self.attrs.get('views', {}),
- new=self.attrs.get('create', True))
- else:
- callback([(i, None) for i in ids])
+ win = WinSearch(self.attrs['relation'], callback, sel_multi=True,
+ context=context, domain=domain,
+ view_ids=self.attrs.get('view_ids', '').split(','),
+ views_preload=self.attrs.get('views', {}),
+ new=self.attrs.get('create', True))
+ win.screen.search_filter(value)
def _sig_remove(self, *args):
self.screen.remove(remove=True)
@@ -271,7 +255,7 @@ class Many2Many(WidgetInterface):
def _completion_action_activated(self, completion, index):
if index == 0:
- self._sig_add(win_search=True)
+ self._sig_add()
self.wid_text.grab_focus()
elif index == 1:
model = self.attrs['relation']
diff --git a/tryton/gui/window/view_form/view/form_gtk/many2one.py b/tryton/gui/window/view_form/view/form_gtk/many2one.py
index dd72af3..99a795f 100644
--- a/tryton/gui/window/view_form/view/form_gtk/many2one.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2one.py
@@ -3,24 +3,23 @@
import gtk
import gobject
import gettext
-from interface import WidgetInterface
+
+from .widget import Widget
import tryton.common as common
from tryton.gui.window.view_form.screen import Screen
from tryton.gui.window.win_search import WinSearch
from tryton.gui.window.win_form import WinForm
-from tryton.config import CONFIG
from tryton.common.popup_menu import populate
-from tryton.common import RPCExecute, RPCException
from tryton.common.completion import get_completion, update_completion
from tryton.common.entry_position import manage_entry_position
_ = gettext.gettext
-class Many2One(WidgetInterface):
+class Many2One(Widget):
- def __init__(self, field_name, model_name, attrs=None):
- super(Many2One, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Many2One, self).__init__(view, attrs)
self.widget = gtk.HBox(spacing=0)
self.widget.set_property('sensitive', True)
@@ -49,38 +48,15 @@ class Many2One(WidgetInterface):
else:
self.wid_completion = None
- self.but_open = gtk.Button()
- img_find = gtk.Image()
- img_find.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
- self.but_open.set_image(img_find)
- self.but_open.set_relief(gtk.RELIEF_NONE)
- self.but_open.connect('clicked', self.sig_edit)
- self.but_open.set_alignment(0.5, 0.5)
-
- self.but_new = gtk.Button()
- img_new = gtk.Image()
- img_new.set_from_stock('tryton-new', gtk.ICON_SIZE_SMALL_TOOLBAR)
- self.but_new.set_image(img_new)
- self.but_new.set_relief(gtk.RELIEF_NONE)
- self.but_new.connect('clicked', self.sig_new)
- self.but_new.set_alignment(0.5, 0.5)
-
- self.widget.pack_end(self.but_new, expand=False, fill=False)
- self.widget.pack_end(self.but_open, expand=False, fill=False)
- self.widget.pack_end(self.wid_text, expand=True, fill=True)
+ self.wid_text.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY,
+ 'tryton-find')
+ self.wid_text.connect('icon-press', self.sig_edit)
+ self.widget.pack_start(self.wid_text, expand=True, fill=True)
self.widget.set_focus_chain([self.wid_text])
- self.tooltips = common.Tooltips()
- self.tooltips.set_tip(self.but_new, _('Create a new record <F3>'))
- self.tooltips.set_tip(self.but_open, _('Open a record <F2>'))
- self.tooltips.enable()
-
self._readonly = False
- def grab_focus(self):
- return self.wid_text.grab_focus()
-
def get_model(self):
return self.attrs['relation']
@@ -93,21 +69,24 @@ class Many2One(WidgetInterface):
self.widget.set_focus_chain([self.wid_text])
def _set_button_sensitive(self):
+ self.wid_text.set_editable(not self._readonly)
+ self.wid_text.set_icon_sensitive(gtk.ENTRY_ICON_SECONDARY,
+ self.read_access)
+
+ def get_access(self, type_):
model = self.get_model()
if model:
- access = common.MODELACCESS[model]
+ return common.MODELACCESS[model][type_]
else:
- access = {
- 'create': True,
- 'read': True,
- }
- self.wid_text.set_editable(not self._readonly)
- self.but_new.set_sensitive(bool(
- not self._readonly
- and self.attrs.get('create', True)
- and access['create']))
- self.but_open.set_sensitive(bool(
- access['read']))
+ return True
+
+ @property
+ def read_access(self):
+ return self.get_access('read')
+
+ @property
+ def create_access(self):
+ return self.attrs.get('create', True) and self.get_access('create')
@property
def modified(self):
@@ -151,27 +130,7 @@ class Many2One(WidgetInterface):
self.record)['required'])):
domain = self.field.domain_get(self.record)
context = self.field.context_get(self.record)
- self.wid_text.grab_focus()
-
- try:
- if self.wid_text.get_text():
- dom = [('rec_name', 'ilike',
- '%' + self.wid_text.get_text() + '%'),
- domain]
- else:
- dom = domain
- ids = RPCExecute('model', model, 'search', dom, 0,
- CONFIG['client.limit'], None, context=context)
- except RPCException:
- self.focus_out = True
- self.changed = True
- return
- if len(ids) == 1:
- self.field.set_client(self.record,
- self.value_from_id(ids[0]), force_change=True)
- self.focus_out = True
- self.changed = True
- return
+ text = self.wid_text.get_text().decode('utf-8')
def callback(result):
if result:
@@ -182,11 +141,12 @@ class Many2One(WidgetInterface):
self.focus_out = True
self.changed = True
- WinSearch(model, callback, sel_multi=False,
- ids=ids, context=context, domain=domain,
+ win = WinSearch(model, callback, sel_multi=False,
+ context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
views_preload=self.attrs.get('views', {}),
- new=self.but_new.get_property('sensitive'))
+ new=self.create_access)
+ win.screen.search_filter(text)
return
self.focus_out = True
self.changed = True
@@ -243,26 +203,7 @@ class Many2One(WidgetInterface):
elif model and not self._readonly:
domain = self.field.domain_get(self.record)
context = self.field.context_get(self.record)
- self.wid_text.grab_focus()
-
- try:
- if self.wid_text.get_text():
- dom = [('rec_name', 'ilike',
- '%' + self.wid_text.get_text() + '%'),
- domain]
- else:
- dom = domain
- ids = RPCExecute('model', model, 'search', dom, 0,
- CONFIG['client.limit'], None, context=context)
- except RPCException:
- self.focus_out = True
- self.changed = True
- return False
- if len(ids) == 1:
- self.field.set_client(self.record, self.value_from_id(ids[0]),
- force_change=True)
- self.focus_out = True
- return True
+ text = self.wid_text.get_text().decode('utf-8')
def callback(result):
if result:
@@ -270,11 +211,12 @@ class Many2One(WidgetInterface):
self.value_from_id(*result[0]), force_change=True)
self.focus_out = True
self.changed = True
- WinSearch(model, callback, sel_multi=False,
- ids=ids, context=context, domain=domain,
+ win = WinSearch(model, callback, sel_multi=False,
+ context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
views_preload=self.attrs.get('views', {}),
- new=self.but_new.get_property('sensitive'))
+ new=self.create_access)
+ win.screen.search_filter(text)
return
self.focus_out = True
self.changed = True
@@ -287,11 +229,10 @@ class Many2One(WidgetInterface):
activate_keys.append(gtk.keysyms.Return)
if (event.keyval == gtk.keysyms.F3
and editable
- and self.but_new.get_property('sensitive')):
+ and self.create_access):
self.sig_new(widget, event)
return True
- elif (event.keyval == gtk.keysyms.F2
- and self.but_open.get_property('sensitive')):
+ elif event.keyval == gtk.keysyms.F2 and self.read_access:
self.sig_edit(widget)
return True
elif (event.keyval in activate_keys
@@ -316,9 +257,12 @@ class Many2One(WidgetInterface):
position = self.wid_text.get_position()
self.field.set_client(self.record,
self.value_from_id(None, ''))
- # Restore text and position after display
- self.wid_text.set_text(text)
- self.wid_text.set_position(position)
+ # The value of the field could be different of None
+ # in such case, the original text should not be restored
+ if not self.wid_text.get_text():
+ # Restore text and position after display
+ self.wid_text.set_text(text)
+ self.wid_text.set_position(position)
gobject.idle_add(clean)
return False
@@ -347,16 +291,13 @@ class Many2One(WidgetInterface):
self.wid_text.set_position(0)
self.changed = True
return False
- img = self.but_open.get_image()
- current_stock = img.get_stock()[0]
self.set_text(field.get_client(record))
- value = field.get(record)
- if self.has_target(value) and current_stock != 'tryton-open':
- img.set_from_stock('tryton-open', gtk.ICON_SIZE_SMALL_TOOLBAR)
- self.tooltips.set_tip(self.but_open, _('Open a record <F2>'))
- elif not self.has_target(value) and current_stock != 'tryton-find':
- img.set_from_stock('tryton-find', gtk.ICON_SIZE_SMALL_TOOLBAR)
- self.tooltips.set_tip(self.but_open, _('Search a record <F2>'))
+ if self.has_target(field.get(record)):
+ stock, tooltip = 'tryton-open', _('Open a record <F2>')
+ else:
+ stock, tooltip = 'tryton-find', _('Search a record <F2>')
+ self.wid_text.set_icon_from_stock(gtk.ENTRY_ICON_SECONDARY, stock)
+ self.wid_text.set_icon_tooltip_text(gtk.ENTRY_ICON_SECONDARY, tooltip)
self.changed = True
def _populate_popup(self, widget, menu):
diff --git a/tryton/gui/window/view_form/view/form_gtk/multiselection.py b/tryton/gui/window/view_form/view/form_gtk/multiselection.py
index 0de0f68..c14682c 100644
--- a/tryton/gui/window/view_form/view/form_gtk/multiselection.py
+++ b/tryton/gui/window/view_form/view/form_gtk/multiselection.py
@@ -3,41 +3,32 @@
import gtk
import gobject
-from .interface import WidgetInterface
+from .widget import Widget
from tryton.common.selection import SelectionMixin
+from tryton.common.treeviewcontrol import TreeViewControl
-MOVEMENT_KEYS = {gtk.keysyms.Up, gtk.keysyms.Down, gtk.keysyms.space,
- gtk.keysyms.Left, gtk.keysyms.KP_Left,
- gtk.keysyms.Right, gtk.keysyms.KP_Right,
- gtk.keysyms.Home, gtk.keysyms.KP_Home,
- gtk.keysyms.End, gtk.keysyms.KP_End}
+class MultiSelection(Widget, SelectionMixin):
+ expand = True
-class MultiSelection(WidgetInterface, SelectionMixin):
+ def __init__(self, view, attrs):
+ super(MultiSelection, self).__init__(view, attrs)
- def __init__(self, field_name, model_name, attrs=None):
- super(MultiSelection, self).__init__(field_name, model_name,
- attrs=attrs)
-
- self.widget = viewport = gtk.Viewport()
- viewport.set_shadow_type(gtk.SHADOW_ETCHED_IN)
- scroll = gtk.ScrolledWindow()
- scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
- scroll.set_placement(gtk.CORNER_TOP_LEFT)
- viewport.add(scroll)
+ self.widget = gtk.ScrolledWindow()
+ self.widget.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self.widget.set_shadow_type(gtk.SHADOW_ETCHED_IN)
self.model = gtk.ListStore(gobject.TYPE_INT, gobject.TYPE_STRING)
- self.tree = gtk.TreeView()
+ self.tree = TreeViewControl()
self.tree.set_model(self.model)
self.tree.set_search_column(1)
self.tree.connect('focus-out-event', lambda *a: self._focus_out())
- self.tree.connect('button-press-event', self.__button_press)
- self.tree.connect('key_press_event', self.__key_press)
+ self.tree.set_headers_visible(False)
selection = self.tree.get_selection()
selection.set_mode(gtk.SELECTION_MULTIPLE)
- selection.connect('changed', self.send_modified)
- scroll.add(self.tree)
- name_column = gtk.TreeViewColumn(attrs.get('string', ''))
+ selection.connect('changed', self.changed)
+ self.widget.add(self.tree)
+ name_column = gtk.TreeViewColumn()
name_cell = gtk.CellRendererText()
name_column.pack_start(name_cell)
name_column.add_attribute(name_cell, 'text', 1)
@@ -50,9 +41,6 @@ class MultiSelection(WidgetInterface, SelectionMixin):
def _color_widget(self):
return self.tree
- def grab_focus(self):
- self.tree.grab_focus()
-
@property
def modified(self):
if self.record and self.field:
@@ -61,9 +49,12 @@ class MultiSelection(WidgetInterface, SelectionMixin):
return value != group
return False
- def send_modified(self, *args):
- if self.record:
- self.record.signal('record-modified')
+ def changed(self, selection):
+ def focus_out():
+ if self.widget.props.window:
+ self._focus_out()
+ # Must be deferred because it triggers a display of the form
+ gobject.idle_add(focus_out)
def get_value(self):
model, paths = self.tree.get_selection().get_selected_rows()
@@ -73,28 +64,24 @@ class MultiSelection(WidgetInterface, SelectionMixin):
field.set_client(record, self.get_value())
def display(self, record, field):
- self.update_selection(record, field)
- super(MultiSelection, self).display(record, field)
- self.model.clear()
- if field is None:
- return
- id2path = {}
- for idx, (value, name) in enumerate(self.selection):
- self.model.append((value, name))
- id2path[value] = idx
selection = self.tree.get_selection()
- selection.unselect_all()
- group = field.get_client(record)
- for element in group:
- if (element not in group.record_removed
- and element not in group.record_deleted
- and element.id in id2path):
- selection.select_path(id2path[element.id])
-
- def __button_press(self, treeview, event):
- if event.button == 1:
- event.state |= gtk.gdk.CONTROL_MASK
-
- def __key_press(self, treeview, event):
- if event.keyval in MOVEMENT_KEYS:
- event.state |= gtk.gdk.CONTROL_MASK
+ selection.handler_block_by_func(self.changed)
+ try:
+ self.update_selection(record, field)
+ super(MultiSelection, self).display(record, field)
+ self.model.clear()
+ if field is None:
+ return
+ id2path = {}
+ for idx, (value, name) in enumerate(self.selection):
+ self.model.append((value, name))
+ id2path[value] = idx
+ selection.unselect_all()
+ group = field.get_client(record)
+ for element in group:
+ if (element not in group.record_removed
+ and element not in group.record_deleted
+ and element.id in id2path):
+ selection.select_path(id2path[element.id])
+ finally:
+ selection.handler_unblock_by_func(self.changed)
diff --git a/tryton/gui/window/view_form/view/form_gtk/one2many.py b/tryton/gui/window/view_form/view/form_gtk/one2many.py
index ca9f02c..c4e644c 100644
--- a/tryton/gui/window/view_form/view/form_gtk/one2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py
@@ -3,30 +3,29 @@
import gtk
import gettext
-from interface import WidgetInterface
+from .widget import Widget
from tryton.gui.window.view_form.screen import Screen
from tryton.gui.window.win_search import WinSearch
from tryton.gui.window.win_form import WinForm
-from tryton.config import CONFIG
import tryton.common as common
-from tryton.common import RPCExecute, RPCException
from tryton.common.placeholder_entry import PlaceholderEntry
from tryton.common.completion import get_completion, update_completion
_ = gettext.gettext
-class One2Many(WidgetInterface):
+class One2Many(Widget):
+ expand = True
- def __init__(self, field_name, model_name, attrs=None):
- super(One2Many, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(One2Many, self).__init__(view, attrs)
self.widget = gtk.VBox(homogeneous=False, spacing=2)
self._readonly = True
self._position = 0
self._length = 0
- hbox = gtk.HBox(homogeneous=False, spacing=0)
+ self.title_box = hbox = gtk.HBox(homogeneous=False, spacing=0)
hbox.set_border_width(2)
label = gtk.Label(attrs.get('string', ''))
@@ -192,13 +191,10 @@ class One2Many(WidgetInterface):
but_switch.props.sensitive = self.screen.number_of_views > 1
def _color_widget(self):
- if hasattr(self.screen.current_view, 'widget_tree'):
- return self.screen.current_view.widget_tree
+ if hasattr(self.screen.current_view, 'treeview'):
+ return self.screen.current_view.treeview
return super(One2Many, self)._color_widget()
- def grab_focus(self):
- return self.screen.widget.grab_focus()
-
def on_keypress(self, widget, event):
if (event.keyval == gtk.keysyms.F3) \
and self.but_new.get_property('sensitive'):
@@ -264,6 +260,7 @@ class One2Many(WidgetInterface):
size_limit = (field_size is not None
and o2m_size >= field_size >= 0)
else:
+ o2m_size = None
size_limit = False
self.but_new.set_sensitive(bool(
@@ -302,6 +299,17 @@ class One2Many(WidgetInterface):
and access['write']
and access['read']))
+ # New button must be added to focus chain to allow keyboard only
+ # creation when there is no existing record on form view.
+ focus_chain = self.title_box.get_focus_chain()
+ if o2m_size == 0 and self.screen.current_view.view_type == 'form':
+ if self.but_new not in focus_chain:
+ focus_chain.append(self.but_new)
+ else:
+ if self.but_new in focus_chain:
+ focus_chain.remove(self.but_new)
+ self.title_box.set_focus_chain(focus_chain)
+
def _validate(self):
self.view.set_value()
record = self.screen.current_record
@@ -324,7 +332,7 @@ class One2Many(WidgetInterface):
sequence = None
for view in self.screen.views:
if view.view_type == 'tree':
- sequence = view.widget_tree.sequence
+ sequence = view.attributes.get('sequence')
if sequence:
break
@@ -374,7 +382,7 @@ class One2Many(WidgetInterface):
def _sig_undelete(self, button):
self.screen.unremove()
- def _sig_add(self, *args, **kwargs):
+ def _sig_add(self, *args):
if not self.focus_out:
return
access = common.MODELACCESS[self.screen.model_name]
@@ -385,24 +393,14 @@ class One2Many(WidgetInterface):
context = self.field.context_get(self.record)
domain = [domain, self.record.expr_eval(self.attrs.get('add_remove'))]
removed_ids = self.field.get_removed_ids(self.record)
+ domain = ['OR', domain, ('id', 'in', removed_ids)]
+ text = self.wid_text.get_text().decode('utf-8')
self.focus_out = False
- try:
- if self.wid_text.get_text():
- dom = [('rec_name', 'ilike',
- '%' + self.wid_text.get_text() + '%'),
- ['OR', domain, ('id', 'in', removed_ids)]]
- else:
- dom = ['OR', domain, ('id', 'in', removed_ids)]
- ids = RPCExecute('model', self.attrs['relation'], 'search', dom,
- 0, CONFIG['client.limit'], None, context=context)
- except RPCException:
- self.focus_out = True
- return False
sequence = None
if self.screen.current_view.view_type == 'tree':
- sequence = self.screen.current_view.widget_tree.sequence
+ sequence = self.screen.current_view.attributes.get('sequence')
def callback(result):
self.focus_out = True
@@ -415,14 +413,12 @@ class One2Many(WidgetInterface):
self.screen.set_cursor()
self.wid_text.set_text('')
- if len(ids) != 1 or kwargs.get('win_search', False):
- WinSearch(self.attrs['relation'], callback, sel_multi=True,
- ids=ids, context=context, domain=domain,
- view_ids=self.attrs.get('view_ids', '').split(','),
- views_preload=self.attrs.get('views', {}),
- new=self.but_new.get_property('sensitive'))
- else:
- callback([(i, None) for i in ids])
+ win = WinSearch(self.attrs['relation'], callback, sel_multi=True,
+ context=context, domain=domain,
+ view_ids=self.attrs.get('view_ids', '').split(','),
+ views_preload=self.attrs.get('views', {}),
+ new=self.but_new.get_property('sensitive'))
+ win.screen.search_filter(text)
def _sig_label(self, screen, signal_data):
self._position = signal_data[0]
@@ -501,7 +497,7 @@ class One2Many(WidgetInterface):
def _completion_action_activated(self, completion, index):
if index == 0:
- self._sig_add(win_search=True)
+ self._sig_add()
self.wid_text.grab_focus()
elif index == 1:
self._sig_new()
diff --git a/tryton/gui/window/view_form/view/form_gtk/one2one.py b/tryton/gui/window/view_form/view/form_gtk/one2one.py
index 3af021f..334c8af 100644
--- a/tryton/gui/window/view_form/view/form_gtk/one2one.py
+++ b/tryton/gui/window/view_form/view/form_gtk/one2one.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from many2one import Many2One
+from .many2one import Many2One
class One2One(Many2One):
diff --git a/tryton/gui/window/view_form/view/form_gtk/parser.py b/tryton/gui/window/view_form/view/form_gtk/parser.py
deleted file mode 100644
index e7c71f2..0000000
--- a/tryton/gui/window/view_form/view/form_gtk/parser.py
+++ /dev/null
@@ -1,572 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-import gtk
-import gettext
-import logging
-from tryton.gui.window.view_form.view.interface import ParserInterface
-import tryton.common as common
-from tryton.config import CONFIG
-from tryton.common.button import Button
-
-_ = gettext.gettext
-
-
-class StateMixin(object):
-
- def __init__(self, *args, **kwargs):
- self.attrs = kwargs.pop('attrs')
- super(StateMixin, self).__init__(*args, **kwargs)
-
- def state_set(self, record):
- if record:
- state_changes = record.expr_eval(self.attrs.get('states', {}))
- else:
- state_changes = {}
- if state_changes.get('invisible', self.attrs.get('invisible')):
- self.hide()
- else:
- self.show()
-
-
-class Label(StateMixin, gtk.Label):
-
- def state_set(self, record):
- super(Label, self).state_set(record)
- if not self.attrs.get('string', True) and 'name' in self.attrs:
- if record:
- field = record.group.fields[self.attrs['name']]
- text = field.get_client(record) or ''
- else:
- text = ''
- self.set_text(text)
-
-
-class VBox(StateMixin, gtk.VBox):
- pass
-
-
-class Image(StateMixin, gtk.Image):
- pass
-
-
-class Frame(StateMixin, gtk.Frame):
-
- def __init__(self, label=None, attrs=None, widgets=None):
- if not label: # label must be None to have no label widget
- label = None
- super(Frame, self).__init__(label=label, attrs=attrs)
- self.widgets = widgets or {}
- if not label:
- self.set_shadow_type(gtk.SHADOW_NONE)
- self.set_border_width(0)
-
-
-class ScrolledWindow(StateMixin, gtk.ScrolledWindow):
- pass
-
-
-class Notebook(StateMixin, gtk.Notebook):
-
- def state_set(self, record):
- super(Notebook, self).state_set(record)
- if record:
- state_changes = record.expr_eval(self.attrs.get('states', {}))
- else:
- state_changes = {}
- if state_changes.get('readonly', self.attrs.get('readonly')):
- for widgets in self.widgets.itervalues():
- for widget in widgets:
- widget._readonly_set(True)
- widget.color_set('readonly')
-
-
-class Alignment(gtk.Alignment):
-
- def __init__(self, widget, attrs):
- super(Alignment, self).__init__(
- float(attrs.get('xalign', 0.0)),
- float(attrs.get('yalign', 0.5)),
- float(attrs.get('xexpand', 1.0)),
- float(attrs.get('yexpand', 1.0)))
- self.add(widget)
- widget.connect('show', lambda *a: self.show())
- widget.connect('hide', lambda *a: self.hide())
-
-
-class _container(object):
- def __init__(self, tooltips):
- self.cont = []
- self.col = []
- self.tooltips = tooltips
-
- def new(self, col=4):
- table = gtk.Table(1, col)
- table.set_homogeneous(False)
- table.set_col_spacings(0)
- table.set_row_spacings(0)
- table.set_border_width(0)
- self.cont.append((table, 0, 0))
- self.col.append(col)
-
- def get(self):
- return self.cont[-1][0]
-
- def pop(self):
- table = self.cont.pop()[0]
- self.col.pop()
- return table
-
- def newline(self):
- (table, width, height) = self.cont[-1]
- if width > 0:
- self.cont[-1] = (table, 0, height + 1)
- table.resize(height + 1, self.col[-1])
-
- def wid_add(self, widget, name='', yexpand=False, ypadding=2, rowspan=1,
- colspan=1, fname=None, help_tip=False,
- yfill=False, xexpand=True, xfill=True, xpadding=3):
- (table, width, height) = self.cont[-1]
- if colspan > self.col[-1]:
- colspan = self.col[-1]
- if colspan + width > self.col[-1]:
- self.newline()
- (table, width, height) = self.cont[-1]
- yopt = False
- if yexpand:
- yopt = yopt | gtk.EXPAND
- if yfill:
- yopt = yopt | gtk.FILL
- xopt = False
- if xexpand:
- xopt = xopt | gtk.EXPAND
- if xfill:
- xopt = xopt | gtk.FILL
- if help_tip:
- self.tooltips.set_tip(widget, help_tip)
- self.tooltips.enable()
- widget.show_all()
- table.attach(widget, width, width + colspan,
- height, height + rowspan,
- yoptions=yopt, ypadding=ypadding,
- xoptions=xopt, xpadding=xpadding)
- self.cont[-1] = (table, width + colspan, height)
- wid_list = table.get_children()
- wid_list.reverse()
- table.set_focus_chain(wid_list)
-
- def empty_add(self, colspan=1):
- (table, width, height) = self.cont[-1]
- if colspan > self.col[-1]:
- colspan = self.col[-1]
- if colspan + width > self.col[-1]:
- self.newline()
- (table, width, height) = self.cont[-1]
- self.cont[-1] = (table, width + colspan, height)
-
-
-class ParserForm(ParserInterface):
-
- def __init__(self, parent=None, attrs=None, screen=None,
- children_field=None):
- super(ParserForm, self).__init__(parent=parent, attrs=attrs,
- screen=screen, children_field=children_field)
- self.widget_id = 0
-
- def parse(self, model_name, root_node, fields, notebook=None, paned=None,
- tooltips=None):
- dict_widget = {}
- state_widgets = []
- notebook_list = []
- attrs = common.node_attributes(root_node)
- on_write = attrs.get('on_write', '')
- if not tooltips:
- tooltips = common.Tooltips()
- container = _container(tooltips)
- if CONFIG['client.modepda']:
- container.new(col=1)
- else:
- container.new(col=int(attrs.get('col', 4)))
- cursor_widget = attrs.get('cursor')
-
- if not self.title:
- self.title = attrs.get('string', 'Unknown')
-
- for node in root_node.childNodes:
- if not node.nodeType == node.ELEMENT_NODE:
- continue
- attrs = common.node_attributes(node)
- if not cursor_widget:
- if (attrs.get('name') and fields.get(attrs['name'])
- and not int(attrs.get('invisible', 0))
- and not int(attrs.get('readonly', 0))
- and attrs['name'] != self.screen.exclude_field):
- cursor_widget = attrs.get('name')
- yexpand = int(attrs.get('yexpand', 0))
- yfill = int(attrs.get('yfill', 0))
- xexpand = int(attrs.get('xexpand', 1))
- xfill = int(attrs.get('xfill', 1))
- colspan = int(attrs.get('colspan', 1))
- if node.localName == 'image':
- common.ICONFACTORY.register_icon(attrs['name'])
- icon = Image(attrs=attrs)
- state_widgets.append(icon)
- icon.set_from_stock(attrs['name'], gtk.ICON_SIZE_DIALOG)
- container.wid_add(icon,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill, ypadding=10,
- xexpand=xexpand, xfill=xfill)
- elif node.localName == 'separator':
- text = attrs.get('string', '')
- if 'name' in attrs:
- for attr_name in ('states', 'invisible'):
- if attr_name not in attrs and attrs['name'] in fields:
- if attr_name in fields[attrs['name']].attrs:
- attrs[attr_name] = fields[attrs['name']
- ].attrs[attr_name]
- if not text:
- text = fields[attrs['name']].attrs['string']
- vbox = VBox(attrs=attrs)
- state_widgets.append(vbox)
- if text:
- label = gtk.Label(text)
- label.set_alignment(float(attrs.get('xalign', 0.0)), 0.5)
- vbox.pack_start(label)
- vbox.pack_start(gtk.HSeparator())
- container.wid_add(vbox,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill, ypadding=10,
- xexpand=xexpand, xfill=xfill)
- elif node.localName == 'label':
- text = attrs.get('string', '')
- if 'name' in attrs and attrs['name'] in fields:
- if attrs['name'] == self.screen.exclude_field:
- container.empty_add(int(attrs.get('colspan', 1)))
- continue
- for attr_name in ('states', 'invisible'):
- if attr_name not in attrs \
- and attr_name in fields[attrs['name']].attrs:
- attrs[attr_name] = fields[attrs['name']
- ].attrs[attr_name]
- if 'string' not in attrs:
- if gtk.widget_get_default_direction() == \
- gtk.TEXT_DIR_RTL:
- text = _(':') + \
- fields[attrs['name']].attrs['string']
- else:
- text = fields[attrs['name']].attrs['string'] + \
- _(':')
- if 'xalign' not in attrs:
- attrs['xalign'] = 1.0
- elif not text:
- for node in node.childNodes:
- if node.nodeType == node.TEXT_NODE:
- text += node.data
- else:
- text += node.toxml()
- label = Label(text, attrs=attrs)
- state_widgets.append(label)
- if CONFIG['client.modepda']:
- attrs['xalign'] = 0.0
- label.set_alignment(float(attrs.get('xalign', 1.0)),
- float(attrs.get('yalign', 0.0)))
- label.set_angle(int(attrs.get('angle', 0)))
- xexpand = bool(attrs.get('xexpand', 0))
- container.wid_add(label,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill,
- xexpand=xexpand, xfill=xfill)
-
- elif node.localName == 'newline':
- container.newline()
-
- elif node.localName == 'button':
- button = Button(attrs)
- state_widgets.append(button)
- container.wid_add(button,
- help_tip=attrs.get('help', False),
- colspan=colspan,
- yexpand=yexpand, yfill=yfill,
- xexpand=xexpand, xfill=xfill)
-
- elif node.localName == 'notebook':
- notebook = Notebook(attrs=attrs)
- state_widgets.append(notebook)
- notebook.set_scrollable(True)
- notebook_list.append(notebook)
- if CONFIG['client.form_tab'] == 'top':
- pos = gtk.POS_TOP
- elif CONFIG['client.form_tab'] == 'left':
- pos = gtk.POS_LEFT
- elif CONFIG['client.form_tab'] == 'right':
- pos = gtk.POS_RIGHT
- elif CONFIG['client.form_tab'] == 'bottom':
- pos = gtk.POS_BOTTOM
- notebook.set_tab_pos(pos)
- notebook.set_border_width(3)
- colspan = int(attrs.get('colspan', 4))
- yexpand = bool(attrs.get('yexpand', 1))
- yfill = bool(attrs.get('yfill', 1))
- container.wid_add(notebook,
- colspan=colspan,
- yexpand=yexpand, yfill=yfill,
- xexpand=xexpand, xfill=xfill)
- (widget, widgets, state_widgets2, spam, notebook_list2,
- cursor_widget2) = self.parse(model_name, node, fields,
- notebook, tooltips=tooltips)
- if not cursor_widget:
- cursor_widget = cursor_widget2
- notebook_list.extend(notebook_list2)
- state_widgets += state_widgets2
- for widget_name, widgets in widgets.items():
- dict_widget.setdefault(widget_name, [])
- dict_widget[widget_name].extend(widgets)
-
- elif node.localName == 'page':
- if CONFIG['client.form_tab'] == 'left':
- angle = 90
- tab_box = gtk.VBox(spacing=3)
- image_pos, image_rotate = ('end',
- gtk.gdk.PIXBUF_ROTATE_COUNTERCLOCKWISE)
- elif CONFIG['client.form_tab'] == 'right':
- angle = -90
- tab_box = gtk.VBox(spacing=3)
- image_pos, image_rotate = ('start',
- gtk.gdk.PIXBUF_ROTATE_CLOCKWISE)
- else:
- angle = 0
- tab_box = gtk.HBox(spacing=3)
- image_pos, image_rotate = ('start',
- gtk.gdk.PIXBUF_ROTATE_NONE)
- text = attrs.get('string', '')
- if 'name' in attrs and attrs['name'] in fields:
- if attrs['name'] == self.screen.exclude_field:
- continue
- for attr_name in ('states', 'invisible'):
- if attr_name in fields[attrs['name']].attrs:
- attrs[attr_name] = \
- fields[attrs['name']].attrs[attr_name]
- if not text:
- text = fields[attrs['name']].attrs['string']
- if not text:
- text = _('No String Attr.')
- if '_' not in text:
- text = '_' + text
- tab_label = gtk.Label(text)
- tab_label.set_angle(angle)
- tab_label.set_use_underline(True)
- tab_box.pack_start(tab_label)
- if 'icon' in attrs:
- common.ICONFACTORY.register_icon(attrs['icon'])
- pixbuf = tab_box.render_icon(attrs['icon'],
- gtk.ICON_SIZE_SMALL_TOOLBAR)
- pixbuf = pixbuf.rotate_simple(image_rotate)
- icon = gtk.Image()
- icon.set_from_pixbuf(pixbuf)
- if image_pos == 'end':
- tab_box.pack_end(icon)
- else:
- tab_box.pack_start(icon)
- tab_box.show_all()
- (widget, widgets, state_widgets2, spam, notebook_list2,
- cursor_widget2) = self.parse(model_name, node, fields,
- notebook, tooltips=tooltips)
- if not cursor_widget:
- cursor_widget = cursor_widget2
- notebook_list.extend(notebook_list2)
- state_widgets += state_widgets2
- for widget_name, widgets in widgets.iteritems():
- dict_widget.setdefault(widget_name, [])
- dict_widget[widget_name].extend(widgets)
-
- viewport = gtk.Viewport()
- viewport.set_shadow_type(gtk.SHADOW_NONE)
- viewport.add(widget)
- viewport.show()
- scrolledwindow = ScrolledWindow(attrs=attrs)
- scrolledwindow.set_shadow_type(gtk.SHADOW_NONE)
- scrolledwindow.set_policy(gtk.POLICY_AUTOMATIC,
- gtk.POLICY_AUTOMATIC)
- scrolledwindow.add(viewport)
-
- state_widgets.append(scrolledwindow)
- notebook.append_page(scrolledwindow, tab_box)
-
- elif node.localName == 'field':
- name = str(attrs['name'])
- if name == self.screen.exclude_field:
- container.empty_add(int(attrs.get('colspan', 1)))
- continue
- if name not in fields:
- container.empty_add(int(attrs.get('colspan', 1)))
- log = logging.getLogger(__name__)
- log.error('Unknown field "%s"' % str(name))
- continue
- ftype = attrs.get('widget', fields[name].attrs['type'])
- if not ftype in WIDGETS_TYPE:
- container.empty_add(int(attrs.get('colspan', 1)))
- continue
- for attr_name in ('relation', 'domain', 'selection',
- 'relation_field', 'string', 'views', 'invisible',
- 'add_remove', 'sort', 'context', 'size', 'filename',
- 'autocomplete', 'translate', 'create', 'delete',
- 'selection_change_with', 'schema_model'):
- if attr_name in fields[name].attrs and \
- not attr_name in attrs:
- attrs[attr_name] = fields[name].attrs[attr_name]
-
- widget_act = WIDGETS_TYPE[ftype][0](name, model_name, attrs)
- self.widget_id += 1
- widget_act.position = self.widget_id
- dict_widget.setdefault(name, [])
- dict_widget[name].append(widget_act)
- yexpand = bool(attrs.get('yexpand', WIDGETS_TYPE[ftype][2]))
- yfill = bool(attrs.get('yfill', WIDGETS_TYPE[ftype][3]))
- hlp = fields[name].attrs.get('help', attrs.get('help', False))
- if attrs.get('height', False) or attrs.get('width', False):
- widget_act.widget.set_size_request(
- int(attrs.get('width', -1)),
- int(attrs.get('height', -1)))
- container.wid_add(Alignment(widget_act.widget, attrs),
- fields[name].attrs['string'], fname=name,
- help_tip=hlp,
- colspan=colspan,
- yexpand=yexpand, yfill=yfill,
- xexpand=xexpand, xfill=xfill)
-
- elif node.localName == 'group':
- (widget, widgets, state_widgets2, spam, notebook_list2,
- cursor_widget2) = self.parse(model_name, node, fields,
- tooltips=tooltips)
- if not cursor_widget:
- cursor_widget = cursor_widget2
- notebook_list.extend(notebook_list2)
- for widget_name, lwidgets in widgets.iteritems():
- dict_widget.setdefault(widget_name, [])
- dict_widget[widget_name].extend(lwidgets)
- state_widgets += state_widgets2
- text = ''
- if 'name' in attrs and attrs['name'] in fields:
- if attrs['name'] == self.screen.exclude_field:
- container.empty_add(int(attrs.get('colspan', 1)))
- continue
- for attr_name in ('states', 'invisible'):
- if attr_name in fields[attrs['name']].attrs:
- attrs[attr_name] = fields[attrs['name']
- ].attrs[attr_name]
- text = fields[attrs['name']].attrs['string']
- if attrs.get('string'):
- text = attrs['string']
- widget.set_homogeneous(bool(int(attrs.get('homogeneous', 0))))
-
- frame = Frame(text, attrs=attrs, widgets=widgets)
- frame.add(widget)
- state_widgets.append(frame)
- container.wid_add(frame,
- colspan=colspan,
- yexpand=yexpand, yfill=yfill, ypadding=0,
- xexpand=xexpand, xfill=xfill, xpadding=0)
- elif node.localName == 'hpaned':
- hpaned = gtk.HPaned()
- container.wid_add(hpaned, colspan=int(attrs.get('colspan', 4)),
- yexpand=True, yfill=True)
- (widget, widgets, state_widgets2, spam, notebook_list2,
- cursor_widget2) = self.parse(model_name, node, fields,
- paned=hpaned, tooltips=tooltips)
- if not cursor_widget:
- cursor_widget = cursor_widget2
- notebook_list.extend(notebook_list2)
- state_widgets += state_widgets2
- for widget_name, widgets in widgets.iteritems():
- dict_widget.setdefault(widget_name, [])
- dict_widget[widget_name].extend(widgets)
- if 'position' in attrs:
- hpaned.set_position(int(attrs['position']))
- elif node.localName == 'vpaned':
- vpaned = gtk.VPaned()
- container.wid_add(vpaned, colspan=int(attrs.get('colspan', 4)),
- yexpand=True, yfill=True)
- (widget, widgets, state_widgets2, spam, notebook_list2,
- cursor_widget2) = self.parse(model_name, node, fields,
- paned=vpaned, tooltips=tooltips)
- if not cursor_widget:
- cursor_widget = cursor_widget2
- notebook_list.extend(notebook_list2)
- state_widgets += state_widgets2
- for widget_name, widgets in widgets.iteritems():
- dict_widget.setdefault(widget_name, [])
- dict_widget[widget_name].extend(widgets)
- if 'position' in attrs:
- vpaned.set_position(int(attrs['position']))
- elif node.localName == 'child':
- (widget, widgets, state_widgets2, spam, notebook_list2,
- cursor_widget2) = self.parse(model_name, node, fields,
- paned=paned, tooltips=tooltips)
- if not cursor_widget:
- cursor_widget = cursor_widget2
- notebook_list.extend(notebook_list2)
- state_widgets += state_widgets2
- for widget_name, widgets in widgets.iteritems():
- dict_widget.setdefault(widget_name, [])
- dict_widget[widget_name].extend(widgets)
- if not paned.get_child1():
- paned.pack1(widget, resize=True, shrink=True)
- elif not paned.get_child2():
- paned.pack2(widget, resize=True, shrink=True)
- return container.pop(), dict_widget, state_widgets, on_write, \
- notebook_list, cursor_widget
-
-from calendar import Calendar, DateTime, Time
-from float import Float
-from integer import Integer
-from selection import Selection
-from char import Char, Password
-from float_time import FloatTime
-from checkbox import CheckBox
-from reference import Reference
-from binary import Binary
-from textbox import TextBox
-from one2many import One2Many
-from many2many import Many2Many
-from many2one import Many2One
-from url import Email, URL, CallTo, SIP
-from image import Image as Image2
-from progressbar import ProgressBar
-from one2one import One2One
-from richtextbox import RichTextBox
-from dictionary import DictWidget
-from multiselection import MultiSelection
-
-
-WIDGETS_TYPE = {
- 'date': (Calendar, 1, False, False),
- 'datetime': (DateTime, 1, False, False),
- 'time': (Time, 1, False, False),
- 'float': (Float, 1, False, False),
- 'numeric': (Float, 1, False, False),
- 'integer': (Integer, 1, False, False),
- 'biginteger': (Integer, 1, False, False),
- 'selection': (Selection, 1, False, False),
- 'char': (Char, 1, False, False),
- 'password': (Password, 1, False, False),
- 'float_time': (FloatTime, 1, False, False),
- 'boolean': (CheckBox, 1, False, False),
- 'reference': (Reference, 1, False, False),
- 'binary': (Binary, 1, False, False),
- 'text': (TextBox, 1, True, True),
- 'one2many': (One2Many, 1, True, True),
- 'many2many': (Many2Many, 1, True, True),
- 'many2one': (Many2One, 1, False, False),
- 'email': (Email, 1, False, False),
- 'url': (URL, 1, False, False),
- 'callto': (CallTo, 1, False, False),
- 'sip': (SIP, 1, False, False),
- 'image': (Image2, 1, False, False),
- 'progressbar': (ProgressBar, 1, False, False),
- 'one2one': (One2One, 1, False, False),
- 'richtext': (RichTextBox, 1, True, True),
- 'dict': (DictWidget, 1, False, False),
- 'multiselection': (MultiSelection, 1, True, True),
-}
diff --git a/tryton/gui/window/view_form/view/form_gtk/progressbar.py b/tryton/gui/window/view_form/view/form_gtk/progressbar.py
index 23e9b6e..4051149 100644
--- a/tryton/gui/window/view_form/view/form_gtk/progressbar.py
+++ b/tryton/gui/window/view_form/view/form_gtk/progressbar.py
@@ -1,11 +1,11 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-from interface import WidgetInterface
+from .widget import Widget
import locale
-class ProgressBar(WidgetInterface):
+class ProgressBar(Widget):
'Progress Bar'
orientations = {
'left_to_right': gtk.PROGRESS_LEFT_TO_RIGHT,
@@ -14,8 +14,8 @@ class ProgressBar(WidgetInterface):
'top_to_bottom': gtk.PROGRESS_TOP_TO_BOTTOM,
}
- def __init__(self, field_name, model_name, attrs=None):
- super(ProgressBar, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(ProgressBar, self).__init__(view, attrs)
self.widget = gtk.ProgressBar()
orientation = self.orientations.get(attrs.get('orientation',
'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT)
diff --git a/tryton/gui/window/view_form/view/form_gtk/reference.py b/tryton/gui/window/view_form/view/form_gtk/reference.py
index 0455e23..089c9f2 100644
--- a/tryton/gui/window/view_form/view/form_gtk/reference.py
+++ b/tryton/gui/window/view_form/view/form_gtk/reference.py
@@ -3,7 +3,7 @@
import gtk
import gettext
-from many2one import Many2One
+from .many2one import Many2One
from tryton.common.selection import SelectionMixin, PopdownMixin
_ = gettext.gettext
@@ -11,8 +11,8 @@ _ = gettext.gettext
class Reference(Many2One, SelectionMixin, PopdownMixin):
- def __init__(self, field_name, model_name, attrs=None):
- super(Reference, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Reference, self).__init__(view, attrs)
self.widget_combo = gtk.ComboBoxEntry()
child = self.widget_combo.get_child()
@@ -27,9 +27,6 @@ class Reference(Many2One, SelectionMixin, PopdownMixin):
self.widget.set_focus_chain([self.widget_combo, self.wid_text])
- def grab_focus(self):
- return self.widget_combo.grab_focus()
-
def get_model(self):
active = self.widget_combo.get_active()
if active < 0:
diff --git a/tryton/gui/window/view_form/view/form_gtk/richtextbox.py b/tryton/gui/window/view_form/view/form_gtk/richtextbox.py
index 69b8584..d804f63 100644
--- a/tryton/gui/window/view_form/view/form_gtk/richtextbox.py
+++ b/tryton/gui/window/view_form/view/form_gtk/richtextbox.py
@@ -5,7 +5,7 @@ import gtk
import pango
import re
from gettext import gettext as _
-from textbox import TextBox
+from .textbox import TextBox
from tryton.common import get_toplevel_window
@@ -64,8 +64,8 @@ def formalize_text_markup(text):
class RichTextBox(TextBox):
'''Implements a rich text editor as widget to Tryton Client'''
- def __init__(self, field_name, model_name, attrs=None):
- super(RichTextBox, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(RichTextBox, self).__init__(view, attrs)
self.table_tag = gtk.TextTagTable()
self.text_buffer = gtk.TextBuffer(self.table_tag)
self.textview.set_buffer(self.text_buffer)
diff --git a/tryton/gui/window/view_form/view/form_gtk/selection.py b/tryton/gui/window/view_form/view/form_gtk/selection.py
index 09a977b..fe49d9d 100644
--- a/tryton/gui/window/view_form/view/form_gtk/selection.py
+++ b/tryton/gui/window/view_form/view/form_gtk/selection.py
@@ -3,15 +3,15 @@
import gtk
import gobject
-from interface import WidgetInterface
+from .widget import Widget
from tryton.common.selection import SelectionMixin, selection_shortcuts, \
PopdownMixin
-class Selection(WidgetInterface, SelectionMixin, PopdownMixin):
+class Selection(Widget, SelectionMixin, PopdownMixin):
- def __init__(self, field_name, model_name, attrs=None):
- super(Selection, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(Selection, self).__init__(view, attrs)
self.widget = gtk.HBox(spacing=3)
self.entry = gtk.ComboBoxEntry()
@@ -39,9 +39,6 @@ class Selection(WidgetInterface, SelectionMixin, PopdownMixin):
# Must be deferred because it triggers a display of the form
gobject.idle_add(focus_out)
- def grab_focus(self):
- return self.entry.grab_focus()
-
def _readonly_set(self, value):
super(Selection, self)._readonly_set(value)
self.entry.set_sensitive(not value)
@@ -78,6 +75,8 @@ class Selection(WidgetInterface, SelectionMixin, PopdownMixin):
# Compatibility with Many2One
value = value[0]
+ self.entry.handler_block_by_func(self.changed)
if not self.set_popdown_value(self.entry, value):
self.get_inactive_selection(value)
self.set_popdown_value(self.entry, value)
+ self.entry.handler_unblock_by_func(self.changed)
diff --git a/tryton/gui/window/view_form/view/form_gtk/state_widget.py b/tryton/gui/window/view_form/view/form_gtk/state_widget.py
new file mode 100644
index 0000000..a88369b
--- /dev/null
+++ b/tryton/gui/window/view_form/view/form_gtk/state_widget.py
@@ -0,0 +1,84 @@
+#This file is part of Tryton. The COPYRIGHT file at the top level of
+#this repository contains the full copyright notices and license terms.
+import gtk
+
+
+class StateMixin(object):
+
+ def __init__(self, *args, **kwargs):
+ self.attrs = kwargs.pop('attrs')
+ super(StateMixin, self).__init__(*args, **kwargs)
+
+ def state_set(self, record):
+ if record:
+ state_changes = record.expr_eval(self.attrs.get('states', {}))
+ else:
+ state_changes = {}
+ if state_changes.get('invisible', self.attrs.get('invisible')):
+ self.hide()
+ else:
+ self.show()
+
+
+class Label(StateMixin, gtk.Label):
+
+ def state_set(self, record):
+ super(Label, self).state_set(record)
+ if not self.attrs.get('string', True) and 'name' in self.attrs:
+ if record:
+ field = record.group.fields[self.attrs['name']]
+ text = field.get_client(record) or ''
+ else:
+ text = ''
+ self.set_text(text)
+
+
+class VBox(StateMixin, gtk.VBox):
+ pass
+
+
+class Image(StateMixin, gtk.Image):
+ pass
+
+
+class Frame(StateMixin, gtk.Frame):
+
+ def __init__(self, label=None, attrs=None):
+ if not label: # label must be None to have no label widget
+ label = None
+ super(Frame, self).__init__(label=label, attrs=attrs)
+ if not label:
+ self.set_shadow_type(gtk.SHADOW_NONE)
+ self.set_border_width(0)
+
+
+class ScrolledWindow(StateMixin, gtk.ScrolledWindow):
+ pass
+
+
+class Notebook(StateMixin, gtk.Notebook):
+
+ def state_set(self, record):
+ super(Notebook, self).state_set(record)
+ if record:
+ state_changes = record.expr_eval(self.attrs.get('states', {}))
+ else:
+ state_changes = {}
+ if state_changes.get('readonly', self.attrs.get('readonly')):
+ for widgets in self.widgets.itervalues():
+ for widget in widgets:
+ widget._readonly_set(True)
+ widget.color_set('readonly')
+
+
+class Alignment(gtk.Alignment):
+
+ def __init__(self, widget, attrs):
+ super(Alignment, self).__init__(
+ float(attrs.get('xalign', 0.0)),
+ float(attrs.get('yalign', 0.5)),
+ float(attrs.get('xexpand', 1.0)),
+ float(attrs.get('yexpand', 1.0)))
+ self.add(widget)
+ widget.connect('show', lambda *a: self.show())
+ widget.connect('hide', lambda *a: self.hide())
diff --git a/tryton/gui/window/view_form/view/form_gtk/textbox.py b/tryton/gui/window/view_form/view/form_gtk/textbox.py
index 176189b..d09754e 100644
--- a/tryton/gui/window/view_form/view/form_gtk/textbox.py
+++ b/tryton/gui/window/view_form/view/form_gtk/textbox.py
@@ -1,7 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-from interface import WidgetInterface, TranslateMixin
+from .widget import Widget, TranslateMixin
from tryton.config import CONFIG
try:
@@ -10,10 +10,11 @@ except ImportError:
gtkspell = None
-class TextBox(WidgetInterface, TranslateMixin):
+class TextBox(Widget, TranslateMixin):
+ expand = True
- def __init__(self, field_name, model_name, attrs=None):
- super(TextBox, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(TextBox, self).__init__(view, attrs)
self.widget = gtk.VBox()
self.scrolledwindow = gtk.ScrolledWindow()
@@ -76,9 +77,6 @@ class TextBox(WidgetInterface, TranslateMixin):
textview.set_editable(not value)
textview.props.sensitive = not value
- def grab_focus(self):
- return self.textview.grab_focus()
-
def _readonly_set(self, value):
super(TextBox, self)._readonly_set(value)
self.textview.set_editable(not value)
diff --git a/tryton/gui/window/view_form/view/form_gtk/url.py b/tryton/gui/window/view_form/view/form_gtk/url.py
index 870e0ff..9edb072 100644
--- a/tryton/gui/window/view_form/view/form_gtk/url.py
+++ b/tryton/gui/window/view_form/view/form_gtk/url.py
@@ -1,7 +1,7 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-from char import Char
+from .char import Char
import webbrowser
import tryton.common as common
@@ -9,8 +9,8 @@ import tryton.common as common
class URL(Char):
"url"
- def __init__(self, field_name, model_name, attrs=None):
- super(URL, self).__init__(field_name, model_name, attrs=attrs)
+ def __init__(self, view, attrs):
+ super(URL, self).__init__(view, attrs)
self.tooltips = common.Tooltips()
self.button = gtk.Button()
diff --git a/tryton/gui/window/view_form/view/form_gtk/interface.py b/tryton/gui/window/view_form/view/form_gtk/widget.py
similarity index 93%
rename from tryton/gui/window/view_form/view/form_gtk/interface.py
rename to tryton/gui/window/view_form/view/form_gtk/widget.py
index 22ef029..b1b9bdf 100644
--- a/tryton/gui/window/view_form/view/form_gtk/interface.py
+++ b/tryton/gui/window/view_form/view/form_gtk/widget.py
@@ -13,35 +13,35 @@ from tryton.common import RPCExecute, RPCException
_ = gettext.gettext
-class WidgetInterface(object):
-
- def __init__(self, field_name, model_name, attrs=None):
- super(WidgetInterface, self).__init__()
- self.field_name = field_name
- self.model_name = model_name
- self.view = None # Filled by ViewForm
- self.attrs = attrs or {}
- for attr_name in ('readonly', 'invisible'):
- if attr_name in self.attrs:
- self.attrs[attr_name] = bool(int(self.attrs[attr_name]))
+class Widget(object):
+ expand = False
+
+ def __init__(self, view, attrs):
+ super(Widget, self).__init__()
+ self.view = view
+ self.attrs = attrs
self.widget = None
- self.position = 0
self.colors = {}
self.visible = True
self.color_name = None
- def __get_record(self):
- if self.view and self.view.screen:
- return self.view.screen.current_record
+ @property
+ def field_name(self):
+ return self.attrs['name']
+
+ @property
+ def model_name(self):
+ return self.view.screen.model_name
- record = property(__get_record)
+ @property
+ def record(self):
+ return self.view.screen.current_record
- def __get_field(self):
+ @property
+ def field(self):
if self.record:
return self.record.group.fields[self.field_name]
- field = property(__get_field)
-
def destroy(self):
pass
@@ -58,9 +58,6 @@ class WidgetInterface(object):
def _invisible_widget(self):
return self.widget
- def grab_focus(self):
- return self.widget.grab_focus()
-
@property
def modified(self):
return False
@@ -302,7 +299,7 @@ class TranslateMixin:
button.connect('clicked', self.translate)
return button
- def translate(self, widget):
+ def translate(self, *args):
if self.record.id < 0 or self.record.modified:
common.message(
_('You need to save the record before adding translations!'))
diff --git a/tryton/gui/window/view_form/view/graph.py b/tryton/gui/window/view_form/view/graph.py
index 850d608..2105130 100644
--- a/tryton/gui/window/view_form/view/graph.py
+++ b/tryton/gui/window/view_form/view/graph.py
@@ -1,26 +1,80 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from interface import ParserView
+import sys
+import os
+import gtk
+import gettext
-class ViewGraph(ParserView):
+from . import View
+from tryton.common import node_attributes, get_toplevel_window, message
+from tryton.config import TRYTON_ICON, CONFIG
+from .graph_gtk.bar import VerticalBar, HorizontalBar
+from .graph_gtk.line import Line
+from .graph_gtk.pie import Pie
- def __init__(self, screen, widget, children=None, state_widgets=None,
- notebooks=None, cursor_widget=None, children_field=None):
- super(ViewGraph, self).__init__(screen, widget, children,
- state_widgets, notebooks, cursor_widget, children_field)
+_ = gettext.gettext
+
+
+class ViewGraph(View):
+
+ def __init__(self, screen, xml):
+ super(ViewGraph, self).__init__(screen, xml)
self.view_type = 'graph'
- self.widgets = children
- self.editable = False
+ self.widgets = {}
+ self.widget = self.parse(xml)
+
+ def parse(self, node):
+ xfield = None
+ yfields = []
+
+ for node in node.childNodes:
+ if node.nodeType != node.ELEMENT_NODE:
+ continue
+ if node.tagName == 'x':
+ for child in node.childNodes:
+ if not child.nodeType == child.ELEMENT_NODE:
+ continue
+ xfield = node_attributes(child)
+ field = self.screen.group.fields[xfield['name']]
+ if not xfield.get('string'):
+ xfield['string'] = field.attrs['string']
+ elif node.tagName == 'y':
+ for child in node.childNodes:
+ if not child.nodeType == child.ELEMENT_NODE:
+ continue
+ yattrs = node_attributes(child)
+ if not yattrs.get('string') and yattrs['name'] != '#':
+ field = self.screen.group.fields[yattrs['name']]
+ yattrs['string'] = field.attrs['string']
+ yfields.append(yattrs)
+
+ Widget = self.get_widget(self.attributes.get('type', 'vbar'))
+ widget = Widget(self, xfield, yfields)
+ self.widgets['root'] = widget
+ event = gtk.EventBox()
+ event.add(widget)
+ event.connect('button-press-event', self.button_press)
+ return event
+
+ WIDGETS = {
+ 'vbar': VerticalBar,
+ 'hbar': HorizontalBar,
+ 'line': Line,
+ 'pie': Pie,
+ }
+
+ @classmethod
+ def get_widget(cls, name):
+ return cls.WIDGETS[name]
def __getitem__(self, name):
return None
def destroy(self):
self.widget.destroy()
- for widget in self.widgets.keys():
- self.widgets[widget].destroy()
- del self.widgets[widget]
+ self.widgets['root'].destroy()
+ self.widgets.clear()
def set_value(self):
pass
@@ -29,8 +83,7 @@ class ViewGraph(ParserView):
pass
def display(self):
- for widget in self.widgets.itervalues():
- widget.display(self.screen.group)
+ self.widgets['root'].display(self.screen.group)
return True
def set_cursor(self, new=False, reset_view=True):
@@ -38,3 +91,98 @@ class ViewGraph(ParserView):
def get_fields(self):
return []
+
+ def get_buttons(self):
+ return []
+
+ def save(self, widget, graph):
+ parent = get_toplevel_window()
+ dia = gtk.Dialog(_('Save As'), parent,
+ gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
+ gtk.STOCK_OK, gtk.RESPONSE_OK))
+ dia.set_icon(TRYTON_ICON)
+ dia.set_has_separator(True)
+ dia.set_default_response(gtk.RESPONSE_OK)
+
+ dia.vbox.set_spacing(5)
+ dia.vbox.set_homogeneous(False)
+
+ title = gtk.Label('<b>' + _('Image Size') + '</b>')
+ title.set_alignment(0.0, 0.5)
+ title.set_use_markup(True)
+ dia.vbox.pack_start(title)
+
+ table = gtk.Table(2, 2)
+ table.set_col_spacings(3)
+ table.set_row_spacings(3)
+ table.set_border_width(1)
+ table.attach(gtk.Label(_('Width:')), 0, 1, 0, 1, yoptions=False,
+ xoptions=gtk.FILL)
+ spinwidth = gtk.SpinButton(gtk.Adjustment(400.0,
+ 0.0, sys.maxint, 1.0, 10.0))
+ spinwidth.set_numeric(True)
+ spinwidth.set_activates_default(True)
+ table.attach(spinwidth, 1, 2, 0, 1, yoptions=False, xoptions=gtk.FILL)
+ table.attach(gtk.Label(_('Height:')), 0, 1, 1, 2, yoptions=False,
+ xoptions=gtk.FILL)
+ spinheight = gtk.SpinButton(gtk.Adjustment(200.0,
+ 0.0, sys.maxint, 1.0, 10.0))
+ spinheight.set_numeric(True)
+ spinheight.set_activates_default(True)
+ table.attach(spinheight, 1, 2, 1, 2, yoptions=False, xoptions=gtk.FILL)
+ dia.vbox.pack_start(table)
+
+ filechooser = gtk.FileChooserWidget(gtk.FILE_CHOOSER_ACTION_SAVE, None)
+ filechooser.set_current_folder(CONFIG['client.default_path'])
+ filter = gtk.FileFilter()
+ filter.set_name(_('PNG image (*.png)'))
+ filter.add_mime_type('image/png')
+ filter.add_pattern('*.png')
+ filechooser.add_filter(filter)
+ dia.vbox.pack_start(filechooser)
+
+ dia.show_all()
+
+ while True:
+ response = dia.run()
+ width = spinwidth.get_value_as_int()
+ height = spinheight.get_value_as_int()
+ filename = filechooser.get_filename()
+ if filename:
+ filename = filename.decode('utf-8')
+ try:
+ CONFIG['client.default_path'] = \
+ os.path.dirname(filename)
+ CONFIG.save()
+ except IOError:
+ pass
+ if response == gtk.RESPONSE_OK:
+ if width and height and filename:
+ if not filename.endswith('.png'):
+ filename = filename + '.png'
+ try:
+ graph.export_png(filename, width, height)
+ break
+ except MemoryError:
+ message(_('Image size too large!'), dia,
+ gtk.MESSAGE_ERROR)
+ else:
+ break
+ parent.present()
+ dia.destroy()
+
+ def button_press(self, widget, event):
+ if event.button == 3:
+ menu = gtk.Menu()
+ item = gtk.ImageMenuItem(_('Save As...'))
+ img = gtk.Image()
+ img.set_from_stock('tryton-save-as', gtk.ICON_SIZE_MENU)
+ item.set_image(img)
+ item.connect('activate', self.save)
+ item.show()
+ menu.append(item)
+ menu.popup(None, None, None, event.button, event.time)
+ return True
+ elif event.button == 1:
+ self.widgets['root'].action()
diff --git a/tryton/gui/window/view_form/view/graph_gtk/graph.py b/tryton/gui/window/view_form/view/graph_gtk/graph.py
index 8038ff5..76a4a05 100644
--- a/tryton/gui/window/view_form/view/graph_gtk/graph.py
+++ b/tryton/gui/window/view_form/view/graph_gtk/graph.py
@@ -71,8 +71,9 @@ class Graph(gtk.DrawingArea):
__gsignals__ = {"expose-event": "override"}
- def __init__(self, xfield, yfields, attrs, model):
+ def __init__(self, view, xfield, yfields):
super(Graph, self).__init__()
+ self.view = view
self.xfield = xfield
self.yfields = yfields
self.datas = {}
@@ -84,8 +85,14 @@ class Graph(gtk.DrawingArea):
self.connect('motion-notify-event', self.motion)
self.connect('leave-notify-event', self.leave)
self.popup = Popup(self)
- self.attrs = attrs
- self.model = model
+
+ @property
+ def attrs(self):
+ return self.view.attributes
+
+ @property
+ def model(self):
+ return self.view.screen.model_name
def destroy(self):
self.popup.destroy()
diff --git a/tryton/gui/window/view_form/view/graph_gtk/parser.py b/tryton/gui/window/view_form/view/graph_gtk/parser.py
deleted file mode 100644
index 396fb1d..0000000
--- a/tryton/gui/window/view_form/view/graph_gtk/parser.py
+++ /dev/null
@@ -1,155 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from tryton.gui.window.view_form.view.interface import ParserInterface
-import tryton.common as common
-import gtk
-from bar import VerticalBar, HorizontalBar
-from line import Line
-from pie import Pie
-from tryton.config import TRYTON_ICON, CONFIG
-import sys
-import os
-import gettext
-
-_ = gettext.gettext
-
-GRAPH_TYPE = {
- 'vbar': VerticalBar,
- 'hbar': HorizontalBar,
- 'line': Line,
- 'pie': Pie,
-}
-
-
-def save(widget, graph):
- parent = common.get_toplevel_window()
- dia = gtk.Dialog(_('Save As'), parent,
- gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
- (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK))
- dia.set_icon(TRYTON_ICON)
- dia.set_has_separator(True)
- dia.set_default_response(gtk.RESPONSE_OK)
-
- dia.vbox.set_spacing(5)
- dia.vbox.set_homogeneous(False)
-
- title = gtk.Label('<b>' + _('Image Size') + '</b>')
- title.set_alignment(0.0, 0.5)
- title.set_use_markup(True)
- dia.vbox.pack_start(title)
-
- table = gtk.Table(2, 2)
- table.set_col_spacings(3)
- table.set_row_spacings(3)
- table.set_border_width(1)
- table.attach(gtk.Label(_('Width:')), 0, 1, 0, 1, yoptions=False,
- xoptions=gtk.FILL)
- spinwidth = gtk.SpinButton(gtk.Adjustment(400.0,
- 0.0, sys.maxint, 1.0, 10.0))
- spinwidth.set_numeric(True)
- spinwidth.set_activates_default(True)
- table.attach(spinwidth, 1, 2, 0, 1, yoptions=False, xoptions=gtk.FILL)
- table.attach(gtk.Label(_('Height:')), 0, 1, 1, 2, yoptions=False,
- xoptions=gtk.FILL)
- spinheight = gtk.SpinButton(gtk.Adjustment(200.0,
- 0.0, sys.maxint, 1.0, 10.0))
- spinheight.set_numeric(True)
- spinheight.set_activates_default(True)
- table.attach(spinheight, 1, 2, 1, 2, yoptions=False, xoptions=gtk.FILL)
- dia.vbox.pack_start(table)
-
- filechooser = gtk.FileChooserWidget(gtk.FILE_CHOOSER_ACTION_SAVE, None)
- filechooser.set_current_folder(CONFIG['client.default_path'])
- filter = gtk.FileFilter()
- filter.set_name(_('PNG image (*.png)'))
- filter.add_mime_type('image/png')
- filter.add_pattern('*.png')
- filechooser.add_filter(filter)
- dia.vbox.pack_start(filechooser)
-
- dia.show_all()
-
- while True:
- response = dia.run()
- width = spinwidth.get_value_as_int()
- height = spinheight.get_value_as_int()
- filename = filechooser.get_filename()
- if filename:
- filename = filename.decode('utf-8')
- try:
- CONFIG['client.default_path'] = \
- os.path.dirname(filename)
- CONFIG.save()
- except IOError:
- pass
- if response == gtk.RESPONSE_OK:
- if width and height and filename:
- if not filename.endswith('.png'):
- filename = filename + '.png'
- try:
- graph.export_png(filename, width, height)
- break
- except MemoryError:
- common.message(_('Image size too large!'), dia,
- gtk.MESSAGE_ERROR)
- else:
- break
- parent.present()
- dia.destroy()
- return
-
-
-def button_press(widget, event, graph):
- if event.button == 3:
- menu = gtk.Menu()
- item = gtk.ImageMenuItem(_('Save As...'))
- img = gtk.Image()
- img.set_from_stock('tryton-save-as', gtk.ICON_SIZE_MENU)
- item.set_image(img)
- item.connect('activate', save, graph)
- item.show()
- menu.append(item)
- menu.popup(None, None, None, event.button, event.time)
- return True
- elif event.button == 1:
- graph.action()
-
-
-class ParserGraph(ParserInterface):
-
- def parse(self, model, root_node, fields):
- attrs = common.node_attributes(root_node)
- self.title = attrs.get('string', 'Unknown')
- xfield = None
- yfields = []
-
- for node in root_node.childNodes:
- if not node.nodeType == node.ELEMENT_NODE:
- continue
-
- if node.localName == 'x':
- for child in node.childNodes:
- if not child.nodeType == child.ELEMENT_NODE:
- continue
- xfield = common.node_attributes(child)
- if not xfield.get('string'):
- xfield['string'] = fields[xfield['name']
- ].attrs['string']
- break
- elif node.localName == 'y':
- for child in node.childNodes:
- if not child.nodeType == child.ELEMENT_NODE:
- continue
- yattrs = common.node_attributes(child)
- if not yattrs.get('string') and yattrs['name'] != '#':
- yattrs['string'] = fields[yattrs['name']
- ].attrs['string']
- yfields.append(yattrs)
-
- widget = GRAPH_TYPE[attrs.get('type', 'vbar')
- ](xfield, yfields, attrs, model)
- event = gtk.EventBox()
- event.add(widget)
- event.connect('button-press-event', button_press, widget)
-
- return event, {'root': widget}, [], '', [], None
diff --git a/tryton/gui/window/view_form/view/interface.py b/tryton/gui/window/view_form/view/interface.py
deleted file mode 100644
index 051beb5..0000000
--- a/tryton/gui/window/view_form/view/interface.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-"Interfaces"
-
-
-class ParserInterface(object):
-
- def __init__(self, parent=None, attrs=None, screen=None,
- children_field=None):
- self.parent = parent
- self.attrs = attrs
- self.title = None
- self.state_widgets = {}
- self.screen = screen
- self.children_field = children_field
-
-
-class ParserView(object):
-
- def __init__(self, screen, widget, children=None, state_widgets=None,
- notebooks=None, cursor_widget=None, children_field=None):
- self.screen = screen
- self.widget = widget
- self.children = children
- if state_widgets is None:
- state_widgets = []
- self.state_widgets = state_widgets
- if notebooks is None:
- notebooks = []
- self.notebooks = notebooks
- self.cursor_widget = cursor_widget
- self.children_field = children_field
- self.view_id = None
-
- @property
- def selected_records(self):
- return []
-
- def get_fields(self):
- return self.children.keys()
-
- def get_buttons(self):
- return []
-
- @property
- def modified(self):
- return False
diff --git a/tryton/gui/window/view_form/view/list.py b/tryton/gui/window/view_form/view/list.py
index 9aff350..554eda4 100644
--- a/tryton/gui/window/view_form/view/list.py
+++ b/tryton/gui/window/view_form/view/list.py
@@ -8,18 +8,39 @@ try:
except ImportError:
import json
import locale
-from interface import ParserView
import gettext
+from functools import wraps
+
from tryton.config import CONFIG
from tryton.common.cellrendererbutton import CellRendererButton
from tryton.common.cellrenderertoggle import CellRendererToggle
from tryton.gui.window import Window
from tryton.common.popup_menu import populate
-from tryton.common import RPCExecute, RPCException
+from tryton.common import RPCExecute, RPCException, node_attributes, Tooltips
+from . import View
+from .list_gtk.editabletree import EditableTreeView, TreeView
+from .list_gtk.widget import (Affix, Char, Int, Boolean, URL, Date, Datetime,
+ Time, Float, FloatTime, Binary, M2O, O2O, O2M, M2M, Selection, Reference,
+ ProgressBar, Button, Image)
_ = gettext.gettext
+def delay(func):
+ """Decorator for ViewTree method to delay execution when idle and if
+ display counter did not change"""
+ @wraps(func)
+ def wrapper(self, *args, **kwargs):
+ def wait():
+ if not self.treeview.props.window:
+ return
+ if self.treeview.display_counter == display_counter:
+ func(self, *args, **kwargs)
+ display_counter = self.treeview.display_counter
+ gobject.idle_add(wait)
+ return wrapper
+
+
def path_convert_id2pos(model, id_path):
"This function will transform a path of id into a path of position"
group = model.group
@@ -238,90 +259,344 @@ class AdaptModelGroup(gtk.GenericTreeModel):
return record.parent
-class ViewList(ParserView):
+class ViewTree(View):
- def __init__(self, screen, widget, children=None, state_widgets=None,
- notebooks=None, cursor_widget=None, children_field=None):
- super(ViewList, self).__init__(screen, widget, children, state_widgets,
- notebooks, cursor_widget, children_field)
- self.store = None
+ def __init__(self, screen, xml, children_field):
+ super(ViewTree, self).__init__(screen, xml)
self.view_type = 'tree'
+ self.widgets = {}
+ self.state_widgets = []
+ self.children_field = children_field
+ self.sum_widgets = []
+ self.sum_box = gtk.HBox()
+ self.reload = False
+ if self.attributes.get('editable'):
+ self.treeview = EditableTreeView(self.attributes['editable'], self)
+ else:
+ self.treeview = TreeView()
- vbox = gtk.VBox()
+ self.parse(xml)
+
+ self.treeview.set_property('rules-hint', True)
+ self.treeview.set_fixed_height_mode(True)
+ self.treeview.connect('button-press-event', self.__button_press)
+ self.treeview.connect('key-press-event', self.on_keypress)
+ self.treeview.connect_after('row-activated', self.__sig_switch)
+ if self.children_field:
+ self.treeview.connect('test-expand-row', self.test_expand_row)
+ self.treeview.set_expander_column(self.treeview.get_column(0))
+ self.treeview.set_rubber_banding(True)
+
+ selection = self.treeview.get_selection()
+ selection.set_mode(gtk.SELECTION_MULTIPLE)
+ selection.connect('changed', self.__select_changed)
+
+ self.set_drag_and_drop()
+
+ self.widget = gtk.VBox()
scroll = gtk.ScrolledWindow()
- scroll.add(self.widget)
+ scroll.add(self.treeview)
scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scroll.set_placement(gtk.CORNER_TOP_LEFT)
viewport = gtk.Viewport()
viewport.set_shadow_type(gtk.SHADOW_ETCHED_IN)
viewport.add(scroll)
- self.widget_tree = self.widget
-
- vbox.pack_start(viewport, expand=True, fill=True)
+ self.widget.pack_start(viewport, expand=True, fill=True)
- self.widget_tree.screen = screen
-
- self.widget = vbox
- self.reload = False
- self.children = children
-
- if children:
- hbox = gtk.HBox()
- self.widget.pack_start(hbox, expand=False, fill=False, padding=2)
- keys = children.keys()
- keys.sort()
- for i in keys:
- hbox2 = gtk.HBox()
- hbox2.pack_start(children[i][1], expand=True, fill=False)
- hbox2.pack_start(children[i][2], expand=True, fill=False)
- hbox.pack_start(hbox2, expand=False, fill=False, padding=12)
- hbox.show_all()
+ self.sum_box.show()
+ self.widget.pack_start(self.sum_box, expand=False, fill=False)
self.display()
- self.widget_tree.connect('button-press-event', self.__button_press)
- self.widget_tree.connect_after('row-activated', self.__sig_switch)
- if hasattr(self.widget_tree, 'set_rubber_banding'):
- self.widget_tree.set_rubber_banding(True)
- selection = self.widget_tree.get_selection()
- selection.set_mode(gtk.SELECTION_MULTIPLE)
- selection.connect('changed', self.__select_changed)
+ def parse(self, xml):
+ for node in xml.childNodes:
+ if node.nodeType != node.ELEMENT_NODE:
+ continue
+ if node.tagName == 'field':
+ self._parse_field(node)
+ elif node.tagName == 'button':
+ self._parse_button(node)
+
+ self.add_last_column()
+
+ def _parse_field(self, node):
+ group = self.screen.group
+ node_attrs = node_attributes(node)
+ name = node_attrs['name']
+ field = group.fields[name]
+ for b_field in ('readonly', 'expand', 'tree_invisible'):
+ if b_field in node_attrs:
+ node_attrs[b_field] = bool(int(node_attrs[b_field]))
+ for i_field in ('width', 'height'):
+ if i_field in node_attrs:
+ node_attrs[i_field] = int(node_attrs[i_field])
+ if 'widget' not in node_attrs:
+ node_attrs['widget'] = field.attrs['type']
+
+ for attr in ('relation', 'domain', 'selection',
+ 'relation_field', 'string', 'views', 'invisible',
+ 'add_remove', 'sort', 'context', 'size', 'filename',
+ 'autocomplete', 'translate', 'create', 'delete',
+ 'selection_change_with', 'schema_model'):
+ if (attr in field.attrs
+ and attr not in node_attrs):
+ node_attrs[attr] = field.attrs[attr]
+
+ Widget = self.get_widget(node_attrs['widget'])
+ widget = Widget(self, node_attrs)
+ assert name not in self.widgets
+ self.widgets[name] = widget
+
+ column = gtk.TreeViewColumn(field.attrs['string'])
+ column._type = 'field'
+ column.name = name
+
+ prefixes = []
+ suffixes = []
+ if node_attrs['widget'] in ('url', 'email', 'callto', 'sip'):
+ prefixes.append(Affix(self, node_attrs,
+ protocol=node_attrs['widget']))
+ if 'icon' in node_attrs:
+ prefixes.append(Affix(self, node_attrs))
+ for affix in node.childNodes:
+ affix_attrs = node_attributes(affix)
+ if 'name' not in affix_attrs:
+ affix_attrs['name'] = name
+ if affix.tagName == 'prefix':
+ list_ = prefixes
+ else:
+ list_ = suffixes
+ list_.append(Affix(self, affix_attrs))
+
+ for prefix in prefixes:
+ column.pack_start(prefix.renderer, expand=False)
+ column.set_cell_data_func(prefix.renderer,
+ prefix.setter)
+
+ column.pack_start(widget.renderer, expand=True)
+ column.set_cell_data_func(widget.renderer, widget.setter)
+
+ for suffix in suffixes:
+ column.pack_start(suffix.renderer, expand=False)
+ column.set_cell_data_func(suffix.renderer,
+ suffix.setter)
+
+ self.set_column_widget(column, field, node_attrs)
+ self.set_column_width(column, field, node_attrs)
+
+ if (not self.attributes.get('sequence')
+ and not self.children_field
+ and field.attrs.get('sortable', True)):
+ column.connect('clicked', self.sort_model)
+ column.set_visible(not node_attrs.get('tree_invisible', False))
+ if name == self.screen.exclude_field:
+ column.set_visible(False)
+
+ self.treeview.append_column(column)
+
+ self.add_sum(node_attrs)
+
+ def _parse_button(self, node):
+ node_attrs = node_attributes(node)
+ widget = Button(self, node_attrs)
+ self.state_widgets.append(widget)
+
+ column = gtk.TreeViewColumn(node_attrs.get('string', ''),
+ widget.renderer)
+ column._type = 'button'
+ column.name = None
+ column.set_cell_data_func(widget.renderer, widget.setter)
+
+ self.set_column_widget(column, None, node_attrs, arrow=False)
+ self.set_column_width(column, None, node_attrs)
+
+ column.set_visible(not node_attrs.get('tree_invisible', False))
+
+ self.treeview.append_column(column)
+
+ WIDGETS = {
+ 'char': Char,
+ 'many2one': M2O,
+ 'date': Date,
+ 'one2many': O2M,
+ 'many2many': M2M,
+ 'selection': Selection,
+ 'float': Float,
+ 'numeric': Float,
+ 'float_time': FloatTime,
+ 'integer': Int,
+ 'biginteger': Int,
+ 'datetime': Datetime,
+ 'time': Time,
+ 'boolean': Boolean,
+ 'text': Char,
+ 'url': URL,
+ 'email': URL,
+ 'callto': URL,
+ 'sip': URL,
+ 'progressbar': ProgressBar,
+ 'reference': Reference,
+ 'one2one': O2O,
+ 'binary': Binary,
+ 'image': Image,
+ }
+
+ @classmethod
+ def get_widget(cls, name):
+ return cls.WIDGETS[name]
+
+ @staticmethod
+ def set_column_widget(column, field, attributes, arrow=True):
+ tooltips = Tooltips()
+ hbox = gtk.HBox(False, 2)
+ label = gtk.Label(attributes['string'])
+ label.show()
+ help = attributes['string']
+ if field and field.attrs.get('help'):
+ help += '\n' + field.attrs['help']
+ elif attributes.get('help'):
+ help += '\n' + attributes['help']
+ tooltips.set_tip(label, help)
+ tooltips.enable()
+ arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
+ column.arrow = arrow
+ column.arrow_show = False
+ hbox.pack_start(label, True, True, 0)
+ if arrow:
+ hbox.pack_start(arrow, False, False, 0)
+ column.set_clickable(True)
+ hbox.show()
+ column.set_widget(hbox)
+
+ def set_column_width(self, column, field, attributes):
+ default_width = {
+ 'integer': 60,
+ 'biginteger': 60,
+ 'float': 80,
+ 'numeric': 80,
+ 'float_time': 100,
+ 'date': 110,
+ 'datetime': 160,
+ 'selection': 90,
+ 'char': 100,
+ 'one2many': 50,
+ 'many2many': 50,
+ 'boolean': 20,
+ 'binary': 200,
+ }
+
+ width = self.screen.tree_column_width[self.screen.model_name].get(
+ column.name)
+ if not width:
+ if 'width' in attributes:
+ width = int(attributes['width'])
+ elif field:
+ width = default_width.get(field.attrs['type'], 100)
+ else:
+ width = 80
+ column.width = width
+ if width > 0:
+ column.set_fixed_width(width)
+ column.set_min_width(1)
+
+ expand = attributes.get('expand', False)
+ column.set_expand(expand)
+ column.set_resizable(True)
+ column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+
+ def add_sum(self, attributes):
+ if 'sum' not in attributes:
+ return
+ if gtk.widget_get_default_direction() == gtk.TEXT_DIR_RTL:
+ text = _(':') + attributes['sum']
+ else:
+ text = attributes['sum'] + _(':')
+ label, sum_ = gtk.Label(text), gtk.Label()
+
+ hbox = gtk.HBox()
+ hbox.pack_start(label, expand=True, fill=False, padding=2)
+ hbox.pack_start(sum_, expand=True, fill=False, padding=2)
+ hbox.show_all()
+ self.sum_box.pack_start(hbox, expand=False, fill=False)
+
+ self.sum_widgets.append((attributes['name'], sum_))
+
+ def sort_model(self, column):
+ for col in self.treeview.get_columns():
+ if col != column:
+ col.arrow_show = False
+ col.arrow.hide()
+ self.screen.order = None
+ if not column.arrow_show:
+ column.arrow_show = True
+ column.arrow.set(gtk.ARROW_DOWN, gtk.SHADOW_IN)
+ column.arrow.show()
+ self.screen.order = [(column.name, 'ASC')]
+ else:
+ if column.arrow.get_property('arrow-type') == gtk.ARROW_DOWN:
+ column.arrow.set(gtk.ARROW_UP, gtk.SHADOW_IN)
+ self.screen.order = [(column.name, 'DESC')]
+ else:
+ column.arrow_show = False
+ column.arrow.hide()
+ model = self.treeview.get_model()
+ unsaved_records = [x for x in model.group if x.id < 0]
+ search_string = self.screen.screen_container.get_text() or None
+ if (self.screen.search_count == len(model)
+ or unsaved_records
+ or self.screen.parent):
+ ids = self.screen.search_filter(
+ search_string=search_string, only_ids=True)
+ model.sort(ids)
+ else:
+ self.screen.search_filter(search_string=search_string)
+ def add_last_column(self):
+ for column in self.treeview.get_columns():
+ if column.get_expand():
+ break
+ else:
+ column = gtk.TreeViewColumn()
+ column._type = 'fill'
+ column.name = None
+ column.arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
+ column.arrow_show = False
+ column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+ self.treeview.append_column(column)
+
+ def set_drag_and_drop(self):
dnd = False
if self.children_field:
- children_field = self.widget_tree.cells.get(self.children_field)
- if children_field:
- parent_name = children_field.attrs.get('relation_field')
- dnd = parent_name in self.widget_tree.cells
- elif self.widget_tree.sequence:
+ children = self.screen.group.fields.get(self.children_field)
+ if children:
+ parent_name = children.attrs.get('relation_field')
+ dnd = parent_name in self.widgets
+ elif self.attributes.get('sequence'):
dnd = True
# Disable DnD on mac until it is fully supported
if sys.platform == 'darwin':
dnd = False
- if screen.readonly:
+ if self.screen.readonly:
dnd = False
- if dnd:
- self.widget_tree.drag_source_set(
- gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
- [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
- gtk.gdk.ACTION_MOVE)
- self.widget_tree.drag_dest_set(gtk.DEST_DEFAULT_ALL,
- [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
- gtk.gdk.ACTION_MOVE)
-
- self.widget_tree.connect('drag-begin', self.drag_begin)
- self.widget_tree.connect('drag-motion', self.drag_motion)
- self.widget_tree.connect('drag-drop', self.drag_drop)
- self.widget_tree.connect("drag-data-get", self.drag_data_get)
- self.widget_tree.connect('drag-data-received',
- self.drag_data_received)
- self.widget_tree.connect('drag-data-delete', self.drag_data_delete)
-
- self.widget_tree.connect('key_press_event', self.on_keypress)
- if self.children_field:
- self.widget_tree.connect('test-expand-row', self.test_expand_row)
- self.widget_tree.set_expander_column(
- self.widget_tree.get_column(0))
+
+ if not dnd:
+ return
+
+ self.treeview.drag_source_set(
+ gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
+ [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
+ gtk.gdk.ACTION_MOVE)
+ self.treeview.drag_dest_set(gtk.DEST_DEFAULT_ALL,
+ [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0)],
+ gtk.gdk.ACTION_MOVE)
+
+ self.treeview.connect('drag-begin', self.drag_begin)
+ self.treeview.connect('drag-motion', self.drag_motion)
+ self.treeview.connect('drag-drop', self.drag_drop)
+ self.treeview.connect("drag-data-get", self.drag_data_get)
+ self.treeview.connect('drag-data-received',
+ self.drag_data_received)
+ self.treeview.connect('drag-data-delete', self.drag_data_delete)
@property
def modified(self):
@@ -329,10 +604,10 @@ class ViewList(ParserView):
@property
def editable(self):
- return bool(getattr(self.widget_tree, 'editable', False))
+ return bool(getattr(self.treeview, 'editable', False))
def get_fields(self):
- return [col.name for col in self.widget_tree.get_columns() if col.name]
+ return [col.name for col in self.treeview.get_columns() if col.name]
def get_buttons(self):
return [b for b in self.state_widgets
@@ -390,7 +665,7 @@ class ViewList(ParserView):
iter_ = model.iter_children(iter_)
if not iter_:
return False
- fields = [col.name for col in self.widget_tree.get_columns()
+ fields = [col.name for col in self.treeview.get_columns()
if col.name]
while iter_:
record = model.get_value(iter_, 0)
@@ -405,14 +680,14 @@ class ViewList(ParserView):
def on_copy(self):
for clipboard_type in (gtk.gdk.SELECTION_CLIPBOARD,
gtk.gdk.SELECTION_PRIMARY):
- clipboard = self.widget_tree.get_clipboard(clipboard_type)
+ clipboard = self.treeview.get_clipboard(clipboard_type)
targets = [
('STRING', 0, 0),
('TEXT', 0, 1),
('COMPOUND_TEXT', 0, 2),
('UTF8_STRING', 0, 3)
]
- selection = self.widget_tree.get_selection()
+ selection = self.treeview.get_selection()
# Set to clipboard directly if not too much selected rows
# to speed up paste
# Don't use set_with_data on mac see:
@@ -429,12 +704,12 @@ class ViewList(ParserView):
def copy_foreach(self, treemodel, path, iter, data):
record = treemodel.get_value(iter, 0)
values = []
- for col in self.widget_tree.get_columns():
+ for col in self.treeview.get_columns():
if not col.get_visible() or not col.name:
continue
- cell = self.widget_tree.cells[col.name]
+ widget = self.widgets[col.name]
values.append('"'
- + str(cell.get_textual_value(record)).replace('"', '""')
+ + str(widget.get_textual_value(record)).replace('"', '""')
+ '"')
data.append('\t'.join(values))
return
@@ -461,15 +736,15 @@ class ViewList(ParserView):
data = []
for clipboard_type in (gtk.gdk.SELECTION_CLIPBOARD,
gtk.gdk.SELECTION_PRIMARY):
- clipboard = self.widget_tree.get_clipboard(clipboard_type)
+ clipboard = self.treeview.get_clipboard(clipboard_type)
text = clipboard.wait_for_text()
if not text:
continue
data = [[unquote(v) for v in l.split('\t')]
for l in text.splitlines()]
break
- col = self.widget_tree.get_cursor()[1]
- columns = [c for c in self.widget_tree.get_columns()
+ col = self.treeview.get_cursor()[1]
+ columns = [c for c in self.treeview.get_columns()
if c.get_visible() and c.name]
if col in columns:
idx = columns.index(col)
@@ -491,10 +766,10 @@ class ViewList(ParserView):
group.add(record)
record = group[idx]
for col, value in zip(columns, line):
- cell = self.widget_tree.cells[col.name]
- if cell.get_textual_value(record) != value:
- cell.value_from_text(record, value)
- if value and not cell.get_textual_value(record):
+ widget = self.widgets[col.name]
+ if widget.get_textual_value(record) != value:
+ widget.value_from_text(record, value)
+ if value and not widget.get_textual_value(record):
# Stop setting value if a value is correctly set
idx = len(group)
break
@@ -529,9 +804,9 @@ class ViewList(ParserView):
etime):
treeview.emit_stop_by_name('drag-data-get')
- def _func_sel_get(store, path, iter_, data):
- value = store.get_value(iter_, 0)
- data.append(json.dumps(value.get_path(store.group)))
+ def _func_sel_get(model, path, iter_, data):
+ value = model.get_value(iter_, 0)
+ data.append(json.dumps(value.get_path(model.group)))
data = []
treeselection = treeview.get_selection()
treeselection.selected_foreach(_func_sel_get, data)
@@ -544,8 +819,8 @@ class ViewList(ParserView):
def drag_data_received(self, treeview, context, x, y, selection,
info, etime):
treeview.emit_stop_by_name('drag-data-received')
- if treeview.sequence:
- field = self.screen.group.fields[treeview.sequence]
+ if self.attributes.get('sequence'):
+ field = self.screen.group.fields[self.attributes['sequence']]
for record in self.screen.group:
if field.get_state_attrs(
record).get('readonly', False):
@@ -561,13 +836,13 @@ class ViewList(ParserView):
if renderer.props.editing:
return
- store = treeview.get_model()
+ model = treeview.get_model()
try:
data = json.loads(selection.data)
except ValueError:
return
- record = store.group.get_by_path(data)
- record_path = store.on_get_path(record)
+ record = model.group.get_by_path(data)
+ record_path = model.on_get_path(record)
drop_info = treeview.get_dest_row_at_pos(x, y)
def check_recursion(from_, to):
@@ -588,16 +863,16 @@ class ViewList(ParserView):
if not check_recursion(record_path, check_path):
return
if position == gtk.TREE_VIEW_DROP_BEFORE:
- store.move_before(record, path)
+ model.move_before(record, path)
elif position == gtk.TREE_VIEW_DROP_AFTER:
- store.move_after(record, path)
+ model.move_after(record, path)
elif self.children_field:
- store.move_into(record, path)
+ model.move_into(record, path)
else:
- store.move_after(record, (len(store) - 1,))
+ model.move_after(record, (len(model) - 1,))
context.drop_finish(False, etime)
- if treeview.sequence:
- record.group.set_sequence(field=treeview.sequence)
+ if self.attributes.get('sequence'):
+ record.group.set_sequence(field=self.attributes['sequence'])
return True
def drag_data_delete(self, treeview, context):
@@ -636,7 +911,7 @@ class ViewList(ParserView):
parent = parent.parent
else:
populate(menu, group.model_name, record)
- for col in self.widget_tree.get_columns():
+ for col in self.treeview.get_columns():
if not col.get_visible() or not col.name:
continue
field = group.fields[col.name]
@@ -664,11 +939,12 @@ class ViewList(ParserView):
return False
def group_list_changed(self, group, signal):
- if self.store is not None:
+ model = self.treeview.get_model()
+ if model is not None:
if signal[0] == 'record-added':
- self.store.added(group, signal[1])
+ model.added(group, signal[1])
elif signal[0] == 'record-removed':
- self.store.removed(group, signal[1])
+ model.removed(group, signal[1])
self.display()
def __str__(self):
@@ -682,7 +958,7 @@ class ViewList(ParserView):
return
fields = {}
last_col = None
- for col in self.widget_tree.get_columns():
+ for col in self.treeview.get_columns():
if col.get_visible():
last_col = col
if not hasattr(col, 'name') or not hasattr(col, 'width'):
@@ -706,7 +982,7 @@ class ViewList(ParserView):
def destroy(self):
self.save_width_height()
- self.widget_tree.destroy()
+ self.treeview.destroy()
def __sig_switch(self, treeview, path, column):
if column._type == 'button':
@@ -770,40 +1046,39 @@ class ViewList(ParserView):
go_previous()
# Delay the pre_validate to let GTK process the current event
gobject.idle_add(pre_validate)
- self.update_children()
+ self.update_sum()
def set_value(self):
if self.editable:
- self.widget_tree.set_value()
+ self.treeview.set_value()
def reset(self):
pass
- # self.widget.set_model(self.store) could be removed if the store
- # has not changed -> better ergonomy. To test
def display(self):
+ self.treeview.display_counter += 1
current_record = self.screen.current_record
if (self.reload
- or not self.widget_tree.get_model()
+ or not self.treeview.get_model()
or (self.screen.group !=
- self.widget_tree.get_model().group)):
- self.store = AdaptModelGroup(self.screen.group,
+ self.treeview.get_model().group)):
+ model = AdaptModelGroup(self.screen.group,
self.children_field)
- self.widget_tree.set_model(self.store)
+ self.treeview.set_model(model)
# __select_changed resets current_record to None
self.screen.current_record = current_record
if current_record:
- selection = self.widget_tree.get_selection()
- path = self.store.on_get_path(current_record)
+ selection = self.treeview.get_selection()
+ path = model.on_get_path(current_record)
selection.select_path(path)
self.reload = False
if not current_record:
- selection = self.widget_tree.get_selection()
+ selection = self.treeview.get_selection()
selection.unselect_all()
- self.widget_tree.queue_draw()
+ self.treeview.queue_draw()
if self.editable:
self.set_state()
- self.update_children()
+ self.update_sum()
def set_state(self):
record = self.screen.current_record
@@ -813,62 +1088,64 @@ class ViewList(ParserView):
if field:
field.state_set(record)
- def update_children(self):
+ @delay
+ def update_sum(self):
selected_records = self.selected_records
- for child in self.children:
- value = 0
- value_selected = 0
+ for name, label in self.sum_widgets:
+ sum_ = 0
+ selected_sum = 0
loaded = True
- child_fieldname = self.children[child][0]
+ digit = 0
for record in self.screen.group:
- if not record.get_loaded([child_fieldname]):
+ if not record.get_loaded([name]) and record.id >= 0:
loaded = False
break
- field_value = record.fields_get()[child_fieldname].get(record)
- if field_value is not None:
- value += field_value
+ field = record[name]
+ value = field.get(record)
+ if value is not None:
+ sum_ += value
if record in selected_records or not selected_records:
- value_selected += field_value
+ selected_sum += value
+ digit = max(field.digits(record)[1], digit)
if loaded:
- label_str = locale.format('%.*f',
- (self.children[child][3], value_selected), True)
- label_str += ' / '
- label_str += locale.format('%.*f',
- (self.children[child][3], value), True)
+ text = '%s / %s' % (
+ locale.format('%.*f', (digit, selected_sum), True),
+ locale.format('%.*f', (digit, sum_), True))
else:
- label_str = '-'
- self.children[child][2].set_text(label_str)
+ text = '-'
+ label.set_text(text)
def set_cursor(self, new=False, reset_view=True):
- self.widget_tree.grab_focus()
+ self.treeview.grab_focus()
if self.screen.current_record:
- path = self.store.on_get_path(self.screen.current_record)
- if self.store.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
+ model = self.treeview.get_model()
+ path = model.on_get_path(self.screen.current_record)
+ if model.get_flags() & gtk.TREE_MODEL_LIST_ONLY:
path = (path[0],)
- focus_column = self.widget_tree.next_column(path, editable=new)
+ focus_column = self.treeview.next_column(path, editable=new)
if path[:-1]:
- self.widget_tree.expand_to_path(path[:-1])
- self.widget_tree.scroll_to_cell(path, focus_column,
+ self.treeview.expand_to_path(path[:-1])
+ self.treeview.scroll_to_cell(path, focus_column,
use_align=False)
- current_path = self.widget_tree.get_cursor()[0]
+ current_path = self.treeview.get_cursor()[0]
selected_path = \
- self.widget_tree.get_selection().get_selected_rows()[1]
+ self.treeview.get_selection().get_selected_rows()[1]
if (current_path != path and path not in selected_path) or new:
- self.widget_tree.set_cursor(path, focus_column, new)
+ self.treeview.set_cursor(path, focus_column, new)
@property
def selected_records(self):
- def _func_sel_get(store, path, iter, records):
- records.append(store.on_get_iter(path))
+ def _func_sel_get(model, path, iter, records):
+ records.append(model.on_get_iter(path))
records = []
- sel = self.widget_tree.get_selection()
+ sel = self.treeview.get_selection()
sel.selected_foreach(_func_sel_get, records)
return records
def unset_editable(self):
- self.widget_tree.editable = False
- for col in self.widget_tree.get_columns():
+ self.treeview.editable = False
+ for col in self.treeview.get_columns():
for renderer in col.get_cell_renderers():
if isinstance(renderer, CellRendererToggle):
renderer.set_property('activatable', False)
@@ -880,7 +1157,7 @@ class ViewList(ParserView):
renderer.set_property('editable', False)
def get_selected_paths(self):
- selection = self.widget_tree.get_selection()
+ selection = self.treeview.get_selection()
model, rows = selection.get_selected_rows()
id_paths = []
for row in rows:
@@ -893,17 +1170,17 @@ class ViewList(ParserView):
return id_paths
def select_nodes(self, nodes):
- selection = self.widget_tree.get_selection()
+ selection = self.treeview.get_selection()
if not nodes:
return
selection.unselect_all()
scroll = False
for node in nodes:
- path = path_convert_id2pos(self.store, node)
+ path = path_convert_id2pos(self.treeview.get_model(), node)
if path:
selection.select_path(path)
if not scroll:
- self.widget_tree.scroll_to_cell(path)
+ self.treeview.scroll_to_cell(path)
scroll = True
def get_expanded_paths(self, starting_path=None, starting_id_path=None):
@@ -914,12 +1191,13 @@ class ViewList(ParserView):
if not starting_id_path:
starting_id_path = []
id_paths = []
- record = self.store.on_get_iter(starting_path)
- for path_idx in range(self.store.on_iter_n_children(record)):
+ model = self.treeview.get_model()
+ record = model.on_get_iter(starting_path)
+ for path_idx in range(model.on_iter_n_children(record)):
path = starting_path + [path_idx]
- expanded = self.widget_tree.row_expanded(tuple(path))
+ expanded = self.treeview.row_expanded(tuple(path))
if expanded:
- expanded_record = self.store.on_get_iter(path)
+ expanded_record = model.on_get_iter(path)
id_path = starting_id_path + [expanded_record.id]
id_paths.append(id_path)
child_id_paths = self.get_expanded_paths(path, id_path)
@@ -927,7 +1205,8 @@ class ViewList(ParserView):
return id_paths
def expand_nodes(self, nodes):
+ model = self.treeview.get_model()
for node in nodes:
- expand_path = path_convert_id2pos(self.store, node)
+ expand_path = path_convert_id2pos(model, node)
if expand_path:
- self.widget_tree.expand_to_path(expand_path)
+ self.treeview.expand_to_path(expand_path)
diff --git a/tryton/gui/window/view_form/view/list_gtk/__init__.py b/tryton/gui/window/view_form/view/list_gtk/__init__.py
index 5218f22..c86640b 100644
--- a/tryton/gui/window/view_form/view/list_gtk/__init__.py
+++ b/tryton/gui/window/view_form/view/list_gtk/__init__.py
@@ -1,3 +1,2 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
-from parser import *
diff --git a/tryton/gui/window/view_form/view/list_gtk/editabletree.py b/tryton/gui/window/view_form/view/list_gtk/editabletree.py
index 2a566f4..eb24be4 100644
--- a/tryton/gui/window/view_form/view/list_gtk/editabletree.py
+++ b/tryton/gui/window/view_form/view/list_gtk/editabletree.py
@@ -1,7 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
import gtk
-import parser
import gettext
import gobject
from itertools import islice, cycle
@@ -13,10 +12,7 @@ _ = gettext.gettext
class TreeView(gtk.TreeView):
-
- def __init__(self):
- super(TreeView, self).__init__()
- self.cells = {}
+ display_counter = 0
def next_column(self, path, column=None, editable=True, _sign=1):
columns = self.get_columns()
@@ -53,44 +49,41 @@ class EditableTreeView(TreeView):
leaving_events = leaving_record_events + (gtk.keysyms.Tab,
gtk.keysyms.ISO_Left_Tab, gtk.keysyms.KP_Enter)
- def __init__(self, position):
+ def __init__(self, position, view):
super(EditableTreeView, self).__init__()
self.editable = position
+ self.view = view
def on_quit_cell(self, current_record, fieldname, value, callback=None):
field = current_record[fieldname]
- cell = self.cells[fieldname]
+ widget = self.view.widgets[fieldname]
# The value has not changed and is valid ... do nothing.
- if value == cell.get_textual_value(current_record) \
+ if value == widget.get_textual_value(current_record) \
and field.validate(current_record):
if callback:
callback()
return
-
- try:
- cell.value_from_text(current_record, value, callback=callback)
- except parser.UnsettableColumn:
- return
+ widget.value_from_text(current_record, value, callback=callback)
def on_open_remote(self, current_record, fieldname, create, value,
entry=None, callback=None):
- cell = self.cells[fieldname]
- if value != cell.get_textual_value(current_record) or not value:
+ widget = self.view.widgets[fieldname]
+ if value != widget.get_textual_value(current_record) or not value:
changed = True
else:
changed = False
try:
- cell.open_remote(current_record, create, changed, value,
+ widget.open_remote(current_record, create, changed, value,
callback=callback)
except NotImplementedError:
pass
def on_create_line(self):
- access = MODELACCESS[self.screen.model_name]
+ access = MODELACCESS[self.view.screen.model_name]
model = self.get_model()
- if not access['create'] or (self.screen.size_limit is not None
- and (len(model) >= self.screen.size_limit >= 0)):
+ if not access['create'] or (self.view.screen.size_limit is not None
+ and (len(model) >= self.view.screen.size_limit >= 0)):
return
if self.editable == 'top':
method = model.prepend
@@ -128,6 +121,7 @@ class EditableTreeView(TreeView):
path, column = self.get_cursor()
model = self.get_model()
record = model.get_value(model.get_iter(path), 0)
+ self.display_counter += 1 # Force a display
leaving = False
if event.keyval == gtk.keysyms.Right:
@@ -170,7 +164,7 @@ class EditableTreeView(TreeView):
gobject.idle_add(self.set_cursor, path,
self.prev_column(path, column), True)
elif keyval in self.leaving_record_events:
- fields = self.cells.keys()
+ fields = self.view.widgets.keys()
if not record.validate(fields):
invalid_fields = record.invalid_fields
col = None
@@ -179,9 +173,9 @@ class EditableTreeView(TreeView):
break
gobject.idle_add(self.set_cursor, path, col, True)
return
- if ((self.screen.pre_validate
+ if ((self.view.screen.pre_validate
and not record.pre_validate())
- or (not self.screen.parent
+ or (not self.view.screen.parent
and not record.save())):
gobject.idle_add(self.set_cursor, path, column,
True)
@@ -211,8 +205,8 @@ class EditableTreeView(TreeView):
entry.handler_block(entry.editing_done_id)
def callback():
- cell = self.cells[column.name]
- value = cell.get_textual_value(record)
+ widget = self.view.widgets[column.name]
+ value = widget.get_textual_value(record)
if isinstance(entry, gtk.Entry):
entry.set_text(value)
else:
@@ -229,7 +223,7 @@ class EditableTreeView(TreeView):
# set_value
field.editabletree_entry = entry
- def remove_widget(cell):
+ def remove_widget(widget):
if hasattr(field, 'editabletree_entry'):
del field.editabletree_entry
entry.connect('remove-widget', remove_widget)
diff --git a/tryton/gui/window/view_form/view/list_gtk/parser.py b/tryton/gui/window/view_form/view/list_gtk/widget.py
similarity index 57%
rename from tryton/gui/window/view_form/view/list_gtk/parser.py
rename to tryton/gui/window/view_form/view/list_gtk/widget.py
index 478cd62..4067f10 100644
--- a/tryton/gui/window/view_form/view/list_gtk/parser.py
+++ b/tryton/gui/window/view_form/view/list_gtk/widget.py
@@ -10,14 +10,11 @@ import webbrowser
from functools import wraps, partial
-from editabletree import EditableTreeView, TreeView
-from tryton.gui.window.view_form.view.interface import ParserInterface
from tryton.gui.window.win_search import WinSearch
from tryton.gui.window.win_form import WinForm
from tryton.gui.window.view_form.screen import Screen
import tryton.rpc as rpc
-from tryton.common import COLORS, node_attributes, \
- file_selection, file_open, slugify
+from tryton.common import COLORS, file_selection, file_open, slugify
import tryton.common as common
from tryton.common.cellrendererbutton import CellRendererButton
from tryton.common.cellrendererdate import CellRendererDate
@@ -31,7 +28,7 @@ from tryton.common.cellrendererbinary import CellRendererBinary
from tryton.common.cellrendererclickablepixbuf import \
CellRendererClickablePixbuf
from tryton.translate import date_format
-from tryton.common import RPCExecute, RPCException
+from tryton.common import data2pixbuf
from tryton.common.completion import get_completion, update_completion
from tryton.common.selection import SelectionMixin, PopdownMixin
@@ -46,261 +43,75 @@ def send_keys(renderer, editable, position, treeview):
editable.connect('changed', treeview.on_editing_done)
-def sort_model(column, treeview, screen):
- for col in treeview.get_columns():
- if col != column:
- col.arrow_show = False
- col.arrow.hide()
- screen.order = None
- if not column.arrow_show:
- column.arrow_show = True
- column.arrow.set(gtk.ARROW_DOWN, gtk.SHADOW_IN)
- column.arrow.show()
- screen.order = [(column.name, 'ASC')]
- else:
- if column.arrow.get_property('arrow-type') == gtk.ARROW_DOWN:
- column.arrow.set(gtk.ARROW_UP, gtk.SHADOW_IN)
- screen.order = [(column.name, 'DESC')]
- else:
- column.arrow_show = False
- column.arrow.hide()
- store = treeview.get_model()
- unsaved_records = [x for x in store.group if x.id < 0]
- search_string = screen.screen_container.get_text() or None
- if screen.search_count == len(store) or unsaved_records or screen.parent:
- ids = screen.search_filter(search_string=search_string, only_ids=True)
- store.sort(ids)
- else:
- screen.search_filter(search_string=search_string)
-
-
def realized(func):
"Decorator for treeview realized"
@wraps(func)
def wrapper(self, *args, **kwargs):
- if (hasattr(self.treeview, 'get_realized')
- and not self.treeview.get_realized()):
+ if (hasattr(self.view.treeview, 'get_realized')
+ and not self.view.treeview.get_realized()):
return
return func(self, *args, **kwargs)
return wrapper
-class ParserTree(ParserInterface):
-
- def __init__(self, parent=None, attrs=None, screen=None,
- children_field=None):
- super(ParserTree, self).__init__(parent, attrs, screen,
- children_field=children_field)
- self.treeview = None
-
- def parse(self, model_name, root_node, fields):
- dict_widget = {}
- state_widgets = []
- attrs = node_attributes(root_node)
- on_write = attrs.get('on_write', '')
- editable = attrs.get('editable', False)
- if editable:
- treeview = EditableTreeView(editable)
- else:
- treeview = TreeView()
- treeview.cells = {}
- treeview.sequence = attrs.get('sequence', False)
- treeview.colors = attrs.get('colors', '"black"')
- treeview.keyword_open = attrs.get('keyword_open', False)
- self.treeview = treeview
- treeview.set_property('rules-hint', True)
- if not self.title:
- self.title = attrs.get('string', 'Unknown')
- tooltips = common.Tooltips()
- expandable = False
-
- for node in root_node.childNodes:
- node_attrs = node_attributes(node)
- if node.localName == 'field':
- fname = str(node_attrs['name'])
- for boolean_fields in ('readonly', 'required', 'expand'):
- if boolean_fields in node_attrs:
- node_attrs[boolean_fields] = \
- bool(int(node_attrs[boolean_fields]))
- if fname not in fields:
- continue
- for attr_name in ('relation', 'domain', 'selection',
- 'relation_field', 'string', 'views', 'invisible',
- 'add_remove', 'sort', 'context', 'filename',
- 'selection_change_with'):
- if attr_name in fields[fname].attrs and \
- not attr_name in node_attrs:
- node_attrs[attr_name] = fields[fname].attrs[attr_name]
- cell_type = node_attrs.get('widget',
- fields[fname].attrs['type'])
- cell = CELLTYPES.get(cell_type)(fname, model_name,
- treeview, node_attrs)
- treeview.cells[fname] = cell
- renderer = cell.renderer
-
- readonly = not (editable and not node_attrs.get('readonly',
- fields[fname].attrs.get('readonly', False)))
- if isinstance(renderer, CellRendererToggle):
- renderer.set_property('activatable', not readonly)
- elif isinstance(renderer,
- (gtk.CellRendererProgress, CellRendererButton)):
- pass
- else:
- renderer.set_property('editable', not readonly)
- if (not readonly
- and not isinstance(renderer, CellRendererBinary)):
- renderer.connect_after('editing-started', send_keys,
- treeview)
-
- col = gtk.TreeViewColumn(fields[fname].attrs['string'])
-
- prefixes = []
- suffixes = []
- if cell_type in ('url', 'email', 'callto', 'sip'):
- prefixes.append(Affix(fname, self.treeview, node_attrs,
- protocol=cell_type))
- if 'icon' in node_attrs:
- prefixes.append(Affix(fname, self.treeview, node_attrs))
- for affix in node.childNodes:
- affix_attrs = node_attributes(affix)
- if affix.localName == 'prefix':
- list_ = prefixes
- else:
- list_ = suffixes
- list_.append(Affix(fname, self.treeview, affix_attrs))
-
- for prefix in prefixes:
- col.pack_start(prefix.renderer, expand=False)
- col.set_cell_data_func(prefix.renderer, prefix.setter)
-
- col.pack_start(renderer, expand=True)
- col.set_cell_data_func(renderer, cell.setter)
- col.name = fname
-
- for suffix in suffixes:
- col.pack_start(suffix.renderer, expand=False)
- col.set_cell_data_func(suffix.renderer, suffix.setter)
-
- hbox = gtk.HBox(False, 2)
- label = gtk.Label(fields[fname].attrs['string'])
- label.show()
- help = fields[fname].attrs['string']
- if fields[fname].attrs.get('help'):
- help += '\n' + fields[fname].attrs['help']
- tooltips.set_tip(label, help)
- tooltips.enable()
- arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
- col.arrow = arrow
- col.arrow_show = False
- hbox.pack_start(label, True, True, 0)
- hbox.pack_start(arrow, False, False, 0)
- hbox.show()
- col.set_widget(hbox)
-
- col._type = fields[fname].attrs['type']
- col.set_clickable(True)
- twidth = {
- 'integer': 60,
- 'biginteger': 60,
- 'float': 80,
- 'numeric': 80,
- 'float_time': 100,
- 'date': 110,
- 'datetime': 160,
- 'selection': 90,
- 'char': 100,
- 'one2many': 50,
- 'many2many': 50,
- 'boolean': 20,
- 'binary': 200,
- }
- width = self.screen.tree_column_width[model_name].get(fname)
- if not width:
- if 'width' in node_attrs:
- width = int(node_attrs['width'])
- else:
- width = twidth.get(fields[fname].attrs['type'], 100)
- col.width = width
- if width > 0:
- col.set_fixed_width(width)
- col.set_min_width(1)
- expand = node_attrs.get('expand', False)
- col.set_expand(expand)
- expandable |= expand
- if (not treeview.sequence
- and not self.children_field
- and fields[fname].attrs.get('sortable', True)):
- col.connect('clicked', sort_model, treeview, self.screen)
- col.set_resizable(True)
- col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
- col.set_visible(not node_attrs.get('tree_invisible',
- fields[fname].attrs.get('tree_invisible', False)))
- if fname == self.screen.exclude_field:
- col.set_visible(False)
- i = treeview.append_column(col)
- if 'sum' in node_attrs and fields[fname].attrs['type'] \
- in ('integer', 'biginteger', 'float', 'numeric',
- 'float_time'):
- label = gtk.Label(node_attrs['sum'] + _(': '))
- label_sum = gtk.Label()
- if isinstance(fields[fname].attrs.get('digits'),
- basestring):
- digits = 2
- else:
- digits = fields[fname].attrs.get('digits', (16, 2))[1]
- dict_widget[i] = (fname, label, label_sum, digits)
- elif node.localName == 'button':
- #TODO add shortcut
- cell = Button(treeview, self.screen, node_attrs)
- state_widgets.append(cell)
- renderer = cell.renderer
- string = node_attrs.get('string', _('Unknown'))
- col = gtk.TreeViewColumn(string, renderer)
- col.name = None
- col.set_visible(not node_attrs.get('tree_invisible', False))
-
- label = gtk.Label(string)
- label.show()
- help = string
- if node_attrs.get('help'):
- help += '\n' + node_attrs['help']
- tooltips.set_tip(label, help)
- tooltips.enable()
- arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
- col.arrow = arrow
- col.arrow_show = False
- col.set_widget(label)
-
- col._type = 'button'
- col.set_cell_data_func(renderer, cell.setter)
- if 'width' in node_attrs:
- width = int(node_attrs['width'])
+class CellCache(list):
+
+ methods = ('set_active', 'set_sensitive', 'set_property')
+
+ def apply(self, cell):
+ for method, args, kwargs in self:
+ getattr(cell, method)(*args, **kwargs)
+
+ def decorate(self, cell):
+ def decorate(func):
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ self.append((func.__name__, args, kwargs))
+ return func(*args, **kwargs)
+ wrapper.previous = func
+ return wrapper
+
+ for method in self.methods:
+ if getattr(cell, method, None):
+ setattr(cell, method, decorate(getattr(cell, method)))
+ cell.decorated = True
+ return cell
+
+ def undecorate(self, cell):
+ for method in self.methods:
+ if getattr(cell, method, None):
+ setattr(cell, method, getattr(cell, method).previous)
+ del cell.decorated
+
+ @classmethod
+ def cache(cls, func):
+ @wraps(func)
+ def wrapper(self, column, cell, store, iter):
+ if not hasattr(self, 'display_counters'):
+ self.display_counters = {}
+ if not hasattr(self, 'cell_caches'):
+ self.cell_caches = {}
+ record = store.get_value(iter, 0)
+ counter = self.view.treeview.display_counter
+ if (self.display_counters.get(record.id) != counter):
+ if getattr(cell, 'decorated', None):
+ func(self, column, cell, store, iter)
else:
- width = 80
- col.width = width
- if width > 0:
- col.set_fixed_width(width)
- col.set_resizable(True)
- col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
- i = treeview.append_column(col)
- if not expandable:
- col = gtk.TreeViewColumn()
- col.name = None
- arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_IN)
- col.arrow = arrow
- col.arrow_show = False
- col._type = 'fill'
- col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
- treeview.append_column(col)
- treeview.set_fixed_height_mode(True)
- return treeview, dict_widget, state_widgets, on_write, [], None
+ cache = cls()
+ cache.decorate(cell)
+ func(self, column, cell, store, iter)
+ cache.undecorate(cell)
+ self.cell_caches[record.id] = cache
+ self.display_counters[record.id] = counter
+ else:
+ self.cell_caches[record.id].apply(cell)
+ return wrapper
class Affix(object):
- def __init__(self, field_name, treeview, attrs, protocol=None):
+ def __init__(self, view, attrs, protocol=None):
super(Affix, self).__init__()
- self.field_name = attrs.get('name', field_name)
self.attrs = attrs
self.protocol = protocol
self.icon = attrs.get('icon')
@@ -313,12 +124,13 @@ class Affix(object):
self.renderer = gtk.CellRendererPixbuf()
else:
self.renderer = gtk.CellRendererText()
- self.treeview = treeview
+ self.view = view
@realized
+ @CellCache.cache
def setter(self, column, cell, store, iter_):
record = store.get_value(iter_, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
field.state_set(record, states=('invisible',))
invisible = field.get_state_attrs(record).get('invisible', False)
cell.set_property('visible', not invisible)
@@ -328,7 +140,7 @@ class Affix(object):
else:
value = self.icon
common.ICONFACTORY.register_icon(value)
- pixbuf = self.treeview.render_icon(stock_id=value,
+ pixbuf = self.view.treeview.render_icon(stock_id=value,
size=gtk.ICON_SIZE_BUTTON, detail=None)
cell.set_property('pixbuf', pixbuf)
else:
@@ -338,9 +150,9 @@ class Affix(object):
cell.set_property('text', text)
def clicked(self, renderer, path):
- store = self.treeview.get_model()
+ store = self.view.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
- value = record[self.field_name].get(record)
+ value = record[self.attrs['name']].get(record)
if value:
if self.protocol == 'email':
value = 'mailto:%s' % value
@@ -353,19 +165,28 @@ class Affix(object):
class Char(object):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
+ def __init__(self, view, attrs, renderer=None):
super(Char, self).__init__()
- self.field_name = field_name
- self.model_name = model_name
- self.attrs = attrs or {}
+ self.attrs = attrs
if renderer is None:
renderer = CellRendererText
self.renderer = renderer()
self.renderer.connect('editing-started', self.editing_started)
- self.treeview = treeview
+ if not isinstance(self.renderer, CellRendererBinary):
+ self.renderer.connect_after('editing-started', send_keys,
+ view.treeview)
+ self.view = view
+
+ @property
+ def field_name(self):
+ return self.attrs['name']
+
+ @property
+ def model_name(self):
+ return self.view.screen.model_name
@realized
+ @CellCache.cache
def setter(self, column, cell, store, iter):
record = store.get_value(iter, 0)
text = self.get_textual_value(record)
@@ -385,7 +206,7 @@ class Char(object):
else:
cell.set_property('foreground-set', True)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
if self.attrs.get('type', field.attrs.get('type')) in \
('float', 'integer', 'biginteger', 'boolean',
@@ -394,17 +215,16 @@ class Char(object):
else:
align = 0
+ editable = getattr(self.view.treeview, 'editable', False)
states = ('invisible',)
- if hasattr(self.treeview, 'editable') \
- and self.treeview.editable:
+ if editable:
states = ('readonly', 'required', 'invisible')
field.state_set(record, states=states)
invisible = field.get_state_attrs(record).get('invisible', False)
cell.set_property('visible', not invisible)
- if hasattr(self.treeview, 'editable') \
- and self.treeview.editable:
+ if editable:
readonly = self.attrs.get('readonly',
field.get_state_attrs(record).get('readonly', False))
if invisible:
@@ -427,8 +247,8 @@ class Char(object):
if isinstance(cell, CellRendererToggle):
cell.set_property('activatable', not readonly)
- elif isinstance(cell,
- (gtk.CellRendererProgress, CellRendererButton)):
+ elif isinstance(cell, (gtk.CellRendererProgress,
+ CellRendererButton, gtk.CellRendererPixbuf)):
pass
else:
cell.set_property('editable', not readonly)
@@ -436,7 +256,7 @@ class Char(object):
cell.set_property('xalign', align)
def get_color(self, record):
- return record.expr_eval(self.treeview.colors)
+ return record.expr_eval(self.view.attributes.get('colors', '"black"'))
def open_remote(self, record, create, changed=False, text=None,
callback=None):
@@ -445,10 +265,10 @@ class Char(object):
def get_textual_value(self, record):
if not record:
return ''
- return record[self.field_name].get_client(record)
+ return record[self.attrs['name']].get_client(record)
def value_from_text(self, record, text, callback=None):
- field = record[self.field_name]
+ field = record[self.attrs['name']]
field.set_client(record, text)
if callback:
callback()
@@ -457,29 +277,28 @@ class Char(object):
return False
def _get_record_field(self, path):
- store = self.treeview.get_model()
+ store = self.view.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
- field = record.group.fields[self.field_name]
+ field = record.group.fields[self.attrs['name']]
return record, field
class Int(Char):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
+ def __init__(self, view, attrs, renderer=None):
if renderer is None:
renderer = CellRendererInteger
- super(Int, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ super(Int, self).__init__(view, attrs, renderer=renderer)
self.factor = float(attrs.get('factor', 1))
def get_textual_value(self, record):
if not record:
return ''
- return record[self.field_name].get_client(record, factor=self.factor)
+ return record[self.attrs['name']].get_client(
+ record, factor=self.factor)
def value_from_text(self, record, text, callback=None):
- field = record[self.field_name]
+ field = record[self.attrs['name']]
field.set_client(record, text, factor=self.factor)
if callback:
callback()
@@ -487,33 +306,33 @@ class Int(Char):
class Boolean(Char):
- def __init__(self, field_name, model_name, treeview, attrs=None,
+ def __init__(self, view, attrs=None,
renderer=None):
if renderer is None:
renderer = CellRendererToggle
- super(Boolean, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ super(Boolean, self).__init__(view, attrs, renderer=renderer)
self.renderer.connect('toggled', self._sig_toggled)
def _sig_toggled(self, renderer, path):
- store = self.treeview.get_model()
+ store = self.view.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
if not self.attrs.get('readonly',
field.get_state_attrs(record).get('readonly', False)):
- value = record[self.field_name].get_client(record)
- record[self.field_name].set_client(record, int(not value))
- self.treeview.set_cursor(path)
+ value = record[self.attrs['name']].get_client(record)
+ record[self.attrs['name']].set_client(record, int(not value))
+ self.view.treeview.set_cursor(path)
return True
class URL(Char):
@realized
+ @CellCache.cache
def setter(self, column, cell, store, iter):
super(URL, self).setter(column, cell, store, iter)
record = store.get_value(iter, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
field.state_set(record, states=('readonly',))
readonly = field.get_state_attrs(record).get('readonly', False)
cell.set_property('visible', not readonly)
@@ -521,12 +340,10 @@ class URL(Char):
class Date(Char):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
+ def __init__(self, view, attrs, renderer=None):
if renderer is None:
renderer = partial(CellRendererDate, date_format())
- super(Date, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ super(Date, self).__init__(view, attrs, renderer=renderer)
self.renderer.connect('editing-started', self.editing_started)
@@ -536,7 +353,7 @@ class Datetime(Date):
def setter(self, column, cell, store, iter):
super(Datetime, self).setter(column, cell, store, iter)
record = store.get_value(iter, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
time_format = field.time_format(record)
self.renderer.format = date_format() + ' ' + time_format
@@ -547,45 +364,41 @@ class Time(Date):
def setter(self, column, cell, store, iter):
super(Time, self).setter(column, cell, store, iter)
record = store.get_value(iter, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
time_format = field.time_format(record)
self.renderer.format = time_format
class Float(Int):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
+ def __init__(self, view, attrs, renderer=None):
if renderer is None:
renderer = CellRendererFloat
- super(Float, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ super(Float, self).__init__(view, attrs, renderer=renderer)
@realized
def setter(self, column, cell, store, iter):
super(Float, self).setter(column, cell, store, iter)
record = store.get_value(iter, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
digits = field.digits(record, factor=self.factor)
cell.digits = digits
class FloatTime(Char):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
- super(FloatTime, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ def __init__(self, view, attrs, renderer=None):
+ super(FloatTime, self).__init__(view, attrs, renderer=renderer)
self.conv = None
if attrs and attrs.get('float_time'):
self.conv = rpc.CONTEXT.get(attrs['float_time'])
def get_textual_value(self, record):
- val = record[self.field_name].get(record)
+ val = record[self.attrs['name']].get(record)
return common.float_time_to_text(val, self.conv)
def value_from_text(self, record, text, callback=None):
- field = record[self.field_name]
+ field = record[self.attrs['name']]
digits = field.digits(record)
field.set_client(record,
common.text_to_float_time(text, self.conv, digits[1]))
@@ -595,13 +408,11 @@ class FloatTime(Char):
class Binary(Char):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
+ def __init__(self, view, attrs, renderer=None):
self.filename = attrs.get('filename')
if renderer is None:
renderer = partial(CellRendererBinary, bool(self.filename))
- super(Binary, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ super(Binary, self).__init__(view, attrs, renderer=renderer)
self.renderer.connect('new', self.new_binary)
self.renderer.connect('open', self.open_binary)
self.renderer.connect('save', self.save_binary)
@@ -616,9 +427,10 @@ class Binary(Char):
callback()
@realized
+ @CellCache.cache
def setter(self, column, cell, store, iter):
record = store.get_value(iter, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
if hasattr(field, 'get_size'):
size = field.get_size(record)
else:
@@ -626,14 +438,14 @@ class Binary(Char):
cell.set_property('size', common.humanize(size) if size else '')
states = ('invisible',)
- if getattr(self.treeview, 'editable', False):
+ if getattr(self.view.treeview, 'editable', False):
states = ('readonly', 'required', 'invisible')
field.state_set(record, states=states)
invisible = field.get_state_attrs(record).get('invisible', False)
cell.set_property('visible', not invisible)
- if getattr(self.treeview, 'editable', False):
+ if getattr(self.view.treeview, 'editable', False):
readonly = self.attrs.get('readonly',
field.get_state_attrs(record).get('readonly', False))
if invisible:
@@ -697,46 +509,57 @@ class Binary(Char):
field.set_client(record, False)
+class Image(Char):
+
+ def __init__(self, view, attrs=None, renderer=None):
+ if renderer is None:
+ renderer = gtk.CellRendererPixbuf
+ super(Image, self).__init__(view, attrs, renderer)
+ self.renderer.set_fixed_size(self.attrs.get('width', -1),
+ self.attrs.get('height', -1))
+
+ @realized
+ @CellCache.cache
+ def setter(self, column, cell, store, iter_):
+ record = store.get_value(iter_, 0)
+ field = record[self.field_name]
+ value = field.get_client(record)
+ if isinstance(value, (int, long)):
+ if value > common.BIG_IMAGE_SIZE:
+ value = None
+ else:
+ value = field.get_data(record)
+ pixbuf = data2pixbuf(value)
+ if self.attrs['width'] != -1 or self.attrs['height'] != -1:
+ pixbuf = common.resize_pixbuf(pixbuf,
+ self.attrs['width'], self.attrs['height'])
+ cell.set_property('pixbuf', pixbuf)
+
+
class M2O(Char):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
+ def __init__(self, view, attrs, renderer=None):
if renderer is None and int(attrs.get('completion', 1)):
renderer = partial(CellRendererTextCompletion, self.set_completion)
- super(M2O, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ super(M2O, self).__init__(view, attrs, renderer=renderer)
def value_from_text(self, record, text, callback=None):
- field = record.group.fields[self.field_name]
+ field = record.group.fields[self.attrs['name']]
if not text:
field.set_client(record, (None, ''))
if callback:
callback()
return
- relation = record[self.field_name].attrs['relation']
- domain = record[self.field_name].domain_get(record)
- context = record[self.field_name].context_get(record)
- dom = [('rec_name', 'ilike', '%' + text + '%'), domain]
- try:
- ids = RPCExecute('model', relation, 'search', dom, 0, None, None,
- context=context)
- except RPCException:
- field.set_client(record, (None, ''))
- if callback:
- callback()
- return
- if len(ids) != 1:
- self.search_remote(record, relation, ids, domain=domain,
- context=context, callback=callback)
- return
- field.set_client(record, ids[0])
- if callback:
- callback()
+ relation = record[self.attrs['name']].attrs['relation']
+ domain = record[self.attrs['name']].domain_get(record)
+ context = record[self.attrs['name']].context_get(record)
+ self.search_remote(record, relation, text, domain=domain,
+ context=context, callback=callback)
def open_remote(self, record, create=True, changed=False, text=None,
callback=None):
- field = record.group.fields[self.field_name]
+ field = record.group.fields[self.attrs['name']]
relation = field.attrs['relation']
access = common.MODELACCESS[relation]
@@ -752,24 +575,7 @@ class M2O(Char):
elif not changed:
obj_id = field.get(record)
else:
- if text:
- dom = [('rec_name', 'ilike', '%' + text + '%'), domain]
- else:
- dom = domain
- try:
- ids = RPCExecute('model', relation, 'search', dom, 0, None,
- None, context=context)
- except RPCException:
- field.set_client(record, False)
- if callback:
- callback()
- return
- if len(ids) == 1:
- field.set_client(record, ids[0])
- if callback:
- callback()
- return
- self.search_remote(record, relation, ids, domain=domain,
+ self.search_remote(record, relation, text, domain=domain,
context=context, callback=callback)
return
screen = Screen(relation, domain=domain, context=context,
@@ -788,9 +594,9 @@ class M2O(Char):
else:
WinForm(screen, open_callback, new=True, save_current=True)
- def search_remote(self, record, relation, ids=None, domain=None,
+ def search_remote(self, record, relation, text, domain=None,
context=None, callback=None):
- field = record.group.fields[self.field_name]
+ field = record.group.fields[self.attrs['name']]
def search_callback(found):
value = None
@@ -799,8 +605,9 @@ class M2O(Char):
field.set_client(record, value)
if callback:
callback()
- WinSearch(relation, search_callback, sel_multi=False, ids=ids,
+ win = WinSearch(relation, search_callback, sel_multi=False,
context=context, domain=domain)
+ win.screen.search_filter(text.decode('utf-8'))
def set_completion(self, entry, path):
if entry.get_completion():
@@ -858,12 +665,6 @@ class O2O(M2O):
pass
-class UnsettableColumn(Exception):
-
- def __init__(self):
- Exception.__init__()
-
-
class O2M(Char):
@realized
@@ -872,7 +673,7 @@ class O2M(Char):
cell.set_property('xalign', 0.5)
def get_textual_value(self, record):
- return '( ' + str(len(record[self.field_name]
+ return '( ' + str(len(record[self.attrs['name']]
.get_eval(record))) + ' )'
def value_from_text(self, record, text, callback=None):
@@ -881,8 +682,8 @@ class O2M(Char):
def open_remote(self, record, create=True, changed=False, text=None,
callback=None):
- group = record.value[self.field_name]
- field = record.group.fields[self.field_name]
+ group = record.value[self.attrs['name']]
+ field = record.group.fields[self.attrs['name']]
relation = field.attrs['relation']
context = field.context_get(record)
@@ -905,8 +706,8 @@ class M2M(O2M):
def open_remote(self, record, create=True, changed=False, text=None,
callback=None):
- group = record.value[self.field_name]
- field = record.group.fields[self.field_name]
+ group = record.value[self.attrs['name']]
+ field = record.group.fields[self.attrs['name']]
relation = field.attrs['relation']
context = field.context_get(record)
domain = field.domain_get(record)
@@ -929,11 +730,12 @@ class Selection(Char, SelectionMixin, PopdownMixin):
self.renderer = CellRendererCombo()
self.renderer.connect('editing-started', self.editing_started)
self.init_selection()
- self.renderer.set_property('model', self.get_popdown_model(self.selection)[0])
+ self.renderer.set_property('model',
+ self.get_popdown_model(self.selection)[0])
self.renderer.set_property('text-column', 0)
def get_textual_value(self, record):
- field = record[self.field_name]
+ field = record[self.attrs['name']]
self.update_selection(record, field)
value = field.get(record)
text = dict(self.selection).get(value, '')
@@ -947,9 +749,9 @@ class Selection(Char, SelectionMixin, PopdownMixin):
def editing_started(self, cell, editable, path):
super(Selection, self).editing_started(cell, editable, path)
- store = self.treeview.get_model()
+ store = self.view.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
set_value = lambda *a: self.set_value(editable, record, field)
editable.child.connect('activate', set_value)
@@ -975,14 +777,12 @@ class Selection(Char, SelectionMixin, PopdownMixin):
class Reference(Char, SelectionMixin):
- def __init__(self, field_name, model_name, treeview, attrs=None,
- renderer=None):
- super(Reference, self).__init__(field_name, model_name, treeview,
- attrs=attrs, renderer=renderer)
+ def __init__(self, view, attrs, renderer=None):
+ super(Reference, self).__init__(view, attrs, renderer=renderer)
self.init_selection()
def get_textual_value(self, record):
- field = record[self.field_name]
+ field = record[self.attrs['name']]
self.update_selection(record, field)
value = field.get_client(record)
if not value:
@@ -1007,21 +807,19 @@ class ProgressBar(object):
'top_to_bottom': gtk.PROGRESS_TOP_TO_BOTTOM,
}
- def __init__(self, field_name, model_name, treeview, attrs=None):
+ def __init__(self, view, attrs):
super(ProgressBar, self).__init__()
- self.field_name = field_name
- self.model_name = model_name
- self.attrs = attrs or {}
+ self.attrs = attrs
self.renderer = gtk.CellRendererProgress()
orientation = self.orientations.get(self.attrs.get('orientation',
'left_to_right'), gtk.PROGRESS_LEFT_TO_RIGHT)
self.renderer.set_property('orientation', orientation)
- self.treeview = treeview
@realized
+ @CellCache.cache
def setter(self, column, cell, store, iter):
record = store.get_value(iter, 0)
- field = record[self.field_name]
+ field = record[self.attrs['name']]
value = float(self.get_textual_value(record) or 0.0)
cell.set_property('value', value)
digit = field.digits(record)[1]
@@ -1033,10 +831,10 @@ class ProgressBar(object):
raise NotImplementedError
def get_textual_value(self, record):
- return record[self.field_name].get_client(record) or ''
+ return record[self.attrs['name']].get_client(record) or ''
def value_from_text(self, record, text, callback=None):
- field = record[self.field_name]
+ field = record[self.attrs['name']]
field.set_client(record, float(text))
if callback:
callback()
@@ -1044,16 +842,16 @@ class ProgressBar(object):
class Button(object):
- def __init__(self, treeview, screen, attrs=None):
+ def __init__(self, view, attrs):
super(Button, self).__init__()
- self.attrs = attrs or {}
+ self.attrs = attrs
self.renderer = CellRendererButton(attrs.get('string', _('Unknown')))
- self.treeview = treeview
- self.screen = screen
+ self.view = view
self.renderer.connect('clicked', self.button_clicked)
@realized
+ @CellCache.cache
def setter(self, column, cell, store, iter):
record = store.get_value(iter, 0)
states = record.expr_eval(self.attrs.get('states', {}))
@@ -1074,7 +872,7 @@ class Button(object):
def button_clicked(self, widget, path):
if not path:
return True
- store = self.treeview.get_model()
+ store = self.view.treeview.get_model()
record = store.get_value(store.get_iter(path), 0)
state_changes = record.expr_eval(
@@ -1082,30 +880,4 @@ class Button(object):
if state_changes.get('invisible') \
or state_changes.get('readonly'):
return True
- self.screen.button(self.attrs)
-
-CELLTYPES = {
- 'char': Char,
- 'many2one': M2O,
- 'date': Date,
- 'one2many': O2M,
- 'many2many': M2M,
- 'selection': Selection,
- 'float': Float,
- 'numeric': Float,
- 'float_time': FloatTime,
- 'integer': Int,
- 'biginteger': Int,
- 'datetime': Datetime,
- 'time': Time,
- 'boolean': Boolean,
- 'text': Char,
- 'url': URL,
- 'email': URL,
- 'callto': URL,
- 'sip': URL,
- 'progressbar': ProgressBar,
- 'reference': Reference,
- 'one2one': O2O,
- 'binary': Binary,
-}
+ self.view.screen.button(self.attrs)
diff --git a/tryton/gui/window/view_form/view/screen_container.py b/tryton/gui/window/view_form/view/screen_container.py
index 295d7c4..b071732 100644
--- a/tryton/gui/window/view_form/view/screen_container.py
+++ b/tryton/gui/window/view_form/view/screen_container.py
@@ -7,6 +7,7 @@ import gobject
import tryton.common as common
from tryton.common.domain_parser import quote
from tryton.common.placeholder_entry import PlaceholderEntry
+from tryton.common.treeviewcontrol import TreeViewControl
from tryton.translate import date_format
from tryton.config import TRYTON_ICON
from tryton.pyson import PYSONDecoder
@@ -35,14 +36,14 @@ class Dates(gtk.HBox):
elif from_:
return '>=%s' % quote(from_)
elif to:
- return '<%s' % quote(to)
+ return '<=%s' % quote(to)
class Selection(gtk.ScrolledWindow):
def __init__(self, selections):
super(Selection, self).__init__()
- self.treeview = gtk.TreeView()
+ self.treeview = TreeViewControl()
model = gtk.ListStore(gobject.TYPE_STRING)
for selection in selections:
model.append((selection,))
@@ -57,6 +58,7 @@ class Selection(gtk.ScrolledWindow):
self.treeview.set_headers_visible(False)
self.add(self.treeview)
self.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ self.set_shadow_type(gtk.SHADOW_ETCHED_IN)
def get_value(self):
values = []
@@ -449,8 +451,9 @@ class ScreenContainer(object):
self.search_table.fields = []
for i, field in enumerate(fields):
label = gtk.Label(field['string'])
- label.set_alignment(0.0, 0.5)
- self.search_table.attach(label, 0, 1, i, i + 1, yoptions=False)
+ label.set_alignment(0.0, 0.0)
+ self.search_table.attach(label, 0, 1, i, i + 1,
+ yoptions=gtk.FILL)
yoptions = False
if field['type'] == 'boolean':
if hasattr(gtk, 'ComboBoxText'):
diff --git a/tryton/gui/window/view_form/view/widget_parse.py b/tryton/gui/window/view_form/view/widget_parse.py
deleted file mode 100644
index 45a3311..0000000
--- a/tryton/gui/window/view_form/view/widget_parse.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#This file is part of Tryton. The COPYRIGHT file at the top level of
-#this repository contains the full copyright notices and license terms.
-from interface import ParserInterface
-import form_gtk
-import list_gtk
-import graph_gtk
-import calendar_gtk
-from form import ViewForm
-from list import ViewList
-from graph import ViewGraph
-from calendar_ import ViewCalendar
-from tryton.exceptions import TrytonError
-
-PARSERS = {
- 'form': form_gtk.ParserForm,
- 'tree': list_gtk.ParserTree,
- 'graph': graph_gtk.ParserGraph,
- 'calendar': calendar_gtk.ParserCalendar,
- }
-
-PARSERS2 = {
- 'form': ViewForm,
- 'tree': ViewList,
- 'graph': ViewGraph,
- 'calendar': ViewCalendar,
- }
-
-
-class WidgetParse(ParserInterface):
-
- def parse(self, screen, root_node, fields, children_field=None):
- for node in root_node.childNodes:
- if not node.nodeType == node.ELEMENT_NODE:
- continue
- if node.localName in PARSERS:
- widget = PARSERS[node.localName](self.parent, self.attrs,
- screen, children_field)
- (wid, child, state_widgets, on_write, notebooks,
- cursor_widget) = widget.parse(screen.model_name, node,
- fields)
- screen.set_on_write(on_write)
- res = PARSERS2[node.localName](screen, wid, child,
- state_widgets, notebooks, cursor_widget, children_field)
- res.title = widget.title
- return res
- else:
- raise TrytonError('Unknow view mode: %s' % node.localName)
diff --git a/tryton/gui/window/win_export.py b/tryton/gui/window/win_export.py
index 903b687..07f9731 100644
--- a/tryton/gui/window/win_export.py
+++ b/tryton/gui/window/win_export.py
@@ -1,5 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of this
#repository contains the full copyright notices and license terms.
+import sys
import gtk
import gobject
import gettext
@@ -97,7 +98,7 @@ class WinExport(NoModal):
img_button = gtk.Image()
img_button.set_from_stock('tryton-save', gtk.ICON_SIZE_BUTTON)
button_save_export.set_image(img_button)
- button_save_export.connect_after('clicked', self.add_predef)
+ button_save_export.connect_after('clicked', self.addreplace_predef)
vbox_buttons.pack_start(button_save_export, False, False, 0)
button_del_export = gtk.Button(_("Delete Export"), stock=None,
@@ -159,7 +160,6 @@ class WinExport(NoModal):
self.ids = ids
self.model = model
- self.fields_data = {}
self.context = context
self.view1 = gtk.TreeView()
@@ -190,7 +190,23 @@ class WinExport(NoModal):
self.model_populate(self._get_fields(model))
self.view1.set_model(self.model1)
+ self.view1.connect('row-activated', self.sig_sel)
self.view2.set_model(self.model2)
+ self.view2.connect('row-activated', self.sig_unsel)
+ if sys.platform != 'darwin':
+ self.view2.drag_source_set(
+ gtk.gdk.BUTTON1_MASK | gtk.gdk.BUTTON3_MASK,
+ [('EXPORT_TREE', gtk.TARGET_SAME_WIDGET, 0)],
+ gtk.gdk.ACTION_MOVE)
+ self.view2.drag_dest_set(gtk.DEST_DEFAULT_ALL,
+ [('EXPORT_TREE', gtk.TARGET_SAME_WIDGET, 0)],
+ gtk.gdk.ACTION_MOVE)
+ self.view2.connect('drag-begin', self.drag_begin)
+ self.view2.connect('drag-motion', self.drag_motion)
+ self.view2.connect('drag-drop', self.drag_drop)
+ self.view2.connect("drag-data-get", self.drag_data_get)
+ self.view2.connect('drag-data-received', self.drag_data_received)
+ self.view2.connect('drag-data-delete', self.drag_data_delete)
self.wid_action = combo_saveas
self.wid_write_field_names = checkbox_add_field_names
@@ -202,7 +218,8 @@ class WinExport(NoModal):
gtk.CellRendererText(), text=2))
scrolledwindow_exports.add(self.pref_export)
- self.pref_export.connect("row-activated", self.sel_predef)
+ self.pref_export.connect("button-press-event", self.export_click)
+ self.pref_export.connect("key-press-event", self.export_keypress)
# Fill the predefined export tree view
self.predef_model = gtk.ListStore(
@@ -221,23 +238,33 @@ class WinExport(NoModal):
def model_populate(self, fields, parent_node=None, prefix_field='',
prefix_name=''):
- fields_order = fields.keys()
- fields_order.sort(lambda x, y: -cmp(fields[x].get('string', ''),
- fields[y].get('string', '')))
- for field in fields_order:
- self.fields_data[prefix_field + field] = fields[field]
- name = fields[field]['string'] or field
- if prefix_field:
- self.fields_data[prefix_field + field]['string'] = '%s%s' % \
- (prefix_name, self.fields_data[prefix_field +
- field]['string'])
- node = self.model1.insert(parent_node, 0, [name, prefix_field +
- field, (fields[field].get('required', False) and
- common.COLORS['required']) or 'white'])
- self.fields[prefix_field + field] = (name,
- fields[field].get('relation'))
- if fields[field].get('relation'):
- self.model1.insert(node, 0, [None, '', 'white'])
+ key = lambda (n, f): f.get('string') or n
+ for name, field in sorted(fields.items(), key=key, reverse=True):
+
+ string_ = field['string'] or name
+
+ items = [(name, field, string_)]
+ if field['type'] == 'selection':
+ items.insert(0, ('%s.translated' % name, field,
+ _('%s (string)') % string_))
+
+ for name, field, string_ in items:
+ path = prefix_field + name
+ color = 'white'
+ if field.get('required'):
+ color = common.COLORS['required']
+ long_string = string_
+ if prefix_field:
+ long_string = prefix_name + string_
+ node = self.model1.insert(parent_node, 0,
+ [string_, path, color])
+
+ self.fields[path] = (string_, long_string,
+ field.get('relation'))
+ # Insert relation only to real field
+ if '.' not in name:
+ if field.get('relation'):
+ self.model1.insert(node, 0, [None, '', 'white'])
def _get_fields(self, model):
try:
@@ -250,25 +277,24 @@ class WinExport(NoModal):
child = self.model1.iter_children(iter)
if self.model1.get_value(child, 0) is None:
prefix_field = self.model1.get_value(iter, 1)
- _, model = self.fields[prefix_field]
- name = self.fields_data[prefix_field]['string']
- self.model_populate(self._get_fields(model), iter, prefix_field +
- '/', name + '/')
+ string_, long_string, relation = self.fields[prefix_field]
+ self.model_populate(self._get_fields(relation), iter,
+ prefix_field + '/', string_ + '/')
self.model1.remove(child)
- def sig_sel(self, widget=None):
+ def sig_sel(self, *args):
sel = self.view1.get_selection()
sel.selected_foreach(self._sig_sel_add)
def _sig_sel_add(self, store, path, iter):
- relation = self.fields[store.get_value(iter, 1)][1]
+ name = store.get_value(iter, 1)
+ string_, long_string, relation = self.fields[name]
if relation:
return
num = self.model2.append()
- name = self.fields_data[store.get_value(iter, 1)]['string']
- self.model2.set(num, 0, name, 1, store.get_value(iter, 1))
+ self.model2.set(num, 0, long_string, 1, name)
- def sig_unsel(self, widget=None):
+ def sig_unsel(self, *args):
store, paths = self.view2.get_selection().get_selected_rows()
while paths:
store.remove(store.get_iter(paths[0]))
@@ -305,16 +331,31 @@ class WinExport(NoModal):
export['name']))
self.pref_export.set_model(self.predef_model)
- def add_predef(self, widget):
- name = common.ask(_('What is the name of this export?'))
- if not name:
- return
+ def addreplace_predef(self, widget):
iter = self.model2.get_iter_root()
fields = []
while iter:
field_name = self.model2.get_value(iter, 1)
fields.append(field_name)
iter = self.model2.iter_next(iter)
+ if not fields:
+ return
+
+ selection = self.pref_export.get_selection().get_selected()
+ if selection is None:
+ return
+ model, iter_ = selection
+ if iter_ is None:
+ pref_id = None
+ name = common.ask(_('What is the name of this export?'))
+ if not name:
+ return
+ else:
+ pref_id = model.get_value(iter_, 0)
+ name = model.get_value(iter_, 2)
+ override = common.sur(_("Override '%s' definition?") % name)
+ if not override:
+ return
try:
new_id, = RPCExecute('model', 'ir.export', 'create', [{
'name': name,
@@ -323,13 +364,16 @@ class WinExport(NoModal):
'name': x,
} for x in fields])],
}], context=self.context)
+ if pref_id:
+ RPCExecute('model', 'ir.export', 'delete', [pref_id],
+ context=self.context)
except RPCException:
return
- self.predef_model.append((
- new_id,
- fields,
- name))
- self.pref_export.set_model(self.predef_model)
+ if iter_ is None:
+ self.predef_model.append((new_id, fields, name))
+ else:
+ model.set_value(iter_, 0, new_id)
+ model.set_value(iter_, 1, fields)
def remove_predef(self, widget):
sel = self.pref_export.get_selection().get_selected()
@@ -350,13 +394,13 @@ class WinExport(NoModal):
break
self.pref_export.set_model(self.predef_model)
- def sel_predef(self, widget, path, column):
+ def sel_predef(self, path):
self.model2.clear()
- for field in self.predef_model[path[0]][1]:
- if field not in self.fields_data:
+ for name in self.predef_model[path[0]][1]:
+ if name not in self.fields:
iter = self.model1.get_iter_first()
prefix = ''
- for parent in field.split('/')[:-1]:
+ for parent in name.split('/')[:-1]:
while iter:
if self.model1.get_value(iter, 1) == \
(prefix + parent):
@@ -368,9 +412,15 @@ class WinExport(NoModal):
else:
iter = self.model1.iter_next(iter)
- if field not in self.fields_data:
+ if name not in self.fields:
continue
- self.model2.append((self.fields_data[field]['string'], field))
+ self.sel_field(name)
+
+ def sel_field(self, name):
+ _, long_string, relation = self.fields[name]
+ if relation:
+ return
+ self.model2.append((long_string, name))
def destroy(self):
super(WinExport, self).destroy()
@@ -441,3 +491,84 @@ class WinExport(NoModal):
common.warning(_("Operation failed!\nError message:\n%s")
% (exception.faultCode,), _('Error'))
return False
+
+ def drag_begin(self, treeview, context):
+ return True
+
+ def drag_motion(self, treeview, context, x, y, time):
+ try:
+ treeview.set_drag_dest_row(*treeview.get_dest_row_at_pos(x, y))
+ except TypeError:
+ treeview.set_drag_dest_row(len(treeview.get_model()) - 1,
+ gtk.TREE_VIEW_DROP_AFTER)
+ context.drag_status(gtk.gdk.ACTION_MOVE, time)
+ return True
+
+ def drag_drop(self, treeview, context, x, y, time):
+ treeview.emit_stop_by_name('drag-drop')
+ return True
+
+ def drag_data_get(self, treeview, context, selection, target_id,
+ etime):
+ treeview.emit_stop_by_name('drag-data-get')
+
+ def _func_sel_get(store, path, iter_, data):
+ data.append(path[0])
+ data = []
+ treeselection = treeview.get_selection()
+ treeselection.selected_foreach(_func_sel_get, data)
+ if not data:
+ return
+ selection.set('STRING', 8, ','.join(str(x) for x in data))
+ return True
+
+ def drag_data_received(self, treeview, context, x, y, selection,
+ info, etime):
+ treeview.emit_stop_by_name('drag-data-received')
+ if not selection.data:
+ return
+ store = treeview.get_model()
+
+ data_iters = [store.get_iter((int(i),))
+ for i in selection.data.split(',')]
+ drop_info = treeview.get_dest_row_at_pos(x, y)
+ if drop_info:
+ path, position = drop_info
+ pos = store.get_iter(path)
+ else:
+ pos = store.get_iter((len(store) - 1,))
+ position = gtk.TREE_VIEW_DROP_AFTER
+ if position == gtk.TREE_VIEW_DROP_AFTER:
+ data_iters = reversed(data_iters)
+ for item in data_iters:
+ if position == gtk.TREE_VIEW_DROP_BEFORE:
+ store.move_before(item, pos)
+ else:
+ store.move_after(item, pos)
+ context.drop_finish(False, etime)
+ return True
+
+ def drag_data_delete(self, treeview, context):
+ treeview.emit_stop_by_name('drag-data-delete')
+
+ def export_click(self, treeview, event):
+ path_at_pos = treeview.get_path_at_pos(int(event.x), int(event.y))
+ if not path_at_pos or event.button != 1:
+ return
+ path, col, x, y = path_at_pos
+ selection = treeview.get_selection()
+ if event.type == gtk.gdk._2BUTTON_PRESS:
+ self.sel_predef(path)
+ selection.select_path(path)
+ return True
+ elif selection.path_is_selected(path):
+ selection.unselect_path(path)
+ return True
+
+ def export_keypress(self, treeview, event):
+ if event.keyval not in (gtk.keysyms.Return, gtk.keysyms.space):
+ return
+ model, selected = treeview.get_selection().get_selected()
+ if not selected:
+ return
+ self.sel_predef(model.get_path(selected))
diff --git a/tryton/gui/window/win_form.py b/tryton/gui/window/win_form.py
index dcfef89..4a536e9 100644
--- a/tryton/gui/window/win_form.py
+++ b/tryton/gui/window/win_form.py
@@ -267,7 +267,7 @@ class WinForm(NoModal):
self.screen.screen_container.alternate_viewport.connect(
'key-press-event', self.on_keypress)
- if self.save_current:
+ if self.save_current and not new:
self.screen.signal_connect(self, 'record-message',
self.activate_save)
self.screen.signal_connect(self, 'record-modified',
diff --git a/tryton/gui/window/win_search.py b/tryton/gui/window/win_search.py
index c8d2026..5ee48c7 100644
--- a/tryton/gui/window/win_search.py
+++ b/tryton/gui/window/win_search.py
@@ -60,7 +60,7 @@ class WinSearch(NoModal):
self.view.unset_editable()
# Prevent to set tree_state
self.screen.tree_states_done.add(id(self.view))
- sel = self.view.widget_tree.get_selection()
+ sel = self.view.treeview.get_selection()
if not sel_multi:
sel.set_mode(gtk.SELECTION_SINGLE)
@@ -89,7 +89,7 @@ class WinSearch(NoModal):
common.center_window(self.win, self.parent, self.sensible_widget)
def sig_activate(self, *args):
- self.view.widget_tree.emit_stop_by_name('row_activated')
+ self.view.treeview.emit_stop_by_name('row_activated')
self.win.response(gtk.RESPONSE_OK)
return True
diff --git a/tryton/gui/window/wizard.py b/tryton/gui/window/wizard.py
index 42d625e..b46a700 100644
--- a/tryton/gui/window/wizard.py
+++ b/tryton/gui/window/wizard.py
@@ -110,7 +110,7 @@ class Wizard(object):
Action._exec_action(*action, context=self.context.copy())
if self.state == self.end_state:
- self.end(execute_actions)
+ self.end(lambda *a: execute_actions())
else:
execute_actions()
self.__processing = False
@@ -150,8 +150,10 @@ class Wizard(object):
button.show()
return button
- def _record_modified(self, screen, signal):
- record = screen.current_record
+ def _record_modified(self, screen, record):
+ self.update_buttons(record)
+
+ def update_buttons(self, record):
for button in self.states.itervalues():
button.state_set(record)
@@ -223,6 +225,7 @@ class Wizard(object):
self.screen.new(default=False)
self.screen.current_record.set_default(defaults)
+ self.update_buttons(self.screen.current_record)
self.screen.set_cursor()
@@ -341,17 +344,20 @@ class WizardDialog(Wizard, NoModal):
dialog = self.page.dialogs[-1]
else:
dialog = self.page
- if (getattr(dialog, 'screen', None)
- and dialog.screen.current_record
- and self.sensible_widget != main.window):
- if dialog.screen.model_name == self.model:
- ids = self.ids
- else:
- # Wizard run from a children record so reload parent record
- ids = [dialog.screen.current_record.id]
- dialog.screen.reload(ids, written=True)
+ screen = getattr(dialog, 'screen', None)
+ if self.sensible_widget == main.window:
+ screen = main.menu_screen
+ if screen:
+ if (screen.current_record
+ and self.sensible_widget != main.window):
+ if screen.model_name == self.model:
+ ids = self.ids
+ else:
+ # Wizard run from a children record so reload parent record
+ ids = [screen.current_record.id]
+ screen.reload(ids, written=True)
if action:
- dialog.screen.client_action(action)
+ screen.client_action(action)
def end(self, callback=None):
def end_callback(action):
diff --git a/tryton/plugins/__init__.py b/tryton/plugins/__init__.py
index d66d689..4aaa9c4 100644
--- a/tryton/plugins/__init__.py
+++ b/tryton/plugins/__init__.py
@@ -5,26 +5,37 @@ import sys
import imp
import gettext
+from tryton.config import get_config_dir
+
+__all__ = ['MODULES', 'register']
+
_ = gettext.gettext
-PLUGINS_PATH = os.path.dirname(__file__)
-if not os.path.isdir(PLUGINS_PATH):
- # try for py2exe
- PLUGINS_PATH = os.path.join(os.path.abspath(os.path.normpath(
- os.path.dirname(sys.argv[0]))), 'plugins')
MODULES = []
def register():
global MODULES
- if os.path.isdir(PLUGINS_PATH):
- for plugin in os.listdir(PLUGINS_PATH):
- if not os.path.isdir(os.path.join(PLUGINS_PATH, plugin)):
- continue
+ paths = [
+ os.path.join(get_config_dir(), 'plugins'),
+ os.path.dirname(__file__),
+ #py2exe
+ os.path.join(os.path.abspath(os.path.normpath(
+ os.path.dirname(sys.argv[0]))), 'plugins'),
+ ]
+ paths = filter(os.path.isdir, paths)
+
+ imported = set()
+ for path in paths:
+ for plugin in os.listdir(path):
module = os.path.splitext(plugin)[0]
+ if module == '__init__' or module in imported:
+ continue
try:
module = imp.load_module(module, *imp.find_module(module,
- [PLUGINS_PATH]))
+ [path]))
MODULES.append(module)
except ImportError:
continue
+ else:
+ imported.add(module.__name__)
diff --git a/tryton/pyson.py b/tryton/pyson.py
index 9f637a5..48c5b15 100644
--- a/tryton/pyson.py
+++ b/tryton/pyson.py
@@ -28,25 +28,25 @@ class PYSON(object):
return Not(self)
def __and__(self, other):
+ if (isinstance(other, PYSON)
+ and other.types() != set([bool])):
+ other = Bool(other)
if (isinstance(self, And)
and not isinstance(self, Or)):
self._statements.append(other)
return self
- if (isinstance(other, PYSON)
- and other.types() != set([bool])):
- other = Bool(other)
if self.types() != set([bool]):
return And(Bool(self), other)
else:
return And(self, other)
def __or__(self, other):
- if isinstance(self, Or):
- self._statements.append(other)
- return self
if (isinstance(other, PYSON)
and other.types() != set([bool])):
other = Bool(other)
+ if isinstance(self, Or):
+ self._statements.append(other)
+ return self
if self.types() != set([bool]):
return Or(Bool(self), other)
else:
diff --git a/tryton/version.py b/tryton/version.py
index 451b8ce..75b5c60 100644
--- a/tryton/version.py
+++ b/tryton/version.py
@@ -1,6 +1,6 @@
#This file is part of Tryton. The COPYRIGHT file at the top level of
#this repository contains the full copyright notices and license terms.
PACKAGE = "tryton"
-VERSION = "3.2.4"
+VERSION = "3.4.0"
LICENSE = "GPL-3"
WEBSITE = "http://www.tryton.org/"
--
tryton-client
More information about the tryton-debian-vcs
mailing list