[MERGE] trunk

bzr revid: fme@openerp.com-20121219150025-h9h1956xey3tok57
This commit is contained in:
Fabien Meghazi 2012-12-19 16:00:25 +01:00
commit d234a24de0
144 changed files with 9456 additions and 2467 deletions

View File

@ -1,4 +1,5 @@
import http
import controllers
import cli
wsgi_postload = http.wsgi_postload

View File

@ -0,0 +1 @@
import test_js

35
addons/web/cli/test_js.py Normal file
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:

View File

@ -28,6 +28,7 @@ except ImportError:
xlwt = None
import openerp
import openerp.modules.registry
from openerp.tools.translate import _
from .. import http
@ -169,7 +170,6 @@ def module_installed_bypass_session(dbname):
loadable = openerpweb.addons_manifest.keys()
modules = {}
try:
import openerp.modules.registry
registry = openerp.modules.registry.RegistryManager.get(dbname)
with registry.cursor() as cr:
m = registry.get('ir.module.module')
@ -523,21 +523,7 @@ html_template = """<!DOCTYPE html>
<body>
<!--[if lte IE 8]>
<script src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>
<script>
var test = function() {
CFInstall.check({
mode: "overlay"
});
};
if (window.localStorage && false) {
if (! localStorage.getItem("hasShownGFramePopup")) {
test();
localStorage.setItem("hasShownGFramePopup", true);
}
} else {
test();
}
</script>
<script>CFInstall.check({mode: "overlay"});</script>
<![endif]-->
</body>
</html>
@ -919,15 +905,8 @@ class Session(openerpweb.Controller):
class Menu(openerpweb.Controller):
_cp_path = "/web/menu"
@openerpweb.jsonrequest
def load(self, req):
return {'data': self.do_load(req)}
@openerpweb.jsonrequest
def get_user_roots(self, req):
return self.do_get_user_roots(req)
def do_get_user_roots(self, req):
""" Return all root menu ids visible for the session user.
:param req: A request object, with an OpenERP session attribute
@ -950,7 +929,8 @@ class Menu(openerpweb.Controller):
return Menus.search(menu_domain, 0, False, False, req.context)
def do_load(self, req):
@openerpweb.jsonrequest
def load(self, req):
""" Loads all menu items (all applications and their sub-menus).
:param req: A request object, with an OpenERP session attribute
@ -960,24 +940,28 @@ class Menu(openerpweb.Controller):
"""
Menus = req.session.model('ir.ui.menu')
fields = ['name', 'sequence', 'parent_id', 'action',
'needaction_enabled', 'needaction_counter']
menu_roots = Menus.read(self.do_get_user_roots(req), fields, req.context)
fields = ['name', 'sequence', 'parent_id', 'action']
menu_root_ids = self.get_user_roots(req)
menu_roots = Menus.read(menu_root_ids, fields, req.context) if menu_root_ids else []
menu_root = {
'id': False,
'name': 'root',
'parent_id': [-1, ''],
'children': menu_roots
'children': menu_roots,
'all_menu_ids': menu_root_ids,
}
if not menu_roots:
return menu_root
# menus are loaded fully unlike a regular tree view, cause there are a
# limited number of items (752 when all 6.1 addons are installed)
menu_ids = Menus.search([], 0, False, False, req.context)
menu_ids = Menus.search([('id', 'child_of', menu_root_ids)], 0, False, False, req.context)
menu_items = Menus.read(menu_ids, fields, req.context)
# adds roots at the end of the sequence, so that they will overwrite
# equivalent menu items from full menu read when put into id:item
# mapping, resulting in children being correctly set on the roots.
menu_items.extend(menu_roots)
menu_root['all_menu_ids'] = menu_ids # includes menu_root_ids!
# make a tree using parent_id
menu_items_map = dict(
@ -998,8 +982,18 @@ class Menu(openerpweb.Controller):
return menu_root
@openerpweb.jsonrequest
def load_needaction(self, req, menu_ids):
""" Loads needaction counters for specific menu ids.
:return: needaction data
:rtype: dict(menu_id: {'needaction_enabled': boolean, 'needaction_counter': int})
"""
return req.session.model('ir.ui.menu').get_needaction_data(menu_ids, req.context)
@openerpweb.jsonrequest
def action(self, req, menu_id):
# still used by web_shortcut
actions = load_actions_from_ir_values(req,'action', 'tree_but_open',
[('ir.ui.menu', menu_id)], False)
return {"action": actions}
@ -1065,14 +1059,15 @@ class DataSet(openerpweb.Controller):
def _call_kw(self, req, model, method, args, kwargs):
# Temporary implements future display_name special field for model#read()
if method == 'read' and kwargs.get('context') and kwargs['context'].get('future_display_name'):
if method == 'read' and kwargs.get('context', {}).get('future_display_name'):
if 'display_name' in args[1]:
names = req.session.model(model).name_get(args[0], **kwargs)
names = dict(req.session.model(model).name_get(args[0], **kwargs))
args[1].remove('display_name')
r = getattr(req.session.model(model), method)(*args, **kwargs)
for i in range(len(r)):
r[i]['display_name'] = names[i][1] or "%s#%d" % (model, names[i][0])
return r
records = req.session.model(model).read(*args, **kwargs)
for record in records:
record['display_name'] = \
names.get(record['id']) or "%s#%d" % (model, (record['id']))
return records
return getattr(req.session.model(model), method)(*args, **kwargs)
@ -1121,41 +1116,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 +1139,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"
@ -1245,9 +1201,10 @@ class Binary(openerpweb.Controller):
except:
pass
return req.make_response(image_data, headers)
def placeholder(self, req):
def placeholder(self, req, image='placeholder.png'):
addons_path = openerpweb.addons_manifest['web']['addons_path']
return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', 'placeholder.png'), 'rb').read()
return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', image), 'rb').read()
@openerpweb.httprequest
def saveas(self, req, model, field, id=None, filename_field=None, **kw):
@ -1289,6 +1246,7 @@ class Binary(openerpweb.Controller):
jdata = simplejson.loads(data)
model = jdata['model']
field = jdata['field']
data = jdata['data']
id = jdata.get('id', None)
filename_field = jdata.get('filename_field', None)
context = jdata.get('context', {})
@ -1297,7 +1255,9 @@ class Binary(openerpweb.Controller):
fields = [field]
if filename_field:
fields.append(filename_field)
if id:
if data:
res = { field: data }
elif id:
res = Model.read([int(id)], fields, context)[0]
else:
res = Model.default_get(fields, context)
@ -1317,11 +1277,11 @@ class Binary(openerpweb.Controller):
@openerpweb.httprequest
def upload(self, req, callback, ufile):
# TODO: might be useful to have a configuration flag for max-length file uploads
out = """<script language="javascript" type="text/javascript">
var win = window.top.window;
win.jQuery(win).trigger(%s, %s);
</script>"""
try:
out = """<script language="javascript" type="text/javascript">
var win = window.top.window;
win.jQuery(win).trigger(%s, %s);
</script>"""
data = ufile.read()
args = [len(data), ufile.filename,
ufile.content_type, base64.b64encode(data)]
@ -1332,11 +1292,11 @@ class Binary(openerpweb.Controller):
@openerpweb.httprequest
def upload_attachment(self, req, callback, model, id, ufile):
Model = req.session.model('ir.attachment')
out = """<script language="javascript" type="text/javascript">
var win = window.top.window;
win.jQuery(win).trigger(%s, %s);
</script>"""
try:
out = """<script language="javascript" type="text/javascript">
var win = window.top.window;
win.jQuery(win).trigger(%s, %s);
</script>"""
attachment_id = Model.create({
'name': ufile.filename,
'datas': base64.encodestring(ufile.read()),
@ -1348,10 +1308,39 @@ class Binary(openerpweb.Controller):
'filename': ufile.filename,
'id': attachment_id
}
except Exception,e:
args = {'erorr':e.faultCode.split('--')[1],'title':e.faultCode.split('--')[0]}
except xmlrpclib.Fault, e:
args = {'error':e.faultCode }
return out % (simplejson.dumps(callback), simplejson.dumps(args))
@openerpweb.httprequest
def company_logo(self, req, dbname=None):
# TODO add etag, refactor to use /image code for etag
uid = None
if req.session._db:
dbname = req.session._db
uid = req.session._uid
elif dbname is None:
dbname = db_monodb(req)
if uid is None:
uid = openerp.SUPERUSER_ID
if not dbname:
image_data = self.placeholder(req, 'logo.png')
else:
registry = openerp.modules.registry.RegistryManager.get(dbname)
with registry.cursor() as cr:
user = registry.get('res.users').browse(cr, uid, uid)
if user.company_id.logo_web:
image_data = user.company_id.logo_web.decode('base64')
else:
image_data = self.placeholder(req, 'nologo.png')
headers = [
('Content-Type', 'image/png'),
('Content-Length', len(image_data)),
]
return req.make_response(image_data, headers)
class Action(openerpweb.Controller):
_cp_path = "/web/action"

View File

@ -0,0 +1,77 @@
Guidelines and Recommendations
==============================
Web Module Recommendations
--------------------------
Identifiers (``id`` attribute) should be avoided
''''''''''''''''''''''''''''''''''''''''''''''''
In generic applications and modules, ``@id`` limits the reusabily of
components and tends to make code more brittle.
Just about all the time, they can be replaced with nothing, with
classes or with keeping a reference to a DOM node or a jQuery element
around.
.. note::
If it is *absolutely necessary* to have an ``@id`` (because a
third-party library requires one and can't take a DOM element), it
should be generated with `_.uniqueId
<http://underscorejs.org/#uniqueId>`_ or some other similar
method.
Avoid predictable/common CSS class names
''''''''''''''''''''''''''''''''''''''''
Class names such as "content" or "navigation" might match the desired
meaning/semantics, but it is likely an other developer will have the
same need, creating a naming conflict and unintended behavior. Generic
class names should be prefixed with e.g. the name of the component
they belong to (creating "informal" namespaces, much as in C or
Objective-C)
Global selectors should be avoided
''''''''''''''''''''''''''''''''''
Because a component may be used several times in a single page (an
example in OpenERP is dashboards), queries should be restricted to a
given component's scope. Unfiltered selections such as ``$(selector)``
or ``document.querySelectorAll(selector)`` will generally lead to
unintended or incorrect behavior.
OpenERP Web's :js:class:`~openerp.web.Widget` has an attribute
providing its DOM root :js:attr:`Widget.$el <openerp.web.Widget.$el>`,
and a shortcut to select nodes directly :js:attr:`Widget.$
<openerp.web.Widget.$>`.
More generally, never assume your components own or controls anything
beyond its own personal DOM.
Understand deferreds
''''''''''''''''''''
Deferreds, promises, futures, …
Known under many names, these objects are essential to and (in OpenERP
Web) widely used for making :doc:`asynchronous javascript operations
<async>` palatable and understandable.
OpenERP Web guidelines
----------------------
* HTML templating/rendering should use :doc:`qweb` unless absolutely
trivial.
* All interactive components (components displaying information to the
screen or intercepting DOM events) must inherit from
:class:`~openerp.web.Widget` and correctly implement and use its API
and lifecycle.
* All css classes must be prefixed with *oe_* .
* Asynchronous functions (functions which call :ref:`session.rpc
<rpc_rpc>` directly or indirectly at the very least) *must* return
deferreds, so that callers of overriders can correctly synchronize
with them.

View File

@ -12,17 +12,21 @@ Contents:
:maxdepth: 1
module
testing
widget
async
rpc
qweb
client_action
form_view
guidelines
testing
search_view
list_view
form_view
changelog-7.0

281
addons/web/doc/module.rst Normal file
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

View File

@ -0,0 +1,7 @@
# __openerp__.py
{
'name': "Web Example",
'description': "Basic example of a (future) web module",
'category': 'Hidden',
'depends': ['base'],
}

View File

@ -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'],
}

View File

@ -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'],
}

View File

@ -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'],
}

View File

@ -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'],
}

View File

@ -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'],
}

View File

@ -0,0 +1,6 @@
.openerp .oe_web_example {
color: white;
background-color: black;
height: 100%;
font-size: 400%;
}

View File

@ -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
+}

View File

@ -0,0 +1,2 @@
// static/src/js/first_module.js
console.log("Debug statement: file loaded");

View File

@ -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");
+};

View File

@ -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);
+ };
};

View File

@ -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();
+ }
+ });
};

View File

@ -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();
- }
});
};

View File

@ -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');
+ },
});
};

View File

@ -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();
+ }
});
};

View File

@ -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>

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>

View File

@ -1,42 +0,0 @@
Presentation
============
Prerequisites
-------------
Prerequisites to code addons for the OpenERP Web Client:
- HTML5
- CSS
- Javascript (Ecmascript 5)
- jQuery
Once you know all this, that's only the beginning. Most usages of Javascript/jQuery are small hacks to make a web page nicer. The OpenERP Client Web is different: it's a web application, not a web site. It doesn't have multiple pages generated by a server side code. Only one unique empty page is loaded and all the html is generated by Javascript code, the page is never reloaded. If you never developed that kind of application you still have lot of good practices to learn.
Generic Guidelines
------------------
First, here are some generic recommandations about web 2.0 applications:
* **Do not use ids**. Html ids are evil, the key anti-feature that makes your components non-reusable. You want to identify a dom part? Save a jQuery object over that dom element. If you really need to use ids, use _.uniqueId(), but 99% of the time you don't need to, classes are sufficient.
* **Do not use predictable css class names** like "content" or "navigation", ten other developers will have the same idea than you and there will be clashes. A simple way to avoid this is to use prefixes. For example, if you need a css class for the button named "new" that is contained in the form view which is itself contained in the OpenERP application, name it "oe-form-view-new-button".
* **Do not use global selectors** like *$(".my-class")*, you never know if your component will be instantiated multiple times. Limit the selector with a context, like *$(".my-class", this.$el)*.
* As a general advice, **Never assume you own the page**. When you create a component, it is never unique and is always surrounded by a bunch of crazy html. You have to do with it.
* **Learn how to use jQuery's deferreds** [1]_. That concept may seem over-complicated, but the experience tell us that it is nearly impossible to create big-size javascript applications without that.
OpenERP guidelines
------------------
More recommendations related to the specific case of the OpenERP Web Client:
* The code should conform to EcmasScript 5 without the "use strict" mode as we support IE9.
* Your components should inherit from the *Widget* class. And use *Widget* 's methods (*appendTo*, *replace*,...) to insert your component and its content into the dom.
* Use QWeb templates for html rendering.
* All css classes should have the prefix *oe_* .
* Functions that call rpc() should return a deferred, even if it calls it indirectly. So a function that calls a function that calls a function that calls rpc() should return a deferred too.
.. [1] http://api.jquery.com/category/deferred-object/

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``.

View File

@ -240,6 +240,8 @@ regular query for records):
The result of a (successful) :js:func:`~openerp.web.Query.group_by` is
an array of :js:class:`~openerp.web.QueryGroup`.
.. _rpc_rpc:
Low-level API: RPC calls to Python side
---------------------------------------

View File

@ -1,6 +1,8 @@
Widget
======
.. js:class:: openerp.web.Widget
This is the base class for all visual components. It corresponds to an MVC
view. It provides a number of services to handle a section of a page:
@ -15,31 +17,33 @@ view. It provides a number of services to handle a section of a page:
be anything the corresponding jQuery method accepts (generally selectors,
DOM nodes and jQuery objects):
:js:func:`~openerp.base.Widget.appendTo`
:js:func:`~openerp.web.Widget.appendTo`
Renders the widget and inserts it as the last child of the target, uses
`.appendTo()`_
:js:func:`~openerp.base.Widget.prependTo`
:js:func:`~openerp.web.Widget.prependTo`
Renders the widget and inserts it as the first child of the target, uses
`.prependTo()`_
:js:func:`~openerp.base.Widget.insertAfter`
:js:func:`~openerp.web.Widget.insertAfter`
Renders the widget and inserts it as the preceding sibling of the target,
uses `.insertAfter()`_
:js:func:`~openerp.base.Widget.insertBefore`
:js:func:`~openerp.web.Widget.insertBefore`
Renders the widget and inserts it as the following sibling of the target,
uses `.insertBefore()`_
* Backbone-compatible shortcuts
.. _widget-dom_root:
DOM Root
--------
A :js:class:`~openerp.web.Widget` is responsible for a section of the
page materialized by the DOM root of the widget. The DOM root is
available via the :js:attr:`~openerp.web.Widget.el` and
:js:attr:`~openerp.web.Widget.$element` attributes, which are
:js:attr:`~openerp.web.Widget.$el` attributes, which are
respectively the raw DOM Element and the jQuery wrapper around the DOM
element.
@ -121,7 +125,7 @@ DOM:
.. code-block:: javascript
this.$element.find(selector);
this.$el.find(selector);
:param String selector: CSS selector
:returns: jQuery object
@ -157,7 +161,16 @@ To this end, :js:class:`~openerp.web.Widget` provides an shortcut:
Events are a mapping of ``event selector`` (an event name and a
CSS selector separated by a space) to a callback. The callback can
be either a method name in the widget or a function. In either
case, the ``this`` will be set to the widget.
case, the ``this`` will be set to the widget:
.. code-block:: javascript
events: {
'click p.oe_some_class a': 'some_method',
'change input': function (e) {
e.stopPropagation();
}
},
The selector is used for jQuery's `event delegation`_, the
callback will only be triggered for descendants of the DOM root

View File

