[MERGE] from trunk

bzr revid: chm@openerp.com-20130828161130-641xsmbr8xm53xjx
This commit is contained in:
Christophe Matthieu 2013-08-28 18:11:30 +02:00
commit c36bfe173e
90 changed files with 7577 additions and 650 deletions

View File

@ -6,6 +6,8 @@ Changelog
`trunk`
-------
- Improved ``html_email_clean`` in tools: better quote and signature finding,
added shortening.
- Cleaned and slightly refactored ``ir.actions.server``. The ``loop``, ``sms``
and ``dummy`` server actions have been removed; ``object_create`` and
``object_copy`` have been merged into ``object_create``; ``other`` is now ``multi``
@ -29,5 +31,15 @@ Changelog
``openerp.exceptions.RedirectWarning``.
- Give a pair of new methods to ``res.config.settings`` and a helper to make
them easier to use: ``get_config_warning()``.
- Path to webkit report files (field ``report_file``) must be writen with the
Unix way (with ``/`` and not ``\``)
- Path to webkit report files (field ``report_file``) must be written the
Unix way (with ``/`` and not ``\``)
`7.0`
-----
- Modules may now include an ``i18n_extra`` directory that will be treated like the
default ``i18n`` directory. This is typically useful for manual translation files
that are not managed by Launchpad's translation system. An example is l10n modules
that depend on ``l10n_multilang``.

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:42+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:52+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:42+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:52+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:52+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:53+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:53+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:53+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:53+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:44+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:54+0000\n"
"X-Generator: Launchpad (build 16738)\n"
"X-Poedit-Language: Czech\n"
#. module: base
@ -4897,7 +4897,7 @@ msgstr "Objednávka obědů, stravování, potraviny"
#: field:ir.model.fields,required:0
#: field:res.partner.bank.type.field,required:0
msgid "Required"
msgstr "Požadováno"
msgstr "Povinné"
#. module: base
#: model:res.country,name:base.ro
@ -7934,7 +7934,7 @@ msgstr "Zleva doprava"
#: view:res.lang:0
#: field:res.lang,translatable:0
msgid "Translatable"
msgstr "Přeložitelný"
msgstr "Přeložitelné"
#. module: base
#: help:base.language.import,code:0
@ -14735,7 +14735,7 @@ msgstr ""
#: field:ir.actions.server,trigger_obj_id:0
#: field:ir.model.fields,relation_field:0
msgid "Relation Field"
msgstr "?!?Související pole"
msgstr "Pole relace"
#. module: base
#: model:ir.module.module,description:base.module_portal_project
@ -15029,7 +15029,7 @@ msgstr ""
#. module: base
#: field:ir.model.fields,relation:0
msgid "Object Relation"
msgstr "Vztah objektu"
msgstr "Relace objektu"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_voucher

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:44+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:54+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:45+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:55+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -8452,15 +8452,15 @@ msgstr ""
"\n"
"Jeder Mitarbeiter kann seine aufgewendete Zeit für verschiedene Projekte "
"kodieren und verfolgen.\n"
"Ein Projekt ist eine analytische Rechnung und die Zeit, die jemand an diesem "
"Projekt verbracht hat,\n"
"verursacht Kosten auf dem entsprechenden Konto. \n"
"Ein Projekt wird automatisch zur Kostenstelle. Die Zeit, die jemand an "
"diesem Projekt verbracht hat,\n"
"verursacht dementsprechend Kosten auf dieser Projektkostenstelle. \n"
"\n"
"Viele Berichterstattungen über die Verfolgung von Zeit und Mitarbeiter "
"werden bereitgestellt.\n"
"Es ist vollständig in die Kostenrechnung integriert. Es ermöglicht Ihnen die "
"Einrichtung einer \n"
"Betriebsführung nach Angelegenheit.\n"
"Das Modul bietet außerdem Auswertungen zur Rückverfolgung der Mitarbeiter "
"Arbeitszeit in Projekten.\n"
"Es ist dadurch vollständig in die OpenERP Kostenrechnung integriert und "
"ermöglicht dem Management \n"
"ein effizientes Projektcontrolling.\n"
" "
#. module: base

View File

