diff --git a/addons/web/__init__.py b/addons/web/__init__.py index 3b447ce748d..e01969ddcca 100644 --- a/addons/web/__init__.py +++ b/addons/web/__init__.py @@ -1,4 +1,5 @@ import http import controllers +import cli wsgi_postload = http.wsgi_postload diff --git a/addons/web/cli/__init__.py b/addons/web/cli/__init__.py new file mode 100644 index 00000000000..823c140bb79 --- /dev/null +++ b/addons/web/cli/__init__.py @@ -0,0 +1 @@ +import test_js diff --git a/addons/web/cli/test_js.py b/addons/web/cli/test_js.py new file mode 100644 index 00000000000..b3a8e634b72 --- /dev/null +++ b/addons/web/cli/test_js.py @@ -0,0 +1,35 @@ +import logging +import optparse +import sys + +import unittest2 + +import openerp +import openerp.addons.web.tests + +_logger = logging.getLogger(__name__) + +class TestJs(openerp.cli.Command): + def run(self, args): + self.parser = parser = optparse.OptionParser() + parser.add_option("-d", "--database", dest="db_name", default=False, help="specify the database name") + parser.add_option("--xmlrpc-port", dest="xmlrpc_port", default=8069, help="specify the TCP port for the XML-RPC protocol", type="int") + # proably need to add both --superadmin-password and --database-admin-password + self.parser.parse_args(args) + + # test ony uses db_name xmlrpc_port admin_passwd, so use the server one for the actual parsing + + config = openerp.tools.config + config.parse_config(args) + # needed until runbot is fixed + config['db_password'] = config['admin_passwd'] + + # run js tests + openerp.netsvc.init_alternative_logger() + suite = unittest2.TestSuite() + suite.addTests(unittest2.TestLoader().loadTestsFromModule(openerp.addons.web.tests.test_js)) + r = unittest2.TextTestRunner(verbosity=2).run(suite) + if r.errors or r.failures: + sys.exit(1) + +# vim:et:ts=4:sw=4: diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 3f35b3f44ea..f5710e87218 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1121,41 +1121,6 @@ class DataSet(openerpweb.Controller): class View(openerpweb.Controller): _cp_path = "/web/view" - def fields_view_get(self, req, model, view_id, view_type, - transform=True, toolbar=False, submenu=False): - Model = req.session.model(model) - fvg = Model.fields_view_get(view_id, view_type, req.context, toolbar, submenu) - # todo fme?: check that we should pass the evaluated context here - self.process_view(req.session, fvg, req.context, transform, (view_type == 'kanban')) - return fvg - - def process_view(self, session, fvg, context, transform, preserve_whitespaces=False): - # depending on how it feels, xmlrpclib.ServerProxy can translate - # XML-RPC strings to ``str`` or ``unicode``. ElementTree does not - # enjoy unicode strings which can not be trivially converted to - # strings, and it blows up during parsing. - - # So ensure we fix this retardation by converting view xml back to - # bit strings. - if isinstance(fvg['arch'], unicode): - arch = fvg['arch'].encode('utf-8') - else: - arch = fvg['arch'] - fvg['arch_string'] = arch - - fvg['arch'] = xml2json_from_elementtree( - ElementTree.fromstring(arch), preserve_whitespaces) - - if 'id' in fvg['fields']: - # Special case for id's - id_field = fvg['fields']['id'] - id_field['original_type'] = id_field['type'] - id_field['type'] = 'id' - - for field in fvg['fields'].itervalues(): - for view in field.get("views", {}).itervalues(): - self.process_view(session, view, None, transform) - @openerpweb.jsonrequest def add_custom(self, req, view_id, arch): CustomView = req.session.model('ir.ui.view.custom') @@ -1179,10 +1144,6 @@ class View(openerpweb.Controller): return {'result': True} return {'result': False} - @openerpweb.jsonrequest - def load(self, req, model, view_id, view_type, toolbar=False): - return self.fields_view_get(req, model, view_id, view_type, toolbar=toolbar) - class TreeView(View): _cp_path = "/web/treeview" diff --git a/addons/web/doc/index.rst b/addons/web/doc/index.rst index 2e4367ef78f..75a7194406e 100644 --- a/addons/web/doc/index.rst +++ b/addons/web/doc/index.rst @@ -12,17 +12,18 @@ Contents: :maxdepth: 1 module - testing - widget async rpc qweb client_action - form_view + + testing + search_view list_view + form_view changelog-7.0 diff --git a/addons/web/doc/module.rst b/addons/web/doc/module.rst new file mode 100644 index 00000000000..1bdb7c14799 --- /dev/null +++ b/addons/web/doc/module.rst @@ -0,0 +1,281 @@ +Building an OpenERP Web module +============================== + +There is no significant distinction between an OpenERP Web module and +an OpenERP module, the web part is mostly additional data and code +inside a regular OpenERP module. This allows providing more seamless +features by integrating your module deeper into the web client. + +A Basic Module +-------------- + +A very basic OpenERP module structure will be our starting point: + +.. code-block:: text + + web_example + ├── __init__.py + └── __openerp__.py + +.. literalinclude:: module/__openerp__.py + :language: python + +This is a sufficient minimal declaration of a valid OpenERP module. + +Web Declaration +--------------- + +There is no such thing as a "web module" declaration. An OpenERP +module is automatically recognized as "web-enabled" if it contains a +``static`` directory at its root, so: + +.. code-block:: text + + web_example + ├── __init__.py + ├── __openerp__.py + └── static + +is the extent of it. You should also change the dependency to list +``web``: + +.. literalinclude:: module/__openerp__.py.1.diff + :language: diff + +.. note:: + + This does not matter in normal operation so you may not realize + it's wrong (the web module does the loading of everything else, so + it can only be loaded), but when e.g. testing the loading process + is slightly different than normal, and incorrect dependency may + lead to broken code. + +This makes the "web" discovery system consider the module as having a +"web part", and check if it has web controllers to mount or javascript +files to load. The content of the ``static/`` folder is also +automatically made available to web browser at the URL +``$module-name/static/$file-path``. This is sufficient to provide +pictures (of cats, usually) through your module. However there are +still a few more steps to running javascript code. + +Getting Things Done +------------------- + +The first one is to add javascript code. It's customary to put it in +``static/src/js``, to have room for e.g. other file types, or +third-party libraries. + +.. literalinclude:: module/static/src/js/first_module.js + :language: javascript + +The client won't load any file unless specified, thus the new file +should be listed in the module's manifest file, under a new key ``js`` +(a list of file names, or glob patterns): + +.. literalinclude:: module/__openerp__.py.2.diff + :language: diff + +At this point, if the module is installed and the client reloaded the +message should appear in your browser's development console. + +.. note:: + + Because the manifest file has been edited, you will have to + restart the OpenERP server itself for it to be taken in account. + + You may also want to open your browser's console *before* + reloading, depending on the browser messages printed while the + console is closed may not work or may not appear after opening it. + +.. note:: + + If the message does not appear, try cleaning your browser's caches + and ensure the file is correctly loaded from the server logs or + the "resources" tab of your browser's developers tools. + +At this point the code runs, but it runs only once when the module is +initialized, and it can't get access to the various APIs of the web +client (such as making RPC requests to the server). This is done by +providing a `javascript module`_: + +.. literalinclude:: module/static/src/js/first_module.js.1.diff + :language: diff + +If you reload the client, you'll see a message in the console exactly +as previously. The differences, though invisible at this point, are: + +* All javascript files specified in the manifest (only this one so + far) have been fully loaded +* An instance of the web client and a namespace inside that instance + (with the same name as the module) have been created and are + available for use + +The latter point is what the ``instance`` parameter to the function +provides: an instance of the OpenERP Web client, with the contents of +all the new module's dependencies loaded in and initialized. These are +the entry points to the web client's APIs. + +To demonstrate, let's build a simple :doc:`client action +`: a stopwatch + +First, the action declaration: + +.. literalinclude:: module/__openerp__.py.3.diff + :language: diff + +.. literalinclude:: module/web_example.xml + :language: xml + +then set up the :doc:`client action hook ` to register +a function (for now): + +.. literalinclude:: module/static/src/js/first_module.js.2.diff + :language: diff + +Updating the module (in order to load the XML description) and +re-starting the server should display a new menu *Example Client +Action* at the top-level. Opening said menu will make the message +appear, as usual, in the browser's console. + +Paint it black +-------------- + +The next step is to take control of the page itself, rather than just +print little messages in the console. This we can do by replacing our +client action function by a :doc:`widget`. Our widget will simply use +its :js:func:`~openerp.web.Widget.start` to add some content to its +DOM: + +.. literalinclude:: module/static/src/js/first_module.js.3.diff + :language: diff + +after reloading the client (to update the javascript file), instead of +printing to the console the menu item clears the whole screen and +displays the specified message in the page. + +Since we've added a class on the widget's :ref:`DOM root +` we can now see how to add a stylesheet to a module: +first create the stylesheet file: + +.. literalinclude:: module/static/src/css/web_example.css + :language: css + +then add a reference to the stylesheet in the module's manifest (which +will require restarting the OpenERP Server to see the changes, as +usual): + +.. literalinclude:: module/__openerp__.py.4.diff + :language: diff + +the text displayed by the menu item should now be huge, and +white-on-black (instead of small and black-on-white). From there on, +the world's your canvas. + +.. note:: + + Prefixing CSS rules with both ``.openerp`` (to ensure the rule + will apply only within the confines of the OpenERP Web client) and + a class at the root of your own hierarchy of widgets is strongly + recommended to avoid "leaking" styles in case the code is running + embedded in an other web page, and does not have the whole screen + to itself. + +So far we haven't built much (any, really) DOM content. It could all +be done in :js:func:`~openerp.web.Widget.start` but that gets unwieldy +and hard to maintain fast. It is also very difficult to extend by +third parties (trying to add or change things in your widgets) unless +broken up into multiple methods which each perform a little bit of the +rendering. + +The first way to handle this method is to delegate the content to +plenty of sub-widgets, which can be individually overridden. An other +method [#DOM-building]_ is to use `a template +`_ to render a widget's +DOM. + +OpenERP Web's template language is :doc:`qweb`. Although any +templating engine can be used (e.g. `mustache +`_ or `_.template +`_) QWeb has important features +which other template engines may not provide, and has special +integration to OpenERP Web widgets. + +Adding a template file is similar to adding a style sheet: + +.. literalinclude:: module/static/src/xml/web_example.xml + :language: xml + +.. literalinclude:: module/__openerp__.py.5.diff + :language: diff + +The template can then easily be hooked in the widget: + +.. literalinclude:: module/static/src/js/first_module.js.4.diff + :language: diff + +And finally the CSS can be altered to style the new (and more complex) +template-generated DOM, rather than the code-generated one: + +.. literalinclude:: module/static/src/css/web_example.css.1.diff + :language: diff + +.. note:: + + The last section of the CSS change is an example of "state + classes": a CSS class (or set of classes) on the root of the + widget, which is toggled when the state of the widget changes and + can perform drastic alterations in rendering (usually + showing/hiding various elements). + + This pattern is both fairly simple (to read and understand) and + efficient (because most of the hard work is pushed to the + browser's CSS engine, which is usually highly optimized, and done + in a single repaint after toggling the class). + +The last step (until the next one) is to add some behavior and make +our stopwatch watch. First hook some events on the buttons to toggle +the widget's state: + +.. literalinclude:: module/static/src/js/first_module.js.5.diff + :language: diff + +This demonstrates the use of the "events hash" and event delegation to +declaratively handle events on the widget's DOM. And already changes +the button displayed in the UI. Then comes some actual logic: + +.. literalinclude:: module/static/src/js/first_module.js.6.diff + :language: diff + +* An initializer (the ``init`` method) is introduced to set-up a few + internal variables: ``_start`` will hold the start of the timer (as + a javascript Date object), and ``_watch`` will hold a ticker to + update the interface regularly and display the "current time". + +* ``update_counter`` is in charge of taking the time difference + between "now" and ``_start``, formatting as ``HH:MM:SS`` and + displaying the result on screen. + +* ``watch_start`` is augmented to initialize ``_start`` with its value + and set-up the update of the counter display every 33ms. + +* ``watch_stop`` disables the updater, does a final update of the + counter display and resets everything. + +* Finally, because javascript Interval and Timeout objects execute + "outside" the widget, they will keep going even after the widget has + been destroyed (especially an issue with intervals as they repeat + indefinitely). So ``_watch`` *must* be cleared when the widget is + destroyed (then the ``_super`` must be called as well in order to + perform the "normal" widget cleanup). + +Starting and stopping the watch now works, and correctly tracks time +since having started the watch, neatly formatted. + +.. [#DOM-building] they are not alternative solutions: they work very + well together. Templates are used to build "just + DOM", sub-widgets are used to build DOM subsections + *and* delegate part of the behavior (e.g. events + handling). + +.. _javascript module: + http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript diff --git a/addons/web/doc/module/__init__.py b/addons/web/doc/module/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/web/doc/module/__openerp__.py b/addons/web/doc/module/__openerp__.py new file mode 100644 index 00000000000..d8c23c34f10 --- /dev/null +++ b/addons/web/doc/module/__openerp__.py @@ -0,0 +1,7 @@ +# __openerp__.py +{ + 'name': "Web Example", + 'description': "Basic example of a (future) web module", + 'category': 'Hidden', + 'depends': ['base'], +} diff --git a/addons/web/doc/module/__openerp__.py.1.diff b/addons/web/doc/module/__openerp__.py.1.diff new file mode 100644 index 00000000000..dbab2e65437 --- /dev/null +++ b/addons/web/doc/module/__openerp__.py.1.diff @@ -0,0 +1,11 @@ +--- web_example/__openerp__.py ++++ web_example/__openerp__.py +@@ -1,7 +1,7 @@ + # __openerp__.py + { + 'name': "Web Example", + 'description': "Basic example of a (future) web module", + 'category': 'Hidden', +- 'depends': ['base'], ++ 'depends': ['web'], + } diff --git a/addons/web/doc/module/__openerp__.py.2.diff b/addons/web/doc/module/__openerp__.py.2.diff new file mode 100644 index 00000000000..77025f11512 --- /dev/null +++ b/addons/web/doc/module/__openerp__.py.2.diff @@ -0,0 +1,11 @@ +--- web_example/__openerp__.py ++++ web_example/__openerp__.py +@@ -1,7 +1,8 @@ + # __openerp__.py + { + 'name': "Web Example", + 'description': "Basic example of a (future) web module", + 'category': 'Hidden', + 'depends': ['web'], ++ 'js': ['static/src/js/first_module.js'], + } diff --git a/addons/web/doc/module/__openerp__.py.3.diff b/addons/web/doc/module/__openerp__.py.3.diff new file mode 100644 index 00000000000..e100098bce9 --- /dev/null +++ b/addons/web/doc/module/__openerp__.py.3.diff @@ -0,0 +1,12 @@ +--- web_example/__openerp__.py ++++ web_example/__openerp__.py +@@ -1,8 +1,9 @@ + # __openerp__.py + { + 'name': "Web Example", + 'description': "Basic example of a (future) web module", + 'category': 'Hidden', + 'depends': ['web'], ++ 'data': ['web_example.xml'], + 'js': ['static/src/js/first_module.js'], + } diff --git a/addons/web/doc/module/__openerp__.py.4.diff b/addons/web/doc/module/__openerp__.py.4.diff new file mode 100644 index 00000000000..78fc90c4b1c --- /dev/null +++ b/addons/web/doc/module/__openerp__.py.4.diff @@ -0,0 +1,13 @@ +--- web_example/__openerp__.py ++++ web_example/__openerp__.py +@@ -1,9 +1,10 @@ + # __openerp__.py + { + 'name': "Web Example", + 'description': "Basic example of a (future) web module", + 'category': 'Hidden', + 'depends': ['web'], + 'data': ['web_example.xml'], + 'js': ['static/src/js/first_module.js'], ++ 'css': ['static/src/css/web_example.css'], + } diff --git a/addons/web/doc/module/__openerp__.py.5.diff b/addons/web/doc/module/__openerp__.py.5.diff new file mode 100644 index 00000000000..c9492420ee8 --- /dev/null +++ b/addons/web/doc/module/__openerp__.py.5.diff @@ -0,0 +1,14 @@ +--- web_example/__openerp__.py ++++ web_example/__openerp__.py +@@ -1,10 +1,11 @@ + # __openerp__.py + { + 'name': "Web Example", + 'description': "Basic example of a (future) web module", + 'category': 'Hidden', + 'depends': ['web'], + 'data': ['web_example.xml'], + 'js': ['static/src/js/first_module.js'], + 'css': ['static/src/css/web_example.css'], ++ 'qweb': ['static/src/xml/web_example.xml'], + } diff --git a/addons/web/doc/module/static/src/css/web_example.css b/addons/web/doc/module/static/src/css/web_example.css new file mode 100644 index 00000000000..b861af8d517 --- /dev/null +++ b/addons/web/doc/module/static/src/css/web_example.css @@ -0,0 +1,6 @@ +.openerp .oe_web_example { + color: white; + background-color: black; + height: 100%; + font-size: 400%; +} diff --git a/addons/web/doc/module/static/src/css/web_example.css.1.diff b/addons/web/doc/module/static/src/css/web_example.css.1.diff new file mode 100644 index 00000000000..442211a252b --- /dev/null +++ b/addons/web/doc/module/static/src/css/web_example.css.1.diff @@ -0,0 +1,17 @@ +--- web_example/static/src/css/web_example.css ++++ web_example/static/src/css/web_example.css +@@ -1,6 +1,13 @@ + .openerp .oe_web_example { + color: white; + background-color: black; + height: 100%; +- font-size: 400%; + } ++.openerp .oe_web_example h4 { ++ margin: 0; ++ font-size: 200%; ++} ++.openerp .oe_web_example.oe_web_example_started .oe_web_example_start button, ++.openerp .oe_web_example.oe_web_example_stopped .oe_web_example_stop button { ++ display: none ++} diff --git a/addons/web/doc/module/static/src/js/first_module.js b/addons/web/doc/module/static/src/js/first_module.js new file mode 100644 index 00000000000..74580d1c0ca --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js @@ -0,0 +1,2 @@ +// static/src/js/first_module.js +console.log("Debug statement: file loaded"); diff --git a/addons/web/doc/module/static/src/js/first_module.js.1.diff b/addons/web/doc/module/static/src/js/first_module.js.1.diff new file mode 100644 index 00000000000..53c153e1971 --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js.1.diff @@ -0,0 +1,8 @@ +--- web_example/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -1,2 +1,4 @@ + // static/src/js/first_module.js +-console.log("Debug statement: file loaded"); ++openerp.web_example = function (instance) { ++ console.log("Module loaded"); ++}; diff --git a/addons/web/doc/module/static/src/js/first_module.js.2.diff b/addons/web/doc/module/static/src/js/first_module.js.2.diff new file mode 100644 index 00000000000..88a80f50fff --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js.2.diff @@ -0,0 +1,11 @@ +--- web_example/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -1,4 +1,7 @@ + // static/src/js/first_module.js + openerp.web_example = function (instance) { +- console.log("Module loaded"); ++ instance.web.client_actions.add('example.action', 'instance.web_example.action'); ++ instance.web_example.action = function (parent, action) { ++ console.log("Executed the action", action); ++ }; + }; diff --git a/addons/web/doc/module/static/src/js/first_module.js.3.diff b/addons/web/doc/module/static/src/js/first_module.js.3.diff new file mode 100644 index 00000000000..295e90b6840 --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js.3.diff @@ -0,0 +1,18 @@ +--- web_example/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -1,7 +1,11 @@ + // static/src/js/first_module.js + openerp.web_example = function (instance) { +- instance.web.client_actions.add('example.action', 'instance.web_example.action'); +- instance.web_example.action = function (parent, action) { +- console.log("Executed the action", action); +- }; ++ instance.web.client_actions.add('example.action', 'instance.web_example.Action'); ++ instance.web_example.Action = instance.web.Widget.extend({ ++ className: 'oe_web_example', ++ start: function () { ++ this.$el.text("Hello, world!"); ++ return this._super(); ++ } ++ }); + }; diff --git a/addons/web/doc/module/static/src/js/first_module.js.4.diff b/addons/web/doc/module/static/src/js/first_module.js.4.diff new file mode 100644 index 00000000000..78a192147e6 --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js.4.diff @@ -0,0 +1,15 @@ +--- web_example/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -1,11 +1,7 @@ + // static/src/js/first_module.js + openerp.web_example = function (instance) { + instance.web.client_actions.add('example.action', 'instance.web_example.Action'); + instance.web_example.Action = instance.web.Widget.extend({ ++ template: 'web_example.action' +- className: 'oe_web_example', +- start: function () { +- this.$el.text("Hello, world!"); +- return this._super(); +- } + }); + }; diff --git a/addons/web/doc/module/static/src/js/first_module.js.5.diff b/addons/web/doc/module/static/src/js/first_module.js.5.diff new file mode 100644 index 00000000000..f345ea319ef --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js.5.diff @@ -0,0 +1,23 @@ +--- web_example/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -1,7 +1,19 @@ + // static/src/js/first_module.js + openerp.web_example = function (instance) { + instance.web.client_actions.add('example.action', 'instance.web_example.Action'); + instance.web_example.Action = instance.web.Widget.extend({ +- template: 'web_example.action' ++ template: 'web_example.action', ++ events: { ++ 'click .oe_web_example_start button': 'watch_start', ++ 'click .oe_web_example_stop button': 'watch_stop' ++ }, ++ watch_start: function () { ++ this.$el.addClass('oe_web_example_started') ++ .removeClass('oe_web_example_stopped'); ++ }, ++ watch_stop: function () { ++ this.$el.removeClass('oe_web_example_started') ++ .addClass('oe_web_example_stopped'); ++ }, + }); + }; diff --git a/addons/web/doc/module/static/src/js/first_module.js.6.diff b/addons/web/doc/module/static/src/js/first_module.js.6.diff new file mode 100644 index 00000000000..7dd17af0e18 --- /dev/null +++ b/addons/web/doc/module/static/src/js/first_module.js.6.diff @@ -0,0 +1,55 @@ +--- web_example/static/src/js/first_module.js ++++ web_example/static/src/js/first_module.js +@@ -1,19 +1,52 @@ + // static/src/js/first_module.js + openerp.web_example = function (instance) { + instance.web.client_actions.add('example.action', 'instance.web_example.Action'); + instance.web_example.Action = instance.web.Widget.extend({ + template: 'web_example.action', + events: { + 'click .oe_web_example_start button': 'watch_start', + 'click .oe_web_example_stop button': 'watch_stop' + }, ++ init: function () { ++ this._super.apply(this, arguments); ++ this._start = null; ++ this._watch = null; ++ }, ++ update_counter: function () { ++ var h, m, s; ++ // Subtracting javascript dates returns the difference in milliseconds ++ var diff = new Date() - this._start; ++ s = diff / 1000; ++ m = Math.floor(s / 60); ++ s -= 60*m; ++ h = Math.floor(m / 60); ++ m -= 60*h; ++ this.$('.oe_web_example_timer').text( ++ _.str.sprintf("%02d:%02d:%02d", h, m, s)); ++ }, + watch_start: function () { + this.$el.addClass('oe_web_example_started') + .removeClass('oe_web_example_stopped'); ++ this._start = new Date(); ++ // Update the UI to the current time ++ this.update_counter(); ++ // Update the counter at 30 FPS (33ms/frame) ++ this._watch = setInterval( ++ this.proxy('update_counter'), ++ 33); + }, + watch_stop: function () { ++ clearInterval(this._watch); ++ this.update_counter(); ++ this._start = this._watch = null; + this.$el.removeClass('oe_web_example_started') + .addClass('oe_web_example_stopped'); + }, ++ destroy: function () { ++ if (this._watch) { ++ clearInterval(this._watch); ++ } ++ this._super(); ++ } + }); + }; diff --git a/addons/web/doc/module/static/src/xml/web_example.xml b/addons/web/doc/module/static/src/xml/web_example.xml new file mode 100644 index 00000000000..b5a9918f2f0 --- /dev/null +++ b/addons/web/doc/module/static/src/xml/web_example.xml @@ -0,0 +1,11 @@ + +
+

