Vidhin Mehta (OpenERP)
2012-12-10 10:50:56 +05:30
75 changed files with 2251 additions and 818 deletions
+1
View File
@@ -1,4 +1,5 @@
import http
import controllers
import cli
wsgi_postload = http.wsgi_postload
+1
View File
@@ -0,0 +1 @@
import test_js
+35
View File
@@ -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:
-39
View File
@@ -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"
+4 -3
View File
@@ -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
+281
View File
@@ -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
<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 <client_action>` 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
<widget-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
<http://en.wikipedia.org/wiki/Web_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
<http://mustache.github.com/>`_ or `_.template
<http://underscorejs.org/#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
View File
+7
View File
@@ -0,0 +1,7 @@
# __openerp__.py
{
'name': "Web Example",
'description': "Basic example of a (future) web module",
'category': 'Hidden',
'depends': ['base'],
}
@@ -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'],
}
@@ -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'],
}
@@ -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'],
}
@@ -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'],
}
@@ -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'],
}
@@ -0,0 +1,6 @@
.openerp .oe_web_example {
color: white;
background-color: black;
height: 100%;
font-size: 400%;
}
@@ -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
+}
@@ -0,0 +1,2 @@
// static/src/js/first_module.js
console.log("Debug statement: file loaded");
@@ -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");
+};
@@ -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);
+ };
};
@@ -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();
+ }
+ });
};
@@ -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();
- }
});
};
@@ -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');
+ },
});
};
@@ -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();
+ }
});
};
@@ -0,0 +1,11 @@
<templates>
<div t-name="web_example.action" class="oe_web_example oe_web_example_stopped">
<h4 class="oe_web_example_timer">00:00:00</h4>
<p class="oe_web_example_start">
<button type="button">Start</button>
</p>
<p class="oe_web_example_stop">
<button type="button">Stop</button>
</p>
</div>
</templates>
+11
View File
@@ -0,0 +1,11 @@
<!-- web_example/web_example.xml -->
<openerp>
<data>
<record model="ir.actions.client" id="action_client_example">
<field name="name">Example Client Action</field>
<field name="tag">example.action</field>
</record>
<menuitem action="action_client_example"
id="menu_client_example"/>
</data>
</openerp>
+527 -60
View File
@@ -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
<http://en.wikipedia.org/wiki/Genshi_(templating_language)>`_,
`Thymeleaf <http://en.wikipedia.org/wiki/Thymeleaf>`_ or `Facelets
<http://en.wikipedia.org/wiki/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
<?xml version="1.0" encoding="UTF-8"?>
<templates>
<t t-name="Template1">
<div>...</div>
</t>
<t t-name="Template2">
<div>...</div>
</t>
<div t-name="example_template" t-attf-class="base #{cls}">
<h4 t-if="title"><t t-esc="title"/></h4>
<ul>
<li t-foreach="items" t-as="item" t-att-class="item_parity">
<t t-call="example_template.sub">
<t t-set="arg" t-value="item_value"/>
</t>
</li>
</ul>
</div>
<t t-name="example_template.sub">
<t t-esc="arg.name"/>
<dl>
<t t-foreach="arg.tags" t-as="tag" t-if="tag_index lt 5">
<dt><t t-esc="tag"/></dt>
<dd><t t-esc="tag_value"/></dd>
</t>
</dl>
</t>
</templates>
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"
}
}
]
}
<t t-name="UserPage">
<div>
<p>Name: <t t-esc="widget.user_name"/></p>
<p>Password: <input type="text" t-att-value="widget.password"/></p>
<p t-if="widget.is_admin">This user is an Administrator</p>
<t t-foreach="widget.roles" t-as="role">
<p>User has role: <t t-esc="role"/></p>
</t>
</div>
</t>
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:
::
<div>
<p>Name: Xavier</p>
<p>Password: <input type="text" value="lilo"/></p>
<p>This user is an Administrator</p
<p>User has role: Web Developer</p>
<p>User has role: IE Hater</p>
<p>User has role: Steve Jobs Worshiper</p>
<div class="base foo">
<h4>Random Title</h4>
<ul>
<li class="even">
foo
<dl>
<dt>bar</dt>
<dd>baz</dd>
<dt>qux</dt>
<dd>quux</dd>
</dl>
</li>
<li class="odd">
Lorem
<dl>
<dt>ipsum</dt>
<dd>dolor</dd>
<dt>sit</dt>
<dd>amet</dd>
<dt>consectetur</dt>
<dd>adipiscing</dd>
<dt>elit</dt>
<dd>Sed</dd>
<dt>hendrerit</dt>
<dd>ullamcorper</dd>
</dl>
</li>
</ul>
</div>
A QWeb template should always contain one unique root element to be used effectively with the Widget class, here it is a *<div>*. QWeb only react to *<t>* elements or attributes prefixed by *t-*. The *<t>* 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 <qweb-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
<qweb-directives-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
<t>Something something</t>
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('<templates>\
<t t-name="test1"><t>Test 1</t></t>\
<t t-name="test2"><span>Test 2</span></t>\
</templates>');
e.render('test1'); // Test 1
e.render('test2'); // <span>Test 2</span>
.. 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 ``<templates>`` for simplicity.
.. code-block:: xml
<templates>
<t t-name="template1">
<!-- template code -->
</t>
</templates>
:ref:`t-name <qweb-directive-name>` can be used on an element with
an output as well:
.. code-block:: xml
<templates>
<div t-name="template2">
<!-- template code -->
</div>
</templates>
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 <qweb-directive-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 <qweb-directive-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-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
<span t-att="{foo: 3, bar: 42}"/>
will yield
.. code-block:: html
<span foo="3" bar="42"/>
.. 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-* <qweb-directive-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 <qweb-directive-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
<http://zvon.org/xxl/XSLTreference/OutputOverview/xslt_with-param_frame.html>`_.
.. _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 <qweb-directive-name>` will create a new template
using the old one as a base.
``BODY`` should be a sequence of :ref:`t-jquery
<qweb-directive-jquery>` alteration directives.
.. note::
The inheritance in the second form is *static*: the parent
template is copied and transformed when :ref:`t-extend
<qweb-directive-extend>` is called. If it is altered later (by
a :ref:`t-extend <qweb-directive-extend>` without a
:ref:`t-name <qweb-directive-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)
<http://api.jquery.com/replaceWith/>`_, ``inner`` maps to
`html(htmlString) <http://api.jquery.com/html/>`_.
* 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``.
+2
View File
@@ -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
--------
+14 -13
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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) <santiago@pexego.es>\n"
"PO-Revision-Date: 2012-12-07 19:11+0000\n"
"Last-Translator: Eduardo Alberto Calvo <Unknown>\n"
"Language-Team: Spanish <es@li.org>\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
+23 -23
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <fshahy@gmail.com>\n"
"Language-Team: Persian <fa@li.org>\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...<br />Please be patient."
msgstr ""
msgstr "در حال بارگذاری...</ br> لطفا صبر کنید."
#. 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
+84 -76
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <gkliska@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\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
+71 -59
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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) <Unknown>\n"
"Language-Team: Dutch <nl@li.org>\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
+27 -27
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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) <grzegorz@openglobe.pl>\n"
"PO-Revision-Date: 2012-12-09 20:29+0000\n"
"Last-Translator: Rafał Perczyński <rafal@pery.com.pl>\n"
"Language-Team: Polish <pl@li.org>\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...<br />Please be patient."
msgstr ""
msgstr "Trwa ładowanie...<br />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
+169 -157
View File
File diff suppressed because it is too large Load Diff
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <codigo.aberto@dorfer.com.br>\n"
"PO-Revision-Date: 2012-12-07 21:03+0000\n"
"Last-Translator: Luiz Fernando M.França (Sig Informática) <Unknown>\n"
"Language-Team: Brazilian Portuguese <pt_BR@li.org>\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
+6 -6
View File
@@ -8,28 +8,28 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-03-15 08:11+0000\n"
"Last-Translator: angelescu <Unknown>\n"
"PO-Revision-Date: 2012-12-09 17:26+0000\n"
"Last-Translator: Fekete Mihai <mihai@erpsystems.ro>\n"
"Language-Team: Romanian <ro@li.org>\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
+58 -52
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\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 <chertykov@gmail.com>\n"
"PO-Revision-Date: 2012-12-05 11:06+0000\n"
"Last-Translator: Denis Karataev <dskarataev@gmail.com>\n"
"Language-Team: Russian <ru@li.org>\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
@@ -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;
}
});
+1
View File
@@ -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]) {
-1
View File
@@ -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) {
+2 -4
View File
@@ -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) {
+1 -1
View File
@@ -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'],
+9 -29
View File
@@ -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('<div class="oe_form">' + xml + '</div>');
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 $('<div class="oe_form"/>').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
+6
View File
@@ -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));
}]);
})
+3 -11
View File
@@ -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
+50 -35
View File
@@ -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
+5 -2
View File
@@ -436,7 +436,7 @@
</tr>
<tr>
<td class="oe_leftbar" valign="top">
<a class="oe_logo" href="#"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
<a class="oe_logo" t-attf-href="/?ts=#{Date.now()}"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
<div class="oe_secondary_menus_container"/>
<div class="oe_footer">
Powered by <a href="http://www.openerp.com" target="_blank"><span>OpenERP</span></a>
@@ -1054,7 +1054,10 @@
t-att-autofocus="widget.node.attrs.autofocus"
t-att-id="widget.id_for_label">
<t t-foreach="widget.values" t-as="option">
<option><t t-esc="widget.node.attrs.placeholder" t-if="option[0] == false and widget.node.attrs.placeholder"/><t t-esc="option[1]" t-if="option[0] != false"/></option>
<option>
<t t-esc="widget.node.attrs.placeholder" t-if="option[0] === false and widget.node.attrs.placeholder"/>
<t t-esc="option[1]" t-if="option[0] !== false"/>
</option>
</t>
</select>
</span>
+6 -28
View File
@@ -183,7 +183,7 @@ openerp.testing.section('list.edition', {
}
return [];
});
mock('/web/view/load', function () {
mock('demo:fields_view_get', function () {
return {
type: 'tree',
fields: {
@@ -191,15 +191,7 @@ openerp.testing.section('list.edition', {
b: {type: 'char', string: "B"},
c: {type: 'char', string: "C"}
},
arch: {
tag: 'tree',
attrs: {},
children: [
{tag: 'field', attrs: {name: 'a'}},
{tag: 'field', attrs: {name: 'b'}},
{tag: 'field', attrs: {name: 'c'}}
]
}
arch: '<tree><field name="a"/><field name="b"/><field name="c"/></tree>',
};
});
}
@@ -247,7 +239,7 @@ openerp.testing.section('list.edition.events', {
mock('demo:read', function () {
return [{ id: 1, a: 'foo', b: 'bar', c: 'baz' }];
});
mock('/web/view/load', function () {
mock('demo:fields_view_get', function () {
return {
type: 'tree',
fields: {
@@ -255,15 +247,7 @@ openerp.testing.section('list.edition.events', {
b: {type: 'char', string: "B"},
c: {type: 'char', string: "C"}
},
arch: {
tag: 'tree',
attrs: {},
children: [
{tag: 'field', attrs: {name: 'a'}},
{tag: 'field', attrs: {name: 'b'}},
{tag: 'field', attrs: {name: 'c'}}
]
}
arch: '<tree><field name="a"/><field name="b"/><field name="c"/></tree>',
};
});
}
@@ -320,19 +304,13 @@ openerp.testing.section('list.edition.onwrite', {
templates: true,
}, function (test) {
test('record-to-read', {asserts: 4}, function (instance, $fix, mock) {
mock('/web/view/load', function () {
mock('demo:fields_view_get', function () {
return {
type: 'tree',
fields: {
a: {type: 'char', string: "A"}
},
arch: {
tag: 'tree',
attrs: { on_write: 'on_write', colors: 'red:a == "foo"' },
children: [
{tag: 'field', attrs: {name: 'a'}}
]
}
arch: '<tree on_write="on_write" colors="red:a == \'foo\'"><field name="a"/></tree>',
};
});
mock('demo:read', function (args, kwargs) {
+2 -9
View File
@@ -4,20 +4,13 @@ openerp.testing.section('list.buttons', {
templates: true
}, function (test) {
test('record-deletion', {asserts: 2}, function (instance, $fix, mock) {
mock('/web/view/load', function () {
mock('demo:fields_view_get', function () {
return {
type: 'tree',
fields: {
a: {type: 'char', string: "A"}
},
arch: {
tag: 'tree',
attrs: { },
children: [
{tag: 'field', attrs: {name: 'a'}},
{tag: 'button', attrs: {type: 'object', name: 'foo'}}
]
}
arch: '<tree><field name="a"/><button type="object" name="foo"/></tree>',
};
});
mock('demo:read', function (args, kwargs) {
+10 -36
View File
@@ -152,25 +152,14 @@ var makeSearchView = function (instance, dummy_widget_attributes, defaults) {
instance.dummy = {};
instance.dummy.DummyWidget = instance.web.search.Field.extend(
dummy_widget_attributes || {});
if (!('/web/view/load' in instance.session.responses)) {
instance.session.responses['/web/view/load'] = function () {
if (!('dummy.model:fields_view_get' in instance.session.responses)) {
instance.session.responses['dummy.model:fields_view_get'] = function () {
return {
type: 'search',
fields: {
dummy: {type: 'char', string: "Dummy"}
},
arch: {
tag: 'search',
attrs: {},
children: [{
tag: 'field',
attrs: {
name: 'dummy',
widget: 'dummy'
},
children: []
}]
}
arch: '<search><field name="dummy" widget="dummy"/></search>'
};
};
}
@@ -183,7 +172,7 @@ var makeSearchView = function (instance, dummy_widget_attributes, defaults) {
};
};
var dataset = {model: 'dummy.model', get_context: function () { return {}; }};
var dataset = new instance.web.DataSet(null, 'dummy.model');
var view = new instance.web.SearchView(null, dataset, false, defaults);
var self = this;
view.on('invalid_search', self, function () {
@@ -926,31 +915,16 @@ openerp.testing.section('filters', {
rpc: 'mock',
templates: true,
setup: function (instance, $s, mock) {
mock('/web/view/load', function () {
mock('dummy.model:fields_view_get', function () {
// view with a single group of filters
return {
type: 'search',
fields: {},
arch: {
tag: 'search',
attrs: {},
children: [{
tag: 'filter',
attrs: { string: "Foo1", domain: [ ['foo', '=', '1'] ] },
children: []
}, {
tag: 'filter',
attrs: {
name: 'foo2',
string: "Foo2",
domain: [ ['foo', '=', '2'] ] },
children: []
}, {
tag: 'filter',
attrs: { string: "Foo3", domain: [ ['foo', '=', '3'] ] },
children: []
}]
}
arch: '<search>' +
'<filter string="Foo1" domain="[ [\'foo\', \'=\', \'1\'] ]"/>' +
'<filter name="foo2" string="Foo2" domain="[ [\'foo\', \'=\', \'2\'] ]"/>' +
'<filter string="Foo3" domain="[ [\'foo\', \'=\', \'3\'] ]"/>' +
'</search>',
};
});
}
+116
View File
@@ -0,0 +1,116 @@
QUnitSuite is a ``unittest.TestSuite`` able to run QUnit_ test suites
within the normal unittest process, through PhantomJS_.
QUnitSuite is built upon `Ben Alman`_'s work of for the interfacing
between PhantomJS_ and the host/reporting code: the shims and the
PhantomJS_ configuration files are those of grunt_'s ``qunit`` task.
Why
---
You're a Python shop or developer, you have tools and tests built
around unittest (or compatible with unittests) and your testing
pipeline is predicated upon that, you're doing web development of some
sort these days (as so many are) and you'd like to do some testing of
your web stuff.
But you don't really want to redo your whole testing stack just for
that.
QUnitSuite simply grafts QUnit_-based tests, run in PhantomJS_, in
your existing ``unittest``-based architecture.
What
----
QUnitSuite currently provides a single object as part of its API:
``qunitsuite.QUnitSuite(testfile[, timeout])``.
This produces a ``unittest.TestSuite`` suitable for all the usual
stuff (running it, and giving it to an other test suite which will run
it, that is).
``testfile`` is the HTML file bootstrapping your qunit tests, as would
usually be accessed via a browser. It can be either a local
(``file:``) url, or an HTTP one. As long as a regular browser can open
and execute it, PhantomJS_ will manage.
``timeout`` is a check passed to the PhantomJS_ runner: if the runner
produces no information for longer than ``timeout`` milliseconds, the
run will be cancelled and a test error will be generated. This
situation usually means either your ``testfile`` is not a qunit test
file, qunit is not running or qunit's runner was stopped (for an async
test) and never restarted.
The default value is very conservative, most tests should run
correctly with lower timeouts (especially if all tests are
synchronous).
How
---
``unittest``'s autodiscovery protocol does not directly work with test
suites (it looks for test cases). If you want autodiscovery to work
correctly, you will have to use the ``load_tests`` protocol::
# in a testing module
def load_tests(loader, tests, pattern):
tests.addTest(QUnitSuite(qunit_test_path.html))
return tests
outside of that specific case, you can use a ``QUnitSuite`` as a
standard ``TestSuite`` instance, running it, adding it to an other
suite or passing it to a ``TestRunner``
Complaints and Grievances
-------------------------
Speed
~~~~~
Starting up a phantomjs instance and running a suite turns out to have
a rather high overhead, on the order of a second on this machine
(2.4GHz, 8GB RAM and an SSD).
As each ``QUnitSuite`` currently creates its own phantomjs instance,
it's probably a good idea to create bigger suites (put many modules &
tests in the same QUnit html file, which doesn't preclude splitting
them across multiple js files).
Hacks
~~~~~
QUnitSuite contains a pretty big hack which may or may not cause
problem depending on your exact setup: in case of case failure or
error, ``unittest.TestResult`` formats the error traceback provided
alongside the test object. This goes through Python's
traceback-formatting code and there are no hooks there.
One could expect to use a custom ``TestResult``, but for test suites
the ``TestResult`` instance must be provided by the caller, so there
is no direct hook onto it.
This leaves three options:
* Create a custom ``TestResult`` class and require that it be the one
provided to the test suite. This requires altered work flows,
customization of the test runner and (as far as I know) isn't
available through Python 2.7's autodiscovery. It's the cleanest
option but completely fails on practicality.
* Create a custom ``TestResult`` which directly alters the original
result's ``errors`` and ``failures`` attributes as they're part of
the testrunner API. This would work but may put custom results in a
strange state and break e.g. unittest2's ``@failfast``.
* Lastly, monkeypatch the undocumented and implementation detail
``_exc_info_to_string`` on the provided ``result``. This is the
route taken, at least for now.
.. _QUnit: http://qunitjs.com/
.. _PhantomJS: http://phantomjs.org/
.. _Ben Alman: http://benalman.com/
.. _grunt: http://gruntjs.com/
+95
View File
@@ -0,0 +1,95 @@
/*
* grunt
* http://gruntjs.com/
*
* Copyright (c) 2012 "Cowboy" Ben Alman
* Licensed under the MIT license.
* http://benalman.com/about/license/
*/
/*global phantom:true*/
'use strict';
var fs = require('fs');
// The page .html file to load.
var url = phantom.args[0];
// Extra, optionally overridable stuff.
var options = JSON.parse(phantom.args[1] || {});
// Default options.
if (!options.timeout) { options.timeout = 5000; }
// Keep track of the last time a client message was sent.
var last = new Date();
// Messages are sent to the parent by appending them to the tempfile.
var sendMessage = function(arg) {
var args = Array.isArray(arg) ? arg : [].slice.call(arguments);
last = new Date();
console.log(JSON.stringify(args));
};
// This allows grunt to abort if the PhantomJS version isn't adequate.
sendMessage('private', 'version', phantom.version);
// Abort if the page doesn't send any messages for a while.
setInterval(function() {
if (new Date() - last > options.timeout) {
sendMessage('fail.timeout');
phantom.exit();
}
}, 100);
// Create a new page.
var page = require('webpage').create();
// The client page must send its messages via alert(jsonstring).
page.onAlert = function(args) {
sendMessage(JSON.parse(args));
};
// Keep track if the client-side helper script already has been injected.
var injected;
page.onUrlChanged = function(newUrl) {
injected = false;
sendMessage('onUrlChanged', newUrl);
};
// Relay console logging messages.
page.onConsoleMessage = function(message) {
sendMessage('console', message);
};
// For debugging.
page.onResourceRequested = function(request) {
sendMessage('onResourceRequested', request.url);
};
page.onResourceReceived = function(request) {
if (request.stage === 'end') {
sendMessage('onResourceReceived', request.url);
}
};
// Run when the page has finished loading.
page.onLoadFinished = function(status) {
// The window has loaded.
sendMessage('onLoadFinished', status);
if (status === 'success') {
if (options.inject && !injected) {
// Inject client-side helper script, but only if it has not yet been
// injected.
sendMessage('inject', options.inject);
page.injectJs(options.inject);
}
} else {
// File loading failure.
sendMessage('fail.load', url);
phantom.exit();
}
};
// Actually load url.
page.open(url);
+22
View File
@@ -0,0 +1,22 @@
Copyright (c) 2012 "Cowboy" Ben Alman
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1 @@
{}
@@ -0,0 +1,88 @@
/*
* grunt
* http://gruntjs.com/
*
* Copyright (c) 2012 "Cowboy" Ben Alman
* Licensed under the MIT license.
* http://benalman.com/about/license/
*/
/*global QUnit:true, alert:true*/
'use strict';
// Don't re-order tests.
QUnit.config.reorder = false;
// Run tests serially, not in parallel.
QUnit.config.autorun = false;
// Send messages to the parent PhantomJS process via alert! Good times!!
function sendMessage() {
var args = [].slice.call(arguments);
alert(JSON.stringify(args));
}
// These methods connect QUnit to PhantomJS.
QUnit.log(function(obj) {
// What is this I don’t even
if (obj.message === '[object Object], undefined:undefined') { return; }
// Parse some stuff before sending it.
var actual = QUnit.jsDump.parse(obj.actual);
var expected = QUnit.jsDump.parse(obj.expected);
// Send it.
sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source);
});
QUnit.testStart(function(obj) {
sendMessage('qunit.testStart', obj.name);
});
QUnit.testDone(function(obj) {
sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total);
});
QUnit.moduleStart(function(obj) {
sendMessage('qunit.moduleStart', obj.name);
});
QUnit.moduleDone(function(obj) {
sendMessage('qunit.moduleDone', obj.name, obj.failed, obj.passed, obj.total);
});
QUnit.begin(function() {
sendMessage('qunit.begin');
});
QUnit.done(function(obj) {
sendMessage('qunit.done', obj.failed, obj.passed, obj.total, obj.runtime);
});
// PhantomJS (up to and including 1.7) uses a version of webkit so old
// it does not have Function.prototype.bind:
// http://code.google.com/p/phantomjs/issues/detail?id=522
// Use moz polyfill:
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind#Compatibility
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function () {},
fBound = function () {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
+131
View File
@@ -0,0 +1,131 @@
import json
import subprocess
import unittest
import os
import time
ROOT = os.path.join(os.path.dirname(__file__), 'grunt')
__all__ = ['QUnitSuite']
def _exc_info_to_string(err, test):
return err
class QUnitTest(unittest.TestCase):
def __init__(self, module, name):
self.module = module
self.name = name
self.failed = False
def shortDescription(self):
return None
def __repr__(self):
return '<QUnitTest %s:%s>' % (self.module, self.name)
def __str__(self):
return '%s: %s' % (self.module, self.name)
class QUnitSuite(unittest.TestSuite):
def __init__(self, qunitfile, timeout=5000):
self.testfile = qunitfile
self.timeout = timeout
self._module = None
self._test = None
def __iter__(self):
return iter([self])
def run(self, result):
try:
subprocess.call(['phantomjs', '-v'],
stdout=open(os.devnull, 'w'),
stderr=subprocess.STDOUT)
except OSError:
test = QUnitTest('phantomjs', 'javascript tests')
result.startTest(test)
result.startTest(test)
result.addSkip(test , "phantomjs command not found")
result.stopTest(test)
return
result._exc_info_to_string = _exc_info_to_string
try:
self._run(result)
finally:
del result._exc_info_to_string
def _run(self, result):
phantom = subprocess.Popen([
'phantomjs',
'--config=%s' % os.path.join(ROOT, 'phantomjs.json'),
os.path.join(ROOT, 'bootstrap.js'), self.testfile,
json.dumps({
'timeout': self.timeout,
'inject': os.path.join(ROOT, 'qunit-phantomjs-bridge.js')
})
], stdout=subprocess.PIPE)
try:
while True:
line = phantom.stdout.readline()
if line:
if self.process(line, result):
break
else:
time.sleep(0.1)
finally:
# If the phantomjs process hasn't quit, kill it
if phantom.poll() is None:
phantom.terminate()
def process(self, line, result):
args = json.loads(line)
event_name = args[0]
if event_name == 'qunit.done':
return True
elif event_name == 'fail.load':
self.add_error(result, "PhantomJS unable to load %s" % args[1])
return True
elif event_name == 'fail.timeout':
self.add_error(result, "PhantomJS timed out, possibly due to a"
" missing QUnit start() call")
return True
elif event_name == 'qunit.moduleStart':
self._module = args[1].encode('utf-8')
elif event_name == 'qunit.moduleStop':
self._test = None
self._module = None
elif event_name == 'qunit.testStart':
self._test = QUnitTest(self._module, args[1].encode('utf-8'))
result.startTest(self._test)
elif event_name == 'qunit.testDone':
if not self._test.failed:
result.addSuccess(self._test)
result.stopTest(self._test)
self._test = None
elif event_name == 'qunit.log':
if args[1]:
return False
self._test.failed = True
result.addFailure(
self._test, self.failure_to_str(*args[2:]))
return False
def add_error(self, result, s):
test = QUnitTest('phantomjs', 'startup')
result.startTest(test)
result.addError(test, s)
result.stopTest(test)
def failure_to_str(self, actual, expected, message, source):
if message or actual == expected:
formatted = str(message or '')
else:
formatted = "%s != %s" % (actual, expected)
if source:
formatted += '\n\n' + source
return formatted
+6
View File
@@ -10,6 +10,12 @@ class WebSuite(QUnitSuite):
'/web/tests',
'mod=*&source={db}&supadmin={supadmin}&password={password}'.format(
db=tools.config['db_name'],
# al: i dont understand why both are needed, db_password is the
# password for postgres and should not appear here of that i'm
# sure
#
# But runbot provides it with this wrong key so i let it here
# until it's fixed
supadmin=tools.config['db_password'] or 'admin',
password=tools.config['admin_passwd'] or 'admin'),
''
+5 -4
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-24 18:16+0000\n"
"PO-Revision-Date: 2012-12-09 18:06+0000\n"
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\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_calendar
#. openerp-web
@@ -43,7 +43,7 @@ msgstr "Snimi"
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "U pogledu tipa kalendar polje 'date_delay' tip != float"
#. module: web_calendar
#. openerp-web
@@ -215,6 +215,7 @@ msgstr "Kalendar"
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
"U pogledu tipa kalendar obavezno je polje 'date_start' - početno vrijeme."
#~ msgid "Navigator"
#~ msgstr "Navigator"
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-25 07:04+0000\n"
"PO-Revision-Date: 2012-12-05 07:55+0000\n"
"Last-Translator: Erwin van der Ploeg (Endian Solutions) <Unknown>\n"
"Language-Team: Dutch <nl@li.org>\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-06 04:54+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_calendar
#. openerp-web
@@ -43,7 +43,7 @@ msgstr "Opslaan"
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "Agenda weergave heeft een 'date_delay' type != float"
#. module: web_calendar
#. openerp-web
@@ -214,7 +214,7 @@ msgstr "Agenda"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "Agenda weergave heeft een niet gedefinieerde 'date_start' attribute."
#~ msgid "Navigator"
#~ msgstr "Navigator"
+8 -8
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-12-04 12:40+0000\n"
"Last-Translator: Andrei Talpa (multibase.pt) <andrei.talpa@multibase.pt>\n"
"PO-Revision-Date: 2012-12-07 10:00+0000\n"
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
"Language-Team: Portuguese <pt@li.org>\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:43+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_calendar
#. openerp-web
@@ -64,7 +64,7 @@ msgstr "Semana"
#: code:addons/web_calendar/static/src/js/calendar.js:161
#, python-format
msgid "Full day"
msgstr ""
msgstr "Dia inteiro"
#. module: web_calendar
#. openerp-web
@@ -79,7 +79,7 @@ msgstr "Descrição"
#: code:addons/web_calendar/static/src/js/calendar.js:158
#, python-format
msgid "Event will be deleted permanently, are you sure?"
msgstr ""
msgstr "O evento será eliminado. Confirma?"
#. module: web_calendar
#. openerp-web
@@ -136,7 +136,7 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:80
#, python-format
msgid "Filter"
msgstr ""
msgstr "Filtro"
#. module: web_calendar
#. openerp-web
@@ -179,7 +179,7 @@ msgstr "Mês"
#: code:addons/web_calendar/static/src/js/calendar.js:166
#, python-format
msgid "Disabled"
msgstr ""
msgstr "Inativo"
#. module: web_calendar
#. openerp-web
-5
View File
@@ -3,11 +3,6 @@ import openerp
class DiagramView(openerp.addons.web.controllers.main.View):
_cp_path = "/web_diagram/diagram"
@openerp.addons.web.http.jsonrequest
def load(self, req, model, view_id):
fields_view = self.fields_view_get(req, model, view_id, 'diagram')
return {'fields_view': fields_view}
@openerp.addons.web.http.jsonrequest
def get_diagram_info(self, req, id, model, node, connector,
src_node, des_node, label, **kw):
+13 -6
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
"PO-Revision-Date: 2012-02-16 21:55+0000\n"
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
"PO-Revision-Date: 2012-12-09 22:40+0000\n"
"Last-Translator: Sergio Corato <Unknown>\n"
"Language-Team: Italian <it@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-25 06:41+0000\n"
"X-Generator: Launchpad (build 16293)\n"
"X-Launchpad-Export-Date: 2012-12-10 04:44+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_diagram
#. openerp-web
@@ -35,6 +35,10 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"La cancellazione di questo nodo è irreversibile. \n"
"Saranno cancellate anche tutte le transizioni ad esso correlate.\n"
"\n"
"Sei sicuro ?"
#. module: web_diagram
#. openerp-web
@@ -71,7 +75,7 @@ msgstr "Attività"
#: code:addons/web_diagram/static/src/js/diagram.js:422
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web_diagram
#. openerp-web
@@ -86,7 +90,7 @@ msgstr "Crea:"
#: code:addons/web_diagram/static/src/js/diagram.js:187
#, python-format
msgid "Are you sure?"
msgstr ""
msgstr "Sei sicuro?"
#. module: web_diagram
#. openerp-web
@@ -97,3 +101,6 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"La cancellazione di questa transizione è irreversibile.\n"
"\n"
"Sei sicuro?"
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-24 01:23+0000\n"
"PO-Revision-Date: 2012-06-05 19:47+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-12-07 09:55+0000\n"
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
"Language-Team: Portuguese <pt@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-11-25 06:41+0000\n"
"X-Generator: Launchpad (build 16293)\n"
"X-Launchpad-Export-Date: 2012-12-08 05:21+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_diagram
#. openerp-web
@@ -75,7 +75,7 @@ msgstr "Atividade"
#: code:addons/web_diagram/static/src/js/diagram.js:422
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web_diagram
#. openerp-web
+2 -7
View File
@@ -9,6 +9,7 @@ var QWeb = instance.web.qweb,
instance.web.views.add('diagram', 'instance.web.DiagramView');
instance.web.DiagramView = instance.web.View.extend({
display_name: _lt('Diagram'),
view_type: 'diagram',
searchable: false,
init: function(parent, dataset, view_id, options) {
var self = this;
@@ -24,12 +25,6 @@ instance.web.DiagramView = instance.web.View.extend({
this.on('view_loaded', self, self.load_diagram);
this.on('pager_action_executed', self, self.pager_action_trigger);
},
start: function() {
var self = this;
return this.rpc("/web_diagram/diagram/load", {"model": this.model, "view_id": this.view_id}).done(function(r) {
self.load_diagram(r);
});
},
toTitleCase: function(str) {
return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
@@ -41,7 +36,7 @@ instance.web.DiagramView = instance.web.View.extend({
this.id = this.ids[self.dataset.index || 0];
}
this.fields_view = result.fields_view,
this.fields_view = result,
this.view_id = this.fields_view.view_id,
this.fields = this.fields_view.fields,
this.nodes = this.fields_view.arch.children[0],
+20 -20
View File
@@ -8,28 +8,28 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-02-16 21:56+0000\n"
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
"PO-Revision-Date: 2012-12-09 23:09+0000\n"
"Last-Translator: Sergio Corato <Unknown>\n"
"Language-Team: Italian <it@li.org>\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_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:12
#, python-format
msgid "Bars"
msgstr ""
msgstr "Barre"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:33
#, python-format
msgid "Show Data"
msgstr ""
msgstr "Visualizza Dati"
#. module: web_graph
#. openerp-web
@@ -43,95 +43,95 @@ msgstr "Grafico"
#: code:addons/web_graph/static/src/xml/web_graph.xml:25
#, python-format
msgid "Inside"
msgstr ""
msgstr "Interno"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:3
#, python-format
msgid "&iacute;"
msgstr ""
msgstr "&iacute;"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:11
#, python-format
msgid "Pie"
msgstr ""
msgstr "Torta"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:28
#, python-format
msgid "Actions"
msgstr ""
msgstr "Azioni"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:7
#, python-format
msgid "Graph Mode"
msgstr ""
msgstr "Modalità Grafico"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:18
#, python-format
msgid "Radar"
msgstr ""
msgstr "Rete"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:34
#, python-format
msgid "Download as PNG"
msgstr ""
msgstr "Download come PNG"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:26
#, python-format
msgid "Top"
msgstr ""
msgstr "In alto"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:24
#, python-format
msgid "Hidden"
msgstr ""
msgstr "Nascosto"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:3
#, python-format
msgid "Graph Options"
msgstr ""
msgstr "Opzioni Grafico"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:14
#, python-format
msgid "Lines"
msgstr ""
msgstr "Righe"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:20
#, python-format
msgid "Legend"
msgstr ""
msgstr "Legenda"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:32
#, python-format
msgid "Switch Axis"
msgstr ""
msgstr "Inverti Asse"
#. module: web_graph
#. openerp-web
#: code:addons/web_graph/static/src/xml/web_graph.xml:15
#, python-format
msgid "Areas"
msgstr ""
msgstr "Aree"
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-29 19:33+0000\n"
"Last-Translator: Wei \"oldrev\" Li <oldrev@gmail.com>\n"
"PO-Revision-Date: 2012-12-07 15:34+0000\n"
"Last-Translator: ccdos <ccdos@163.com>\n"
"Language-Team: Chinese (Simplified) <zh_CN@li.org>\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-08 05:21+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_graph
#. openerp-web
@@ -50,7 +50,7 @@ msgstr "内部"
#: code:addons/web_graph/static/src/xml/web_graph.xml:3
#, python-format
msgid "&iacute;"
msgstr ""
msgstr "&iacute;"
#. module: web_graph
#. openerp-web
+9 -7
View File
@@ -42,7 +42,7 @@
position: relative;
display: block;
padding: 2px 4px 2px 20px;
line-height: 14px;
line-height: 12px;
color: #4c4c4c;
text-decoration: none;
}
@@ -59,10 +59,12 @@
.openerp .open .graph-dropdown {
display: block;
}
.graph-menu {
padding: 3px;
.openerp .graph-menu {
padding: 0;
margin: 0;
}
.graph-menu .active:before {
.openerp .graph-menu .active:before {
content: "W";
font-family: "entypoRegular" !important;
font-size: 24px;
@@ -72,7 +74,7 @@
left: 4px;
top: -2px;
}
.graph-menu li {
padding: 2px;
margin-left: 10px;
.openerp .graph-menu li {
padding: 0;
list-style-type: none;
}
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-27 22:58+0000\n"
"PO-Revision-Date: 2012-12-06 15:32+0000\n"
"Last-Translator: fshahy <fshahy@gmail.com>\n"
"Language-Team: Persian <fa@li.org>\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-07 04:47+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_kanban
#. openerp-web
@@ -29,7 +29,7 @@ msgstr "ویرایش ستون"
#: code:addons/web_kanban/static/src/js/kanban.js:413
#, python-format
msgid "An error has occured while moving the record to this group."
msgstr ""
msgstr "هنگام انتقال رکورد به این گروه خزایی رخ داده است."
#. module: web_kanban
#. openerp-web
@@ -150,7 +150,7 @@ msgstr "یا"
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:51
#, python-format
msgid "99+"
msgstr ""
msgstr "+۹۹"
#. module: web_kanban
#. openerp-web
+5 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-24 18:09+0000\n"
"PO-Revision-Date: 2012-12-09 17:58+0000\n"
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\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_kanban
#. openerp-web
@@ -29,7 +29,7 @@ msgstr "Uredi stupac"
#: code:addons/web_kanban/static/src/js/kanban.js:413
#, python-format
msgid "An error has occured while moving the record to this group."
msgstr ""
msgstr "Greška kod promjene grupe"
#. module: web_kanban
#. openerp-web
@@ -150,7 +150,7 @@ msgstr "ili"
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:51
#, python-format
msgid "99+"
msgstr ""
msgstr "99+"
#. module: web_kanban
#. openerp-web
+19 -18
View File
@@ -8,21 +8,21 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-02-16 21:57+0000\n"
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
"PO-Revision-Date: 2012-12-09 22:52+0000\n"
"Last-Translator: Sergio Corato <Unknown>\n"
"Language-Team: Italian <it@li.org>\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_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/js/kanban.js:698
#, python-format
msgid "Edit column"
msgstr ""
msgstr "Modifica colonna"
#. module: web_kanban
#. openerp-web
@@ -30,6 +30,7 @@ msgstr ""
#, python-format
msgid "An error has occured while moving the record to this group."
msgstr ""
"E' avvenuto un errore durante lo spostamento del record a questo gruppo."
#. module: web_kanban
#. openerp-web
@@ -50,35 +51,35 @@ msgstr "Non definito"
#: code:addons/web_kanban/static/src/js/kanban.js:717
#, python-format
msgid "Are you sure to remove this column ?"
msgstr ""
msgstr "Sei sicuro di rimuovere questa colonna ?"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:42
#, python-format
msgid "Edit"
msgstr ""
msgstr "Modifica"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/js/kanban.js:188
#, python-format
msgid "Add column"
msgstr ""
msgstr "Aggiungi colonna"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/js/kanban.js:1093
#, python-format
msgid "Create: "
msgstr ""
msgstr "Crea: "
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:24
#, python-format
msgid "Add a new column"
msgstr ""
msgstr "Aggiungi una nuova colonna"
#. module: web_kanban
#. openerp-web
@@ -86,21 +87,21 @@ msgstr ""
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:40
#, python-format
msgid "Fold"
msgstr ""
msgstr "Arrotola"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:90
#, python-format
msgid "Add"
msgstr ""
msgstr "Aggiungi"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:35
#, python-format
msgid "Quick create"
msgstr ""
msgstr "Creazione rapida"
#. module: web_kanban
#. openerp-web
@@ -114,7 +115,7 @@ msgstr "Sicuro di voler eliminare questo record?"
#: code:addons/web_kanban/static/src/js/kanban.js:688
#, python-format
msgid "Unfold"
msgstr ""
msgstr "Allarga"
#. module: web_kanban
#. openerp-web
@@ -128,7 +129,7 @@ msgstr "Mostra altro... ("
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:91
#, python-format
msgid "Cancel"
msgstr ""
msgstr "Annulla"
#. module: web_kanban
#. openerp-web
@@ -143,21 +144,21 @@ msgstr "rimanenti)"
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:90
#, python-format
msgid "or"
msgstr ""
msgstr "o"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:51
#, python-format
msgid "99+"
msgstr ""
msgstr "99+"
#. module: web_kanban
#. openerp-web
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:43
#, python-format
msgid "Delete"
msgstr ""
msgstr "Elimina"
#~ msgid "Create"
#~ msgstr "Crea"
+5 -4
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-25 07:06+0000\n"
"PO-Revision-Date: 2012-12-05 07:53+0000\n"
"Last-Translator: Erwin van der Ploeg (Endian Solutions) <Unknown>\n"
"Language-Team: Dutch <nl@li.org>\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-06 04:54+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_kanban
#. openerp-web
@@ -30,6 +30,7 @@ msgstr "Kolom aanpassen"
#, python-format
msgid "An error has occured while moving the record to this group."
msgstr ""
"Er is een fout opgetreden bij het verplaatsen van het record naar deze groep."
#. module: web_kanban
#. openerp-web
@@ -150,7 +151,7 @@ msgstr "of"
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:51
#, python-format
msgid "99+"
msgstr ""
msgstr "99+"
#. module: web_kanban
#. openerp-web
+7 -7
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-12-04 12:44+0000\n"
"PO-Revision-Date: 2012-12-07 09:57+0000\n"
"Last-Translator: Andrei Talpa (multibase.pt) <andrei.talpa@multibase.pt>\n"
"Language-Team: Portuguese <pt@li.org>\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:43+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_kanban
#. openerp-web
@@ -29,7 +29,7 @@ msgstr "Editar coluna"
#: code:addons/web_kanban/static/src/js/kanban.js:413
#, python-format
msgid "An error has occured while moving the record to this group."
msgstr ""
msgstr "Ocorreu um erro ao mover o registo para este grupo."
#. module: web_kanban
#. openerp-web
@@ -86,7 +86,7 @@ msgstr "Adicionar uma nova coluna"
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:40
#, python-format
msgid "Fold"
msgstr ""
msgstr "Dobrar"
#. module: web_kanban
#. openerp-web
@@ -100,7 +100,7 @@ msgstr "Adicionar"
#: code:addons/web_kanban/static/src/xml/web_kanban.xml:35
#, python-format
msgid "Quick create"
msgstr ""
msgstr "Criação rápida"
#. module: web_kanban
#. openerp-web
@@ -114,7 +114,7 @@ msgstr "Tem certeza que quer remover este registo?"
#: code:addons/web_kanban/static/src/js/kanban.js:688
#, python-format
msgid "Unfold"
msgstr ""
msgstr "Desdobrar"
#. module: web_kanban
#. openerp-web
+7 -7
View File
@@ -8,21 +8,21 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-27 22:58+0000\n"
"PO-Revision-Date: 2012-12-06 15:25+0000\n"
"Last-Translator: fshahy <fshahy@gmail.com>\n"
"Language-Team: Persian <fa@li.org>\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-07 04:47+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_view_editor
#. openerp-web
#: code:addons/web_view_editor/static/src/js/view_editor.js:164
#, python-format
msgid "The following fields are invalid :"
msgstr ""
msgstr "فیلدهای زیر معتبر نیستند."
#. module: web_view_editor
#. openerp-web
@@ -36,7 +36,7 @@ msgstr "ایجاد"
#: code:addons/web_view_editor/static/src/js/view_editor.js:986
#, python-format
msgid "New Field"
msgstr ""
msgstr "فیلد جدید"
#. module: web_view_editor
#. openerp-web
@@ -71,7 +71,7 @@ msgstr "ذخیره"
#: code:addons/web_view_editor/static/src/js/view_editor.js:393
#, python-format
msgid "Select an element"
msgstr ""
msgstr "یک مورد را انتخاب کنید."
#. module: web_view_editor
#. openerp-web
@@ -86,7 +86,7 @@ msgstr "به روز رسانی"
#: code:addons/web_view_editor/static/src/js/view_editor.js:263
#, python-format
msgid "Please select view in list :"
msgstr ""
msgstr "لطفا نما را از لیست انتخاب کنید."
#. module: web_view_editor
#. openerp-web
+8 -8
View File
@@ -8,21 +8,21 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-24 18:01+0000\n"
"PO-Revision-Date: 2012-12-09 17:57+0000\n"
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\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_view_editor
#. openerp-web
#: code:addons/web_view_editor/static/src/js/view_editor.js:164
#, python-format
msgid "The following fields are invalid :"
msgstr ""
msgstr "Popis neispravnih polja:"
#. module: web_view_editor
#. openerp-web
@@ -36,7 +36,7 @@ msgstr "Kreiraj"
#: code:addons/web_view_editor/static/src/js/view_editor.js:986
#, python-format
msgid "New Field"
msgstr ""
msgstr "Novo polje"
#. module: web_view_editor
#. openerp-web
@@ -71,7 +71,7 @@ msgstr "Snimi"
#: code:addons/web_view_editor/static/src/js/view_editor.js:393
#, python-format
msgid "Select an element"
msgstr ""
msgstr "Odaberite element"
#. module: web_view_editor
#. openerp-web
@@ -86,7 +86,7 @@ msgstr "Ažuriraj"
#: code:addons/web_view_editor/static/src/js/view_editor.js:263
#, python-format
msgid "Please select view in list :"
msgstr ""
msgstr "Odaberite pogled iz popisa:"
#. module: web_view_editor
#. openerp-web
@@ -150,7 +150,7 @@ msgstr "Da li zaista želite obrisati ovaj čvor?"
#: code:addons/web_view_editor/static/src/js/view_editor.js:390
#, python-format
msgid "Can't Update View"
msgstr ""
msgstr "Ažuriranje pogleda nije moguće"
#. module: web_view_editor
#. openerp-web
+8 -8
View File
@@ -8,21 +8,21 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-11-25 07:09+0000\n"
"PO-Revision-Date: 2012-12-05 07:54+0000\n"
"Last-Translator: Erwin van der Ploeg (Endian Solutions) <Unknown>\n"
"Language-Team: Dutch <nl@li.org>\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-06 04:54+0000\n"
"X-Generator: Launchpad (build 16341)\n"
#. module: web_view_editor
#. openerp-web
#: code:addons/web_view_editor/static/src/js/view_editor.js:164
#, python-format
msgid "The following fields are invalid :"
msgstr ""
msgstr "De volgende velden zijn ongeldig."
#. module: web_view_editor
#. openerp-web
@@ -36,7 +36,7 @@ msgstr "Aanmaken"
#: code:addons/web_view_editor/static/src/js/view_editor.js:986
#, python-format
msgid "New Field"
msgstr ""
msgstr "Nieuw veld"
#. module: web_view_editor
#. openerp-web
@@ -71,7 +71,7 @@ msgstr "Opslaan"
#: code:addons/web_view_editor/static/src/js/view_editor.js:393
#, python-format
msgid "Select an element"
msgstr ""
msgstr "Selecteer een element"
#. module: web_view_editor
#. openerp-web
@@ -86,7 +86,7 @@ msgstr "Bijwerken"
#: code:addons/web_view_editor/static/src/js/view_editor.js:263
#, python-format
msgid "Please select view in list :"
msgstr ""
msgstr "Selecteer weergave in de lijst:"
#. module: web_view_editor
#. openerp-web
@@ -150,7 +150,7 @@ msgstr "Wilt u dit knooppunt werkelijk verwijderen?"
#: code:addons/web_view_editor/static/src/js/view_editor.js:390
#, python-format
msgid "Can't Update View"
msgstr ""
msgstr "Kan de weergave niet vernieuwen"
#. module: web_view_editor
#. openerp-web
+7 -7
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openerp-web\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2012-11-30 18:13+0000\n"
"PO-Revision-Date: 2012-12-04 12:42+0000\n"
"Last-Translator: Andrei Talpa (multibase.pt) <andrei.talpa@multibase.pt>\n"
"PO-Revision-Date: 2012-12-07 09:56+0000\n"
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
"Language-Team: Portuguese <pt@li.org>\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:43+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_view_editor
#. openerp-web
@@ -71,7 +71,7 @@ msgstr "Guardar"
#: code:addons/web_view_editor/static/src/js/view_editor.js:393
#, python-format
msgid "Select an element"
msgstr ""
msgstr "Selecione um elemento"
#. module: web_view_editor
#. openerp-web
@@ -86,7 +86,7 @@ msgstr "Atualizar"
#: code:addons/web_view_editor/static/src/js/view_editor.js:263
#, python-format
msgid "Please select view in list :"
msgstr ""
msgstr "Por favor, selecione uma vista da lista"
#. module: web_view_editor
#. openerp-web
@@ -150,7 +150,7 @@ msgstr "Quer mesmo remover este nó?"
#: code:addons/web_view_editor/static/src/js/view_editor.js:390
#, python-format
msgid "Can't Update View"
msgstr ""
msgstr "Não é possível atualizar a vista"
#. module: web_view_editor
#. openerp-web