@ -103,7 +103,7 @@ class WebRequest(object):
lang = self.httprequest.cookies.get('lang')
if lang is None:
lang = self.httprequest.accept_languages.best
if lang is None:
if not lang:
lang = 'en_US'
# tranform 2 letters lang like 'en' into 5 letters like 'en_US'
lang = babel.core.LOCALE_ALIASES.get(lang, lang)
@ -478,10 +478,9 @@ class Root(object):
"""
def __init__(self):
self.addons = {}
self.statics = {}
static_dirs = self._load_addons()
app = werkzeug.wsgi.SharedDataMiddleware( self.dispatch, static_dirs)
self.dispatch = DisableCacheMiddleware(app)
self.load_addons()
# Setup http sessions
path = session_path()
@ -530,14 +529,12 @@ class Root(object):
return response(environ, start_response)
def _load_addons(self):
"""
Loads all addons at the specified addons path, returns a mapping of
static URLs to the corresponding directories
"""
statics = {}
def load_addons(self):
""" Load all addons from addons patch containg static files and
controllers and configure them. """
for addons_path in openerp.modules.module.ad_paths:
for module in os.listdir(addons_path):
for module in sorted(os.listdir(addons_path)):
if module not in addons_module:
manifest_path = os.path.join(addons_path, module, '__openerp__.py')
path_static = os.path.join(addons_path, module, 'static')
@ -551,14 +548,17 @@ class Root(object):
m = __import__(module)
addons_module[module] = m
addons_manifest[module] = manifest
statics['/%s/static' % module] = path_static
self.statics['/%s/static' % module] = path_static
for k, v in controllers_class:
if k not in controllers_object:
o = v()
controllers_object[k] = o
if hasattr(o, '_cp_path'):
controllers_path[o._cp_path] = o
return statics
app = werkzeug.wsgi.SharedDataMiddleware(self.dispatch, self.statics)
self.dispatch = DisableCacheMiddleware(app)
def find_handler(self, *l):
"""

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-04-13 20:46+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-12-17 17:31+0000\n"
"Last-Translator: Goran Kliska <gkliska@gmail.com>\n"
"Language-Team: Bosnian <bs@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-18 05:08+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web
#. openerp-web
@ -29,7 +29,7 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:593
#, python-format
msgid "%d minutes ago"
msgstr ""
msgstr "prije %d minuta"
#. module: web
#. openerp-web

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 19:41+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"PO-Revision-Date: 2012-12-16 10:58+0000\n"
"Last-Translator: Felix Schubert <Unknown>\n"
"Language-Team: German <de@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-17 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web
#. openerp-web
@ -29,14 +29,14 @@ msgstr "Standardsprache:"
#: code:addons/web/static/src/js/coresetup.js:593
#, python-format
msgid "%d minutes ago"
msgstr ""
msgstr "vor %d Minuten"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:621
#, python-format
msgid "Still loading...<br />Please be patient."
msgstr ""
msgstr "Lädt immer noch ...<br/>Bitte haben Sie noch etwas Geduld."
#. module: web
#. openerp-web
@ -75,7 +75,7 @@ msgstr "Master Passwort"
#: code:addons/web/static/src/xml/base.xml:274
#, python-format
msgid "Change Master Password"
msgstr ""
msgstr "Hauptpasswort ändern"
#. module: web
#. openerp-web
@ -103,7 +103,7 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:594
#, python-format
msgid "about an hour ago"
msgstr ""
msgstr "vor einer Stunde"
#. 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 "Sicherung der Datenbank"
#. module: web
#. openerp-web
@ -134,7 +134,7 @@ msgstr "Hier ist eine Vorschau der Datei die nicht importiert werden konnte"
#: code:addons/web/static/src/js/coresetup.js:592
#, python-format
msgid "about a minute ago"
msgstr ""
msgstr "vor einer Minute"
#. 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 "Mit allen Benutzern teilen"
#. module: web
#. openerp-web
@ -277,14 +277,14 @@ msgstr "Datei hochladen"
#: code:addons/web/static/src/js/coresetup.js:598
#, python-format
msgid "about a month ago"
msgstr ""
msgstr "letzten Monat"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1575
#, python-format
msgid "Custom Filters"
msgstr ""
msgstr "Benutzerdefinierte Filter"
#. module: web
#. openerp-web
@ -305,14 +305,14 @@ msgstr "OpenERP SA"
#: code:addons/web/static/src/js/search.js:1555
#, python-format
msgid "Custom Filter"
msgstr ""
msgstr "Benutzerdefinierter Filter"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:159
#, python-format
msgid "Duplicate Database"
msgstr ""
msgstr "Datenbank kopieren"
#. module: web
#. openerp-web
@ -390,7 +390,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1245
#, python-format
msgid "...Upload in progress..."
msgstr ""
msgstr "... Wird hochgeladen ..."
#. 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 "Datei hochladen"
#. module: web
#. openerp-web
@ -447,7 +447,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:413
#, python-format
msgid "Activate the developer mode"
msgstr ""
msgstr "Entwickler Modus aktivieren"
#. module: web
#. openerp-web
@ -461,14 +461,14 @@ msgstr "Lade (%d)"
#: code:addons/web/static/src/js/search.js:1116
#, python-format
msgid "GroupBy"
msgstr ""
msgstr "Gruppieren nach"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_list.js:684
#, python-format
msgid "You must select at least one record."
msgstr ""
msgstr "Sie müssen mindestens einen Datensatz auswählen"
#. module: web
#. openerp-web
@ -496,7 +496,7 @@ msgstr "Relation:"
#: code:addons/web/static/src/js/coresetup.js:591
#, python-format
msgid "less than a minute ago"
msgstr ""
msgstr "vor weniger als einer Minute"
#. module: web
#. openerp-web
@ -594,7 +594,7 @@ msgstr "Für weitere Informationen besuchen Sie:"
#: code:addons/web/static/src/xml/base.xml:1834
#, python-format
msgid "Add All Info..."
msgstr ""
msgstr "All Informationen hinzufügen..."
#. module: web
#. openerp-web
@ -645,7 +645,7 @@ msgstr "ist größer als"
#: code:addons/web/static/src/xml/base.xml:540
#, python-format
msgid "View"
msgstr "Sicht"
msgstr "Ansicht"
#. module: web
#. openerp-web
@ -730,14 +730,14 @@ msgstr "Speichern unter"
#: code:addons/web/static/src/js/view_form.js:2316
#, python-format
msgid "E-mail error"
msgstr "EMail-Fehler"
msgstr "E-Mail-Fehler"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:596
#, python-format
msgid "a day ago"
msgstr ""
msgstr "Vor 1 Tag"
#. module: web
#. openerp-web
@ -762,6 +762,10 @@ msgid ""
"\n"
"Are you sure you want to leave this page ?"
msgstr ""
"Achtung! Der Datensatz wurde geändert. Ihre Änderungen werden verloren "
"gehen!\n"
"\n"
"Sind Sie sicher, dass Sie diese Seite verlassen wollen?"
#. module: web
#. openerp-web
@ -782,7 +786,7 @@ msgstr "Technische Übersetzung"
#: code:addons/web/static/src/xml/base.xml:1772
#, python-format
msgid "Delimiter:"
msgstr "Feldtrenner:"
msgstr "Trennzeichen:"
#. module: web
#. openerp-web
@ -803,7 +807,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1439
#, python-format
msgid "-- Actions --"
msgstr "-- Vorgänge --"
msgstr "-- Actions --"
#. module: web
#. openerp-web
@ -834,14 +838,14 @@ 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 "Kann Nachricht nicht an ungültige EMail-Adresse senden"
msgstr "Kann keine Nachricht an eine ungültige E-Mail Adresse senden"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:614
#, python-format
msgid "Add..."
msgstr ""
msgstr "Hinzufügen ..."
#. module: web
#. openerp-web
@ -863,7 +867,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:185
#, python-format
msgid "Drop Database"
msgstr ""
msgstr "Datenbank löschen"
#. module: web
#. openerp-web
@ -884,7 +888,7 @@ msgstr "Modifikatoren:"
#: code:addons/web/static/src/xml/base.xml:605
#, python-format
msgid "Delete this attachment"
msgstr ""
msgstr "Diesen Anhang löschen"
#. module: web
#. openerp-web
@ -902,7 +906,7 @@ msgstr "Speichern"
#: code:addons/web/static/src/xml/base.xml:355
#, python-format
msgid "More"
msgstr ""
msgstr "Mehr"
#. module: web
#. openerp-web
@ -992,7 +996,7 @@ msgstr "Zeige Log (%s)"
#: code:addons/web/static/src/xml/base.xml:558
#, python-format
msgid "Creation Date:"
msgstr "Datum Erstellung"
msgstr "Erstellungsdatum:"
#. module: web
#: code:addons/web/controllers/main.py:806
@ -1006,7 +1010,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:4810
#, python-format
msgid "The selected file exceed the maximum file size of %s."
msgstr ""
msgstr "Die ausgewählte Datei überschreitet die maximale Dateigröße von %s."
#. module: web
#. openerp-web
@ -1076,7 +1080,7 @@ msgstr "(keine Bezeichnung)"
#: code:addons/web/static/src/js/coresetup.js:597
#, python-format
msgid "%d days ago"
msgstr ""
msgstr "vor %d Tagen"
#. module: web
#. openerp-web
@ -1101,7 +1105,7 @@ msgstr "Abbrechen"
#: code:addons/web/static/src/xml/base.xml:9
#, python-format
msgid "Loading..."
msgstr "Lade..."
msgstr "Lädt…"
#. module: web
#. openerp-web
@ -1130,7 +1134,7 @@ msgstr "Unbekannter Operator %s in Domain %s"
#: code:addons/web/static/src/js/view_form.js:426
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web
#. openerp-web
@ -1163,7 +1167,7 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:599
#, python-format
msgid "%d months ago"
msgstr ""
msgstr "vor %d Monaten"
#. module: web
#. openerp-web
@ -1192,7 +1196,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:248
#, python-format
msgid "Restore Database"
msgstr ""
msgstr "Datenbank wiederherstellen"
#. module: web
#. openerp-web
@ -1271,7 +1275,7 @@ msgstr "Sie müssen mindestens einen Datensatz auswählen"
#: code:addons/web/static/src/js/coresetup.js:622
#, python-format
msgid "Don't leave yet,<br />it's still loading..."
msgstr ""
msgstr "Nicht verlassen. <br/>Ladevorgang noch aktiv"
#. module: web
#. openerp-web
@ -1320,14 +1324,14 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:4846
#, python-format
msgid "Save As..."
msgstr ""
msgstr "Speichern als..."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4971
#, python-format
msgid "Could not display the selected image."
msgstr ""
msgstr "Das ausgewählte Bild kann nicht angezeigt werden"
#. module: web
#. openerp-web
@ -1385,7 +1389,7 @@ msgstr "Standardwert ändern:"
#: code:addons/web/static/src/xml/base.xml:171
#, python-format
msgid "Original database name:"
msgstr ""
msgstr "Original Datenbank Name :"
#. module: web
#. openerp-web
@ -1395,7 +1399,7 @@ msgstr ""
#: code:addons/web/static/src/js/search.js:1940
#, python-format
msgid "is equal to"
msgstr "Ist gleich"
msgstr "ist gleich"
#. module: web
#. openerp-web
@ -1409,7 +1413,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1594
#, python-format
msgid "Advanced Search"
msgstr ""
msgstr "Erweiterte Suche"
#. module: web
#. openerp-web
@ -1423,7 +1427,7 @@ msgstr "Bestätigen Sie das neue Master Passwort:"
#: code:addons/web/static/src/js/coresetup.js:625
#, python-format
msgid "Maybe you should consider reloading the application by pressing F5..."
msgstr ""
msgstr "Viellecht sollten Sie die Anwendung mit F5 neu laden"
#. module: web
#. openerp-web
@ -1455,7 +1459,7 @@ msgstr "Import-Einstellungen"
#: code:addons/web/static/src/js/view_form.js:2909
#, python-format
msgid "Add %s"
msgstr ""
msgstr "%s hinzufügen"
#. module: web
#. openerp-web
@ -1480,6 +1484,7 @@ msgstr "Schließen"
msgid ""
"You may not believe it,<br />but the application is actually loading..."
msgstr ""
"Sie werden es kaum glauben,<br />aber die Anwendung wird gerade geladen."
#. module: web
#. openerp-web
@ -1493,7 +1498,7 @@ msgstr "CSV Datei:"
#: code:addons/web/static/src/js/search.js:1743
#, python-format
msgid "Advanced"
msgstr ""
msgstr "Erweitert"
#. module: web
#. openerp-web
@ -1541,7 +1546,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1403
#, python-format
msgid "Advanced Search..."
msgstr ""
msgstr "Erweiterte Suche ..."
#. module: web
#. openerp-web
@ -1592,21 +1597,21 @@ msgstr "Größe:"
#: code:addons/web/static/src/xml/base.xml:1799
#, python-format
msgid "--- Don't Import ---"
msgstr ""
msgstr "--- Nicht importieren ---"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1654
#, python-format
msgid "Import-Compatible Export"
msgstr ""
msgstr "Import-kompatibler Export"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:601
#, python-format
msgid "%d years ago"
msgstr ""
msgstr "vor %d Jahren"
#. module: web
#. openerp-web
@ -1657,7 +1662,7 @@ msgstr "Ansichten verwalten"
#: code:addons/web/static/src/xml/base.xml:1776
#, python-format
msgid "Encoding:"
msgstr "Zeichenkodierung:"
msgstr "Zeichensatz:"
#. module: web
#. openerp-web
@ -1678,8 +1683,7 @@ msgstr ""
#: code:addons/web/static/src/js/data_export.js:361
#, python-format
msgid "Please select fields to save export list..."
msgstr ""
"Bitte wählen Sie die Felder die in der Exportliste gespeichert werden sollen."
msgstr "Bitte wählen Sie die zu exportierenden Felder..."
#. module: web
#. openerp-web
@ -1826,7 +1830,7 @@ msgstr "Hochladen ..."
#: code:addons/web/static/src/xml/base.xml:1828
#, python-format
msgid "Name:"
msgstr ""
msgstr "Name:"
#. module: web
#. openerp-web
@ -1936,14 +1940,14 @@ msgstr "Objekt:"
#: code:addons/web/static/src/js/chrome.js:326
#, python-format
msgid "Loading"
msgstr ""
msgstr "Laden"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:600
#, python-format
msgid "about a year ago"
msgstr ""
msgstr "letztes Jahr"
#. module: web
#. openerp-web
@ -1969,7 +1973,7 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:595
#, python-format
msgid "%d hours ago"
msgstr ""
msgstr "vor %d Stunden"
#. module: web
#. openerp-web
@ -2012,7 +2016,7 @@ msgstr "Ok"
#: code:addons/web/static/src/js/views.js:1163
#, python-format
msgid "Uploading..."
msgstr ""
msgstr "Hochladen …"
#. module: web
#. openerp-web
@ -2086,7 +2090,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1578
#, python-format
msgid "Save current filter"
msgstr ""
msgstr "Aktuellen Filter speichern"
#. module: web
#. openerp-web
@ -2136,7 +2140,7 @@ msgstr "Feld Ansicht Definition"
#: code:addons/web/static/src/xml/base.xml:149
#, python-format
msgid "Confirm password:"
msgstr "Passwort wiederholen:"
msgstr "Passwort bestätigen:"
#. module: web
#. openerp-web
@ -2187,7 +2191,7 @@ msgstr "ist falsch"
#: code:addons/web/static/src/xml/base.xml:404
#, python-format
msgid "About OpenERP"
msgstr ""
msgstr "Über OpenERP"
#. module: web
#. openerp-web
@ -2207,14 +2211,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:304
#, python-format
msgid "Database Management"
msgstr ""
msgstr "Datenbank Verwaltung"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4971
#, python-format
msgid "Image"
msgstr ""
msgstr "Bild"
#. module: web
#. openerp-web
@ -2235,7 +2239,7 @@ msgstr ""
#: code:addons/web/static/src/js/search.js:1285
#, python-format
msgid "not a valid integer"
msgstr "ungültiger Trigger"
msgstr "ungültiger Integer"
#. module: web
#. openerp-web
@ -2293,7 +2297,7 @@ msgstr ""
#: code:addons/web/static/src/js/coresetup.js:620
#, python-format
msgid "Still loading..."
msgstr ""
msgstr "Noch am Laden..."
#. module: web
#. openerp-web
@ -2328,7 +2332,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:4846
#, python-format
msgid "The field is empty, there's nothing to save !"
msgstr ""
msgstr "Das Feld ist leer, sie können nichts speichern!"
#. module: web
#. openerp-web
@ -2356,7 +2360,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:928
#, python-format
msgid "Widget:"
msgstr "Bedienelement:"
msgstr "Widget:"
#. module: web
#. openerp-web
@ -2391,7 +2395,7 @@ msgstr "Workflow bearbeiten"
#: code:addons/web/static/src/js/views.js:1172
#, python-format
msgid "Do you really want to delete this attachment ?"
msgstr ""
msgstr "Wollen Sie diesen Anhang wirklich löschen?"
#. module: web
#. openerp-web
@ -2434,7 +2438,7 @@ msgstr "Client Fehler"
#: code:addons/web/static/src/js/views.js:996
#, python-format
msgid "Print"
msgstr ""
msgstr "Drucken"
#. module: web
#. openerp-web
@ -2476,7 +2480,7 @@ msgstr "Speichern & Beenden"
#: code:addons/web/static/src/js/view_form.js:2818
#, python-format
msgid "Search More..."
msgstr ""
msgstr "Mehr suchen"
#. module: web
#. openerp-web

File diff suppressed because it is too large Load Diff

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"
"PO-Revision-Date: 2012-12-10 20:41+0000\n"
"Last-Translator: Santi (Pexego) <santiago@pexego.es>\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-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\n"
#. module: web
#. openerp-web
@ -43,7 +43,7 @@ msgstr "Todavía está cargando ... <br /> Por favor, sea paciente."
#: code:addons/web/static/src/js/search.js:1834
#, python-format
msgid "%(field)s %(operator)s \"%(value)s\""
msgstr ""
msgstr "%(field)s %(operator)s \"%(value)s\""
#. 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
@ -676,7 +676,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:1238
#, python-format
msgid "Field '%s' specified in view could not be found."
msgstr ""
msgstr "No se encontró el campo '%s' especificado en la vista."
#. 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
@ -1298,7 +1298,7 @@ msgstr "Búsqueda incorrecta"
#: code:addons/web/static/src/js/view_list.js:959
#, python-format
msgid "Could not find id in dataset"
msgstr ""
msgstr "No se ha podido encontrar un dataset"
#. 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
@ -1661,7 +1661,7 @@ msgstr "Por favor ingrese su nueva contraseña"
#: code:addons/web/static/src/js/views.js:1463
#, python-format
msgid "Could not parse string to xml"
msgstr ""
msgstr "No se ha podido parsear la cadena a xml"
#. module: web
#. openerp-web
@ -2049,14 +2049,14 @@ msgstr "Cargar datos de demostración:"
#: code:addons/web/static/src/js/dates.js:26
#, python-format
msgid "'%s' is not a valid datetime"
msgstr ""
msgstr "'%s' no es un fecha y hora válido"
#. 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 "No se pudo encontrar un parser DOM: %s"
#. 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
@ -2442,7 +2443,7 @@ msgstr "La base de datos %s ha sido eliminada"
#: code:addons/web/static/src/xml/base.xml:456
#, python-format
msgid "User's timezone"
msgstr ""
msgstr "Zona horaria del usuario"
#. module: web
#. openerp-web

File diff suppressed because it is too large Load Diff

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

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 14:14+0000\n"
"PO-Revision-Date: 2012-12-14 14:51+0000\n"
"Last-Translator: Numérigraphe <Unknown>\n"
"Language-Team: French <fr@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-15 05:17+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web
#. openerp-web
@ -670,6 +670,8 @@ msgstr "ID Action :"
#, python-format
msgid "Your user's preference timezone does not match your browser timezone:"
msgstr ""
"Le fuseau horaire défini dans vos préférences d'utilisateur n'est pas le "
"même que celui de votre navigateur."
#. module: web
#. openerp-web
@ -733,7 +735,7 @@ msgstr "Enregistrer sous"
#: code:addons/web/static/src/js/view_form.js:2316
#, python-format
msgid "E-mail error"
msgstr ""
msgstr "Erreur dans le courriel"
#. module: web
#. openerp-web
@ -827,7 +829,7 @@ msgstr "Ajouter"
#: code:addons/web/static/src/xml/base.xml:530
#, python-format
msgid "Toggle Form Layout Outline"
msgstr ""
msgstr "Activer/désactiver la mise en valeur de la structure."
#. module: web
#. openerp-web
@ -938,7 +940,7 @@ msgstr "Le mot de passe a été modifié avec succès"
#: code:addons/web/static/src/js/view_list_editable.js:781
#, python-format
msgid "The form's data can not be discarded"
msgstr ""
msgstr "Les données du formulaire ne peuvent pas être annulées"
#. module: web
#. openerp-web
@ -1366,7 +1368,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:393
#, python-format
msgid "99+"
msgstr ""
msgstr "99+"
#. module: web
#. openerp-web
@ -1401,7 +1403,7 @@ msgstr "Déclencheur de valeur par défaut :"
#: code:addons/web/static/src/xml/base.xml:171
#, python-format
msgid "Original database name:"
msgstr ""
msgstr "Nom de la base de données originale :"
#. module: web
#. openerp-web
@ -1512,7 +1514,7 @@ msgstr "Fichier CSV :"
#: code:addons/web/static/src/js/search.js:1743
#, python-format
msgid "Advanced"
msgstr ""
msgstr "Avancé"
#. module: web
#. openerp-web
@ -2049,7 +2051,7 @@ msgstr "Charger les données de démonstration:"
#: code:addons/web/static/src/js/dates.js:26
#, python-format
msgid "'%s' is not a valid datetime"
msgstr ""
msgstr "\"%s\" n'est pas un horodatage valide"
#. module: web
#. openerp-web
@ -2143,7 +2145,7 @@ msgstr "Nouveau"
#: code:addons/web/static/src/js/view_list.js:1746
#, python-format
msgid "Can't convert value %s to context"
msgstr ""
msgstr "Impossible de convertir la valeur %s en un contexte"
#. module: web
#. openerp-web
@ -2216,7 +2218,7 @@ msgstr "À propos d'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\" n'est ni une date, ni un horodatage ni une heure correcte"
#. module: web
#: code:addons/web/controllers/main.py:1306
@ -2284,6 +2286,7 @@ msgstr "Non"
#, python-format
msgid "'%s' is not convertible to date, datetime nor time"
msgstr ""
"\"%s\" n'est pas convertible en une date, ni un horodatage ni une heure"
#. module: web
#. openerp-web
@ -2315,7 +2318,7 @@ msgstr "Ajouter une condition"
#: code:addons/web/static/src/js/coresetup.js:620
#, python-format
msgid "Still loading..."
msgstr ""
msgstr "Chargement en cours…"
#. module: web
#. openerp-web
@ -2415,7 +2418,7 @@ msgstr "Modifier le workflow"
#: code:addons/web/static/src/js/views.js:1172
#, python-format
msgid "Do you really want to delete this attachment ?"
msgstr ""
msgstr "Voulez-vous réellement supprimer cette pièce jointe ?"
#. module: web
#. openerp-web
@ -2540,7 +2543,7 @@ msgstr "Choisir une date"
#: code:addons/web/static/src/js/search.js:1251
#, python-format
msgid "Search %(field)s for: %(value)s"
msgstr ""
msgstr "Rechercher %(value)s dans %(field)s"
#. module: web
#. openerp-web

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