@ -12,8 +12,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:45+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:55+0000\n"
"X-Generator: Launchpad (build 16738)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:51+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -25,6 +25,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Module for the Check Writing and Check Printing.\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -60,7 +64,7 @@ msgstr "View Architecture"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Quotation, Sale Orders, Delivery & Invoicing Control"
#. module: base
#: selection:ir.sequence,implementation:0
@ -89,12 +93,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Touchscreen Interface for Shops"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Indian Payroll"
#. module: base
#: help:ir.cron,model:0
@ -138,7 +142,7 @@ msgstr ""
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Supplementary arguments"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@ -147,11 +151,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"The module adds google user in res user.\n"
"========================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Check this box if this contact is an Employee."
#. module: base
#: help:ir.model.fields,domain:0
@ -182,7 +189,7 @@ msgstr "Target Window"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Main Report File Path"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -203,6 +210,16 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Generate your Invoices from Expenses, Timesheet Entries.\n"
"========================================================\n"
"\n"
"Module to generate invoices based on costs (human resources, expenses, "
"...).\n"
"\n"
"You can define price lists in analytic account, make some theoretical "
"revenue\n"
"reports."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -253,7 +270,7 @@ msgstr "created."
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "XSL Path"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -279,7 +296,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multi Currencies"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -291,6 +308,12 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Chilean accounting chart and tax localisation.\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@ -402,6 +425,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
#. module: base
#: code:addons/orm.py:2649
@ -499,12 +524,12 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "Relation Name"
#. module: base
#: view:ir.rule:0
msgid "Create Access Right"
msgstr ""
msgstr "Create Access Right"
#. module: base
#: model:res.country,name:base.tv
@ -544,7 +569,7 @@ msgstr ""
#. module: base
#: view:workflow.transition:0
msgid "Workflow Transition"
msgstr ""
msgstr "Workflow Transition"
#. module: base
#: model:res.country,name:base.gf
@ -554,7 +579,7 @@ msgstr "French Guyana"
#. module: base
#: model:ir.module.module,summary:base.module_hr
msgid "Jobs, Departments, Employees Details"
msgstr ""
msgstr "Jobs, Departments, Employees Details"
#. module: base
#: model:ir.module.module,description:base.module_analytic
@ -594,7 +619,7 @@ msgid ""
"event registration\n"
msgstr ""
"\n"
"Organization and management of Events.\n"
"Organisation and management of Events.\n"
"======================================\n"
"\n"
"The event module allows you to efficiently organise events and all related "
@ -617,7 +642,7 @@ msgstr "Bosnian / bosanski jezik"
msgid ""
"If you check this, then the second time the user prints with same attachment "
"name, it returns the previous report."
msgstr "On checking this successive reports are generated from cache."
msgstr "With this checked, successive reports are retrieved from cache."
#. module: base
#: model:ir.module.module,description:base.module_mrp_byproduct
@ -775,6 +800,32 @@ msgid ""
"module named account_voucher.\n"
" "
msgstr ""
"\n"
"Accounting and Financial Management.\n"
"====================================\n"
"\n"
"Financial and accounting module which covers:\n"
"---------------------------------------------\n"
" * General Accounting\n"
" * Cost/Analytic accounting\n"
" * Third party accounting\n"
" * Taxes management\n"
" * Budgets\n"
" * Customer and Supplier Invoices\n"
" * Bank statements\n"
" * Reconciliation process by partner\n"
"\n"
"Creates a dashboard for accountants that includes:\n"
"--------------------------------------------------\n"
" * List of Customer Invoices to Approve\n"
" * Company Analysis\n"
" * Graph of Treasury\n"
"\n"
"Processes like maintaining the general ledger are done through the defined "
"financial Journals (entry move line or grouping is maintained through "
"journal) for a particular financial year.\n"
"For the preparation of vouchers there is a module named account_voucher.\n"
" "
#. module: base
#: view:ir.model:0
@ -802,13 +853,18 @@ msgid ""
"This module provides the Integration of the LinkedIn with OpenERP.\n"
" "
msgstr ""
"\n"
"OpenERP Web LinkedIn module.\n"
"============================\n"
"This module integrates LinkedIn with OpenERP.\n"
" "
#. module: base
#: help:ir.actions.act_window,src_model:0
msgid ""
"Optional model name of the objects on which this action should be visible"
msgstr ""
"Optional model name of the objects on which this action should be visible"
"Optional model name of the objects for which this action should be visible"
#. module: base
#: field:workflow.transition,trigger_expr_id:0
@ -823,7 +879,7 @@ msgstr "Jordan"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
msgid "Croatia - RRIF 2012 COA"
msgstr ""
msgstr "Croatia - RRIF 2012 COA"
#. module: base
#: help:ir.cron,nextcall:0
@ -952,6 +1008,30 @@ msgid ""
"also possible in order to automatically create a meeting when a holiday "
"request is accepted by setting up a type of meeting in Leave Type.\n"
msgstr ""
"\n"
"Manage leaves and allocation requests\n"
"=====================================\n"
"\n"
"This application controls the holiday schedule of your company. It allows "
"employees to request holidays. Then, managers can review requests for "
"holidays and approve or reject them. This way, you can control the overall "
"holiday planning for the company or department.\n"
"\n"
"You can configure several kinds of leaves (sickness, holiday, paid days, "
"...) and quickly allocate leaves to an employee or department via allocation "
"requests. An employee can also make a request for more days off by making a "
"new Allocation. This will increase the total available days for that leave "
"type (if the request is accepted).\n"
"\n"
"You can keep track of leaves in different ways by the following reports: \n"
"\n"
"* Leaves Summary\n"
"* Leaves by Department\n"
"* Leaves Analysis\n"
"\n"
"Synchronisation with an internal agenda (Meetings of the CRM module) is also "
"possible. In order to automatically create a meeting when a holiday request "
"is accepted, set up the type of meeting in Leave Type.\n"
#. module: base
#: selection:base.language.install,lang:0
@ -1182,6 +1262,35 @@ msgid ""
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
msgstr ""
"\n"
"The generic OpenERP Customer Relationship Management\n"
"====================================================\n"
"\n"
"This application enables a group of people to intelligently and efficiently "
"manage leads, opportunities, meetings and phone calls.\n"
"\n"
"It manages key tasks such as communication, identification, prioritisation, "
"assignment, resolution and notification.\n"
"\n"
"OpenERP ensures that all cases are successfully tracked by users, customers "
"and suppliers. It can automatically send reminders, escalate the request, "
"trigger specific methods and many other actions based on your own enterprise "
"rules.\n"
"\n"
"The greatest thing about this system is that users don't need to do anything "
"special. The CRM module has an email gateway for the synchronisation "
"interface between mails and OpenERP. That way, users can just send emails to "
"the request tracker.\n"
"\n"
"OpenERP will take care of thanking them for their message, automatically "
"routing it to the appropriate staff and make sure all future correspondence "
"gets to the right place.\n"
"\n"
"\n"
"Dashboard for CRM will include:\n"
"-------------------------------\n"
"* Planned Revenue by Stage and User (graph)\n"
"* Opportunities by Stage (graph)\n"
#. module: base
#: selection:base.language.export,format:0
@ -1278,6 +1387,48 @@ msgid ""
"come with any additional paid permission for online use of 'private "
"modules'.\n"
msgstr ""
"\n"
"Base module for the Brazilian localisation\n"
"==========================================\n"
"\n"
"This module consists in:\n"
"\n"
" - Generic Brazilian chart of accounts\n"
" - Brazilian taxes such as:\n"
"\n"
" - IPI\n"
" - ICMS\n"
" - PIS\n"
" - COFINS\n"
" - ISS\n"
" - IR\n"
" - IRPJ\n"
" - CSLL\n"
"\n"
"The field tax_discount has also been added in the account.tax.template and \n"
"account.tax objects to allow the proper computation of some Brazilian VATs \n"
"such as ICMS. The chart of account creation wizard has been extended to \n"
"propagate those new data properly.\n"
"\n"
"It's important to note however that this module lack many implementations to "
"\n"
"use OpenERP properly in Brazil. Those implementations (such as the "
"electronic \n"
"fiscal Invoicing which is already operational) are brought by more than 15 \n"
"additional modules of the Brazilian Launchpad localisation project \n"
"https://launchpad.net/openerp.pt-br-localiz and their dependencies in the \n"
"extra addons branch. Those modules aim at not breaking with the remarkable \n"
"OpenERP modularity, this is why they are numerous but small. One of the \n"
"reasons for maintaining those modules apart is that Brazilian Localisation \n"
"leaders need commit rights agility to complete the localisation as companies "
"\n"
"fund the remaining legal requirements (such as soon fiscal ledgers, \n"
"accounting SPED, fiscal SPED and PAF ECF that are still missing as September "
"\n"
"2011). Those modules are also strictly licensed under AGPL V3 and today "
"don't \n"
"come with any additional paid permission for online use of 'private "
"modules'.\n"
#. module: base
#: code:addons/orm.py:406
@ -1286,8 +1437,8 @@ msgid ""
"Language with code \"%s\" is not defined in your system !\n"
"Define it through the Administration menu."
msgstr ""
"Language with code \"%s\" is not defined in your system !\n"
"Define it through the Administration menu."
"Language with code \"%s\" is not defined in your system!\n"
"Define it through the Settings menu."
#. module: base
#: model:res.country,name:base.gu
@ -1729,6 +1880,26 @@ msgid ""
"in their pockets, this module is essential.\n"
" "
msgstr ""
"\n"
"The base module to manage lunch.\n"
"================================\n"
"\n"
"Many companies order sandwiches, pizzas and more from regular suppliers for "
"their employees providing them with extra facilities. \n"
"\n"
"However lunch management within a company requires proper administration "
"especially when the number of employees or suppliers is large. \n"
"\n"
"The “Lunch Order” module has been developed to make this management easier "
"and also to offer employees more tools and better usability. \n"
"\n"
"In addition to full meal and supplier management, this module offers the "
"possibility to display warnings and provide quick order selection based on "
"employees' preferences.\n"
"\n"
"If you want to save your employees' time and the need to always have coins "
"in their pockets, this module is essential.\n"
" "
#. module: base
#: view:wizard.ir.model.menu.create:0
@ -2014,6 +2185,22 @@ msgid ""
"synchronization with other companies.\n"
" "
msgstr ""
"\n"
"This module adds generic sharing tools to your current OpenERP database.\n"
"========================================================================\n"
"\n"
"It specifically adds a 'share' button that is available in the Web client "
"to\n"
"share any kind of OpenERP data with colleagues, customers, friends.\n"
"\n"
"The system will work by creating new users and groups on the fly, and by\n"
"combining the appropriate access rights and ir.rules to ensure that the "
"shared\n"
"users only have access to the data that has been shared with them.\n"
"\n"
"This is extremely useful for collaborative work, knowledge sharing,\n"
"synchronisation with other companies.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_process
@ -2546,7 +2733,7 @@ msgid ""
msgstr ""
"\n"
" \n"
"Belgian localization for in/outgoing invoices (prereq to account_coda):\n"
"Belgian localisation for in/outgoing invoices (prereq to account_coda):\n"
"=========================================================================\n"
" - Rename 'reference' field labels to 'Communication'\n"
" - Add support for Belgian Structured Communication\n"
@ -2641,10 +2828,10 @@ msgstr ""
"Helpdesk Management.\n"
"====================\n"
"\n"
"Like records and processing of claims, Helpdesk and Support are good tools\n"
"Like records and claims processing, Helpdesk and Support are good tools\n"
"to trace your interventions. This menu is more adapted to oral "
"communication,\n"
"which is not necessarily related to a claim. Select a customer, add notes\n"
"communication\n"
"that is not necessarily related to a claim. Select a customer, add notes\n"
"and categorise your interventions with a channel and a priority level.\n"
" "
@ -2993,6 +3180,15 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Peruvian accounting chart and tax localisation. In accordance with PCGE "
"2010.\n"
"========================================================================\n"
"\n"
"Plan contable peruano e impuestos de acuerdo a disposiciones vigentes de la\n"
"SUNAT 2011 (PCGE 2010).\n"
"\n"
" "
#. module: base
#: view:ir.actions.server:0
@ -3153,6 +3349,19 @@ msgid ""
" * Unlimited \"Group By\" levels (not stacked), two cross level analysis "
"(stacked)\n"
msgstr ""
"\n"
"Graph Views for Web Client.\n"
"===========================\n"
"\n"
" * Parse a <graph> view allowing the presentation to be changed "
"dynamically\n"
" * Graph Types: pie, line, area, bar, radar\n"
" * Stacked/Not Stacked for areas and bars\n"
" * Legends: top, inside (top/left), hidden\n"
" * Features: download as PNG or CSV, browse data grid, switch "
"orientation\n"
" * Unlimited \"Group By\" levels (not stacked), two cross level analysis "
"(stacked)\n"
#. module: base
#: view:res.groups:0
@ -3231,6 +3440,25 @@ msgid ""
"purchase price and fixed product standard price are booked on a separate \n"
"account."
msgstr ""
"\n"
"This module supports the Anglo-Saxon accounting methodology by changing the "
"accounting logic for stock transactions.\n"
"============================================================================="
"=======================================\n"
"\n"
"The difference between the Anglo-Saxon accounting countries and the Rhine \n"
"(or also called Continental accounting) countries is the timing of taking \n"
"the Cost of Goods Sold versus the Cost of Sales. Anglo-Saxon accounting \n"
"takes the cost when a sales invoice is created whereas Continental "
"accounting will \n"
"take the cost at the moment the goods are shipped.\n"
"\n"
"This module adds the functionality by using an interim account to \n"
"store the value of shipped goods. It also contra-books the interim \n"
"account at creation to transfer the amount to the \n"
"debtor or creditor account. Additionally, price differences between actual \n"
"purchase prices and fixed product standard prices are booked on a separate \n"
"account."
#. module: base
#: model:res.country,name:base.si
@ -3297,7 +3525,7 @@ msgstr "French RIB Bank Details"
#. module: base
#: view:res.lang:0
msgid "%p - Equivalent of either AM or PM."
msgstr "%p - Equivalent of either AM or PM."
msgstr "%p - Writes either AM or PM."
#. module: base
#: view:ir.actions.server:0
@ -3315,6 +3543,7 @@ msgid ""
"the user will have an access to the sales configuration as well as statistic "
"reports."
msgstr ""
"the user will have access to the sales configuration and statistic reports."
#. module: base
#: model:res.country,name:base.nz
@ -3379,6 +3608,18 @@ msgid ""
" above. Specify the interval information and partner to be invoice.\n"
" "
msgstr ""
"\n"
"Create recurring documents.\n"
"===========================\n"
"\n"
"This module allows the creation of new documents and their subscriptions.\n"
"\n"
"e.g. To have an invoice generated automatically periodically:\n"
"-------------------------------------------------------------\n"
" * Define a document type based on an Invoice object.\n"
" * Define a subscription whose source document is the document defined\n"
" above. Specify the repeat interval and the partner to be invoiced.\n"
" "
#. module: base
#: field:res.company,rml_header1:0
@ -3401,6 +3642,8 @@ msgid ""
"the user will have an access to the human resources configuration as well as "
"statistic reports."
msgstr ""
"the user will have access to the human resources configuration as well as "
"statistics reports."
#. module: base
#: model:ir.module.module,description:base.module_l10n_pl
@ -3524,6 +3767,22 @@ msgid ""
" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
" "
msgstr ""
"\n"
"Indian Payroll Salary Rules.\n"
"============================\n"
"\n"
" -Configuration of hr_payroll for India localisation\n"
" -All main contributions rules for India payslip.\n"
" * New payslip report\n"
" * Employee Contracts\n"
" * Allow to configure Basic / Gross / Net Salary\n"
" * Employee PaySlip\n"
" * Allowance / Deduction\n"
" * Integrated with Holiday Management\n"
" * Medical Allowance, Travel Allowance, Child Allowance, ...\n"
" - Payroll Advice and Report\n"
" - Yearly Salary by Head and Yearly Salary by Employee Report\n"
" "
#. module: base
#: code:addons/orm.py:3871
@ -3632,8 +3891,8 @@ msgid ""
"way you want to print them in letters and other documents. Some example: "
"Mr., Mrs. "
msgstr ""
"Manage the contact titles you want to have available in your system and the "
"way you want to print them in letters and other documents. Some example: "
"Manage the contact titles you wish to have available in your system and how "
"you want them to be printed in letters and other documents. Some examples: "
"Mr., Mrs. "
#. module: base
@ -3690,7 +3949,7 @@ msgid ""
"If you use a formula type, use a python expression using the variable "
"'object'."
msgstr ""
"If you use a formula type, use a python expression using the variable "
"If you use a formula type, use a python expression with the variable "
"'object'."
#. module: base
@ -3712,7 +3971,7 @@ msgstr "Contact Titles"
#. module: base
#: model:ir.module.module,shortdesc:base.module_product_manufacturer
msgid "Products Manufacturers"
msgstr "Products Manufacturers"
msgstr "Product Manufacturer Info"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:240
@ -3885,6 +4144,38 @@ msgid ""
"* Work Order Analysis\n"
" "
msgstr ""
"\n"
"Manage the Manufacturing process in OpenERP\n"
"===========================================\n"
"\n"
"The manufacturing module allows you to cover planning, ordering, stock and "
"the manufacturing or assembly of products from raw materials and components. "
"It handles the consumption and production of products according to a bill of "
"materials, the necessary operations by machinery and tools, and the aid of "
"human resources, all via the use of routings.\n"
"\n"
"It supports the complete integration and planning of stockable goods, "
"consumables and services. Services are completely integrated with the rest "
"of the software. For instance, you can set up a sub-contracting service in a "
"bill of materials which, on order, automatically purchases your product "
"assembly.\n"
"\n"
"Key Features\n"
"------------\n"
"* Make to Stock/Make to Order\n"
"* Multi-level bill of materials, no limit\n"
"* Multi-level routing, no limit\n"
"* Routing and work centre integrated with analytic accounting\n"
"* Periodic scheduler computation \n"
"* Allows browsing bills of materials in a complete structure including child "
"and phantom bills of materials\n"
"\n"
"Dashboard / Reports for MRP includes:\n"
"-------------------------------------\n"
"* Procurements in Exception (Graph)\n"
"* Stock Value Variation (Graph)\n"
"* Work Order Analysis\n"
" "
#. module: base
#: view:ir.attachment:0
@ -3984,8 +4275,8 @@ msgid ""
"For one2many fields, the field on the target model that implement the "
"opposite many2one relationship"
msgstr ""
"For one2many fields, the field on the target model that implements the "
"opposite many2one relationship"
"For one2many fields, the field in the target model that implements the "
"reverse many2one relationship"
#. module: base
#: view:ir.rule:0
@ -4080,6 +4371,24 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"This module allows you to define the default timesheet function of a user on "
"a given account.\n"
"============================================================================="
"================\n"
"\n"
"This is useful when a user encodes their timesheet: the values are "
"retrieved\n"
"and the fields are auto-filled. However the possibility to change these "
"values is\n"
"still available.\n"
"\n"
"Obviously if no data has been recorded for the current account, the default\n"
"value is given as usual from the employee data so that this module is "
"perfectly\n"
"compatible with older configurations.\n"
"\n"
" "
#. module: base
#: view:ir.model:0
@ -4311,7 +4620,7 @@ msgid ""
" "
msgstr ""
"\n"
"Italian accounting chart and localization.\n"
"Italian accounting chart and localisation.\n"
"================================================\n"
" "
@ -4542,7 +4851,7 @@ msgstr "Account Charts"
#. module: base
#: model:ir.ui.menu,name:base.menu_event_main
msgid "Events Organization"
msgstr ""
msgstr "Events Organisation"
#. module: base
#: model:ir.actions.act_window,name:base.action_partner_customer_form
@ -7991,6 +8300,16 @@ msgid ""
"shortcut.\n"
" "
msgstr ""
"\n"
"Enable shortcut feature in the web client.\n"
"==========================================\n"
"\n"
"Add a Shortcut icon to the systray in order to access the user's shortcuts "
"(if any).\n"
"\n"
"Add a Shortcut icon beside the views title in order to add/remove a "
"shortcut.\n"
" "
#. module: base
#: field:res.company,rml_header2:0
@ -8249,6 +8568,14 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
" Click to add a contact to your address book.\n"
" </p><p>\n"
" OpenERP helps you easily track all activities related to\n"
" a customer: discussions, history of business opportunities,\n"
" documents, etc.\n"
" </p>\n"
" "
#. module: base
#: model:ir.actions.act_window,name:base.bank_account_update
@ -16655,9 +16982,6 @@ msgstr ""
#~ msgid "maintenance.contract"
#~ msgstr "maintenance.contract"
#~ msgid "Last Connection"
#~ msgstr "Copy text \t Last Connection"
#~ msgid ""
#~ "If you need another language than the official ones available, you can "
#~ "import a language pack from here. Other OpenERP languages than the official "
@ -16753,10 +17077,6 @@ msgstr ""
#~ msgid "SMS Send"
#~ msgstr "SMS Send"
#, python-format
#~ msgid "Object %s does not exists"
#~ msgstr "Copy text \t Object %s does not exist"
#~ msgid "Waiting"
#~ msgstr "Waiting"
@ -16764,9 +17084,6 @@ msgstr ""
#~ msgid "Could not load base module"
#~ msgstr "Could not load base module"
#~ msgid "Secondary Log"
#~ msgstr "Copy text \t Secondary Log"
#~ msgid "Ignore"
#~ msgstr "Ignore"
@ -16869,9 +17186,6 @@ msgstr ""
#~ "you can add translations manually or perform a complete export (as a "
#~ "template for a new language example)."
#~ msgid "Publisher warranty contract successfully registered!"
#~ msgstr "Copy text \t Publisher warranty contract successfully registered!"
#~ msgid "state"
#~ msgstr "state"
@ -17293,6 +17607,19 @@ msgstr ""
#~ msgid "key '%s' not found in selection field '%s'"
#~ msgstr "key '%s' not found in selection field '%s'"
#~ msgid "Last Connection"
#~ msgstr "Last Connection"
#, python-format
#~ msgid "Object %s does not exists"
#~ msgstr "Object %s does not exist"
#~ msgid "Secondary Log"
#~ msgstr "Secondary Log"
#~ msgid "Publisher warranty contract successfully registered!"
#~ msgstr "Publisher warranty contract successfully registered!"
#, python-format
#~ msgid ""
#~ "Group(s) cannot be deleted, because some user(s) still belong to them: %s !"

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:49+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:59+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -8712,6 +8712,30 @@ msgid ""
" are scheduled with taking the phase's start date.\n"
" "
msgstr ""
"\n"
"Módulo de gestión de proyectos a largo plazo que registra la planificación, "
"la programación, la asignación de recursos.\n"
"============================================================================="
"==============\n"
"Características:\n"
"---------\n"
" * Gestión de grandes proyectos\n"
" * Definición de varias fases de proyecto\n"
" * Calculo de programación de fase: Calcula la fecha de inicio y fin de "
"las fases \n"
" del proyecto que están en estado borrador, abierto y pendiente. Si no "
"se especifica el proyecto\n"
" entonces se tomarán todas las fases en estado borrador, abierto y "
"pendiente.\n"
" * Calculo de programación de tareas: Funciona igual que el botón de "
"planificador en\n"
" project.phase. Toma el proyecto como argumento y calcula todas las "
"tareas en borrador,\n"
" abiertas y pendientes.\n"
" * Programación de tareas: todas las tareas que están en estado "
"borrador, abierto y pendiente\n"
" se programan tomando la fecha de inicio de la fase.\n"
" "
#. module: base
#: code:addons/orm.py:2021
@ -23520,3 +23544,115 @@ msgstr "Registro"
#~ "que hacer, y se puede concentrar en la realización efectiva de dichas "
#~ "tareas.\n"
#~ " "
#~ msgid ""
#~ "\n"
#~ "This module allows to use several analytic plans, according to the general "
#~ "journal.\n"
#~ "============================================================================="
#~ "======\n"
#~ "\n"
#~ "Here multiple analytic lines are created when the invoice or the entries\n"
#~ "are confirmed.\n"
#~ "\n"
#~ "For example, you can define the following analytic structure:\n"
#~ " Projects\n"
#~ " Project 1\n"
#~ " SubProj 1.1\n"
#~ " SubProj 1.2\n"
#~ "\n"
#~ " Project 2\n"
#~ " Salesman\n"
#~ " Eric\n"
#~ " Fabien\n"
#~ "\n"
#~ "Here, we have two plans: Projects and Salesman. An invoice line must\n"
#~ "be able to write analytic entries in the 2 plans: SubProj 1.1 and\n"
#~ "Fabien. The amount can also be split. The following example is for\n"
#~ "an invoice that touches the two subproject and assigned to one salesman:\n"
#~ "\n"
#~ "Plan1:\n"
#~ " SubProject 1.1 : 50%\n"
#~ " SubProject 1.2 : 50%\n"
#~ "Plan2:\n"
#~ " Eric: 100%\n"
#~ "\n"
#~ "So when this line of invoice will be confirmed, it will generate 3 analytic "
#~ "lines,\n"
#~ "for one account entry.\n"
#~ "The analytic plan validates the minimum and maximum percentage at the time "
#~ "of creation\n"
#~ "of distribution models.\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ "Este módulo permite usar varios planes analíticos, según el diario general.\n"
#~ "============================================================================="
#~ "======\n"
#~ "\n"
#~ "Se crean varias líneas analíticas cuando la factura o las entradas se "
#~ "confirman.\n"
#~ "\n"
#~ "Por ejemplo, se puede definir la siguiente estructura analítica:\n"
#~ " Proyectos\n"
#~ " Proyecto 1\n"
#~ " SubProyecto 1.1\n"
#~ " SubProyecto 1.2\n"
#~ " Proyecto 2\n"
#~ "\n"
#~ " Comercial\n"
#~ " Eric\n"
#~ " Fabien\n"
#~ "\n"
#~ "Como vemos, hay dos planes: Proyectos y Comercial.\n"
#~ "Una lñinea de factura debe ser capaz de escribir entradas analíticas\n"
#~ "en dos planes: SubProyecto 1.1 y Fabien. También se puede repartir la "
#~ "cantidad.\n"
#~ "\n"
#~ "El siguiente ejemplo es para una factura que afecta a los dos subproyectos\n"
#~ "y se asigna a uno de los comerciales:\n"
#~ "\n"
#~ "Plan1:\n"
#~ " SubProyecto 1.1 : 50%\n"
#~ " SubProyecto 1.2 : 50%\n"
#~ "Plan2:\n"
#~ " Eric: 100%\n"
#~ "\n"
#~ "Así, cuando se confirme la línea de factura, se generarán 3 líneas "
#~ "analíticas,\n"
#~ "para un asiento contable.\n"
#~ "El plan analítico valida los porcentajes mínimo y máximo en el momento de "
#~ "creación\n"
#~ "de los modelos distribuidos.\n"
#~ " "
#~ msgid ""
#~ "\n"
#~ "This module allows you to produce several products from one production "
#~ "order.\n"
#~ "============================================================================="
#~ "\n"
#~ "\n"
#~ "You can configure sub-products in the bill of material.\n"
#~ "\n"
#~ "Without this module:\n"
#~ " A + B + C -> D\n"
#~ "\n"
#~ "With this module:\n"
#~ " A + B + C -> D + E\n"
#~ " "
#~ msgstr ""
#~ "\n"
#~ "Este módulo permite producir varios productos desde una única orden de "
#~ "producción.\n"
#~ "============================================================================="
#~ "\n"
#~ "\n"
#~ "Se pueden configurar subproductos en la lista de materiales.\n"
#~ "\n"
#~ "Sin este módulo:\n"
#~ " A + B + C -> D\n"
#~ "\n"
#~ "Con este módulo:\n"
#~ " A + B + C -> D + E\n"
#~ " "

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:51+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:01+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:52+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:52+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
"Language: \n"
#. module: base
@ -191,7 +191,7 @@ msgstr "Ventana destino"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Ruta de archivo principal del informe"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -212,6 +212,15 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Genere facturas desde los gastos y partes de horas.\n"
"========================================================\n"
"\n"
"Módulo para generar facturas basadas en los costes (recursos humanos, "
"gastos, ...).\n"
"\n"
"Puede definir tarifas en la contabilidad analítica, realizando algún informe "
"teórico de beneficios."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -263,7 +272,7 @@ msgstr "creado."
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Ruta XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -289,7 +298,7 @@ msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multidivisa"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -301,6 +310,12 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Plan de cuentas y localización de impuestos chilenos.\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@ -313,6 +328,7 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"El usuario interno encargado de comunicarse con este contacto si lo hubiese."
#. module: base
#: view:res.partner:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:51+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:53+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:03+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -15,8 +15,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-26 05:14+0000\n"
"X-Generator: Launchpad (build 16700)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:03+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -14301,7 +14301,7 @@ msgstr ""
#: field:res.partner,vat:0
#, python-format
msgid "TIN"
msgstr ""
msgstr "RFC"
#. module: base
#: model:res.country,name:base.aw
@ -14317,7 +14317,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.ar
msgid "Argentina"
msgstr ""
msgstr "Argentina"
#. module: base
#: field:res.groups,full_name:0
@ -14358,7 +14358,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_report_designer
msgid "Advanced Reporting"
msgstr ""
msgstr "Informes avanzados"
#. module: base
#: model:ir.module.module,summary:base.module_purchase
@ -14406,7 +14406,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr
msgid "France - Accounting"
msgstr ""
msgstr "Francia - Contabilidad"
#. module: base
#: view:ir.actions.todo:0
@ -14550,7 +14550,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Czech / Čeština"
msgstr ""
msgstr "Checo / Čeština"
#. module: base
#: model:ir.module.category,name:base.module_category_generic_modules
@ -14609,7 +14609,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_hidden
#: view:res.users:0
msgid "Technical Settings"
msgstr ""
msgstr "Configuración técnica"
#. module: base
#: model:ir.module.category,description:base.module_category_accounting_and_finance
@ -14617,6 +14617,8 @@ msgid ""
"Helps you handle your accounting needs, if you are not an accountant, we "
"suggest you to install only the Invoicing."
msgstr ""
"Le ayuda a manejar sus necesidades contables. Si no es un contable, le "
"recomendamos que sólo instale el módulo 'invoicing'."
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin_thunderbird
@ -14626,7 +14628,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_event
msgid "Trainings, Conferences, Meetings, Exhibitions, Registrations"
msgstr ""
msgstr "Formaciones, conferencias, reuniones, exhibiciones, inscripciones"
#. module: base
#: model:ir.model,name:base.model_res_country
@ -14689,7 +14691,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_nl
msgid "Netherlands - Accounting"
msgstr ""
msgstr "Holanda - Contabilidad"
#. module: base
#: model:res.country,name:base.gs
@ -14714,6 +14716,11 @@ msgid ""
"1,06,500;[1,2,-1] will represent it to be 106,50,0;[3] will represent it as "
"106,500. Provided ',' as the thousand separator in each case."
msgstr ""
"El formato de separación debería ser como [,n] dónde 0 < n, empezando por "
"el dígito unidad. -1 terminará la separación. Por ej. [3,2,-1] representará "
"106500 como 1,06,500; [1,2,-1] lo representará como 106,50,0; [3] lo "
"representará como 106,500. Siempre que ',' sea el separador de mil en cada "
"caso."
#. module: base
#: field:ir.module.module,auto_install:0
@ -14733,6 +14740,12 @@ msgid ""
"taxes\n"
"and the Lempira currency."
msgstr ""
"\n"
"Éste es el módulo base para gestionar el plan de cuentas para Honduras.\n"
"====================================================================\n"
" \n"
"Agrega una nomenclatura contable para Honduras. También incluye impuestos y "
"la moneda Lempira."
#. module: base
#: model:res.country,name:base.jp
@ -14799,12 +14812,12 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ca
msgid "Canada - Accounting"
msgstr ""
msgstr "Canada - Contabilidad"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_co
msgid "Colombian - Accounting"
msgstr ""
msgstr "Contabilidad colombiana"
#. module: base
#: model:ir.module.module,description:base.module_account_voucher
@ -14871,7 +14884,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ve
msgid "Venezuela - Accounting"
msgstr ""
msgstr "Venezuela - Contabilidad"
#. module: base
#: model:res.country,name:base.cl

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:51+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:01+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:44+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:54+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:53+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:48+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:58+0000\n"
"X-Generator: Launchpad (build 16738)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:53+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:03+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:44+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:54+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:44+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:54+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -8819,7 +8819,7 @@ msgstr "Traduisible"
#. module: base
#: help:base.language.import,code:0
msgid "ISO Language and Country code, e.g. en_US"
msgstr ""
msgstr "Code ISO de la langue et du pays, ex: en_US"
#. module: base
#: model:res.country,name:base.vn
@ -8891,7 +8891,7 @@ msgstr "Sur plusieurs documents"
#: view:res.users:0
#: view:wizard.ir.model.menu.create:0
msgid "or"
msgstr ""
msgstr "ou"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_accountant
@ -9204,7 +9204,7 @@ msgstr "Cette fenêtre"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_anonymous
msgid "Anonymous portal"
msgstr ""
msgstr "Portail anonyme"
#. module: base
#: field:base.language.export,format:0
@ -9261,7 +9261,7 @@ msgstr "Mot de passe"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_claim
msgid "Portal Claim"
msgstr ""
msgstr "Portail Réclamation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_pe
@ -9275,6 +9275,9 @@ msgid ""
"Allow users to login through OAuth2 Provider.\n"
"=============================================\n"
msgstr ""
"\n"
"Permettre aux utilisateurs de se connecter via un fournisseur OAuth2.\n"
"=============================================\n"
#. module: base
#: model:ir.actions.act_window,name:base.action_model_fields
@ -9528,7 +9531,7 @@ msgstr "Comptabilité financière et analytique"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project
msgid "Portal Project"
msgstr ""
msgstr "Portail Projet"
#. module: base
#: model:res.country,name:base.cc
@ -9591,7 +9594,7 @@ msgstr ""
" </p><p>\n"
" OpenERP vous aide à suivre toutes les activités avec un "
"client : \n"
" les discussions, l'historiques des opportunités, \n"
" les discussions, l'historique des opportunités, \n"
" les documents, etc.\n"
" </p>\n"
" "
@ -9690,6 +9693,8 @@ msgid ""
"Select this if you want to set company's address information for this "
"contact"
msgstr ""
"Sélecionnez ceci si vous voulez indiquer l'adresse de la société de ce "
"contact."
#. module: base
#: field:ir.default,field_name:0
@ -9728,6 +9733,8 @@ msgid ""
"This field holds the image used as avatar for this contact, limited to "
"1024x1024px"
msgstr ""
"Ce champ contient l'image utilisée comme photo d'identité pour ce contact, "
"de taille limitée à 1024x1024px."
#. module: base
#: model:res.country,name:base.to
@ -9942,6 +9949,9 @@ msgid ""
"The kernel of OpenERP, needed for all installation.\n"
"===================================================\n"
msgstr ""
"\n"
"Le noyau d'OpenERP, nécessaire pour toute installation.\n"
"===================================================\n"
#. module: base
#: model:ir.model,name:base.model_ir_server_object_lines
@ -10040,7 +10050,7 @@ msgstr "Recherche toujours possible"
#. module: base
#: help:res.country.state,code:0
msgid "The state code in max. three chars."
msgstr ""
msgstr "Code de l'état, avec au plus trois caractères."
#. module: base
#: model:res.country,name:base.hk
@ -10050,7 +10060,7 @@ msgstr "Hong-Kong"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_sale
msgid "Portal Sale"
msgstr ""
msgstr "Portail Vente"
#. module: base
#: field:ir.default,ref_id:0
@ -10288,6 +10298,9 @@ msgid ""
"If the selected language is loaded in the system, all documents related to "
"this contact will be printed in this language. If not, it will be English."
msgstr ""
"Si la langue sélectionnée est chargée dans le système, tous les documents "
"pour ce contact seront imprimés dans cette langue. Dans le cas contraire, "
"ils le seront en anglais."
#. module: base
#: model:ir.module.module,description:base.module_hr_evaluation
@ -10502,7 +10515,7 @@ msgstr "Actions multiples"
#. module: base
#: model:ir.module.module,summary:base.module_mail
msgid "Discussions, Mailing Lists, News"
msgstr ""
msgstr "Discussions, listes de diffusion, nouvelles"
#. module: base
#: model:ir.module.module,description:base.module_fleet
@ -10976,7 +10989,7 @@ msgstr "Mali"
#. module: base
#: model:ir.ui.menu,name:base.menu_project_config_project
msgid "Stages"
msgstr ""
msgstr "Étapes"
#. module: base
#: selection:base.language.install,lang:0
@ -11088,7 +11101,7 @@ msgstr "Raccourcis personnalisés"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_si
msgid "Slovenian - Accounting"
msgstr ""
msgstr "Comptabilité - Slovénie"
#. module: base
#: model:ir.module.module,description:base.module_account_cancel
@ -11102,6 +11115,15 @@ msgid ""
"If set to true it allows user to cancel entries & invoices.\n"
" "
msgstr ""
"\n"
"Autoriser l'annulation d'écritures comptables.\n"
"====================================\n"
"\n"
"Ce module ajoute un champ \"Autoriser l'annulation d'écriture\" sur la vue "
"formulaire d'un journal de compte.\n"
"Lorsque ce champ est coché, un utilisateur peut annuler des écritures et des "
"factures.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_plugin
@ -11249,7 +11271,7 @@ msgstr "Annuler"
#: code:addons/orm.py:1507
#, python-format
msgid "Unknown database identifier '%s'"
msgstr ""
msgstr "Identifiant de base de données inconnu '%s'"
#. module: base
#: selection:base.language.export,format:0
@ -11402,7 +11424,7 @@ msgstr "Allemagne"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_oauth
msgid "OAuth2 Authentication"
msgstr ""
msgstr "Identification OAuth2"
#. module: base
#: view:workflow:0
@ -11581,7 +11603,7 @@ msgstr "Regrouper par..."
#. module: base
#: view:base.module.update:0
msgid "Module Update Result"
msgstr ""
msgstr "Résultat de la mise à jour des modules"
#. module: base
#: model:ir.module.module,description:base.module_analytic_contract_hr_expense
@ -11596,7 +11618,7 @@ msgstr ""
#. module: base
#: field:ir.attachment,store_fname:0
msgid "Stored Filename"
msgstr ""
msgstr "Nom du fichier enregistré"
#. module: base
#: field:res.partner,use_parent_address:0
@ -11653,6 +11675,14 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
"Cliquez pour ajouter un contact dans votre carnet d'adresses.\n"
"</p><p>\n"
"OpenERP vous aide à suivre toutes les activités d'un fournisseur :\n"
"les discussions, l'historique des achats,\n"
"les documents, etc.\n"
"</p>\n"
" "
#. module: base
#: model:res.country,name:base.lr
@ -11820,7 +11850,7 @@ msgstr "Unité de l'intervalle"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_stock
msgid "Portal Stock"
msgstr ""
msgstr "Portail Stock"
#. module: base
#: field:workflow.activity,kind:0
@ -11903,7 +11933,7 @@ msgstr "res.request"
#. module: base
#: field:res.partner,image_medium:0
msgid "Medium-sized image"
msgstr ""
msgstr "Image de taille moyenne"
#. module: base
#: view:ir.model:0
@ -11988,7 +12018,7 @@ msgstr "Règles sur les enregistrements"
#. module: base
#: view:multi_company.default:0
msgid "Multi Company"
msgstr ""
msgstr "Multi société"
#. module: base
#: model:ir.module.category,name:base.module_category_portal
@ -12005,7 +12035,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:294
#, python-format
msgid "See all possible values"
msgstr ""
msgstr "Voir toutes les valeurs possibles"
#. module: base
#: model:ir.module.module,description:base.module_claim_from_delivery
@ -12066,7 +12096,7 @@ msgstr "Guinée Bissau"
#. module: base
#: field:ir.actions.report.xml,header:0
msgid "Add RML Header"
msgstr ""
msgstr "Ajouter l'en-tête RML"
#. module: base
#: help:res.company,rml_footer:0
@ -12201,7 +12231,7 @@ msgstr "A Faire"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_hr_employees
msgid "Portal HR employees"
msgstr ""
msgstr "Portail RH Employés"
#. module: base
#: selection:base.language.install,lang:0
@ -12321,6 +12351,8 @@ msgstr ""
msgid ""
"Please contact your system administrator if you think this is an error."
msgstr ""
"Vous pouvez contacter votre administrateur système si vous pensez qu'il "
"s'agit d'une erreur."
#. module: base
#: code:addons/base/module/module.py:545
@ -12368,6 +12400,8 @@ msgid ""
"One of the documents you are trying to access has been deleted, please try "
"again after refreshing."
msgstr ""
"L'un des documents que vous voulez consulter a été supprimé : actualisez la "
"page puis réessayez."
#. module: base
#: model:ir.model,name:base.model_ir_mail_server
@ -12539,7 +12573,7 @@ msgstr ""
#. module: base
#: help:res.partner,ean13:0
msgid "BarCode"
msgstr ""
msgstr "Code-barres"
#. module: base
#: help:ir.model.fields,model_id:0
@ -12561,6 +12595,7 @@ msgstr "Martinique (Française)"
#: help:res.partner,is_company:0
msgid "Check if the contact is a company, otherwise it is a person"
msgstr ""
"Cochez si ce contact est une société, sinon il s'agit d'un particulier"
#. module: base
#: view:ir.sequence.type:0
@ -12570,7 +12605,7 @@ msgstr "Type de séquences"
#. module: base
#: view:res.partner:0
msgid "Mobile:"
msgstr ""
msgstr "Portable :"
#. module: base
#: code:addons/base/res/res_bank.py:195
@ -12637,7 +12672,7 @@ msgstr ""
#: code:addons/base/ir/ir_model.py:1031
#, python-format
msgid "Permission Denied"
msgstr ""
msgstr "Permission refusée"
#. module: base
#: field:ir.ui.menu,child_id:0
@ -12758,7 +12793,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.bl
msgid "Saint Barthélémy"
msgstr ""
msgstr "Saint Barthélémy"
#. module: base
#: selection:ir.module.module,license:0
@ -12830,13 +12865,13 @@ msgstr "Arabe / الْعَرَبيّة"
#. module: base
#: selection:ir.translation,state:0
msgid "Translated"
msgstr ""
msgstr "Traduit"
#. module: base
#: model:ir.actions.act_window,name:base.action_inventory_form
#: model:ir.ui.menu,name:base.menu_action_inventory_form
msgid "Default Company per Object"
msgstr ""
msgstr "Société par défaut par objet"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_hello
@ -12866,7 +12901,7 @@ msgstr "Domaine"
#: code:addons/base/ir/ir_fields.py:166
#, python-format
msgid "Use '1' for yes and '0' for no"
msgstr ""
msgstr "Utilisez \"1\" pour oui et \"0\" pour non"
#. module: base
#: model:ir.module.module,shortdesc:base.module_marketing_campaign
@ -13004,6 +13039,9 @@ msgid ""
"Allow users to sign up through OAuth2 Provider.\n"
"===============================================\n"
msgstr ""
"\n"
"Permettre aux utilisateurs de se connecter via un fournisseur OAuth2.\n"
"===============================================\n"
#. module: base
#: field:change.password.user,user_id:0
@ -13062,7 +13100,7 @@ msgstr "Grenade"
#. module: base
#: help:res.partner,customer:0
msgid "Check this box if this contact is a customer."
msgstr ""
msgstr "Cochez cette case si le contact est un client."
#. module: base
#: view:ir.actions.server:0
@ -13142,7 +13180,7 @@ msgstr ""
#: field:ir.actions.report.xml,report_rml_content:0
#: field:ir.actions.report.xml,report_rml_content_data:0
msgid "RML Content"
msgstr ""
msgstr "Contenu RML"
#. module: base
#: view:res.lang:0
@ -13383,7 +13421,7 @@ msgstr ""
#. module: base
#: model:ir.model,name:base.model_ir_fields_converter
msgid "ir.fields.converter"
msgstr ""
msgstr "ir.fields.converter"
#. module: base
#: code:addons/base/res/res_partner.py:439
@ -13411,12 +13449,12 @@ msgstr "Annuler l'installation"
#. module: base
#: model:ir.model,name:base.model_ir_model_relation
msgid "ir.model.relation"
msgstr ""
msgstr "ir.model.relation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_check_writing
msgid "Check Writing"
msgstr ""
msgstr "Écriture de chèques"
#. module: base
#: model:ir.module.module,description:base.module_plugin_outlook
@ -13641,7 +13679,7 @@ msgstr "Grande Bretagne - Comptabilité"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_madam
msgid "Mrs."
msgstr ""
msgstr "Mme"
#. module: base
#: code:addons/base/ir/ir_model.py:432
@ -13663,6 +13701,7 @@ msgstr "Réf. utilisateur"
#, python-format
msgid "'%s' does not seem to be a valid datetime for field '%%(field)s'"
msgstr ""
"'%s' ne semble pas être une date/heure valide pour le champ '%%(fields)s'"
#. module: base
#: model:res.partner.bank.type.field,name:base.bank_normal_field_bic
@ -13813,7 +13852,7 @@ msgstr "Informations sur la connexion"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_prof
msgid "Professor"
msgstr ""
msgstr "Professeur"
#. module: base
#: model:res.country,name:base.hm
@ -13842,7 +13881,7 @@ msgstr "Vous aide à gérer vos devis, commandes et factures"
#. module: base
#: field:res.users,login_date:0
msgid "Latest connection"
msgstr ""
msgstr "Dernière connexion"
#. module: base
#: field:res.groups,implied_ids:0
@ -13859,7 +13898,7 @@ msgstr "Sélection"
#: model:ir.actions.act_window,name:base.change_password_wizard_action
#: view:res.users:0
msgid "Change Password"
msgstr ""
msgstr "Modifier le mot de passe"
#. module: base
#: model:ir.module.module,description:base.module_l10n_es
@ -13927,7 +13966,7 @@ msgstr "Binaire"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_doctor
msgid "Doctor"
msgstr ""
msgstr "Docteur"
#. module: base
#: model:ir.module.module,description:base.module_mrp_repair
@ -14136,12 +14175,12 @@ msgstr "Mois de création"
#. module: base
#: field:ir.module.module,demo:0
msgid "Demo Data"
msgstr ""
msgstr "Données de démonstration"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_mister
msgid "Mr."
msgstr ""
msgstr "M."
#. module: base
#: model:res.country,name:base.mv
@ -14261,7 +14300,7 @@ msgstr ""
#. module: base
#: field:ir.actions.report.xml,report_sxw:0
msgid "SXW Path"
msgstr ""
msgstr "Emplacement SXW"
#. module: base
#: model:ir.module.module,description:base.module_account_asset
@ -14294,7 +14333,7 @@ msgstr "Banque"
#: model:ir.module.category,name:base.module_category_point_of_sale
#: model:ir.module.module,shortdesc:base.module_point_of_sale
msgid "Point of Sale"
msgstr ""
msgstr "Point de vente"
#. module: base
#: model:ir.module.module,description:base.module_mail
@ -15202,7 +15241,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Fax:"
msgstr ""
msgstr "Fax :"
#. module: base
#: selection:ir.ui.view,type:0
@ -15480,7 +15519,7 @@ msgstr "Modules d'installation"
#. module: base
#: model:ir.ui.menu,name:base.menu_import_crm
msgid "Import & Synchronize"
msgstr ""
msgstr "Importer et synchroniser"
#. module: base
#: view:res.partner:0
@ -15680,7 +15719,7 @@ msgstr "Action due plusieurs documents"
#: model:ir.actions.act_window,name:base.action_partner_title_partner
#: model:ir.ui.menu,name:base.menu_partner_title_partner
msgid "Titles"
msgstr ""
msgstr "Civilités et Formes juridiques"
#. module: base
#: model:ir.module.module,description:base.module_anonymization
@ -15968,7 +16007,7 @@ msgstr "Modules à mettre à jour"
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_multicompany
msgid "Multi-Companies"
msgstr ""
msgstr "Multi-sociétés"
#. module: base
#: field:workflow,osv:0
@ -16288,7 +16327,7 @@ msgstr "Accès"
#: field:res.partner,vat:0
#, python-format
msgid "TIN"
msgstr ""
msgstr "Numéro fiscal"
#. module: base
#: model:res.country,name:base.aw
@ -16388,7 +16427,7 @@ msgstr "Services après vente"
#. module: base
#: field:base.language.import,code:0
msgid "ISO Code"
msgstr ""
msgstr "Code ISO"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr
@ -16567,6 +16606,9 @@ msgid ""
"Allow users to login through OpenID.\n"
"====================================\n"
msgstr ""
"\n"
"Permettre aux utilisateurs de se connecter via OpenID.\n"
"====================================\n"
#. module: base
#: help:ir.mail_server,smtp_port:0
@ -16809,7 +16851,7 @@ msgstr "Canada - Comptabilité"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_co
msgid "Colombian - Accounting"
msgstr ""
msgstr "Colombie - Comptabilité"
#. module: base
#: model:ir.module.module,description:base.module_account_voucher
@ -16991,12 +17033,12 @@ msgstr "Mise à jour du système"
#: field:ir.actions.report.xml,report_sxw_content:0
#: field:ir.actions.report.xml,report_sxw_content_data:0
msgid "SXW Content"
msgstr ""
msgstr "Contenu SXW"
#. module: base
#: field:ir.attachment,file_size:0
msgid "File Size"
msgstr ""
msgstr "Taille du fichier"
#. module: base
#: help:ir.sequence,prefix:0
@ -17011,7 +17053,7 @@ msgstr "Seychelles"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_4
msgid "Gold"
msgstr ""
msgstr "Or"
#. module: base
#: code:addons/base/res/res_company.py:173
@ -17038,7 +17080,7 @@ msgstr "Informations générales"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_pt
msgid "Portugal - Chart of Accounts"
msgstr ""
msgstr "Portugal - Plan comptable"
#. module: base
#: field:ir.model.data,complete_name:0
@ -17088,6 +17130,8 @@ msgid ""
"Tax Identification Number. Check the box if this contact is subjected to "
"taxes. Used by the some of the legal statements."
msgstr ""
"Numéro fiscal. Cochez cette case si ce contact est soumis au paiement de "
"taxe. Utilisé dans certains documents légaux."
#. module: base
#: field:res.partner.bank,partner_id:0
@ -17269,6 +17313,14 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
"Cliquez pour ajouter un contact dans votre carnet d'adresses.\n"
"</p><p>\n"
"OpenERP vous aide à suivre toutes les activités d'un client :\n"
"les discussions, l'historique des opportunités,\n"
"les documents, etc.\n"
"</p>\n"
" "
#. module: base
#: model:res.partner.category,name:base.res_partner_category_2

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:52+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:45+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:55+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:45+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:55+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -29,12 +29,12 @@ msgstr ""
#. module: base
#: model:res.country,name:base.sh
msgid "Saint Helena"
msgstr ""
msgstr "સંત હેલેના"
#. module: base
#: view:ir.actions.report.xml:0
msgid "Other Configuration"
msgstr "બીજા કન્ફિગ્યુરેશન"
msgstr "અન્ય રેખાંકન"
#. module: base
#: selection:ir.property,type:0
@ -232,7 +232,7 @@ msgstr "સ્પાર્સ ફિલ્ડ \"%s\" નુ નામ બદલ
#. module: base
#: model:res.country,name:base.sz
msgid "Swaziland"
msgstr "સ્વાઝિલેન્ડ"
msgstr "સ્વાઝલેન્ડ"
#. module: base
#: code:addons/orm.py:4485

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:45+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:55+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:46+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:56+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:49+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:59+0000\n"
"X-Generator: Launchpad (build 16738)\n"
"Language: hr\n"
#. module: base

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:46+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:56+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -9,8 +9,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:43+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:53+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:46+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:56+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -42,7 +42,7 @@ msgstr "Konfigurasi Lainnya"
#. module: base
#: selection:ir.property,type:0
msgid "DateTime"
msgstr ""
msgstr "DateTime"
#. module: base
#: code:addons/fields.py:652
@ -51,6 +51,8 @@ msgid ""
"The second argument of the many2many field %s must be a SQL table !You used "
"%s, which is not a valid SQL table name."
msgstr ""
"Argumen kedua dari field many2many %s harus merupakan tabel SQL ! Anda "
"menggunakan %s, yang mana bukan table SQL."
#. module: base
#: field:ir.ui.view,arch:0
@ -66,7 +68,7 @@ msgstr "Kontrol Penawaran, Pesanan Penjualan, Pengiriman & Faktur"
#. module: base
#: selection:ir.sequence,implementation:0
msgid "No gap"
msgstr ""
msgstr "Tidak ada gap"
#. module: base
#: selection:base.language.install,lang:0
@ -76,7 +78,7 @@ msgstr "Bahasa Hungaria"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (PY) / Español (PY)"
msgstr ""
msgstr "Bahasa Spanyol"
#. module: base
#: model:ir.module.category,description:base.module_category_project_management
@ -84,27 +86,30 @@ msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr ""
"Memungkinkan Anda untuk mengelola proyek dan tugas dengan cara melacaknya, "
"menghasilkan perencanaan dan lain sebagainya ..."
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Antarmuka layar sentuh untuk digunakan di toko"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "Payroll untuk India"
#. module: base
#: help:ir.cron,model:0
msgid ""
"Model name on which the method to be called is located, e.g. 'res.partner'."
msgstr ""
"Sebutkan nama model yang mana metode ini akan dipanggil, misal 'res.partner'."
#. module: base
#: view:ir.module.module:0
msgid "Created Views"
msgstr "View Tercipta"
msgstr "View yang diciptakan"
#. module: base
#: model:ir.module.module,description:base.module_product_manufacturer
@ -121,11 +126,24 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"Modul ini berfungsi untuk menambahkan nama produsen beserta atributnya pada "
"formulir produk.\n"
"============================================================================="
"==\n"
"\n"
"Anda dapat mengisi data-data berikut pada produk:\n"
"------------------------------------------------\n"
"* Nama produsen\n"
"* Nama produk produsen\n"
"* Code produk produsen\n"
"* Atribut produk\n"
" "
#. module: base
#: field:ir.actions.client,params:0
msgid "Supplementary arguments"
msgstr ""
msgstr "Argumen tambahan"
#. module: base
#: model:ir.module.module,description:base.module_google_base_account
@ -134,11 +152,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"Modul ini akan menambahkan google user dalam obyek res.user\n"
"====================================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Centang kotak ini jika kontak adalah pegawai"
#. module: base
#: help:ir.model.fields,domain:0
@ -147,6 +168,9 @@ msgid ""
"specified as a Python expression defining a list of triplets. For example: "
"[('color','=','red')]"
msgstr ""
"Sebuah domain (opsional) untuk membatasi nilai untuk field yang terelasi, "
"dimana merupakan ekspresi Python yang mendefinisikan daftar triplet. Sebagai "
"contoh: [('color', '=', 'merah')]"
#. module: base
#: field:res.partner,ref:0
@ -156,7 +180,7 @@ msgstr "Referensi"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba
msgid "Belgium - Structured Communication"
msgstr ""
msgstr "Belgia - Komunikasi terstruktur"
#. module: base
#: field:ir.actions.act_window,target:0
@ -166,12 +190,12 @@ msgstr "Jendela Sasaran"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Path (lokasi) file laporan"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
msgid "Sales Analytic Distribution"
msgstr ""
msgstr "Untuk mendistribusikan data analisis pada proses Penjualan"
#. module: base
#: model:ir.module.module,description:base.module_hr_timesheet_invoice
@ -203,12 +227,14 @@ msgid ""
"Properties of base fields cannot be altered in this manner! Please modify "
"them through Python code, preferably through a custom addon!"
msgstr ""
"Sifat field basis tidak dapat diubah dengan cara ini! Silahkan "
"memodifikasinya melalui kode Python, sebaiknya dibuat modul terpisah."
#. module: base
#: code:addons/osv.py:151
#, python-format
msgid "Constraint Error"
msgstr ""
msgstr "Kesalahan"
#. module: base
#: model:ir.model,name:base.model_ir_ui_view_custom
@ -219,7 +245,7 @@ msgstr "ir.ui.view.custom"
#: code:addons/base/ir/ir_model.py:374
#, python-format
msgid "Renaming sparse field \"%s\" is not allowed"
msgstr ""
msgstr "Mengganti nama field \"%s\" tidak diperbolehkan"
#. module: base
#: model:res.country,name:base.sz
@ -235,12 +261,12 @@ msgstr "dibuat"
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "Lokasi file XSL"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
msgid "Turkey - Accounting"
msgstr ""
msgstr "Turki - Akunting"
#. module: base
#: field:ir.sequence,number_increment:0
@ -256,12 +282,12 @@ msgstr "Struktur Perusahaan"
#. module: base
#: selection:base.language.install,lang:0
msgid "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
msgstr ""
msgstr "Inuktitut / ᐃᓄᒃᑎᑐᑦ"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "Multi Mata Uang"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -277,7 +303,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
msgid "Sales Management"
msgstr ""
msgstr "Manajemen Penjualan"
#. module: base
#: help:res.partner,user_id:0
@ -285,6 +311,7 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"Pengguna/user yang ditugaskan berhubungan dengan kontak ini, jika ada."
#. module: base
#: view:res.partner:0
@ -299,7 +326,7 @@ msgstr "Jumlah Modul"
#. module: base
#: help:multi_company.default,company_dest_id:0
msgid "Company to store the current record"
msgstr ""
msgstr "Perusahaan untuk menyimpan data ini"
#. module: base
#: field:res.partner.bank.type.field,size:0
@ -312,6 +339,8 @@ msgid ""
"Database ID of record to open in form view, when ``view_mode`` is set to "
"'form' only"
msgstr ""
"Database ID dari data yang akan dibuka dalam tampilan formulir (form view), "
"dimana \"view_mode\" diberi nilai \"form\"."
#. module: base
#: help:ir.values,key2:0
@ -327,7 +356,7 @@ msgstr ""
#. module: base
#: sql_constraint:res.lang:0
msgid "The name of the language must be unique !"
msgstr ""
msgstr "Nama bahasa harus unik"
#. module: base
#: selection:res.request,state:0
@ -355,7 +384,7 @@ msgstr ""
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
msgid "Customer Relationship Management"
msgstr ""
msgstr "Manajemen Hubungan Pelanggan"
#. module: base
#: model:ir.module.module,description:base.module_delivery
@ -377,40 +406,42 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Sudah ada filter yang telah ditetapkan untuk %(model)s, silakan hapus atau "
"rubah dulu sebelum menetapkan nilai baru."
#. module: base
#: code:addons/orm.py:2649
#, python-format
msgid "Invalid group_by"
msgstr ""
msgstr "group_by salah"
#. module: base
#: field:ir.module.category,child_ids:0
msgid "Child Applications"
msgstr ""
msgstr "Aplikasi Anak"
#. module: base
#: field:res.partner,credit_limit:0
msgid "Credit Limit"
msgstr ""
msgstr "Batas Kredit"
#. module: base
#: field:ir.model.constraint,date_update:0
#: field:ir.model.data,date_update:0
#: field:ir.model.relation,date_update:0
msgid "Update Date"
msgstr "Tanggal Pembaharuan"
msgstr "Pembaharuan Tanggal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_action_rule
msgid "Automated Action Rules"
msgstr ""
msgstr "Aturan Aksi Otomatis"
#. module: base
#: view:ir.attachment:0
#: field:ir.attachment,create_uid:0
msgid "Owner"
msgstr ""
msgstr "Pemilik"
#. module: base
#: view:ir.actions.act_window:0
@ -420,7 +451,7 @@ msgstr "Sumber Obyek"
#. module: base
#: model:res.partner.bank.type,format_layout:base.bank_normal
msgid "%(bank_name)s: %(acc_number)s"
msgstr ""
msgstr "%(bank_name)s: %(acc_number)s"
#. module: base
#: view:ir.actions.todo:0
@ -445,6 +476,8 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Penetapan format data/time salah. Silakan contoh yang ditampilkan ketika "
"mengedit bahasa."
#. module: base
#: code:addons/orm.py:4153
@ -452,7 +485,7 @@ msgstr ""
msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr ""
msgstr "Data yang akan Anda modifikasi sudah dihapus (Jenis Dokumen: %s)."
#. module: base
#: help:ir.actions.act_window,views:0
@ -466,12 +499,12 @@ msgstr ""
#. module: base
#: field:ir.model.relation,name:0
msgid "Relation Name"
msgstr ""
msgstr "Nama Relasi"
#. module: base
#: view:ir.rule:0
msgid "Create Access Right"
msgstr ""
msgstr "Membuat Hak Akses"
#. module: base
#: model:res.country,name:base.tv
@ -481,7 +514,7 @@ msgstr "Tuvalu"
#. module: base
#: field:ir.actions.configuration.wizard,note:0
msgid "Next Wizard"
msgstr ""
msgstr "Wizard berikutnya"
#. module: base
#: field:res.lang,date_format:0
@ -491,7 +524,7 @@ msgstr "Format Tanggal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_report_designer
msgid "OpenOffice Report Designer"
msgstr ""
msgstr "Untuk mendesign Laporan dengan OpenOffice"
#. module: base
#: model:res.country,name:base.an

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:46+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:56+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:46+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:56+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:46+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:56+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -80,12 +80,12 @@ msgstr "スペイン語(パラグアイ)/ Español (PY)"
msgid ""
"Helps you manage your projects and tasks by tracking them, generating "
"plannings, etc..."
msgstr "プロジェクトやタスクを追跡,計画生成などすることにより、あなたのプロジェクトとタスクの管理を補助します。"
msgstr "追跡や計画生成などで、プロジェクトとタスクの管理を補助します。"
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "店舗用タッチスクリーン画面"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
@ -234,7 +234,7 @@ msgstr "作成済"
#. module: base
#: field:ir.actions.report.xml,report_xsl:0
msgid "XSL Path"
msgstr ""
msgstr "XLSパス"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_tr
@ -260,7 +260,7 @@ msgstr "イヌクウティトット語 / Inuktitut"
#. module: base
#: model:res.groups,name:base.group_multi_currency
msgid "Multi Currencies"
msgstr ""
msgstr "多通貨"
#. module: base
#: model:ir.module.module,description:base.module_l10n_cl
@ -276,7 +276,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
msgid "Sales Management"
msgstr "受注管理"
msgstr "販売管理"
#. module: base
#: help:res.partner,user_id:0
@ -654,7 +654,7 @@ msgstr "パラオ"
#. module: base
#: view:res.partner:0
msgid "Sales & Purchases"
msgstr "受注と発注"
msgstr "販売・購買"
#. module: base
#: view:ir.translation:0
@ -1535,7 +1535,7 @@ msgstr ""
#: model:ir.module.category,name:base.module_category_purchase_management
#: model:ir.ui.menu,name:base.menu_purchase_root
msgid "Purchases"
msgstr "発注"
msgstr "購買"
#. module: base
#: model:res.country,name:base.md
@ -4589,7 +4589,7 @@ msgstr "ヒンディー語 / हिंदी"
#: model:ir.actions.act_window,name:base.action_view_base_language_install
#: model:ir.ui.menu,name:base.menu_view_base_language_install
msgid "Load a Translation"
msgstr ""
msgstr "言語の追加"
#. module: base
#: field:ir.module.module,latest_version:0
@ -9728,7 +9728,7 @@ msgstr "受注オーダーのマージン"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase
msgid "Purchase Management"
msgstr "発注管理"
msgstr "購買管理"
#. module: base
#: field:ir.module.module,published_version:0
@ -14274,7 +14274,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_custom_multicompany
msgid "Multi-Companies"
msgstr ""
msgstr "複数会社設定"
#. module: base
#: field:workflow,osv:0
@ -15190,7 +15190,7 @@ msgstr "条件"
#: model:ir.actions.client,name:base.modules_updates_act_cl
#: model:ir.ui.menu,name:base.menu_module_updates
msgid "Updates"
msgstr ""
msgstr "アップデート"
#. module: base
#: help:res.currency,rate:0
@ -15402,7 +15402,7 @@ msgstr ""
#: model:ir.actions.act_window,name:base.open_module_tree
#: model:ir.ui.menu,name:base.menu_module_tree
msgid "Installed Modules"
msgstr ""
msgstr "インストール済のモジュール"
#. module: base
#: code:addons/base/res/res_users.py:170
@ -15465,7 +15465,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Internal Notes"
msgstr ""
msgstr "内部注記"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_pvt_ltd
@ -15476,7 +15476,7 @@ msgstr "会社"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase_requisition
msgid "Purchase Requisitions"
msgstr "発注依頼"
msgstr "購買依頼"
#. module: base
#: selection:ir.actions.act_window,target:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:45+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:55+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:47+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:57+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:47+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:57+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:47+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:57+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:47+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:57+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:47+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:57+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:48+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:57+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:48+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:58+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:44+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:54+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -9702,7 +9702,7 @@ msgstr "Gebruikersinterface"
#. module: base
#: model:ir.module.module,shortdesc:base.module_mrp_byproduct
msgid "MRP Byproducts"
msgstr "productie bijproducten"
msgstr "Productie bijproducten"
#. module: base
#: field:res.request,ref_partner_id:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:52+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:48+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:58+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -2052,7 +2052,7 @@ msgstr "Turkmenistan"
#. module: base
#: view:res.lang:0
msgid "7. %H:%M:%S ==> 18:25:20"
msgstr ""
msgstr "7. %H:%M:%S ==> 18:25:20"
#. module: base
#: view:res.partner:0
@ -2579,7 +2579,7 @@ msgstr "Dodatkowe"
#. module: base
#: model:res.country,name:base.st
msgid "Saint Tome (Sao Tome) and Principe"
msgstr ""
msgstr "Wyspy Świętego Tomasza i Książęca"
#. module: base
#: selection:res.partner,type:0
@ -4261,7 +4261,7 @@ msgstr "Wymagana grupa"
#. module: base
#: view:res.lang:0
msgid "6. %d, %m ==> 05, 12"
msgstr ""
msgstr "6. %d, %m ==> 05, 12"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_it
@ -5146,7 +5146,7 @@ msgstr "Ścieżka XML"
#. module: base
#: model:res.country,name:base.bj
msgid "Benin"
msgstr ""
msgstr "Benin"
#. module: base
#: model:ir.actions.act_window,name:base.action_res_partner_bank_type_form
@ -5340,7 +5340,7 @@ msgstr "Syria"
#. module: base
#: view:res.lang:0
msgid "======================================================"
msgstr ""
msgstr "======================================================"
#. module: base
#: sql_constraint:ir.model:0
@ -5453,6 +5453,7 @@ msgstr "Nazwa posiadacza konta"
#, python-format
msgid "Cannot rename column to %s, because that column already exists!"
msgstr ""
"Nie można zmienić nazwy kolumny na %s, ponieważ ta kolumna już istnieje!"
#. module: base
#: view:ir.attachment:0
@ -5578,7 +5579,7 @@ msgstr "Wenezuela"
#. module: base
#: view:res.lang:0
msgid "9. %j ==> 340"
msgstr ""
msgstr "9. %j ==> 340"
#. module: base
#: model:res.country,name:base.zm
@ -5943,7 +5944,7 @@ msgstr "Pogrupuj wg"
#. module: base
#: view:res.config.installer:0
msgid "title"
msgstr ""
msgstr "tytuł"
#. module: base
#: code:addons/base/ir/ir_fields.py:146
@ -5969,7 +5970,7 @@ msgstr "Tłumaczenie"
#. module: base
#: selection:res.request,state:0
msgid "closed"
msgstr ""
msgstr "zamknięte"
#. module: base
#: selection:base.language.export,state:0
@ -12108,7 +12109,7 @@ msgstr ""
#. module: base
#: selection:ir.translation,type:0
msgid "XSL"
msgstr ""
msgstr "XSL"
#. module: base
#: code:addons/base/ir/ir_model.py:85
@ -15906,10 +15907,6 @@ msgstr ""
#~ msgid "On delete"
#~ msgstr "Przy usuwaniu"
#, python-format
#~ msgid "Not Implemented"
#~ msgstr "Nie zaimplementowane"
#~ msgid "Textile Suppliers"
#~ msgstr "Dostawca tekstyliów"
@ -17034,3 +17031,58 @@ msgstr ""
#~ "======================================\n"
#~ "\n"
#~ "Moduł umożliwia planowanie wsteczne zarządzające twoimi wydarzeniami.\n"
#, python-format
#~ msgid "Not Implemented"
#~ msgstr "Niezaimplementowane"
#~ msgid ""
#~ "OpenERP translations (core, modules, clients) are managed through "
#~ "Launchpad.net, our open source project management facility. We use their "
#~ "online interface to synchronize all translations efforts."
#~ msgstr ""
#~ "Tłumaczenia OpenERP (jądro, moduły, klient) są zarządzane poprzez "
#~ "Launchpad.net. Używamy ich interfejsu online by synchronizować wszelkie "
#~ "tłumaczenia."
#~ msgid ","
#~ msgstr ","
#~ msgid "S. Georgia & S. Sandwich Isls."
#~ msgstr "Georgia Południowa i Sandwich Południowy"
#~ msgid "-"
#~ msgstr "-"
#~ msgid "https://help.launchpad.net/Translations"
#~ msgstr "https://help.launchpad.net/Translations"
#~ msgid "Portugese (BR) / Português (BR)"
#~ msgstr "Portugalski (BR) / Português (BR)"
#~ msgid "Facebook"
#~ msgstr "Facebook"
#~ msgid "Openstuff.net"
#~ msgstr "Openstuff.net"
#~ msgid "Portugese / Português"
#~ msgstr "Portugalski / Português"
#~ msgid "M."
#~ msgstr "M."
#~ msgid "XML ID"
#~ msgstr "XML ID"
#~ msgid "XML Id"
#~ msgstr "XML Id"
#~ msgid "FYROM"
#~ msgstr "FYROM"
#~ msgid "Serial Key"
#~ msgstr "Klucz seryjny"
#~ msgid "Widget Wizard"
#~ msgstr "Kreator widżetów"

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:48+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:58+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -24,6 +24,10 @@ msgid ""
"================================================\n"
" "
msgstr ""
"\n"
"Módulo para Verificar a Escrita e Verificar a Impresaão.\n"
"================================================\n"
" "
#. module: base
#: model:res.country,name:base.sh
@ -122,6 +126,18 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"Um modulo que acrescenta a identificação de fabricantes e atributos ao "
"formulário de produtos.\n"
"====================================================================\n"
"\n"
"Agora é possível definir o seguinte para cada produto:\n"
"\n"
" Fabricante\n"
" Nome do produto atribuído pelo fabricante\n"
" Código do produto atribuído pelo fabricante\n"
" Atributos do produto\n"
" "
#. module: base
#: field:ir.actions.client,params:0
@ -135,6 +151,8 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"O modulo acrescenta utilizador google em \"res user\".\n"
#. module: base
#: help:res.partner,employee:0
@ -170,7 +188,7 @@ msgstr "Janela alvo"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "Caminho para o ficheiro do relatório principal"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@ -191,6 +209,15 @@ msgid ""
"revenue\n"
"reports."
msgstr ""
"\n"
"Gerar faturas através de Despesas, Folhas de Horas\n"
"========================================================\n"
"\n"
"Modulo que gera faturas baseadas em custos (recursos humanos, despesas, "
"...).\n"
"\n"
"Pode definir tabelas de preços na conta analítica, criar analises teoréticas "
"de vendas."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@ -226,7 +253,7 @@ msgstr "ir.ui.view.custom"
#: code:addons/base/ir/ir_model.py:374
#, python-format
msgid "Renaming sparse field \"%s\" is not allowed"
msgstr ""
msgstr "Não é permitido mudar o nome de sparse field \"%s\""
#. module: base
#: model:res.country,name:base.sz
@ -292,6 +319,8 @@ msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
"O utilizador interno responsável pela comunicação com este contacto (se "
"houver)"
#. module: base
#: view:res.partner:0
@ -376,6 +405,15 @@ msgid ""
"invoices from picking, OpenERP is able to add and compute the shipping "
"line.\n"
msgstr ""
"\n"
"Permite adicionar métodos de entrega nas ordens de venda e ordens de "
"preparação de encomendas.\n"
"==============================================================\n"
"\n"
"Assim é possível definir transportadores adicionais e tabelas de preços para "
"entregas. No acto de criar \n"
"uma fatura através um ordem de preparação de encomenda, OpenERP consegue "
"adicionar e calcular custos de entrega.\n"
#. module: base
#: code:addons/base/ir/ir_filters.py:80
@ -384,6 +422,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Um filtro partilhado já está definido para %(model)s, apague ou modifique o "
"filtro existente antes de criar um novo."
#. module: base
#: code:addons/orm.py:2649
@ -452,8 +492,8 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Data inválida/especifique diretiva do formato da hora. Por favor, consulte a "
"lista de diretivas permitidas, exibida quando se edita uma linguagem."
"A diretiva data/hora especificada é invalida. Por favor, consulte a lista de "
"diretivas permitidas, exibida quando se edita uma linguagem."
#. module: base
#: code:addons/orm.py:4153
@ -462,7 +502,7 @@ msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr ""
"Um dos registos que está a tentar modificar já deve ter sido excluído "
"Um dos registos que está a tentar modificar já deve ter sido apagado "
"(Document type: %s)."
#. module: base
@ -552,6 +592,15 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"Modulo para definir objetos de contabilidade analítica.\n"
"===============================================\n"
"\n"
"Na OpenERP, contas analíticas estão ligados a contas gerais embora são "
"tratados \n"
"de uma forma independente. Assim é possível adicionar operações analíticas \n"
"mesmo quando não tenham homólogos nas contas gerais.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
@ -575,6 +624,19 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"Organização e gestão de Eventos.\n"
"======================================\n"
"\n"
"O modulo de gestão de eventos permite gerir todos as tarefas associadas a "
"organização de eventos: planificação, controlo de inscrições, "
"comparecimento, etc.\n"
"\n"
"Principais Funções\n"
"------------\n"
"* Gerir os seus Eventos e Inscrições\n"
"* Utilizar e-mail para enviar confirmações de forma automática para "
"inscrições nos seus eventos.\n"
#. module: base
#: selection:base.language.install,lang:0
@ -774,6 +836,11 @@ msgid ""
"This module provides the Integration of the LinkedIn with OpenERP.\n"
" "
msgstr ""
"\n"
"Módulo OpenERP Web LinkedIn.\n"
"============================\n"
"Este módulo disponibiliza a integração do LinkedIn com o OpenERP.\n"
" "
#. module: base
#: help:ir.actions.act_window,src_model:0
@ -839,6 +906,9 @@ msgid ""
"image, with aspect ratio preserved. Use this field anywhere a small image is "
"required."
msgstr ""
"Imagem em pequeno formato para este contacto. É automaticamente "
"redimensionada para 64x64px com o racio do aspect preservado. Utilize este "
"campo onde quer que uma imagem pequena seja necessária."
#. module: base
#: help:ir.actions.server,mobile:0
@ -1327,7 +1397,7 @@ msgstr "Contribuintes"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply for Delete"
msgstr ""
msgstr "Aplicar para Apagar"
#. module: base
#: selection:ir.property,type:0
@ -1465,7 +1535,7 @@ msgstr "Haiti"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr ""
msgstr "Folha de pagamentos Francesa"
#. module: base
#: view:ir.ui.view:0
@ -1996,6 +2066,8 @@ msgid ""
"Check this box if this contact is a supplier. If it's not checked, purchase "
"people will not see it when encoding a purchase order."
msgstr ""
"Assinala nesta caixa se o contacto é fornecedor. Se não for assinalado, o "
"contacto não será visível no acto de criar uma nota de encomenda."
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
@ -2173,6 +2245,27 @@ msgid ""
"* *Before Delivery*: A Draft invoice is created and must be paid before "
"delivery\n"
msgstr ""
"\n"
"Gerir orçamentos e encomendas\n"
"==================================\n"
"\n"
"Este modulo liga a aplicação de vendas com a de gestão de armazéns.\n"
"\n"
"Preferências\n"
"-----------\n"
"* Envios: Escolha entre a entrega total ou parcial de uma encomenda.\n"
"* Faturação: Escolha o prazo de pagamento da fatura\n"
"* Incoterms: Escolha os termos de entrega da mercadoria (EXW, DDU, FOB, "
"etc.)\n"
"\n"
"Escolhe entre varias maneiras flexíveis de faturação:\n"
"\n"
"* *Manualmente*: As faturas são criados manualmente das notas de encomenda "
"quando necessário\n"
"* *Através de Ordem de Entrega*: As faturas são geradas das ordens de "
"entrega (pickings)\n"
"* *Antes de Entrega*: Uma fatura pro-forma é criado e tem de ser liquidada "
"antes de efetuar a entrega\n"
#. module: base
#: field:ir.ui.menu,complete_name:0
@ -2198,7 +2291,7 @@ msgstr ""
#. module: base
#: view:base.language.export:0
msgid "PO(T) format: you should edit it with a PO editor such as"
msgstr ""
msgstr "Formato PO(T): deve editá-lo com um editor de PO tal como"
#. module: base
#: model:ir.ui.menu,name:base.menu_administration
@ -2287,7 +2380,7 @@ msgstr "Bahamas"
#. module: base
#: field:ir.rule,perm_create:0
msgid "Apply for Create"
msgstr ""
msgstr "Aplicar para Criar"
#. module: base
#: model:ir.module.category,name:base.module_category_tools
@ -2310,6 +2403,8 @@ msgid ""
"Appears by default on the top right corner of your printed documents (report "
"header)."
msgstr ""
"Aparece por defeito no campo superior direito dos documentos impressos "
"(cabeçalho do relatório)."
#. module: base
#: field:base.module.update,update:0
@ -2357,6 +2452,31 @@ msgid ""
"* Maximal difference between timesheet and attendances\n"
" "
msgstr ""
"\n"
"Gravar e validar folhas de horas e comparecimento/assiduidade com "
"facilidade\n"
"=====================================================\n"
"\n"
"Esta aplicação cria uma nova ecrã que permite gerir comparecimento (entradas "
"e saídas) e o preenchimento de folhas de horas por período. Entradas na "
"folha de horas são efetuadas pelos funcionários diariamente. No fim do "
"período estipulado, o funcionário valida a folha de horas. De seguida a "
"folha é sujeito a aprovação da gerente de equipa. A definição do tempo de "
"cada período é feito nas configurações da empresa e podem ser efetuados "
"mensalmente ou semanalmente.\n"
"\n"
"O processo de validação da folha de horas é feito assim:\n"
"---------------------------------------------\n"
"* Preencher folha (funcionário)\n"
"* Confirmar a folha no fim do período (funcionário)\n"
"* Validação da folha pelo gestor da equipa\n"
"\n"
"As preferências de validação podem ser escolhidos nas configurações da "
"empresa:\n"
"------------------------------------------------\n"
"Periodicidade (Dia, Semana, Mês)\n"
"Diferenciação máxima permitida entre a folha de horas e comparecimento\n"
" "
#. module: base
#: code:addons/base/ir/ir_fields.py:341
@ -2429,6 +2549,9 @@ msgid ""
"=================================\n"
" "
msgstr ""
"\n"
"Permite que um utilizador anónimo aceda ao portal.\n"
" "
#. module: base
#: model:res.country,name:base.ge
@ -2677,6 +2800,12 @@ msgid ""
"orders.\n"
" "
msgstr ""
"\n"
"O modulo base para gerir distribuição analítica e notas de encomenda.\n"
"=================================================================\n"
"\n"
"Este modulo permite ligar contas analíticas a notas de encomenda.\n"
" "
#. module: base
#: model:ir.module.module,description:base.module_l10n_us
@ -2817,6 +2946,9 @@ msgid ""
"Module to attach a google document to any model.\n"
"================================================\n"
msgstr ""
"\n"
"Módulo para anexar um documento google a qualquer modelo.\n"
"=========================================================\n"
#. module: base
#: code:addons/base/ir/ir_fields.py:333
@ -5010,7 +5142,7 @@ msgstr "ir.needaction_mixin"
#. module: base
#: view:base.language.export:0
msgid "This file was generated using the universal"
msgstr ""
msgstr "Este ficheiro foi gerado usando o universal"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_7
@ -5082,7 +5214,7 @@ msgstr "Saltar"
#. module: base
#: model:ir.module.module,shortdesc:base.module_event_sale
msgid "Events Sales"
msgstr ""
msgstr "Vendas dos Eventos"
#. module: base
#: model:res.country,name:base.ls
@ -5269,7 +5401,7 @@ msgstr "Apenas se a conta bancária pertencer à sua empresa"
#: code:addons/base/ir/ir_fields.py:337
#, python-format
msgid "Unknown sub-field '%s'"
msgstr ""
msgstr "Sub-campo '%s' desconhecido"
#. module: base
#: model:res.country,name:base.za
@ -5385,6 +5517,10 @@ msgid ""
"================\n"
"\n"
msgstr ""
"\n"
"Openerp Web API.\n"
"================\n"
"\n"
#. module: base
#: selection:res.request,state:0
@ -6154,6 +6290,8 @@ msgid ""
"How many times the method is called,\n"
"a negative number indicates no limit."
msgstr ""
"Quantas vezes o método é chamado,\n"
"um número negativo sem limite."
#. module: base
#: field:res.partner.bank.type.field,bank_type_id:0
@ -6280,7 +6418,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:182
#, python-format
msgid "'%s' does not seem to be a number for field '%%(field)s'"
msgstr ""
msgstr "'%s' não parece ser um número para o campo '%%(field)s'"
#. module: base
#: help:res.country.state,name:0
@ -8013,7 +8151,7 @@ msgstr "Campo Personalizado"
#. module: base
#: model:ir.module.module,summary:base.module_account_accountant
msgid "Financial and Analytic Accounting"
msgstr ""
msgstr "Contabilidade Financeira e Analítica"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project
@ -8352,7 +8490,7 @@ msgstr "Finlândia"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_shortcuts
msgid "Web Shortcuts"
msgstr ""
msgstr "Atalhos web"
#. module: base
#: view:res.partner:0
@ -8558,6 +8696,8 @@ msgid ""
"Translation features are unavailable until you install an extra OpenERP "
"translation."
msgstr ""
"As opções de tradução estão indisponíveis até que instale uma tradução extra "
"do OpenERP."
#. module: base
#: model:ir.module.module,description:base.module_l10n_nl
@ -8752,6 +8892,9 @@ msgid ""
"If the selected language is loaded in the system, all documents related to "
"this contact will be printed in this language. If not, it will be English."
msgstr ""
"Se o idioma seleccionado está carregado no sistema, todos os documentos "
"relacionados com este contacto serão impressos neste idioma. Caso contrário "
"serão impressos em Inglês."
#. module: base
#: model:ir.module.module,description:base.module_hr_evaluation
@ -8860,7 +9003,7 @@ msgstr "Esloveno / slovenščina"
#. module: base
#: field:res.currency,position:0
msgid "Symbol Position"
msgstr ""
msgstr "Posição do Símbolo"
#. module: base
#: model:ir.module.module,description:base.module_l10n_de
@ -10007,7 +10150,7 @@ msgstr "Agrupar por..."
#. module: base
#: view:base.module.update:0
msgid "Module Update Result"
msgstr ""
msgstr "Resultado da actualização do módulo"
#. module: base
#: model:ir.module.module,description:base.module_analytic_contract_hr_expense
@ -10469,7 +10612,7 @@ msgstr ""
#. module: base
#: view:res.company:0
msgid "Click to set your company logo."
msgstr ""
msgstr "Clique para definir o logo da empresa."
#. module: base
#: view:res.lang:0
@ -10792,6 +10935,8 @@ msgid ""
"One of the documents you are trying to access has been deleted, please try "
"again after refreshing."
msgstr ""
"Um dos documentos a que tenta aceder foi removido, tente novamente depois de "
"actualizar."
#. module: base
#: model:ir.model,name:base.model_ir_mail_server
@ -11300,7 +11445,7 @@ msgstr "Ficheiro binário ou URL"
#: code:addons/base/ir/ir_fields.py:313
#, python-format
msgid "Invalid database id '%s' for the field '%%(field)s'"
msgstr ""
msgstr "Id de base de dados '%s' inválido para o campo '%%(field)s'"
#. module: base
#: view:res.lang:0
@ -11444,7 +11589,7 @@ msgstr ""
#. module: base
#: field:workflow.transition,signal:0
msgid "Signal (Button Name)"
msgstr ""
msgstr "Sinal (Nome do botão)"
#. module: base
#: view:ir.actions.act_window:0
@ -11819,7 +11964,7 @@ msgstr "ir.model.relation"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_check_writing
msgid "Check Writing"
msgstr ""
msgstr "Verificar escrita"
#. module: base
#: model:ir.module.module,description:base.module_plugin_outlook
@ -12387,7 +12532,7 @@ msgstr "Outros Parceiros"
#: view:workflow.workitem:0
#: field:workflow.workitem,state:0
msgid "Status"
msgstr ""
msgstr "Estado"
#. module: base
#: model:ir.actions.act_window,name:base.action_currency_form
@ -13376,7 +13521,7 @@ msgstr "ir.sequence.type"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll_account
msgid "Belgium - Payroll with Accounting"
msgstr ""
msgstr "Bélgica - Folha de pagamentos com Contabildade"
#. module: base
#: selection:base.language.export,format:0
@ -15269,7 +15414,7 @@ msgstr "Chile"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_view_editor
msgid "View Editor"
msgstr ""
msgstr "Ver o Editor"
#. module: base
#: view:ir.cron:0
@ -15349,6 +15494,8 @@ msgid ""
"Do you confirm the uninstallation of this module? This will permanently "
"erase all data currently stored by the module!"
msgstr ""
"Confirma a desinstalação deste módulo? Esta acção apaga todos os dados "
"guardados neste momento por este módulo!"
#. module: base
#: field:ir.actions.server,mobile:0