00:00:00

+

+ +

+

+ +

+
+
diff --git a/addons/web/doc/module/web_example.xml b/addons/web/doc/module/web_example.xml new file mode 100644 index 00000000000..dfcc1614df4 --- /dev/null +++ b/addons/web/doc/module/web_example.xml @@ -0,0 +1,11 @@ + + + + + Example Client Action + example.action + + + + diff --git a/addons/web/doc/qweb.rst b/addons/web/doc/qweb.rst index 7ad1e20d57a..61668dcb9be 100644 --- a/addons/web/doc/qweb.rst +++ b/addons/web/doc/qweb.rst @@ -1,79 +1,546 @@ - QWeb ==== -QWeb is the template engine used by the OpenERP Web Client. It is a home made engine create by OpenERP developers. There are a few things to note about it: +QWeb is the template engine used by the OpenERP Web Client. It is an +XML-based templating language, similar to `Genshi +`_, +`Thymeleaf `_ or `Facelets +`_ with a few peculiarities: -* Template are rendered in javascript on the client-side, the server does nothing. -* It is an xml template engine, like Facelets_ for example. The source file must be a valid xml. -* Templates are not interpreted. There are compiled to javascript. This makes them a lot faster to render, but sometimes harder to debug. -* Most of the time it is used through the Widget class, but you can also use it directly using *openerp.web.qweb.render()* . +* It's implemented fully in javascript and rendered in the browser. +* Each template file (XML files) contains multiple templates, where + template engine usually have a 1:1 mapping between template files + and templates. +* It has special support in OpenERP Web's + :class:`~instance.web.Widget`, though it can be used outside of + OpenERP Web (and it's possible to use :class:`~instance.web.Widget` + without relying on the QWeb integration). -.. _Facelets: http://en.wikipedia.org/wiki/Facelets +The rationale behind using QWeb instead of a more popular template syntax is +that its extension mechanism is very similar to the openerp view inheritance +mechanism. Like openerp views a QWeb template is an xml tree and therefore +xpath or dom manipulations are easy to performs on it. -Here is a typical QWeb file: +Here's an example demonstrating most of the basic QWeb features: -:: +.. code-block:: xml - - -
...
-
- -
...
-
+
+

+
    +
  • + + + +
  • +
+
+ + +
+ +
+
+
+
+
-A QWeb file contains multiple templates, they are simply identified by a name. +rendered with the following context: -Here is a sample QWeb template: +.. code-block:: json -:: + { + "class1": "foo", + "title": "Random Title", + "items": [ + { "name": "foo", "tags": {"bar": "baz", "qux": "quux"} }, + { "name": "Lorem", "tags": { + "ipsum": "dolor", + "sit": "amet", + "consectetur": "adipiscing", + "elit": "Sed", + "hendrerit": "ullamcorper", + "ante": "id", + "vestibulum": "Lorem", + "ipsum": "dolor", + "sit": "amet" + } + } + ] + } - -
-

Name:

-

Password:

-

This user is an Administrator

- -

User has role:

-
-
-
+will yield this section of HTML document (reformated for readability): +.. code-block:: html -*widget* is a variable given to the template engine by Widget sub-classes when they decide to render their associated template, it is simply *this*. Here is the corresponding Widget sub-class: - -:: - - UserPageWidget = openerp.base.Widget.extend({ - template: "UserPage", - init: function(parent) { - this._super(parent); - this.user_name = "Xavier"; - this.password = "lilo"; - this.is_admin = true; - this.roles = ["Web Developer", "IE Hater", "Steve Jobs Worshiper"]; - }, - }); - -It could output something like this: - -:: - -
-

Name: Xavier

-

Password:

-

This user is an Administrator

User has role: Web Developer

-

User has role: IE Hater

-

User has role: Steve Jobs Worshiper

+
+

Random Title

+
    +
  • + foo +
    +
    bar
    +
    baz
    +
    qux
    +
    quux
    +
    +
  • +
  • + Lorem +
    +
    ipsum
    +
    dolor
    +
    sit
    +
    amet
    +
    consectetur
    +
    adipiscing
    +
    elit
    +
    Sed
    +
    hendrerit
    +
    ullamcorper
    +
    +
  • +
-A QWeb template should always contain one unique root element to be used effectively with the Widget class, here it is a *
*. QWeb only react to ** elements or attributes prefixed by *t-*. The ** is simply a null element, it is only used when you need to use a *t-* attribute without outputting an html element at the same time. Here are the effects of the most common QWeb attributes: +API +--- -* *t-esc* outputs the result of the evaluation of the given javascript expression -* *t-att-ATTR* sets the value of the *ATTR* attribute to the result of the evaluation of the given javascript expression -* *t-if* outputs the element and its content only if the given javascript expression returns true -* *t-foreach* outputs as many times as contained in the list returned by the given javascript expression. For each iteration, a variable with the name defined by *t-as* contains the current element in the list. +While QWeb implements a number of attributes and methods for +customization and configuration, only two things are really important +to the user: + +.. js:class:: QWeb2.Engine + + The QWeb "renderer", handles most of QWeb's logic (loading, + parsing, compiling and rendering templates). + + OpenERP Web instantiates one for the user, and sets it to + ``instance.web.qweb``. It also loads all the template files of the + various modules into that QWeb instance. + + A :js:class:`QWeb2.Engine` also serves as a "template namespace". + + .. js:function:: QWeb2.Engine.render(template[, context]) + + Renders a previously loaded template to a String, using + ``context`` (if provided) to find the variables accessed + during template rendering (e.g. strings to display). + + :param String template: the name of the template to render + :param Object context: the basic namespace to use for template + rendering + :returns: String + + The engine exposes an other method which may be useful in some + cases (e.g. if you need a separate template namespace with, in + OpenERP Web, Kanban views get their own :js:class:`QWeb2.Engine` + instance so their templates don't collide with more general + "module" templates): + + .. js:function:: QWeb2.Engine.add_template(templates) + + Loads a template file (a collection of templates) in the QWeb + instance. The templates can be specified as: + + An XML string + QWeb will attempt to parse it to an XML document then load + it. + + A URL + QWeb will attempt to download the URL content, then load + the resulting XML string. + + A ``Document`` or ``Node`` + QWeb will traverse the first level of the document (the + child nodes of the provided root) and load any named + template or template override. + + :type templates: String | Document | Node + + A :js:class:`QWeb2.Engine` also exposes various attributes for + behavior customization: + + .. js:attribute:: QWeb2.Engine.prefix + + Prefix used to recognize :ref:`directives ` + during parsing. A string. By default, ``t``. + + .. js:attribute:: QWeb2.Engine.debug + + Boolean flag putting the engine in "debug mode". Normally, + QWeb intercepts any error raised during template execution. In + debug mode, it leaves all exceptions go through without + intercepting them. + + .. js:attribute:: QWeb2.Engine.jQuery + + The jQuery instance used during :ref:`template inheritance + ` processing. Defaults to + ``window.jQuery``. + + .. js:attribute:: QWeb2.Engine.preprocess_node + + A ``Function``. If present, called before compiling each DOM + node to template code. In OpenERP Web, this is used to + automatically translate text content and some attributes in + templates. Defaults to ``null``. + +.. _qweb-directives: + +Directives +---------- + +A basic QWeb template is nothing more than an XHTML document (as it +must be valid XML), which will be output as-is. But the rendering can +be customized with bits of logic called "directives". Directives are +attributes elements prefixed by :js:attr:`~QWeb2.Engine.prefix` (this +document will use the default prefix ``t``, as does OpenERP Web). + +A directive will usually control or alter the output of the element it +is set on. If no suitable element is available, the prefix itself can +be used as a "no-operation" element solely for supporting directives +(or internal content, which will be rendered). This means: + +.. code-block:: xml + + Something something + +will simply output the string "Something something" (the element +itself will be skipped and "unwrapped"): + +.. code-block:: javascript + + var e = new QWeb2.Engine(); + e.add_template('\ + Test 1\ + Test 2\ + '); + e.render('test1'); // Test 1 + e.render('test2'); // Test 2 + +.. note:: + + The conventions used in directive descriptions are the following: + + * directives are described as compound functions, potentially with + optional sections. Each section of the function name is an + attribute of the element bearing the directive. + + * a special parameter is ``BODY``, which does not have a name and + designates the content of the element. + + * special parameter types (aside from ``BODY`` which remains + untyped) are ``Name``, which designates a valid javascript + variable name, ``Expression`` which designates a valid + javascript expression, and ``Format`` which designates a + Ruby-style format string (a literal string with + ``#{Expression}`` inclusions executed and replaced by their + result) + +.. note:: + + ``Expression`` actually supports a few extensions on the + javascript syntax: because some syntactic elements of javascript + are not compatible with XML and must be escaped, text + substitutions are performed from forms which don't need to be + escaped. Thus the following "keyword operators" are available in + an ``Expression``: ``and`` (maps to ``&&``), ``or`` (maps to + ``||``), ``gt`` (maps to ``>``), ``gte`` (maps to ``>=``), ``lt`` + (maps to ``<``) and ``lte`` (maps to ``<=``). + +.. _qweb-directives-templates: + +Defining Templates +++++++++++++++++++ + +.. _qweb-directive-name: + +.. function:: t-name=name + + :param String name: an arbitrary javascript string. Each template + name is unique in a given + :js:class:`QWeb2.Engine` instance, defining a + new template with an existing name will + overwrite the previous one without warning. + + When multiple templates are related, it is + customary to use dotted names as a kind of + "namespace" e.g. ``foo`` and ``foo.bar`` which + will be used either by ``foo`` or by a + sub-widget of the widget used by ``foo``. + + Templates can only be defined as the children of the document + root. The document root's name is irrelevant (it's not checked) + but is usually ```` for simplicity. + + .. code-block:: xml + + + + + + + + :ref:`t-name ` can be used on an element with + an output as well: + + .. code-block:: xml + + +
+ +
+
+ + which ensures the template has a single root (if a template has + multiple roots and is then passed directly to jQuery, odd things + occur). + +.. _qweb-directives-output: + +Output +++++++ + +.. _qweb-directive-esc: + +.. function:: t-esc=content + + :param Expression content: + + Evaluates, html-escapes and outputs ``content``. + +.. _qweb-directive-escf: + +.. function:: t-escf=content + + :param Format content: + + Similar to :ref:`t-esc ` but evaluates a + ``Format`` instead of just an expression. + +.. _qweb-directive-raw: + +.. function:: t-raw=content + + :param Expression content: + + Similar to :ref:`t-esc ` but does *not* + html-escape the result of evaluating ``content``. Should only ever + be used for known-secure content, or will be an XSS attack vector. + +.. _qweb-directive-rawf: + +.. function:: t-rawf=content + + :param Format content: + + ``Format``-based version of :ref:`t-raw `. + +.. _qweb-directive-att: + +.. function:: t-att=map + + :param Expression map: + + Evaluates ``map`` expecting an ``Object`` result, sets each + key:value pair as an attribute (and its value) on the holder + element: + + .. code-block:: xml + + + + will yield + + .. code-block:: html + + + +.. function:: t-att-ATTNAME=value + + :param Name ATTNAME: + :param Expression value: + + Evaluates ``value`` and sets it on the attribute ``ATTNAME`` on + the holder element. + + If ``value``'s result is ``undefined``, suppresses the creation of + the attribute. + +.. _qweb-directive-attf: + +.. function:: t-attf-ATTNAME=value + + :param Name ATTNAME: + :param Format value: + + Similar to :ref:`t-att-* ` but the value of + the attribute is specified via a ``Format`` instead of an + expression. Useful for specifying e.g. classes mixing literal + classes and computed ones. + +.. _qweb-directives-flow: + +Flow Control +++++++++++++ + +.. _qweb-directive-set: + +.. function:: t-set=name (t-value=value | BODY) + + :param Name name: + :param Expression value: + :param BODY: + + Creates a new binding in the template context. If ``value`` is + specified, evaluates it and sets it to the specified + ``name``. Otherwise, processes ``BODY`` and uses that instead. + +.. _qweb-directive-if: + +.. function:: t-if=condition + + :param Expression condition: + + Evaluates ``condition``, suppresses the output of the holder + element and its content of the result is falsy. + +.. _qweb-directive-foreach: + +.. function:: t-foreach=iterable [t-as=name] + + :param Expression iterable: + :param Name name: + + Evaluates ``iterable``, iterates on it and evaluates the holder + element and its body once per iteration round. + + If ``name`` is not specified, computes a ``name`` based on + ``iterable`` (by replacing non-``Name`` characters by ``_``). + + If ``iterable`` yields a ``Number``, treats it as a range from 0 + to that number (excluded). + + While iterating, :ref:`t-foreach ` adds a + number of variables in the context: + + ``#{name}`` + If iterating on an array (or a range), the current value in + the iteration. If iterating on an *object*, the current key. + ``#{name}_all`` + The collection being iterated (the array generated for a + ``Number``) + ``#{name}_value`` + The current iteration value (current item for an array, value + for the current item for an object) + ``#{name}_index`` + The 0-based index of the current iteration round. + ``#{name}_first`` + Whether the current iteration round is the first one. + ``#{name}_parity`` + ``"odd"`` if the current iteration round is odd, ``"even"`` + otherwise. ``0`` is considered even. + +.. _qweb-directive-call: + +.. function:: t-call=template [BODY] + + :param String template: + :param BODY: + + Calls the specified ``template`` and returns its result. If + ``BODY`` is specified, it is evaluated *before* calling + ``template`` and can be used to specify e.g. parameters. This + usage is similar to `call-template with with-param in XSLT + `_. + +.. _qweb-directives-inheritance: + +Template Inheritance and Extension +++++++++++++++++++++++++++++++++++ + +.. _qweb-directive-extend: + +.. function:: t-extend=template BODY + + :param String template: name of the template to extend + + Works similarly to OpenERP models: if used on its own, will alter + the specified template in-place; if used in conjunction with + :ref:`t-name ` will create a new template + using the old one as a base. + + ``BODY`` should be a sequence of :ref:`t-jquery + ` alteration directives. + + .. note:: + + The inheritance in the second form is *static*: the parent + template is copied and transformed when :ref:`t-extend + ` is called. If it is altered later (by + a :ref:`t-extend ` without a + :ref:`t-name `), these changes will *not* + appear in the "child" templates. + +.. _qweb-directive-jquery: + +.. function:: t-jquery=selector [t-operation=operation] BODY + + :param String selector: a CSS selector into the parent template + :param operation: one of ``append``, ``prepend``, ``before``, + ``after``, ``inner`` or ``replace``. + :param BODY: ``operation`` argument, or alterations to perform + + * If ``operation`` is specified, applies the selector to the + parent template to find a *context node*, then applies + ``operation`` (as a jQuery operation) to the *context node*, + passing ``BODY`` as parameter. + + .. note:: + + ``replace`` maps to jQuery's `replaceWith(newContent) + `_, ``inner`` maps to + `html(htmlString) `_. + + * If ``operation`` is not provided, ``BODY`` is evaluated as + javascript code, with the *context node* as ``this``. + + .. warning:: + + While this second form is much more powerful than the first, + it is also much harder to read and maintain and should be + avoided. It is usually possible to either avoid it or + replace it with a sequence of ``t-jquery:t-operation:``. + +Escape Hatches / debugging +++++++++++++++++++++++++++ + +.. _qweb-directive-log: + +.. function:: t-log=expression + + :param Expression expression: + + Evaluates the provided expression (in the current template + context) and logs its result via ``console.log``. + +.. _qweb-directive-debug: + +.. function:: t-debug + + Injects a debugger breakpoint (via the ``debugger;`` statement) in + the compiled template output. + +.. _qweb-directive-js: + +.. function:: t-js=context BODY + + :param Name context: + :param BODY: javascript code + + Injects the provided ``BODY`` javascript code into the compiled + template, passing it the current template context using the name + specified by ``context``. diff --git a/addons/web/doc/widget.rst b/addons/web/doc/widget.rst index 7466ebaf3e8..1ebc0848e88 100644 --- a/addons/web/doc/widget.rst +++ b/addons/web/doc/widget.rst @@ -33,6 +33,8 @@ view. It provides a number of services to handle a section of a page: * Backbone-compatible shortcuts +.. _widget-dom_root: + DOM Root -------- diff --git a/addons/web/i18n/es.po b/addons/web/i18n/es.po index 7f99091ef4e..c098fde8581 100644 --- a/addons/web/i18n/es.po +++ b/addons/web/i18n/es.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-12-04 20:16+0000\n" -"Last-Translator: Santi (Pexego) \n" +"PO-Revision-Date: 2012-12-07 19:11+0000\n" +"Last-Translator: Eduardo Alberto Calvo \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-05 05:42+0000\n" -"X-Generator: Launchpad (build 16335)\n" +"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -609,7 +609,7 @@ msgstr "Formatos de Exportación" #: code:addons/web/static/src/xml/base.xml:952 #, python-format msgid "On change:" -msgstr "On change:" +msgstr "Al cambiar:" #. module: web #. openerp-web @@ -863,7 +863,7 @@ msgstr "Preferencias" #: code:addons/web/static/src/js/view_form.js:434 #, python-format msgid "Wrong on change format: %s" -msgstr "" +msgstr "Error en el cambio de formato: %s" #. module: web #. openerp-web @@ -1255,7 +1255,7 @@ msgstr "Agrupar por: %s" #: code:addons/web/static/src/js/view_form.js:151 #, python-format msgid "No data provided." -msgstr "" +msgstr "No se han facilitado datos" #. module: web #. openerp-web @@ -1326,7 +1326,7 @@ msgstr "%(page)d/%(page_count)d" #: code:addons/web/static/src/js/chrome.js:397 #, python-format msgid "The confirmation does not match the password" -msgstr "" +msgstr "La confirmación no coincide con la contraseña" #. module: web #. openerp-web @@ -1417,7 +1417,7 @@ msgstr "es igual a" #: code:addons/web/static/src/js/views.js:1455 #, python-format msgid "Could not serialize XML" -msgstr "" +msgstr "No pudo serializar el XML" #. module: web #. openerp-web @@ -2229,7 +2229,7 @@ msgstr "No se encontró contenido para el campo '%s' en '%s:%s'" #: code:addons/web/static/src/xml/base.xml:304 #, python-format msgid "Database Management" -msgstr "" +msgstr "Administración base de datos" #. module: web #. openerp-web @@ -2315,7 +2315,7 @@ msgstr "Agregar condición" #: code:addons/web/static/src/js/coresetup.js:620 #, python-format msgid "Still loading..." -msgstr "" +msgstr "Aún cargando..." #. module: web #. openerp-web @@ -2331,6 +2331,7 @@ msgstr "" #, python-format msgid "The o2m record must be saved before an action can be used" msgstr "" +"El registro O2M debe guardarse antes que una acción pueda ser utilizada" #. module: web #. openerp-web @@ -2372,7 +2373,7 @@ msgstr "Disparador activado desde la vista de búsqueda" #: code:addons/web/static/src/js/search.js:980 #, python-format msgid "Filter" -msgstr "" +msgstr "Filtro" #. module: web #. openerp-web @@ -2414,7 +2415,7 @@ msgstr "Editar Flujo de trabajo" #: code:addons/web/static/src/js/views.js:1172 #, python-format msgid "Do you really want to delete this attachment ?" -msgstr "" +msgstr "¿Realmente quiere borrar este adjunto?" #. module: web #. openerp-web diff --git a/addons/web/i18n/fa.po b/addons/web/i18n/fa.po index 2ae05a69b08..7ca8bae970d 100644 --- a/addons/web/i18n/fa.po +++ b/addons/web/i18n/fa.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-11-28 01:51+0000\n" +"PO-Revision-Date: 2012-12-07 13:23+0000\n" "Last-Translator: fshahy \n" "Language-Team: Persian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-01 05:20+0000\n" -"X-Generator: Launchpad (build 16319)\n" +"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -36,7 +36,7 @@ msgstr "%d دقیقه پیش" #: code:addons/web/static/src/js/coresetup.js:621 #, python-format msgid "Still loading...
Please be patient." -msgstr "" +msgstr "در حال بارگذاری... لطفا صبر کنید." #. module: web #. openerp-web @@ -59,7 +59,7 @@ msgstr "کوچکتر یا مساوی" #: code:addons/web/static/src/js/chrome.js:393 #, python-format msgid "Please enter your previous password" -msgstr "" +msgstr "لطفا کلمه عبور قبلی خود را وارد کنید." #. module: web #. openerp-web @@ -68,21 +68,21 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:282 #, python-format msgid "Master password:" -msgstr "" +msgstr "کلمه عبور اصلی:" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:274 #, python-format msgid "Change Master Password" -msgstr "" +msgstr "تغییر کلمه عبور اصلی" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:491 #, python-format msgid "Do you really want to delete the database: %s ?" -msgstr "" +msgstr "آیا پایگاه داده حذف شود: %s ؟" #. module: web #. openerp-web @@ -96,14 +96,14 @@ msgstr "" #: code:addons/web/static/src/js/chrome.js:537 #, python-format msgid "Access Denied" -msgstr "" +msgstr "امکان دسترسی وجود ندارد" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:594 #, python-format msgid "about an hour ago" -msgstr "" +msgstr "حدود یک ساعت قبل" #. module: web #. openerp-web @@ -112,7 +112,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:216 #, python-format msgid "Backup Database" -msgstr "" +msgstr "تهیه کپی پشتیبان از پایگاه داده" #. module: web #. openerp-web @@ -120,7 +120,7 @@ msgstr "" #: code:addons/web/static/src/js/dates.js:53 #, python-format msgid "'%s' is not a valid date" -msgstr "" +msgstr "'%s' یک تاریخ معتبر نیست" #. module: web #. openerp-web @@ -134,7 +134,7 @@ msgstr "" #: code:addons/web/static/src/js/coresetup.js:592 #, python-format msgid "about a minute ago" -msgstr "" +msgstr "حدود یک دقیقه قبل" #. module: web #. openerp-web @@ -147,14 +147,14 @@ msgstr "فایل" #: code:addons/web/controllers/main.py:842 #, python-format msgid "You cannot leave any password empty." -msgstr "" +msgstr "هیچ یک از فیلد های کلمه عبور نباید خالی باشد." #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:681 #, python-format msgid "Invalid username or password" -msgstr "" +msgstr "نام کاربری یا کلمه عبور معتبر نیست" #. module: web #. openerp-web @@ -163,7 +163,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:260 #, python-format msgid "Master Password:" -msgstr "" +msgstr "کلمه عبور اصلی:" #. module: web #. openerp-web @@ -171,14 +171,14 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:1349 #, python-format msgid "Select" -msgstr "" +msgstr "انتخاب" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:549 #, python-format msgid "Database restored successfully" -msgstr "" +msgstr "پایگاه داده با موفقیت بازیابی شد" #. module: web #. openerp-web @@ -192,7 +192,7 @@ msgstr "نسخه" #: code:addons/web/static/src/xml/base.xml:564 #, python-format msgid "Latest Modification Date:" -msgstr "" +msgstr "تاریخ آخرین تغییر" #. module: web #. openerp-web @@ -213,7 +213,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:1583 #, python-format msgid "Share with all users" -msgstr "" +msgstr "اشتراک با همه کاربران" #. module: web #. openerp-web @@ -221,7 +221,7 @@ msgstr "" #: code:addons/web/static/src/js/view_form.js:319 #, python-format msgid "Form" -msgstr "" +msgstr "فرم" #. module: web #. openerp-web @@ -270,14 +270,14 @@ msgstr "تعریف نشده" #: code:addons/web/static/src/js/view_form.js:4831 #, python-format msgid "File Upload" -msgstr "" +msgstr "آپلود فایل" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:598 #, python-format msgid "about a month ago" -msgstr "" +msgstr "حدود یک ماه قبل" #. module: web #. openerp-web diff --git a/addons/web/i18n/hr.po b/addons/web/i18n/hr.po index e3624445143..1446216b5c7 100644 --- a/addons/web/i18n/hr.po +++ b/addons/web/i18n/hr.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-11-24 19:05+0000\n" +"PO-Revision-Date: 2012-12-09 18:47+0000\n" "Last-Translator: Goran Kliska \n" "Language-Team: Croatian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-01 05:21+0000\n" -"X-Generator: Launchpad (build 16319)\n" +"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -59,7 +59,7 @@ msgstr "manje ili jednako od" #: code:addons/web/static/src/js/chrome.js:393 #, python-format msgid "Please enter your previous password" -msgstr "" +msgstr "Upišite trenutno važeću lozinku" #. module: web #. openerp-web @@ -68,7 +68,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:282 #, python-format msgid "Master password:" -msgstr "Glavna zaporka" +msgstr "Glavna lozinka" #. module: web #. openerp-web @@ -82,7 +82,7 @@ msgstr "Promijeni glavnu lozinku" #: code:addons/web/static/src/js/chrome.js:491 #, python-format msgid "Do you really want to delete the database: %s ?" -msgstr "" +msgstr "Zaista želite obrisati bazu podataka: %s ?" #. module: web #. openerp-web @@ -96,7 +96,7 @@ msgstr "Traži %(field)s at: %(value)s" #: code:addons/web/static/src/js/chrome.js:537 #, python-format msgid "Access Denied" -msgstr "" +msgstr "Pristup odbijen / zabranjen" #. module: web #. openerp-web @@ -120,7 +120,7 @@ msgstr "Backup baze podataka" #: code:addons/web/static/src/js/dates.js:53 #, python-format msgid "'%s' is not a valid date" -msgstr "" +msgstr "'%s' nije ispravan datum" #. module: web #. openerp-web @@ -147,14 +147,14 @@ msgstr "Datoteka" #: code:addons/web/controllers/main.py:842 #, python-format msgid "You cannot leave any password empty." -msgstr "" +msgstr "Popunite sva polja." #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:681 #, python-format msgid "Invalid username or password" -msgstr "Neispravno korisničko ime ili zaporka." +msgstr "Neispravno korisničko ime ili lozinka." #. module: web #. openerp-web @@ -163,7 +163,7 @@ msgstr "Neispravno korisničko ime ili zaporka." #: code:addons/web/static/src/xml/base.xml:260 #, python-format msgid "Master Password:" -msgstr "Glavna zaporka" +msgstr "Glavna lozinka" #. module: web #. openerp-web @@ -207,7 +207,7 @@ msgstr "" #: code:addons/web/static/src/js/view_form.js:1242 #, python-format msgid "Widget type '%s' is not implemented" -msgstr "" +msgstr "Widget tipa '%s' nije implementiran" #. module: web #. openerp-web @@ -236,7 +236,7 @@ msgstr "(prazno)" #: code:addons/web/static/src/js/formats.js:282 #, python-format msgid "'%s' is not a correct time" -msgstr "" +msgstr "'%s' nije ispravno vrijeme" #. module: web #. openerp-web @@ -250,7 +250,7 @@ msgstr "nije ispravan broj" #: code:addons/web/static/src/xml/base.xml:325 #, python-format msgid "New Password:" -msgstr "Nova zaporka:" +msgstr "Nova lozinka:" #. module: web #. openerp-web @@ -271,7 +271,7 @@ msgstr "Nedefiniran" #: code:addons/web/static/src/js/view_form.js:4831 #, python-format msgid "File Upload" -msgstr "" +msgstr "Slanje datoteke" #. module: web #. openerp-web @@ -328,14 +328,14 @@ msgstr "Dupliciraj bazu podataka" #: code:addons/web/static/src/xml/base.xml:336 #, python-format msgid "Change Password" -msgstr "Promijeni zaporku" +msgstr "Promijeni lozinku" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:3382 #, python-format msgid "View type '%s' is not supported in One2Many." -msgstr "" +msgstr "Pogled tipa '%s' nije podržan za JedanNaViše (One2Many) polja." #. module: web #. openerp-web @@ -350,7 +350,7 @@ msgstr "Preuzimanje" #: code:addons/web/static/src/js/formats.js:266 #, python-format msgid "'%s' is not a correct datetime" -msgstr "" +msgstr "'%s' nije ispravno vrijeme" #. module: web #. openerp-web @@ -378,13 +378,13 @@ msgstr "Odabir:" #: code:addons/web/static/src/js/view_form.js:869 #, python-format msgid "The following fields are invalid:" -msgstr "" +msgstr "Popis neispravnih polja:" #. module: web #: code:addons/web/controllers/main.py:863 #, python-format msgid "Languages" -msgstr "" +msgstr "Jezici" #. module: web #. openerp-web @@ -405,7 +405,7 @@ msgstr "Uvoz" #: code:addons/web/static/src/js/chrome.js:543 #, python-format msgid "Could not restore the database" -msgstr "" +msgstr "Oporavak baze podataka nije uspješno dovršen" #. module: web #. openerp-web @@ -518,7 +518,7 @@ msgstr "Operator %s nije podržan unutar domene %s" #: code:addons/web/static/src/js/formats.js:242 #, python-format msgid "'%s' is not a correct float" -msgstr "" +msgstr "'%s' nije ispravna decimalna vrijednost" #. module: web #. openerp-web @@ -532,7 +532,7 @@ msgstr "Oporavljeno" #: code:addons/web/static/src/js/view_list.js:392 #, python-format msgid "%d-%d of %d" -msgstr "" +msgstr "%d-%d od %d" #. module: web #. openerp-web @@ -546,14 +546,14 @@ msgstr "Kreiraj i uredi" #: code:addons/web/static/src/js/pyeval.js:731 #, python-format msgid "Unknown nonliteral type " -msgstr "" +msgstr "Nepoznat tip podatka " #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:2345 #, python-format msgid "Resource error" -msgstr "" +msgstr "Greška resursa" #. module: web #. openerp-web @@ -574,7 +574,7 @@ msgstr "Ispiši tijek rada" #: code:addons/web/static/src/js/chrome.js:396 #, python-format msgid "Please confirm your new password" -msgstr "" +msgstr "Potvrdite Vašu novu zaporku" #. module: web #. openerp-web @@ -623,7 +623,7 @@ msgstr "Polja %s modela" #: code:addons/web/static/src/js/view_list.js:890 #, python-format msgid "Setting 'id' attribute on existing record %s" -msgstr "" +msgstr "Postavljanje 'id' atributa na postojećem zapisu %s" #. module: web #. openerp-web @@ -668,13 +668,15 @@ msgstr "Action ID:" #, python-format msgid "Your user's preference timezone does not match your browser timezone:" msgstr "" +"Pojasno vrijeme u Vašim korisničkim podacima ne odgovara pojasnom vremenu " +"zadanom u Vašem Internet pretraživaču" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:1238 #, python-format msgid "Field '%s' specified in view could not be found." -msgstr "" +msgstr "Ne postoji polje '%s', a navedeno je u definiciji pogleda." #. module: web #. openerp-web @@ -688,7 +690,7 @@ msgstr "Snimljeni izvozi" #: code:addons/web/static/src/xml/base.xml:320 #, python-format msgid "Old Password:" -msgstr "Stara zaporka:" +msgstr "Stara lozinka:" #. module: web #. openerp-web @@ -702,7 +704,7 @@ msgstr "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "The database has been duplicated." -msgstr "" +msgstr "Baza podataka je duplicirana." #. module: web #. openerp-web @@ -731,7 +733,7 @@ msgstr "Spremi kao" #: code:addons/web/static/src/js/view_form.js:2316 #, python-format msgid "E-mail error" -msgstr "" +msgstr "E-mail greška" #. module: web #. openerp-web @@ -793,7 +795,7 @@ msgstr "Graničnik:" #: code:addons/web/static/src/xml/base.xml:458 #, python-format msgid "Browser's timezone" -msgstr "" +msgstr "Pojasno vrijeme internet preglednika" #. module: web #. openerp-web @@ -838,7 +840,7 @@ msgstr "OpenERP.com" #: code:addons/web/static/src/js/view_form.js:2316 #, python-format msgid "Can't send email to invalid e-mail address" -msgstr "" +msgstr "Nije moguće poslati email na neispravne e-mail adrese" #. module: web #. openerp-web @@ -859,7 +861,7 @@ msgstr "Postavke" #: code:addons/web/static/src/js/view_form.js:434 #, python-format msgid "Wrong on change format: %s" -msgstr "" +msgstr "Greška u promjeni formata: %s" #. module: web #. openerp-web @@ -874,7 +876,7 @@ msgstr "Obriši bazu podataka" #: code:addons/web/static/src/xml/base.xml:462 #, python-format msgid "Click here to change your user's timezone." -msgstr "" +msgstr "Kliknite ovdje za promjenu korisničkog pojasnog vremena" #. module: web #. openerp-web @@ -920,21 +922,21 @@ msgstr "Korisničko ime" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "Duplicating database" -msgstr "" +msgstr "Dupliciram bazu podataka" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Password has been changed successfully" -msgstr "" +msgstr "Lozinka uspješno promjenjena" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list_editable.js:781 #, python-format msgid "The form's data can not be discarded" -msgstr "" +msgstr "Podaci (form's data) se ne mogu odbaciti" #. module: web #. openerp-web @@ -969,6 +971,10 @@ msgid "" "\n" "%s" msgstr "" +"Greška lokalne evaluacije\n" +"%s\n" +"\n" +"%s" #. module: web #. openerp-web @@ -1003,7 +1009,7 @@ msgstr "Kreirano:" #: code:addons/web/controllers/main.py:851 #, python-format msgid "Error, password not changed !" -msgstr "" +msgstr "Greška, lozika nije promjenjena!" #. module: web #. openerp-web @@ -1025,7 +1031,7 @@ msgstr "/web/binary/upload_attachment" #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Changed Password" -msgstr "" +msgstr "Promjenjena lozinka" #. module: web #. openerp-web @@ -1059,14 +1065,14 @@ msgstr "Arhiviranje/Backup" #: code:addons/web/static/src/js/dates.js:80 #, python-format msgid "'%s' is not a valid time" -msgstr "" +msgstr "'%s' nije ispravno vrijeme" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:274 #, python-format msgid "'%s' is not a correct date" -msgstr "" +msgstr "'%s' nije ispravan datum" #. module: web #. openerp-web @@ -1120,7 +1126,7 @@ msgstr "Zadnju promjenu napravio:" #: code:addons/web/static/src/xml/base.xml:466 #, python-format msgid "Timezone mismatch" -msgstr "" +msgstr "Neslaganje vremenskih pojasa" #. module: web #. openerp-web @@ -1189,7 +1195,7 @@ msgstr "Dodaj napredni filter" #: code:addons/web/controllers/main.py:844 #, python-format msgid "The new password and its confirmation must be identical." -msgstr "" +msgstr "Nova lozinka i potvrda lozinke moraju biti identične." #. module: web #. openerp-web @@ -1204,7 +1210,7 @@ msgstr "Povrati bazu podataka" #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "Login" -msgstr "" +msgstr "Prijava" #. module: web #. openerp-web @@ -1247,7 +1253,7 @@ msgstr "Grupiraj po: %s" #: code:addons/web/static/src/js/view_form.js:151 #, python-format msgid "No data provided." -msgstr "" +msgstr "Nema podataka." #. module: web #. openerp-web @@ -1290,7 +1296,7 @@ msgstr "Neispravna pretraga" #: code:addons/web/static/src/js/view_list.js:959 #, python-format msgid "Could not find id in dataset" -msgstr "" +msgstr "Id nije pronađen u podacima" #. module: web #. openerp-web @@ -1318,7 +1324,7 @@ msgstr "%(page)d/%(page_count)d" #: code:addons/web/static/src/js/chrome.js:397 #, python-format msgid "The confirmation does not match the password" -msgstr "" +msgstr "Nova lozinka i potvrda su različite" #. module: web #. openerp-web @@ -1357,7 +1363,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:393 #, python-format msgid "99+" -msgstr "" +msgstr "99+" #. module: web #. openerp-web @@ -1371,7 +1377,7 @@ msgstr "1. Uvezi .CSV datoteku" #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "No database selected !" -msgstr "" +msgstr "Nije odabrana baza podataka" #. module: web #. openerp-web @@ -1409,7 +1415,7 @@ msgstr "je jednako" #: code:addons/web/static/src/js/views.js:1455 #, python-format msgid "Could not serialize XML" -msgstr "" +msgstr "Could not serialize XML" #. module: web #. openerp-web @@ -1513,14 +1519,14 @@ msgstr "Stablo" #: code:addons/web/controllers/main.py:766 #, python-format msgid "Could not drop database !" -msgstr "" +msgstr "Brisanje baze podataka nije uspjelo!" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:227 #, python-format msgid "'%s' is not a correct integer" -msgstr "" +msgstr "'%s' nije ispravna cjelobrojna vrijednost" #. module: web #. openerp-web @@ -1541,7 +1547,7 @@ msgstr "Nepoznato polje %s unutar domene %s" #: code:addons/web/static/src/js/views.js:1421 #, python-format msgid "Node [%s] is not a JSONified XML node" -msgstr "" +msgstr "Node [%s] nije JSONified XML node" #. module: web #. openerp-web @@ -1555,7 +1561,7 @@ msgstr "Napredno pretraživanje" #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "Dropping database" -msgstr "" +msgstr "Brisanje baze podataka" #. module: web #. openerp-web @@ -1578,7 +1584,7 @@ msgstr "Da" #: code:addons/web/static/src/js/view_form.js:4831 #, python-format msgid "There was a problem while uploading your file" -msgstr "" +msgstr "Pojavio se problem kod učitavanja vaše datoteke" #. module: web #. openerp-web @@ -1620,7 +1626,7 @@ msgstr "%d godina prije" #: code:addons/web/static/src/js/view_list.js:1019 #, python-format msgid "Unknown m2m command %s" -msgstr "" +msgstr "Napoznata m2m naredba %s" #. module: web #. openerp-web @@ -1643,14 +1649,14 @@ msgstr "Naziv nove baze podataka:" #: code:addons/web/static/src/js/chrome.js:394 #, python-format msgid "Please enter your new password" -msgstr "" +msgstr "Molim, unesite novu lozinku" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1463 #, python-format msgid "Could not parse string to xml" -msgstr "" +msgstr "Could not parse string to xml" #. module: web #. openerp-web @@ -1699,7 +1705,7 @@ msgstr "Copyright © 2004-TODAY OpenERP SA. Sva prava pridržana." #: code:addons/web/static/src/js/view_form.js:2345 #, python-format msgid "This resource is empty" -msgstr "" +msgstr "Ovaj resurs je prazan" #. module: web #. openerp-web @@ -1757,7 +1763,7 @@ msgstr "Polja pogleda" #: code:addons/web/static/src/xml/base.xml:330 #, python-format msgid "Confirm New Password:" -msgstr "" +msgstr "Potvrda nove zaporke:" #. module: web #. openerp-web @@ -1908,7 +1914,7 @@ msgstr "" #: code:addons/web/static/src/js/view_form.js:319 #, python-format msgid "The record could not be found in the database." -msgstr "" +msgstr "Zapis nije pronađen u bazi podataka." #. module: web #. openerp-web @@ -1929,7 +1935,7 @@ msgstr "Tip:" #: code:addons/web/static/src/js/chrome.js:538 #, python-format msgid "Incorrect super-administrator password" -msgstr "" +msgstr "Neispravna lozinka super-administratora" #. module: web #. openerp-web @@ -1971,6 +1977,8 @@ msgid "" "The type of the field '%s' must be a many2many field with a relation to " "'ir.attachment' model." msgstr "" +"Tip polja '%s' mora biti VišeNaViše (many2many) polje u relaciji sa " +"'ir.attachment' (privici) modelom." #. module: web #. openerp-web @@ -2035,14 +2043,14 @@ msgstr "Učitaj demonstracijske podatke:" #: code:addons/web/static/src/js/dates.js:26 #, python-format msgid "'%s' is not a valid datetime" -msgstr "" +msgstr "'%s' nije ispravno vrijeme" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1471 #, python-format msgid "Could not find a DOM Parser: %s" -msgstr "" +msgstr "Could not find a DOM Parser: %s" #. module: web #. openerp-web @@ -2122,14 +2130,14 @@ msgstr "Preuzimanje \"%s\"" #: code:addons/web/static/src/js/view_form.js:324 #, python-format msgid "New" -msgstr "" +msgstr "Nova(i)" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list.js:1746 #, python-format msgid "Can't convert value %s to context" -msgstr "" +msgstr "Vrijednost %s ne odgovara za context" #. module: web #. openerp-web @@ -2202,13 +2210,13 @@ msgstr "O OpenERP-u" #: code:addons/web/static/src/js/formats.js:297 #, python-format msgid "'%s' is not a correct date, datetime nor time" -msgstr "" +msgstr "'%s' nije ispravno vrijeme ili datum" #. module: web #: code:addons/web/controllers/main.py:1306 #, python-format msgid "No content found for field '%s' on '%s:%s'" -msgstr "" +msgstr "Nedostaje kontekst za polje '%s' na '%s:%s'" #. module: web #. openerp-web @@ -2236,7 +2244,7 @@ msgstr "Upravljanje bazama podataka" #: code:addons/web/static/src/js/pyeval.js:765 #, python-format msgid "Evaluation Error" -msgstr "" +msgstr "Greška evaluacije" #. module: web #. openerp-web @@ -2269,7 +2277,7 @@ msgstr "Ne" #: code:addons/web/static/src/js/formats.js:309 #, python-format msgid "'%s' is not convertible to date, datetime nor time" -msgstr "" +msgstr "Interpretacija '%s' ne reultira datumom ili vremenom" #. module: web #. openerp-web @@ -2344,7 +2352,7 @@ msgstr "Polje je prazno. Ništa za snimanje !" #: code:addons/web/static/src/js/view_list.js:1327 #, python-format msgid "%s (%d)" -msgstr "" +msgstr "%s (%d)" #. module: web #. openerp-web @@ -2407,7 +2415,7 @@ msgstr "Obrisati privitak?" #: code:addons/web/static/src/js/views.js:838 #, python-format msgid "Technical Translation" -msgstr "" +msgstr "tehnički prijevod" #. module: web #. openerp-web @@ -2421,14 +2429,14 @@ msgstr "Polje:" #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "The database %s has been dropped" -msgstr "" +msgstr "Baza podataka %s je obrisana" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:456 #, python-format msgid "User's timezone" -msgstr "" +msgstr "Korisnikov vremenski pojas" #. module: web #. openerp-web @@ -2457,7 +2465,7 @@ msgstr "Posebno:" #, python-format msgid "" "The old password you provided is incorrect, your password was not changed." -msgstr "" +msgstr "Trenutna lozinka nije točno upisana. Lozinka nije promijenjena." #. module: web #. openerp-web diff --git a/addons/web/i18n/nl.po b/addons/web/i18n/nl.po index 26af41b2a8f..976c8143f12 100644 --- a/addons/web/i18n/nl.po +++ b/addons/web/i18n/nl.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-11-25 07:07+0000\n" +"PO-Revision-Date: 2012-12-05 18:18+0000\n" "Last-Translator: Erwin van der Ploeg (Endian Solutions) \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-01 05:20+0000\n" -"X-Generator: Launchpad (build 16319)\n" +"X-Launchpad-Export-Date: 2012-12-06 04:54+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -59,7 +59,7 @@ msgstr "is kleiner of gelijk aan" #: code:addons/web/static/src/js/chrome.js:393 #, python-format msgid "Please enter your previous password" -msgstr "" +msgstr "Geef uw vorige wachtwoord in" #. module: web #. openerp-web @@ -82,7 +82,7 @@ msgstr "Wijzig hoofdwachtwoord" #: code:addons/web/static/src/js/chrome.js:491 #, python-format msgid "Do you really want to delete the database: %s ?" -msgstr "" +msgstr "Weet u zeker dat u database %s wilt verwijderen?" #. module: web #. openerp-web @@ -96,7 +96,7 @@ msgstr "Zoek %(field)s bij: %(value)s" #: code:addons/web/static/src/js/chrome.js:537 #, python-format msgid "Access Denied" -msgstr "" +msgstr "Toegang geweigerd" #. module: web #. openerp-web @@ -120,7 +120,7 @@ msgstr "Back-up database" #: code:addons/web/static/src/js/dates.js:53 #, python-format msgid "'%s' is not a valid date" -msgstr "" +msgstr "'%s' is geen geldige datum" #. module: web #. openerp-web @@ -147,7 +147,7 @@ msgstr "Bestand" #: code:addons/web/controllers/main.py:842 #, python-format msgid "You cannot leave any password empty." -msgstr "" +msgstr "Het is niet toegestaan om de wachtwoord velden leeg te laten." #. module: web #. openerp-web @@ -206,7 +206,7 @@ msgstr "M2O zoek velden behandelen momenteel geen meerdere standaard waardes" #: code:addons/web/static/src/js/view_form.js:1242 #, python-format msgid "Widget type '%s' is not implemented" -msgstr "" +msgstr "Widget type '%s' is niet geimplementeerd" #. module: web #. openerp-web @@ -235,7 +235,7 @@ msgstr "(no string)" #: code:addons/web/static/src/js/formats.js:282 #, python-format msgid "'%s' is not a correct time" -msgstr "" +msgstr "'%s' is geen geldige tijd" #. module: web #. openerp-web @@ -334,7 +334,7 @@ msgstr "Wachtwoord wijzigen" #: code:addons/web/static/src/js/view_form.js:3382 #, python-format msgid "View type '%s' is not supported in One2Many." -msgstr "" +msgstr "Weergave type '%s' wordt niet ondersteund in One2Many." #. module: web #. openerp-web @@ -349,7 +349,7 @@ msgstr "Downloaden" #: code:addons/web/static/src/js/formats.js:266 #, python-format msgid "'%s' is not a correct datetime" -msgstr "" +msgstr "'%s' is geen geldinge datum/tijd" #. module: web #. openerp-web @@ -377,13 +377,13 @@ msgstr "Selectie:" #: code:addons/web/static/src/js/view_form.js:869 #, python-format msgid "The following fields are invalid:" -msgstr "" +msgstr "De volgende velden zijn ongeldig:" #. module: web #: code:addons/web/controllers/main.py:863 #, python-format msgid "Languages" -msgstr "" +msgstr "Talen" #. module: web #. openerp-web @@ -404,7 +404,7 @@ msgstr "Importeren" #: code:addons/web/static/src/js/chrome.js:543 #, python-format msgid "Could not restore the database" -msgstr "" +msgstr "Het was niet mogelijk om de database te herstellen" #. module: web #. openerp-web @@ -517,7 +517,7 @@ msgstr "Niet ondersteunde operator %s in domein %s" #: code:addons/web/static/src/js/formats.js:242 #, python-format msgid "'%s' is not a correct float" -msgstr "" +msgstr "'%s' is geen correcte float" #. module: web #. openerp-web @@ -531,7 +531,7 @@ msgstr "Teruggezet" #: code:addons/web/static/src/js/view_list.js:392 #, python-format msgid "%d-%d of %d" -msgstr "" +msgstr "%d-%d of %d" #. module: web #. openerp-web @@ -545,7 +545,7 @@ msgstr "Aanmaken en Bewerken..." #: code:addons/web/static/src/js/pyeval.js:731 #, python-format msgid "Unknown nonliteral type " -msgstr "" +msgstr "Onbekend nonliteral type " #. module: web #. openerp-web @@ -573,7 +573,7 @@ msgstr "Afdrukken Workflow" #: code:addons/web/static/src/js/chrome.js:396 #, python-format msgid "Please confirm your new password" -msgstr "" +msgstr "Bevestig uw wachtwoord" #. module: web #. openerp-web @@ -622,7 +622,7 @@ msgstr "Model %s velden" #: code:addons/web/static/src/js/view_list.js:890 #, python-format msgid "Setting 'id' attribute on existing record %s" -msgstr "" +msgstr "Instellen van 'id' attribute op bestaand record %s" #. module: web #. openerp-web @@ -667,6 +667,8 @@ msgstr "Action ID:" #, python-format msgid "Your user's preference timezone does not match your browser timezone:" msgstr "" +"De tijdzone in uw gebruikersvoorkeuren komt niet overheen met de tijdzone " +"van uw browser:" #. module: web #. openerp-web @@ -674,6 +676,7 @@ msgstr "" #, python-format msgid "Field '%s' specified in view could not be found." msgstr "" +"Veld '%s' welke in de weergave is gespecificeerd kon niet worden gevonden." #. module: web #. openerp-web @@ -701,7 +704,7 @@ msgstr "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "The database has been duplicated." -msgstr "" +msgstr "De database is gedupliceerd." #. module: web #. openerp-web @@ -793,7 +796,7 @@ msgstr "Veldscheidingsteken:" #: code:addons/web/static/src/xml/base.xml:458 #, python-format msgid "Browser's timezone" -msgstr "" +msgstr "Tijdzone van de browser" #. module: web #. openerp-web @@ -859,7 +862,7 @@ msgstr "Voorkeuren" #: code:addons/web/static/src/js/view_form.js:434 #, python-format msgid "Wrong on change format: %s" -msgstr "" +msgstr "Fout bij het wijzigen van het formaat: %s" #. module: web #. openerp-web @@ -874,7 +877,7 @@ msgstr "Verwijder Database" #: code:addons/web/static/src/xml/base.xml:462 #, python-format msgid "Click here to change your user's timezone." -msgstr "" +msgstr "Klik hier om uw tijdzone te wijzigen." #. module: web #. openerp-web @@ -920,21 +923,21 @@ msgstr "Gebruikersnaam" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "Duplicating database" -msgstr "" +msgstr "Dupliceer database" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Password has been changed successfully" -msgstr "" +msgstr "Uw wachtwoord is succesvol gewijzigd." #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list_editable.js:781 #, python-format msgid "The form's data can not be discarded" -msgstr "" +msgstr "De gegevens van het formulier kunnen niet worden verwijderd." #. module: web #. openerp-web @@ -969,6 +972,10 @@ msgid "" "\n" "%s" msgstr "" +"Locale evaluatie fout\n" +"%s\n" +"\n" +"%s" #. module: web #. openerp-web @@ -1003,7 +1010,7 @@ msgstr "Aanmaakdatum:" #: code:addons/web/controllers/main.py:851 #, python-format msgid "Error, password not changed !" -msgstr "" +msgstr "Fout, uw wachtwoord is niet gewijzigd!" #. module: web #. openerp-web @@ -1026,7 +1033,7 @@ msgstr "/web/binary/upload_attachment" #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Changed Password" -msgstr "" +msgstr "Wachtwoord gewijzigd" #. module: web #. openerp-web @@ -1060,14 +1067,14 @@ msgstr "Backup" #: code:addons/web/static/src/js/dates.js:80 #, python-format msgid "'%s' is not a valid time" -msgstr "" +msgstr "'%s' is geen geldige tijd" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:274 #, python-format msgid "'%s' is not a correct date" -msgstr "" +msgstr "'%s' is geen correcte datum" #. module: web #. openerp-web @@ -1121,7 +1128,7 @@ msgstr "Laatst aangepast door:" #: code:addons/web/static/src/xml/base.xml:466 #, python-format msgid "Timezone mismatch" -msgstr "" +msgstr "Tijdzone fout" #. module: web #. openerp-web @@ -1189,7 +1196,7 @@ msgstr "Geavanceerd filter toevoegen" #: code:addons/web/controllers/main.py:844 #, python-format msgid "The new password and its confirmation must be identical." -msgstr "" +msgstr "Het nieuwe wachtwoord en haar bevestiging moeten identiek zijn." #. module: web #. openerp-web @@ -1204,7 +1211,7 @@ msgstr "Herstel database" #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "Login" -msgstr "" +msgstr "Inloggen" #. module: web #. openerp-web @@ -1247,7 +1254,7 @@ msgstr "Groepeer op: %s" #: code:addons/web/static/src/js/view_form.js:151 #, python-format msgid "No data provided." -msgstr "" +msgstr "Geen gegevens ingevoerd" #. module: web #. openerp-web @@ -1318,7 +1325,7 @@ msgstr "%(page)d/%(page_count)d" #: code:addons/web/static/src/js/chrome.js:397 #, python-format msgid "The confirmation does not match the password" -msgstr "" +msgstr "De bevestiging komt niet overeen met het wachtwoord" #. module: web #. openerp-web @@ -1357,7 +1364,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:393 #, python-format msgid "99+" -msgstr "" +msgstr "99+" #. module: web #. openerp-web @@ -1371,7 +1378,7 @@ msgstr "1. Importeer een .CSV bestand" #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "No database selected !" -msgstr "" +msgstr "Geen database geselecteerd!" #. module: web #. openerp-web @@ -1409,7 +1416,7 @@ msgstr "is gelijk aan" #: code:addons/web/static/src/js/views.js:1455 #, python-format msgid "Could not serialize XML" -msgstr "" +msgstr "Could not serialize XML" #. module: web #. openerp-web @@ -1516,14 +1523,14 @@ msgstr "Boomstructuur" #: code:addons/web/controllers/main.py:766 #, python-format msgid "Could not drop database !" -msgstr "" +msgstr "De database kon niet worden verwijderd!" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:227 #, python-format msgid "'%s' is not a correct integer" -msgstr "" +msgstr "'%s' is geen correct geheel getal (integer)" #. module: web #. openerp-web @@ -1544,7 +1551,7 @@ msgstr "Onbekend veld %s in domein %s" #: code:addons/web/static/src/js/views.js:1421 #, python-format msgid "Node [%s] is not a JSONified XML node" -msgstr "" +msgstr "Node [%s] is geen JSONified XML node" #. module: web #. openerp-web @@ -1558,7 +1565,7 @@ msgstr "Geavanceerd zoeken..." #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "Dropping database" -msgstr "" +msgstr "Database verwijderen" #. module: web #. openerp-web @@ -1623,7 +1630,7 @@ msgstr "%d jaar geleden" #: code:addons/web/static/src/js/view_list.js:1019 #, python-format msgid "Unknown m2m command %s" -msgstr "" +msgstr "Onbekend m2m commando %s" #. module: web #. openerp-web @@ -1646,14 +1653,14 @@ msgstr "Naam nieuwe database:" #: code:addons/web/static/src/js/chrome.js:394 #, python-format msgid "Please enter your new password" -msgstr "" +msgstr "Vul uw nieuwe wachtwoord in" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1463 #, python-format msgid "Could not parse string to xml" -msgstr "" +msgstr "Could not parse string to xml" #. module: web #. openerp-web @@ -1760,7 +1767,7 @@ msgstr "Weergeven velden" #: code:addons/web/static/src/xml/base.xml:330 #, python-format msgid "Confirm New Password:" -msgstr "" +msgstr "Bevestig nieuw wachtwoord" #. module: web #. openerp-web @@ -1932,7 +1939,7 @@ msgstr "Soort:" #: code:addons/web/static/src/js/chrome.js:538 #, python-format msgid "Incorrect super-administrator password" -msgstr "" +msgstr "Het super-administrator wachtwoord is incorrect." #. module: web #. openerp-web @@ -1974,6 +1981,8 @@ msgid "" "The type of the field '%s' must be a many2many field with a relation to " "'ir.attachment' model." msgstr "" +"Het type van het veld '%s' moet een many2many veld zijn met een relatie naar " +"het 'ir.attachment' model." #. module: web #. openerp-web @@ -2038,14 +2047,14 @@ msgstr "Demonstratiegegevens laden:" #: code:addons/web/static/src/js/dates.js:26 #, python-format msgid "'%s' is not a valid datetime" -msgstr "" +msgstr "'%s' is geen correcte datum/tijd" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1471 #, python-format msgid "Could not find a DOM Parser: %s" -msgstr "" +msgstr "Kon geen DOM Parser: %s vinden" #. module: web #. openerp-web @@ -2125,14 +2134,14 @@ msgstr "Download \"%s\"" #: code:addons/web/static/src/js/view_form.js:324 #, python-format msgid "New" -msgstr "" +msgstr "Nieuw" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list.js:1746 #, python-format msgid "Can't convert value %s to context" -msgstr "" +msgstr "Niet mogelijk om de waarde %s te converteren." #. module: web #. openerp-web @@ -2205,13 +2214,13 @@ msgstr "Over OpenERP" #: code:addons/web/static/src/js/formats.js:297 #, python-format msgid "'%s' is not a correct date, datetime nor time" -msgstr "" +msgstr "'%s' is is geen correcte datum, datum/tijd of tijd." #. module: web #: code:addons/web/controllers/main.py:1306 #, python-format msgid "No content found for field '%s' on '%s:%s'" -msgstr "" +msgstr "Geen inhoud gevonden voor veld '%s' bij '%s:%s'" #. module: web #. openerp-web @@ -2239,7 +2248,7 @@ msgstr "Beheer administraties" #: code:addons/web/static/src/js/pyeval.js:765 #, python-format msgid "Evaluation Error" -msgstr "" +msgstr "Evaluatie fout" #. module: web #. openerp-web @@ -2273,6 +2282,7 @@ msgstr "Nee" #, python-format msgid "'%s' is not convertible to date, datetime nor time" msgstr "" +"'%s' is niet converteerbaar naar een datum, een datum/tijd of een tijd" #. module: web #. openerp-web @@ -2347,7 +2357,7 @@ msgstr "Het veld is leeg. Er is niets om op te slaan!" #: code:addons/web/static/src/js/view_list.js:1327 #, python-format msgid "%s (%d)" -msgstr "" +msgstr "%s (%d)" #. module: web #. openerp-web @@ -2410,7 +2420,7 @@ msgstr "Weet u zeker dat u deze bijlage wilt verwijderen?" #: code:addons/web/static/src/js/views.js:838 #, python-format msgid "Technical Translation" -msgstr "" +msgstr "Technische vertaling" #. module: web #. openerp-web @@ -2424,14 +2434,14 @@ msgstr "Veld:" #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "The database %s has been dropped" -msgstr "" +msgstr "Database %s is verwijderd" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:456 #, python-format msgid "User's timezone" -msgstr "" +msgstr "Gebruikers tijdzone" #. module: web #. openerp-web @@ -2461,6 +2471,8 @@ msgstr "Special:" msgid "" "The old password you provided is incorrect, your password was not changed." msgstr "" +"Het oude wachtwoord wat u heft ingevoerd is niet correct. Uw wachtwoord is " +"niet gewijzigd." #. module: web #. openerp-web diff --git a/addons/web/i18n/pl.po b/addons/web/i18n/pl.po index 7015784bda8..5f5e26e60f7 100644 --- a/addons/web/i18n/pl.po +++ b/addons/web/i18n/pl.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-02-07 20:51+0000\n" -"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) \n" +"PO-Revision-Date: 2012-12-09 20:29+0000\n" +"Last-Translator: Rafał Perczyński \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-01 05:20+0000\n" -"X-Generator: Launchpad (build 16319)\n" +"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -29,14 +29,14 @@ msgstr "Domyślny język:" #: code:addons/web/static/src/js/coresetup.js:593 #, python-format msgid "%d minutes ago" -msgstr "" +msgstr "%d minut temu" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:621 #, python-format msgid "Still loading...
Please be patient." -msgstr "" +msgstr "Trwa ładowanie...
Bądź cierpliwy." #. module: web #. openerp-web @@ -59,7 +59,7 @@ msgstr "równe lub mniejsze niż" #: code:addons/web/static/src/js/chrome.js:393 #, python-format msgid "Please enter your previous password" -msgstr "" +msgstr "Wpisz twoje poprzednie hasło" #. module: web #. openerp-web @@ -68,21 +68,21 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:282 #, python-format msgid "Master password:" -msgstr "Hasło madrzędne:" +msgstr "Hasło nadrzędne" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:274 #, python-format msgid "Change Master Password" -msgstr "" +msgstr "Zmień Hasło Główne" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:491 #, python-format msgid "Do you really want to delete the database: %s ?" -msgstr "" +msgstr "Jesteś pewny że chcesz usunąć bazę danych: %s ?" #. module: web #. openerp-web @@ -96,14 +96,14 @@ msgstr "" #: code:addons/web/static/src/js/chrome.js:537 #, python-format msgid "Access Denied" -msgstr "" +msgstr "Odmowa dostępu" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:594 #, python-format msgid "about an hour ago" -msgstr "" +msgstr "około godziny temu" #. module: web #. openerp-web @@ -112,7 +112,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:216 #, python-format msgid "Backup Database" -msgstr "" +msgstr "Kopia zapasowa bazy danych" #. module: web #. openerp-web @@ -120,7 +120,7 @@ msgstr "" #: code:addons/web/static/src/js/dates.js:53 #, python-format msgid "'%s' is not a valid date" -msgstr "" +msgstr "'%s' nie jest poprawną datą" #. module: web #. openerp-web @@ -134,20 +134,20 @@ msgstr "Oto podgląd pliku, którego nie można zaimportować:" #: code:addons/web/static/src/js/coresetup.js:592 #, python-format msgid "about a minute ago" -msgstr "" +msgstr "około minuty temu" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1272 #, python-format msgid "File" -msgstr "" +msgstr "Plik" #. module: web #: code:addons/web/controllers/main.py:842 #, python-format msgid "You cannot leave any password empty." -msgstr "" +msgstr "hasło nie może być puste" #. module: web #. openerp-web @@ -235,7 +235,7 @@ msgstr "" #: code:addons/web/static/src/js/formats.js:282 #, python-format msgid "'%s' is not a correct time" -msgstr "" +msgstr "'%s' nie jest poprawnym czasem" #. module: web #. openerp-web @@ -270,21 +270,21 @@ msgstr "Niezdefiniowany" #: code:addons/web/static/src/js/view_form.js:4831 #, python-format msgid "File Upload" -msgstr "" +msgstr "Wyślij plik" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:598 #, python-format msgid "about a month ago" -msgstr "" +msgstr "około miesiąca temu" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1575 #, python-format msgid "Custom Filters" -msgstr "" +msgstr "Własne filtry" #. module: web #. openerp-web @@ -305,14 +305,14 @@ msgstr "" #: code:addons/web/static/src/js/search.js:1555 #, python-format msgid "Custom Filter" -msgstr "" +msgstr "Własny filtr" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:159 #, python-format msgid "Duplicate Database" -msgstr "" +msgstr "Duplikuj bazę danych" #. module: web #. openerp-web @@ -349,14 +349,14 @@ msgstr "Pobierz" #: code:addons/web/static/src/js/formats.js:266 #, python-format msgid "'%s' is not a correct datetime" -msgstr "" +msgstr "'%s' nie jest poprawną datą" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list.js:415 #, python-format msgid "Group" -msgstr "" +msgstr "Grupa" #. module: web #. openerp-web @@ -383,7 +383,7 @@ msgstr "" #: code:addons/web/controllers/main.py:863 #, python-format msgid "Languages" -msgstr "" +msgstr "Języki" #. module: web #. openerp-web @@ -411,7 +411,7 @@ msgstr "" #: code:addons/web/static/src/js/view_form.js:4811 #, python-format msgid "File upload" -msgstr "" +msgstr "Wysyłanie pliku" #. module: web #. openerp-web diff --git a/addons/web/i18n/pt.po b/addons/web/i18n/pt.po index 7fbfa8bb178..c9cdd12c09b 100644 --- a/addons/web/i18n/pt.po +++ b/addons/web/i18n/pt.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-12-04 12:09+0000\n" -"Last-Translator: Andrei Talpa (multibase.pt) \n" +"PO-Revision-Date: 2012-12-07 11:24+0000\n" +"Last-Translator: Virgílio Oliveira \n" "Language-Team: Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-05 05:42+0000\n" -"X-Generator: Launchpad (build 16335)\n" +"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -29,21 +29,21 @@ msgstr "Idioma predefinido:" #: code:addons/web/static/src/js/coresetup.js:593 #, python-format msgid "%d minutes ago" -msgstr "%d minutos atrás" +msgstr "há %d minutos" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:621 #, python-format msgid "Still loading...
Please be patient." -msgstr "A carregar...
Por favor aguarde." +msgstr "Carregando...
Por favor, aguarde." #. module: web #. openerp-web #: code:addons/web/static/src/js/search.js:1834 #, python-format msgid "%(field)s %(operator)s \"%(value)s\"" -msgstr "%(field)s %(operator)s \"%(value)s\"" +msgstr "" #. module: web #. openerp-web @@ -59,7 +59,7 @@ msgstr "menor ou igual a" #: code:addons/web/static/src/js/chrome.js:393 #, python-format msgid "Please enter your previous password" -msgstr "Por favor, introduza a sua Senha atual" +msgstr "Por favor, indique a sua senha atual" #. module: web #. openerp-web @@ -68,35 +68,35 @@ msgstr "Por favor, introduza a sua Senha atual" #: code:addons/web/static/src/xml/base.xml:282 #, python-format msgid "Master password:" -msgstr "Palavra chave de administração:" +msgstr "Senha de administração" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:274 #, python-format msgid "Change Master Password" -msgstr "Alterar a Senha Principal" +msgstr "Alterar a senha de administração" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:491 #, python-format msgid "Do you really want to delete the database: %s ?" -msgstr "Confirma que pretende remover a base de dados: %s?" +msgstr "Quer mesmo apagar a base de dados: %s?" #. module: web #. openerp-web #: code:addons/web/static/src/js/search.js:1400 #, python-format msgid "Search %(field)s at: %(value)s" -msgstr "Pesquisar %(field)s em: %(value)s" +msgstr "" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:537 #, python-format msgid "Access Denied" -msgstr "Acesso Negado" +msgstr "Acesso negado" #. module: web #. openerp-web @@ -112,7 +112,7 @@ msgstr "cerca de uma hora atrás" #: code:addons/web/static/src/xml/base.xml:216 #, python-format msgid "Backup Database" -msgstr "Salvaguarda da Base de Dados" +msgstr "Fazer cópia de segurança da base de dados" #. module: web #. openerp-web @@ -127,14 +127,14 @@ msgstr "%s não é uma data válida" #: code:addons/web/static/src/xml/base.xml:1812 #, python-format msgid "Here is a preview of the file we could not import:" -msgstr "Aqui está uma previsão do ficheiro que não conseguiu ser importado:" +msgstr "Aqui está uma antevisão do ficheiro que não pode ser importado:" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:592 #, python-format msgid "about a minute ago" -msgstr "" +msgstr "cerca de um minuto atrás" #. module: web #. openerp-web @@ -147,14 +147,14 @@ msgstr "Ficheiro" #: code:addons/web/controllers/main.py:842 #, python-format msgid "You cannot leave any password empty." -msgstr "" +msgstr "Não pode deixar qualquer senha em branco." #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:681 #, python-format msgid "Invalid username or password" -msgstr "Nome e palavra chave inválidos" +msgstr "Nome de utilizador ou senha inválidos" #. module: web #. openerp-web @@ -163,7 +163,7 @@ msgstr "Nome e palavra chave inválidos" #: code:addons/web/static/src/xml/base.xml:260 #, python-format msgid "Master Password:" -msgstr "Palavra Chave de Administração:" +msgstr "Senha de administração" #. module: web #. openerp-web @@ -178,7 +178,7 @@ msgstr "Selecionar" #: code:addons/web/static/src/js/chrome.js:549 #, python-format msgid "Database restored successfully" -msgstr "Base de dados restaurada com sucesso" +msgstr "" #. module: web #. openerp-web @@ -192,7 +192,7 @@ msgstr "Versão" #: code:addons/web/static/src/xml/base.xml:564 #, python-format msgid "Latest Modification Date:" -msgstr "Data da Ultima Modificação:" +msgstr "Data da modificação mais recente:" #. module: web #. openerp-web @@ -235,7 +235,7 @@ msgstr "(sem texto)" #: code:addons/web/static/src/js/formats.js:282 #, python-format msgid "'%s' is not a correct time" -msgstr "" +msgstr "'%s' não é uma hora correta" #. module: web #. openerp-web @@ -249,7 +249,7 @@ msgstr "não é um número válido" #: code:addons/web/static/src/xml/base.xml:325 #, python-format msgid "New Password:" -msgstr "Nova Palavra-chave:" +msgstr "Nova senha:" #. module: web #. openerp-web @@ -277,7 +277,7 @@ msgstr "Carregar ficheiro" #: code:addons/web/static/src/js/coresetup.js:598 #, python-format msgid "about a month ago" -msgstr "" +msgstr "cerca de um mês atrás" #. module: web #. openerp-web @@ -291,7 +291,7 @@ msgstr "Filtros personalizados" #: code:addons/web/static/src/xml/base.xml:1311 #, python-format msgid "Button Type:" -msgstr "Tipo de Botão:" +msgstr "Tipo de botão:" #. module: web #. openerp-web @@ -312,7 +312,7 @@ msgstr "Filtro personalizado" #: code:addons/web/static/src/xml/base.xml:159 #, python-format msgid "Duplicate Database" -msgstr "Duplicar a Base de Dados" +msgstr "Duplicar a base de dados" #. module: web #. openerp-web @@ -327,14 +327,15 @@ msgstr "Duplicar a Base de Dados" #: code:addons/web/static/src/xml/base.xml:336 #, python-format msgid "Change Password" -msgstr "Alterar Palavra-chave" +msgstr "Alterar senha" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:3382 #, python-format msgid "View type '%s' is not supported in One2Many." -msgstr "Tipo de vista '%s' n˜ao ´e suportador numa relaç˜ao 'Um para Muitos'" +msgstr "" +"Tipo de vista '%s' não suportado numa relação do tipo 'Um para Muitos'" #. module: web #. openerp-web @@ -349,7 +350,7 @@ msgstr "Transferir" #: code:addons/web/static/src/js/formats.js:266 #, python-format msgid "'%s' is not a correct datetime" -msgstr "" +msgstr "'%s' não é uma Data/Hora correta" #. module: web #. openerp-web @@ -383,14 +384,14 @@ msgstr "Os seguintes campos são inválidos:" #: code:addons/web/controllers/main.py:863 #, python-format msgid "Languages" -msgstr "Línguas" +msgstr "Idiomas" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1245 #, python-format msgid "...Upload in progress..." -msgstr "" +msgstr "...Transferência em progresso..." #. module: web #. openerp-web @@ -411,14 +412,14 @@ msgstr "Não foi possível recuperar a base de dados" #: code:addons/web/static/src/js/view_form.js:4811 #, python-format msgid "File upload" -msgstr "" +msgstr "Transferência de ficheiro" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:3775 #, python-format msgid "Action Button" -msgstr "" +msgstr "Botão de ação" #. module: web #. openerp-web @@ -441,6 +442,7 @@ msgstr "contém" #, python-format msgid "Take a minute to get a coffee,
because it's loading..." msgstr "" +"Aproveite para ir dar uma volta,
porque a operação pode demorar..." #. module: web #. openerp-web @@ -454,21 +456,21 @@ msgstr "Activar o modo de programador" #: code:addons/web/static/src/js/chrome.js:324 #, python-format msgid "Loading (%d)" -msgstr "A Atualizar (%d)" +msgstr "Carregando (%d)" #. module: web #. openerp-web #: code:addons/web/static/src/js/search.js:1116 #, python-format msgid "GroupBy" -msgstr "" +msgstr "Agrupar por" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list.js:684 #, python-format msgid "You must select at least one record." -msgstr "Tem de seleccionar pelo menos um registo." +msgstr "Tem de selecionar pelo menos um registo." #. module: web #. openerp-web @@ -482,7 +484,7 @@ msgstr "Ver Registo (perm_read)" #: code:addons/web/static/src/js/view_form.js:1059 #, python-format msgid "Set Default" -msgstr "Definir como Padrão" +msgstr "Definir como padrão" #. module: web #. openerp-web @@ -517,7 +519,7 @@ msgstr "Operador não suportado %s no domínio %s" #: code:addons/web/static/src/js/formats.js:242 #, python-format msgid "'%s' is not a correct float" -msgstr "" +msgstr "'%s' não é um número fracional correto" #. module: web #. openerp-web @@ -538,21 +540,21 @@ msgstr "%d-%d de %d" #: code:addons/web/static/src/js/view_form.js:2841 #, python-format msgid "Create and Edit..." -msgstr "Criar e Editar" +msgstr "Criar e editar" #. module: web #. openerp-web #: code:addons/web/static/src/js/pyeval.js:731 #, python-format msgid "Unknown nonliteral type " -msgstr "" +msgstr "Tipo não literal desconhecido " #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:2345 #, python-format msgid "Resource error" -msgstr "" +msgstr "Erro de recurso" #. module: web #. openerp-web @@ -566,7 +568,7 @@ msgstr "não é" #: code:addons/web/static/src/xml/base.xml:544 #, python-format msgid "Print Workflow" -msgstr "" +msgstr "Imprimir fluxo de trabalho" #. module: web #. openerp-web @@ -594,21 +596,21 @@ msgstr "Para mais informações visite" #: code:addons/web/static/src/xml/base.xml:1834 #, python-format msgid "Add All Info..." -msgstr "" +msgstr "Adicionar toda a informação..." #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1658 #, python-format msgid "Export Formats" -msgstr "Formatos de Exportação" +msgstr "Formatos de exportação" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:952 #, python-format msgid "On change:" -msgstr "Quando altera:" +msgstr "Aquando de uma alteração:" #. module: web #. openerp-web @@ -622,7 +624,7 @@ msgstr "Campos %s modelo" #: code:addons/web/static/src/js/view_list.js:890 #, python-format msgid "Setting 'id' attribute on existing record %s" -msgstr "" +msgstr "Atribuição do atributo 'id' no registo %s já existente" #. module: web #. openerp-web @@ -638,14 +640,14 @@ msgstr "Lista" #: code:addons/web/static/src/js/search.js:1942 #, python-format msgid "greater than" -msgstr "maior que" +msgstr "maior do que" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:540 #, python-format msgid "View" -msgstr "Visualizar" +msgstr "Vista" #. module: web #. openerp-web @@ -659,7 +661,7 @@ msgstr "Guardar filtro" #: code:addons/web/static/src/xml/base.xml:1319 #, python-format msgid "Action ID:" -msgstr "ID da Acção:" +msgstr "ID da ação:" #. module: web #. openerp-web @@ -667,27 +669,28 @@ msgstr "ID da Acção:" #, python-format msgid "Your user's preference timezone does not match your browser timezone:" msgstr "" +"O seu fuso horário não coincide com o que está definido no \"browser\":" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:1238 #, python-format msgid "Field '%s' specified in view could not be found." -msgstr "" +msgstr "Campo '%s' especificado na vista não foi encontrado." #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1731 #, python-format msgid "Saved exports:" -msgstr "Exportações Guardadas:" +msgstr "Exportações guardadas:" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:320 #, python-format msgid "Old Password:" -msgstr "Palavra-chave antiga" +msgstr "Senha antiga" #. module: web #. openerp-web @@ -715,7 +718,7 @@ msgstr "Aplicar" #: code:addons/web/static/src/xml/base.xml:1361 #, python-format msgid "Save & New" -msgstr "Guardar & Novo" +msgstr "Gravar & criar" #. module: web #. openerp-web @@ -723,21 +726,21 @@ msgstr "Guardar & Novo" #: code:addons/web/static/src/xml/base.xml:1200 #, python-format msgid "Save As" -msgstr "Guardar Como" +msgstr "Guardar como" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:2316 #, python-format msgid "E-mail error" -msgstr "" +msgstr "Erro de e-mail" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:596 #, python-format msgid "a day ago" -msgstr "há um dia atrás" +msgstr "há um dia" #. module: web #. openerp-web @@ -764,7 +767,7 @@ msgid "" msgstr "" "Atenção, o registo foi modificado, as suas alterações vão ser descartadas.\n" "\n" -"Tem a certeza que quer sair desta página?" +"Tem a certeza de que quer sair desta página?" #. module: web #. openerp-web @@ -792,7 +795,7 @@ msgstr "Delimitador:" #: code:addons/web/static/src/xml/base.xml:458 #, python-format msgid "Browser's timezone" -msgstr "" +msgstr "Fuso horário do \"browser\"" #. module: web #. openerp-web @@ -837,7 +840,7 @@ msgstr "OpenERP.com" #: code:addons/web/static/src/js/view_form.js:2316 #, python-format msgid "Can't send email to invalid e-mail address" -msgstr "" +msgstr "É impossível enviar uma mensagem para um endereço inválido" #. module: web #. openerp-web @@ -858,7 +861,7 @@ msgstr "Preferências" #: code:addons/web/static/src/js/view_form.js:434 #, python-format msgid "Wrong on change format: %s" -msgstr "" +msgstr "Erro na alteração de formato: %s" #. module: web #. openerp-web @@ -866,7 +869,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:185 #, python-format msgid "Drop Database" -msgstr "" +msgstr "Eliminar base de dados" #. module: web #. openerp-web @@ -887,7 +890,7 @@ msgstr "Modificadores:" #: code:addons/web/static/src/xml/base.xml:605 #, python-format msgid "Delete this attachment" -msgstr "" +msgstr "Apagar este anexo" #. module: web #. openerp-web @@ -919,21 +922,21 @@ msgstr "Nome de utilizador" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "Duplicating database" -msgstr "" +msgstr "Duplicando a base de dados" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Password has been changed successfully" -msgstr "" +msgstr "A senha foi alterada com êxito" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list_editable.js:781 #, python-format msgid "The form's data can not be discarded" -msgstr "" +msgstr "A informação no formulário não pode ser descartada" #. module: web #. openerp-web @@ -968,6 +971,10 @@ msgid "" "\n" "%s" msgstr "" +"Falha na avaliação local\n" +"%s\n" +"\n" +"%s" #. module: web #. openerp-web @@ -988,28 +995,28 @@ msgstr "Gravar lista de campos" #: code:addons/web/static/src/js/views.js:821 #, python-format msgid "View Log (%s)" -msgstr "Ver Registo (%s)" +msgstr "Ver registo (%s)" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:558 #, python-format msgid "Creation Date:" -msgstr "Data de Criação:" +msgstr "Data de criação:" #. module: web #: code:addons/web/controllers/main.py:806 #: code:addons/web/controllers/main.py:851 #, python-format msgid "Error, password not changed !" -msgstr "" +msgstr "Erro, a senha não foi alterada!" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:4810 #, python-format msgid "The selected file exceed the maximum file size of %s." -msgstr "" +msgstr "O ficheiro selecionado excede o tamanho máximo de %s." #. module: web #. openerp-web @@ -1058,14 +1065,14 @@ msgstr "Cópia de segurança" #: code:addons/web/static/src/js/dates.js:80 #, python-format msgid "'%s' is not a valid time" -msgstr "" +msgstr "'%s' não é uma hora válida" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:274 #, python-format msgid "'%s' is not a correct date" -msgstr "" +msgstr "'%s' não é uma data correta" #. module: web #. openerp-web @@ -1079,7 +1086,7 @@ msgstr "(sem rótulo)" #: code:addons/web/static/src/js/coresetup.js:597 #, python-format msgid "%d days ago" -msgstr "há %d dias atrás" +msgstr "há %d dias" #. module: web #. openerp-web @@ -1104,14 +1111,14 @@ msgstr "Cancelar" #: code:addons/web/static/src/xml/base.xml:9 #, python-format msgid "Loading..." -msgstr "A carregar ..." +msgstr "Carregando..." #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:561 #, python-format msgid "Latest Modification by:" -msgstr "Ultima Modificação por:" +msgstr "Modificação mais recente por:" #. module: web #. openerp-web @@ -1119,7 +1126,7 @@ msgstr "Ultima Modificação por:" #: code:addons/web/static/src/xml/base.xml:466 #, python-format msgid "Timezone mismatch" -msgstr "" +msgstr "Fuso horário inválido" #. module: web #. openerp-web @@ -1167,7 +1174,7 @@ msgstr "" #: code:addons/web/static/src/js/coresetup.js:599 #, python-format msgid "%d months ago" -msgstr "há %d meses atrás" +msgstr "há %d meses" #. module: web #. openerp-web @@ -1182,7 +1189,7 @@ msgstr "Apagar" #: code:addons/web/static/src/xml/base.xml:1440 #, python-format msgid "Add Advanced Filter" -msgstr "Adicionar Filtro Avançado" +msgstr "Adicionar filtro avançado" #. module: web #: code:addons/web/controllers/main.py:844 @@ -1196,14 +1203,14 @@ msgstr "A nova senha e a sua confirmação devem ser idênticas." #: code:addons/web/static/src/xml/base.xml:248 #, python-format msgid "Restore Database" -msgstr "Recuperar Base de Dados" +msgstr "Recuperar base de dados" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "Login" -msgstr "" +msgstr "Iniciar sessão" #. module: web #. openerp-web @@ -1225,14 +1232,14 @@ msgstr "Restaurar" #: code:addons/web/static/src/xml/base.xml:1652 #, python-format msgid "Export Type:" -msgstr "Tipo de Exportação:" +msgstr "Tipo de exportação:" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:406 #, python-format msgid "Log out" -msgstr "" +msgstr "Terminar sessão" #. module: web #. openerp-web @@ -1246,7 +1253,7 @@ msgstr "Agrupar por: %s" #: code:addons/web/static/src/js/view_form.js:151 #, python-format msgid "No data provided." -msgstr "" +msgstr "Ausência de dados" #. module: web #. openerp-web @@ -1261,7 +1268,7 @@ msgstr "Exportar" #: code:addons/web/static/src/js/data_export.js:12 #, python-format msgid "Export To File" -msgstr "Exportar para Ficheiro" +msgstr "Exportar para ficheiro" #. module: web #. openerp-web @@ -1275,7 +1282,7 @@ msgstr "Deve escolher pelo menos um registo." #: code:addons/web/static/src/js/coresetup.js:622 #, python-format msgid "Don't leave yet,
it's still loading..." -msgstr "" +msgstr "Não se vá embora já
porque ainda está carregando..." #. module: web #. openerp-web @@ -1289,14 +1296,14 @@ msgstr "Pesquisa inválida" #: code:addons/web/static/src/js/view_list.js:959 #, python-format msgid "Could not find id in dataset" -msgstr "" +msgstr "O ID não foi encontrado" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1682 #, python-format msgid "Remove All" -msgstr "Remover Tudo" +msgstr "Remover tudo" #. module: web #. openerp-web @@ -1317,7 +1324,7 @@ msgstr "%(page)d/%(page_count)d" #: code:addons/web/static/src/js/chrome.js:397 #, python-format msgid "The confirmation does not match the password" -msgstr "" +msgstr "A confirmação não coincide com a senha" #. module: web #. openerp-web @@ -1348,8 +1355,8 @@ msgid "" "For use if CSV files have titles on multiple lines, skips more than a single " "line during import" msgstr "" -"Para utilização se os ficheiros CSV tiverem títulos em múltiplas linhas, " -"ignora mais que uma única linha durante a importação" +"No caso de os ficheiros CSV terem títulos em várias linhas, ignora-se mais " +"do que uma única linha durante a importação" #. module: web #. openerp-web @@ -1384,14 +1391,14 @@ msgstr "(%d registos)" #: code:addons/web/static/src/xml/base.xml:948 #, python-format msgid "Change default:" -msgstr "Trocar padrão:" +msgstr "Mudar padrão:" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:171 #, python-format msgid "Original database name:" -msgstr "" +msgstr "Nome da base de dados original:" #. module: web #. openerp-web @@ -1408,7 +1415,7 @@ msgstr "é igual a" #: code:addons/web/static/src/js/views.js:1455 #, python-format msgid "Could not serialize XML" -msgstr "" +msgstr "Não foi possível serializar o XML" #. module: web #. openerp-web @@ -1422,14 +1429,14 @@ msgstr "Pesquisa avançada" #: code:addons/web/static/src/xml/base.xml:290 #, python-format msgid "Confirm new master password:" -msgstr "Confirme nova palavra chave de administração:" +msgstr "Confirme a nova senha de administração:" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:625 #, python-format msgid "Maybe you should consider reloading the application by pressing F5..." -msgstr "" +msgstr "Talvez deva pensar em recarregar a aplicação carregando em F5..." #. module: web #. openerp-web @@ -1454,7 +1461,7 @@ msgstr "não contém" #: code:addons/web/static/src/xml/base.xml:1760 #, python-format msgid "Import Options" -msgstr "Opções de Importação" +msgstr "Opções de importação" #. module: web #. openerp-web @@ -1468,7 +1475,7 @@ msgstr "Adicionar %s" #: code:addons/web/static/src/xml/base.xml:145 #, python-format msgid "Admin password:" -msgstr "Palavra chave de administração:" +msgstr "Senha de administração:" #. module: web #. openerp-web @@ -1512,14 +1519,14 @@ msgstr "Árvore" #: code:addons/web/controllers/main.py:766 #, python-format msgid "Could not drop database !" -msgstr "" +msgstr "Não foi possível eliminar a base de dados!" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:227 #, python-format msgid "'%s' is not a correct integer" -msgstr "" +msgstr "'%s' não é um número inteiro correto" #. module: web #. openerp-web @@ -1540,21 +1547,21 @@ msgstr "Campo desconhecido %s no domínio %s" #: code:addons/web/static/src/js/views.js:1421 #, python-format msgid "Node [%s] is not a JSONified XML node" -msgstr "" +msgstr "O nó [%s] não é do tipo JSONified XML" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1403 #, python-format msgid "Advanced Search..." -msgstr "Pesquisa Avançada..." +msgstr "Pesquisa avançada..." #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "Dropping database" -msgstr "A eliminar base de dados" +msgstr "Eliminando a base de dados" #. module: web #. openerp-web @@ -1577,7 +1584,7 @@ msgstr "Sim" #: code:addons/web/static/src/js/view_form.js:4831 #, python-format msgid "There was a problem while uploading your file" -msgstr "" +msgstr "Houve um problema ao carregar o seu ficheiro" #. module: web #. openerp-web @@ -1591,21 +1598,21 @@ msgstr "XML ID:" #: code:addons/web/static/src/xml/base.xml:932 #, python-format msgid "Size:" -msgstr "Dimensões:" +msgstr "Tamanho" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1799 #, python-format msgid "--- Don't Import ---" -msgstr "--- Não Importar ---" +msgstr "--- Não importar ---" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:1654 #, python-format msgid "Import-Compatible Export" -msgstr "" +msgstr "Exportação compatível com importação" #. module: web #. openerp-web @@ -1619,14 +1626,14 @@ msgstr "%d anos atrás" #: code:addons/web/static/src/js/view_list.js:1019 #, python-format msgid "Unknown m2m command %s" -msgstr "" +msgstr "Comando m2m %s desconhecio" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:1066 #, python-format msgid "Save default" -msgstr "Salvar Padrão" +msgstr "Guardar o padrão" #. module: web #. openerp-web @@ -1649,7 +1656,7 @@ msgstr "Por favor introduza a sua nova senha" #: code:addons/web/static/src/js/views.js:1463 #, python-format msgid "Could not parse string to xml" -msgstr "" +msgstr "Não foi possível passar o texto para XML" #. module: web #. openerp-web @@ -1684,14 +1691,15 @@ msgstr "Criar \"%s\"" #: code:addons/web/static/src/js/data_export.js:361 #, python-format msgid "Please select fields to save export list..." -msgstr "Por favor seleccione os campos para gravar lista de exportação..." +msgstr "" +"Por favor selecione campos para poder gravar a lista de exportação..." #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:418 #, python-format msgid "Copyright © 2004-TODAY OpenERP SA. All Rights Reserved." -msgstr "Copyright © 2004-HOJE OpenERP SA. Todos os Direitos Reservados." +msgstr "Copyright © 2004-HOJE OpenERP SA. Todos os direitos reservados." #. module: web #. openerp-web @@ -1720,7 +1728,7 @@ msgstr "A importação falhou devido a:" #: code:addons/web/static/src/xml/base.xml:533 #, python-format msgid "JS Tests" -msgstr "" +msgstr "Testes JS" #. module: web #. openerp-web @@ -1749,21 +1757,21 @@ msgstr "Criar: " #: code:addons/web/static/src/xml/base.xml:534 #, python-format msgid "View Fields" -msgstr "Ver Campos" +msgstr "Ver campos" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:330 #, python-format msgid "Confirm New Password:" -msgstr "" +msgstr "Confirmar a nova senha:" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list.js:573 #, python-format msgid "Do you really want to remove these records?" -msgstr "Você quer realmente remover estes registos?" +msgstr "Quer mesmo remover estes registos?" #. module: web #. openerp-web @@ -1785,7 +1793,7 @@ msgstr "é" #: code:addons/web/static/src/js/data_export.js:6 #, python-format msgid "Export Data" -msgstr "Exportar Dados" +msgstr "Exportar dados" #. module: web #. openerp-web @@ -1816,7 +1824,7 @@ msgstr "OpenERP" #: code:addons/web/static/src/xml/base.xml:225 #, python-format msgid "Database:" -msgstr "Base de Dados:" +msgstr "Base de dados:" #. module: web #. openerp-web @@ -1824,7 +1832,7 @@ msgstr "Base de Dados:" #: code:addons/web/static/src/xml/base.xml:1215 #, python-format msgid "Uploading ..." -msgstr "A enviar..." +msgstr "Carregando..." #. module: web #. openerp-web @@ -1845,7 +1853,7 @@ msgstr "Acerca" #: code:addons/web/static/src/xml/base.xml:1406 #, python-format msgid "Search Again" -msgstr "Pesquisar Novamente" +msgstr "Pesquisar novamente" #. module: web #. openerp-web @@ -1867,7 +1875,7 @@ msgstr "Limpar" #: code:addons/web/static/src/xml/base.xml:1655 #, python-format msgid "Export all Data" -msgstr "Exportar Todos os Dados" +msgstr "Exportar todos os dados" #. module: web #. openerp-web @@ -1883,7 +1891,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:531 #, python-format msgid "Set Defaults" -msgstr "Definir Valores Predefinidos" +msgstr "Definir valores padrão" #. module: web #. openerp-web @@ -1912,7 +1920,7 @@ msgstr "O registo não foi encontrado na base de dados." #: code:addons/web/static/src/xml/base.xml:1447 #, python-format msgid "Filter Name:" -msgstr "Nome do Filtro:" +msgstr "Nome do filtro:" #. module: web #. openerp-web @@ -1926,7 +1934,7 @@ msgstr "Tipo:" #: code:addons/web/static/src/js/chrome.js:538 #, python-format msgid "Incorrect super-administrator password" -msgstr "" +msgstr "Senha de super-administrador incorreta" #. module: web #. openerp-web @@ -1941,14 +1949,14 @@ msgstr "Objeto:" #: code:addons/web/static/src/js/chrome.js:326 #, python-format msgid "Loading" -msgstr "A carregar" +msgstr "Carregando" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:600 #, python-format msgid "about a year ago" -msgstr "" +msgstr "há cerca de um ano" #. module: web #. openerp-web @@ -1974,7 +1982,7 @@ msgstr "" #: code:addons/web/static/src/js/coresetup.js:595 #, python-format msgid "%d hours ago" -msgstr "%d horas atrás" +msgstr "há %d horas" #. module: web #. openerp-web @@ -1989,7 +1997,7 @@ msgstr "Adicionar: " #: code:addons/web/static/src/xml/base.xml:1833 #, python-format msgid "Quick Add" -msgstr "" +msgstr "Criação rápida" #. module: web #. openerp-web @@ -2017,7 +2025,7 @@ msgstr "OK" #: code:addons/web/static/src/js/views.js:1163 #, python-format msgid "Uploading..." -msgstr "A enviar..." +msgstr "Enviando..." #. module: web #. openerp-web @@ -2032,14 +2040,14 @@ msgstr "Carregar dados de demonstração" #: code:addons/web/static/src/js/dates.js:26 #, python-format msgid "'%s' is not a valid datetime" -msgstr "" +msgstr "'%s' não é uma data/hora correta" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1471 #, python-format msgid "Could not find a DOM Parser: %s" -msgstr "" +msgstr "Não foi encontrado o interpretador de DOM: %s" #. module: web #. openerp-web @@ -2055,7 +2063,7 @@ msgstr "Ficheiro:" #: code:addons/web/static/src/js/search.js:1943 #, python-format msgid "less than" -msgstr "menor que" +msgstr "menor do que" #. module: web #. openerp-web @@ -2070,7 +2078,7 @@ msgstr "Aviso" #: code:addons/web/static/src/xml/base.xml:541 #, python-format msgid "Edit SearchView" -msgstr "Editar Vista de Pesquisa" +msgstr "Editar vista de pesquisa" #. module: web #. openerp-web @@ -2091,7 +2099,7 @@ msgstr "Adicionar um item" #: code:addons/web/static/src/xml/base.xml:1578 #, python-format msgid "Save current filter" -msgstr "Guardar filtro actual" +msgstr "Guardar filtro atual" #. module: web #. openerp-web @@ -2112,7 +2120,7 @@ msgstr "Por favor introduza o nome da lista de campos a gravar..." #: code:addons/web/static/src/js/view_list.js:2185 #, python-format msgid "Download \"%s\"" -msgstr "Tranferindo \"%s\"" +msgstr "Tranferir \"%s\"" #. module: web #. openerp-web @@ -2134,14 +2142,14 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:535 #, python-format msgid "Fields View Get" -msgstr "Obter Vista dos Campos" +msgstr "Obter vista dos campos" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:149 #, python-format msgid "Confirm password:" -msgstr "Confirmar palavra-passe:" +msgstr "Confirmar senha:" #. module: web #. openerp-web @@ -2171,14 +2179,14 @@ msgstr "OpenERP é uma marca registada de" #: code:addons/web/static/src/js/data_export.js:374 #, python-format msgid "Please select fields to export..." -msgstr "Por favor seleccione os campos a exportar..." +msgstr "Por favor selecione os campos a exportar..." #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:286 #, python-format msgid "New master password:" -msgstr "Nova palavra chave de administração:" +msgstr "Nova senha de administração:" #. module: web #. openerp-web @@ -2192,7 +2200,7 @@ msgstr "é falso" #: code:addons/web/static/src/xml/base.xml:404 #, python-format msgid "About OpenERP" -msgstr "Sobre o OpenERP" +msgstr "Acerca do OpenERP" #. module: web #. openerp-web @@ -2200,6 +2208,8 @@ msgstr "Sobre o OpenERP" #, python-format msgid "'%s' is not a correct date, datetime nor time" msgstr "" +"'%s' não está correto como qualquer um dos seguintes formatos: Data, " +"Data/Hora, Hora" #. module: web #: code:addons/web/controllers/main.py:1306 @@ -2212,7 +2222,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:304 #, python-format msgid "Database Management" -msgstr "" +msgstr "Gestão da base de dados" #. module: web #. openerp-web @@ -2226,21 +2236,21 @@ msgstr "Imagem" #: code:addons/web/static/src/xml/base.xml:81 #, python-format msgid "Manage Databases" -msgstr "Gerir Bases de Dados" +msgstr "Gerir bases de dados" #. module: web #. openerp-web #: code:addons/web/static/src/js/pyeval.js:765 #, python-format msgid "Evaluation Error" -msgstr "" +msgstr "Erro de avaliação" #. module: web #. openerp-web #: code:addons/web/static/src/js/search.js:1285 #, python-format msgid "not a valid integer" -msgstr "não é um numero válido" +msgstr "não é um número inteiro válido" #. module: web #. openerp-web @@ -2266,7 +2276,7 @@ msgstr "Não" #: code:addons/web/static/src/js/formats.js:309 #, python-format msgid "'%s' is not convertible to date, datetime nor time" -msgstr "" +msgstr "'%s' não é convertível para data, data/hora ou hora" #. module: web #. openerp-web @@ -2306,7 +2316,7 @@ msgstr "Ainda a carregar..." #, python-format msgid "Incorrect value for field %(fieldname)s: [%(value)s] is %(message)s" msgstr "" -"Valor incorrecto para o campo %(fieldname)s: [%(value)s] é %(message)s" +"Valor incorreto para o campo %(fieldname)s: o [%(value)s] é %(message)s" #. module: web #. openerp-web @@ -2327,14 +2337,14 @@ msgstr "Registado" #: code:addons/web/static/src/xml/base.xml:1585 #, python-format msgid "Use by default" -msgstr "Usar por defeito" +msgstr "Usar como padrão" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:4846 #, python-format msgid "The field is empty, there's nothing to save !" -msgstr "O campo esta vazio, não há nada a gravar!" +msgstr "O campo esta vazio, não há nada para gravar!" #. module: web #. openerp-web @@ -2348,7 +2358,7 @@ msgstr "%s (%d)" #: code:addons/web/static/src/js/search.js:777 #, python-format msgid "triggered from search view" -msgstr "obtida através da vista de pesquisa" +msgstr "ativada pela vista de pesquisa" #. module: web #. openerp-web @@ -2362,14 +2372,14 @@ msgstr "Filtro" #: code:addons/web/static/src/xml/base.xml:928 #, python-format msgid "Widget:" -msgstr "Elemento:" +msgstr "" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:542 #, python-format msgid "Edit Action" -msgstr "Editar Ação" +msgstr "Editar ação" #. module: web #. openerp-web @@ -2390,21 +2400,21 @@ msgstr "Só você" #: code:addons/web/static/src/xml/base.xml:543 #, python-format msgid "Edit Workflow" -msgstr "Editar Fluxo de Trabalho" +msgstr "Editar fluxo de trabalho" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1172 #, python-format msgid "Do you really want to delete this attachment ?" -msgstr "" +msgstr "Quer mesmo apagar este anexo?" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:838 #, python-format msgid "Technical Translation" -msgstr "Tradução Técnica" +msgstr "Tradução técnica" #. module: web #. openerp-web @@ -2433,7 +2443,7 @@ msgstr "Fuso horário do utilizador" #: code:addons/web/static/src/js/chrome.js:1133 #, python-format msgid "Client Error" -msgstr "Erro do Cliente" +msgstr "Erro de cliente" #. module: web #. openerp-web @@ -2455,13 +2465,15 @@ msgstr "Especial:" msgid "" "The old password you provided is incorrect, your password was not changed." msgstr "" +"A senha atual indicada por si está incorreta. A sua senha não foi, portanto, " +"alterada." #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:555 #, python-format msgid "Creation User:" -msgstr "Utilizador de Criação:" +msgstr "Utilizador de criação:" #. module: web #. openerp-web @@ -2482,7 +2494,7 @@ msgstr "Guardar & Fechar" #: code:addons/web/static/src/js/view_form.js:2818 #, python-format msgid "Search More..." -msgstr "Pesquisar Mais..." +msgstr "Pesquisar mais..." #. module: web #. openerp-web @@ -2490,7 +2502,7 @@ msgstr "Pesquisar Mais..." #: code:addons/web/static/src/xml/base.xml:311 #, python-format msgid "Password" -msgstr "Palavra-chave" +msgstr "Senha" #. module: web #. openerp-web @@ -2534,7 +2546,7 @@ msgstr "Apagar este ficheiro" #: code:addons/web/static/src/xml/base.xml:109 #, python-format msgid "Create Database" -msgstr "Criar Base de dados" +msgstr "Criar base de dados" #. module: web #. openerp-web diff --git a/addons/web/i18n/pt_BR.po b/addons/web/i18n/pt_BR.po index d444a608ce5..f8935f2490f 100644 --- a/addons/web/i18n/pt_BR.po +++ b/addons/web/i18n/pt_BR.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-12-03 19:25+0000\n" -"Last-Translator: Cristiano Korndörfer \n" +"PO-Revision-Date: 2012-12-07 21:03+0000\n" +"Last-Translator: Luiz Fernando M.França (Sig Informática) \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-04 05:59+0000\n" -"X-Generator: Launchpad (build 16335)\n" +"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -860,7 +860,7 @@ msgstr "Preferências" #: code:addons/web/static/src/js/view_form.js:434 #, python-format msgid "Wrong on change format: %s" -msgstr "" +msgstr "Formato invalido para on change: %s" #. module: web #. openerp-web diff --git a/addons/web/i18n/ro.po b/addons/web/i18n/ro.po index 4875d1c117e..5c971ac3e04 100644 --- a/addons/web/i18n/ro.po +++ b/addons/web/i18n/ro.po @@ -8,28 +8,28 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-03-15 08:11+0000\n" -"Last-Translator: angelescu \n" +"PO-Revision-Date: 2012-12-09 17:26+0000\n" +"Last-Translator: Fekete Mihai \n" "Language-Team: Romanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-01 05:20+0000\n" -"X-Generator: Launchpad (build 16319)\n" +"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:133 #, python-format msgid "Default language:" -msgstr "Limba implicita:" +msgstr "Limba implicită:" #. module: web #. openerp-web #: code:addons/web/static/src/js/coresetup.js:593 #, python-format msgid "%d minutes ago" -msgstr "" +msgstr "acum %d minute" #. module: web #. openerp-web diff --git a/addons/web/i18n/ru.po b/addons/web/i18n/ru.po index 136e14a793f..8366699d7d9 100644 --- a/addons/web/i18n/ru.po +++ b/addons/web/i18n/ru.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openerp-web\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2012-11-30 18:13+0000\n" -"PO-Revision-Date: 2012-11-27 12:33+0000\n" -"Last-Translator: Chertykov Denis \n" +"PO-Revision-Date: 2012-12-05 11:06+0000\n" +"Last-Translator: Denis Karataev \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-12-01 05:20+0000\n" -"X-Generator: Launchpad (build 16319)\n" +"X-Launchpad-Export-Date: 2012-12-06 04:54+0000\n" +"X-Generator: Launchpad (build 16341)\n" #. module: web #. openerp-web @@ -59,7 +59,7 @@ msgstr "меньше или равен" #: code:addons/web/static/src/js/chrome.js:393 #, python-format msgid "Please enter your previous password" -msgstr "" +msgstr "Пожалуйста введите ваш предыдущий пароль" #. module: web #. openerp-web @@ -82,7 +82,7 @@ msgstr "Изменить главный пароль" #: code:addons/web/static/src/js/chrome.js:491 #, python-format msgid "Do you really want to delete the database: %s ?" -msgstr "" +msgstr "Вы действительно хотите удалить базу данных: %s?" #. module: web #. openerp-web @@ -96,7 +96,7 @@ msgstr "Искать %(field)s в: %(value)s" #: code:addons/web/static/src/js/chrome.js:537 #, python-format msgid "Access Denied" -msgstr "" +msgstr "Доступ запрещен" #. module: web #. openerp-web @@ -120,7 +120,7 @@ msgstr "Резервное копирование базы данных" #: code:addons/web/static/src/js/dates.js:53 #, python-format msgid "'%s' is not a valid date" -msgstr "" +msgstr "%s не является допустимой датой" #. module: web #. openerp-web @@ -147,7 +147,7 @@ msgstr "Файл" #: code:addons/web/controllers/main.py:842 #, python-format msgid "You cannot leave any password empty." -msgstr "" +msgstr "Вы не можете оставить пароль пустым." #. module: web #. openerp-web @@ -237,7 +237,7 @@ msgstr "(нет строки)" #: code:addons/web/static/src/js/formats.js:282 #, python-format msgid "'%s' is not a correct time" -msgstr "" +msgstr "'%s' не является корректным временем" #. module: web #. openerp-web @@ -336,7 +336,7 @@ msgstr "Изменить пароль" #: code:addons/web/static/src/js/view_form.js:3382 #, python-format msgid "View type '%s' is not supported in One2Many." -msgstr "" +msgstr "Тип вида '%s' не поддерживается в one2many" #. module: web #. openerp-web @@ -351,7 +351,7 @@ msgstr "Загрузить" #: code:addons/web/static/src/js/formats.js:266 #, python-format msgid "'%s' is not a correct datetime" -msgstr "" +msgstr "'%s' не является корректной датой и временем" #. module: web #. openerp-web @@ -379,13 +379,13 @@ msgstr "Выбор:" #: code:addons/web/static/src/js/view_form.js:869 #, python-format msgid "The following fields are invalid:" -msgstr "" +msgstr "Следующие поля заполнены неверны:" #. module: web #: code:addons/web/controllers/main.py:863 #, python-format msgid "Languages" -msgstr "" +msgstr "Языки" #. module: web #. openerp-web @@ -406,7 +406,7 @@ msgstr "Импорт" #: code:addons/web/static/src/js/chrome.js:543 #, python-format msgid "Could not restore the database" -msgstr "" +msgstr "Невозможно восстановить базу данных" #. module: web #. openerp-web @@ -520,7 +520,7 @@ msgstr "Неподдерживаемый оператор %s в домене %s" #: code:addons/web/static/src/js/formats.js:242 #, python-format msgid "'%s' is not a correct float" -msgstr "" +msgstr "'%s' не является корректным числом с плавающей точкой" #. module: web #. openerp-web @@ -576,7 +576,7 @@ msgstr "Печать рабочего процесса" #: code:addons/web/static/src/js/chrome.js:396 #, python-format msgid "Please confirm your new password" -msgstr "" +msgstr "Пожалуйста подтвердите ваш новый пароль" #. module: web #. openerp-web @@ -670,13 +670,15 @@ msgstr "ID действия:" #, python-format msgid "Your user's preference timezone does not match your browser timezone:" msgstr "" +"Часовой пояс в ваших настройках пользователя не совпадает с часовым поясом " +"вашего браузера:" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_form.js:1238 #, python-format msgid "Field '%s' specified in view could not be found." -msgstr "" +msgstr "Поле '%s' указанное в виде не может быть найдено." #. module: web #. openerp-web @@ -704,7 +706,7 @@ msgstr "Байты,Кб,Мб,Гб,Тб,Пб,Eb,Zb,Yb" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "The database has been duplicated." -msgstr "" +msgstr "База данных была скопирована." #. module: web #. openerp-web @@ -795,7 +797,7 @@ msgstr "Разделитель:" #: code:addons/web/static/src/xml/base.xml:458 #, python-format msgid "Browser's timezone" -msgstr "" +msgstr "Часовой пояс браузера" #. module: web #. openerp-web @@ -861,7 +863,7 @@ msgstr "Настройки" #: code:addons/web/static/src/js/view_form.js:434 #, python-format msgid "Wrong on change format: %s" -msgstr "" +msgstr "Неправильный или измененный формат: %s" #. module: web #. openerp-web @@ -876,7 +878,7 @@ msgstr "Удалить базу данных" #: code:addons/web/static/src/xml/base.xml:462 #, python-format msgid "Click here to change your user's timezone." -msgstr "" +msgstr "Нажмите здесь для изменения часового пояса вашего пользователя." #. module: web #. openerp-web @@ -922,21 +924,21 @@ msgstr "Имя пользователя" #: code:addons/web/static/src/js/chrome.js:481 #, python-format msgid "Duplicating database" -msgstr "" +msgstr "Копирование базы данных" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Password has been changed successfully" -msgstr "" +msgstr "Пароль был успешно изменен" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list_editable.js:781 #, python-format msgid "The form's data can not be discarded" -msgstr "" +msgstr "Информация формы не может быть отклонена" #. module: web #. openerp-web @@ -1005,7 +1007,7 @@ msgstr "Дата создания:" #: code:addons/web/controllers/main.py:851 #, python-format msgid "Error, password not changed !" -msgstr "" +msgstr "Ошибка, пароль не изменен!" #. module: web #. openerp-web @@ -1027,7 +1029,7 @@ msgstr "/web/binary/upload_attachment" #: code:addons/web/static/src/js/chrome.js:563 #, python-format msgid "Changed Password" -msgstr "" +msgstr "Измененный пароль" #. module: web #. openerp-web @@ -1061,14 +1063,14 @@ msgstr "Резервная копия" #: code:addons/web/static/src/js/dates.js:80 #, python-format msgid "'%s' is not a valid time" -msgstr "" +msgstr "'%s' не является допустимым временем" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:274 #, python-format msgid "'%s' is not a correct date" -msgstr "" +msgstr "'%s' не является корректной датой" #. module: web #. openerp-web @@ -1122,7 +1124,7 @@ msgstr "Изменялся:" #: code:addons/web/static/src/xml/base.xml:466 #, python-format msgid "Timezone mismatch" -msgstr "" +msgstr "Несовпадение часовых поясов" #. module: web #. openerp-web @@ -1190,7 +1192,7 @@ msgstr "Добавить расширенный фильтр" #: code:addons/web/controllers/main.py:844 #, python-format msgid "The new password and its confirmation must be identical." -msgstr "" +msgstr "Новый пароль и его подтверждение должны быть идентичны." #. module: web #. openerp-web @@ -1205,7 +1207,7 @@ msgstr "Восстановить базу данных" #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "Login" -msgstr "" +msgstr "Войти" #. module: web #. openerp-web @@ -1248,7 +1250,7 @@ msgstr "Группировать по: %s" #: code:addons/web/static/src/js/view_form.js:151 #, python-format msgid "No data provided." -msgstr "" +msgstr "Нет предоставленных данных." #. module: web #. openerp-web @@ -1319,7 +1321,7 @@ msgstr "%(page)d/%(page_count)d" #: code:addons/web/static/src/js/chrome.js:397 #, python-format msgid "The confirmation does not match the password" -msgstr "" +msgstr "Подтверждение должно совпадать с паролем" #. module: web #. openerp-web @@ -1372,7 +1374,7 @@ msgstr "1. Импорт из .CSV файла" #: code:addons/web/static/src/js/chrome.js:645 #, python-format msgid "No database selected !" -msgstr "" +msgstr "Не выбрана база данных!" #. module: web #. openerp-web @@ -1410,7 +1412,7 @@ msgstr "соответствует" #: code:addons/web/static/src/js/views.js:1455 #, python-format msgid "Could not serialize XML" -msgstr "" +msgstr "Невозможно сериализовать XML" #. module: web #. openerp-web @@ -1517,14 +1519,14 @@ msgstr "Дерево" #: code:addons/web/controllers/main.py:766 #, python-format msgid "Could not drop database !" -msgstr "" +msgstr "Невозможно удалить базу данных!" #. module: web #. openerp-web #: code:addons/web/static/src/js/formats.js:227 #, python-format msgid "'%s' is not a correct integer" -msgstr "" +msgstr "'%s' не является корректным целым числом" #. module: web #. openerp-web @@ -1559,7 +1561,7 @@ msgstr "Расширенный поиск..." #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "Dropping database" -msgstr "" +msgstr "Удаление базы данных" #. module: web #. openerp-web @@ -1624,7 +1626,7 @@ msgstr "%d лет назад" #: code:addons/web/static/src/js/view_list.js:1019 #, python-format msgid "Unknown m2m command %s" -msgstr "" +msgstr "Неизвестная m2m команда %s" #. module: web #. openerp-web @@ -1647,14 +1649,14 @@ msgstr "Название новой базы данных:" #: code:addons/web/static/src/js/chrome.js:394 #, python-format msgid "Please enter your new password" -msgstr "" +msgstr "Пожалуйста введите ваш новый пароль" #. module: web #. openerp-web #: code:addons/web/static/src/js/views.js:1463 #, python-format msgid "Could not parse string to xml" -msgstr "" +msgstr "Невозможно преобразовать строку в XML" #. module: web #. openerp-web @@ -1761,7 +1763,7 @@ msgstr "Просмотр полей" #: code:addons/web/static/src/xml/base.xml:330 #, python-format msgid "Confirm New Password:" -msgstr "" +msgstr "Подтвердите новый пароль:" #. module: web #. openerp-web @@ -1932,7 +1934,7 @@ msgstr "Тип:" #: code:addons/web/static/src/js/chrome.js:538 #, python-format msgid "Incorrect super-administrator password" -msgstr "" +msgstr "Неправильный пароль супер-администратора" #. module: web #. openerp-web @@ -1974,6 +1976,7 @@ msgid "" "The type of the field '%s' must be a many2many field with a relation to " "'ir.attachment' model." msgstr "" +"Тип поля '%s' должен быть many2many и иметь связь с моделью 'ir.attachment'." #. module: web #. openerp-web @@ -2038,7 +2041,7 @@ msgstr "Загрузить демонстрационные данные:" #: code:addons/web/static/src/js/dates.js:26 #, python-format msgid "'%s' is not a valid datetime" -msgstr "" +msgstr "'%s' не является допустимой датой и временем" #. module: web #. openerp-web @@ -2125,14 +2128,14 @@ msgstr "Загрузка \"%s\"" #: code:addons/web/static/src/js/view_form.js:324 #, python-format msgid "New" -msgstr "" +msgstr "Новый" #. module: web #. openerp-web #: code:addons/web/static/src/js/view_list.js:1746 #, python-format msgid "Can't convert value %s to context" -msgstr "" +msgstr "Невозможно конвертировать значение %s в контекст" #. module: web #. openerp-web @@ -2206,12 +2209,14 @@ msgstr "Об OpenERP" #, python-format msgid "'%s' is not a correct date, datetime nor time" msgstr "" +"'%s' не является ни корректной датой, ни временем, ни тем и другим вместе " +"взятым." #. module: web #: code:addons/web/controllers/main.py:1306 #, python-format msgid "No content found for field '%s' on '%s:%s'" -msgstr "" +msgstr "Не найдено содержимое для поля '%s' на '%s:%s'" #. module: web #. openerp-web @@ -2272,7 +2277,7 @@ msgstr "Нет" #: code:addons/web/static/src/js/formats.js:309 #, python-format msgid "'%s' is not convertible to date, datetime nor time" -msgstr "" +msgstr "'%s' не является конвертируемым в дату, время или дату и время" #. module: web #. openerp-web @@ -2410,7 +2415,7 @@ msgstr "Вы действительно хотите удалить это вл #: code:addons/web/static/src/js/views.js:838 #, python-format msgid "Technical Translation" -msgstr "" +msgstr "Технический перевод" #. module: web #. openerp-web @@ -2424,14 +2429,14 @@ msgstr "Поле:" #: code:addons/web/static/src/js/chrome.js:499 #, python-format msgid "The database %s has been dropped" -msgstr "" +msgstr "База данных %s была удалена" #. module: web #. openerp-web #: code:addons/web/static/src/xml/base.xml:456 #, python-format msgid "User's timezone" -msgstr "" +msgstr "Часовой пояс пользователя" #. module: web #. openerp-web @@ -2461,6 +2466,7 @@ msgstr "Специальное:" msgid "" "The old password you provided is incorrect, your password was not changed." msgstr "" +"Старый пароль который вы предоставили неверен, ваш пароль не был изменен." #. module: web #. openerp-web diff --git a/addons/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js b/addons/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js index 8ff02b23145..f0fa9c321d4 100644 --- a/addons/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js +++ b/addons/web/static/lib/jquery.ui/js/jquery-ui-1.9.1.custom.js @@ -8952,7 +8952,7 @@ $.extend( $.ui.dialog.overlay, { $( document ).bind( $.ui.dialog.overlay.events, function( event ) { // stop events if the z-index of the target is < the z-index of the overlay // we cannot return true when we don't want to cancel the event (#3523) - if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) { + if ( $(event.target).closest('.ui-dialog').zIndex() < $.ui.dialog.overlay.maxZ ) { return false; } }); diff --git a/addons/web/static/lib/qweb/qweb2.js b/addons/web/static/lib/qweb/qweb2.js index 5c076112eb0..0aa2aaba92f 100644 --- a/addons/web/static/lib/qweb/qweb2.js +++ b/addons/web/static/lib/qweb/qweb2.js @@ -228,6 +228,7 @@ QWeb2.Engine = (function() { } if (name) { this.templates[name] = node; + this.compiled_templates[name] = null; } else if (extend) { delete(this.compiled_templates[extend]); if (this.extend_templates[extend]) { diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index cc7b267c78c..5783afb987a 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1106,7 +1106,6 @@ instance.web.WebClient = instance.web.Client.extend({ start: function() { var self = this; return $.when(this._super()).then(function() { - self.$(".oe_logo").attr("href", $.param.fragment("" + window.location, "", 2).slice(0, -1)); if (jQuery.param !== undefined && jQuery.deparam(jQuery.param.querystring()).kitten !== undefined) { $("body").addClass("kitten-mode-activated"); if ($.blockUI) { diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 3917f342391..eea8bba726d 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -341,12 +341,10 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea if (this.headless) { this.ready.resolve(); } else { - var load_view = this.rpc("/web/view/load", { - model: this.model, + var load_view = instance.web.fields_view_get({ + model: this.dataset._model, view_id: this.view_id, view_type: 'search', - context: instance.web.pyeval.eval( - 'context', this.dataset.get_context()) }); $.when(load_view).then(function (r) { diff --git a/addons/web/static/src/js/testing.js b/addons/web/static/src/js/testing.js index 094270ec237..e7aad43ffc7 100644 --- a/addons/web/static/src/js/testing.js +++ b/addons/web/static/src/js/testing.js @@ -10,7 +10,7 @@ openerp.testing = {}; formats: ['coresetup', 'dates'], chrome: ['corelib', 'coresetup'], views: ['corelib', 'coresetup', 'data', 'chrome'], - search: ['data', 'coresetup', 'formats'], + search: ['views', 'formats'], list: ['views', 'data'], form: ['data', 'views', 'list', 'formats'], list_editable: ['list', 'form', 'data'], diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 21c3b3f43d9..6f7582ab2ad 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1189,36 +1189,19 @@ instance.web.form.FormRenderingEngine = instance.web.form.FormRenderingEngineInt }); } }, - view_arch_to_dom_node: function(arch) { - // Historic mess for views arch - // - // server: - // -> got xml as string - // -> parse to xml and manipulate domains and contexts - // -> convert to json - // client: - // -> got view as json - // -> convert back to xml as string - // -> parse it as xml doc (manipulate button@type for IE) - // -> convert back to string - // -> parse it as dom element with jquery - // -> for each widget, convert node to json - // - // Wow !!! - var xml = instance.web.json_node_to_xml(arch); - - var doc = $.parseXML('
' + xml + '
'); + get_arch_fragment: function() { + var doc = $.parseXML(instance.web.json_node_to_xml(this.fvg.arch)).documentElement; + // IE won't allow custom button@type and will revert it to spec default : 'submit' $('button', doc).each(function() { $(this).attr('data-button-type', $(this).attr('type')).attr('type', 'button'); }); - xml = instance.web.xml_to_str(doc); - return $(xml); + return $('
').append(instance.web.xml_to_str(doc)); }, render_to: function($target) { var self = this; this.$target = $target; - this.$form = this.view_arch_to_dom_node(this.fvg.arch); + this.$form = this.get_arch_fragment(); this.process_version(); @@ -2680,13 +2663,10 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan init: function(field_manager, node) { var self = this; this._super(field_manager, node); - this.values = _.clone(this.field.selection); - _.each(this.values, function(v, i) { - if (v[0] === false && v[1] === '') { - self.values.splice(i, 1); - } - }); - this.values.unshift([false, '']); + this.values = _(this.field.selection).chain() + .reject(function (v) { return v[0] === false && v[1] === ''; }) + .unshift([false, '']) + .value(); }, initialize_content: function() { // Flag indicating whether we're in an event chain containing a change diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 671b076451c..04ff8b48923 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -952,12 +952,18 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web. field = $target.closest('td').data('field'), $row = $target.closest('tr'), record_id = self.row_id($row); + + if ($target.attr('disabled')) { + return; + } + $target.attr('disabled', 'disabled'); // note: $.data converts data to number if it's composed only // of digits, nice when storing actual numbers, not nice when // storing strings composed only of digits. Force the action // name to be a string $(self).trigger('action', [field.toString(), record_id, function (id) { + $target.removeAttr('disabled'); return self.reload_record(self.records.get(id)); }]); }) diff --git a/addons/web/static/src/js/view_tree.js b/addons/web/static/src/js/view_tree.js index 4d08da385fd..acac93f1842 100644 --- a/addons/web/static/src/js/view_tree.js +++ b/addons/web/static/src/js/view_tree.js @@ -9,6 +9,7 @@ var QWeb = instance.web.qweb, instance.web.views.add('tree', 'instance.web.TreeView'); instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeView# */{ display_name: _lt('Tree'), + view_type: 'tree', /** * Indicates that this view is not searchable, and thus that no search * view should be displayed (if there is one active). @@ -36,18 +37,9 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie this.options = _.extend({}, this.defaults, options || {}); _.bindAll(this, 'color_for'); + this.on('view_loaded', this, this.load_tree); }, - start: function () { - return this.rpc("/web/treeview/load", { - model: this.model, - view_id: this.view_id, - view_type: "tree", - toolbar: this.view_manager ? !!this.view_manager.sidebar : false, - context: instance.web.pyeval.eval( - 'context', this.dataset.get_context()) - }).done(this.on_loaded); - }, /** * Returns the list of fields needed to correctly read objects. * @@ -64,7 +56,7 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie } return fields; }, - on_loaded: function (fields_view) { + load_tree: function (fields_view) { var self = this; var has_toolbar = !!fields_view.arch.attrs.toolbar; // field name in OpenERP is kinda stupid: this is the name of the field diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 939c98015bc..c0c6ae1f31d 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -758,12 +758,6 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ dataset.index = 0; } this.dataset = dataset; - - // setup storage for session-wise menu hiding - if (this.session.hidden_menutips) { - return; - } - this.session.hidden_menutips = {}; }, /** * Initializes the ViewManagerAction: sets up the searchview (if the @@ -1204,13 +1198,11 @@ instance.web.View = instance.web.Widget.extend({ } else { if (! this.view_type) console.warn("view_type is not defined", this); - view_loaded = this.rpc("/web/view/load", { - "model": this.dataset.model, + view_loaded = instance.web.fields_view_get({ + "model": this.dataset._model, "view_id": this.view_id, "view_type": this.view_type, - toolbar: !!this.options.$sidebar, - context: instance.web.pyeval.eval( - 'context', this.dataset.get_context(context)) + "toolbar": !!this.options.$sidebar, }); } return view_loaded.then(function(r) { @@ -1385,12 +1377,53 @@ instance.web.View = instance.web.Widget.extend({ } }); -instance.web.xml_to_json = function(node) { +/** + * Performs a fields_view_get and apply postprocessing. + * return a {$.Deferred} resolved with the fvg + * + * @param {Object} [args] + * @param {String|Object} args.model instance.web.Model instance or string repr of the model + * @param {null|Object} args.context context if args.model is a string + * @param {null|Number} args.view_id id of the view to be loaded, default view if null + * @param {null|String} args.view_type type of view to be loaded if view_id is null + * @param {Boolean} [args.toolbar=false] get the toolbar definition + */ +instance.web.fields_view_get = function(args) { + function postprocess(fvg) { + var doc = $.parseXML(fvg.arch).documentElement; + fvg.arch = instance.web.xml_to_json(doc, (doc.nodeName.toLowerCase() !== 'kanban')); + if ('id' in fvg.fields) { + // Special case for id's + var id_field = fvg.fields['id']; + id_field.original_type = id_field.type; + id_field.type = 'id'; + } + _.each(fvg.fields, function(field) { + _.each(field.views || {}, function(view) { + postprocess(view); + }); + }); + return fvg; + } + args = _.defaults(args, { + toolbar: false, + }); + var model = args.model; + if (typeof model === 'string') { + model = new instance.web.Model(args.model, args.context); + } + return args.model.call('fields_view_get', [args.view_id, args.view_type, model.context(), args.toolbar]).then(function(fvg) { + return postprocess(fvg); + }); +}; + +instance.web.xml_to_json = function(node, strip_whitespace) { switch (node.nodeType) { + case 9: + return instance.web.xml_to_json(node.documentElement, strip_whitespace); case 3: case 4: - return node.data; - break; + return (strip_whitespace && node.data.trim() === '') ? undefined : node.data; case 1: var attrs = $(node).getAttributes(); _.each(['domain', 'filter_domain', 'context', 'default_get'], function(key) { @@ -1403,7 +1436,9 @@ instance.web.xml_to_json = function(node) { return { tag: node.tagName.toLowerCase(), attrs: attrs, - children: _.map(node.childNodes, instance.web.xml_to_json) + children: _.compact(_.map(node.childNodes, function(node) { + return instance.web.xml_to_json(node, strip_whitespace); + })), } } } @@ -1455,26 +1490,6 @@ instance.web.xml_to_str = function(node) { throw new Error(_t("Could not serialize XML")); } }; -instance.web.str_to_xml = function(s) { - if (window.DOMParser) { - var dp = new DOMParser(); - var r = dp.parseFromString(s, "text/xml"); - if (r.body && r.body.firstChild && r.body.firstChild.nodeName == 'parsererror') { - throw new Error(_t("Could not parse string to xml")); - } - return r; - } - var xDoc; - try { - xDoc = new ActiveXObject("MSXML2.DOMDocument"); - } catch (e) { - throw new Error(_.str.sprintf( _t("Could not find a DOM Parser: %s"), e.message)); - } - xDoc.async = false; - xDoc.preserveWhiteSpace = true; - xDoc.loadXML(s); - return xDoc; -} /** * Registry for all the main views diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 65c96d05323..2161bc84f3d 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -436,7 +436,7 @@ - +