File diff suppressed because it is too large Load Diff

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-30 22:53+0000\n"
"Last-Translator: Sergio Corato <Unknown>\n"
"PO-Revision-Date: 2012-12-13 19:55+0000\n"
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\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:20+0000\n"
"X-Generator: Launchpad (build 16319)\n"
"X-Launchpad-Export-Date: 2012-12-14 05:48+0000\n"
"X-Generator: Launchpad (build 16369)\n"
#. module: web
#. openerp-web
@ -236,7 +236,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' non è un orario corretto"
#. module: web
#. openerp-web
@ -553,7 +553,7 @@ msgstr "Tipo non letterale sconosciuto "
#: code:addons/web/static/src/js/view_form.js:2345
#, python-format
msgid "Resource error"
msgstr ""
msgstr "Errore risorsa"
#. module: web
#. openerp-web
@ -595,7 +595,7 @@ msgstr "Per maggiori informazioni visita"
#: code:addons/web/static/src/xml/base.xml:1834
#, python-format
msgid "Add All Info..."
msgstr ""
msgstr "Aggiungi tutte le informazioni ..."
#. module: web
#. openerp-web
@ -623,7 +623,7 @@ msgstr "Campi modello %s"
#: code:addons/web/static/src/js/view_list.js:890
#, python-format
msgid "Setting 'id' attribute on existing record %s"
msgstr ""
msgstr "Imposta l'attributo 'id' su record esistente %s"
#. module: web
#. openerp-web
@ -668,13 +668,14 @@ msgstr "Action ID:"
#, python-format
msgid "Your user's preference timezone does not match your browser timezone:"
msgstr ""
"Il vostro timezone nelle preferenze non coincide al timezone del browser"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:1238
#, python-format
msgid "Field '%s' specified in view could not be found."
msgstr ""
msgstr "Il campo '%s' specificato nella vista non può essere trovato."
#. module: web
#. openerp-web
@ -695,21 +696,21 @@ msgstr "Vecchia Password:"
#: code:addons/web/static/src/js/formats.js:113
#, python-format
msgid "Bytes,Kb,Mb,Gb,Tb,Pb,Eb,Zb,Yb"
msgstr ""
msgstr "Bytes, Kb, Mb, Gb, Tb, Pb, Eb, Zb, Yb"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:481
#, python-format
msgid "The database has been duplicated."
msgstr ""
msgstr "Il database è stato duplicato."
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1600
#, python-format
msgid "Apply"
msgstr ""
msgstr "Applica"
#. module: web
#. openerp-web
@ -731,7 +732,7 @@ msgstr "Salva come"
#: code:addons/web/static/src/js/view_form.js:2316
#, python-format
msgid "E-mail error"
msgstr ""
msgstr "Errore e-mail"
#. module: web
#. openerp-web
@ -763,6 +764,10 @@ msgid ""
"\n"
"Are you sure you want to leave this page ?"
msgstr ""
"Attenzione, il record è stato modificato, i vostri cambiamenti saranno "
"scartati se non salvati.\n"
"\n"
"Confermare l'abbandono della pagina"
#. module: web
#. openerp-web
@ -790,14 +795,14 @@ msgstr "Delimitatore:"
#: code:addons/web/static/src/xml/base.xml:458
#, python-format
msgid "Browser's timezone"
msgstr ""
msgstr "Timezone del browser"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1580
#, python-format
msgid "Filter name"
msgstr ""
msgstr "Nome del filtro"
#. module: web
#. openerp-web
@ -821,7 +826,7 @@ msgstr "Aggiungi"
#: code:addons/web/static/src/xml/base.xml:530
#, python-format
msgid "Toggle Form Layout Outline"
msgstr ""
msgstr "Passa al layout struttura del form"
#. module: web
#. openerp-web
@ -835,14 +840,14 @@ 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 "Non è possibile inviare mail ad indirizzi non corretti"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:614
#, python-format
msgid "Add..."
msgstr ""
msgstr "Aggiungi..."
#. module: web
#. openerp-web
@ -856,7 +861,7 @@ msgstr "Preferenze"
#: code:addons/web/static/src/js/view_form.js:434
#, python-format
msgid "Wrong on change format: %s"
msgstr ""
msgstr "Errato formato \"on change\": %s"
#. module: web
#. openerp-web
@ -864,14 +869,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:185
#, python-format
msgid "Drop Database"
msgstr ""
msgstr "Elimina database"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:462
#, python-format
msgid "Click here to change your user's timezone."
msgstr ""
msgstr "Cliccare qui per cambiare il timezone personale utente"
#. module: web
#. openerp-web
@ -885,7 +890,7 @@ msgstr "Modificatori:"
#: code:addons/web/static/src/xml/base.xml:605
#, python-format
msgid "Delete this attachment"
msgstr ""
msgstr "Elimina questo allegato"
#. module: web
#. openerp-web
@ -903,7 +908,7 @@ msgstr "Salva"
#: code:addons/web/static/src/xml/base.xml:355
#, python-format
msgid "More"
msgstr ""
msgstr "Altro"
#. module: web
#. openerp-web
@ -917,21 +922,21 @@ msgstr "Utente"
#: code:addons/web/static/src/js/chrome.js:481
#, python-format
msgid "Duplicating database"
msgstr ""
msgstr "Duplicazione database"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:563
#, python-format
msgid "Password has been changed successfully"
msgstr ""
msgstr "Password cambiata con successo"
#. 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 "I dati del form non possono essere scartati"
#. module: web
#. openerp-web
@ -966,6 +971,10 @@ msgid ""
"\n"
"%s"
msgstr ""
"Fallita valutazione locale\n"
"%s\n"
"\n"
"%s"
#. module: web
#. openerp-web
@ -1000,14 +1009,14 @@ msgstr "Data Creazione:"
#: code:addons/web/controllers/main.py:851
#, python-format
msgid "Error, password not changed !"
msgstr ""
msgstr "Errore, la password non è stata cambiata!"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4810
#, python-format
msgid "The selected file exceed the maximum file size of %s."
msgstr ""
msgstr "Il file selezionato eccede la massima dimensione possibile di %s."
#. module: web
#. openerp-web
@ -1015,14 +1024,14 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:1275
#, python-format
msgid "/web/binary/upload_attachment"
msgstr ""
msgstr "/web/binary/upload_attachment"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:563
#, python-format
msgid "Changed Password"
msgstr ""
msgstr "Password modificata"
#. module: web
#. openerp-web
@ -1056,14 +1065,14 @@ msgstr "Backup"
#: code:addons/web/static/src/js/dates.js:80
#, python-format
msgid "'%s' is not a valid time"
msgstr ""
msgstr "'%s' non è un orario valido"
#. 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' non è una data corretta"
#. module: web
#. openerp-web
@ -1117,7 +1126,7 @@ msgstr "Ultima Modifica fatta da:"
#: code:addons/web/static/src/xml/base.xml:466
#, python-format
msgid "Timezone mismatch"
msgstr ""
msgstr "Discordanza timezone"
#. module: web
#. openerp-web
@ -1131,7 +1140,7 @@ msgstr "Operatore %s sconosciuto nel dominio %s"
#: code:addons/web/static/src/js/view_form.js:426
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web
#. openerp-web
@ -1185,7 +1194,7 @@ msgstr "Aggiungi Filtro Avanzato"
#: code:addons/web/controllers/main.py:844
#, python-format
msgid "The new password and its confirmation must be identical."
msgstr ""
msgstr "La nuova password e la sua conferma devono essere identiche."
#. module: web
#. openerp-web
@ -1200,7 +1209,7 @@ msgstr "Ripristina Database"
#: code:addons/web/static/src/js/chrome.js:645
#, python-format
msgid "Login"
msgstr ""
msgstr "Login"
#. module: web
#. openerp-web
@ -1229,21 +1238,21 @@ msgstr "Tipo di esportazione:"
#: code:addons/web/static/src/xml/base.xml:406
#, python-format
msgid "Log out"
msgstr ""
msgstr "Log out"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/search.js:1092
#, python-format
msgid "Group by: %s"
msgstr ""
msgstr "Raggruppa per: %s"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:151
#, python-format
msgid "No data provided."
msgstr ""
msgstr "Nessun dato fornito."
#. module: web
#. openerp-web
@ -1272,7 +1281,7 @@ msgstr "E' necessario selezionare almeno un record."
#: code:addons/web/static/src/js/coresetup.js:622
#, python-format
msgid "Don't leave yet,<br />it's still loading..."
msgstr ""
msgstr "Non abbandonare ora, <br />caricamento in corso..."
#. module: web
#. openerp-web
@ -1286,7 +1295,7 @@ msgstr "Ricerca Non Valida"
#: code:addons/web/static/src/js/view_list.js:959
#, python-format
msgid "Could not find id in dataset"
msgstr ""
msgstr "Non è possibile trovare l'id nel set di dati"
#. module: web
#. openerp-web
@ -1314,7 +1323,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 conferma password non combacia con la password"
#. module: web
#. openerp-web
@ -1353,7 +1362,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:393
#, python-format
msgid "99+"
msgstr ""
msgstr "99+"
#. module: web
#. openerp-web
@ -1367,7 +1376,7 @@ msgstr "1. Importa un file .CSV"
#: code:addons/web/static/src/js/chrome.js:645
#, python-format
msgid "No database selected !"
msgstr ""
msgstr "Nessun database selezionato!"
#. module: web
#. openerp-web
@ -1388,7 +1397,7 @@ msgstr "Cambia default:"
#: code:addons/web/static/src/xml/base.xml:171
#, python-format
msgid "Original database name:"
msgstr ""
msgstr "Nome originale database:"
#. module: web
#. openerp-web
@ -1405,14 +1414,14 @@ msgstr "è uguale a"
#: code:addons/web/static/src/js/views.js:1455
#, python-format
msgid "Could not serialize XML"
msgstr ""
msgstr "Non è possibile serializzare l'XML"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1594
#, python-format
msgid "Advanced Search"
msgstr ""
msgstr "Ricerca avanzata"
#. module: web
#. openerp-web
@ -1427,6 +1436,8 @@ msgstr "Conferma nuova password principale"
#, python-format
msgid "Maybe you should consider reloading the application by pressing F5..."
msgstr ""
"Probabilmente dovreste effettuare un reload dell'applicazione premendo il "
"tasto F5..."
#. module: web
#. openerp-web
@ -1458,7 +1469,7 @@ msgstr "Opzioni di importazione"
#: code:addons/web/static/src/js/view_form.js:2909
#, python-format
msgid "Add %s"
msgstr ""
msgstr "Aggiungi %s"
#. module: web
#. openerp-web
@ -1482,7 +1493,7 @@ msgstr "Chiudi"
#, python-format
msgid ""
"You may not believe it,<br />but the application is actually loading..."
msgstr ""
msgstr "Potrete non crederci,<br />ma l'applicazione è già caricata..."
#. module: web
#. openerp-web
@ -1496,7 +1507,7 @@ msgstr "File CSV:"
#: code:addons/web/static/src/js/search.js:1743
#, python-format
msgid "Advanced"
msgstr ""
msgstr "Avanzate"
#. module: web
#. openerp-web
@ -1509,14 +1520,14 @@ msgstr "Albero"
#: code:addons/web/controllers/main.py:766
#, python-format
msgid "Could not drop database !"
msgstr ""
msgstr "Non è possibile eliminare il database!"
#. 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' non è un intero corretto"
#. module: web
#. openerp-web
@ -1537,21 +1548,21 @@ msgstr "Campo %s sconosciuto nel dominio %s"
#: code:addons/web/static/src/js/views.js:1421
#, python-format
msgid "Node [%s] is not a JSONified XML node"
msgstr ""
msgstr "Il node [%s] non è un nodo JSONified XML"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1403
#, python-format
msgid "Advanced Search..."
msgstr ""
msgstr "Ricerca avanzata..."
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/chrome.js:499
#, python-format
msgid "Dropping database"
msgstr ""
msgstr "Eliminazione database"
#. module: web
#. openerp-web
@ -1574,7 +1585,7 @@ msgstr "Sì"
#: code:addons/web/static/src/js/view_form.js:4831
#, python-format
msgid "There was a problem while uploading your file"
msgstr ""
msgstr "C'è stato un problema durante l'upload del vostro file"
#. module: web
#. openerp-web
@ -1595,28 +1606,28 @@ msgstr "Dimensione:"
#: code:addons/web/static/src/xml/base.xml:1799
#, python-format
msgid "--- Don't Import ---"
msgstr ""
msgstr "--- Non importare ---"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1654
#, python-format
msgid "Import-Compatible Export"
msgstr ""
msgstr "Esportazione compatile alla successiva importazione"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:601
#, python-format
msgid "%d years ago"
msgstr ""
msgstr "%d anni fa'"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_list.js:1019
#, python-format
msgid "Unknown m2m command %s"
msgstr ""
msgstr "Comando m2m sconosciuto %s"
#. module: web
#. openerp-web
@ -1639,14 +1650,14 @@ msgstr "Nome nuovo database:"
#: code:addons/web/static/src/js/chrome.js:394
#, python-format
msgid "Please enter your new password"
msgstr ""
msgstr "Prego Inserire la tua nuova password"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views.js:1463
#, python-format
msgid "Could not parse string to xml"
msgstr ""
msgstr "Non è possibile interpretare la stringa XML"
#. module: web
#. openerp-web
@ -1674,7 +1685,7 @@ msgstr "Linee da saltare"
#: code:addons/web/static/src/js/view_form.js:2831
#, python-format
msgid "Create \"<strong>%s</strong>\""
msgstr ""
msgstr "Creato \"<strong>%s</strong>\""
#. module: web
#. openerp-web
@ -1695,7 +1706,7 @@ msgstr "Copyright © 2004-TODAY OpenERP SA. All Rights Reserved."
#: code:addons/web/static/src/js/view_form.js:2345
#, python-format
msgid "This resource is empty"
msgstr ""
msgstr "Questa risorsa è vuota"
#. module: web
#. openerp-web
@ -1717,7 +1728,7 @@ msgstr "L'importazione è fallita a causa di:"
#: code:addons/web/static/src/xml/base.xml:533
#, python-format
msgid "JS Tests"
msgstr ""
msgstr "JS test"
#. module: web
#. openerp-web
@ -1731,7 +1742,7 @@ msgstr "Salva come:"
#: code:addons/web/static/src/js/search.js:929
#, python-format
msgid "Filter on: %s"
msgstr ""
msgstr "Filtro su: %s"
#. module: web
#. openerp-web
@ -1753,7 +1764,7 @@ msgstr "Campi Vista"
#: code:addons/web/static/src/xml/base.xml:330
#, python-format
msgid "Confirm New Password:"
msgstr ""
msgstr "Conferma la nuova password:"
#. module: web
#. openerp-web
@ -1828,7 +1839,7 @@ msgstr "Caricando ..."
#: code:addons/web/static/src/xml/base.xml:1828
#, python-format
msgid "Name:"
msgstr ""
msgstr "Nome:"
#. module: web
#. openerp-web
@ -1842,7 +1853,7 @@ msgstr "Informazioni"
#: code:addons/web/static/src/xml/base.xml:1406
#, python-format
msgid "Search Again"
msgstr ""
msgstr "Cerca ancora"
#. module: web
#. openerp-web
@ -1874,13 +1885,15 @@ msgid ""
"Grouping on field '%s' is not possible because that field does not appear in "
"the list view."
msgstr ""
"Il raggruppamento sul campo \"%s\" non è possibile perchè il campo non "
"appare nella lista"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:531
#, python-format
msgid "Set Defaults"
msgstr ""
msgstr "Imposta predefiniti"
#. module: web
#. openerp-web
@ -1902,7 +1915,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 "Il record non può essere trovato nel database"
#. module: web
#. openerp-web
@ -1923,7 +1936,7 @@ msgstr "Tipo:"
#: code:addons/web/static/src/js/chrome.js:538
#, python-format
msgid "Incorrect super-administrator password"
msgstr ""
msgstr "Password di super-admin non corretta"
#. module: web
#. openerp-web
@ -1965,6 +1978,8 @@ msgid ""
"The type of the field '%s' must be a many2many field with a relation to "
"'ir.attachment' model."
msgstr ""
"Il tipo del campo \"%s\" deve essere: \"molti a molti\" con una relazione al "
"modello \"ir.attachment\"."
#. module: web
#. openerp-web
@ -1986,7 +2001,7 @@ msgstr "Aggiungi: "
#: code:addons/web/static/src/xml/base.xml:1833
#, python-format
msgid "Quick Add"
msgstr ""
msgstr "Aggiungi (rapido)"
#. module: web
#. openerp-web
@ -2029,14 +2044,14 @@ msgstr "Caricadati dimostrativi:"
#: code:addons/web/static/src/js/dates.js:26
#, python-format
msgid "'%s' is not a valid datetime"
msgstr ""
msgstr "\"%s\" non è un valido \"datetime\""
#. 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 "Non è possibile trovare un interprete DOM : \"%s\""
#. module: web
#. openerp-web
@ -2116,14 +2131,14 @@ msgstr "Download \"%s\""
#: code:addons/web/static/src/js/view_form.js:324
#, python-format
msgid "New"
msgstr ""
msgstr "Nuovo"
#. 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 "Non è possibile convertire il valore %s a context"
#. module: web
#. openerp-web
@ -2189,34 +2204,34 @@ msgstr "è falso"
#: code:addons/web/static/src/xml/base.xml:404
#, python-format
msgid "About OpenERP"
msgstr ""
msgstr "Informazioni su OpenERP"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/formats.js:297
#, python-format
msgid "'%s' is not a correct date, datetime nor time"
msgstr ""
msgstr "\"%s\" non è una data corretta, datetime e neppure orario"
#. module: web
#: code:addons/web/controllers/main.py:1306
#, python-format
msgid "No content found for field '%s' on '%s:%s'"
msgstr ""
msgstr "Nessun contenuto trovato per il campo \"%s\" su \"%s:%s\""
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:304
#, python-format
msgid "Database Management"
msgstr ""
msgstr "Gestione Database"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4971
#, python-format
msgid "Image"
msgstr ""
msgstr "Immagine"
#. module: web
#. openerp-web
@ -2230,7 +2245,7 @@ msgstr "Gestisci Database"
#: code:addons/web/static/src/js/pyeval.js:765
#, python-format
msgid "Evaluation Error"
msgstr ""
msgstr "Errore valutazione"
#. module: web
#. openerp-web
@ -2249,7 +2264,7 @@ msgstr "intero non valido"
#: code:addons/web/static/src/xml/base.xml:1605
#, python-format
msgid "or"
msgstr ""
msgstr "o"
#. module: web
#. openerp-web
@ -2263,7 +2278,7 @@ msgstr "No"
#: code:addons/web/static/src/js/formats.js:309
#, python-format
msgid "'%s' is not convertible to date, datetime nor time"
msgstr ""
msgstr "\"%s\" non è convertibile ad una data, datetime o orario"
#. module: web
#. openerp-web
@ -2281,21 +2296,21 @@ msgstr "Duplica"
#: code:addons/web/static/src/xml/base.xml:1366
#, python-format
msgid "Discard"
msgstr ""
msgstr "Scarta"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1599
#, python-format
msgid "Add a condition"
msgstr ""
msgstr "Aggiungi una condizione"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/coresetup.js:620
#, python-format
msgid "Still loading..."
msgstr ""
msgstr "Ancora in caricamento..."
#. module: web
#. openerp-web
@ -2310,6 +2325,7 @@ msgstr "Valore non valido per campo %(fieldname)s: [%(value)s] è %(message)s"
#, python-format
msgid "The o2m record must be saved before an action can be used"
msgstr ""
"I record o2m devono essere salvati prima che l'azione possa essere usata"
#. module: web
#. openerp-web
@ -2323,21 +2339,21 @@ msgstr "Salvato"
#: code:addons/web/static/src/xml/base.xml:1585
#, python-format
msgid "Use by default"
msgstr ""
msgstr "Utilizza per default"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:4846
#, python-format
msgid "The field is empty, there's nothing to save !"
msgstr ""
msgstr "Questo campo è vuoto, non c'è nulla da salvare!"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_list.js:1327
#, python-format
msgid "%s (%d)"
msgstr ""
msgstr "%s (%d)"
#. module: web
#. openerp-web
@ -2351,7 +2367,7 @@ msgstr "avviato da vista ricerca"
#: code:addons/web/static/src/js/search.js:980
#, python-format
msgid "Filter"
msgstr ""
msgstr "Filtro"
#. module: web
#. openerp-web
@ -2393,14 +2409,14 @@ msgstr "Modifica Workflow"
#: code:addons/web/static/src/js/views.js:1172
#, python-format
msgid "Do you really want to delete this attachment ?"
msgstr ""
msgstr "Volete veramente cancellare questo allegato?"
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/views.js:838
#, python-format
msgid "Technical Translation"
msgstr ""
msgstr "Traduzione tecnica"
#. module: web
#. openerp-web
@ -2414,14 +2430,14 @@ msgstr "Campo:"
#: code:addons/web/static/src/js/chrome.js:499
#, python-format
msgid "The database %s has been dropped"
msgstr ""
msgstr "Il database %s è stato eliminato"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:456
#, python-format
msgid "User's timezone"
msgstr ""
msgstr "Timezone utente"
#. module: web
#. openerp-web
@ -2436,7 +2452,7 @@ msgstr "Errore Client"
#: code:addons/web/static/src/js/views.js:996
#, python-format
msgid "Print"
msgstr ""
msgstr "Stampa"
#. module: web
#. openerp-web
@ -2451,6 +2467,7 @@ msgstr "Speciale:"
msgid ""
"The old password you provided is incorrect, your password was not changed."
msgstr ""
"La vecchia password fornita non è corretta, la password non è stata cambiata."
#. module: web
#. openerp-web
@ -2478,7 +2495,7 @@ msgstr "Salva & Chiudi"
#: code:addons/web/static/src/js/view_form.js:2818
#, python-format
msgid "Search More..."
msgstr ""
msgstr "Cerca Ancora..."
#. module: web
#. openerp-web
@ -2516,21 +2533,21 @@ msgstr "Seleziona data"
#: code:addons/web/static/src/js/search.js:1251
#, python-format
msgid "Search %(field)s for: %(value)s"
msgstr ""
msgstr "Cerca %(field)s per: %(value)s"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:1252
#, python-format
msgid "Delete this file"
msgstr ""
msgstr "Cancella questo file"
#. module: web
#. openerp-web
#: code:addons/web/static/src/xml/base.xml:109
#, python-format
msgid "Create Database"
msgstr ""
msgstr "Crea database"
#. module: web
#. openerp-web

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-26 09:06+0000\n"
"PO-Revision-Date: 2012-12-10 08:54+0000\n"
"Last-Translator: gobi <Unknown>\n"
"Language-Team: Mongolian <mn@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-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\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
@ -208,7 +208,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:1242
#, python-format
msgid "Widget type '%s' is not implemented"
msgstr ""
msgstr "'%s' төрөлийн виджет хийгдээгүй"
#. 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' төрөлийн харагдац нь Нэг нь Олонтой дотор дэмжигдэхгүй"
#. 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