File diff suppressed because it is too large Load Diff

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:48+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:58+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 5.0.4\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-01-24 13:14+0000\n"
"PO-Revision-Date: 2013-08-16 11:16+0000\n"
"Last-Translator: Chertykov Denis <chertykov@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:49+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:59+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -3428,7 +3428,7 @@ msgstr "Периодические оценки, оценки, опросы"
#: model:ir.actions.act_window,name:base.ir_property_form
#: model:ir.ui.menu,name:base.menu_ir_property_form_all
msgid "Configuration Parameters"
msgstr "Конфигурационные параметры:"
msgstr "Параметры конфигурации"
#. module: base
#: constraint:ir.cron:0

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:49+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:59+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:49+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:59+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:42+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:52+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:49+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 04:59+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:53+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:03+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:00+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:00+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:00+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:00+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -2465,6 +2465,8 @@ msgstr ""
msgid ""
"No matching record found for %(field_type)s '%(value)s' in field '%%(field)s'"
msgstr ""
"'%%(field)s' Alanında %(field_type)s '%(value)s' için eşleşen kayıt "
"bulunamadı"
#. module: base
#: field:change.password.user,new_passwd:0
@ -7493,7 +7495,7 @@ msgstr "Tam Adı"
#. module: base
#: view:ir.attachment:0
msgid "on"
msgstr ""
msgstr "bunda"
#. module: base
#: view:ir.property:0
@ -9538,6 +9540,17 @@ msgid ""
"Thank you in advance for your cooperation.\n"
"Best Regards,"
msgstr ""
"Sayın Yetkili,\n"
"\n"
"Kayıtlarımıza göre hesabınızda halen yapılmamış ödemeler bulunmaktadır. "
"Lütfen aşağıdaki ayrıntıları inceleyin.\n"
"Eğer ödeme yaptıysanız, lütfen bu yazımızı dikkate almayın. Aksi durumda, "
"aşağıda belirtilen tutarı tarafımıza ödemenizi rica ederiz.\n"
"Hesabınızla ilgili herhangi bir sorunuz olursa, lütfen bize danışın.\n"
"\n"
"İşbirliğiniz için şimdiden teşekkür ederiz.\n"
"\n"
"Saygılarımızla,"
#. module: base
#: view:ir.module.category:0
@ -11262,7 +11275,7 @@ msgstr "E-Mail"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_12
msgid "Office Supplies"
msgstr ""
msgstr "Büro Malzemeleri"
#. module: base
#: field:ir.attachment,res_model:0
@ -12547,7 +12560,7 @@ msgstr "Grup adı tekil olmalı !"
#. module: base
#: help:ir.translation,module:0
msgid "Module this term belongs to"
msgstr ""
msgstr "Bu terimin ait olduğu modül"
#. module: base
#: model:ir.module.module,description:base.module_web_view_editor
@ -12761,6 +12774,8 @@ msgid ""
"Here is what we got instead:\n"
" %s"
msgstr ""
"Yerine elimize geçen:\n"
" %s"
#. module: base
#: model:ir.actions.act_window,name:base.action_model_data
@ -13124,7 +13139,7 @@ msgstr "Yeni Kaledonya"
#. module: base
#: field:ir.model,osv_memory:0
msgid "Transient Model"
msgstr ""
msgstr "Geçici Model"
#. module: base
#: model:res.country,name:base.cy
@ -13386,7 +13401,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_test
msgid "Accounting Consistency Tests"
msgstr ""
msgstr "Muhasebe Tutarlılık Testleri"
#. module: base
#: model:ir.module.module,description:base.module_purchase_double_validation
@ -14091,6 +14106,8 @@ msgid ""
"Invalid group_by specification: \"%s\".\n"
"A group_by specification must be a list of valid fields."
msgstr ""
"Geçersiz group_by özellikleri: \"%s\".\n"
"Bir group_by özellikler geçerli alanların bir listesi olmalı."
#. module: base
#: selection:ir.mail_server,smtp_encryption:0
@ -14248,7 +14265,7 @@ msgstr "Hata ! iç içe çağırılan menü oluşturamazsınız."
#. module: base
#: view:ir.translation:0
msgid "Web-only translations"
msgstr ""
msgstr "Yalnızca-web çevirileri"
#. module: base
#: view:ir.rule:0
@ -14716,6 +14733,10 @@ msgid ""
"\n"
"(Document type: %s, Operation: %s)"
msgstr ""
"Güvenlik sınırlamalarından dolayı istenen işlem tamamlanamıyor. Lütfen "
"sistem yöneticinize danışın.\n"
"\n"
"(Belge tipi: %s, İşlem: %s)"
#. module: base
#: model:ir.module.module,description:base.module_idea
@ -15574,6 +15595,8 @@ msgid ""
"Tax Identification Number. Check the box if this contact is subjected to "
"taxes. Used by the some of the legal statements."
msgstr ""
"Vergi Kimlik Numarası. Bu kişi vergiye tabiyse kutuyu işaretleyin. Bazı "
"yasal belgelerde kullanılır."
#. module: base
#: field:res.partner.bank,partner_id:0
@ -15642,6 +15665,8 @@ msgid ""
"Manage relations with prospects and customers using leads, opportunities, "
"requests or issues."
msgstr ""
"Adayları, fırsatları, istekleri ya da sorunları kullanarak potansiyeller ve "
"müşterilerle ilişkileri yönetin."
#. module: base
#: model:ir.module.module,description:base.module_project

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:00+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:01+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:50+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:01+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:52+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:03+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@ -384,6 +384,12 @@ msgid ""
"document and Wiki based Hidden.\n"
" "
msgstr ""
"\n"
"知识管理的隐藏依赖模块\n"
"=====================================\n"
"\n"
"在安装文档管理和wiki等知识管理应用的时候所依赖的隐藏模块\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_customer_relationship_management
@ -991,6 +997,21 @@ msgid ""
"also possible in order to automatically create a meeting when a holiday "
"request is accepted by setting up a type of meeting in Leave Type.\n"
msgstr ""
"\n"
"休假申请和假期分配\n"
"=====================================\n"
"\n"
"此模块管理公司员工的休假。员工可以申请休假,然后等待经理批准,当然也可能拒绝。这样就可以使公司或部门的整体休假计划得到管控。\n"
"\n"
"可以配置多种休假类型(病假、法定假日、带薪休假等)并通过分配申请分配给单个员工或部门。员工也可以申请\n"
"增加假期天数,这需要填写一个额外的假期申请。如果增加假期天数的申请被批准,这个类型假期的可用天数会自动增加。\n"
"\n"
"以下报表用于对假期进行跟踪:\n"
"* 休假总览\n"
"* 按部门休假\n"
"* 休假分析\n"
"\n"
"如果为休假设置了一种日程类型就可以与CRM中的日程同步也就是说休假批准后会在日程上标识出此员工正在休假中。\n"
#. module: base
#: selection:base.language.install,lang:0
@ -2059,7 +2080,7 @@ msgstr "读权限"
#. module: base
#: help:ir.attachment,res_id:0
msgid "The record id this is attached to"
msgstr ""
msgstr "附件相关的数据记录id"
#. module: base
#: model:ir.module.module,description:base.module_share
@ -2160,6 +2181,11 @@ msgid ""
"with the effect of creating, editing and deleting either ways.\n"
" "
msgstr ""
"\n"
"项目进度与工时记录的集成\n"
"====================================================================\n"
"安装了此模块,项目进度的添加删除和修改会自动同步到工时表上。\n"
" "
#. module: base
#: model:ir.model,name:base.model_ir_model_access
@ -2179,6 +2205,11 @@ msgid ""
" templates to target objects.\n"
" "
msgstr ""
"\n"
" * 科目表、税、税项、凭证类型、科目模版、成本要素和成本凭证类型的多语言支持。\n"
" * 对设置向导的修改\n"
" - 从模版复制科目表、税、税项和替换规则到目标数据表。\n"
" "
#. module: base
#: field:workflow.transition,act_from:0
@ -12355,7 +12386,7 @@ msgstr "选中内容"
#: model:ir.actions.act_window,name:base.change_password_wizard_action
#: view:res.users:0
msgid "Change Password"
msgstr ""
msgstr "更改密码"
#. module: base
#: model:ir.module.module,description:base.module_l10n_es
@ -12665,7 +12696,7 @@ msgstr "地址格式"
#. module: base
#: model:ir.model,name:base.model_change_password_user
msgid "Change Password Wizard User"
msgstr ""
msgstr "密码更改向导"
#. module: base
#: model:res.groups,name:base.group_no_one
@ -14304,7 +14335,7 @@ msgstr "泰国"
#. module: base
#: model:ir.model,name:base.model_change_password_wizard
msgid "Change Password Wizard"
msgstr ""
msgstr "密码更改向导"
#. module: base
#: model:ir.module.module,summary:base.module_account_voucher
@ -15618,7 +15649,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Internal Notes"
msgstr "内部单据"
msgstr "内部备注"
#. module: base
#: model:res.partner.title,name:base.res_partner_title_pvt_ltd
@ -15639,7 +15670,7 @@ msgstr "行内编辑"
#. module: base
#: selection:ir.cron,interval_type:0
msgid "Months"
msgstr "月"
msgstr "月"
#. module: base
#: view:workflow.instance:0
@ -15662,7 +15693,7 @@ msgstr "是一个公司?"
#: field:res.partner.bank,name:0
#, python-format
msgid "Bank Account"
msgstr "银行账"
msgstr "银行账"
#. module: base
#: model:res.country,name:base.kp

View File

@ -14,8 +14,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:51+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:01+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -13,8 +13,8 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-07-06 05:52+0000\n"
"X-Generator: Launchpad (build 16696)\n"
"X-Launchpad-Export-Date: 2013-08-28 05:02+0000\n"
"X-Generator: Launchpad (build 16738)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing

View File

@ -195,7 +195,8 @@ class ir_model(osv.osv):
ctx = dict(context,
field_name=vals['name'],
field_state='manual',
select=vals.get('select_level', '0'))
select=vals.get('select_level', '0'),
update_custom_fields=True)
self.pool[vals['model']]._auto_init(cr, ctx)
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res

View File

@ -84,7 +84,7 @@ class ir_sequence(openerp.osv.osv.osv):
_columns = {
'name': openerp.osv.fields.char('Name', size=64, required=True),
'code': openerp.osv.fields.selection(_code_get, 'Code', size=64),
'code': openerp.osv.fields.selection(_code_get, 'Sequence Type', size=64),
'implementation': openerp.osv.fields.selection( # TODO update the view
[('standard', 'Standard'), ('no_gap', 'No gap')],
'Implementation', required=True,

View File

@ -445,6 +445,13 @@ class ir_translation(osv.osv):
tools.trans_load(cr, base_trans_file, lang, verbose=False, module_name=module_name, context=context)
context['overwrite'] = True # make sure the requested translation will override the base terms later
# i18n_extra folder is for additional translations handle manually (eg: for l10n_be)
base_trans_extra_file = openerp.modules.get_module_resource(module_name, 'i18n_extra', base_lang_code + '.po')
if base_trans_extra_file:
_logger.info('module %s: loading extra base translation file %s for language %s', module_name, base_lang_code, lang)
tools.trans_load(cr, base_trans_extra_file, lang, verbose=False, module_name=module_name, context=context)
context['overwrite'] = True # make sure the requested translation will override the base terms later
# Step 2: then load the main translation file, possibly overriding the terms coming from the base language
trans_file = openerp.modules.get_module_resource(module_name, 'i18n', lang_code + '.po')
if trans_file:
@ -452,6 +459,11 @@ class ir_translation(osv.osv):
tools.trans_load(cr, trans_file, lang, verbose=False, module_name=module_name, context=context)
elif lang_code != 'en_US':
_logger.warning('module %s: no translation for language %s', module_name, lang_code)
trans_extra_file = openerp.modules.get_module_resource(module_name, 'i18n_extra', lang_code + '.po')
if trans_extra_file:
_logger.info('module %s: loading extra translation file (%s) for language %s', module_name, lang_code, lang)
tools.trans_load(cr, trans_extra_file, lang, verbose=False, module_name=module_name, context=context)
return True

View File

@ -229,7 +229,6 @@ class view(osv.osv):
])
view_ids = self.search(cr, uid, conditions, context=context)
# filter views based on user groups
return [(view.arch, view.id)
for view in self.browse(cr, 1, view_ids, context)
if not (view.groups_id and user_groups.isdisjoint(view.groups_id))]