File diff suppressed because it is too large Load Diff

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-05 10:11+0000\n"
"Last-Translator: Rui Franco (multibase.pt) <Unknown>\n"
"PO-Revision-Date: 2012-12-10 17:13+0000\n"
"Last-Translator: Virgílio Oliveira <virgilio.oliveira@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-06 04:54+0000\n"
"X-Generator: Launchpad (build 16341)\n"
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\n"
#. module: web
#. openerp-web
@ -206,7 +206,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:1242
#, python-format
msgid "Widget type '%s' is not implemented"
msgstr ""
msgstr "Elemento do tipo '%s' não está implementado"
#. module: web
#. openerp-web
@ -519,7 +519,7 @@ msgstr "Operador não suportado %s no domínio %s"
#: code:addons/web/static/src/js/formats.js:242
#, python-format
msgid "'%s' is not a correct float"
msgstr ""
msgstr "'%s' não é um número fracional correto"
#. module: web
#. openerp-web
@ -547,14 +547,14 @@ msgstr "Criar e editar"
#: code:addons/web/static/src/js/pyeval.js:731
#, python-format
msgid "Unknown nonliteral type "
msgstr ""
msgstr "Tipo não literal desconhecido "
#. module: web
#. openerp-web
#: code:addons/web/static/src/js/view_form.js:2345
#, python-format
msgid "Resource error"
msgstr ""
msgstr "Erro de recurso"
#. module: web
#. openerp-web
@ -596,7 +596,7 @@ msgstr "Para mais informações visite"
#: code:addons/web/static/src/xml/base.xml:1834
#, python-format
msgid "Add All Info..."
msgstr ""
msgstr "Adicionar toda a informação..."
#. module: web
#. openerp-web
@ -624,7 +624,7 @@ msgstr "Campos %s modelo"
#: code:addons/web/static/src/js/view_list.js:890
#, python-format
msgid "Setting 'id' attribute on existing record %s"
msgstr ""
msgstr "Atribuição do atributo 'id' no registo %s já existente"
#. module: web
#. openerp-web
@ -676,7 +676,7 @@ msgstr ""
#: code:addons/web/static/src/js/view_form.js:1238
#, python-format
msgid "Field '%s' specified in view could not be found."
msgstr ""
msgstr "Campo '%s' especificado na vista não foi encontrado."
#. module: web
#. openerp-web
@ -718,7 +718,7 @@ msgstr "Aplicar"
#: code:addons/web/static/src/xml/base.xml:1361
#, python-format
msgid "Save & New"
msgstr ""
msgstr "Gravar & criar"
#. module: web
#. openerp-web
@ -733,7 +733,7 @@ msgstr "Guardar como"
#: code:addons/web/static/src/js/view_form.js:2316
#, python-format
msgid "E-mail error"
msgstr ""
msgstr "Erro de e-mail"
#. module: web
#. openerp-web
@ -861,7 +861,7 @@ msgstr "Preferências"
#: code:addons/web/static/src/js/view_form.js:434
#, python-format
msgid "Wrong on change format: %s"
msgstr ""
msgstr "Erro na alteração de formato: %s"
#. module: web
#. openerp-web
@ -890,7 +890,7 @@ msgstr "Modificadores:"
#: code:addons/web/static/src/xml/base.xml:605
#, python-format
msgid "Delete this attachment"
msgstr ""
msgstr "Apagar este anexo"
#. module: web
#. openerp-web
@ -922,7 +922,7 @@ msgstr "Nome de utilizador"
#: code:addons/web/static/src/js/chrome.js:481
#, python-format
msgid "Duplicating database"
msgstr ""
msgstr "Duplicando a base de dados"
#. module: web
#. openerp-web
@ -936,7 +936,7 @@ msgstr "A senha foi alterada com êxito"
#: code:addons/web/static/src/js/view_list_editable.js:781
#, python-format
msgid "The form's data can not be discarded"
msgstr ""
msgstr "A informação no formulário não pode ser descartada"
#. module: web
#. openerp-web
@ -971,6 +971,10 @@ msgid ""
"\n"
"%s"
msgstr ""
"Falha na avaliação local\n"
"%s\n"
"\n"
"%s"
#. module: web
#. openerp-web
@ -1012,7 +1016,7 @@ msgstr "Erro, a senha não foi alterada!"
#: code:addons/web/static/src/js/view_form.js:4810
#, python-format
msgid "The selected file exceed the maximum file size of %s."
msgstr ""
msgstr "O ficheiro selecionado excede o tamanho máximo de %s."
#. module: web
#. openerp-web
@ -1061,7 +1065,7 @@ msgstr "Cópia de segurança"
#: code:addons/web/static/src/js/dates.js:80
#, python-format
msgid "'%s' is not a valid time"
msgstr ""
msgstr "'%s' não é uma hora válida"
#. module: web
#. openerp-web
@ -1249,7 +1253,7 @@ msgstr "Agrupar por: %s"
#: code:addons/web/static/src/js/view_form.js:151
#, python-format
msgid "No data provided."
msgstr ""
msgstr "Ausência de dados"
#. module: web
#. openerp-web
@ -1278,7 +1282,7 @@ msgstr "Deve escolher pelo menos um registo."
#: code:addons/web/static/src/js/coresetup.js:622
#, python-format
msgid "Don't leave yet,<br />it's still loading..."
msgstr ""
msgstr "Não se vá embora já<br />porque ainda está carregando..."
#. module: web
#. openerp-web
@ -1292,7 +1296,7 @@ msgstr "Pesquisa inválida"
#: code:addons/web/static/src/js/view_list.js:959
#, python-format
msgid "Could not find id in dataset"
msgstr ""
msgstr "O ID não foi encontrado"
#. module: web
#. openerp-web
@ -1320,7 +1324,7 @@ msgstr "%(page)d/%(page_count)d"
#: code:addons/web/static/src/js/chrome.js:397
#, python-format
msgid "The confirmation does not match the password"
msgstr ""
msgstr "A confirmação não coincide com a senha"
#. module: web
#. openerp-web
@ -1411,7 +1415,7 @@ msgstr "é igual a"
#: code:addons/web/static/src/js/views.js:1455
#, python-format
msgid "Could not serialize XML"
msgstr ""
msgstr "Não foi possível serializar o XML"
#. module: web
#. openerp-web
@ -1432,7 +1436,7 @@ msgstr "Confirme a nova senha de administração:"
#: code:addons/web/static/src/js/coresetup.js:625
#, python-format
msgid "Maybe you should consider reloading the application by pressing F5..."
msgstr ""
msgstr "Talvez deva pensar em recarregar a aplicação carregando em F5..."
#. module: web
#. openerp-web
@ -1522,7 +1526,7 @@ msgstr "Não foi possível eliminar a base de dados!"
#: code:addons/web/static/src/js/formats.js:227
#, python-format
msgid "'%s' is not a correct integer"
msgstr ""
msgstr "'%s' não é um número inteiro correto"
#. module: web
#. openerp-web
@ -1543,7 +1547,7 @@ msgstr "Campo desconhecido %s no domínio %s"
#: code:addons/web/static/src/js/views.js:1421
#, python-format
msgid "Node [%s] is not a JSONified XML node"
msgstr ""
msgstr "O nó [%s] não é do tipo JSONified XML"
#. module: web
#. openerp-web
@ -1608,7 +1612,7 @@ msgstr "--- Não importar ---"
#: code:addons/web/static/src/xml/base.xml:1654
#, python-format
msgid "Import-Compatible Export"
msgstr ""
msgstr "Exportação compatível com importação"
#. module: web
#. openerp-web
@ -1622,7 +1626,7 @@ msgstr "%d anos atrás"
#: code:addons/web/static/src/js/view_list.js:1019
#, python-format
msgid "Unknown m2m command %s"
msgstr ""
msgstr "Comando m2m %s desconhecio"
#. module: web
#. openerp-web
@ -1652,7 +1656,7 @@ msgstr "Por favor introduza a sua nova senha"
#: code:addons/web/static/src/js/views.js:1463
#, python-format
msgid "Could not parse string to xml"
msgstr ""
msgstr "Não foi possível passar o texto para XML"
#. module: web
#. openerp-web
@ -1724,7 +1728,7 @@ msgstr "A importação falhou devido a:"
#: code:addons/web/static/src/xml/base.xml:533
#, python-format
msgid "JS Tests"
msgstr ""
msgstr "Testes JS"
#. module: web
#. openerp-web
@ -1930,7 +1934,7 @@ msgstr "Tipo:"
#: code:addons/web/static/src/js/chrome.js:538
#, python-format
msgid "Incorrect super-administrator password"
msgstr ""
msgstr "Senha de super-administrador incorreta"
#. module: web
#. openerp-web
@ -2043,7 +2047,7 @@ msgstr "'%s' não é uma data/hora correta"
#: code:addons/web/static/src/js/views.js:1471
#, python-format
msgid "Could not find a DOM Parser: %s"
msgstr ""
msgstr "Não foi encontrado o interpretador de DOM: %s"
#. module: web
#. openerp-web
@ -2403,7 +2407,7 @@ msgstr "Editar fluxo de trabalho"
#: code:addons/web/static/src/js/views.js:1172
#, python-format
msgid "Do you really want to delete this attachment ?"
msgstr ""
msgstr "Quer mesmo apagar este anexo?"
#. module: web
#. openerp-web
@ -2469,7 +2473,7 @@ msgstr ""
#: code:addons/web/static/src/xml/base.xml:555
#, python-format
msgid "Creation User:"
msgstr ""
msgstr "Utilizador de criação:"
#. module: web
#. openerp-web
@ -2535,7 +2539,7 @@ msgstr "Pesquisar %(field)s por: %(value)s"
#: code:addons/web/static/src/xml/base.xml:1252
#, python-format
msgid "Delete this file"
msgstr ""
msgstr "Apagar este ficheiro"
#. module: web
#. openerp-web

View File

@ -8,14 +8,15 @@ 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-16 22:21+0000\n"
"Last-Translator: Fábio Martinelli - http://zupy.com.br "
"<webmaster@guaru.net>\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-17 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web
#. openerp-web
@ -29,7 +30,7 @@ msgstr "Idioma padrão:"
#: code:addons/web/static/src/js/coresetup.js:593
#, python-format
msgid "%d minutes ago"
msgstr "%d minutos atrás"
msgstr "%d minutos"
#. module: web
#. openerp-web
@ -75,7 +76,7 @@ msgstr "Senha Super Admin:"
#: code:addons/web/static/src/xml/base.xml:274
#, python-format
msgid "Change Master Password"
msgstr "Alterar senha principal"
msgstr "Alterar Senha Super Admin"
#. module: web
#. openerp-web
@ -860,7 +861,7 @@ msgstr "Preferências"
#: code:addons/web/static/src/js/view_form.js:434
#, python-format
msgid "Wrong on change format: %s"
msgstr ""
msgstr "Formato invalido para on change: %s"
#. module: web
#. openerp-web
@ -1547,7 +1548,7 @@ msgstr "Campo desconhecido %s no domínio %s"
#: code:addons/web/static/src/js/views.js:1421
#, python-format
msgid "Node [%s] is not a JSONified XML node"
msgstr ""
msgstr "O Nó [%s] não é um nó no formato XML JSONified"
#. module: web
#. openerp-web
@ -2050,7 +2051,7 @@ msgstr "'%s' não é uma data válida"
#: code:addons/web/static/src/js/views.js:1471
#, python-format
msgid "Could not find a DOM Parser: %s"
msgstr ""
msgstr "Não foi possível encontrar um Interpretador DOM: %s"
#. module: web
#. openerp-web

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2552
addons/web/i18n/th.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -186,6 +186,6 @@ class OpenERPSession(object):
if lang in babel.core.LOCALE_ALIASES:
lang = babel.core.LOCALE_ALIASES[lang]
context['lang'] = lang
context['lang'] = lang or 'en_US'
# vim:et:ts=4:sw=4:

View File

@ -8952,7 +8952,8 @@ $.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).zIndex() < $.ui.dialog.overlay.maxZ &&
$(event.target).closest('.ui-dialog').zIndex() < $.ui.dialog.overlay.maxZ) {
return false;
}
});

View File

@ -6484,9 +6484,9 @@ jQuery.uaMatch = function( ua ) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
/(webkit)[ \/]([\w.]+)/.exec( ua ) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
/(msie) ([\w.]+)/.exec( ua ) ||
(/(webkit)[ \/]([\w.]+)/.exec( ua )) ||
(/(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua )) ||
(/(msie) ([\w.]+)/.exec( ua )) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
[];

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]) {

View File

@ -43,6 +43,10 @@
color: #afafb6 !important;
font-style: italic !important;
}
.openerp :-ms-input-placeholder {
color: #afafb6 !important;
font-style: italic !important;
}
.openerp a {
text-decoration: none;
cursor: pointer !important;
@ -608,6 +612,9 @@
}
.openerp .oe_notebook > li > a {
display: block;
color: gray;
}
.openerp .oe_notebook > li.ui-tabs-active > a {
color: #4c4c4c;
}
.openerp .oe_notebook {
@ -703,6 +710,9 @@
display: block;
color: #4c4c4c;
text-decoration: none;
width: 200px;
text-overflow: ellipsis;
overflow: hidden;
}
.openerp .oe_dropdown_menu > li > a:hover {
text-decoration: none;
@ -809,6 +819,16 @@
margin-top: 1px;
background-color: #f6cf3b;
}
.openerp .oe_dialog_warning {
width: 100%;
}
.openerp .oe_dialog_warning p {
text-align: center;
}
.openerp .oe_dialog_icon {
padding: 5px;
width: 32px;
}
.openerp .oe_login {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=);
text-align: center;
@ -988,6 +1008,39 @@
background-image: -o-linear-gradient(top, #646060, #262626);
background-image: linear-gradient(to bottom, #646060, #262626);
}
.openerp .oe_topbar .oe_topbar_anonymous_login {
background-color: #dc5f59;
color: #eeeeee;
background-color: #fc8787;
background-image: -webkit-gradient(linear, left top, left bottom, from(#fc8787), to(maroon));
background-image: -webkit-linear-gradient(top, #fc8787, maroon);
background-image: -moz-linear-gradient(top, #fc8787, maroon);
background-image: -ms-linear-gradient(top, #fc8787, maroon);
background-image: -o-linear-gradient(top, #fc8787, maroon);
background-image: linear-gradient(to bottom, #fc8787, maroon);
}
.openerp .oe_topbar .oe_topbar_anonymous_login a {
display: block;
padding: 5px 10px 7px;
line-height: 20px;
height: 20px;
text-decoration: none;
color: white;
background: transparent;
-webkit-transition: all 0.2s ease-out;
-moz-transition: all 0.2s ease-out;
-ms-transition: all 0.2s ease-out;
-o-transition: all 0.2s ease-out;
transition: all 0.2s ease-out;
}
.openerp .oe_topbar .oe_topbar_anonymous_login a:hover {
background: rgba(0, 0, 0, 0.1);
color: white;
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
}
.openerp .oe_topbar .oe_topbar_item {
display: block;
padding: 5px 10px 7px;
@ -1059,6 +1112,14 @@
-webkit-box-shadow: none;
box-shadow: none;
}
.openerp .oe_topbar .oe_topbar_name {
max-width: 150px;
overflow: hidden;
display: inline-block;
max-height: 100%;
text-overflow: ellipsis;
white-space: nowrap;
}
.openerp .oe_menu {
float: left;
padding: 0;
@ -1131,18 +1192,33 @@
padding-bottom: 16px;
}
.openerp a.oe_logo {
position: relative;
width: 220px;
display: block;
text-align: center;
height: 70px;
line-height: 70px;
}
.openerp a.oe_logo img {
height: 40px;
width: 157px;
margin: 14px 0;
border: 0;
}
.openerp a.oe_logo .oe_logo_edit {
margin: 14px 0;
position: absolute;
top: 1px;
padding: 4px;
width: 100%;
display: none;
text-align: center;
color: #eeeeee;
background: rgba(37, 37, 37, 0.9);
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
.openerp a.oe_logo:hover .oe_logo_edit_admin {
display: block;
}
.openerp .oe_footer {
position: fixed;
bottom: 0;
@ -1152,14 +1228,11 @@
text-align: center;
}
.openerp .oe_footer a {
font-weight: 800;
font-family: serif;
font-size: 16px;
font-weight: bold;
color: black;
}
.openerp .oe_footer a span {
color: #c81010;
font-style: italic;
}
.openerp .oe_secondary_menu_section {
font-weight: bold;
@ -1192,7 +1265,7 @@
color: white;
padding: 2px 4px;
margin: 1px 6px 0 0;
border: 1px solid lightGray;
border: 1px solid lightgrey;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-moz-border-radius: 4px;
-webkit-border-radius: 4px;
@ -1217,7 +1290,7 @@
transform: scale(1.1);
}
.openerp .oe_secondary_submenu .oe_active {
border-top: 1px solid lightGray;
border-top: 1px solid lightgrey;
border-bottom: 1px solid #dedede;
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2), inset 0 -1px 3px rgba(40, 40, 40, 0.2);
@ -1322,12 +1395,14 @@
height: 100%;
}
.openerp .oe_application .oe_breadcrumb_item:not(:last-child) {
display: inline-block;
max-width: 7em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.openerp .oe_application .oe_breadcrumb_title > * {
display: inline-block;
overflow: hidden;
}
.openerp .oe_view_manager .oe_view_manager_body {
height: inherit;
}
@ -1335,6 +1410,7 @@
height: inherit;
}
.openerp .oe_view_manager table.oe_view_manager_header {
border-collapse: separate;
width: 100%;
table-layout: fixed;
}
@ -2018,6 +2094,12 @@
margin: -16px -16px 0 -16px;
padding: 0;
}
.openerp .oe_form_nosheet.oe_form_nomargin {
margin: 0;
}
.openerp .oe_form_nosheet.oe_form_nomargin > header {
margin: 0;
}
.openerp .oe_form_sheetbg {
padding: 16px 0;
}
@ -2031,6 +2113,9 @@
min-height: 330px;
padding: 16px;
}
.openerp .oe_form_sheet .oe_list {
overflow-x: auto;
}
.openerp .oe_application .oe_form_sheetbg {
background: url(/web/static/src/img/form_sheetbg.png);
border-bottom: 1px solid #dddddd;
@ -2154,7 +2239,7 @@
}
.openerp .oe_form .oe_form_label_help[for] span, .openerp .oe_form .oe_form_label[for] span {
font-size: 80%;
color: darkGreen;
color: darkgreen;
vertical-align: top;
position: relative;
top: -4px;
@ -2535,6 +2620,7 @@
background: -moz-linear-gradient(135deg, #dedede, #fcfcfc);
background: -o-linear-gradient(135deg, #fcfcfc, #dedede);
background: -webkit-gradient(linear, left top, right bottom, from(#fcfcfc), to(#dedede));
background: -ms-linear-gradient(top, #fcfcfc, #dedede);
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
@ -2558,6 +2644,7 @@
background: -moz-linear-gradient(135deg, #3465a4, #729fcf);
background: -o-linear-gradient(135deg, #729fcf, #3465a4);
background: -webkit-gradient(linear, left top, right bottom, from(#729fcf), to(#3465a4));
background: -ms-linear-gradient(top, #729fcf, #3465a4);
}
.openerp ul.oe_form_status li.oe_active .label, .openerp ul.oe_form_status_clickable li.oe_active .label {
color: white;
@ -2607,6 +2694,7 @@
background: -moz-linear-gradient(135deg, #284d7d, #4c85c2);
background: -o-linear-gradient(135deg, #4c85c2, #284d7d);
background: -webkit-gradient(linear, left top, right bottom, from(#4c85c2), to(#284d7d));
background: -ms-linear-gradient(top, #4c85c2, #284d7d);
}
.openerp .oe_form .oe_form_field_one2many > .oe_view_manager .oe_list_pager_single_page {
display: none;
@ -3039,6 +3127,69 @@ div.ui-widget-overlay {
border-radius: 3px;
}
.openerp_ie input[type='checkbox'] {
border: none;
background: none;
box-shadow: none;
}
.openerp_ie .oe_logo img {
border: none;
}
.openerp_ie .oe_header_row button.oe_highlight {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_view_manager_buttons button.oe_write_full {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_view_manager_buttons button.oe_highlight {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_view_manager_buttons button .oe_form_button_edit {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_view_manager_buttons button .oe_form_button_create {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_kanban_image {
border: none;
}
.openerp_ie .oe_msg_icon {
border: none;
}
.openerp_ie .oe_form header ul {
height: 29px;
}
.openerp_ie .oe_attach {
filter: none;
}
.openerp_ie .oe_link {
filter: none;
}
.openerp_ie .oe_kanban_show_more {
clear: both;
text-align: center;
}
.openerp_ie.oe_kanban_grouped .oe_kanban_show_more .oe_button {
width: 100%;
padding: 3px 12px;
}
.openerp_ie .oe_form_buttons button {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_sidebar button {
padding-top: 0;
padding-bottom: 0;
}
.openerp_ie .oe_form_field.oe_tags {
float: left;
}
@media print {
.openerp {
text-shadow: none;
@ -3065,6 +3216,9 @@ div.ui-widget-overlay {
border: 0px !important;
box-shadow: 0px 0px 0px;
}
.openerp .oe_application .oe_form_sheet .oe_list, .openerp .oe_application .oe_form_sheetbg .oe_list {
overflow-x: visible;
}
.openerp .oe_view_manager_current > .oe_view_manager_header {
border: 0px !important;
box-shadow: 0px 0px 0px;
@ -3076,3 +3230,7 @@ div.ui-widget-overlay {
overflow: hidden !important;
}
}
.blockUI.blockOverlay {
background-color: black;
opacity: 0.6;
}

View File

@ -95,6 +95,7 @@ $sheet-padding: 16px
background: -moz-linear-gradient(135deg, $endColor, $startColor)
background: -o-linear-gradient(135deg, $startColor, $endColor)
background: -webkit-gradient(linear, left top, right bottom, from($startColor), to($endColor))
background: -ms-linear-gradient(top, $startColor, $endColor) /* IE10 */
@mixin transform($transform)
-webkit-transform: $transform
@ -159,6 +160,9 @@ $sheet-padding: 16px
\::-webkit-input-placeholder
color: $tag-border !important
font-style: italic !important
\:-ms-input-placeholder
color: $tag-border !important
font-style: italic !important
//}}}
// Tag reset {{{
a
@ -530,6 +534,8 @@ $sheet-padding: 16px
float: left
.oe_notebook > li > a
display: block
color: #808080
.oe_notebook > li.ui-tabs-active > a
color: #4c4c4c
.oe_notebook
border-color: #ddd
@ -598,6 +604,9 @@ $sheet-padding: 16px
display: block
color: #4c4c4c
text-decoration: none
width: 200px
text-overflow: ellipsis
overflow: hidden
&:hover
text-decoration: none
.oe_dropdown_arrow:after
@ -687,6 +696,15 @@ $sheet-padding: 16px
margin-top: 1px
background-color: #f6cf3b
// }}}
// CrashManager {{{
.oe_dialog_warning
width: 100%
p
text-align: center
.oe_dialog_icon
padding: 5px
width: 32px
// }}}
// Login {{{
.oe_login
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAKUlEQVQIHWO8e/fufwYsgAUkJigoiCIF5DMyoYggcUiXgNnBiGQKmAkARpcEQeriln4AAAAASUVORK5CYII=)
@ -818,6 +836,24 @@ $sheet-padding: 16px
height: 32px
background-color: #414141
@include vertical-gradient(#646060, #262626)
.oe_topbar_anonymous_login
background-color: #dc5f59
color: #eeeeee
@include vertical-gradient(#FC8787, #800000)
a
display: block
padding: 5px 10px 7px
line-height: 20px
height: 20px
text-decoration: none
color: white
background: transparent
@include transition(all 0.2s ease-out)
a:hover
background: rgba(0,0,0,0.1)
color: white
text-shadow: 0px 0px 3px rgba(0,0,0,0.2)
@include box-shadow(0 1px 2px rgba(0,0,0,0.2) inset)
.oe_topbar_item
display: block
padding: 5px 10px 7px
@ -861,6 +897,13 @@ $sheet-padding: 16px
&:hover
@include vertical-gradient(#292929, #191919)
@include box-shadow(none)
.oe_topbar_name
max-width: 150px
overflow: hidden
display: inline-block
max-height: 100%
text-overflow: ellipsis
white-space: nowrap
// oe menu is the list of the buttons on the left side of the bar.
// So why aren't the buttons oe_topbar_items ? This sad state of affairs
@ -924,16 +967,26 @@ $sheet-padding: 16px
text-shadow: 0 1px 1px white
padding-bottom: 16px
a.oe_logo
position: relative
width: 220px
display: block
text-align: center
height: 70px
line-height: 70px
img
height: 40px
width: 157px
margin: 14px 0
border: 0
.oe_logo_edit
margin: 14px 0
position: absolute
top: 1px
padding: 4px
width: 100%
display: none
text-align: center
color: #eee
background: rgba(37,37,37,0.9)
@include box-sizing(border)
&:hover .oe_logo_edit_admin
display: block
.oe_footer
position: fixed
bottom: 0
@ -942,13 +995,10 @@ $sheet-padding: 16px
width: 220px
text-align: center
a
font-weight: 800
font-family: serif
font-size: 16px
font-weight: bold
color: black
span
color: #c81010
font-style: italic
// }}}
// Webclient.leftbar items {{{
@ -1069,11 +1119,12 @@ $sheet-padding: 16px
> div
height: 100%
.oe_breadcrumb_item:not(:last-child)
display: inline-block
max-width: 7em
white-space: nowrap
overflow: hidden
text-overflow: ellipsis
.oe_breadcrumb_title > *
display: inline-block
overflow: hidden
// }}}
// ViewManager common {{{
.oe_view_manager
@ -1083,6 +1134,7 @@ $sheet-padding: 16px
height: inherit
table.oe_view_manager_header
border-collapse: separate
width: 100%
table-layout: fixed
.oe_header_row
@ -1606,6 +1658,10 @@ $sheet-padding: 16px
> header
margin: -16px -16px 0 -16px
padding: 0
.oe_form_nosheet.oe_form_nomargin
margin: 0
> header
margin: 0
.oe_form_sheetbg
padding: 16px 0
.oe_form_sheet_width
@ -1616,6 +1672,8 @@ $sheet-padding: 16px
background: white
min-height: 330px
padding: 16px
.oe_list
overflow-x: auto
// Sheet inline mode
.oe_application
.oe_form_sheetbg
@ -1653,7 +1711,7 @@ $sheet-padding: 16px
width: 400px
padding-bottom: 0
div.oe_chatter
box-sizing: border-box
box-sizing: border-box
min-width: $sheet-min-width + 2* $sheet-padding
max-width: $sheet-max-width + 2* $sheet-padding
margin: 0 auto
@ -1925,7 +1983,7 @@ $sheet-padding: 16px
overflow: hidden
width: 24px
overflow: hidden
background: transparent
background: transparent
color: #7C7BAD
box-shadow: none
border: none
@ -2409,6 +2467,63 @@ div.ui-widget-overlay
@include radius(3px)
// }}}
// Internet Explorer 9+ specifics {{{
.openerp_ie
input[type='checkbox']
border: none
background: none
box-shadow: none
.oe_logo
img
border: none
.oe_header_row
button.oe_highlight
padding-top: 0
padding-bottom: 0
.oe_view_manager_buttons
button.oe_write_full
padding-top: 0
padding-bottom: 0
button.oe_highlight
padding-top: 0
padding-bottom: 0
button .oe_form_button_edit
padding-top: 0
padding-bottom: 0
button .oe_form_button_create
padding-top: 0
padding-bottom: 0
.oe_kanban_image
border: none
.oe_msg_icon
border: none
.oe_form
header
ul
height: 29px
.oe_attach
filter: none
.oe_link
filter: none
.oe_kanban_show_more
clear: both
text-align: center
&.oe_kanban_grouped .oe_kanban_show_more .oe_button
width: 100%
padding: 3px 12px
.oe_form_buttons button
padding-top: 0
padding-bottom: 0
.oe_sidebar button
padding-top: 0
padding-bottom: 0
.oe_form_field.oe_tags
float: left
// }}}
// @media print {{{
@media print
.openerp
@ -2432,6 +2547,8 @@ div.ui-widget-overlay
.oe_form_sheet, .oe_form_sheetbg
border: 0px !important
box-shadow: 0px 0px 0px
.oe_list
overflow-x: visible
.oe_view_manager_current > .oe_view_manager_header
border: 0px !important
box-shadow: 0px 0px 0px
@ -2442,5 +2559,9 @@ div.ui-widget-overlay
overflow: hidden !important
// }}}
.blockUI.blockOverlay
background-color: black
opacity: 0.6000000238418579
// au BufWritePost,FileWritePost *.sass :!sass --style expanded --line-numbers <afile> > "%:p:r.css"
// vim:tabstop=4:shiftwidth=4:softtabstop=4:fdm=marker:

View File

@ -1,6 +1,12 @@
/* This css contains the styling specific to the 'normal mode'. (as opposite to the embedded mode) */
/* In embedded mode [1], this stylesheet won't be loaded. */
/* [1] The web client features an embedded mode in which the webclient */
/* or a part of it can be started in any element of any webpage host. */
body {
padding: 0;
margin: 0;
overflow-y: scroll;
height: 100%;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -565,8 +565,7 @@ instance.web.DatabaseManager = instance.web.Widget.extend({
},
do_exit: function () {
this.$el.remove();
instance.webclient.toggle_bars(false);
this.do_action('login');
instance.webclient.show_login();
}
});
instance.web.client_actions.add("database_manager", "instance.web.DatabaseManager");
@ -692,6 +691,7 @@ instance.web.Login = instance.web.Widget.extend({
});
instance.web.client_actions.add("login", "instance.web.Login");
/**
* Redirect to url by replacing window.location
* If wait is true, sleep 1s and wait for the server i.e. after a restart.
@ -799,10 +799,25 @@ instance.web.client_actions.add("change_password", "instance.web.ChangePassword"
instance.web.Menu = instance.web.Widget.extend({
template: 'Menu',
init: function() {
var self = this;
this._super.apply(this, arguments);
this.has_been_loaded = $.Deferred();
this.maximum_visible_links = 'auto'; // # of menu to show. 0 = do not crop, 'auto' = algo
this.data = {data:{children:[]}};
this.on("menu_loaded", this, function (menu_data) {
self.reflow();
// launch the fetch of needaction counters, asynchronous
if (!_.isEmpty(menu_data.all_menu_ids)) {
this.rpc("/web/menu/load_needaction", {menu_ids: menu_data.all_menu_ids}).done(function(r) {
self.on_needaction_loaded(r);
});
}
});
var lazyreflow = _.debounce(this.reflow.bind(this), 200);
instance.web.bus.on('resize', this, function() {
self.$el.height(0);
lazyreflow();
});
},
start: function() {
this._super.apply(this, arguments);
@ -818,14 +833,8 @@ instance.web.Menu = instance.web.Widget.extend({
},
menu_loaded: function(data) {
var self = this;
this.data = data;
this.data = {data: data};
this.renderElement();
this.limit_entries();
// Hide toplevel item if there is only one
var $toplevel = this.$("li");
if($toplevel.length == 1) {
$toplevel.hide();
}
this.$secondary_menus.html(QWeb.render("Menu.secondary", { widget : this }));
this.$el.on('click', 'a[data-menu]', this.on_menu_click);
// Hide second level submenus
@ -836,23 +845,45 @@ instance.web.Menu = instance.web.Widget.extend({
this.trigger('menu_loaded', data);
this.has_been_loaded.resolve();
},
limit_entries: function() {
var maximum_visible_links = this.maximum_visible_links;
if (maximum_visible_links === 'auto') {
maximum_visible_links = this.auto_limit_entries();
}
if (maximum_visible_links < this.data.data.children.length) {
var $more = $(QWeb.render('Menu.more')),
$index = this.$el.find('li').eq(maximum_visible_links - 1);
$index.after($more);
//$('.oe_topbar').append($more);
$more.find('.oe_menu_more').append($index.next().nextAll());
}
on_needaction_loaded: function(data) {
var self = this;
this.needaction_data = data;
_.each(this.needaction_data, function (item, menu_id) {
var $item = self.$secondary_menus.find('a[data-menu="' + menu_id + '"]');
$item.remove('oe_menu_counter');
if (item.needaction_counter && item.needaction_counter > 0) {
$item.append(QWeb.render("Menu.needaction_counter", { widget : item }));
}
});
},
auto_limit_entries: function() {
// TODO: auto detect overflow and bind window on resize
var width = $(window).width();
return Math.floor(width / 125);
/**
* Reflow the menu items and dock overflowing items into a "More" menu item.
* Automatically called when 'menu_loaded' event is triggered and on window resizing.
*/
reflow: function() {
var self = this;
this.$el.height('auto').show();
var $more_container = this.$('.oe_menu_more_container').hide();
var $more = this.$('.oe_menu_more');
$more.children('li').insertBefore($more_container);
var $toplevel_items = this.$el.children('li').not($more_container).hide();
$toplevel_items.each(function() {
var remaining_space = self.$el.parent().width() - $more_container.outerWidth();
self.$el.parent().children(':visible').each(function() {
remaining_space -= $(this).outerWidth();
});
if ($(this).width() > remaining_space) {
return false;
}
$(this).show();
});
$more.append($toplevel_items.filter(':hidden').show());
$more_container.toggle(!!$more.children().length);
// Hide toplevel item if there is only one
var $toplevel = this.$el.children("li:visible");
if ($toplevel.length === 1) {
$toplevel.hide();
}
},
/**
* Opens a given menu by id, as if a user had browsed to that menu by hand
@ -1099,9 +1130,14 @@ instance.web.Client = instance.web.Widget.extend({
instance.web.WebClient = instance.web.Client.extend({
_template: 'WebClient',
events: {
'click .oe_logo_edit_admin': 'logo_edit'
},
init: function(parent) {
this._super(parent);
this._current_state = null;
this.menu_dm = new instance.web.DropMisordered();
this.action_mutex = new $.Mutex();
},
start: function() {
var self = this;
@ -1153,6 +1189,7 @@ instance.web.WebClient = instance.web.Client.extend({
show_application: function() {
var self = this;
self.toggle_bars(true);
self.update_logo();
self.menu = new instance.web.Menu(self);
self.menu.replace(this.$el.find('.oe_menu_placeholder'));
self.menu.on('menu_click', this, this.on_menu_action);
@ -1164,6 +1201,32 @@ instance.web.WebClient = instance.web.Client.extend({
self.set_title();
self.check_timezone();
},
update_logo: function() {
var img = this.session.url('/web/binary/company_logo');
this.$('.oe_logo img').attr('src', '').attr('src', img);
this.$('.oe_logo_edit').toggleClass('oe_logo_edit_admin', this.session.uid === 1);
},
logo_edit: function(ev) {
var self = this;
new instance.web.Model("res.users").get_func("read")(this.session.uid, ["company_id"]).then(function(res) {
self.rpc("/web/action/load", { action_id: "base.action_res_company_form" }).done(function(result) {
result.res_id = res['company_id'][0];
result.target = "new";
result.views = [[false, 'form']];
result.flags = {
action_buttons: true,
};
self.action_manager.do_action(result);
var form = self.action_manager.dialog_widget.views.form.controller;
form.on("on_button_cancel", self.action_manager.dialog, self.action_manager.dialog.close);
form.on('record_saved', self, function() {
self.action_manager.dialog.close();
self.update_logo();
});
});
});
return false;
},
check_timezone: function() {
var self = this;
return new instance.web.Model('res.users').call('read', [[this.session.uid], ['tz_offset']]).then(function(result) {
@ -1267,18 +1330,29 @@ instance.web.WebClient = instance.web.Client.extend({
},
on_menu_action: function(options) {
var self = this;
return this.rpc("/web/action/load", { action_id: options.action_id })
return this.menu_dm.add(this.rpc("/web/action/load", { action_id: options.action_id }))
.then(function (result) {
if (options.needaction) {
result.context = new instance.web.CompoundContext(
result.context,
{search_default_message_unread: true});
}
return $.when(self.action_manager.do_action(result, {
clear_breadcrumbs: true,
action_menu_id: self.menu.current_menu,
})).fail(function() {
self.menu.open_menu(options.previous_menu_id);
return self.action_mutex.exec(function() {
if (options.needaction) {
result.context = new instance.web.CompoundContext(
result.context,
{search_default_message_unread: true});
}
var completed = $.Deferred();
$.when(self.action_manager.do_action(result, {
clear_breadcrumbs: true,
action_menu_id: self.menu.current_menu,
})).fail(function() {
self.menu.open_menu(options.previous_menu_id);
}).always(function() {
completed.resolve();
});
setTimeout(function() {
completed.resolve();
}, 2000);
// We block the menu when clicking on an element until the action has correctly finished
// loading. If something crash, there is a 2 seconds timeout before it's unblocked.
return completed;
});
});
},
@ -1306,17 +1380,17 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
_template: 'EmbedClient',
init: function(parent, origin, dbname, login, key, action_id, options) {
this._super(parent, origin);
this.dbname = dbname;
this.login = login;
this.key = key;
this.bind_credentials(dbname, login, key);
this.action_id = action_id;
this.options = options || {};
},
start: function() {
var self = this;
return $.when(this._super()).then(function() {
return instance.session.session_authenticate(self.dbname, self.login, self.key, true).then(function() {
return self.authenticate().then(function() {
if (!self.action_id) {
return;
}
return self.rpc("/web/action/load", { action_id: self.action_id }).done(function(result) {
var action = result;
action.flags = _.extend({
@ -1327,11 +1401,30 @@ instance.web.EmbeddedClient = instance.web.Client.extend({
//pager : false
}, self.options, action.flags || {});
self.action_manager.do_action(action);
self.do_action(action);
});
});
});
},
do_action: function(action) {
return this.action_manager.do_action(action);
},
authenticate: function() {
var s = instance.session;
if (s.session_is_valid() && s.db === this.dbname && s.login === this.login) {
return $.when();
}
return instance.session.session_authenticate(this.dbname, this.login, this.key, true);
},
bind_credentials: function(dbname, login, key) {
this.dbname = dbname;
this.login = login;
this.key = key;
},
});
instance.web.embed = function (origin, dbname, login, key, action, options) {

View File

@ -30,6 +30,12 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
* Setup a sessionm
*/
session_bind: function(origin) {
if (!_.isUndefined(this.origin)) {
if (this.origin === origin) {
return $.when();
}
throw new Error('Session already bound to ' + this.origin);
}
var self = this;
this.setup(origin);
instance.web.qweb.default_dict['_s'] = this.origin;
@ -119,9 +125,7 @@ instance.web.Session = instance.web.JsonRPC.extend( /** @lends instance.web.Sess
},
session_logout: function() {
this.set_cookie('session_id', '');
var url = "#";
$.bbq.pushState(url);
window.location.search = "";
$.bbq.removeState();
return this.rpc("/web/session/destroy", {});
},
get_cookie: function (name) {

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) {
@ -642,7 +640,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
.then(this.proxy('setup_default_query'));
return $.when(drawer_started, defaults_fetched)
.done(function () {
.then(function () {
self.trigger("search_view_loaded", data);
self.ready.resolve();
});

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'],

View File

@ -128,13 +128,15 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
self.init_pager();
});
self.on("load_record", self, self.load_record);
this.on('view_loaded', self, self.load_form);
instance.web.bus.on('clear_uncommitted_changes', this, function(e) {
if (!this.can_be_discarded()) {
e.preventDefault();
}
});
},
view_loading: function(r) {
return this.load_form(r);
},
destroy: function() {
_.each(this.get_widgets(), function(w) {
w.off('focused blurred');
@ -194,7 +196,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
}
this.sidebar.add_items('other', _.compact([
self.is_action_enabled('delete') && { label: _t('Delete'), callback: self.on_button_delete },
self.is_action_enabled('create') && { label: _t('Duplicate'), callback: self.on_button_duplicate },
self.is_action_enabled('create') && { label: _t('Duplicate'), callback: self.on_button_duplicate }
]));
}
@ -211,7 +213,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
});
//bounce effect on red button when click on statusbar.
this.$el.find(".oe_form_field_status:not(.oe_form_status_clickable)").on('click', function (e) {
if((self.get("actual_mode") == "view")) {
if((self.get("actual_mode") == "view")) {
var $button = self.$el.find(".oe_highlight:not(.oe_form_invisible)").css({'float':'left','clear':'none'});
$button.effect('bounce', {distance:18, times: 5}, 250);
e.stopPropagation();
@ -917,7 +919,7 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM
this.do_update_pager();
if (this.sidebar) {
this.sidebar.do_attachement_update(this.dataset, this.datarecord.id);
}
}
//openerp.log("The record has been created with id #" + this.datarecord.id);
return $.when(this.reload()).then(function () {
self.trigger('record_created', r);
@ -1189,36 +1191,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();
@ -1711,6 +1696,10 @@ instance.web.form.compute_domain = function(expr, fields) {
return _.all(stack, _.identity);
};
instance.web.form.is_bin_size = function(v) {
return /^\d+(\.\d*)? \w+$/.test(v);
};
/**
* Must be applied over an class already possessing the PropertiesMixin.
*
@ -2233,19 +2222,28 @@ instance.web.form.ReinitializeFieldMixin = _.extend({}, instance.web.form.Reini
instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
template: 'FieldChar',
widget_class: 'oe_form_field_char',
events: {
'change input': 'store_dom_value',
},
init: function (field_manager, node) {
this._super(field_manager, node);
this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
},
initialize_content: function() {
var self = this;
var $input = this.$el.find('input');
$input.change(function() {
if(self.is_syntax_valid()){
self.internal_set_value(self.parse_value($input.val()));
}
});
this.setupFocus($input);
this.setupFocus(this.$('input'));
},
store_dom_value: function () {
if (!this.get('effective_readonly')
&& this.$('input').length
&& this.is_syntax_valid()) {
this.internal_set_value(
this.parse_value(
this.$('input').val()));
}
},
commit_value: function () {
this.store_dom_value();
return this._super();
},
render_value: function() {
var show_value = this.format_value(this.get('value'), '');
@ -2261,7 +2259,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
is_syntax_valid: function() {
if (!this.get("effective_readonly") && this.$("input").size() > 0) {
try {
var value_ = this.parse_value(this.$el.find('input').val(), '');
this.parse_value(this.$('input').val(), '');
return true;
} catch(e) {
return false;
@ -2279,7 +2277,7 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
return this.get('value') === '' || this._super();
},
focus: function() {
this.$('input:first').focus();
this.$('input:first')[0].focus();
},
set_dimensions: function (height, width) {
this._super(height, width);
@ -2291,7 +2289,10 @@ instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.we
});
instance.web.form.FieldID = instance.web.form.FieldChar.extend({
process_modifiers: function () {
this._super();
this.set({ readonly: true });
},
});
instance.web.form.FieldEmail = instance.web.form.FieldChar.extend({
@ -2380,6 +2381,9 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
template: "web.datepicker",
jqueryui_object: 'datetimepicker',
type_of_date: "datetime",
events: {
'change .oe_datepicker_master': 'change_datetime',
},
init: function(parent) {
this._super(parent);
this.name = parent.name;
@ -2388,10 +2392,7 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
var self = this;
this.$input = this.$el.find('input.oe_datepicker_master');
this.$input_picker = this.$el.find('input.oe_datepicker_container');
this.$input.change(function(){
self.change_datetime();
});
this.picker({
onClose: this.on_picker_select,
onSelect: this.on_picker_select,
@ -2464,7 +2465,10 @@ instance.web.DateTimeWidget = instance.web.Widget.extend({
this.set_value_from_ui_();
this.trigger("datetime_changed");
}
}
},
commit_value: function () {
this.change_datetime();
},
});
instance.web.DateWidget = instance.web.DateTimeWidget.extend({
@ -2511,7 +2515,7 @@ instance.web.form.FieldDatetime = instance.web.form.AbstractField.extend(instanc
},
focus: function() {
if (this.datewidget && this.datewidget.$input) {
this.datewidget.$input.focus();
this.datewidget.$input[0].focus();
}
},
set_dimensions: function (height, width) {
@ -2529,40 +2533,56 @@ instance.web.form.FieldDate = instance.web.form.FieldDatetime.extend({
instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
template: 'FieldText',
events: {
'keyup': function (e) {
if (e.which === $.ui.keyCode.ENTER) {
e.stopPropagation();
}
},
'change textarea': 'store_dom_value',
},
init: function (field_manager, node) {
this._super(field_manager, node);
},
initialize_content: function() {
var self = this;
this.$textarea = this.$el.find('textarea');
this.auto_sized = false;
this.default_height = this.$textarea.css('height');
if (!this.get("effective_readonly")) {
this.$textarea.change(_.bind(function() {
self.internal_set_value(instance.web.parse_value(self.$textarea.val(), self));
}, this));
} else {
if (this.get("effective_readonly")) {
this.$textarea.attr('disabled', 'disabled');
}
this.$el.keyup(function (e) {
if (e.which === $.ui.keyCode.ENTER) {
e.stopPropagation();
}
});
this.setupFocus(this.$textarea);
},
commit_value: function () {
this.store_dom_value();
return this._super();
},
store_dom_value: function () {
if (!this.get('effective_readonly') && this.$('textarea').length) {
this.internal_set_value(
instance.web.parse_value(
this.$textarea.val(),
this));
}
},
render_value: function() {
$(window).resize();
var show_value = instance.web.format_value(this.get('value'), this, '');
if (show_value === '') {
this.$textarea.css('height', parseInt(this.default_height)+"px");
}
this.$textarea.val(show_value);
this.$textarea.autosize();
if (! this.auto_sized) {
this.auto_sized = true;
this.$textarea.autosize();
} else {
this.$textarea.trigger("autosize");
}
},
is_syntax_valid: function() {
if (!this.get("effective_readonly") && this.$textarea) {
try {
var value_ = instance.web.parse_value(this.$textarea.val(), this, '');
instance.web.parse_value(this.$textarea.val(), this, '');
return true;
} catch(e) {
return false;
@ -2574,7 +2594,7 @@ instance.web.form.FieldText = instance.web.form.AbstractField.extend(instance.we
return this.get('value') === '' || this._super();
},
focus: function($el) {
this.$textarea.focus();
this.$textarea[0].focus();
},
set_dimensions: function (height, width) {
this._super(height, width);
@ -2655,7 +2675,7 @@ instance.web.form.FieldBoolean = instance.web.form.AbstractField.extend({
this.$checkbox[0].checked = this.get('value');
},
focus: function() {
this.$checkbox.focus();
this.$checkbox[0].focus();
}
});
@ -2677,16 +2697,16 @@ instance.web.form.FieldProgressBar = instance.web.form.AbstractField.extend({
instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
template: 'FieldSelection',
events: {
'change select': 'store_dom_value',
},
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
@ -2702,9 +2722,6 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
// row
var ischanging = false;
var $select = this.$el.find('select')
.change(_.bind(function() {
this.internal_set_value(this.values[this.$el.find('select')[0].selectedIndex][0]);
}, this))
.change(function () { ischanging = true; })
.click(function () { ischanging = false; })
.keyup(function (e) {
@ -2714,6 +2731,16 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
});
this.setupFocus($select);
},
commit_value: function () {
this.store_dom_value();
return this._super();
},
store_dom_value: function () {
if (!this.get('effective_readonly') && this.$('select').length) {
this.internal_set_value(
this.values[this.$('select')[0].selectedIndex][0]);
}
},
set_value: function(value_) {
value_ = value_ === null ? false : value_;
value_ = value_ instanceof Array ? value_[0] : value_;
@ -2734,7 +2761,7 @@ instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(instan
}
},
focus: function() {
this.$el.find('select:first').focus();
this.$('select:first')[0].focus();
},
set_dimensions: function (height, width) {
this._super(height, width);
@ -2930,6 +2957,15 @@ instance.web.form.M2ODialog = instance.web.Dialog.extend({
instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instance.web.form.CompletionFieldMixin, instance.web.form.ReinitializeFieldMixin, {
template: "FieldMany2One",
events: {
'keydown input': function (e) {
switch (e.which) {
case $.ui.keyCode.UP:
case $.ui.keyCode.DOWN:
e.stopPropagation();
}
}
},
init: function(field_manager, node) {
this._super(field_manager, node);
instance.web.form.CompletionFieldMixin.init.call(this);
@ -3211,7 +3247,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc
},
focus: function () {
if (!this.get('effective_readonly')) {
this.$input.focus();
this.$input[0].focus();
}
},
_quick_create: function() {
@ -4061,6 +4097,9 @@ instance.web.form.FieldMany2ManyTags = instance.web.form.AbstractField.extend(in
add_id: function(id) {
this.set({'value': _.uniq(this.get('value').concat([id]))});
},
focus: function () {
this.$text[0].focus();
},
});
/**
@ -4397,7 +4436,7 @@ instance.web.form.Many2ManyQuickCreate = instance.web.Widget.extend({
});
},
focus: function() {
this.$text.focus();
this.$text[0].focus();
},
add_id: function(id) {
var self = this;
@ -4845,11 +4884,6 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
if (!value) {
this.do_warn(_t("Save As..."), _t("The field is empty, there's nothing to save !"));
ev.stopPropagation();
} else if (this._dirty_flag) {
var link = this.$('.oe_form_binary_file_save_data')[0];
link.download = this.filename || "download.bin"; // Works on only on Google Chrome
//link.target = '_blank';
link.href = "data:application/octet-stream;base64," + value;
} else {
instance.web.blockUI();
var c = instance.webclient.crashmanager;
@ -4860,6 +4894,7 @@ instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(instance.
id: (this.view.datarecord.id || ''),
field: this.name,
filename_field: (this.node.attrs.filename || ''),
data: instance.web.form.is_bin_size(value) ? null : value,
context: this.view.dataset.get_context()
})},
complete: instance.web.unblockUI,
@ -4939,7 +4974,7 @@ instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({
render_value: function() {
var self = this;
var url;
if (this.get('value') && ! /^\d+(\.\d*)? \w+$/.test(this.get('value'))) {
if (this.get('value') && !instance.web.form.is_bin_size(this.get('value'))) {
url = 'data:image/png;base64,' + this.get('value');
} else if (this.get('value')) {
var id = JSON.stringify(this.view.datarecord.id || null);
@ -5040,7 +5075,7 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
this._super( ids );
},
get_value: function() {
return _.map(this.get('value'), function (value) { return commands.link_to( value.id ); });
return _.map(this.get('value'), function (value) { return commands.link_to( isNaN(value) ? value.id : value ); });
},
get_file_url: function (attachment) {
return this.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: attachment['id']});
@ -5060,7 +5095,7 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
_.each(datas, function (data) {
data.no_unlink = true;
data.url = self.session.url('/web/binary/saveas', {model: 'ir.attachment', field: 'datas', filename_field: 'datas_fname', id: data.id});
_.each(self.get('value'), function (val, key) {
if(val == data.id) {
self.get('value')[key] = data;
@ -5134,6 +5169,8 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
}
},
on_file_loaded: function (event, result) {
var files = this.get('value');
// unblock UI
if(this.node.attrs.blockui>0) {
instance.web.unblockUI();
@ -5141,15 +5178,19 @@ instance.web.form.FieldMany2ManyBinaryMultiFiles = instance.web.form.AbstractFie
// TODO : activate send on wizard and form
var files = this.get('value');
for(var i in files){
if(files[i].filename == result.filename && files[i].upload) {
files[i] = {
'id': result.id,
'name': result.name,
'filename': result.filename,
'url': this.get_file_url(result)
};
if (result.error || !result.id ) {
this.do_warn( _t('Uploading error'), result.error);
files = _.filter(files, function (val) { return !val.upload; });
} else {
for(var i in files){
if(files[i].filename == result.filename && files[i].upload) {
files[i] = {
'id': result.id,
'name': result.name,
'filename': result.filename,
'url': this.get_file_url(result)
};
}
}
}
@ -5220,7 +5261,8 @@ instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({
if (this.field.type == "many2one") {
var domain = [];
if(!_.isEmpty(this.field.domain) || !_.isEmpty(this.node.attrs.domain)) {
domain = new instance.web.CompoundDomain(['|'], self.build_domain(), [['id', '=', self.get('value')]]);
var d = instance.web.pyeval.eval('domain', self.build_domain());
domain = ['|', ['id', '=', self.get('value')]].concat(d);
}
var ds = new instance.web.DataSetSearch(this, this.field.relation, self.build_context(), domain);
return ds.read_slice(['name'], {}).then(function (records) {

View File

@ -90,7 +90,9 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
this.no_leaf = false;
this.grouped = false;
this.on('view_loaded', self, self.load_list);
},
view_loading: function(r) {
return this.load_list(r);
},
set_default_options: function (options) {
this._super(options);
@ -952,12 +954,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));
}]);
})

View File

@ -105,8 +105,15 @@ openerp.web.list_editable = function (instance) {
* Replace do_search to handle editability process
*/
do_search: function(domain, context, group_by) {
this._context_editable = !!context.set_editable;
this._super.apply(this, arguments);
var self=this, _super = self._super, args=arguments;
var ready = this.editor.is_editing()
? this.cancel_edition(true)
: $.when();
return ready.then(function () {
self._context_editable = !!context.set_editable;
return _super.apply(self, args);
});
},
/**
* Replace do_add_record to handle editability (and adding new record

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).
@ -38,16 +39,10 @@ instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeVie
_.bindAll(this, 'color_for');
},
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);
view_loading: function(r) {
return this.load_tree(r);
},
/**
* Returns the list of fields needed to correctly read objects.
*
@ -64,7 +59,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

View File

@ -467,6 +467,7 @@ instance.web.ViewManager = instance.web.Widget.extend({
this.flags = flags || {};
this.registry = instance.web.views;
this.views_history = [];
this.view_completely_inited = $.Deferred();
},
/**
* @returns {jQuery.Deferred} initial view loading promise
@ -586,6 +587,8 @@ instance.web.ViewManager = instance.web.Widget.extend({
&& self.flags.auto_search
&& view.controller.searchable !== false) {
self.searchview.ready.done(self.searchview.do_search);
} else {
self.view_completely_inited.resolve();
}
self.trigger("controller_inited",view_type,controller);
});
@ -700,7 +703,9 @@ instance.web.ViewManager = instance.web.Widget.extend({
if (_.isString(groupby)) {
groupby = [groupby];
}
controller.do_search(results.domain, results.context, groupby || []);
$.when(controller.do_search(results.domain, results.context, groupby || [])).then(function() {
self.view_completely_inited.resolve();
});
});
},
/**
@ -782,7 +787,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({
var main_view_loaded = this._super();
var manager_ready = $.when(searchview_loaded, main_view_loaded);
var manager_ready = $.when(searchview_loaded, main_view_loaded, this.view_completely_inited);
this.$el.find('.oe_debug_view').change(this.on_debug_changed);
this.$el.addClass("oe_view_manager_" + (this.action.target || 'current'));
@ -1027,6 +1032,11 @@ instance.web.Sidebar = instance.web.Widget.extend({
this.$('.oe_form_dropdown_section').each(function() {
$(this).toggle(!!$(this).find('li').length);
});
self.$("[title]").tipsy({
'html': true,
'delayIn': 500,
})
},
/**
* For each item added to the section:
@ -1110,27 +1120,19 @@ instance.web.Sidebar = instance.web.Widget.extend({
});
});
},
do_attachement_update: function(dataset, model_id,args) {
do_attachement_update: function(dataset, model_id, args) {
var self = this;
this.dataset = dataset;
this.model_id = model_id;
if (args && args[0]["erorr"]) {
instance.web.dialog($('<div>'),{
modal: true,
title: "OpenERP " + _.str.capitalize(args[0]["title"]),
buttons: [{
text: _t("Ok"),
click: function(){
$(this).dialog("close");
}}]
}).html(args[0]["erorr"]);
if (args && args[0].error) {
this.do_warn( instance.web.qweb.render('message_error_uploading'), args[0].error);
}
if (!model_id) {
this.on_attachments_loaded([]);
} else {
var dom = [ ['res_model', '=', dataset.model], ['res_id', '=', model_id], ['type', 'in', ['binary', 'url']] ];
var ds = new instance.web.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom);
ds.read_slice(['name', 'url', 'type'], {}).done(this.on_attachments_loaded);
ds.read_slice(['name', 'url', 'type', 'create_uid', 'create_date', 'write_uid', 'write_date'], {}).done(this.on_attachments_loaded);
}
},
on_attachments_loaded: function(attachments) {
@ -1189,33 +1191,36 @@ instance.web.View = instance.web.Widget.extend({
},
load_view: function(context) {
var self = this;
var view_loaded;
var view_loaded_def;
if (this.embedded_view) {
view_loaded = $.Deferred();
view_loaded_def = $.Deferred();
$.async_when().done(function() {
view_loaded.resolve(self.embedded_view);
view_loaded_def.resolve(self.embedded_view);
});
} 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_def = 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) {
self.trigger('view_loaded', r);
return view_loaded_def.then(function(r) {
self.fields_view = r;
// add css classes that reflect the (absence of) access rights
self.$el.addClass('oe_view')
.toggleClass('oe_cannot_create', !self.is_action_enabled('create'))
.toggleClass('oe_cannot_edit', !self.is_action_enabled('edit'))
.toggleClass('oe_cannot_delete', !self.is_action_enabled('delete'));
return $.when(self.view_loading(r)).then(function() {
self.trigger('view_loaded', r);
});
});
},
view_loading: function(r) {
},
set_default_options: function(options) {
this.options = options || {};
_.defaults(this.options, {
@ -1379,12 +1384,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) {
@ -1397,7 +1443,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);
})),
}
}
}
@ -1449,26 +1497,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

View File

@ -36,11 +36,11 @@
<t t-name="CrashManager.warning">
<table cellspacing="0" cellpadding="0" border="0" class="oe_dialog_warning">
<tr>
<td><img t-att-src='_s + "/web/static/src/img/warning.png"' class="oe_dialog_icon"/></td>
<td class="oe_dialog_icon"><img t-att-src='_s + "/web/static/src/img/warning.png"'/></td>
<td>
<p>
<t t-js="d">
var message = d.message ? d.message : d.error.data.fault_code;
var message = d.error.message ? d.error.message : d.error.data.fault_code;
d.html_error = context.engine.tools.html_escape(message)
.replace(/\n/g, '<br/>');
</t>
@ -348,16 +348,14 @@
<li t-foreach="widget.data.data.children" t-as="menu">
<t t-call="Menu.link"/>
</li>
<li class="oe_menu_more_container" style="display: none;">
<span class="oe_topbar_item oe_menu_more_link oe_dropdown_toggle oe_dropdown_arrow">
More
<ul class="oe_menu_more oe_dropdown_menu"/>
</span>
</li>
</ul>
</t>
<t t-name="Menu.more">
<li class="oe_menu_more_container">
<span class="oe_topbar_item oe_menu_more_link oe_dropdown_toggle oe_dropdown_arrow">
More
<ul class="oe_menu_more oe_dropdown_menu"/>
</span>
</li>
</t>
<t t-name="Menu.secondary">
<div t-foreach="widget.data.data.children" t-as="menu" style="display: none" class="oe_secondary_menu" t-att-data-menu-parent="menu.id">
<t t-foreach="menu.children" t-as="menu">
@ -388,14 +386,16 @@
t-att-data-action-model="menu.action ? menu.action.split(',')[0] : ''"
t-att-data-action-id="menu.action ? menu.action.split(',')[1] : ''">
<t t-esc="menu.name"/>
<t t-if="menu.needaction_enabled and menu.needaction_counter">
<div class="oe_tag oe_tag_dark oe_menu_counter">
<t t-if="menu.needaction_counter &gt; 99"> 99+ </t><t t-if="menu.needaction_counter &lt;= 99"> <t t-esc="menu.needaction_counter"/> </t>
</div>
</t>
</a>
</t>
<t t-name="Menu.needaction_counter">
<div class="oe_tag oe_tag_dark oe_menu_counter">
<t t-if="widget.needaction_counter &gt; 99"> 99+ </t>
<t t-if="widget.needaction_counter &lt;= 99"> <t t-esc="widget.needaction_counter"/> </t>
</div>
</t>
<t t-name="UserMenu">
<span class="oe_user_menu oe_topbar_item oe_dropdown_toggle oe_dropdown_arrow">
<img class="oe_topbar_avatar" t-att-data-default-src="_s + '/web/static/src/img/user_menu_avatar.png'"/>
@ -436,7 +436,11 @@
</tr>
<tr>
<td class="oe_leftbar" valign="top">
<a class="oe_logo" t-attf-href="/?ts=#{Date.now()}"><img t-att-src='_s + "/web/static/src/img/logo.png"'/></a>
<t t-set="debug" t-value="__debug__ ? '&amp;debug' : ''"/>
<a class="oe_logo" t-attf-href="/?ts=#{Date.now()}#{debug}">
<span class="oe_logo_edit">Edit Company data</span>
<img t-att-src='widget.session.url("/web/binary/company_logo")'/>
</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>
@ -599,7 +603,23 @@
</button>
<ul class="oe_dropdown_menu">
<li t-foreach="widget.items[section.name]" t-as="item" t-att-class="item.classname">
<a class="oe_sidebar_action_a" t-att-title="item.title" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url" target="_blank">
<t t-if="section.name == 'files'">
<t t-set="item.title">
<b>Attachment : </b><br/>
<t t-raw="item.name"/>
</t>
<t t-if="item.create_uid and item.create_uid[0]" t-set="item.title">
<t t-raw="item.title"/><br/>
<b>Created by : </b><br/>
<t t-raw="item.create_uid[1] + ' ' + item.create_date"/>
</t>
<t t-if="item.create_uid and item.write_uid and item.create_uid[0] != item.write_uid[0]" t-set="item.title">
<t t-raw="item.title"/><br/>
<b>Modified by : </b><br/>
<t t-raw="item.write_uid[1] + ' ' + item.write_date"/>
</t>
</t>
<a class="oe_sidebar_action_a" t-att-title="item.title or ''" t-att-data-section="section.name" t-att-data-index="item_index" t-att-href="item.url" target="_blank">
<t t-raw="item.label"/>
</a>
<a t-if="section.name == 'files' and !item.callback" class="oe_sidebar_delete_item" t-att-data-id="item.id" title="Delete this attachment">x</a>
@ -1054,7 +1074,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>
@ -1346,7 +1369,7 @@
</t>
<t t-name="SelectCreatePopup.search.buttons">
<t t-if="! widget.options.disable_multiple_selection">
<button type="button" class="oe_button oe_selectcreatepopup-search-select" disabled="disabled">Select</button>
<button type="button" class="oe_button oe_selectcreatepopup-search-select oe_highlight" disabled="disabled">Select</button>
</t>
<button type="button" class="oe_button oe_selectcreatepopup-search-create">Create</button>
or <a class="oe_button oe_selectcreatepopup-search-close oe_bold oe_form_button_cancel" href="javascript:void(0)">Cancel</a>

View File

@ -4,27 +4,37 @@ openerp.testing.section('eval.types', {
instance.session.uid = 42;
}
}, function (test) {
test('strftime', function (instance) {
var d = new Date();
var makeTimeCheck = function (instance) {
var context = instance.web.pyeval.context();
strictEqual(
py.eval("time.strftime('%Y')", context),
String(d.getFullYear()));
strictEqual(
py.eval("time.strftime('%Y')+'-01-30'", context),
String(d.getFullYear()) + '-01-30');
strictEqual(
py.eval("time.strftime('%Y-%m-%d %H:%M:%S')", context),
_.str.sprintf('%04d-%02d-%02d %02d:%02d:%02d',
return function (expr, func, message) {
// evaluate expr between two calls to new Date(), and check that
// the result is between the transformed dates
var d0 = new Date;
var result = py.eval(expr, context);
var d1 = new Date;
ok(func(d0) <= result && result <= func(d1), message);
};
};
test('strftime', function (instance) {
var check = makeTimeCheck(instance);
check("time.strftime('%Y')", function(d) {
return String(d.getFullYear());
});
check("time.strftime('%Y')+'-01-30'", function(d) {
return String(d.getFullYear()) + '-01-30';
});
check("time.strftime('%Y-%m-%d %H:%M:%S')", function(d) {
return _.str.sprintf('%04d-%02d-%02d %02d:%02d:%02d',
d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(),
d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds()));
d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds());
});
});
test('context_today', function (instance) {
var d = new Date();
var context = instance.web.pyeval.context();
strictEqual(
py.eval("context_today().strftime('%Y-%m-%d')", context),
String(_.str.sprintf('%04d-%02d-%02d', d.getFullYear(), d.getMonth() + 1, d.getDate())));
var check = makeTimeCheck(instance);
check("context_today().strftime('%Y-%m-%d')", function(d) {
return String(_.str.sprintf('%04d-%02d-%02d',
d.getFullYear(), d.getMonth() + 1, d.getDate()));
});
});
// Port from pypy/lib_pypy/test_datetime.py
var makeEq = function (instance, c2) {

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) {

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) {

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>',
};
});
}

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/

View File

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);

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.

View File

@ -0,0 +1 @@
{}

View File

@ -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 dont 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;
};
}

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

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'),
''

View File

@ -36,15 +36,14 @@ class LoadTest(unittest2.TestCase):
self.MockMenus.search.return_value = []
self.MockMenus.read.return_value = []
root = self.menu.do_load(self.request)
root = self.menu.load(self.request)
self.MockMenus.search.assert_called_with(
[], 0, False, False, self.request.context)
self.MockMenus.read.assert_called_with(
[], ['name', 'sequence', 'parent_id',
'action', 'needaction_enabled', 'needaction_counter'],
[('parent_id','=', False)], 0, False, False,
self.request.context)
self.assertEqual(root['all_menu_ids'], [])
self.assertListEqual(
root['children'],
[])
@ -57,13 +56,19 @@ class LoadTest(unittest2.TestCase):
{'id': 2, 'sequence': 3, 'parent_id': False},
]
root = self.menu.do_load(self.request)
root = self.menu.load(self.request)
self.MockMenus.search.assert_called_with(
[('id','child_of', [1, 2, 3])], 0, False, False,
self.request.context)
self.MockMenus.read.assert_called_with(
[1, 2, 3], ['name', 'sequence', 'parent_id',
'action', 'needaction_enabled', 'needaction_counter'],
'action'],
self.request.context)
self.assertEqual(root['all_menu_ids'], [1, 2, 3])
self.assertEqual(
root['children'],
[{
@ -90,7 +95,13 @@ class LoadTest(unittest2.TestCase):
{'id': 4, 'sequence': 2, 'parent_id': [2, '']},
])
root = self.menu.do_load(self.request)
root = self.menu.load(self.request)
self.MockMenus.search.assert_called_with(
[('id','child_of', [1])], 0, False, False,
self.request.context)
self.assertEqual(root['all_menu_ids'], [1, 2, 3, 4])
self.assertEqual(
root['children'],

View File

@ -8,63 +8,63 @@ 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-04-09 03:26+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-12-16 06:30+0000\n"
"Last-Translator: David Bowers <sales@skitzotek.com>\n"
"Language-Team: English (Australia) <en_AU@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-17 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:151
#, python-format
msgid "New event"
msgstr ""
msgstr "New event"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:154
#, python-format
msgid "Details"
msgstr ""
msgstr "Details"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:152
#, python-format
msgid "Save"
msgstr ""
msgstr "Save"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "Calendar view has a 'date_delay' type != float"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:147
#, python-format
msgid "Today"
msgstr ""
msgstr "Today"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:149
#, python-format
msgid "Week"
msgstr ""
msgstr "Week"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:161
#, python-format
msgid "Full day"
msgstr ""
msgstr "Full day"
#. module: web_calendar
#. openerp-web
@ -72,14 +72,14 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:172
#, python-format
msgid "Description"
msgstr ""
msgstr "Description"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:158
#, python-format
msgid "Event will be deleted permanently, are you sure?"
msgstr ""
msgstr "Event will be deleted permanently. Are you sure?"
#. module: web_calendar
#. openerp-web
@ -94,56 +94,56 @@ msgstr "&nbsp;"
#: code:addons/web_calendar/static/src/js/calendar.js:171
#, python-format
msgid "Date"
msgstr ""
msgstr "Date"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:468
#, python-format
msgid "Edit: "
msgstr ""
msgstr "Edit: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:148
#, python-format
msgid "Day"
msgstr ""
msgstr "Day"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:155
#, python-format
msgid "Edit"
msgstr ""
msgstr "Edit"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:167
#, python-format
msgid "Enabled"
msgstr ""
msgstr "Enabled"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:164
#, python-format
msgid "Do you want to edit the whole set of repeated events?"
msgstr ""
msgstr "Do you want to edit the whole set of repeated events?"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:80
#, python-format
msgid "Filter"
msgstr ""
msgstr "Filter"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:165
#, python-format
msgid "Repeat event"
msgstr ""
msgstr "Repeat event"
#. module: web_calendar
#. openerp-web
@ -151,56 +151,56 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:178
#, python-format
msgid "Agenda"
msgstr ""
msgstr "Agenda"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:160
#, python-format
msgid "Time period"
msgstr ""
msgstr "Time period"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:156
#, python-format
msgid "Delete"
msgstr ""
msgstr "Delete"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:150
#, python-format
msgid "Month"
msgstr ""
msgstr "Month"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:166
#, python-format
msgid "Disabled"
msgstr ""
msgstr "Disabled"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:433
#, python-format
msgid "Create: "
msgstr ""
msgstr "Create: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:175
#, python-format
msgid "Year"
msgstr ""
msgstr "Year"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:153
#, python-format
msgid "Cancel"
msgstr ""
msgstr "Cancel"
#. module: web_calendar
#. openerp-web
@ -214,7 +214,7 @@ msgstr "Calendar"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "Calendar view has not defined the 'date_start' attribute."
#~ msgid "Navigator"
#~ msgstr "Navigator"

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 17:08+0000\n"
"Last-Translator: Vicente Jiménez Aguilar <Unknown>\n"
"PO-Revision-Date: 2012-12-17 13:10+0000\n"
"Last-Translator: Santi (Pexego) <santiago@pexego.es>\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:43+0000\n"
"X-Generator: Launchpad (build 16335)\n"
"X-Launchpad-Export-Date: 2012-12-18 05:08+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_calendar
#. openerp-web
@ -43,7 +43,7 @@ msgstr "Guardar"
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "La vista calendario tiene un tipo 'date_delay' != float"
#. module: web_calendar
#. openerp-web
@ -214,7 +214,7 @@ msgstr "Calendario"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "La vista calendario no tiene definido el atributo 'date_start'"
#~ msgid "Navigator"
#~ msgstr "Navegador"

View File

@ -8,35 +8,35 @@ 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: 2011-10-10 19:20+0000\n"
"Last-Translator: Aare Vesi <Unknown>\n"
"PO-Revision-Date: 2012-12-16 20:45+0000\n"
"Last-Translator: Ahti Hinnov <sipelgas@gmail.com>\n"
"Language-Team: Estonian <et@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-17 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:151
#, python-format
msgid "New event"
msgstr ""
msgstr "Uus sündmus"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:154
#, python-format
msgid "Details"
msgstr ""
msgstr "Üksikasjad"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:152
#, python-format
msgid "Save"
msgstr ""
msgstr "Salvesta"
#. module: web_calendar
#. openerp-web
@ -50,21 +50,21 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:147
#, python-format
msgid "Today"
msgstr ""
msgstr "Täna"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:149
#, python-format
msgid "Week"
msgstr ""
msgstr "Nädal"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:161
#, python-format
msgid "Full day"
msgstr ""
msgstr "Terve päev"
#. module: web_calendar
#. openerp-web
@ -72,7 +72,7 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:172
#, python-format
msgid "Description"
msgstr ""
msgstr "Kirjeldus"
#. module: web_calendar
#. openerp-web
@ -94,35 +94,35 @@ msgstr "&nbsp;"
#: code:addons/web_calendar/static/src/js/calendar.js:171
#, python-format
msgid "Date"
msgstr ""
msgstr "Kuupäev"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:468
#, python-format
msgid "Edit: "
msgstr ""
msgstr "Muuda: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:148
#, python-format
msgid "Day"
msgstr ""
msgstr "Päev"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:155
#, python-format
msgid "Edit"
msgstr ""
msgstr "Muuda"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:167
#, python-format
msgid "Enabled"
msgstr ""
msgstr "Lubatud"
#. module: web_calendar
#. openerp-web
@ -136,14 +136,14 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:80
#, python-format
msgid "Filter"
msgstr ""
msgstr "Filter"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:165
#, python-format
msgid "Repeat event"
msgstr ""
msgstr "Korduv sündmus"
#. module: web_calendar
#. openerp-web
@ -151,63 +151,63 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:178
#, python-format
msgid "Agenda"
msgstr ""
msgstr "Päevakava"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:160
#, python-format
msgid "Time period"
msgstr ""
msgstr "Periood"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:156
#, python-format
msgid "Delete"
msgstr ""
msgstr "Kustuta"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:150
#, python-format
msgid "Month"
msgstr ""
msgstr "Kuu"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:166
#, python-format
msgid "Disabled"
msgstr ""
msgstr "Keelatud"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:433
#, python-format
msgid "Create: "
msgstr ""
msgstr "Loo: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:175
#, python-format
msgid "Year"
msgstr ""
msgstr "Aasta"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:153
#, python-format
msgid "Cancel"
msgstr ""
msgstr "Loobu"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:28
#, python-format
msgid "Calendar"
msgstr ""
msgstr "Kalender"
#. module: web_calendar
#. openerp-web

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"

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:10+0000\n"
"Last-Translator: Juhász Krisztián <Unknown>\n"
"PO-Revision-Date: 2012-12-10 11:45+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: Hungarian <hu@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-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\n"
#. module: web_calendar
#. openerp-web
@ -43,7 +43,7 @@ msgstr "Mentés"
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "Naptár nézetnek van 'halasztás_dátum' típusa != lebegőpontos"
#. module: web_calendar
#. openerp-web
@ -214,7 +214,7 @@ msgstr "Naptár"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "Naptár nézetnek nincs definiálva 'induló_dátum' értéke"
#~ msgid "Navigator"
#~ msgstr "Navigátor"

View File

@ -8,63 +8,63 @@ 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:55+0000\n"
"Last-Translator: Davide Corio - agilebg.com <davide.corio@agilebg.com>\n"
"PO-Revision-Date: 2012-12-11 07:35+0000\n"
"Last-Translator: Nicola Riolini - Micronaet <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-12 04:54+0000\n"
"X-Generator: Launchpad (build 16361)\n"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:151
#, python-format
msgid "New event"
msgstr ""
msgstr "Nuovo evento"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:154
#, python-format
msgid "Details"
msgstr ""
msgstr "Dettagli"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:152
#, python-format
msgid "Save"
msgstr ""
msgstr "Salva"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "La vista calendario ha un campo \"date_delay\" non di tipo float"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:147
#, python-format
msgid "Today"
msgstr ""
msgstr "Oggi"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:149
#, python-format
msgid "Week"
msgstr ""
msgstr "Settimana"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:161
#, python-format
msgid "Full day"
msgstr ""
msgstr "Tutto il giorno"
#. module: web_calendar
#. openerp-web
@ -72,14 +72,14 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:172
#, python-format
msgid "Description"
msgstr ""
msgstr "Descrizione"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:158
#, python-format
msgid "Event will be deleted permanently, are you sure?"
msgstr ""
msgstr "L'evento sarà eliminato permanentemente, siete sicuri?"
#. module: web_calendar
#. openerp-web
@ -94,56 +94,56 @@ msgstr "&nbsp;"
#: code:addons/web_calendar/static/src/js/calendar.js:171
#, python-format
msgid "Date"
msgstr ""
msgstr "Data"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:468
#, python-format
msgid "Edit: "
msgstr ""
msgstr "Modifica: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:148
#, python-format
msgid "Day"
msgstr ""
msgstr "Giorno"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:155
#, python-format
msgid "Edit"
msgstr ""
msgstr "Modifica"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:167
#, python-format
msgid "Enabled"
msgstr ""
msgstr "Abilitato"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:164
#, python-format
msgid "Do you want to edit the whole set of repeated events?"
msgstr ""
msgstr "Volete modificare l'intero set di eventi ricorsivi?"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:80
#, python-format
msgid "Filter"
msgstr ""
msgstr "Filtro"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:165
#, python-format
msgid "Repeat event"
msgstr ""
msgstr "Evento ricorsivo"
#. module: web_calendar
#. openerp-web
@ -151,56 +151,56 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:178
#, python-format
msgid "Agenda"
msgstr ""
msgstr "Agenda"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:160
#, python-format
msgid "Time period"
msgstr ""
msgstr "Periodo di tempo"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:156
#, python-format
msgid "Delete"
msgstr ""
msgstr "Elimina"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:150
#, python-format
msgid "Month"
msgstr ""
msgstr "Mese"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:166
#, python-format
msgid "Disabled"
msgstr ""
msgstr "Disabilitato"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:433
#, python-format
msgid "Create: "
msgstr ""
msgstr "Crea: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:175
#, python-format
msgid "Year"
msgstr ""
msgstr "Anno"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:153
#, python-format
msgid "Cancel"
msgstr ""
msgstr "Annulla"
#. module: web_calendar
#. openerp-web
@ -214,7 +214,7 @@ msgstr "Calendario"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "La vista calendario non ha definito l'attributo 'data_start'"
#~ msgid "Navigator"
#~ msgstr "Navigatore"

View File

@ -8,35 +8,35 @@ 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-08 11:19+0000\n"
"Last-Translator: drygal <Unknown>\n"
"PO-Revision-Date: 2012-12-10 12:19+0000\n"
"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) <grzegorz@openglobe.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:21+0000\n"
"X-Generator: Launchpad (build 16319)\n"
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\n"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:151
#, python-format
msgid "New event"
msgstr ""
msgstr "Nowe zdarzenie"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:154
#, python-format
msgid "Details"
msgstr ""
msgstr "Szczegóły"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:152
#, python-format
msgid "Save"
msgstr ""
msgstr "Zapisz"
#. module: web_calendar
#. openerp-web
@ -50,21 +50,21 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:147
#, python-format
msgid "Today"
msgstr ""
msgstr "Dzisiaj"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:149
#, python-format
msgid "Week"
msgstr ""
msgstr "Tydzień"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:161
#, python-format
msgid "Full day"
msgstr ""
msgstr "Cały dzień"
#. module: web_calendar
#. openerp-web
@ -72,14 +72,14 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:172
#, python-format
msgid "Description"
msgstr ""
msgstr "Opis"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:158
#, python-format
msgid "Event will be deleted permanently, are you sure?"
msgstr ""
msgstr "Zdarzenie zostanie ostatecznie usunięte"
#. module: web_calendar
#. openerp-web
@ -94,56 +94,56 @@ msgstr "&nbsp;"
#: code:addons/web_calendar/static/src/js/calendar.js:171
#, python-format
msgid "Date"
msgstr ""
msgstr "Data"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:468
#, python-format
msgid "Edit: "
msgstr ""
msgstr "Edytowanie: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:148
#, python-format
msgid "Day"
msgstr ""
msgstr "Dzień"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:155
#, python-format
msgid "Edit"
msgstr ""
msgstr "Edytuj"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:167
#, python-format
msgid "Enabled"
msgstr ""
msgstr "Włączone"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:164
#, python-format
msgid "Do you want to edit the whole set of repeated events?"
msgstr ""
msgstr "Chcesz edytować cały zestaw powtarzalnych zdarzeń?"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:80
#, python-format
msgid "Filter"
msgstr ""
msgstr "Filtrowanie"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:165
#, python-format
msgid "Repeat event"
msgstr ""
msgstr "Powtórz zdarzenie"
#. module: web_calendar
#. openerp-web
@ -151,56 +151,56 @@ msgstr ""
#: code:addons/web_calendar/static/src/js/calendar.js:178
#, python-format
msgid "Agenda"
msgstr ""
msgstr "Plan spotkania"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:160
#, python-format
msgid "Time period"
msgstr ""
msgstr "Okres czasu"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:156
#, python-format
msgid "Delete"
msgstr ""
msgstr "Usuń"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:150
#, python-format
msgid "Month"
msgstr ""
msgstr "Miesiąc"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:166
#, python-format
msgid "Disabled"
msgstr ""
msgstr "Wyłączone"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:433
#, python-format
msgid "Create: "
msgstr ""
msgstr "Utwórz: "
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:175
#, python-format
msgid "Year"
msgstr ""
msgstr "Rok"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:153
#, python-format
msgid "Cancel"
msgstr ""
msgstr "Anuluj"
#. module: web_calendar
#. openerp-web
@ -214,7 +214,7 @@ msgstr "Kalendarz"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "Widok kalendzara nie ma zdefiniowanego atrybutu 'date_start'."
#~ msgid "Navigator"
#~ msgstr "Nawigator"

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

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-03-10 13:17+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-12-15 14:02+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:21+0000\n"
"X-Generator: Launchpad (build 16319)\n"
"X-Launchpad-Export-Date: 2012-12-16 05:07+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_calendar
#. openerp-web
#: code:addons/web_calendar/static/src/js/calendar.js:151
#, python-format
msgid "New event"
msgstr "Un eveniment nou"
msgstr "Eveniment nou"
#. module: web_calendar
#. openerp-web
@ -36,7 +36,7 @@ msgstr "Detalii"
#: code:addons/web_calendar/static/src/js/calendar.js:152
#, python-format
msgid "Save"
msgstr "Salvati"
msgstr "Salveaza"
#. module: web_calendar
#. openerp-web
@ -44,6 +44,7 @@ msgstr "Salvati"
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
"Vizualizarea Calendar are un tip de 'intarziere_data' ! = stabilizare"
#. module: web_calendar
#. openerp-web
@ -101,7 +102,7 @@ msgstr "Data"
#: code:addons/web_calendar/static/src/js/calendar.js:468
#, python-format
msgid "Edit: "
msgstr ""
msgstr "Editeaza: "
#. module: web_calendar
#. openerp-web
@ -115,7 +116,7 @@ msgstr "Ziua"
#: code:addons/web_calendar/static/src/js/calendar.js:155
#, python-format
msgid "Edit"
msgstr "Editati"
msgstr "Editeaza"
#. module: web_calendar
#. openerp-web
@ -186,7 +187,7 @@ msgstr "Dezactivat(a)"
#: code:addons/web_calendar/static/src/js/calendar.js:433
#, python-format
msgid "Create: "
msgstr ""
msgstr "Creează: "
#. module: web_calendar
#. openerp-web
@ -214,7 +215,7 @@ msgstr "Calendar"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "Vizualizarea Calendar nu a definit atributul 'data_inceput'."
#~ msgid "Navigator"
#~ msgstr "Navigator"

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-01 18:19+0000\n"
"PO-Revision-Date: 2012-12-13 23:20+0000\n"
"Last-Translator: Dusan Laznik <laznik@mentis.si>\n"
"Language-Team: Slovenian <sl@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-14 05:49+0000\n"
"X-Generator: Launchpad (build 16369)\n"
#. module: web_calendar
#. openerp-web
@ -43,7 +43,7 @@ msgstr "Shrani"
#: code:addons/web_calendar/static/src/js/calendar.js:99
#, python-format
msgid "Calendar view has a 'date_delay' type != float"
msgstr ""
msgstr "Končni datum ni pravega tipa"
#. module: web_calendar
#. openerp-web
@ -101,7 +101,7 @@ msgstr "Datum"
#: code:addons/web_calendar/static/src/js/calendar.js:468
#, python-format
msgid "Edit: "
msgstr ""
msgstr "Urejanje: "
#. module: web_calendar
#. openerp-web
@ -186,7 +186,7 @@ msgstr "Onemogočeno"
#: code:addons/web_calendar/static/src/js/calendar.js:433
#, python-format
msgid "Create: "
msgstr ""
msgstr "Ustvari: "
#. module: web_calendar
#. openerp-web
@ -214,7 +214,7 @@ msgstr "Koledar"
#: code:addons/web_calendar/static/src/js/calendar.js:91
#, python-format
msgid "Calendar view has not defined 'date_start' attribute."
msgstr ""
msgstr "Začetni datum ni definiran"
#~ msgid "Navigator"
#~ msgstr "Navigator"

View File

@ -9,18 +9,9 @@
}
.openerp .oe_calendar {
background-color: white;
height: 600px;
min-height: 600px;
border-right: 1px solid #eeeeee;
}
.openerp .oe_calendar .oe_calendar_table {
position: absolute;
left: 0px;
right: 0px;
top: 0px;
border-top: 3px solid #eeeeee;
width: 100%;
overflow: hidden;
}
.openerp .oe_calendar .oe_calendar_filter {
padding: 0 10px;
}
@ -30,9 +21,6 @@
.openerp .oe_calendar .dhx_cal_navline {
z-index: auto;
}
.openerp .oe_calendar.oe_cal_month .dhx_cal_data {
overflow-y: hidden;
}
.openerp .oe_calendar.oe_cal_month .dhx_cal_data table tr td:last-child div.dhx_month_body {
padding-right: 5px;
}

View File

@ -11,18 +11,9 @@
.oe_calendar
background-color: white
height: 600px
min-height: 600px
border-right: 1px solid #eee
.oe_calendar_table
position: absolute
left: 0px
right: 0px
top: 0px
border-top: 3px solid #eee
width: 100%
overflow: hidden
.oe_calendar_filter
padding: 0 10px
@ -36,7 +27,6 @@
z-index: auto
&.oe_cal_month .dhx_cal_data
overflow-y: hidden
table tr td:last-child div.dhx_month_body
padding-right: 5px

View File

@ -49,7 +49,9 @@ instance.web_calendar.CalendarView = instance.web.View.extend({
this.range_stop = null;
this.update_range_dates(Date.today());
this.selected_filters = [];
this.on('view_loaded', self, self.load_calendar);
},
view_loading: function(r) {
return this.load_calendar(r);
},
destroy: function() {
scheduler.clearAll();
@ -463,12 +465,12 @@ instance.web_calendar.CalendarView = instance.web.View.extend({
});
} else {
var pop = new instance.web.form.FormOpenPopup(this);
var id_for_buggy_addons = this.dataset.ids[index]; // ids could be non numeric
pop.show_element(this.dataset.model, id_for_buggy_addons, this.dataset.get_context(), {
var id_from_dataset = this.dataset.ids[index]; // dhtmlx scheduler loses id's type
pop.show_element(this.dataset.model, id_from_dataset, this.dataset.get_context(), {
title: _t("Edit: ") + this.name
});
pop.on('write_completed', self, function(){
self.reload_event(event_id);
self.reload_event(id_from_dataset);
});
}
},

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):

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-12-04 07:14+0000\n"
"Last-Translator: Ferdinand @ Camptocamp <Unknown>\n"
"PO-Revision-Date: 2012-12-16 11:11+0000\n"
"Last-Translator: Felix Schubert <Unknown>\n"
"Language-Team: German <de@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-17 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_diagram
#. openerp-web
@ -35,7 +35,7 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"Löschung dieses Knotens kann nicht widerrufen werden.\n"
"Die Löschung dieses Knotens kann nicht widerrufen werden.\n"
"Es werden ebenfalls alls verbundenen Vorgänge gelöscht.\n"
"\n"
"Sind Sie sich sicher?"
@ -83,7 +83,7 @@ msgstr "%d / %d"
#: code:addons/web_diagram/static/src/js/diagram.js:337
#, python-format
msgid "Create:"
msgstr "Erzeuge:"
msgstr "Anlegen:"
#. module: web_diagram
#. openerp-web
@ -101,6 +101,6 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"Löschung dieses Knotens kann nicht widerrufen werden.\n"
"Die Löschung dieses Knotens kann nicht widerrufen werden.\n"
"\n"
"Sind Sie sich sicher?"

View File

@ -0,0 +1,106 @@
# English (Australia) translation for openerp-web
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openerp-web package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
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-12-16 06:32+0000\n"
"Last-Translator: David Bowers <sales@skitzotek.com>\n"
"Language-Team: English (Australia) <en_AU@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-17 04:58+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:254
#: code:addons/web_diagram/static/src/js/diagram.js:319
#, python-format
msgid "Open: "
msgstr "Open: "
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:217
#, python-format
msgid ""
"Deleting this node cannot be undone.\n"
"It will also delete all connected transitions.\n"
"\n"
"Are you sure ?"
msgstr ""
"Deleting this node cannot be undone.\n"
"It will also delete all connected transitions.\n"
"\n"
"Are you sure?"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
#, python-format
msgid "New Node"
msgstr "New Node"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:312
#: code:addons/web_diagram/static/src/js/diagram.js:331
#, python-format
msgid "Transition"
msgstr "Transition"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:11
#, python-format
msgid "Diagram"
msgstr "Diagram"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:246
#: code:addons/web_diagram/static/src/js/diagram.js:280
#, python-format
msgid "Activity"
msgstr "Activity"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:422
#, python-format
msgid "%d / %d"
msgstr "%d / %d"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:285
#: code:addons/web_diagram/static/src/js/diagram.js:337
#, python-format
msgid "Create:"
msgstr "Create:"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:187
#, python-format
msgid "Are you sure?"
msgstr "Are you sure?"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:235
#, python-format
msgid ""
"Deleting this transition cannot be undone.\n"
"\n"
"Are you sure ?"
msgstr ""
"Deleting this transition cannot be undone.\n"
"\n"
"Are you sure?"

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: 2011-10-10 19:24+0000\n"
"Last-Translator: Aare Vesi <Unknown>\n"
"PO-Revision-Date: 2012-12-17 19:59+0000\n"
"Last-Translator: Ahti Hinnov <sipelgas@gmail.com>\n"
"Language-Team: Estonian <et@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-18 05:08+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_diagram
#. openerp-web
@ -41,7 +41,7 @@ msgstr ""
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
#, python-format
msgid "New Node"
msgstr ""
msgstr "Uus sõlm"
#. module: web_diagram
#. openerp-web
@ -56,7 +56,7 @@ msgstr ""
#: code:addons/web_diagram/static/src/js/diagram.js:11
#, python-format
msgid "Diagram"
msgstr ""
msgstr "Diagramm"
#. module: web_diagram
#. openerp-web
@ -71,7 +71,7 @@ msgstr ""
#: code:addons/web_diagram/static/src/js/diagram.js:422
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web_diagram
#. openerp-web
@ -79,14 +79,14 @@ msgstr ""
#: code:addons/web_diagram/static/src/js/diagram.js:337
#, python-format
msgid "Create:"
msgstr ""
msgstr "Loo:"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:187
#, python-format
msgid "Are you sure?"
msgstr ""
msgstr "Oled sa kindel?"
#. module: web_diagram
#. openerp-web

View File

@ -0,0 +1,106 @@
# Hungarian translation for openerp-web
# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012
# This file is distributed under the same license as the openerp-web package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
#
msgid ""
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-12-10 12:17+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"Language-Team: Hungarian <hu@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-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\n"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:254
#: code:addons/web_diagram/static/src/js/diagram.js:319
#, python-format
msgid "Open: "
msgstr "Megnyitás: "
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:217
#, python-format
msgid ""
"Deleting this node cannot be undone.\n"
"It will also delete all connected transitions.\n"
"\n"
"Are you sure ?"
msgstr ""
"Ennek a csomópontnak a törlését nem lehet visszaállítani.\n"
"Minden csatlakozott átmenetet is törölni fog.\n"
"\n"
"Biztos benne?"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
#, python-format
msgid "New Node"
msgstr "Új csomópont"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:312
#: code:addons/web_diagram/static/src/js/diagram.js:331
#, python-format
msgid "Transition"
msgstr "Átmenet"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:11
#, python-format
msgid "Diagram"
msgstr "Diagram"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:246
#: code:addons/web_diagram/static/src/js/diagram.js:280
#, python-format
msgid "Activity"
msgstr "Tevékenység"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:422
#, python-format
msgid "%d / %d"
msgstr "%d / %d"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:285
#: code:addons/web_diagram/static/src/js/diagram.js:337
#, python-format
msgid "Create:"
msgstr "Létrehoz:"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:187
#, python-format
msgid "Are you sure?"
msgstr "Biztos benne?"
#. module: web_diagram
#. openerp-web
#: code:addons/web_diagram/static/src/js/diagram.js:235
#, python-format
msgid ""
"Deleting this transition cannot be undone.\n"
"\n"
"Are you sure ?"
msgstr ""
"Ennek az átmenetnek a törlését nem lehet visszaállítani.\n"
"\n"
"Biztos benne ?"

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?"

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-07 20:03+0000\n"
"PO-Revision-Date: 2012-12-10 12:10+0000\n"
"Last-Translator: Grzegorz Grzelak (OpenGLOBE.pl) <grzegorz@openglobe.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-11-25 06:41+0000\n"
"X-Generator: Launchpad (build 16293)\n"
"X-Launchpad-Export-Date: 2012-12-11 05:03+0000\n"
"X-Generator: Launchpad (build 16356)\n"
#. module: web_diagram
#. openerp-web
@ -35,6 +35,10 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"Usunięcie węzła nie może być cofnięte.\n"
"Zostaną usunięte również powiązanie z nim przejścia.\n"
"\n"
"Jesteś pewien ?"
#. module: web_diagram
#. openerp-web
@ -86,7 +90,7 @@ msgstr "Utwórz:"
#: code:addons/web_diagram/static/src/js/diagram.js:187
#, python-format
msgid "Are you sure?"
msgstr ""
msgstr "Jesteś pewien?"
#. module: web_diagram
#. openerp-web
@ -97,3 +101,6 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"Usunięcie węzła nie może być cofnięte.\n"
"\n"
"Jesteś pewien ?"

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

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-03-19 23:14+0000\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"PO-Revision-Date: 2012-12-14 18:51+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-11-25 06:41+0000\n"
"X-Generator: Launchpad (build 16293)\n"
"X-Launchpad-Export-Date: 2012-12-15 05:17+0000\n"
"X-Generator: Launchpad (build 16372)\n"
#. module: web_diagram
#. openerp-web
@ -23,7 +23,7 @@ msgstr ""
#: code:addons/web_diagram/static/src/js/diagram.js:319
#, python-format
msgid "Open: "
msgstr "Deschideti: "
msgstr "Deschide: "
#. module: web_diagram
#. openerp-web
@ -35,7 +35,7 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"Stergerea acestui nod nu poate fi anulata.\n"
"Nu se va putea reveni asupra stergerii acestui nod.\n"
"Vor fi sterse, de asemenea, toate tranzitiile asociate.\n"
"\n"
"Sunteti sigur(a) ?"
@ -45,7 +45,7 @@ msgstr ""
#: code:addons/web_diagram/static/src/xml/base_diagram.xml:13
#, python-format
msgid "New Node"
msgstr "Nod nou"
msgstr "Nod Nou"
#. module: web_diagram
#. openerp-web
@ -75,7 +75,7 @@ msgstr "Activitate"
#: code:addons/web_diagram/static/src/js/diagram.js:422
#, python-format
msgid "%d / %d"
msgstr ""
msgstr "%d / %d"
#. module: web_diagram
#. openerp-web
@ -83,7 +83,7 @@ msgstr ""
#: code:addons/web_diagram/static/src/js/diagram.js:337
#, python-format
msgid "Create:"
msgstr "Creati:"
msgstr "Creeaza:"
#. module: web_diagram
#. openerp-web
@ -101,6 +101,6 @@ msgid ""
"\n"
"Are you sure ?"
msgstr ""
"Stergerea acestei tranzitii nu poate fi anulata.\n"
"Nu se va putea reveni asupra stergerii acestei tranzitii.\n"
"\n"
"Sunteti sigur(a) ?"

Some files were not shown because too many files have changed in this diff Show More