View File

@ -70,7 +70,8 @@
<field name="name">ir.module.module.form</field>
<field name="model">ir.module.module</field>
<field name="arch" type="xml">
<form create="0" edit="0" string="Module" version="7.0" class='oe_styling_v8'>
<form create="0" edit="0" string="Module" version="7.0">
<link rel="stylesheet" href="/base/static/src/css/description.css"></link>
<sheet>
<field name="icon_image" widget="image" class="oe_avatar oe_left"/>
<div class="oe_title">
@ -127,9 +128,8 @@
<field name="reports_by_module"/>
</page>
</notebook>
<field name="description_html" class='oe_styling_v8'/>
</sheet>
<field name="description_html" class='oe_app_description oe_styling_v8'/>
<button name="button_immediate_install" states="uninstalled" string="Install" type="object" class="oe_highlight oe_center"/>
</form>
</field>
</record>

View File

@ -30,11 +30,13 @@ from openerp.tools.translate import _
CURRENCY_DISPLAY_PATTERN = re.compile(r'(\w+)\s*(?:\((.*)\))?')
class res_currency(osv.osv):
def _current_rate(self, cr, uid, ids, name, arg, context=None):
return self._get_current_rate(cr, uid, ids, name, arg, context=context)
return self._get_current_rate(cr, uid, ids, context=context)
def _get_current_rate(self, cr, uid, ids, name, arg, context=None):
def _current_rate_silent(self, cr, uid, ids, name, arg, context=None):
return self._get_current_rate(cr, uid, ids, raise_on_no_rate=False, context=context)
def _get_current_rate(self, cr, uid, ids, raise_on_no_rate=True, context=None):
if context is None:
context = {}
res = {}
@ -52,9 +54,12 @@ class res_currency(osv.osv):
if cr.rowcount:
id, rate = cr.fetchall()[0]
res[id] = rate
elif not raise_on_no_rate:
res[id] = 0
else:
raise osv.except_osv(_('Error!'),_("No currency rate associated for currency %d for the given period" % (id)))
return res
_name = "res.currency"
_description = "Currency"
_columns = {
@ -63,6 +68,10 @@ class res_currency(osv.osv):
'symbol': fields.char('Symbol', size=4, help="Currency sign, to be used when printing amounts."),
'rate': fields.function(_current_rate, string='Current Rate', digits=(12,6),
help='The rate of the currency to the currency of rate 1.'),
# Do not use for computation ! Same as rate field with silent failing
'rate_silent': fields.function(_current_rate_silent, string='Current Rate', digits=(12,6),
help='The rate of the currency to the currency of rate 1 (0 if no rate defined).'),
'rate_ids': fields.one2many('res.currency.rate', 'currency_id', 'Rates'),
'accuracy': fields.integer('Computational Accuracy'),
'rounding': fields.float('Rounding Factor', digits=(12,6)),

View File

@ -22,7 +22,7 @@
<field name="company_id" groups="base.group_multi_company"/>
<field name="rate_ids" invisible="1"/>
<field name="date"/>
<field name="rate"/>
<field name="rate_silent"/>
<field name="rounding"/>
<field name="accuracy"/>
<field name="position"/>
@ -37,7 +37,7 @@
<form string="Currency" version="7.0">
<group col="4">
<field name="name"/>
<field name="rate"/>
<field name="rate_silent"/>
<field name="company_id" groups="base.group_multi_company"/>
</group>

View File

@ -208,6 +208,8 @@ class res_partner(osv.osv, format_address):
return result
def _display_name_compute(self, cr, uid, ids, name, args, context=None):
context = dict(context or {})
context.pop('show_address', None)
return dict(self.name_get(cr, uid, ids, context=context))
# indirections to avoid passing a copy of the overridable method when declaring the function field

View File

@ -0,0 +1,2 @@
sass:
sass -t expanded --compass --watch --unix-newlines *.sass

View File

@ -0,0 +1,732 @@
@charset "utf-8";
/*
* This CSS is for the html description of modules
* TODO clean
*/
/* --------------------------------- *
* STYLING CONTEXT *
* --------------------------------- */
/* --- Styling for the V8/Lato/White/Purple design --- */
.openerp .oe_form_sheet_width {
max-width: 960px;
}
.openerp .oe_form .oe_styling_v8 {
width: 100%;
padding: 0;
margin: 0;
font-family: "Open Sans", "Helvetica", Sans;
font-weight: 300;
color: #646464;
background: white;
font-size: 16px;
}
.openerp .oe_form .oe_styling_v8 .oe_websiteonly {
display: none;
}
.openerp .oe_form .oe_styling_v8 .oe_website_contents {
background: whitesmoke;
padding-bottom: 1px;
}
.openerp .oe_form .oe_styling_v8 b {
font-weight: 600;
}
.openerp .oe_form .oe_styling_v8 a {
color: #6d57e0;
text-decoration: none;
}
.openerp .oe_form .oe_styling_v8 a:visited {
color: #5b284f;
}
.openerp .oe_form .oe_styling_v8 a:hover {
color: #0096eb;
}
.openerp .oe_form .oe_styling_v8 .oe_title_font {
font-family: "Lato", "Open Sans", "Helvetica", Sans;
}
.openerp .oe_form .oe_styling_v8 .oe_page {
background: white;
overflow: hidden;
-webkit-border-radius: 1px;
-moz-border-radius: 1px;
-ms-border-radius: 1px;
-o-border-radius: 1px;
border-radius: 1px;
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
}
.openerp .oe_form .oe_styling_v8 .oe_emph {
font-weight: 400;
}
.openerp .oe_form .oe_styling_v8 .oe_dark {
overflow: hidden;
background: #fcfcfc;
-webkit-box-shadow: 0px 5px 9px -7px rgba(0, 0, 255, 0.5) inset, 0px -3px 9px -7px rgba(0, 0, 255, 0.5) inset;
-moz-box-shadow: 0px 5px 9px -7px rgba(0, 0, 255, 0.5) inset, 0px -3px 9px -7px rgba(0, 0, 255, 0.5) inset;
box-shadow: 0px 5px 9px -7px rgba(0, 0, 255, 0.5) inset, 0px -3px 9px -7px rgba(0, 0, 255, 0.5) inset;
}
/* --------------------------------- *
* LAYOUT *
* --------------------------------- */
/* ------ BASE GRID CONSTRUCTS ----- */
.oe_page {
margin: 0px auto 64px auto;
max-width: 992px;
}
.oe_row {
width: 928px;
margin-top: 16px;
margin-bottom: 16px;
margin-left: auto;
margin-right: auto;
}
.oe_row.oe_fit {
width: auto;
}
.oe_clearfix:after, .oe_row:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
}
[class*='oe_span'] {
float: left;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0 16px;
}
.oe_span12 {
width: 928px;
}
.oe_span10 {
width: 773px;
}
.oe_span9 {
width: 696px;
}
.oe_span8 {
width: 618px;
}
.oe_span6 {
width: 464px;
}
.oe_span4 {
width: 309px;
}
.oe_span3 {
width: 232px;
}
.oe_span2 {
width: 154px;
}
[class*='oe_span'].oe_fit {
padding-left: 0px !important;
padding-right: 0px !important;
}
[class*='oe_span'].oe_right {
float: right;
}
.oe_row.oe_flex [class*='oe_span'] {
display: inline-block;
float: none;
vertical-align: top;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0 16px;
width: auto;
}
.oe_row.oe_flex .oe_span12 {
max-width: 928px;
}
.oe_row.oe_flex .oe_span10 {
max-width: 769px;
}
.oe_row.oe_flex .oe_span9 {
max-width: 692px;
}
.oe_row.oe_flex .oe_span8 {
max-width: 614px;
}
.oe_row.oe_flex .oe_span6 {
max-width: 460px;
}
.oe_row.oe_flex .oe_span4 {
max-width: 305px;
}
.oe_row.oe_flex .oe_span3 {
max-width: 228px;
}
.oe_row.oe_flex .oe_span2 {
max-width: 150px;
}
.oe_mb0 {
margin-bottom: 0px !important;
}
.oe_mb4 {
margin-bottom: 4px !important;
}
.oe_mb8 {
margin-bottom: 8px !important;
}
.oe_mb16 {
margin-bottom: 16px !important;
}
.oe_mb32 {
margin-bottom: 32px !important;
}
.oe_mb48 {
margin-bottom: 48px !important;
}
.oe_mb64 {
margin-bottom: 64px !important;
}
.oe_mt0 {
margin-top: 0px !important;
}
.oe_mt4 {
margin-top: 4px !important;
}
.oe_mt8 {
margin-top: 8px !important;
}
.oe_mt16 {
margin-top: 16px !important;
}
.oe_mt32 {
margin-top: 32px !important;
}
.oe_mt48 {
margin-top: 48px !important;
}
.oe_mt64 {
margin-top: 64px !important;
}
/* ------ GENERIC LAYOUT MODIFIERS ----- */
.oe_rightfit {
padding-right: 0px !important;
}
.oe_leftfit {
padding-left: 0px !important;
}
.oe_leftalign {
text-align: left;
}
.oe_rightalign {
text-align: right;
}
.oe_centeralign {
text-align: center;
}
.oe_centered {
margin-left: auto;
margin-right: auto;
}
.oe_hidden {
display: none !important;
opacity: 0 !important;
}
.oe_invisible {
visibility: hidden !important;
}
.oe_transparent {
opacity: 0 !important;
}
.oe_mb0 {
margin-bottom: 0px !important;
}
.oe_mb4 {
margin-bottom: 4px !important;
}
.oe_mb8 {
margin-bottom: 8px !important;
}
.oe_mb16 {
margin-bottom: 16px !important;
}
.oe_mb32 {
margin-bottom: 32px !important;
}
.oe_mb64 {
margin-bottom: 64px !important;
}
.oe_spaced {
margin-top: 32px;
margin-bottom: 32px;
}
.oe_more_spaced {
margin-top: 64px;
margin-bottom: 64px;
}
.oe_padded {
padding-top: 16px;
padding-bottom: 16px;
}
.oe_more_padded {
padding-top: 32px;
padding-bottom: 32px;
}
/* --------------------------------- *
* WEBPAGE COMPONENTS *
* --------------------------------- */
/* ------ BUTTONS ----- */
.oe_button {
position: relative;
bottom: 0;
display: inline-block;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.oe_styling_v8 .oe_button, .oe_styling_v8 a.oe_button {
padding: 8px 14px;
background: #8b72b6;
color: white;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: 0px 2px 0px #afa8cc;
-moz-box-shadow: 0px 2px 0px #afa8cc;
box-shadow: 0px 2px 0px #afa8cc;
text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.44);
border: solid 1px rgba(0, 0, 0, 0.09);
-webkit-transition-property: bottom, background;
-moz-transition-property: bottom, background;
-o-transition-property: bottom, background;
transition-property: bottom, background;
-webkit-transition-duration: 250ms;
-moz-transition-duration: 250ms;
-o-transition-duration: 250ms;
transition-duration: 250ms;
}
.oe_styling_v8 .oe_button:hover, .oe_styling_v8 a.oe_button:hover {
background: #8b5bdd;
color: white;
}
.oe_styling_v8 .oe_button:active, .oe_styling_v8 a.oe_button:active {
background: #333333;
bottom: -3px;
}
.oe_styling_v8 .oe_button.oe_big, .oe_styling_v8 a.oe_button.oe_big {
font-size: 24px;
}
.oe_styling_v8 .oe_button.oe_bigger, .oe_styling_v8 a.oe_button.oe_bigger {
font-size: 32px;
}
.oe_styling_v8 .oe_button.oe_small, .oe_styling_v8 a.oe_button.oe_small {
font-size: 13px;
padding: 2px 4px;
}
.oe_styling_v8 .oe_button.oe_small:active, .oe_styling_v8 a.oe_button.oe_small:active {
bottom: -1px;
}
.oe_styling_v8 .oe_button.oe_medium, .oe_styling_v8 a.oe_button.oe_medium {
padding: 5px 12px;
font-size: 16px;
}
.oe_styling_v8 .oe_button.oe_tacky, .oe_styling_v8 a.oe_button.oe_tacky {
background: #ff4444;
-webkit-box-shadow: 0px 2px 0px #eba8a8;
-moz-box-shadow: 0px 2px 0px #eba8a8;
box-shadow: 0px 2px 0px #eba8a8;
}
.oe_styling_v8 .oe_button.oe_tacky:hover, .oe_styling_v8 a.oe_button.oe_tacky:hover {
background: #ff1010;
}
.oe_styling_v8 .oe_button.oe_tacky:active, .oe_styling_v8 a.oe_button.oe_tacky:active {
background: black;
}
.oe_styling_v8 .oe_button.oe_disabled, .oe_styling_v8 a.oe_button.oe_disabled {
background: #c8c8c8;
-webkit-box-shadow: 0px 2px 0px #b4b4b4;
-moz-box-shadow: 0px 2px 0px #b4b4b4;
box-shadow: 0px 2px 0px #b4b4b4;
cursor: default;
}
.oe_styling_v8 .oe_button.oe_disabled:hover, .oe_styling_v8 a.oe_button.oe_disabled:hover {
background: #c8c8c8;
-webkit-box-shadow: 0px 2px 0px #b4b4b4;
-moz-box-shadow: 0px 2px 0px #b4b4b4;
box-shadow: 0px 2px 0px #b4b4b4;
}
.oe_styling_v8 .oe_button.oe_disabled:active, .oe_styling_v8 a.oe_button.oe_disabled:active {
background: #c8c8c8;
bottom: 0px;
-webkit-box-shadow: 0px 2px 0px #b4b4b4;
-moz-box-shadow: 0px 2px 0px #b4b4b4;
box-shadow: 0px 2px 0px #b4b4b4;
}
.oe_styling_v8.oe_styling_black .oe_button {
-webkit-box-shadow: 0px 2px 0px #463555;
-moz-box-shadow: 0px 2px 0px #463555;
box-shadow: 0px 2px 0px #463555;
}
/* ------ FORMS ----- */
.oe_styling_v8 {
/* FIXME: this is a quick hack for the release */
}
.oe_styling_v8 .oe_input {
padding: 4px 7px;
border-radius: 3px;
border: solid 1px #d6d6d6;
box-shadow: 0px 2px #e6e6e6;
background: #fafafa;
font-weight: 300;
outline: none;
-webkit-transition: all 150ms linear;
-moz-transition: all 150ms linear;
-o-transition: all 150ms linear;
transition: all 150ms linear;
}
.oe_styling_v8 .oe_input:focus {
border: solid 1px #969696;
box-shadow: 0px 2px #d2d2d2;
}
.oe_styling_v8 .oe_input.oe_valid {
background: #f2ffec;
border-color: #b1ebb6;
box-shadow: 0px 2px #e1f8e1;
color: #0f610f;
}
.oe_styling_v8 .oe_input.oe_invalid {
background: #fff2f2;
border-color: #ebb1b1;
box-shadow: 0px 2px #f8e1e1;
color: #610f0f;
}
.oe_styling_v8 .oe_input.oe_big {
padding: 8px 14px;
}
.oe_styling_v8 .oe_input_label {
font-weight: 300;
font-size: 16px;
}
.oe_styling_v8 .oe_input_label.oe_big {
font-size: 20px;
}
.oe_styling_v8 .oe_textarea {
width: 300px;
height: 80px;
}
.oe_styling_v8 .oe_form_layout_table {
width: 100%;
}
.oe_styling_v8 .oe_form_layout_table td {
padding-bottom: 16px;
}
.oe_styling_v8 .oe_form_layout_table td:first-child {
text-align: right;
padding-right: 16px;
}
/* ------ SLOGANS ----- */
.oe_styling_v8 .oe_slogan {
color: #333333;
font-family: "Lato", "Open Sans", "Helvetica", Sans;
text-align: center;
margin-top: 32px;
margin-bottom: 32px;
}
.oe_styling_v8 h1.oe_slogan {
font-size: 64px;
font-weight: 900;
margin-top: 48px;
margin-bottom: 48px;
}
.oe_styling_v8 h2.oe_slogan {
font-size: 40px;
font-weight: 300;
}
.oe_styling_v8 h3.oe_slogan {
font-size: 26px;
font-weight: 300;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
opacity: 0.5;
}
.oe_styling_v8 h4.oe_slogan {
font-size: 24px;
font-weight: 300;
}
.oe_styling_v8 h4.oe_slogan:before, .oe_styling_v8 h4.oe_slogan:after {
margin: 0 20px;
content: "";
display: inline-block;
width: 100px;
height: 0px;
border-top: solid 1px;
vertical-align: middle;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=30);
opacity: 0.3;
}
.oe_styling_v8 h5.oe_slogan {
font-weight: 300;
}
/* ------ QUOTES ----- */
.oe_quote {
margin: 8px;
padding: 16px;
background: rgba(0, 0, 0, 0.02);
border: solid 1px rgba(0, 0, 0, 0.06);
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
border-radius: 2px;
}
.oe_quote .oe_q, .oe_quote q {
margin: 10px;
display: block;
font-style: italic;
text-align: center;
font-size: 20px;
color: #4e66e7;
}
.oe_quote .oe_q:before, .oe_quote .oe_q:after, .oe_quote q:before, .oe_quote q:after {
content: '"';
font-weight: 900;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=20);
opacity: 0.2;
}
.oe_quote cite {
display: block;
font-style: normal;
margin-top: 16px;
}
.oe_quote .oe_photo {
float: left;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
margin-right: 16px;
}
.oe_quote .oe_author {
font-size: 20px;
padding-top: 6px;
color: #8d7bac;
}
.oe_dark .oe_quote {
background: white;
border: 1px solid #f0f0ff;
}
/* ------ PICTURES ----- */
.oe_picture {
display: block;
max-width: 84%;
max-height: 400px;
margin: 16px 8%;
}
.oe_screenshot {
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
-ms-border-radius: 3px;
-o-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
}
.oe_pic_ctr {
position: relative;
}
.oe_pic_ctr > img.oe_picture {
width: 100%;
max-width: none;
max-height: none;
margin: 0;
}
.oe_pic_ctr > .oe_title {
position: absolute;
top: 15px;
right: 38px;
}
.oe_styling_v8 .oe_pic_ctr > .oe_title {
font-size: 64px;
color: white;
font-weight: 600;
margin: 0;
text-shadow: 0px 2px 0px #494949, 0px 2px 5px rgba(0, 0, 0, 0.33), 0px 0px 60px rgba(0, 0, 0, 0.22);
}
/* ----- Link Image with Footer ----- */
/* FIXME: Terrible CSS, rewrite this */
div.oe_demo {
position: relative;
border: 1px solid #dedede;
}
div.oe_demo span.oe_demo_play {
top: 50%;
left: 50%;
width: 80px;
height: 60px;
margin-top: -30px;
margin-left: -40px;
display: block;
position: absolute;
background: url("../img/layout/play-button.png") no-repeat left top transparent;
pointer-events: none;
}
div.oe_demo img {
max-width: 100%;
width: 100%;
}
div.oe_demo div.oe_demo_footer {
position: absolute;
left: 0;
background-color: rgba(0, 0, 0, 0.4);
opacity: 0.85;
bottom: -1px;
width: 100%;
padding-top: 7px;
padding-bottom: 7px;
color: white;
font-size: 14px;
font-weight: bold;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
pointer-events: none;
}
div.oe_demo:hover span.oe_demo_play {
background: url("../img/layout/play-button-over.png") no-repeat left top transparent;
}
/* ----- SEPARATOR ----- */
.oe_styling_v8 .oe_container.oe_separator {
height: 64px;
margin-bottom: 16px;
background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0, 0, 0, 0)), color-stop(100%, rgba(0, 0, 0, 0.02)));
background: -webkit-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
background: -moz-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
background: -o-linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
background: linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
-webkit-box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
-moz-box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
overflow-y: hidden;
}
/* ----- TABS ----- */
.oe_row_tabs {
text-align: center;
margin-top: 0px;
margin-bottom: 0px;
padding-top: 21px;
}
.oe_row_tab {
position: relative;
min-width: 120px;
padding: 8px;
font-size: 20px;
display: inline-block;
margin: 0px -2px;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border: solid 1px rgba(0, 0, 0, 0.1);
border-bottom: none;
background: #fafafa;
background-image: +linear-gradient(rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.02));
box-shadow: 0px -3px 10px -5px rgba(0, 0, 0, 0.1) inset;
cursor: pointer;
-webkit-transition: all 250ms linear;
-moz-transition: all 250ms linear;
-o-transition: all 250ms linear;
transition: all 250ms linear;
}
.oe_row_tab:hover {
padding-bottom: 12px;
top: -4px;
background-color: white;
}
.oe_row_tab.oe_active {
background-color: white;
background-image: none;
box-shadow: none;
border-top-color: #8272b6;
border-top-width: 2px;
cursor: default;
}
.oe_row_tab.oe_active:hover {
padding-bottom: 8px;
top: 0asx;
}
/* ------ CALL TO ACTION ----- */
.oe_calltoaction {
height: 32px;
margin-top: -32px;
position: relative;
}

View File

@ -0,0 +1,572 @@
@charset "utf-8"
@import "compass/css3"
@import "compass/css3/user-interface"
/**
* This CSS is for the html description of modules
* TODO clean
*/
/* --------------------------------- *
* STYLING CONTEXT *
* --------------------------------- */
/* --- Styling for the V8/Lato/White/Purple design --- */
$v8_title_font_color: rgb(51,51,51)
$v8_text_font_color: rgb(100,100,100)
$v8_font_paragraph_color: rgb(51,51,51)
$v8_body_color: rgb(245,245,245)
$v8_bg_color: rgb(255,255,255)
$v8_text_font_family: 'Open Sans','Helvetica',Sans
$v8_title_font_family: 'Lato','Open Sans','Helvetica',Sans
$v8_anchor_color: #6D57E0
$v8_anchor_visited_color: rgb(91, 40, 79)
.openerp .oe_form_sheet_width
max-width: 960px
.openerp .oe_form .oe_styling_v8
width: 100%
padding: 0
margin: 0
font-family: $v8_text_font_family
font-weight: 300
color: $v8_text_font_color
background: $v8_bg_color
font-size: 16px
.oe_websiteonly
display: none
.oe_website_contents
background: $v8_body_color
padding-bottom: 1px
b
font-weight: 600
a
color: $v8_anchor_color
text-decoration: none
a:visited
color: $v8_anchor_visited_color
a:hover
color: #0096EB
.oe_title_font
font-family: $v8_title_font_family
.oe_page
background: $v8_bg_color
overflow: hidden
+border-radius(1px)
+box-shadow(0 1px 3px rgba(0,0,0,0.35))
.oe_emph
font-weight: 400
.oe_dark
overflow: hidden
background: #FCFCFC
+box-shadow(0px 5px 9px -7px rgba(0,0,255,0.5) inset, 0px -3px 9px -7px rgba(0,0,255,0.5) inset)
/* --------------------------------- *
* LAYOUT *
* --------------------------------- */
/* ------ BASE GRID CONSTRUCTS ----- */
.oe_page
margin: 0px auto 64px auto
max-width: 992px
.oe_row
width: 928px
margin-top: 16px
margin-bottom: 16px
margin-left: auto
margin-right: auto
.oe_row.oe_fit
width: auto
.oe_clearfix:after, .oe_row:after
content: "."
display: block
clear: both
visibility: hidden
line-height: 0
height: 0
$oe_span12_width: 928px
$oe_span10_width: 773px
$oe_span9_width: 696px
$oe_span8_width: 618px
$oe_span6_width: 464px
$oe_span4_width: 309px
$oe_span3_width: 232px
$oe_span2_width: 154px
[class*='oe_span']
float: left
+box-sizing(border-box)
padding: 0 16px
.oe_span12
width: $oe_span12_width
.oe_span10
width: $oe_span10_width
.oe_span9
width: $oe_span9_width
.oe_span8
width: $oe_span8_width
.oe_span6
width: $oe_span6_width
.oe_span4
width: $oe_span4_width
.oe_span3
width: $oe_span3_width
.oe_span2
width: $oe_span2_width
[class*='oe_span'].oe_fit
padding-left: 0px !important
padding-right: 0px !important
[class*='oe_span'].oe_right
float: right
.oe_row.oe_flex
[class*='oe_span']
display: inline-block
float: none
vertical-align: top
+box-sizing(border-box)
padding: 0 16px
width: auto
.oe_span12
max-width: $oe_span12_width
.oe_span10
max-width: ($oe_span10_width +-4px)
.oe_span9
max-width: ($oe_span9_width +-4px)
.oe_span8
max-width: ($oe_span8_width +-4px)
.oe_span6
max-width: ($oe_span6_width +-4px)
.oe_span4
max-width: ($oe_span4_width +-4px)
.oe_span3
max-width: ($oe_span3_width +-4px)
.oe_span2
max-width: ($oe_span2_width +-4px)
.oe_mb0
margin-bottom: 0px !important
.oe_mb4
margin-bottom: 4px !important
.oe_mb8
margin-bottom: 8px !important
.oe_mb16
margin-bottom: 16px !important
.oe_mb32
margin-bottom: 32px !important
.oe_mb48
margin-bottom: 48px !important
.oe_mb64
margin-bottom: 64px !important
.oe_mt0
margin-top: 0px !important
.oe_mt4
margin-top: 4px !important
.oe_mt8
margin-top: 8px !important
.oe_mt16
margin-top: 16px !important
.oe_mt32
margin-top: 32px !important
.oe_mt48
margin-top: 48px !important
.oe_mt64
margin-top: 64px !important
/* ------ GENERIC LAYOUT MODIFIERS ----- */
.oe_rightfit
padding-right: 0px !important
.oe_leftfit
padding-left: 0px !important
.oe_leftalign
text-align: left
.oe_rightalign
text-align: right
.oe_centeralign
text-align: center
.oe_centered
margin-left: auto
margin-right: auto
.oe_hidden
display: none !important
opacity: 0 !important
.oe_invisible
visibility: hidden !important
.oe_transparent
opacity: 0 !important
.oe_mb0
margin-bottom: 0px !important
.oe_mb4
margin-bottom: 4px !important
.oe_mb8
margin-bottom: 8px !important
.oe_mb16
margin-bottom: 16px !important
.oe_mb32
margin-bottom: 32px !important
.oe_mb64
margin-bottom: 64px !important
.oe_spaced
margin-top: 32px
margin-bottom: 32px
.oe_more_spaced
margin-top: 64px
margin-bottom: 64px
.oe_padded
padding-top: 16px
padding-bottom: 16px
.oe_more_padded
padding-top: 32px
padding-bottom: 32px
/* --------------------------------- *
* WEBPAGE COMPONENTS *
* --------------------------------- */
/* ------ BUTTONS ----- */
.oe_button
position: relative
bottom: 0
display: inline-block
cursor: pointer
+user-select(none)
.oe_styling_v8 .oe_button, .oe_styling_v8 a.oe_button
padding: 8px 14px
background: rgb(139, 114, 182)
color: white
+border-radius(2px)
+box-shadow(0px 2px 0px rgb(175, 168, 204))
+text-shadow(0px 1px 1px rgba(0,0,0, 0.44))
border: solid 1px rgba(0,0,0,0.09)
+transition-property((bottom, background))
+transition-duration(250ms)
&:hover
background: rgb(139,91,221)
color: white
&:active
background: rgb(51,51,51)
bottom: -3px
&.oe_big
font-size: 24px
&.oe_bigger
font-size: 32px
&.oe_small
font-size: 13px
padding: 2px 4px
&:active
bottom: -1px
&.oe_medium
padding: 5px 12px
font-size: 16px
&.oe_tacky
background: rgb(255,68,68)
+box-shadow(0px 2px 0px #eba8a8)
&:hover
background: rgb(255,16,16)
&:active
background: black
&.oe_disabled
background: rgb(200,200,200)
+box-shadow(0px 2px 0px rgb(180,180,180))
cursor: default
&:hover
background: rgb(200,200,200)
+box-shadow(0px 2px 0px rgb(180,180,180))
&:active
background: rgb(200,200,200)
bottom: 0px
+box-shadow(0px 2px 0px rgb(180,180,180))
.oe_styling_v8.oe_styling_black .oe_button
+box-shadow(0px 2px 0px rgb(70,53,85))
/* ------ FORMS ----- */
.oe_styling_v8
.oe_input
padding: 4px 7px
border-radius: 3px
border: solid 1px rgb(214,214,214)
box-shadow: 0px 2px rgb(230,230,230)
background: rgb(250,250,250)
font-weight: 300
outline: none
@include transition( all 150ms linear )
&:focus
border: solid 1px rgb(150,150,150)
box-shadow: 0px 2px rgb(210,210,210)
&.oe_valid
background: #F2FFEC
border-color: rgb(177,235,182)
box-shadow: 0px 2px rgb(225,248,225)
color: rgb(15,97,15)
&.oe_invalid
background: rgb(255,242,242)
border-color: #EBB1B1
box-shadow: 0px 2px #F8E1E1
color: #610F0F
&.oe_big
padding: 8px 14px
.oe_input_label
font-weight: 300
font-size: 16px
&.oe_big
font-size: 20px
/* FIXME: this is a quick hack for the release */
.oe_textarea
width: 300px
height: 80px
.oe_form_layout_table
width: 100%
td
padding-bottom: 16px
&:first-child
text-align: right
padding-right: 16px
/* ------ SLOGANS ----- */
.oe_styling_v8
.oe_slogan
color: $v8_title_font_color
font-family: $v8_title_font_family
text-align: center
margin-top: 32px
margin-bottom: 32px
h1.oe_slogan
font-size: 64px
font-weight: 900
margin-top: 48px
margin-bottom: 48px
h2.oe_slogan
font-size: 40px
font-weight: 300
h3.oe_slogan
font-size: 26px
font-weight: 300
+opacity(0.5)
h4.oe_slogan
font-size: 24px
font-weight: 300
h4.oe_slogan:before, h4.oe_slogan:after
margin: 0 20px
content: ""
display: inline-block
width: 100px
height: 0px
border-top: solid 1px
vertical-align: middle
+opacity(0.3)
h5.oe_slogan
font-weight: 300
//TODO
/* ------ QUOTES ----- */
.oe_quote
margin: 8px
padding: 16px
background: rgba(0,0,0,0.02)
border: solid 1px rgba(0,0,0,0.06)
+border-radius(2px)
.oe_q,q
margin: 10px
display: block
font-style: italic
text-align: center
font-size: 20px
color: rgb(78, 102, 231)
&:before, &:after
content: '\"'
font-weight: 900
+opacity(0.2)
cite
display: block
font-style: normal
margin-top: 16px
.oe_photo
float: left
+border-radius(3px)
margin-right: 16px
.oe_author
font-size: 20px
padding-top: 6px
color: rgb(141, 123, 172)
.oe_dark .oe_quote
background: white
border: 1px solid rgb(240,240,255)
/* ------ PICTURES ----- */
// display a picture in a span
.oe_picture
display: block
max-width: 84%
max-height: 400px
margin: 16px 8%
// style the picture like a screenshot
.oe_screenshot
+border-radius(3px)
+box-shadow(0px 3px 8px rgba(0,0,0,0.2))
// display a picture taking full width of a row
.oe_pic_ctr
position: relative
.oe_pic_ctr > img.oe_picture
width: 100%
max-width: none
max-height: none
margin: 0
// styling of the picture's title
.oe_pic_ctr > .oe_title
position: absolute
top: 15px
right: 38px
.oe_styling_v8 .oe_pic_ctr > .oe_title
font-size: 64px
color: white
font-weight: 600
margin: 0
+text-shadow( 0px 2px 0px rgb(73, 73, 73), 0px 2px 5px rgba(0, 0, 0, 0.33), 0px 0px 60px rgba(0, 0, 0, 0.22))
/* ----- Link Image with Footer ----- */
/* FIXME: Terrible CSS, rewrite this */
div.oe_demo
position: relative
border: 1px solid #dedede
span.oe_demo_play
top: 50%
left: 50%
width: 80px
height: 60px
margin-top: -30px
margin-left: -40px
display: block
position: absolute
background: url("../img/layout/play-button.png") no-repeat left top transparent
pointer-events: none
img
max-width: 100%
width: 100%
div.oe_demo_footer
position: absolute
left: 0
background-color: rgba(0,0,0,0.4)
opacity: 0.85
bottom: -1px
width: 100%
padding-top: 7px
padding-bottom: 7px
color: white
font-size: 14px
font-weight: bold
border-bottom-left-radius: 3px
border-bottom-right-radius: 3px
pointer-events: none
div.oe_demo:hover
span.oe_demo_play
background: url("../img/layout/play-button-over.png") no-repeat left top transparent
/* ----- SEPARATOR ----- */
.oe_styling_v8 .oe_container.oe_separator
height: 64px
margin-bottom: 16px
@include background(linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.02)))
+box-shadow(0px -3px 10px -5px rgba(0,0,0,0.1) inset)
overflow-y: hidden
/* ----- TABS ----- */
.oe_row_tabs
text-align: center
margin-top: 0px
margin-bottom: 0px
padding-top: 21px
.oe_row_tab
position: relative
min-width: 120px
padding: 8px
font-size: 20px
display: inline-block
margin: 0px -2px
border-top-left-radius: 4px
border-top-right-radius: 4px
border: solid 1px rgba(0,0,0,0.1)
border-bottom: none
background: rgb(250,250,250)
background-image: +linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0.02))
box-shadow: 0px -3px 10px -5px rgba(0,0,0,0.1) inset
cursor: pointer
@include transition(all 250ms linear)
.oe_row_tab:hover
padding-bottom: 12px
top: -4px
background-color: white
.oe_row_tab.oe_active
background-color: white
background-image: none
box-shadow: none
border-top-color: rgb(130, 114, 182)
border-top-width: 2px
cursor: default
.oe_row_tab.oe_active:hover
padding-bottom: 8px
top: 0asx
/* ------ CALL TO ACTION ----- */
.oe_calltoaction
height: 32px
margin-top: -32px
position: relative

View File

@ -398,7 +398,9 @@ def is_leaf(element, internal=False):
INTERNAL_OPS += ('inselect',)
return (isinstance(element, tuple) or isinstance(element, list)) \
and len(element) == 3 \
and element[1] in INTERNAL_OPS
and element[1] in INTERNAL_OPS \
and ((isinstance(element[0], basestring) and element[0])
or element in (TRUE_LEAF, FALSE_LEAF))
# --------------------------------------------------

View File

@ -1804,13 +1804,19 @@ class BaseModel(object):
# try to find a view_id if none provided
if not view_id:
# <view_type>_view_ref in context can be used to overrride the default view
view_ref = context.get(view_type + '_view_ref')
if view_ref and '.' in view_ref:
module, view_ref = view_ref.split('.', 1)
cr.execute("SELECT res_id FROM ir_model_data WHERE model='ir.ui.view' AND module=%s AND name=%s", (module, view_ref))
view_ref_res = cr.fetchone()
if view_ref_res:
view_id = view_ref_res[0]
view_ref_key = view_type + '_view_ref'
view_ref = context.get(view_ref_key)
if view_ref:
if '.' in view_ref:
module, view_ref = view_ref.split('.', 1)
cr.execute("SELECT res_id FROM ir_model_data WHERE model='ir.ui.view' AND module=%s AND name=%s", (module, view_ref))
view_ref_res = cr.fetchone()
if view_ref_res:
view_id = view_ref_res[0]
else:
_logger.warning('%r requires a fully-qualified external id (got: %r for model %s). '
'Please use the complete `module.view_id` form instead.', view_ref_key, view_ref,
self._name)
else:
# otherwise try to find the lowest priority matching ir.ui.view
view_id = View.default_view(cr, uid, self._name, view_type, context=context)

View File

@ -109,7 +109,7 @@ class _date_format(str, _format):
if self.val:
if getattr(self,'name', None):
date = datetime.strptime(self.name[:get_date_length()], DEFAULT_SERVER_DATE_FORMAT)
return date.strftime(str(self.lang_obj.date_format))
return date.strftime(self.lang_obj.date_format.encode('utf-8'))
return self.val
class _dttime_format(str, _format):
@ -120,8 +120,8 @@ class _dttime_format(str, _format):
def __str__(self):
if self.val and getattr(self,'name', None):
return datetime.strptime(self.name, DEFAULT_SERVER_DATETIME_FORMAT)\
.strftime("%s %s"%(str(self.lang_obj.date_format),
str(self.lang_obj.time_format)))
.strftime("%s %s"%((self.lang_obj.date_format).encode('utf-8'),
(self.lang_obj.time_format).encode('utf-8')))
return self.val
@ -313,7 +313,7 @@ class rml_parse(object):
date = datetime_field.context_timestamp(self.cr, self.uid,
timestamp=date,
context=self.localcontext)
return date.strftime(date_format)
return date.strftime(date_format.encode('utf-8'))
res = self.lang_dict['lang_obj'].format('%.' + str(digits) + 'f', value, grouping=grouping, monetary=monetary)
if currency_obj:

View File

@ -411,14 +411,11 @@ class WorkerCron(Worker):
if rpc_request_flag:
start_time = time.time()
start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info()
while True:
# acquired = openerp.addons.base.ir.ir_cron.ir_cron._acquire_job(db_name)
# TODO why isnt openerp.addons.base defined ?
import openerp.addons.base as base
acquired = base.ir.ir_cron.ir_cron._acquire_job(db_name)
if not acquired:
openerp.modules.registry.RegistryManager.delete(db_name)
break
import openerp.addons.base as base
base.ir.ir_cron.ir_cron._acquire_job(db_name)
openerp.modules.registry.RegistryManager.delete(db_name)
# dont keep cursors in multi database mode
if len(db_names) > 1:
openerp.sql_db.close_db(db_name)

View File

@ -9,6 +9,7 @@ import common
# test group that demo user should not have
GROUP_TECHNICAL_FEATURES = 'base.group_no_one'
class TestACL(common.TransactionCase):
def setUp(self):
@ -22,25 +23,25 @@ class TestACL(common.TransactionCase):
def test_field_visibility_restriction(self):
"""Check that model-level ``groups`` parameter effectively restricts access to that
field for users who do not belong to one of the explicitly allowed groups"""
field for users who do not belong to one of the explicitly allowed groups"""
# Verify the test environment first
original_fields = self.res_currency.fields_get(self.cr, self.demo_uid, [])
form_view = self.res_currency.fields_view_get(self.cr, self.demo_uid, False, 'form')
view_arch = etree.fromstring(form_view.get('arch'))
has_tech_feat = self.res_users.has_group(self.cr, self.demo_uid, GROUP_TECHNICAL_FEATURES)
self.assertFalse(has_tech_feat, "`demo` user should not belong to the restricted group before the test")
self.assertTrue('rate' in original_fields, "'rate' field must be properly visible before the test")
self.assertNotEquals(view_arch.xpath("//field[@name='rate']"), [],
"Field 'rate' must be found in view definition before the test")
self.assertTrue('accuracy' in original_fields, "'accuracy' field must be properly visible before the test")
self.assertNotEquals(view_arch.xpath("//field[@name='accuracy']"), [],
"Field 'accuracy' must be found in view definition before the test")
# Restrict access to the field and check it's gone
self.res_currency._columns['rate'].groups = GROUP_TECHNICAL_FEATURES
self.res_currency._columns['accuracy'].groups = GROUP_TECHNICAL_FEATURES
fields = self.res_currency.fields_get(self.cr, self.demo_uid, [])
form_view = self.res_currency.fields_view_get(self.cr, self.demo_uid, False, 'form')
view_arch = etree.fromstring(form_view.get('arch'))
self.assertFalse('rate' in fields, "'rate' field should be gone")
self.assertEquals(view_arch.xpath("//field[@name='rate']"), [],
"Field 'rate' must not be found in view definition")
self.assertFalse('accuracy' in fields, "'accuracy' field should be gone")
self.assertEquals(view_arch.xpath("//field[@name='accuracy']"), [],
"Field 'accuracy' must not be found in view definition")
# Make demo user a member of the restricted group and check that the field is back
self.tech_group.write({'users': [(4, self.demo_uid)]})
@ -50,13 +51,13 @@ class TestACL(common.TransactionCase):
view_arch = etree.fromstring(form_view.get('arch'))
#import pprint; pprint.pprint(fields); pprint.pprint(form_view)
self.assertTrue(has_tech_feat, "`demo` user should now belong to the restricted group")
self.assertTrue('rate' in fields, "'rate' field must be properly visible again")
self.assertNotEquals(view_arch.xpath("//field[@name='rate']"), [],
"Field 'rate' must be found in view definition again")
self.assertTrue('accuracy' in fields, "'accuracy' field must be properly visible again")
self.assertNotEquals(view_arch.xpath("//field[@name='accuracy']"), [],
"Field 'accuracy' must be found in view definition again")
#cleanup
self.tech_group.write({'users': [(3, self.demo_uid)]})
self.res_currency._columns['rate'].groups = False
self.res_currency._columns['accuracy'].groups = False
@mute_logger('openerp.osv.orm')
def test_field_crud_restriction(self):
@ -65,7 +66,7 @@ class TestACL(common.TransactionCase):
has_tech_feat = self.res_users.has_group(self.cr, self.demo_uid, GROUP_TECHNICAL_FEATURES)
self.assertFalse(has_tech_feat, "`demo` user should not belong to the restricted group")
self.assert_(self.res_partner.read(self.cr, self.demo_uid, [1], ['bank_ids']))
self.assert_(self.res_partner.write(self.cr, self.demo_uid, [1], {'bank_ids': []}))
self.assert_(self.res_partner.write(self.cr, self.demo_uid, [1], {'bank_ids': []}))
# Now restrict access to the field and check it's forbidden
self.res_partner._columns['bank_ids'].groups = GROUP_TECHNICAL_FEATURES
@ -79,12 +80,30 @@ class TestACL(common.TransactionCase):
has_tech_feat = self.res_users.has_group(self.cr, self.demo_uid, GROUP_TECHNICAL_FEATURES)
self.assertTrue(has_tech_feat, "`demo` user should now belong to the restricted group")
self.assert_(self.res_partner.read(self.cr, self.demo_uid, [1], ['bank_ids']))
self.assert_(self.res_partner.write(self.cr, self.demo_uid, [1], {'bank_ids': []}))
self.assert_(self.res_partner.write(self.cr, self.demo_uid, [1], {'bank_ids': []}))
#cleanup
self.tech_group.write({'users': [(3, self.demo_uid)]})
self.res_partner._columns['bank_ids'].groups = False
def test_fields_browse_restriction(self):
"""Test access to records having restricted fields"""
self.res_partner._columns['email'].groups = GROUP_TECHNICAL_FEATURES
try:
P = self.res_partner
pid = P.search(self.cr, self.demo_uid, [], limit=1)[0]
part = P.browse(self.cr, self.demo_uid, pid)
# accessing fields must no raise exceptions...
part.name
# ... except they are restricted
with self.assertRaises(openerp.osv.orm.except_orm) as cm:
part.email
self.assertEqual(cm.exception.args[0], 'Access Denied')
finally:
self.res_partner._columns['email'].groups = False
if __name__ == '__main__':
unittest2.main()

View File

@ -23,146 +23,9 @@
##############################################################################
import unittest2
from . import test_mail_examples
from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html
HTML_SOURCE = """
<font size="2" style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">test1</font>
<div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; font-style: normal; ">
<b>test2</b></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
<i>test3</i></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
<u>test4</u></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
<strike>test5</strike></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">
<font size="5">test6</font></div><div><ul><li><font color="#1f1f1f" face="monospace" size="2">test7</font></li><li>
<font color="#1f1f1f" face="monospace" size="2">test8</font></li></ul><div><ol><li><font color="#1f1f1f" face="monospace" size="2">test9</font>
</li><li><font color="#1f1f1f" face="monospace" size="2">test10</font></li></ol></div></div>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><div><font color="#1f1f1f" face="monospace" size="2">
test11</font></div></div></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><font color="#1f1f1f" face="monospace" size="2">
test12</font></div><div><font color="#1f1f1f" face="monospace" size="2"><br></font></div></blockquote></blockquote>
<font color="#1f1f1f" face="monospace" size="2"><a href="http://google.com">google</a></font>
<a href="javascript:alert('malicious code')">test link</a>
"""
EDI_LIKE_HTML_SOURCE = """<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello ${object.partner_id.name},</p>
<p>A new invoice is available for you: </p>
<p style="border-left: 1px solid #8e0000; margin-left: 30px;">
&nbsp;&nbsp;<strong>REFERENCES</strong><br />
&nbsp;&nbsp;Invoice number: <strong>${object.number}</strong><br />
&nbsp;&nbsp;Invoice total: <strong>${object.amount_total} ${object.currency_id.name}</strong><br />
&nbsp;&nbsp;Invoice date: ${object.date_invoice}<br />
&nbsp;&nbsp;Order reference: ${object.origin}<br />
&nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.email or ''}?subject=Invoice%20${object.number}">${object.user_id.name}</a>
</p>
<br/>
<p>It is also possible to directly pay with Paypal:</p>
<a style="margin-left: 120px;" href="${object.paypal_url}">
<img class="oe_edi_paypal_button" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif"/>
</a>
<br/>
<p>If you have any question, do not hesitate to contact us.</p>
<p>Thank you for choosing ${object.company_id.name or 'us'}!</p>
<br/>
<br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">
<span style="color: #222; margin-bottom: 5px; display: block; ">
${object.company_id.street}<br/>
${object.company_id.street2}<br/>
${object.company_id.zip} ${object.company_id.city}<br/>
${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}<br/>
</span>
<div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
Phone:&nbsp; ${object.company_id.phone}
</div>
<div>
Web :&nbsp;<a href="${object.company_id.website}">${object.company_id.website}</a>
</div>
</div>
</div></body></html>"""
TEXT_MAIL1 = """I contact you about our meeting for tomorrow. Here is the schedule I propose:
9 AM: brainstorming about our new amazing business app</span></li>
9.45 AM: summary
10 AM: meeting with Fabien to present our app
Is everything ok for you ?
--
Administrator"""
HTML_MAIL1 = """<div>
<font><span>I contact you about our meeting for tomorrow. Here is the schedule I propose:</span></font>
</div>
<div><ul>
<li><span>9 AM: brainstorming about our new amazing business app</span></li>
<li><span>9.45 AM: summary</span></li>
<li><span>10 AM: meeting with Fabien to present our app</span></li>
</ul></div>
<div><font><span>Is everything ok for you ?</span></font></div>"""
GMAIL_REPLY1_SAN = """Hello,<div><br></div><div>Ok for me. I am replying directly in gmail, without signature.</div><div><br></div><div>Kind regards,</div><div><br></div><div>Demo.<br><br><div>On Thu, Nov 8, 2012 at 5:29 PM, <span>&lt;<a href="mailto:dummy@example.com">dummy@example.com</a>&gt;</span> wrote:<br><blockquote><div>I contact you about our meeting for tomorrow. Here is the schedule I propose:</div><div><ul><li>9 AM: brainstorming about our new amazing business app&lt;/span&gt;&lt;/li&gt;</li>
<li>9.45 AM: summary</li><li>10 AM: meeting with Fabien to present our app</li></ul></div><div>Is everything ok for you ?</div>
<div><p>--<br>Administrator</p></div>
<div><p>Log in our portal at: <a href="http://localhost:8069#action=login&amp;db=mail_1&amp;login=demo">http://localhost:8069#action=login&amp;db=mail_1&amp;login=demo</a></p></div>
</blockquote></div><br></div>"""
THUNDERBIRD_16_REPLY1_SAN = """ <div>On 11/08/2012 05:29 PM,
<a href="mailto:dummy@example.com">dummy@example.com</a> wrote:<br></div>
<blockquote>
<div>I contact you about our meeting for tomorrow. Here is the
schedule I propose:</div>
<div>
<ul><li>9 AM: brainstorming about our new amazing business
app&lt;/span&gt;&lt;/li&gt;</li>
<li>9.45 AM: summary</li>
<li>10 AM: meeting with Fabien to present our app</li>
</ul></div>
<div>Is everything ok for you ?</div>
<div>
<p>--<br>
Administrator</p>
</div>
<div>
<p>Log in our portal at:
<a href="http://localhost:8069#action=login&amp;db=mail_1&amp;token=rHdWcUART5PhEnJRaXjH">http://localhost:8069#action=login&amp;db=mail_1&amp;token=rHdWcUART5PhEnJRaXjH</a></p>
</div>
</blockquote>
Ok for me. I am replying directly below your mail, using
Thunderbird, with a signature.<br><br>
Did you receive my email about my new laptop, by the way ?<br><br>
Raoul.<br><pre>--
Raoul Grosbedonn&#233;e
</pre>"""
TEXT_TPL = """Salut Raoul!
Le 28 oct. 2012 à 00:02, Raoul Grosbedon a écrit :
> C'est sûr que je suis intéressé (quote)!
Trouloulou pouet pouet. Je ne vais quand même pas écrire de vrais mails, non mais ho.
> 2012/10/27 Bert Tartopoils :
>> Diantre, me disè-je en envoyant un message similaire à Martine, mais comment vas-tu (quote)?
>>
>> A la base le contenu était un vrai mail, mais je l'ai quand même réécrit pour ce test, histoire de dire que, quand même, on ne met pas n'importe quoi ici. (quote)
>>
>> Et sinon bon courage pour trouver tes clefs (quote).
>>
>> Bert TARTOPOILS
>> bert.tartopoils@miam.miam
>>
>
>
> --
> Raoul Grosbedon
Bert TARTOPOILS
bert.tartopoils@miam.miam
"""
class TestSanitizer(unittest2.TestCase):
""" Test the html sanitizer that filters html to remove unwanted attributes """
@ -223,22 +86,21 @@ class TestSanitizer(unittest2.TestCase):
self.assertTrue('ha.ckers.org' not in html or 'http://ha.ckers.org/xss.css' in html, 'html_sanitize did not remove a malicious code in %s (%s)' % (content, html))
def test_html(self):
sanitized_html = html_sanitize(HTML_SOURCE)
sanitized_html = html_sanitize(test_mail_examples.MISC_HTML_SOURCE)
for tag in ['<div', '<b', '<i', '<u', '<strike', '<li', '<blockquote', '<a href']:
self.assertIn(tag, sanitized_html, 'html_sanitize stripped too much of original html')
for attr in ['javascript']:
self.assertNotIn(attr, sanitized_html, 'html_sanitize did not remove enough unwanted attributes')
emails =[("Charles <charles.bidule@truc.fr>", "Charles &lt;charles.bidule@truc.fr&gt;"),
emails = [("Charles <charles.bidule@truc.fr>", "Charles &lt;charles.bidule@truc.fr&gt;"),
("Dupuis <'tr/-: ${dupuis#$'@truc.baz.fr>", "Dupuis &lt;'tr/-: ${dupuis#$'@truc.baz.fr&gt;"),
("Technical <service/technical+2@open.com>", "Technical &lt;service/technical+2@open.com&gt;"),
("Div nico <div-nico@open.com>", "Div nico &lt;div-nico@open.com&gt;")]
for email in emails:
self.assertIn(email[1], html_sanitize(email[0]), 'html_sanitize stripped emails of original html')
def test_edi_source(self):
html = html_sanitize(EDI_LIKE_HTML_SOURCE)
html = html_sanitize(test_mail_examples.EDI_LIKE_HTML_SOURCE)
self.assertIn('div style="font-family: \'Lucica Grande\', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF;', html,
'html_sanitize removed valid style attribute')
self.assertIn('<span style="color: #222; margin-bottom: 5px; display: block; ">', html,
@ -251,36 +113,122 @@ class TestSanitizer(unittest2.TestCase):
class TestCleaner(unittest2.TestCase):
""" Test the email cleaner function that filters the content of incoming emails """
def test_html_email_clean(self):
# Test1: reply through gmail: quote in blockquote, signature --\nAdministrator
new_html = html_email_clean(GMAIL_REPLY1_SAN)
self.assertNotIn('blockquote', new_html, 'html_email_cleaner did not remove a blockquote')
self.assertNotIn('I contact you about our meeting', new_html, 'html_email_cleaner wrongly removed the quoted content')
self.assertNotIn('Administrator', new_html, 'html_email_cleaner did not erase the signature')
self.assertIn('Ok for me', new_html, 'html_email_cleaner erased too much content')
def test_00_basic_text(self):
""" html_email_clean test for signatures """
test_data = [
(
"""This is Sparta!\n--\nAdministrator\n+9988776655""",
['This is Sparta!'],
['Administrator', '9988776655']
), (
"""<p>--\nAdministrator</p>""",
[],
['--', 'Administrator']
), (
"""<p>This is Sparta!\n---\nAdministrator</p>""",
['This is Sparta!'],
['---', 'Administrator']
), (
"""<p>--<br>Administrator</p>""",
[],
[]
), (
"""<p>This is Sparta!<br/>--<br>Administrator</p>""",
['This is Sparta!'],
[]
), (
"""This is Sparta!\n>Ah bon ?\nCertes\n> Chouette !\nClair""",
['This is Sparta!', 'Certes', 'Clair'],
['Ah bon', 'Chouette']
)
]
for test, in_lst, out_lst in test_data:
new_html = html_email_clean(test, remove=True)
for text in in_lst:
self.assertIn(text, new_html, 'html_email_cleaner wrongly removed content')
for text in out_lst:
self.assertNotIn(text, new_html, 'html_email_cleaner did not remove unwanted content')
# Test2: reply through Tunderbird 16.0.2
new_html = html_email_clean(THUNDERBIRD_16_REPLY1_SAN)
self.assertNotIn('blockquote', new_html, 'html_email_cleaner did not remove a blockquote')
self.assertNotIn('I contact you about our meeting', new_html, 'html_email_cleaner wrongly removed the quoted content')
self.assertNotIn('Administrator', new_html, 'html_email_cleaner did not erase the signature')
self.assertNotIn('Grosbedonn', new_html, 'html_email_cleaner did not erase the signature')
self.assertIn('Ok for me', new_html, 'html_email_cleaner erased too much content')
def test_10_email_text(self):
""" html_email_clean test for text-based emails """
new_html = html_email_clean(test_mail_examples.TEXT_1, remove=True)
for ext in test_mail_examples.TEXT_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.TEXT_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
# Test3: text email
new_html = html_email_clean(TEXT_MAIL1)
self.assertIn('I contact you about our meeting', new_html, 'html_email_cleaner wrongly removed the quoted content')
self.assertNotIn('Administrator', new_html, 'html_email_cleaner did not erase the signature')
new_html = html_email_clean(test_mail_examples.TEXT_2, remove=True)
for ext in test_mail_examples.TEXT_2_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.TEXT_2_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
# Test4: more complex text email
new_html = html_email_clean(TEXT_TPL)
self.assertNotIn('quote', new_html, 'html_email_cleaner did not remove correctly plaintext quotes')
def test_20_email_html(self):
new_html = html_email_clean(test_mail_examples.HTML_1, remove=True)
for ext in test_mail_examples.HTML_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.HTML_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
# Test5: False boolean for text must return empty string
new_html = html_email_clean(test_mail_examples.HTML_2, remove=True)
for ext in test_mail_examples.HTML_2_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.HTML_2_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
# --- MAIL ORIGINAL --- -> can't parse this one currently, too much language-dependent
# new_html = html_email_clean(test_mail_examples.HTML_3, remove=False)
# for ext in test_mail_examples.HTML_3_IN:
# self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
# for ext in test_mail_examples.HTML_3_OUT:
# self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
def test_30_email_msoffice(self):
new_html = html_email_clean(test_mail_examples.MSOFFICE_1, remove=True)
for ext in test_mail_examples.MSOFFICE_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.MSOFFICE_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
new_html = html_email_clean(test_mail_examples.MSOFFICE_2, remove=True)
for ext in test_mail_examples.MSOFFICE_2_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.MSOFFICE_2_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
new_html = html_email_clean(test_mail_examples.MSOFFICE_3, remove=True)
for ext in test_mail_examples.MSOFFICE_3_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.MSOFFICE_3_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
def test_40_email_hotmail(self):
new_html = html_email_clean(test_mail_examples.HOTMAIL_1, remove=True)
for ext in test_mail_examples.HOTMAIL_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.HOTMAIL_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
def test_50_email_gmail(self):
new_html = html_email_clean(test_mail_examples.GMAIL_1, remove=True)
for ext in test_mail_examples.GMAIL_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.GMAIL_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
def test_60_email_thunderbird(self):
new_html = html_email_clean(test_mail_examples.THUNDERBIRD_1, remove=True)
for ext in test_mail_examples.THUNDERBIRD_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed not quoted content')
for ext in test_mail_examples.THUNDERBIRD_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not erase signature / quoted content')
def test_90_misc(self):
# False boolean for text must return empty string
new_html = html_email_clean(False)
self.assertEqual(new_html, False, 'html_email_cleaner did change a False in an other value.')
# Test6: Message with xml and doctype tags don't crash
# Message with xml and doctype tags don't crash
new_html = html_email_clean(u'<?xml version="1.0" encoding="iso-8859-1"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n <head>\n <title>404 - Not Found</title>\n </head>\n <body>\n <h1>404 - Not Found</h1>\n </body>\n</html>\n')
self.assertNotIn('encoding', new_html, 'html_email_cleaner did not remove correctly encoding attributes')

View File

@ -0,0 +1,639 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
MISC_HTML_SOURCE = """
<font size="2" style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">test1</font>
<div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; font-style: normal; ">
<b>test2</b></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
<i>test3</i></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
<u>test4</u></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; font-size: 12px; ">
<strike>test5</strike></div><div style="color: rgb(31, 31, 31); font-family: monospace; font-variant: normal; line-height: normal; ">
<font size="5">test6</font></div><div><ul><li><font color="#1f1f1f" face="monospace" size="2">test7</font></li><li>
<font color="#1f1f1f" face="monospace" size="2">test8</font></li></ul><div><ol><li><font color="#1f1f1f" face="monospace" size="2">test9</font>
</li><li><font color="#1f1f1f" face="monospace" size="2">test10</font></li></ol></div></div>
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div><div><font color="#1f1f1f" face="monospace" size="2">
test11</font></div></div></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;">
<blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><font color="#1f1f1f" face="monospace" size="2">
test12</font></div><div><font color="#1f1f1f" face="monospace" size="2"><br></font></div></blockquote></blockquote>
<font color="#1f1f1f" face="monospace" size="2"><a href="http://google.com">google</a></font>
<a href="javascript:alert('malicious code')">test link</a>
"""
EDI_LIKE_HTML_SOURCE = """<div style="font-family: 'Lucica Grande', Ubuntu, Arial, Verdana, sans-serif; font-size: 12px; color: rgb(34, 34, 34); background-color: #FFF; ">
<p>Hello ${object.partner_id.name},</p>
<p>A new invoice is available for you: </p>
<p style="border-left: 1px solid #8e0000; margin-left: 30px;">
&nbsp;&nbsp;<strong>REFERENCES</strong><br />
&nbsp;&nbsp;Invoice number: <strong>${object.number}</strong><br />
&nbsp;&nbsp;Invoice total: <strong>${object.amount_total} ${object.currency_id.name}</strong><br />
&nbsp;&nbsp;Invoice date: ${object.date_invoice}<br />
&nbsp;&nbsp;Order reference: ${object.origin}<br />
&nbsp;&nbsp;Your contact: <a href="mailto:${object.user_id.email or ''}?subject=Invoice%20${object.number}">${object.user_id.name}</a>
</p>
<br/>
<p>It is also possible to directly pay with Paypal:</p>
<a style="margin-left: 120px;" href="${object.paypal_url}">
<img class="oe_edi_paypal_button" src="https://www.paypal.com/en_US/i/btn/btn_paynowCC_LG.gif"/>
</a>
<br/>
<p>If you have any question, do not hesitate to contact us.</p>
<p>Thank you for choosing ${object.company_id.name or 'us'}!</p>
<br/>
<br/>
<div style="width: 375px; margin: 0px; padding: 0px; background-color: #8E0000; border-top-left-radius: 5px 5px; border-top-right-radius: 5px 5px; background-repeat: repeat no-repeat;">
<h3 style="margin: 0px; padding: 2px 14px; font-size: 12px; color: #DDD;">
<strong style="text-transform:uppercase;">${object.company_id.name}</strong></h3>
</div>
<div style="width: 347px; margin: 0px; padding: 5px 14px; line-height: 16px; background-color: #F2F2F2;">
<span style="color: #222; margin-bottom: 5px; display: block; ">
${object.company_id.street}<br/>
${object.company_id.street2}<br/>
${object.company_id.zip} ${object.company_id.city}<br/>
${object.company_id.state_id and ('%s, ' % object.company_id.state_id.name) or ''} ${object.company_id.country_id.name or ''}<br/>
</span>
<div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; ">
Phone:&nbsp; ${object.company_id.phone}
</div>
<div>
Web :&nbsp;<a href="${object.company_id.website}">${object.company_id.website}</a>
</div>
</div>
</div></body></html>"""
TEXT_1 = """I contact you about our meeting tomorrow. Here is the schedule I propose:
9 AM: brainstorming about our new amazing business app
9.45 AM: summary
10 AM: meeting with Ignasse to present our app
Is everything ok for you ?
--
MySignature"""
TEXT_1_IN = ["""I contact you about our meeting tomorrow. Here is the schedule I propose:
9 AM: brainstorming about our new amazing business app
9.45 AM: summary
10 AM: meeting with Ignasse to present our app
Is everything ok for you ?"""]
TEXT_1_OUT = ["""--
MySignature"""]
TEXT_2 = """Salut Raoul!
Le 28 oct. 2012 à 00:02, Raoul Grosbedon a écrit :
> I contact you about our meeting tomorrow. Here is the schedule I propose: (quote)
Of course. This seems viable.
> 2012/10/27 Bert Tartopoils :
>> blahblahblah (quote)?
>>
>> blahblahblah (quote)
>>
>> Bert TARTOPOILS
>> bert.tartopoils@miam.miam
>>
>
>
> --
> RaoulSignature
Bert TARTOPOILS
bert.tartopoils@miam.miam
"""
TEXT_2_IN = ["Salut Raoul!", "Of course. This seems viable."]
TEXT_2_OUT = ["I contact you about our meeting tomorrow. Here is the schedule I propose: (quote)",
"""> 2012/10/27 Bert Tartopoils :
>> blahblahblah (quote)?
>>
>> blahblahblah (quote)
>>
>> Bert TARTOPOILS
>> bert.tartopoils@miam.miam
>>
>
>
> --
> RaoulSignature"""]
HTML_1 = """<p>I contact you about our meeting for tomorrow. Here is the schedule I propose: (keep)
9 AM: brainstorming about our new amazing business app
9.45 AM: summary
10 AM: meeting with Ignasse to present our app
Is everything ok for you ?
--
MySignature</p>"""
HTML_1_IN = ["""I contact you about our meeting for tomorrow. Here is the schedule I propose: (keep)
9 AM: brainstorming about our new amazing business app
9.45 AM: summary
10 AM: meeting with Ignasse to present our app
Is everything ok for you ?"""]
HTML_1_OUT = ["""--
MySignature"""]
HTML_2 = """<div>
<font><span>I contact you about our meeting for tomorrow. Here is the schedule I propose:</span></font>
</div>
<div>
<ul>
<li><span>9 AM: brainstorming about our new amazing business app</span></li>
<li><span>9.45 AM: summary</span></li>
<li><span>10 AM: meeting with Fabien to present our app</span></li>
</ul>
</div>
<div>
<font><span>Is everything ok for you ?</span></font>
</div>"""
HTML_2_IN = ["<font><span>I contact you about our meeting for tomorrow. Here is the schedule I propose:</span></font>",
"<li><span>9 AM: brainstorming about our new amazing business app</span></li>",
"<li><span>9.45 AM: summary</span></li>",
"<li><span>10 AM: meeting with Fabien to present our app</span></li>",
"<font><span>Is everything ok for you ?</span></font>"]
HTML_2_OUT = []
HTML_3 = """<div><pre>This is an answer.
Regards,
XXXXXX
----- Mail original -----</pre>
<pre>Hi,
My CRM-related question.
Regards,
XXXX</pre></div>"""
HTML_3_IN = ["""<div><pre>This is an answer.
Regards,
XXXXXX
----- Mail original -----</pre>"""]
HTML_3_OUT = ["Hi,", "My CRM-related question.",
"Regards,"]
HTML_4 = """
<div>
<div>Hi Nicholas,</div>
<br>
<div>I'm free now. 00447710085916.</div>
<br>
<div>Regards,</div>
<div>Nicholas</div>
<br>
<span id="OLK_SRC_BODY_SECTION">
<div style="font-family:Calibri; font-size:11pt; text-align:left; color:black; BORDER-BOTTOM: medium none; BORDER-LEFT: medium none; PADDING-BOTTOM: 0in; PADDING-LEFT: 0in; PADDING-RIGHT: 0in; BORDER-TOP: #b5c4df 1pt solid; BORDER-RIGHT: medium none; PADDING-TOP: 3pt">
<span style="font-weight:bold">From: </span>OpenERP Enterprise &lt;<a href="mailto:sales@openerp.com">sales@openerp.com</a>&gt;<br><span style="font-weight:bold">Reply-To: </span>&lt;<a href="mailto:sales@openerp.com">sales@openerp.com</a>&gt;<br><span style="font-weight:bold">Date: </span>Wed, 17 Apr 2013 13:30:47 +0000<br><span style="font-weight:bold">To: </span>Microsoft Office User &lt;<a href="mailto:n.saxlund@babydino.com">n.saxlund@babydino.com</a>&gt;<br><span style="font-weight:bold">Subject: </span>Re: your OpenERP.com registration<br>
</div>
<br>
<div>
<p>Hello Nicholas Saxlund, </p>
<p>I noticed you recently registered to our OpenERP Online solution. </p>
<p>You indicated that you wish to use OpenERP in your own company. We would like to know more about your your business needs and requirements, and see how we can help you. When would you be available to discuss your project ?
</p>
<p>Best regards, </p>
<pre><a href="http://openerp.com">http://openerp.com</a>
Belgium: +32.81.81.37.00
U.S.: +1 (650) 307-6736
India: +91 (79) 40 500 100
</pre>
</div>
</span>
</div>"""
HTML_5 = """<div><pre>Hi,
I have downloaded OpenERP installer 7.0 and successfully installed the postgresql server and the OpenERP.
I created a database and started to install module by log in as administrator.
However, I was not able to install any module due to "OpenERP Server Error" as shown in the attachement.
Could you please let me know how could I fix this problem?
&nbsp;Regards,
Goh Sin Yih
________________________________
From: OpenERP Enterprise &lt;sales@openerp.com&gt;
To: sinyih_goh@yahoo.com
Sent: Friday, February 8, 2013 12:46 AM
Subject: Feedback From Your OpenERP Trial
Hello Goh Sin Yih,
Thank you for having tested OpenERP Online.
I noticed you started a trial of OpenERP Online (gsy) but you did not decide to keep using it.
So, I just wanted to get in touch with you to get your feedback. Can you tell me what kind of application you were you looking for and why you didn't decide to continue with OpenERP?
Thanks in advance for providing your feedback,
Do not hesitate to contact me if you have any questions,
Thanks,
</pre>"""
GMAIL_1 = """Hello,<div><br></div><div>Ok for me. I am replying directly in gmail, without signature.</div><div><br></div><div>Kind regards,</div><div><br></div><div>Demo.<br><br><div>On Thu, Nov 8, 2012 at 5:29 PM, <span>&lt;<a href="mailto:dummy@example.com">dummy@example.com</a>&gt;</span> wrote:<br><blockquote><div>I contact you about our meeting for tomorrow. Here is the schedule I propose:</div><div><ul><li>9 AM: brainstorming about our new amazing business app&lt;/span&gt;&lt;/li&gt;</li>
<li>9.45 AM: summary</li><li>10 AM: meeting with Fabien to present our app</li></ul></div><div>Is everything ok for you ?</div>
<div><p>--<br>Administrator</p></div>
<div><p>Log in our portal at: <a href="http://localhost:8069#action=login&amp;db=mail_1&amp;login=demo">http://localhost:8069#action=login&amp;db=mail_1&amp;login=demo</a></p></div>
</blockquote></div><br></div>"""
GMAIL_1_IN = ['Ok for me. I am replying directly in gmail, without signature.']
GMAIL_1_OUT = ['Administrator', 'Log in our portal at:']
THUNDERBIRD_1 = """<div>On 11/08/2012 05:29 PM,
<a href="mailto:dummy@example.com">dummy@example.com</a> wrote:<br></div>
<blockquote>
<div>I contact you about our meeting for tomorrow. Here is the
schedule I propose:</div>
<div>
<ul><li>9 AM: brainstorming about our new amazing business
app&lt;/span&gt;&lt;/li&gt;</li>
<li>9.45 AM: summary</li>
<li>10 AM: meeting with Fabien to present our app</li>
</ul></div>
<div>Is everything ok for you ?</div>
<div>
<p>--<br>
Administrator</p>
</div>
<div>
<p>Log in our portal at:
<a href="http://localhost:8069#action=login&amp;db=mail_1&amp;token=rHdWcUART5PhEnJRaXjH">http://localhost:8069#action=login&amp;db=mail_1&amp;token=rHdWcUART5PhEnJRaXjH</a></p>
</div>
</blockquote>
Ok for me. I am replying directly below your mail, using Thunderbird, with a signature.<br><br>
Did you receive my email about my new laptop, by the way ?<br><br>
Raoul.<br><pre>--
Raoul Grosbedonn&#233;e
</pre>"""
THUNDERBIRD_1_IN = ['Ok for me. I am replying directly below your mail, using Thunderbird, with a signature.']
THUNDERBIRD_1_OUT = ['I contact you about our meeting for tomorrow.', 'Raoul Grosbedon']
HOTMAIL_1 = """<div>
<div dir="ltr"><br>&nbsp;
I have an amazing company, i'm learning OpenERP, it is a small company yet, but plannig to grow up quickly.
<br>&nbsp;<br>Kindest regards,<br>xxx<br>
<div>
<div id="SkyDrivePlaceholder">
</div>
<hr id="stopSpelling">
Subject: Re: your OpenERP.com registration<br>From: xxx@xxx.xxx<br>To: xxx@xxx.xxx<br>Date: Wed, 27 Mar 2013 17:12:12 +0000
<br><br>
Hello xxx,
<br>
I noticed you recently created an OpenERP.com account to access OpenERP Apps.
<br>
You indicated that you wish to use OpenERP in your own company.
We would like to know more about your your business needs and requirements, and see how
we can help you. When would you be available to discuss your project ?<br>
Best regards,<br>
<pre>
<a href="http://openerp.com" target="_blank">http://openerp.com</a>
Belgium: +32.81.81.37.00
U.S.: +1 (650) 307-6736
India: +91 (79) 40 500 100
</pre>
</div>
</div>
</div>"""
HOTMAIL_1_IN = ["I have an amazing company, i'm learning OpenERP, it is a small company yet, but plannig to grow up quickly."]
HOTMAIL_1_OUT = ["Subject: Re: your OpenERP.com registration", " I noticed you recently created an OpenERP.com account to access OpenERP Apps.",
"We would like to know more about your your business needs and requirements", "Belgium: +32.81.81.37.00"]
MSOFFICE_1 = """
<div>
<div class="WordSection1">
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
Our requirements are simple. Just looking to replace some spreadsheets for tracking quotes and possibly using the timecard module.
We are a company of 25 engineers providing product design services to clients.
</span>
</p>
<p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
Ill install on a windows server and run a very limited trial to see how it works.
If we adopt OpenERP we will probably move to Linux or look for a hosted SaaS option.
</span>
</p>
<p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
<br>
I am also evaluating Adempiere and maybe others.
</span>
</p>
<p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span>
</p>
<p>&nbsp;</p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
I expect the trial will take 2-3 months as this is not a high priority for us.
</span>
</p>
<p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span>
</p>
<p>&nbsp;</p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
Alan
</span>
</p>
<p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span>
</p>
<p>&nbsp;</p>
<p></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal">
<b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">
From:
</span></b>
<span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">
OpenERP Enterprise [mailto:sales@openerp.com]
<br><b>Sent:</b> Monday, 11 March, 2013 14:47<br><b>To:</b> Alan Widmer<br><b>Subject:</b> Re: your OpenERP.com registration
</span>
</p>
<p></p>
<p></p>
</div>
</div>
<p class="MsoNormal"></p>
<p>&nbsp;</p>
<p>Hello Alan Widmer, </p>
<p></p>
<p>I noticed you recently downloaded OpenERP. </p>
<p></p>
<p>
Uou mentioned you wish to use OpenERP in your own company. Please let me more about your
business needs and requirements? When will you be available to discuss about your project?
</p>
<p></p>
<p>Thanks for your interest in OpenERP, </p>
<p></p>
<p>Feel free to contact me if you have any questions, </p>
<p></p>
<p>Looking forward to hear from you soon. </p>
<p></p>
<pre><p>&nbsp;</p></pre>
<pre>--<p></p></pre>
<pre>Nicolas<p></p></pre>
<pre><a href="http://openerp.com">http://openerp.com</a><p></p></pre>
<pre>Belgium: +32.81.81.37.00<p></p></pre>
<pre>U.S.: +1 (650) 307-6736<p></p></pre>
<pre>India: +91 (79) 40 500 100<p></p></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<p></p></pre>
</div>
</div>"""
MSOFFICE_1_IN = ['Our requirements are simple. Just looking to replace some spreadsheets for tracking quotes and possibly using the timecard module.']
MSOFFICE_1_OUT = ['I noticed you recently downloaded OpenERP.', 'Uou mentioned you wish to use OpenERP in your own company.', 'Belgium: +32.81.81.37.00']
MSOFFICE_2 = """
<div>
<div class="WordSection1">
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Nicolas,</span></p><p></p>
<p></p>
<p class="MsoNormal" style="text-indent:.5in">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">We are currently investigating the possibility of moving away from our current ERP </span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p>&nbsp;</p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Thank You</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Matt</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p>&nbsp;</p>
<p></p>
<div>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Raoul Petitpoil</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Poil Industries</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Information Technology</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">920 Super Street</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Sanchez, Pa 17046 USA</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Tel: xxx.xxx</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Fax: xxx.xxx</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Email: </span>
<a href="mailto:raoul@petitpoil.com">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:blue">raoul@petitpoil.com</span>
</a>
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">www.poilindustries.com</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">www.superproducts.com</span></p><p></p>
<p></p>
</div>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p>&nbsp;</p>
<p></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal">
<b>
<span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span>
</b>
<span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> OpenERP Enterprise [mailto:sales@openerp.com] <br><b>Sent:</b> Wednesday, April 17, 2013 1:31 PM<br><b>To:</b> Matt Witters<br><b>Subject:</b> Re: your OpenERP.com registration</span></p><p></p>
<p></p>
</div>
</div>
<p class="MsoNormal"></p>
<p>&nbsp;</p>
<p>Hello Raoul Petitpoil, </p>
<p></p>
<p>I noticed you recently downloaded OpenERP. </p>
<p></p>
<p>You indicated that you wish to use OpenERP in your own company. We would like to know more about your your business needs and requirements, and see how we can help you. When would you be available to discuss your project ? </p>
<p></p>
<p>Best regards, </p>
<p></p>
<pre> <p>&nbsp;</p>
</pre>
<pre>--<p></p></pre>
<pre>Nicolas<p></p></pre>
<pre> <a href="http://openerp.com">http://openerp.com</a>
<p></p>
</pre>
<pre>Belgium: +32.81.81.37.00<p></p></pre>
<pre>U.S.: +1 (650) 307-6736<p></p></pre>
<pre>India: +91 (79) 40 500 100<p></p></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p></p></pre>
</div>
</div>"""
MSOFFICE_2_IN = ['We are currently investigating the possibility']
MSOFFICE_2_OUT = ['I noticed you recently downloaded OpenERP.', 'You indicated that you wish', 'Belgium: +32.81.81.37.00']
MSOFFICE_3 = """<div>
<div class="WordSection1">
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Hi Nicolas&nbsp;!</span></p><p></p>
<p></p>
<p class="MsoNormal">
<span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p>&nbsp;</p>
<p></p>
<p class="MsoNormal">
<span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Yes Id be glad to hear about your offers as we struggle every year with the planning/approving of LOA. </span></p><p></p>
<p></p>
<p class="MsoNormal">
<span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">I saw your boss yesterday on tv and immediately wanted to test the interface. </span></p><p></p>
<p></p>
<p class="MsoNormal">
<span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p>&nbsp;</p>
<p></p>
<div>
<p class="MsoNormal">
<b>
<span lang="NL-BE" style="font-size:10.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">Bien à vous, </span></b></p><p></p><b>
</b>
<p></p>
<p class="MsoNormal">
<b>
<span lang="NL-BE" style="font-size:10.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">Met vriendelijke groeten, </span></b></p><p></p><b>
</b>
<p></p>
<p class="MsoNormal">
<b>
<span lang="EN-GB" style="font-size:10.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">Best regards,</span></b></p><p></p><b>
</b>
<p></p>
<p class="MsoNormal">
<b>
<span lang="EN-GB" style="font-size:10.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">
</span></b></p><p><b>&nbsp;</b></p><b>
</b>
<p></p>
<p class="MsoNormal">
<b>
<span lang="EN-GB" style="font-size:10.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">R. Petitpoil&nbsp;&nbsp;&nbsp; <br></span>
</b>
<span lang="EN-GB" style="font-size:10.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">Human Resource Manager<b><br><br>Field Resource s.a n.v.&nbsp;&nbsp;<i> <br></i></b>Hermesstraat 6A <br>1930 Zaventem</span>
<span lang="EN-GB" style="font-size:8.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:gray"><br></span>
<b>
<span lang="FR" style="font-size:10.0pt;font-family:Wingdings;color:#1F497D">(</span>
</b>
<b>
<span lang="FR" style="font-size:9.0pt;font-family:Wingdings;color:#1F497D"> </span>
</b>
<b>
<span lang="EN-GB" style="font-size:8.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">xxx.xxx &nbsp;</span>
</b>
<b>
<span lang="EN-GB" style="font-size:9.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray"><br></span>
</b>
<b>
<span lang="FR" style="font-size:10.0pt;font-family:&quot;Wingdings 2&quot;;color:#1F497D">7</span>
</b>
<b>
<span lang="FR" style="font-size:9.0pt;font-family:&quot;Wingdings 2&quot;;color:#1F497D"> </span>
</b>
<b>
<span lang="EN-GB" style="font-size:8.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:gray">+32 2 727.05.91<br></span>
</b>
<span lang="EN-GB" style="font-size:24.0pt;font-family:Webdings;color:green">P</span>
<span lang="EN-GB" style="font-size:8.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;;color:green"> <b>&nbsp;&nbsp; </b></span>
<b>
<span lang="EN-GB" style="font-size:9.0pt;font-family:&quot;Trebuchet MS&quot;,&quot;sans-serif&quot;;color:green">Please consider the environment before printing this email.</span>
</b>
<span lang="EN-GB" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:navy"> </span>
<span lang="EN-GB" style="font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:navy">
</span></p><p></p>
<p></p>
</div>
<p class="MsoNormal">
<span lang="EN-US" style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">
</span></p><p>&nbsp;</p>
<p></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal">
<b>
<span lang="FR" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">De&nbsp;:</span>
</b>
<span lang="FR" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> OpenERP Enterprise [mailto:sales@openerp.com] <br><b>Envoyé&nbsp;:</b> jeudi 18 avril 2013 11:31<br><b>À&nbsp;:</b> Paul Richard<br><b>Objet&nbsp;:</b> Re: your OpenERP.com registration</span></p><p></p>
<p></p>
</div>
</div>
<p class="MsoNormal"></p>
<p>&nbsp;</p>
<p>Hello Raoul PETITPOIL, </p>
<p></p>
<p>I noticed you recently registered to our OpenERP Online solution. </p>
<p></p>
<p>You indicated that you wish to use OpenERP in your own company. We would like to know more about your your business needs and requirements, and see how we can help you. When would you be available to discuss your project ? </p>
<p></p>
<p>Best regards, </p>
<p></p>
<pre> <p>&nbsp;</p>
</pre>
<pre>--<p></p></pre>
<pre>Nicolas<p></p></pre>
<pre> <a href="http://openerp.com">http://openerp.com</a>
<p></p>
</pre>
<pre>Belgium: +32.81.81.37.00<p></p></pre>
<pre>U.S.: +1 (650) 307-6736<p></p></pre>
<pre>India: +91 (79) 40 500 100<p></p></pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p></p></pre>
</div>
</div>"""
MSOFFICE_3_IN = ['I saw your boss yesterday']
MSOFFICE_3_OUT = ['I noticed you recently downloaded OpenERP.', 'You indicated that you wish', 'Belgium: +32.81.81.37.00']

View File

@ -2,7 +2,7 @@
##############################################################################
#
# OpenERP, Open Source Business Applications
# Copyright (C) 2012 OpenERP S.A. (<http://openerp.com>).
# Copyright (C) 2012-2013 OpenERP S.A. (<http://openerp.com>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@ -44,27 +44,54 @@ tags_to_kill = ["script", "head", "meta", "title", "link", "style", "frame", "if
tags_to_remove = ['html', 'body', 'font']
def html_sanitize(src):
def html_sanitize(src, silent=True):
if not src:
return src
src = ustr(src, errors='replace')
logger = _logger.getChild('html_sanitize')
# html encode email tags
part = re.compile(r"(<(([^a<>]|a[^<>\s])[^<>]*)@[^<>]+>)", re.IGNORECASE | re.DOTALL)
src = part.sub(lambda m: cgi.escape(m.group(1)), src)
# some corner cases make the parser crash (such as <SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT> in test_mail)
kwargs = {
'page_structure': True,
'style': False, # do not remove style attributes
'forms': True, # remove form tags
}
if etree.LXML_VERSION >= (2, 3, 1):
# kill_tags attribute has been added in version 2.3.1
kwargs.update({
'kill_tags': tags_to_kill,
'remove_tags': tags_to_remove,
})
else:
kwargs['remove_tags'] = tags_to_kill + tags_to_remove
if etree.LXML_VERSION >= (3, 1, 0):
kwargs.update({
'safe_attrs_only': True,
'safe_attrs': clean.defs.safe_attrs | set(['style']),
})
else:
# lxml < 3.1.0 does not allow to specify safe_attrs. We keep all attributes in order to keep "style"
kwargs['safe_attrs_only'] = False
try:
cleaner = clean.Cleaner(page_structure=True, style=False, safe_attrs_only=False, forms=False, kill_tags=tags_to_kill, remove_tags=tags_to_remove)
# some corner cases make the parser crash (such as <SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT> in test_mail)
cleaner = clean.Cleaner(**kwargs)
cleaned = cleaner.clean_html(src)
except TypeError, e:
# lxml.clean version < 2.3.1 does not have a kill_tags attribute
# to remove in 2014
cleaner = clean.Cleaner(page_structure=True, style=False, safe_attrs_only=False, forms=False, remove_tags=tags_to_kill+tags_to_remove)
cleaned = cleaner.clean_html(src)
except:
_logger.warning('html_sanitize failed to parse %s' % (src))
cleaned = '<p>Impossible to parse</p>'
except etree.ParserError:
if not silent:
raise
logger.warning('ParserError obtained when sanitizing %r', src, exc_info=True)
cleaned = '<p>ParserError when sanitizing</p>'
except Exception:
if not silent:
raise
logger.warning('unknown error obtained when sanitizing %r', src, exc_info=True)
cleaned = '<p>Unknown error when sanitizing</p>'
return cleaned
@ -72,17 +99,36 @@ def html_sanitize(src):
# HTML Cleaner
#----------------------------------------------------------
def html_email_clean(html):
""" html_email_clean: clean the html to display in the web client.
- strip email quotes (remove blockquote nodes)
- strip signatures (remove --\n{\n)Blahblah), by replacing <br> by
\n to avoid ignoring signatures converted into html
def html_email_clean(html, remove=False, shorten=False, max_length=300):
""" html_email_clean: clean the html by doing the following steps:
:param string html: sanitized html; tags like html or head should not
be present in the html string. This method therefore takes as input
html code coming from a sanitized source, like fields.html.
- try to strip email quotes, by removing blockquotes or having some client-
specific heuristics
- try to strip signatures
- shorten the html to a maximum number of characters if requested
Some specific use case:
- MsOffice: ``div.style = border-top:solid;`` delimitates the beginning of
a quote; detecting by finding WordSection1 of MsoNormal
- Hotmail: ``hr.stopSpelling`` delimitates the beginning of a quote; detect
Hotmail by funding ``SkyDrivePlaceholder``
:param string html: sanitized html; tags like html or head should not
be present in the html string. This method therefore
takes as input html code coming from a sanitized source,
like fields.html.
:param boolean remove: remove the html code that is unwanted; otherwise it
is only flagged and tagged
:param boolean shorten: shorten the html; every excessing content will
be flagged as to remove
:param int max_length: if shortening, maximum number of characters before
shortening
"""
def _replace_matching_regex(regex, source, replace=''):
""" Replace all matching expressions in source by replace """
if not source:
return source
dest = ''
idx = 0
for item in re.finditer(regex, source):
@ -91,62 +137,162 @@ def html_email_clean(html):
dest += source[idx:]
return dest
def _create_node(tag, text, tail=None, attrs={}):
new_node = etree.Element(tag)
new_node.text = text
new_node.tail = tail
for key, val in attrs.iteritems():
new_node.set(key, val)
return new_node
def _insert_new_node(node, index, new_node_tag, new_node_text, new_node_tail=None, new_node_attrs={}):
new_node = _create_node(new_node_tag, new_node_text, new_node_tail, new_node_attrs)
node.insert(index, new_node)
return new_node
def _tag_matching_regex_in_text(regex, node, new_node_tag='span', new_node_attrs={}):
text = node.text or ''
if not re.search(regex, text):
return
cur_node = node
node.text = ''
idx, iteration = 0, 0
for item in re.finditer(regex, text):
if iteration == 0:
cur_node.text = text[idx:item.start()]
else:
_insert_new_node(node, (iteration - 1) * 2 + 1, new_node_tag, text[idx:item.start()])
new_node = _insert_new_node(node, iteration * 2, new_node_tag, text[item.start():item.end()], None, new_node_attrs)
cur_node = new_node
idx = item.end()
iteration += 1
new_node = _insert_new_node(node, -1, new_node_tag, text[idx:] + (cur_node.tail or ''), None, {})
if not html or not isinstance(html, basestring):
return html
html = ustr(html)
# 0. remove encoding attribute inside tags
# Pre processing
# ------------------------------------------------------------
# TDE TODO: --- MAIL ORIGINAL ---: '[\-]{4,}([^\-]*)[\-]{4,}'
# html: remove encoding attribute inside tags
doctype = re.compile(r'(<[^>]*\s)(encoding=(["\'][^"\']*?["\']|[^\s\n\r>]+)(\s[^>]*|/)?>)', re.IGNORECASE | re.DOTALL)
html = doctype.sub(r"", html)
# 1. <br[ /]> -> \n, because otherwise the tree is obfuscated
br_tags = re.compile(r'([<]\s*[bB][rR]\s*\/?[>])')
html = _replace_matching_regex(br_tags, html, '__BR_TAG__')
# html: ClEditor seems to love using <div><br /><div> -> replace with <br />
br_div_tags = re.compile(r'(<div>\s*<br\s*\/>\s*<\/div>)', re.IGNORECASE)
html = _replace_matching_regex(br_div_tags, html, '<br />')
# 2. form a tree, handle (currently ?) pure-text by enclosing them in a pre
# form a tree
root = lxml.html.fromstring(html)
if not len(root) and root.text is None and root.tail is None:
html = '<div>%s</div>' % html
root = lxml.html.fromstring(html)
# 2.5 remove quoted text in nodes
quote_tags = re.compile(r'(\n(>)+[^\n\r]*)')
# remove all tails and replace them by a span element, because managing text and tails can be a pain in the ass
for node in root.getiterator():
if not node.text:
continue
node.text = _replace_matching_regex(quote_tags, node.text)
# 3. remove blockquotes
quotes = [el for el in root.getiterator(tag='blockquote')]
for node in quotes:
# copy the node tail into parent text
if node.tail:
parent = node.getparent()
parent.text = parent.text or '' + node.tail
# remove the node
node.getparent().remove(node)
tail_node = _create_node('span', node.tail)
node.tail = None
node.addnext(tail_node)
# 4. strip signatures
signature = re.compile(r'([-]{2}[\s]?[\r\n]{1,2}[^\z]+)')
for elem in root.getiterator():
if elem.text:
match = re.search(signature, elem.text)
if match:
elem.text = elem.text[:match.start()] + elem.text[match.end():]
if elem.tail:
match = re.search(signature, elem.tail)
if match:
elem.tail = elem.tail[:match.start()] + elem.tail[match.end():]
# form node and tag text-based quotes and signature
quote_tags = re.compile(r'(\n(>)+[^\n\r]*)')
signature = re.compile(r'([-]{2,}[\s]?[\r\n]{1,2}[^.]+)')
for node in root.getiterator():
_tag_matching_regex_in_text(quote_tags, node, 'span', {'text_quote': '1'})
_tag_matching_regex_in_text(signature, node, 'span', {'text_signature': '1'})
# 5. \n back to <br/>
html = etree.tostring(root, pretty_print=True)
html = html.replace('__BR_TAG__', '<br />')
# Processing
# ------------------------------------------------------------
# 6. Misc cleaning :
# - ClEditor seems to love using <div><br /><div> -> replace with <br />
br_div_tags = re.compile(r'(<div>\s*<br\s*\/>\s*<\/div>)')
html = _replace_matching_regex(br_div_tags, html, '<br />')
# tree: tag nodes
# signature_begin = False # try dynamic signature recognition
quote_begin = False
overlength = False
cur_char_nbr = 0
for node in root.getiterator():
# root: try to tag the client used to write the html
if 'WordSection1' in node.get('class', '') or 'MsoNormal' in node.get('class', ''):
root.set('msoffice', '1')
if 'SkyDrivePlaceholder' in node.get('class', '') or 'SkyDrivePlaceholder' in node.get('id', ''):
root.set('hotmail', '1')
# state of the parsing
if quote_begin:
node.set('in_quote', '1')
node.set('tail_remove', '1')
if overlength:
node.set('in_overlength', '1')
node.set('tail_remove', '1')
if root.get('msoffice') and node.tag == 'div' and 'border-top:solid' in node.get('style', ''):
quote_begin = True
node.set('in_quote', '1')
node.set('tail_remove', '1')
if root.get('hotmail') and node.tag == 'hr' and ('stopSpelling' in node.get('class', '') or 'stopSpelling' in node.get('id', '')):
quote_begin = True
node.set('in_quote', '1')
node.set('tail_remove', '1')
# shorten:
# 1/ truncate the text at the next available space
# 2/ create a 'read more' node, next to current node
# 3/ add the truncated text in a new node, next to 'read more' node
if shorten and not overlength and cur_char_nbr + len(node.text or '') > max_length:
overlength = True
# truncate text
innertext = node.text[0:(max_length - cur_char_nbr)]
outertext = node.text[(max_length - cur_char_nbr):]
stop_idx = outertext.find(' ')
if stop_idx == -1:
stop_idx = len(outertext)
node.text = innertext + outertext[0:stop_idx]
# create <span> ... <a href="#">read more</a></span> node
read_more_node = _create_node('span', ' ... ', None, {'class': 'oe_mail_expand'})
read_more_link_node = _create_node('a', 'read more', None, {'href': '#', 'class': 'oe_mail_expand'})
read_more_node.append(read_more_link_node)
# create outertext node
new_node = _create_node('span', outertext[stop_idx:])
# add newly created nodes in dom
node.addnext(new_node)
node.addnext(read_more_node)
# tag node
new_node.set('in_overlength', '1')
cur_char_nbr += len(node.text or '')
if node.tag == 'blockquote' or node.get('text_quote') or node.get('text_signature'):
node.set('in_quote', '1')
# Post processing
# ------------------------------------------------------------
to_remove = []
for node in root.getiterator():
if node.get('in_quote') or node.get('in_overlength'):
# copy the node tail into parent text
if node.tail and not node.get('tail_remove'):
parent = node.getparent()
parent.tail = node.tail + (parent.tail or '')
to_remove.append(node)
if node.get('tail_remove'):
node.tail = ''
for node in to_remove:
if remove:
node.getparent().remove(node)
else:
if not 'oe_mail_expand' in node.get('class', ''): # trick: read more link should be displayed even if it's in overlength
node_class = node.get('class', '') + ' ' + 'oe_mail_cleaned'
node.set('class', node_class)
# html: \n that were tail of elements have been encapsulated into <span> -> back to \n
html = etree.tostring(root, pretty_print=False)
linebreaks = re.compile(r'<span>([\s]*[\r\n]+[\s]*)<\/span>', re.IGNORECASE | re.DOTALL)
html = _replace_matching_regex(linebreaks, html, '\n')
return html

View File

@ -421,6 +421,7 @@ def get_iso_codes(lang):
ALL_LANGUAGES = {
'ab_RU': u'Abkhazian / аҧсуа',
'am_ET': u'Amharic / አምሃርኛ',
'ar_SY': u'Arabic / الْعَرَبيّة',
'bg_BG': u'Bulgarian / български език',
'bs_BS': u'Bosnian / bosanski jezik',

View File

@ -101,7 +101,7 @@ def check(cr, workitem, ident, transition, signal):
return False
uid = ident[0]
if uid != openerp.SUPERUSER_ID and transition['groups_id']:
if uid != openerp.SUPERUSER_ID and transition['group_id']:
registry = openerp.registry(cr.dbname)
user_groups = registry['res.users'].read(cr, uid, [uid], ['groups_id'])[0]['groups_id']
if transition['group_id'] not in user_groups: