[MERGE] sync with trunk

bzr revid: mat@openerp.com-20131119084834-hl9hv380nhlfs7it
This commit is contained in:
Martin Trigaux
2013-11-19 09:48:34 +01:00
94 changed files with 3202 additions and 1092 deletions
+7 -1
View File
@@ -47,7 +47,13 @@ Depends:
Conflicts: tinyerp-server, openerp-server, openerp-web
Replaces: tinyerp-server, openerp-server, openerp-web
Recommends:
graphviz, ghostscript, postgresql, python-matplotlib, poppler-utils
antiword,
graphviz,
ghostscript,
postgresql,
python-gevent,
python-matplotlib,
poppler-utils
Description: OpenERP Enterprise Resource Management
OpenERP, previously known as TinyERP, is a complete ERP and CRM. The main
features are accounting (analytic and financial), stock management, sales and
+2 -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-10-11 04:37+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:29+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:30+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:30+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:30+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:31+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
File diff suppressed because it is too large Load Diff
+2 -2
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-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:31+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:31+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Poedit-Language: Czech\n"
#. module: base
+2 -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-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:31+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:33+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:33+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Poedit-Country: GREECE\n"
"X-Poedit-Language: Greek\n"
"X-Poedit-SourceCharset: utf-8\n"
+39 -20
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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:39+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -1107,7 +1107,7 @@ msgstr "Email Preferences"
#: code:addons/base/ir/ir_fields.py:195
#, python-format
msgid "'%s' does not seem to be a valid date for field '%%(field)s'"
msgstr ""
msgstr "'%s' does not seem to be a valid date for field '%%(field)s'"
#. module: base
#: view:res.partner:0
@@ -1257,7 +1257,7 @@ msgstr "Andorra, Principality of"
#. module: base
#: field:ir.rule,perm_read:0
msgid "Apply for Read"
msgstr ""
msgstr "Apply for Read"
#. module: base
#: model:res.country,name:base.mn
@@ -1349,7 +1349,7 @@ msgstr "Document model"
#. module: base
#: view:res.users:0
msgid "Change the user password."
msgstr ""
msgstr "Change the user password."
#. module: base
#: view:res.lang:0
@@ -1488,12 +1488,12 @@ msgstr "The country name must be unique!"
#. module: base
#: field:ir.module.module,installed_version:0
msgid "Latest Version"
msgstr ""
msgstr "Latest Version"
#. module: base
#: view:ir.rule:0
msgid "Delete Access Right"
msgstr ""
msgstr "Delete Access Right"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:214
@@ -1520,7 +1520,7 @@ msgstr "Cayman Islands"
#. module: base
#: view:ir.rule:0
msgid "Record Rule"
msgstr ""
msgstr "Record Rule"
#. module: base
#: model:res.country,name:base.kr
@@ -1546,7 +1546,7 @@ msgstr "Contributors"
#. module: base
#: field:ir.rule,perm_unlink:0
msgid "Apply for Delete"
msgstr ""
msgstr "Apply for Delete"
#. module: base
#: selection:ir.property,type:0
@@ -1556,12 +1556,12 @@ msgstr "Char"
#. module: base
#: field:ir.module.category,visible:0
msgid "Visible"
msgstr ""
msgstr "Visible"
#. module: base
#: model:ir.actions.client,name:base.action_client_base_menu
msgid "Open Settings Menu"
msgstr ""
msgstr "Open Settings Menu"
#. module: base
#: selection:base.language.install,lang:0
@@ -1621,6 +1621,10 @@ msgid ""
" for uploading to OpenERP's translation "
"platform,"
msgstr ""
"TGZ format: this is a compressed archive containing a PO file, directly "
"suitable\n"
" for uploading to OpenERP's translation "
"platform,"
#. module: base
#: view:res.lang:0
@@ -1647,7 +1651,7 @@ msgstr "Tests"
#. module: base
#: field:ir.actions.report.xml,attachment:0
msgid "Save as Attachment Prefix"
msgstr ""
msgstr "Save as Attachment Prefix"
#. module: base
#: field:ir.ui.view_sc,res_id:0
@@ -1684,7 +1688,7 @@ msgstr "Haiti"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_fr_hr_payroll
msgid "French Payroll"
msgstr ""
msgstr "French Payroll"
#. module: base
#: view:ir.ui.view:0
@@ -1843,7 +1847,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.mf
msgid "Saint Martin (French part)"
msgstr ""
msgstr "Saint Martin (French part)"
#. module: base
#: model:ir.model,name:base.model_ir_exports
@@ -1863,6 +1867,15 @@ msgid ""
" * the main taxes used in Luxembourg\n"
" * default fiscal position for local, intracom, extracom "
msgstr ""
"\n"
"This is the base module to manage the accounting chart for Luxembourg.\n"
"======================================================================\n"
"\n"
" * the Luxembourg Official Chart of Accounts (law of June 2009 + 2011 "
"chart and Taxes),\n"
" * the Tax Code Chart for Luxembourg\n"
" * the main taxes used in Luxembourg\n"
" * default fiscal position for local, intracom, extracom "
#. module: base
#: code:addons/base/module/wizard/base_update_translations.py:39
@@ -1874,7 +1887,7 @@ msgstr "No language with code \"%s\" exists"
#: model:ir.module.category,name:base.module_category_social_network
#: model:ir.module.module,shortdesc:base.module_mail
msgid "Social Network"
msgstr ""
msgstr "Social Network"
#. module: base
#: view:res.lang:0
@@ -1884,12 +1897,12 @@ msgstr "%Y - Year with century."
#. module: base
#: view:res.company:0
msgid "Report Footer Configuration"
msgstr ""
msgstr "Report Footer Configuration"
#. module: base
#: field:ir.translation,comments:0
msgid "Translation comments"
msgstr ""
msgstr "Translation comments"
#. module: base
#: model:ir.module.module,description:base.module_lunch
@@ -1947,6 +1960,8 @@ msgid ""
"The field on the current object that links to the target object record (must "
"be a many2one, or an integer field with the record ID)"
msgstr ""
"The field on the current object that links to the target object record (must "
"be a many2one, or an integer field with the record ID)"
#. module: base
#: model:ir.model,name:base.model_res_bank
@@ -1972,7 +1987,7 @@ msgstr ""
#. module: base
#: help:res.partner,website:0
msgid "Website of Partner or Company"
msgstr ""
msgstr "Website of Partner or Company"
#. module: base
#: help:base.language.install,overwrite:0
@@ -2032,7 +2047,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_project_issue
msgid "Portal Issue"
msgstr ""
msgstr "Portal Issue"
#. module: base
#: model:ir.ui.menu,name:base.menu_tools
@@ -2052,6 +2067,10 @@ msgid ""
"Launch Manually Once: after having been launched manually, it sets "
"automatically to Done."
msgstr ""
"Manual: Launched manually.\n"
"Automatic: Runs whenever the system is reconfigured.\n"
"Launch Manually Once: after having been launched manually, it sets "
"automatically to Done."
#. module: base
#: field:res.partner,image_small:0
@@ -13849,7 +13868,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 "Belgium - Payroll with Accounting"
#. module: base
#: selection:base.language.export,format:0
+4 -4
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-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:37+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -7260,7 +7260,7 @@ msgstr "El nombre del grupo no puede empezar con \"-\""
#: view:ir.module.module:0
#: model:ir.ui.menu,name:base.module_mi
msgid "Apps"
msgstr "Aplicaciones"
msgstr "Tienda de aplicaciones"
#. module: base
#: view:ir.ui.view_sc:0
@@ -17750,7 +17750,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 "Módulos instalados"
msgstr "Módulos locales"
#. module: base
#: code:addons/base/res/res_users.py:170
+2 -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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:39+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:40+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:40+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:40+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"Language: \n"
#. module: base
+2 -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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:39+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:41+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:41+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:39+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:32+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:31+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:36+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
"X-Poedit-Language: Persian\n"
+2 -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-10-11 04:49+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:41+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:32+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+4 -3
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-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:32+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -15529,7 +15529,8 @@ msgstr "Partenaires clients"
#. module: base
#: sql_constraint:res.users:0
msgid "You can not have two users with the same login !"
msgstr "VOus ne pouvez pas avoir deux utilsiateurs avec le même login !"
msgstr ""
"Vous ne pouvez pas avoir deux utilisateurs avec le même identifiant !"
#. module: base
#: model:ir.model,name:base.model_res_request_history
+2 -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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:40+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:33+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:33+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:33+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:33+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+9 -5
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-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:37+0000\n"
"X-Generator: Launchpad (build 16820)\n"
"Language: hr\n"
#. module: base
@@ -3189,7 +3189,7 @@ msgstr ""
#. module: base
#: field:res.company,rml_header1:0
msgid "Company Tagline"
msgstr ""
msgstr "Slogan tvrtke"
#. module: base
#: code:addons/base/res/res_users.py:674
@@ -3994,7 +3994,7 @@ msgstr "12. %w ==> 5 ( Petak je 6ti dan)"
#. module: base
#: constraint:res.partner.category:0
msgid "Error ! You can not create recursive categories."
msgstr "Graška ! Ne može se stvoriti kategorije s rekurzijom."
msgstr "Greška! Ne možete kreirati rekurzivne kategorije."
#. module: base
#: view:res.lang:0
@@ -8815,6 +8815,10 @@ msgid ""
"\n"
"(Document type: %s)"
msgstr ""
"Za ovu vrstu dokumenta imate pravo pristupa samo onima koje ste vi "
"kreirali.\n"
"\n"
"(Vrstu dokumenta: %s)"
#. module: base
#: view:base.language.export:0
@@ -9872,7 +9876,7 @@ msgstr "Kreirano"
#: help:ir.actions.server,model_id:0
msgid ""
"Select the object on which the action will work (read, write, create)."
msgstr "Odaberite objekt na koje će akcija raditi (read, write, create)."
msgstr "Odaberite objekt na koje će akcija raditi (čitaj, piši, kreiraj)."
#. module: base
#: field:base.language.import,name:0
+7 -7
View File
@@ -7,14 +7,14 @@ msgstr ""
"Project-Id-Version: OpenERP Server 6.0\n"
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-03-14 10:08+0000\n"
"Last-Translator: krnkris <Unknown>\n"
"PO-Revision-Date: 2013-10-15 13:13+0000\n"
"Last-Translator: tdombos <Unknown>\n"
"Language-Team: Hungarian <openerp-hungarian-team@lists.launchpad.net>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-10-11 04:41+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:34+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -6230,7 +6230,7 @@ msgstr "Kenya"
#: model:ir.actions.act_window,name:base.action_translation
#: model:ir.ui.menu,name:base.menu_action_translation
msgid "Translated Terms"
msgstr "Lefordított feltételek"
msgstr "Lefordított kifejezések"
#. module: base
#: selection:base.language.install,lang:0
@@ -12491,7 +12491,7 @@ msgstr "This method does not exist anymore"
#: model:ir.actions.act_window,name:base.action_wizard_update_translations
#: model:ir.ui.menu,name:base.menu_wizard_update_translations
msgid "Synchronize Terms"
msgstr "Feltételek szinkronizáása"
msgstr "Kifejezések szinkronizáása"
#. module: base
#: field:res.lang,thousands_sep:0
@@ -13640,7 +13640,7 @@ msgstr "Érvénytelen adatbázis azonosító '%s' ehhez a mezőhöz '%%(field)s'
#. module: base
#: view:res.lang:0
msgid "Update Languague Terms"
msgstr "Nyelvi feltételek frissítése"
msgstr "Nyelvi kifejezések frissítése"
#. module: base
#: field:workflow.activity,join_mode:0
+2 -2
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-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:30+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:34+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:34+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:34+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+114 -111
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-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:34+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -62,7 +62,7 @@ msgstr "ビューアーキテクチャ"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr "見積書、販売オーダ、出荷、請求書コントロール"
msgstr "見積、受注、出荷、請求書コントロール"
#. module: base
#: selection:ir.sequence,implementation:0
@@ -94,7 +94,7 @@ msgstr "店舗用タッチスクリーン画面"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
msgid "Indian Payroll"
msgstr ""
msgstr "インド給与管理"
#. module: base
#: help:ir.cron,model:0
@@ -135,11 +135,14 @@ msgid ""
"The module adds google user in res user.\n"
"========================================\n"
msgstr ""
"\n"
"このモジュールはユーザマスタにGoogleユーザを追加します。\n"
"========================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "この連絡先が従業員である場合はチェック。"
#. module: base
#: help:ir.model.fields,domain:0
@@ -169,7 +172,7 @@ msgstr "ターゲットウィンドウ"
#. module: base
#: field:ir.actions.report.xml,report_rml:0
msgid "Main Report File Path"
msgstr ""
msgstr "メインレポートファイルパス"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
@@ -287,12 +290,12 @@ msgstr "販売管理"
msgid ""
"The internal user that is in charge of communicating with this contact if "
"any."
msgstr ""
msgstr "この連絡先との連携を担当する内部ユーザ"
#. module: base
#: view:res.partner:0
msgid "Search Partner"
msgstr "パートナ検索"
msgstr "取引先検索"
#. module: base
#: field:ir.module.category,module_nr:0
@@ -613,7 +616,7 @@ msgstr "スペイン語(ベネズエラ)/ Español (VE)"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice
msgid "Invoice on Timesheets"
msgstr "勤務表による請求書"
msgstr "タイムシートを基に請求"
#. module: base
#: view:base.module.upgrade:0
@@ -668,7 +671,7 @@ msgstr "未翻訳"
#. module: base
#: view:ir.mail_server:0
msgid "Outgoing Mail Server"
msgstr ""
msgstr "送信メールサーバ"
#. module: base
#: help:ir.actions.act_window,context:0
@@ -855,7 +858,7 @@ msgstr "セキュリティと認証"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_calendar
msgid "Web Calendar"
msgstr ""
msgstr "ウェブカレンダ"
#. module: base
#: selection:base.language.install,lang:0
@@ -866,7 +869,7 @@ msgstr "スウェーデン語 / svenska"
#: field:base.language.export,name:0
#: field:ir.attachment,datas_fname:0
msgid "File Name"
msgstr ""
msgstr "ファイル名"
#. module: base
#: model:res.country,name:base.rs
@@ -962,7 +965,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "My Partners"
msgstr "Myパートナ"
msgstr "自分の取引先"
#. module: base
#: model:res.country,name:base.zw
@@ -1261,7 +1264,7 @@ msgstr "国の名前は固有であるべきです。"
#. module: base
#: field:ir.module.module,installed_version:0
msgid "Latest Version"
msgstr ""
msgstr "最新バージョン"
#. module: base
#: view:ir.rule:0
@@ -1649,7 +1652,7 @@ msgstr "%Y - 世紀を含む年"
#. module: base
#: view:res.company:0
msgid "Report Footer Configuration"
msgstr ""
msgstr "レポートフッタ設定調整"
#. module: base
#: field:ir.translation,comments:0
@@ -1998,7 +2001,7 @@ msgstr "7. %H:%M:%S ==> 18:25:20"
#: view:res.partner:0
#: field:res.partner.category,partner_ids:0
msgid "Partners"
msgstr "パートナ"
msgstr "取引先"
#. module: base
#: field:res.partner.category,parent_left:0
@@ -2019,7 +2022,7 @@ msgstr ""
#. module: base
#: field:res.partner.bank,footer:0
msgid "Display on Reports"
msgstr "表示(レポート)"
msgstr "レポート表記"
#. module: base
#: model:ir.module.module,description:base.module_project_timesheet
@@ -2596,7 +2599,7 @@ msgstr "オブジェクト名は x_ で始める必要があり、特殊文字
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_oauth_signup
msgid "Signup with OAuth2 Authentication"
msgstr ""
msgstr "OAuth2認証によるサインアップ"
#. module: base
#: selection:ir.model,state:0
@@ -2623,12 +2626,12 @@ msgstr "ギリシャ語 / Ελληνικά"
#. module: base
#: field:res.company,custom_footer:0
msgid "Custom Footer"
msgstr ""
msgstr "フッターのカスタマイズ"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_crm
msgid "Opportunity to Quotation"
msgstr "商談から見積り"
msgstr "商談から見積"
#. module: base
#: model:ir.module.module,description:base.module_sale_analytic_plans
@@ -3134,7 +3137,7 @@ msgstr "韓国語(韓国)/ 한국어 (KR)"
#. module: base
#: help:ir.model.fields,model:0
msgid "The technical name of the model this field belongs to"
msgstr "この項目が属するモデルの専門的名前"
msgstr "この項目が属するモデルの技術名称"
#. module: base
#: field:ir.actions.server,action_id:0
@@ -3165,7 +3168,7 @@ msgstr ""
#. module: base
#: field:res.company,rml_header1:0
msgid "Company Tagline"
msgstr ""
msgstr "会社スローガン"
#. module: base
#: code:addons/base/res/res_users.py:674
@@ -3370,12 +3373,12 @@ msgstr "オーストリア"
#: model:ir.ui.menu,name:base.menu_calendar_configuration
#: selection:ir.ui.view,type:0
msgid "Calendar"
msgstr "カレンダー"
msgstr "カレンダ"
#. module: base
#: model:ir.module.category,name:base.module_category_knowledge_management
msgid "Knowledge"
msgstr ""
msgstr "ナレッジ"
#. module: base
#: field:workflow.activity,signal_send:0
@@ -3408,7 +3411,7 @@ msgid ""
"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: "
"Mr., Mrs. "
msgstr "手紙や他のドキュメントの印刷において利用する際の適切な連絡先のタイトルを管理します。 幾つかの例:男子や夫人の敬称 "
msgstr "手紙やその他のドキュメント印刷にて使用する連絡先敬称を管理します(例えば「様」、「御中」など)。 "
#. module: base
#: view:ir.model.access:0
@@ -3477,7 +3480,7 @@ msgstr "生年月日"
#: model:ir.actions.act_window,name:base.action_partner_title_contact
#: model:ir.ui.menu,name:base.menu_partner_title_contact
msgid "Contact Titles"
msgstr "役職"
msgstr "連絡先敬称"
#. module: base
#: model:ir.module.module,shortdesc:base.module_product_manufacturer
@@ -3700,7 +3703,7 @@ msgstr ""
#. module: base
#: view:base.language.import:0
msgid "_Import"
msgstr "インポート"
msgstr "インポート(_I)"
#. module: base
#: field:res.users,action_id:0
@@ -3753,7 +3756,7 @@ msgstr "ルール間の影響"
#: field:res.company,rml_footer:0
#: field:res.company,rml_footer_readonly:0
msgid "Report Footer"
msgstr ""
msgstr "レポートフッタ"
#. module: base
#: selection:res.lang,direction:0
@@ -3791,7 +3794,7 @@ msgstr "レポート"
#: field:res.partner,title:0
#: field:res.partner.title,name:0
msgid "Title"
msgstr "役職"
msgstr "敬称"
#. module: base
#: help:ir.property,res_id:0
@@ -4436,7 +4439,7 @@ msgstr "式"
#. module: base
#: view:res.company:0
msgid "Header/Footer"
msgstr "ヘッダー / フッター"
msgstr "ヘッダ/フッタ"
#. module: base
#: help:ir.mail_server,sequence:0
@@ -4448,7 +4451,7 @@ msgstr "メールサーバを特に指定しないメールは最も高い優先
#. module: base
#: model:ir.module.module,summary:base.module_sale
msgid "Quotations, Sales Orders, Invoicing"
msgstr ""
msgstr "見積、受注、請求"
#. module: base
#: field:res.partner,parent_id:0
@@ -4482,7 +4485,7 @@ msgstr "モジュール .ZIPファイル"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_17
msgid "Telecom sector"
msgstr "遠距離通信部門"
msgstr "通信セクター"
#. module: base
#: field:workflow.transition,trigger_model:0
@@ -4497,7 +4500,7 @@ msgstr "`code`は固有であるべきです。"
#. module: base
#: model:ir.module.module,shortdesc:base.module_knowledge
msgid "Knowledge Management System"
msgstr ""
msgstr "ナレッジ管理システム"
#. module: base
#: view:workflow.activity:0
@@ -4811,7 +4814,7 @@ msgstr "郵便番号"
#: view:ir.module.module:0
#: field:ir.module.module,author:0
msgid "Author"
msgstr "著者"
msgstr "作成者"
#. module: base
#: view:ir.actions.todo:0
@@ -4970,7 +4973,7 @@ msgstr ""
#. module: base
#: model:res.partner.category,name:base.res_partner_category_7
msgid "IT Services"
msgstr ""
msgstr "ITサービス"
#. module: base
#: model:ir.module.category,name:base.module_category_specific_industry_applications
@@ -5037,7 +5040,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_event_sale
msgid "Events Sales"
msgstr ""
msgstr "イベント販売"
#. module: base
#: model:res.country,name:base.ls
@@ -5161,7 +5164,7 @@ msgstr "キー"
#. module: base
#: field:res.company,rml_header:0
msgid "RML Header"
msgstr "RMLヘッダー"
msgstr "RMLヘッダ"
#. module: base
#: help:res.country,address_format:0
@@ -5341,7 +5344,7 @@ msgstr "各モジュールは固有でなければなりません。"
#: model:ir.module.category,name:base.module_category_localization
#: model:ir.ui.menu,name:base.menu_localisation
msgid "Localization"
msgstr "ローカル化"
msgstr "ローカライズ"
#. module: base
#: model:ir.module.module,description:base.module_web_api
@@ -5420,12 +5423,12 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_partner_category_form
msgid "Partner Tags"
msgstr ""
msgstr "取引先タグ"
#. module: base
#: view:res.company:0
msgid "Preview Header/Footer"
msgstr ""
msgstr "ヘッダ/フッタプレビュー"
#. module: base
#: field:ir.ui.menu,parent_id:0
@@ -5716,7 +5719,7 @@ msgstr ""
#: field:workflow,name:0
#: field:workflow.activity,name:0
msgid "Name"
msgstr "名前"
msgstr "名称"
#. module: base
#: help:ir.actions.act_window,multi:0
@@ -5944,7 +5947,7 @@ msgstr "インストール言語"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_11
msgid "Services"
msgstr ""
msgstr "サービス業"
#. module: base
#: view:ir.translation:0
@@ -6393,7 +6396,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_cancel
msgid "Cancel Journal Entries"
msgstr "仕訳帳入力のキャンセル"
msgstr "仕訳取消"
#. module: base
#: field:res.partner,tz_offset:0
@@ -6530,7 +6533,7 @@ msgstr "フランス語 / Français"
#. module: base
#: view:ir.module.module:0
msgid "Created Menus"
msgstr "作成済メニュー"
msgstr "作成メニュー"
#. module: base
#: code:addons/base/module/module.py:502
@@ -6797,7 +6800,7 @@ msgstr "時刻の書式"
#. module: base
#: field:res.company,rml_header3:0
msgid "RML Internal Header for Landscape Reports"
msgstr ""
msgstr "ランドスケープレポート用RML内部ヘッダ"
#. module: base
#: model:res.groups,name:base.group_partner_manager
@@ -6807,7 +6810,7 @@ msgstr ""
#. module: base
#: view:ir.module.module:0
msgid "Defined Reports"
msgstr "レポートの定義"
msgstr "定義レポート"
#. module: base
#: model:ir.module.module,shortdesc:base.module_project_gtd
@@ -6919,7 +6922,7 @@ msgstr "ボツワナ"
#. module: base
#: view:res.partner.title:0
msgid "Partner Titles"
msgstr "パートナのタイトル"
msgstr "取引先タイトル"
#. module: base
#: code:addons/base/ir/ir_fields.py:196
@@ -7033,7 +7036,7 @@ msgstr ""
#. module: base
#: help:ir.model.fields,relation:0
msgid "For relationship fields, the technical name of the target model"
msgstr "その目的モデルの関係項目のための技術的な名前"
msgstr "関係項目につき、ターゲットモデルの技術名称"
#. module: base
#: view:res.lang:0
@@ -7093,7 +7096,7 @@ msgstr "遷移"
#: model:ir.module.module,shortdesc:base.module_hr_timesheet
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_sheet
msgid "Timesheets"
msgstr "勤務表"
msgstr "タイムシート"
#. module: base
#: help:ir.values,company_id:0
@@ -7276,7 +7279,7 @@ msgstr "署名"
#. module: base
#: field:res.partner.category,complete_name:0
msgid "Full Name"
msgstr "氏名"
msgstr "名称"
#. module: base
#: view:ir.attachment:0
@@ -7369,7 +7372,7 @@ msgstr ""
#: view:res.partner:0
#: field:res.partner,child_ids:0
msgid "Contacts"
msgstr "コンタクト"
msgstr "連絡先"
#. module: base
#: model:res.country,name:base.fo
@@ -7395,7 +7398,7 @@ msgstr "エクアドル - 会計"
#. module: base
#: field:res.partner.category,name:0
msgid "Category Name"
msgstr "分類名"
msgstr "カテゴリ名"
#. module: base
#: model:res.country,name:base.mp
@@ -7480,7 +7483,7 @@ msgstr "コンテンツが別のデータ項目にある場合、メインレポ
#. module: base
#: model:res.partner.category,name:base.res_partner_category_14
msgid "Manufacturer"
msgstr ""
msgstr "製造業"
#. module: base
#: help:res.users,company_id:0
@@ -7744,7 +7747,7 @@ msgstr ""
#. module: base
#: field:res.company,rml_header2:0
msgid "RML Internal Header"
msgstr "RML内部ヘッダー"
msgstr "RML内部ヘッダ"
#. module: base
#: field:ir.actions.act_window,search_view_id:0
@@ -7967,7 +7970,7 @@ msgstr ""
#: view:res.partner:0
#: field:res.partner,user_id:0
msgid "Salesperson"
msgstr ""
msgstr "営業担当者"
#. module: base
#: view:res.lang:0
@@ -8049,7 +8052,7 @@ msgstr "全ての x で繰り返す"
#. module: base
#: model:res.partner.bank.type,name:base.bank_normal
msgid "Normal Bank Account"
msgstr "通常の銀行口座"
msgstr "普通口座"
#. module: base
#: field:change.password.user,wizard_id:0
@@ -8118,7 +8121,7 @@ msgstr "フランス語(スイス)/ Français (CH)"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_13
msgid "Distributor"
msgstr ""
msgstr "代理店"
#. module: base
#: help:ir.actions.server,subject:0
@@ -8274,7 +8277,7 @@ msgstr ""
#. module: base
#: field:res.partner.category,parent_id:0
msgid "Parent Category"
msgstr "親分類"
msgstr "親カテゴリ"
#. module: base
#: model:res.country,name:base.fi
@@ -8448,7 +8451,7 @@ msgstr "香港"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_sale
msgid "Portal Sale"
msgstr ""
msgstr "販売ポータル"
#. module: base
#: field:ir.default,ref_id:0
@@ -8647,7 +8650,7 @@ msgstr ""
#: model:ir.module.module,shortdesc:base.module_hr_attendance
#: model:res.groups,name:base.group_hr_attendance
msgid "Attendances"
msgstr "参加"
msgstr "勤怠"
#. module: base
#: model:ir.module.module,shortdesc:base.module_warning
@@ -8717,7 +8720,7 @@ msgstr ""
#. module: base
#: model:ir.ui.menu,name:base.menu_view_base_module_update
msgid "Update Modules List"
msgstr "モジュールリストの更新"
msgstr "モジュールリスト更新"
#. module: base
#: code:addons/base/module/module.py:359
@@ -8783,7 +8786,7 @@ msgstr "スロベニア語 / slovenščina"
#. module: base
#: field:res.currency,position:0
msgid "Symbol Position"
msgstr ""
msgstr "記号位置"
#. module: base
#: model:ir.module.module,description:base.module_l10n_de
@@ -8896,7 +8899,7 @@ msgstr "複数のアクション"
#. module: base
#: model:ir.module.module,summary:base.module_mail
msgid "Discussions, Mailing Lists, News"
msgstr ""
msgstr "ディスカッション、メーリングリスト、ニュース"
#. module: base
#: model:ir.module.module,description:base.module_fleet
@@ -8997,7 +9000,7 @@ msgstr "ユーザエラー"
#. module: base
#: model:ir.module.module,summary:base.module_project_issue
msgid "Support, Bug Tracker, Helpdesk"
msgstr ""
msgstr "サポート、バグ追跡、ヘルプデスク"
#. module: base
#: model:res.country,name:base.ae
@@ -9022,12 +9025,12 @@ msgstr "このドキュメントはデフォルト属性として使用されて
#. module: base
#: model:res.partner.category,name:base.res_partner_category_5
msgid "Silver"
msgstr ""
msgstr "シルバー"
#. module: base
#: field:res.partner.title,shortcut:0
msgid "Abbreviation"
msgstr ""
msgstr "略称"
#. module: base
#: model:ir.ui.menu,name:base.menu_crm_case_job_req_main
@@ -9313,7 +9316,7 @@ msgstr "なし"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_holidays
msgid "Leave Management"
msgstr ""
msgstr "休暇管理"
#. module: base
#: model:res.company,overdue_msg:base.main_company
@@ -9412,12 +9415,12 @@ msgstr ""
#. module: base
#: field:res.request,ref_partner_id:0
msgid "Partner Ref."
msgstr "パートナの参照"
msgstr "取引先参照"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_expense
msgid "Expense Management"
msgstr ""
msgstr "経費管理"
#. module: base
#: field:ir.attachment,create_date:0
@@ -9727,7 +9730,7 @@ msgstr "カスタム"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_margin
msgid "Margins in Sales Orders"
msgstr "受注オーダーのマージン"
msgstr "受注マージン"
#. module: base
#: model:ir.module.module,shortdesc:base.module_purchase
@@ -9997,7 +10000,7 @@ msgstr "インストールする"
#: model:ir.module.module,shortdesc:base.module_base
#: field:res.currency,base:0
msgid "Base"
msgstr "ベース"
msgstr "基本"
#. module: base
#: field:ir.model.data,model:0
@@ -10185,7 +10188,7 @@ msgstr "間隔の単位"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_stock
msgid "Portal Stock"
msgstr ""
msgstr "在庫ポータル"
#. module: base
#: field:workflow.activity,kind:0
@@ -10251,7 +10254,7 @@ msgstr "データベース内の目的レコードのID"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_analytic_analysis
msgid "Contracts Management"
msgstr "コンタクト管理"
msgstr "契約管理"
#. module: base
#: selection:base.language.install,lang:0
@@ -10478,7 +10481,7 @@ msgstr "この会社に関連した銀行口座"
#: model:ir.ui.menu,name:base.menu_sales
#: model:ir.ui.menu,name:base.next_id_64
msgid "Sales"
msgstr "受注"
msgstr "販売"
#. module: base
#: field:ir.actions.server,child_ids:0
@@ -10555,7 +10558,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_hr_employees
msgid "Portal HR employees"
msgstr ""
msgstr "従業員ポータル"
#. module: base
#: selection:base.language.install,lang:0
@@ -10814,7 +10817,7 @@ msgstr "ユーザ自身がダッシュボードビュー(Webクライアント
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_stock
msgid "Sales and Warehouse Management"
msgstr ""
msgstr "販売・倉庫管理"
#. module: base
#: model:ir.module.module,description:base.module_hr_recruitment
@@ -11049,7 +11052,7 @@ msgstr "Eメール"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_12
msgid "Office Supplies"
msgstr ""
msgstr "オフィス用品"
#. module: base
#: field:ir.attachment,res_model:0
@@ -11158,7 +11161,7 @@ msgstr "カスケード"
#. module: base
#: model:ir.module.module,summary:base.module_crm
msgid "Leads, Opportunities, Phone Calls"
msgstr ""
msgstr "リード、案件、電話"
#. module: base
#: model:ir.module.category,description:base.module_category_knowledge_management
@@ -11221,7 +11224,7 @@ msgstr "マーケティングキャンペーン"
#. module: base
#: field:res.country.state,name:0
msgid "State Name"
msgstr "状態の名前"
msgstr "州名"
#. module: base
#: help:ir.attachment,type:0
@@ -11820,7 +11823,7 @@ msgstr "トリガーのシグナル"
#: model:ir.actions.act_window,name:base.action_country_state
#: model:ir.ui.menu,name:base.menu_country_state_partner
msgid "Fed. States"
msgstr "連邦"
msgstr "州"
#. module: base
#: view:ir.model:0
@@ -12021,7 +12024,7 @@ msgstr "ループ式"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_16
msgid "Retailer"
msgstr ""
msgstr "小売業"
#. module: base
#: view:ir.model.fields:0
@@ -12052,7 +12055,7 @@ msgstr "リファレンスガイド"
#: selection:res.partner.title,domain:0
#: model:res.request.link,name:base.req_link_partner
msgid "Partner"
msgstr "パートナ"
msgstr "取引先"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:482
@@ -12309,7 +12312,7 @@ msgstr "条件"
#. module: base
#: model:ir.actions.act_window,name:base.action_partner_other_form
msgid "Other Partners"
msgstr "その他のパートナ"
msgstr "他の取引先"
#. module: base
#: field:base.language.install,state:0
@@ -12324,7 +12327,7 @@ msgstr "その他のパートナ"
#: view:workflow.workitem:0
#: field:workflow.workitem,state:0
msgid "Status"
msgstr ""
msgstr "ステータス"
#. module: base
#: model:ir.actions.act_window,name:base.action_currency_form
@@ -12336,7 +12339,7 @@ msgstr "通貨"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_8
msgid "Consultancy Services"
msgstr ""
msgstr "コンサルティングサービス"
#. module: base
#: help:ir.values,value:0
@@ -12446,7 +12449,7 @@ msgstr "調達"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_6
msgid "Bronze"
msgstr ""
msgstr "ブロンズ"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_payroll_account
@@ -12476,7 +12479,7 @@ msgstr "作成月"
#. module: base
#: field:ir.module.module,demo:0
msgid "Demo Data"
msgstr ""
msgstr "デモデータ"
#. module: base
#: model:res.partner.title,shortcut:base.res_partner_title_mister
@@ -12491,7 +12494,7 @@ msgstr "モルディブ"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_crm
msgid "Portal CRM"
msgstr ""
msgstr "CRMポータル"
#. module: base
#: model:ir.ui.menu,name:base.next_id_4
@@ -12633,7 +12636,7 @@ msgstr "銀行"
#: 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 "POS"
#. module: base
#: model:ir.module.module,description:base.module_mail
@@ -12988,7 +12991,7 @@ msgstr "設定"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_9
msgid "Components Buyer"
msgstr ""
msgstr "部材バイヤー"
#. module: base
#: model:ir.module.module,description:base.module_web_tests_demo
@@ -13052,7 +13055,7 @@ msgstr "選択オプションの式は[('key','Label'), ...] の形式である
#. module: base
#: field:res.company,company_registry:0
msgid "Company Registry"
msgstr "会社のレジストリ"
msgstr "会社レジストリ"
#. module: base
#: view:ir.actions.report.xml:0
@@ -13240,7 +13243,7 @@ msgstr "不明"
#. module: base
#: field:res.currency,symbol:0
msgid "Symbol"
msgstr "シンボル"
msgstr "記号"
#. module: base
#: help:res.partner,image_medium:0
@@ -13356,7 +13359,7 @@ msgstr "依存関係:"
#. module: base
#: field:res.company,vat:0
msgid "Tax ID"
msgstr "税金ID"
msgstr "税ID"
#. module: base
#: model:ir.module.module,shortdesc:base.module_account_bank_statement_extensions
@@ -13391,7 +13394,7 @@ msgstr "ザイール"
#. module: base
#: model:ir.module.module,summary:base.module_project
msgid "Projects, Tasks"
msgstr ""
msgstr "プロジェクト、タスク"
#. module: base
#: field:ir.attachment,res_id:0
@@ -13446,7 +13449,7 @@ msgstr "右括弧"
#. module: base
#: view:base.module.update:0
msgid "Update Module List"
msgstr "モジュールリストの更新"
msgstr "モジュールリスト更新"
#. module: base
#: code:addons/base/res/res_users.py:685
@@ -13701,7 +13704,7 @@ msgstr "宛先の活動"
#. module: base
#: model:ir.module.module,shortdesc:base.module_project_issue
msgid "Issue Tracker"
msgstr ""
msgstr "課題管理"
#. module: base
#: view:base.module.update:0
@@ -13785,7 +13788,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Supplier Partners"
msgstr "仕入先パートナ"
msgstr "仕入先取引先"
#. module: base
#: view:res.config.installer:0
@@ -13800,7 +13803,7 @@ msgstr ""
#. module: base
#: view:res.partner:0
msgid "Customer Partners"
msgstr "顧客パートナ"
msgstr "顧客取引先"
#. module: base
#: sql_constraint:res.users:0
@@ -14047,7 +14050,7 @@ msgstr "ルクセンブルク"
#. module: base
#: model:ir.module.module,summary:base.module_base_calendar
msgid "Personal & Shared Calendar"
msgstr ""
msgstr "個人および共有カレンダ"
#. module: base
#: selection:res.request,priority:0
@@ -14161,7 +14164,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_account_voucher
msgid "Send Invoices and Track Payments"
msgstr ""
msgstr "請求書送付、支払追跡"
#. module: base
#: model:ir.ui.menu,name:base.menu_crm_config_lead
@@ -14359,7 +14362,7 @@ msgstr "アクションの用途"
#. module: base
#: field:ir.module.module,name:0
msgid "Technical Name"
msgstr ""
msgstr "技術名称"
#. module: base
#: model:ir.model,name:base.model_workflow_workitem
@@ -14940,7 +14943,7 @@ msgstr "国"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_15
msgid "Wholesaler"
msgstr ""
msgstr "卸売業"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_vat
@@ -15043,7 +15046,7 @@ msgstr "リネームは一度に1カラムしかできません。"
#. module: base
#: selection:ir.translation,type:0
msgid "Report/Template"
msgstr "レポート / テンプレート"
msgstr "レポート/テンプレート"
#. module: base
#: model:ir.module.module,description:base.module_account_budget
@@ -15254,7 +15257,7 @@ msgstr "クロアチア"
msgid ""
"Do you confirm the uninstallation of this module? This will permanently "
"erase all data currently stored by the module!"
msgstr ""
msgstr "このモジュールを本当にアンインストールしてよいですか?このアクションにより、このモジュール依存のデータが全て消失します。"
#. module: base
#: field:ir.actions.server,mobile:0
@@ -15267,7 +15270,7 @@ msgstr "携帯電話番号"
#: model:ir.model,name:base.model_res_partner_category
#: view:res.partner.category:0
msgid "Partner Categories"
msgstr "パートナ分類"
msgstr "取引先カテゴリ"
#. module: base
#: view:base.module.upgrade:0
@@ -15298,7 +15301,7 @@ msgstr "セーシェル"
#. module: base
#: model:res.partner.category,name:base.res_partner_category_4
msgid "Gold"
msgstr ""
msgstr "ゴールド"
#. module: base
#: code:addons/base/res/res_company.py:173
@@ -15379,7 +15382,7 @@ msgstr ""
#. module: base
#: field:res.partner.bank,partner_id:0
msgid "Account Owner"
msgstr "アカウント所有者"
msgstr "口座所有者"
#. module: base
#: model:ir.module.module,description:base.module_procurement
@@ -15501,7 +15504,7 @@ msgstr "ワークフローインスタンス"
#: code:addons/base/res/res_partner.py:684
#, python-format
msgid "Partners: "
msgstr "パートナ: "
msgstr "取引先: "
#. module: base
#: view:res.partner:0
@@ -15538,7 +15541,7 @@ msgstr "コンテキスト"
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale_mrp
msgid "Sales and MRP Management"
msgstr "受注とMRP管理"
msgstr "販売・MRP管理"
#. module: base
#: model:ir.actions.act_window,help:base.action_partner_form
@@ -15556,7 +15559,7 @@ msgstr ""
#. module: base
#: model:res.partner.category,name:base.res_partner_category_2
msgid "Prospect"
msgstr "見込み客"
msgstr "見込客"
#. module: base
#: model:ir.module.module,shortdesc:base.module_stock_invoice_directly
@@ -15611,7 +15614,7 @@ msgstr "ロシア語 / русский язык"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_signup
msgid "Signup"
msgstr ""
msgstr "サインアップ"
#~ msgid "Code (eg:en__US)"
#~ msgstr "コード(例:en_US)"
+2 -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-10-11 04:40+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:32+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:34+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:42+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:35+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:35+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:35+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:35+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+89 -6
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-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:35+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -12022,6 +12022,31 @@ msgid ""
" Reporting / Accounting / **Follow-ups Analysis\n"
"\n"
msgstr ""
"\n"
"Төлөгдөөгүй нэхэмжлэлүүдэд олон шаттай дуудлаг хийх, захиадал явуулах ажлыг "
"автоматжуулах модуль.\n"
"=========================================================================\n"
"\n"
"Дараах менюгээр олон шатлалтай дуудлагуудыг тодорхойлж болно:\n"
"---------------------------------------------------------------\n"
" Тохиргоо / Мөшгөлтийн Түвшин\n"
" \n"
"Нэгэнт тодорхойлсон бол дараах менюгээр орж дуудлагуудын автоматаар тогтмол "
"хэвлэж болно:\n"
"-----------------------------------------------------------------------------"
"-------------------------\n"
" Төлбөрийн Мөшгөлт / Имэйл болон захидал илгээх\n"
"\n"
"Энэ нь PDF үүсгэх / имэйл илгээх / гар үйлдлүүдийг олон шатлалтай дуудлага "
"дээр үндэслэн үүсгэдэг. \n"
"Ялгаатай компаниудад ялгаатай бодлогыг тодорхойлж болно. \n"
"\n"
"Хэрэв тухайлсан харилцагч/дансны бичилт дээр мөшгөлтийг шалгахыг хүсвэл "
"дараах менюгээр хийх боломжтой:\n"
"-----------------------------------------------------------------------------"
"-------------------------------------\n"
" Тайлан / Санхүү / **Мөшгөлтийн шинжилгээ\n"
"\n"
#. module: base
#: code:addons/base/ir/ir_model.py:735
@@ -12196,6 +12221,20 @@ msgid ""
"You can define the different phases of interviews and easily rate the "
"applicant from the kanban view.\n"
msgstr ""
"\n"
"Ажлын байр, ажилтан авах процессийг удирдана\n"
"================================================\n"
"\n"
"Энэ модуль нь ажлыг хөтлөх, амралтыг хөтлөх, өргөдөл болон ярилцлагыг хөтлөх "
"зэрэг ажлыг хялбараар хийх боломжийг олгодог...\n"
"\n"
"Энэ нь имэйл үүдтэй уялддаг бөгөөд <jobs@yourcompany.com> гэсэн хаяг руу "
"ирсэн имэйлээс өргөдлүүдийг татан авдаг. Мөн баримтын модультай уялдсан "
"байдаг бөгөөд файлаар ирсэн CV-үүдийг хадгалж дараа хайлт хийх боломжийг "
"бүрдүүлдэг. Үүнтэй төстэйгээр Санал асуулга модультай уялдаж ярилцлагыг "
"хөтлөдөг. \n"
"Ярилцлагын ялгаатай шатуудыг тодорхойлж эдгээртээ үнэлгээ өгөх зэрэг ажлыг "
"канбан харагдацаас хялбараар хийж болдог.\n"
#. module: base
#: field:ir.model.fields,model:0
@@ -12242,7 +12281,7 @@ msgstr ""
#. module: base
#: help:res.partner,ean13:0
msgid "BarCode"
msgstr ""
msgstr "Зураасан код"
#. module: base
#: help:ir.model.fields,model_id:0
@@ -12423,7 +12462,7 @@ msgstr "Оффисын Хангамжууд"
#. module: base
#: field:ir.attachment,res_model:0
msgid "Resource Model"
msgstr "Нөөцийн модел"
msgstr "Нөөц модел"
#. module: base
#: code:addons/custom.py:555
@@ -12721,6 +12760,9 @@ msgid ""
"Allow users to sign up through OAuth2 Provider.\n"
"===============================================\n"
msgstr ""
"\n"
"OAuth2-р хэрэглэгчид бүртгүүлэх, нэвтрэх боломжийг олгодог.\n"
"===============================================\n"
#. module: base
#: field:change.password.user,user_id:0
@@ -12744,7 +12786,7 @@ msgstr "Пуэрто Рико"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_tests_demo
msgid "Demonstration of web/javascript tests"
msgstr ""
msgstr "Веб/javascript тестийн жишээ, үзүүлэн"
#. module: base
#: field:workflow.transition,signal:0
@@ -13076,6 +13118,13 @@ msgid ""
"\n"
"The decimal precision is configured per company.\n"
msgstr ""
"\n"
"Үнийн нарийвчлалыг тохируулахыг олон зорилгоор ашиглаж болно: санхүү, "
"борлуулалт, худалдан авалт\n"
"============================================================================="
"====================\n"
"\n"
"Аравны нарийвчлал нь компанийн хүрээнд хийгдэнэ.\n"
#. module: base
#: selection:res.company,paper_format:0
@@ -13175,6 +13224,9 @@ msgid ""
"(if you delete a native ACL, it will be re-created when you reload the "
"module."
msgstr ""
"Идэвхтэй талбарыг сонгоогүй тохиолдолд ACL-г устгалгүйгээр идэвхгүй болгоно. "
"(Анхны эх ACL-г устгасан байлаа ч модулийг ахин ачаалахад дахин шинээр "
"үүсдэг)"
#. module: base
#: model:ir.model,name:base.model_ir_fields_converter
@@ -13230,6 +13282,17 @@ msgid ""
"into mail.message with attachments.\n"
" "
msgstr ""
"\n"
"Энэ модуль нь Outlook Залгаасыг өгдөг.\n"
"=========================================\n"
"\n"
"Outlook залгаас нь MS Outlook дотороосоо имэйлдээ OpenERP обьекуудтыг \n"
"сонгох хавсаргах боломжийг олгодог. Харилцагч, даалгавар, төсөл, "
"шинжилгээний данс \n"
"гэх мэт дуртай обьектоо сонгож имэйлдээ оруулж mail.message обьектот "
"хавсралтын хамт\n"
"архивладаг.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_bo
@@ -17186,6 +17249,15 @@ msgid ""
" </p>\n"
" "
msgstr ""
"<p class=\"oe_view_nocontent_create\">\n"
" Хаягийн дэвтэртэй холбогч нэмэхээр бол дарна.\n"
" </p><p>\n"
" OpenERP нь захиалагчтай холбоотой бүх үйл ажиллагааг хялбар "
"хөтлөдөг, үүнд: \n"
" захиалагчтай харилцсан харилцаа, бизнес боломжийн түүх, "
"баримтууд гэх мэт.\n"
" </p>\n"
" "
#. module: base
#: model:res.partner.category,name:base.res_partner_category_2
@@ -17228,6 +17300,17 @@ msgid ""
"on a supplier purchase order into several accounts and analytic plans.\n"
" "
msgstr ""
"\n"
"Шинжилгээний тархалт болон худалдан авалтын захиалгын менежментийг хийх "
"суурь модуль.\n"
"====================================================================\n"
"\n"
"Шинжилгээний хэд хэдэн төлөвлөгөөг үүсгэх боломжийг хэрэглэгчид олгодог. Энэ "
"нь нийлүүлэгчийн\n"
"худалдан авалтын захиалгын нэг мөр дээр олон данс болон шинжилгээний "
"төлөвлөгөөг сонгож, хуваах \n"
"боломжийг олгодог.\n"
" "
#. module: base
#: model:res.country,name:base.lk
@@ -17247,7 +17330,7 @@ msgstr "Орос хэл / русский язык"
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_signup
msgid "Signup"
msgstr ""
msgstr "Бүртгүүлэх"
#, python-format
#~ msgid "new"
+2 -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-10-11 04:43+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:35+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+117 -79
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-10-11 04:39+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:32+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -58,7 +58,7 @@ msgstr ""
#: field:ir.ui.view,arch:0
#: field:ir.ui.view.custom,arch:0
msgid "View Architecture"
msgstr "Opbouw weergave"
msgstr "Hiërarchie bekijken"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
@@ -78,7 +78,7 @@ msgstr "Hongaars / Magyar"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (PY) / Español (PY)"
msgstr "Spaans (PY) / Spanja (PY)"
msgstr "Spaans (PY) / Español (PY)"
#. module: base
#: model:ir.module.category,description:base.module_category_project_management
@@ -153,11 +153,12 @@ msgid ""
msgstr ""
"\n"
"Deze module voegt een Google gebruiker toe in res.user\n"
"======================================================\n"
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr "Vink dit aan als deze gebruiker een werknemer is"
msgstr "Vink dit aan als deze gebruiker een werknemer is."
#. module: base
#: help:ir.model.fields,domain:0
@@ -210,13 +211,14 @@ msgid ""
"reports."
msgstr ""
"\n"
"Genereer je facturen vanuit uitgaven, tijdsregistraties.\n"
"Genereer uw facturen vanuit uitgaven, tijdsregistraties.\n"
" ========================================================\n"
" \n"
"Module voor het genereren van facturen op basis van uitgaven (Personen, "
"uitgaven, enz).\n"
"Module voor het genereren van facturen op basis van kosten (Personen, "
"uitgaven, ...).\n"
" \n"
"Je kunt prijslijsten definieren in een grootboek rapportage."
"U kunt prijslijsten definieren in een grootboek rapportage, maak enkele "
"theoretische omzet rapportages."
#. module: base
#: code:addons/base/ir/ir_sequence.py:134
@@ -252,7 +254,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 "Hiernoenen sparse field \"%s\" is niet toegestaan"
msgstr "Hernoenen sparse veld \"%s\" is niet toegestaan"
#. module: base
#: model:res.country,name:base.sz
@@ -319,7 +321,7 @@ msgid ""
"any."
msgstr ""
"De interne gebruiker die verantwoordelijk is voor de communicatie met deze "
"contactpersoon indien aanwezig."
"contactpersoon indien van toepassing."
#. module: base
#: view:res.partner:0
@@ -491,9 +493,9 @@ msgid ""
"Invalid date/time format directive specified. Please refer to the list of "
"allowed directives, displayed when you edit a language."
msgstr ""
"Ongeldige datum / tijd-formaat richtlijn gespecificeerd. Raadpleeg de lijst "
"met toegestane richtlijnen welke worden weergegeven wanneer u bewerken van "
"een taal."
"Ongeldige datum/tijd-formaat richtlijn gespecificeerd. Raadpleeg de lijst "
"met toegestane richtlijnen welke worden weergegeven wanneer u een taal "
"bewerkt."
#. module: base
#: code:addons/orm.py:4153
@@ -502,7 +504,7 @@ msgid ""
"One of the records you are trying to modify has already been deleted "
"(Document type: %s)."
msgstr ""
"Een van de records die u probeert te wijzigen is al verwijderd )document "
"Een van de records die u probeert te wijzigen is al verwijderd (Document "
"type: %s)."
#. module: base
@@ -541,12 +543,12 @@ msgstr "Volgende assistent"
#. module: base
#: field:res.lang,date_format:0
msgid "Date Format"
msgstr "Datumopmaak"
msgstr "Datumnotatie"
#. module: base
#: model:ir.module.module,shortdesc:base.module_base_report_designer
msgid "OpenOffice Report Designer"
msgstr "OpenOffice overzicht ontwerper"
msgstr "OpenOffice Rapport Ontwerper"
#. module: base
#: model:res.country,name:base.an
@@ -667,7 +669,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (VE) / Español (VE)"
msgstr "Spaans (VE) / Spanje (VE)"
msgstr "Spaans (VE) / Español (VE)"
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_timesheet_invoice
@@ -883,7 +885,7 @@ msgstr "De naam van het bedrijf moet uniek zijn!"
#. module: base
#: model:ir.ui.menu,name:base.menu_base_action_rule_admin
msgid "Automated Actions"
msgstr "Automatische acties"
msgstr "Geautomatiseerde acties"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_ro
@@ -1006,7 +1008,7 @@ msgstr "base.language.export"
#. module: base
#: model:res.country,name:base.pg
msgid "Papua New Guinea"
msgstr "Papua Nieuw-Guinea"
msgstr "Papoea-Nieuw-Guinea"
#. module: base
#: help:ir.actions.report.xml,report_type:0
@@ -1344,7 +1346,7 @@ msgstr "Nieuwste versie"
#. module: base
#: view:ir.rule:0
msgid "Delete Access Right"
msgstr "Tegangsrechten verwijderen."
msgstr "Toegangsrechten verwijderen"
#. module: base
#: code:addons/base/ir/ir_mail_server.py:214
@@ -1452,7 +1454,7 @@ msgstr "Veld assistent"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (GT) / Español (GT)"
msgstr "Spaans (GT) / Spanje (GT)"
msgstr "Spaans (GT) / Español (GT)"
#. module: base
#: field:ir.mail_server,smtp_port:0
@@ -1483,7 +1485,7 @@ msgid ""
"decimal number [00,53]. All days in a new year preceding the first Monday "
"are considered to be in week 0."
msgstr ""
"%W - Weeknummer van het jaar (Maandag als eerste dag van de maand) als "
"%W - Weeknummer van het jaar (Maandag als eerste dag van de week) als "
"decimaal getal [00,53]. Alle dagen in het nieuwe jaar voorafgaande aan de "
"eerste maandag vallen in week 0."
@@ -1646,13 +1648,13 @@ msgid ""
" "
msgstr ""
"\n"
"Deze module installaeert de basis voor IBAN (International Bank Account "
"Number) bank rekeningen controleert op geldigheid.\n"
"Deze module installeert de basis voor IBAN (International Bank Account "
"Number) bankrekeningen en controleert deze op geldigheid.\n"
"============================================================================="
"========================\n"
"=====================================\n"
"\n"
"De mogelijkheid om correcte local rekeningen op te halen uit een IBAN "
"rekening met een een enkele opdacht.\n"
"De mogelijkheid om correcte normale rekeningnummers te halen uit een IBAN "
"rekeningnummer met een een enkele opdacht.\n"
" "
#. module: base
@@ -1675,6 +1677,12 @@ msgid ""
"=============\n"
" "
msgstr ""
"\n"
"Deze module voegt claim menu en features aan uw portaal toe indien claim en "
"portal zijn geïnstalleerd.\n"
"============================================================================="
"=========================\n"
" "
#. module: base
#: model:ir.actions.act_window,help:base.action_res_partner_bank_account_form
@@ -1812,8 +1820,8 @@ msgid ""
"Helps you manage your purchase-related processes such as requests for "
"quotations, supplier invoices, etc..."
msgstr ""
"Helpt de inkoop-gerelateerde processen te beheren zoals inkoop "
"prijsaanvragen, inkoopfacturen, etc..."
"Helpt de inkoop-gerelateerde processen te beheren zoals aanvragen van "
"offertes, inkoopfacturen, etc..."
#. module: base
#: help:res.partner,website:0
@@ -1974,7 +1982,7 @@ msgstr ""
#. module: base
#: model:res.country,name:base.kg
msgid "Kyrgyz Republic (Kyrgyzstan)"
msgstr "Kyrgyzstan"
msgstr "Kirgizië"
#. module: base
#: model:ir.module.module,description:base.module_account_accountant
@@ -2008,8 +2016,7 @@ msgstr ""
#: code:addons/base/ir/ir_fields.py:164
#, python-format
msgid "Unknown value '%s' for boolean field '%%(field)s', assuming '%s'"
msgstr ""
"Onbekende waarde '%s' voor boolean veld'%%(field)s', ervan uitgaande dat '%s'"
msgstr "Onbekende waarde '%s' voor boolean veld '%%(field)s', neem '%s' aan"
#. module: base
#: model:res.country,name:base.nl
@@ -2045,12 +2052,12 @@ msgstr "Voertuig, lease, verzekeringen, kosten"
#: view:ir.model.access:0
#: field:ir.model.access,perm_read:0
msgid "Read Access"
msgstr "Lezen"
msgstr "Leesrechten"
#. module: base
#: help:ir.attachment,res_id:0
msgid "The record id this is attached to"
msgstr "Het record is waaraan dit is verbonden"
msgstr "Het record id waaraan dit is verbonden"
#. module: base
#: model:ir.module.module,description:base.module_share
@@ -2348,12 +2355,12 @@ msgstr "Spaans / Español"
#. module: base
#: selection:base.language.install,lang:0
msgid "Korean (KP) / 한국어 (KP)"
msgstr "Koreans (KP) / Korea (KP)"
msgstr "Koreaans (KP) / 한국어 (KP)"
#. module: base
#: model:res.country,name:base.ax
msgid "Åland Islands"
msgstr "Åland-eilanden"
msgstr "Ålandseilanden"
#. module: base
#: field:res.company,logo:0
@@ -2512,7 +2519,7 @@ msgstr "Groepen"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (CL) / Español (CL)"
msgstr "Spaans (CL) / Spanje (CL)"
msgstr "Spaans (CL) / Español (CL)"
#. module: base
#: model:res.country,name:base.bz
@@ -2532,6 +2539,10 @@ msgid ""
"=================================\n"
" "
msgstr ""
"\n"
"Anonieme gebruikers toegang geven tot uw Portaal.\n"
"=====================================================\n"
" "
#. module: base
#: model:res.country,name:base.ge
@@ -2750,7 +2761,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_auth_oauth_signup
msgid "Signup with OAuth2 Authentication"
msgstr "Inloggen met OAuth2 Authenticatie"
msgstr "Registreren met OAuth2 Authenticatie"
#. module: base
#: selection:ir.model,state:0
@@ -2804,6 +2815,10 @@ msgid ""
"==================================\n"
" "
msgstr ""
"\n"
"Verenigde Staten - Grootboekschema.\n"
"======================================\n"
" "
#. module: base
#: field:ir.actions.act_url,target:0
@@ -2962,6 +2977,9 @@ msgid ""
"Module to attach a google document to any model.\n"
"================================================\n"
msgstr ""
"\n"
"Module om een google document aan een model te koppelen.\n"
"============================================================\n"
#. module: base
#: code:addons/base/ir/ir_fields.py:333
@@ -3311,7 +3329,7 @@ msgstr "Norfolkeiland"
#. module: base
#: selection:base.language.install,lang:0
msgid "Korean (KR) / 한국어 (KR)"
msgstr "Koreans(KR) / Korea (KR)"
msgstr "Koreaans (KR) / 한국어 (KR)"
#. module: base
#: help:ir.model.fields,model:0
@@ -3429,7 +3447,7 @@ msgstr "Armenië"
#. module: base
#: model:ir.module.module,summary:base.module_hr_evaluation
msgid "Periodical Evaluations, Appraisals, Surveys"
msgstr "Periodieke evaluaties, beoordelingen en enquêtes,"
msgstr "Periodieke evaluaties, beoordelingen, enquêtes"
#. module: base
#: model:ir.actions.act_window,name:base.ir_property_form
@@ -3683,7 +3701,7 @@ msgstr "Personeels enquêtes"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (DO) / Español (DO)"
msgstr "Spaans (DO) / Spanje (DO)"
msgstr "Spaans (DO) / Español (DO)"
#. module: base
#: model:ir.model,name:base.model_workflow_activity
@@ -3717,7 +3735,7 @@ msgstr "Uruguay"
#. module: base
#: selection:base.language.install,lang:0
msgid "Finnish / Suomi"
msgstr "Fins / Finland"
msgstr "Fins / Suomi"
#. module: base
#: view:ir.config_parameter:0
@@ -3990,7 +4008,7 @@ msgstr "Recursiviteit ontdekt."
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_et
msgid "Ethiopia - Accounting"
msgstr "Boekhouding - Ethiopië"
msgstr "Ethiopië - Boekhouding"
#. module: base
#: code:addons/base/module/module.py:366
@@ -4541,7 +4559,7 @@ msgstr "Te starten actie"
#: field:ir.model.constraint,name:0
#: selection:ir.translation,type:0
msgid "Constraint"
msgstr "Begrenzing"
msgstr "Beperking"
#. module: base
#: selection:ir.values,key:0
@@ -4552,7 +4570,7 @@ msgstr "Standaard adres"
#. module: base
#: model:ir.module.module,summary:base.module_lunch
msgid "Lunch Order, Meal, Food"
msgstr "Lunch orders, maaltijden en voeding"
msgstr "Lunch orders, maaltijden, consumpties"
#. module: base
#: view:ir.model.fields:0
@@ -4721,7 +4739,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_project_timesheet
msgid "Bill Time on Tasks"
msgstr "Tijd of taken factureren"
msgstr "Tijd op taken factureren"
#. module: base
#: model:ir.module.category,name:base.module_category_marketing
@@ -4744,11 +4762,15 @@ msgid ""
"==========================\n"
"\n"
msgstr ""
"\n"
"OpenERP Web Kalender weergave.\n"
"==================================\n"
"\n"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (HN) / Español (HN)"
msgstr "Spaans (HN) / Spanje (HN)"
msgstr "Spaans (HN) / Español (HN)"
#. module: base
#: view:ir.sequence.type:0
@@ -4855,6 +4877,15 @@ msgid ""
" * Commitment Date\n"
" * Effective Date\n"
msgstr ""
"\n"
"Extra datum informatie toevoegen aan een verkooporder.\n"
"=====================================================\n"
"\n"
"U kunt de volgende extra datums toevoegen aan een verkooporder:\n"
"-----------------------------------------------------------------------\n"
" * Datum Verzoek\n"
" * Datum Toezegging\n"
" * Datum Uitvoering\n"
#. module: base
#: field:ir.actions.server,srcmodel_id:0
@@ -4920,7 +4951,7 @@ msgstr "Open een venster"
#. module: base
#: model:res.country,name:base.gq
msgid "Equatorial Guinea"
msgstr "Equatoriaal Guinea"
msgstr "Equatoriaal-Guinea"
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_api
@@ -5002,7 +5033,7 @@ msgstr "Stel in als te doen"
#. module: base
#: view:res.lang:0
msgid "%c - Appropriate date and time representation."
msgstr "%c - Passende weergave datum en tijd"
msgstr "%c - Passende datum en tijd weergave."
#. module: base
#: code:addons/base/res/res_config.py:420
@@ -5013,6 +5044,7 @@ msgid ""
"Click 'Continue' and enjoy your OpenERP experience..."
msgstr ""
"Uw database is nu volledig geconfigureerd.\n"
"\n"
"Klik op 'Doorgaan' en geniet van uw OpenERP beleving..."
#. module: base
@@ -5064,7 +5096,7 @@ msgstr "Rechten"
#. module: base
#: field:ir.mail_server,smtp_host:0
msgid "SMTP Server"
msgstr "SMTP-server"
msgstr "SMTP Server"
#. module: base
#: code:addons/base/module/module.py:320
@@ -5072,7 +5104,7 @@ msgstr "SMTP-server"
msgid "You try to remove a module that is installed or will be installed"
msgstr ""
"U probeert een module te verwijderen die geïnstalleerd is of nog moet worden "
"geïnstalleerd."
"geïnstalleerd"
#. module: base
#: view:base.module.upgrade:0
@@ -5082,7 +5114,7 @@ msgstr "De geselecteerde modules zijn bijgewerkt / geïnstalleerd !"
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (PR) / Español (PR)"
msgstr "Spaans (PR) / Spanja (PR)"
msgstr "Spaans (PR) / Español (PR)"
#. module: base
#: model:ir.module.module,description:base.module_crm_profiling
@@ -5137,7 +5169,7 @@ msgstr "Inkoop"
#. module: base
#: selection:base.language.install,lang:0
msgid "Portuguese (BR) / Português (BR)"
msgstr ""
msgstr "Portugees (BR) / Português (BR)"
#. module: base
#: model:ir.model,name:base.model_ir_needaction_mixin
@@ -5157,7 +5189,7 @@ msgstr "IT Services"
#. module: base
#: model:ir.module.category,name:base.module_category_specific_industry_applications
msgid "Specific Industry Applications"
msgstr "Specificeer industrie toepassingen"
msgstr "Specifieke industriële toepassingen"
#. module: base
#: model:ir.module.module,shortdesc:base.module_google_docs
@@ -5245,12 +5277,12 @@ msgstr "Kenia"
#: model:ir.actions.act_window,name:base.action_translation
#: model:ir.ui.menu,name:base.menu_action_translation
msgid "Translated Terms"
msgstr "Vertaalde regels"
msgstr "Vertaalde uitdrukkingen"
#. module: base
#: selection:base.language.install,lang:0
msgid "Abkhazian / аҧсуа"
msgstr "Abchazisch / Abchazië"
msgstr "Abchazisch / аҧсуа"
#. module: base
#: view:base.module.configuration:0
@@ -5301,7 +5333,7 @@ msgstr "Opslaan"
#. module: base
#: field:ir.actions.report.xml,report_xml:0
msgid "XML Path"
msgstr "XML Path"
msgstr "XML Pad"
#. module: base
#: model:res.country,name:base.bj
@@ -5401,14 +5433,14 @@ msgstr "Beveiliging"
#. module: base
#: selection:base.language.install,lang:0
msgid "Portuguese / Português"
msgstr ""
msgstr "Portugees / Português"
#. module: base
#: code:addons/base/ir/ir_model.py:372
#, python-format
msgid "Changing the storing system for field \"%s\" is not allowed."
msgstr ""
"Het veranderen van het opsla systeem voor veld \"%s\" is niet toegestaan."
"Het veranderen van het opslagsysteem voor veld \"%s\" is niet toegestaan."
#. module: base
#: help:res.partner.bank,company_id:0
@@ -5436,7 +5468,7 @@ msgstr "Geïnstalleerd"
#. module: base
#: selection:base.language.install,lang:0
msgid "Ukrainian / українська"
msgstr "Oekraïens / Oekraïne"
msgstr "Oekraïens / українська"
#. module: base
#: model:res.country,name:base.sn
@@ -5493,7 +5525,7 @@ msgstr "Expressie om aan te voldoen om de transitie te maken."
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (PA) / Español (PA)"
msgstr "Spaans (PA) / Spanja (PA)"
msgstr "Spaans (PA) / Español (PA)"
#. module: base
#: view:res.currency:0
@@ -5525,7 +5557,7 @@ msgstr "Ieder model moet uniek zijn!"
#: model:ir.module.category,name:base.module_category_localization
#: model:ir.ui.menu,name:base.menu_localisation
msgid "Localization"
msgstr "Vertalingen"
msgstr "Lokalisatie"
#. module: base
#: model:ir.module.module,description:base.module_web_api
@@ -5613,7 +5645,7 @@ msgstr "Relatie labels"
#. module: base
#: view:res.company:0
msgid "Preview Header/Footer"
msgstr "Bekijk kop/voet"
msgstr "Bekijk kop-/voettekst"
#. module: base
#: field:ir.ui.menu,parent_id:0
@@ -5624,7 +5656,7 @@ msgstr "Hoofdmenu"
#. module: base
#: field:res.partner.bank,owner_name:0
msgid "Account Owner Name"
msgstr "Naam eigenaar rekening"
msgstr "Naam rekeningeigenaar"
#. module: base
#: code:addons/base/ir/ir_model.py:420
@@ -5683,7 +5715,7 @@ msgstr "Filter Naam"
#: view:res.partner:0
#: field:res.request,history:0
msgid "History"
msgstr "Historie"
msgstr "Geschiedenis"
#. module: base
#: model:res.country,name:base.im
@@ -5704,12 +5736,12 @@ msgstr "De modulenaam moet uniek zijn !"
#. module: base
#: model:res.country,name:base.bv
msgid "Bouvet Island"
msgstr "Bouvet-eiland"
msgstr "Bouveteiland"
#. module: base
#: field:ir.model.constraint,type:0
msgid "Constraint Type"
msgstr "Constraint soort"
msgstr "Soort Beperking"
#. module: base
#: field:res.company,child_ids:0
@@ -5939,7 +5971,7 @@ msgstr "ir.actions.act_url"
#. module: base
#: model:ir.ui.menu,name:base.menu_translation_app
msgid "Application Terms"
msgstr "Applicatie-termen"
msgstr "Applicatie uitdrukkingen"
#. module: base
#: model:ir.actions.act_window,help:base.open_module_tree
@@ -5973,12 +6005,12 @@ msgstr "Engels (GB)"
#. module: base
#: selection:base.language.install,lang:0
msgid "Japanese / 日本語"
msgstr "Japans / Japan"
msgstr "Japans / 日本語"
#. module: base
#: model:ir.model,name:base.model_base_language_import
msgid "Language Import"
msgstr "Taal import"
msgstr "Taal Importeren"
#. module: base
#: help:workflow.transition,act_from:0
@@ -6090,7 +6122,7 @@ msgstr ""
#. module: base
#: view:ir.translation:0
msgid "Comments"
msgstr "Reacties"
msgstr "Opmerkingen"
#. module: base
#: model:res.country,name:base.et
@@ -6196,6 +6228,12 @@ msgid ""
"===============================================\n"
" "
msgstr ""
"\n"
"Gebruikers toestaan om te registreren en hun wachtwoord opnieuw in te "
"stellen\n"
"============================================================================="
"\n"
" "
#. module: base
#: model:ir.module.category,name:base.module_category_usability
@@ -6278,7 +6316,7 @@ msgstr ""
#. module: base
#: selection:base.language.install,lang:0
msgid "Spanish (BO) / Español (BO)"
msgstr "Spaans (BO) / Spaans (BO)"
msgstr "Spaans (BO) / Español (BO)"
#. module: base
#: model:ir.module.module,description:base.module_board
@@ -6300,7 +6338,7 @@ msgstr "Overzicht toegangscontrole"
#. module: base
#: model:res.country,name:base.um
msgid "USA Minor Outlying Islands"
msgstr "VS Kleine Buitengaatse Eilanden"
msgstr "Kleine afgelegen eilanden van de Verenigde Staten"
#. module: base
#: help:ir.cron,numbercall:0
@@ -6342,7 +6380,7 @@ msgstr "Initiële datum"
#. module: base
#: selection:base.language.install,lang:0
msgid "Gujarati / ગુજરાતી"
msgstr "Gujarati / India"
msgstr "Gujarati / ગુજરાતી"
#. module: base
#: code:addons/base/module/module.py:361
@@ -6356,7 +6394,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_be_hr_payroll
msgid "Belgium - Payroll"
msgstr "Loonadministratie - België"
msgstr "België - Loonadministratie"
#. module: base
#: view:workflow.activity:0
@@ -6741,7 +6779,7 @@ msgstr "Prijs nauwkeurigheid"
#. module: base
#: selection:base.language.install,lang:0
msgid "Latvian / latviešu valoda"
msgstr "Lets / Letland"
msgstr "Lets / latviešu valoda"
#. module: base
#: selection:base.language.install,lang:0
@@ -7004,7 +7042,7 @@ msgstr "Soms BIC of Swift genoemd."
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in
msgid "Indian - Accounting"
msgstr "Boekhouding - India"
msgstr "India - Boekhouding"
#. module: base
#: field:res.lang,time_format:0
@@ -15159,7 +15197,7 @@ msgstr "Limiet"
#. module: base
#: model:res.groups,name:base.group_hr_user
msgid "Officer"
msgstr "Manager"
msgstr "Functionaris"
#. module: base
#: code:addons/orm.py:787
+2 -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-10-11 04:47+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:40+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:36+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:36+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:39+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+3 -3
View File
@@ -8,13 +8,13 @@ msgstr ""
"Report-Msgid-Bugs-To: support@openerp.com\n"
"POT-Creation-Date: 2012-12-21 17:04+0000\n"
"PO-Revision-Date: 2013-01-05 18:18+0000\n"
"Last-Translator: ERPSystems.ro <mihai@erpsystems.ro>\n"
"Last-Translator: ERPSystems.ro <Unknown>\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-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:36+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+91 -5
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-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:36+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -307,6 +307,13 @@ msgid ""
"\n"
" "
msgstr ""
"\n"
"Чилийский бухгалтерский учет и налоги в соответствии с действующими "
"положениями\n"
"==============================================\n"
"Plan contable chileno e impuestos de acuerdo a disposiciones vigentes\n"
"\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_sale
@@ -429,6 +436,8 @@ msgid ""
"There is already a shared filter set as default for %(model)s, delete or "
"change it before setting a new default"
msgstr ""
"Уже существует общий фильтр по умолчанию для %(model)s, удалите или измените "
"его прежде чем устанавливать новый по умолчанию"
#. module: base
#: code:addons/orm.py:2649
@@ -597,6 +606,15 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"Модуль для определения объекта аналитического учета.\n"
"===============================================\n"
"\n"
"В OpenERP, аналитические счета связаны с общими счетами, но рассматриваются\n"
"полностью независимо. Таким образом, вы можете ввести различные "
"аналитические операции\n"
"которые не дублируются в общие финансовые счета.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
@@ -620,6 +638,19 @@ msgid ""
"* Use emails to automatically confirm and send acknowledgements for any "
"event registration\n"
msgstr ""
"\n"
"Организация и управление событиями.\n"
"======================================\n"
"\n"
"Модуль мероприятий позволяет Вам эффективно организовывать события и все "
"задачи связанные с: планификацией, регистрацией отслеживания,\n"
"посещаемостью, и т.д.\n"
"\n"
"Основные характеристики\n"
"------------\n"
"* Управление своими Мероприятиями и Регистрациями\n"
"* Использовать электронную почту для автоматического подтверждения и "
"отправлять подтверждения для регистрации любого события\n"
#. module: base
#: selection:base.language.install,lang:0
@@ -877,7 +908,7 @@ msgstr "Иордания"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_hr
msgid "Croatia - RRIF 2012 COA"
msgstr ""
msgstr "Хорватия - RRIF 2012 COA"
#. module: base
#: help:ir.cron,nextcall:0
@@ -2534,6 +2565,10 @@ msgid ""
"=================================\n"
" "
msgstr ""
"\n"
"Позволить неавторизованным пользователям доступ к Порталу.\n"
"=================================\n"
" "
#. module: base
#: model:res.country,name:base.ge
@@ -2918,6 +2953,40 @@ msgid ""
"* Monthly Turnover (Graph)\n"
" "
msgstr ""
"\n"
"Управление предложениями цен и заказами покупателей \n"
"==================================\n"
"\n"
"This application allows you to manage your sales goals in an effective and "
"efficient manner by keeping track of all sales orders and history.\n"
"\n"
"It handles the full sales workflow:\n"
"\n"
"* **Quotation** -> **Sales order** -> **Invoice**\n"
"\n"
"Preferences (only with Warehouse Management installed)\n"
"------------------------------------------------------\n"
"\n"
"If you also installed the Warehouse Management, you can deal with the "
"following preferences:\n"
"\n"
"* Shipping: Choice of delivery at once or partial delivery\n"
"* Invoicing: choose how invoices will be paid\n"
"* Incoterms: International Commercial terms\n"
"\n"
"You can choose flexible invoicing methods:\n"
"\n"
"* *On Demand*: Invoices are created manually from Sales Orders when needed\n"
"* *On Delivery Order*: Invoices are generated from picking (delivery)\n"
"* *Before Delivery*: A Draft invoice is created and must be paid before "
"delivery\n"
"\n"
"\n"
"The Dashboard for the Sales Manager will include\n"
"------------------------------------------------\n"
"* My Quotations\n"
"* Monthly Turnover (Graph)\n"
" "
#. module: base
#: field:ir.actions.act_window,res_id:0
@@ -3020,6 +3089,14 @@ msgid ""
"This module is currently not compatible with the ``user_ldap`` module and\n"
"will disable LDAP authentication completely if installed at the same time.\n"
msgstr ""
"\n"
"Зашифрованные пароли\n"
"==================\n"
"\n"
"Взаимодействие с LDAP - авторизацией\n"
"-------------------------------------\n"
"This module is currently not compatible with the ``user_ldap`` module and\n"
"will disable LDAP authentication completely if installed at the same time.\n"
#. module: base
#: model:res.groups,name:base.group_hr_manager
@@ -3205,6 +3282,15 @@ msgid ""
" * ``base_stage``: stage management\n"
" "
msgstr ""
"\n"
"Этот модуль обрабатывает состояния и стадии. Он является производным от "
"классов crm_base и crm_case для crm. \n"
"============================================================================="
"======================\n"
"\n"
" * ``base_state``: управление состояниями \n"
" * ``base_stage``: управление стадиями\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_web_linkedin
@@ -7907,7 +7993,7 @@ msgstr "Следующее число в этой нумерации"
#. module: base
#: view:res.partner:0
msgid "at"
msgstr ""
msgstr "в"
#. module: base
#: view:ir.rule:0
@@ -8744,7 +8830,7 @@ msgstr "Гонконг"
#. module: base
#: model:ir.module.module,shortdesc:base.module_portal_sale
msgid "Portal Sale"
msgstr ""
msgstr "Портал: продажи"
#. module: base
#: field:ir.default,ref_id:0
+2 -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-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:37+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:37+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:38+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:30+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:44+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:37+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:49+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:41+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+5 -5
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-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:37+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -59,7 +59,7 @@ msgstr "Visa arkitektur"
#. module: base
#: model:ir.module.module,summary:base.module_sale_stock
msgid "Quotation, Sale Orders, Delivery & Invoicing Control"
msgstr ""
msgstr "Offerter, säljordrar, leverans & faktura kontroll"
#. module: base
#: selection:ir.sequence,implementation:0
@@ -88,7 +88,7 @@ msgstr ""
#. module: base
#: model:ir.module.module,summary:base.module_point_of_sale
msgid "Touchscreen Interface for Shops"
msgstr ""
msgstr "Pekskärmsinterface för affärer"
#. module: base
#: model:ir.module.module,shortdesc:base.module_l10n_in_hr_payroll
@@ -139,7 +139,7 @@ msgstr ""
#. module: base
#: help:res.partner,employee:0
msgid "Check this box if this contact is an Employee."
msgstr ""
msgstr "Markera här om kontakten är en anställd"
#. module: base
#: help:ir.model.fields,domain:0
+2 -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-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:45+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:41+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -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-10-11 04:46+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:38+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+2 -2
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-10-11 04:48+0000\n"
"X-Generator: Launchpad (build 16799)\n"
"X-Launchpad-Export-Date: 2013-11-12 05:40+0000\n"
"X-Generator: Launchpad (build 16820)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
+1
View File
@@ -37,6 +37,7 @@ import ir_config_parameter
import osv_memory_autovacuum
import ir_mail_server
import ir_fields
import ir_http
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
+11 -5
View File
@@ -27,6 +27,7 @@ import re
from openerp import tools
from openerp.osv import fields,osv
from openerp import SUPERUSER_ID
_logger = logging.getLogger(__name__)
@@ -142,9 +143,10 @@ class ir_attachment(osv.osv):
if attach.store_fname:
self._file_delete(cr, uid, location, attach.store_fname)
fname = self._file_write(cr, uid, location, value)
super(ir_attachment, self).write(cr, uid, [id], {'store_fname': fname, 'file_size': file_size}, context=context)
# SUPERUSER_ID as probably don't have write access, trigger during create
super(ir_attachment, self).write(cr, SUPERUSER_ID, [id], {'store_fname': fname, 'file_size': file_size}, context=context)
else:
super(ir_attachment, self).write(cr, uid, [id], {'db_datas': value, 'file_size': file_size}, context=context)
super(ir_attachment, self).write(cr, SUPERUSER_ID, [id], {'db_datas': value, 'file_size': file_size}, context=context)
return True
_name = 'ir.attachment'
@@ -186,8 +188,6 @@ class ir_attachment(osv.osv):
In the 'document' module, it is overriden to relax this hard rule, since
more complex ones apply there.
"""
if not ids:
return
res_ids = {}
if ids:
if isinstance(ids, (int, long)):
@@ -261,10 +261,14 @@ class ir_attachment(osv.osv):
return len(result) if count else list(result)
def read(self, cr, uid, ids, fields_to_read=None, context=None, load='_classic_read'):
if isinstance(ids, (int, long)):
ids = [ids]
self.check(cr, uid, ids, 'read', context=context)
return super(ir_attachment, self).read(cr, uid, ids, fields_to_read, context, load)
def write(self, cr, uid, ids, vals, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
self.check(cr, uid, ids, 'write', context=context, values=vals)
if 'file_size' in vals:
del vals['file_size']
@@ -275,6 +279,8 @@ class ir_attachment(osv.osv):
return super(ir_attachment, self).copy(cr, uid, id, default, context)
def unlink(self, cr, uid, ids, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
self.check(cr, uid, ids, 'unlink', context=context)
location = self.pool.get('ir.config_parameter').get_param(cr, uid, 'ir_attachment.location')
if location:
@@ -284,7 +290,7 @@ class ir_attachment(osv.osv):
return super(ir_attachment, self).unlink(cr, uid, ids, context)
def create(self, cr, uid, values, context=None):
self.check(cr, uid, [], mode='create', context=context, values=values)
self.check(cr, uid, [], mode='write', context=context, values=values)
if 'file_size' in values:
del values['file_size']
return super(ir_attachment, self).create(cr, uid, values, context)
+1 -1
View File
@@ -184,7 +184,7 @@ class ir_fields_converter(orm.Model):
def _str_id(self, cr, uid, model, column, value, context=None):
return value, []
_str_to_char = _str_to_text = _str_to_binary = _str_id
_str_to_reference = _str_to_char = _str_to_text = _str_to_binary = _str_id
def _str_to_date(self, cr, uid, model, column, value, context=None):
try:
+144
View File
@@ -0,0 +1,144 @@
#----------------------------------------------------------
# ir_http modular http routing
#----------------------------------------------------------
import logging
import re
import werkzeug.exceptions
import werkzeug.routing
import openerp
from openerp import http
from openerp.http import request
from openerp.osv import osv, orm
_logger = logging.getLogger(__name__)
# FIXME: replace by proxy on request.uid?
_uid = object()
class ModelConverter(werkzeug.routing.BaseConverter):
def __init__(self, url_map, model=False):
super(ModelConverter, self).__init__(url_map)
self.model = model
self.regex = '([0-9]+)'
def to_python(self, value):
m = re.match(self.regex, value)
return request.registry[self.model].browse(
request.cr, _uid, int(m.group(1)), context=request.context)
def to_url(self, value):
return value.id
class ModelsConverter(werkzeug.routing.BaseConverter):
def __init__(self, url_map, model=False):
super(ModelsConverter, self).__init__(url_map)
self.model = model
# TODO add support for slug in the form [A-Za-z0-9-] bla-bla-89 -> id 89
self.regex = '([0-9,]+)'
def to_python(self, value):
# TODO:
# - raise routing.ValidationError() if no browse record can be createdm
# - support slug
return request.registry[self.model].browse(request.cr, _uid, [int(i) for i in value.split(',')], context=request.context)
def to_url(self, value):
return ",".join(i.id for i in value)
class ir_http(osv.AbstractModel):
_name = 'ir.http'
_description = "HTTP routing"
def _get_converters(self):
return {'model': ModelConverter, 'models': ModelsConverter}
def _find_handler(self):
return self.routing_map().bind_to_environ(request.httprequest.environ).match()
def _auth_method_user(self):
request.uid = request.session.uid
if not request.uid:
raise http.SessionExpiredException("Session expired")
def _auth_method_admin(self):
if not request.db:
raise http.SessionExpiredException("No valid database for request %s" % request.httprequest)
request.uid = openerp.SUPERUSER_ID
def _auth_method_none(self):
request.disable_db = True
request.uid = None
def _authenticate(self, func, arguments):
auth_method = getattr(func, "auth", "user")
if request.session.uid:
try:
request.session.check_security()
# what if error in security.check()
# -> res_users.check()
# -> res_users.check_credentials()
except http.SessionExpiredException:
request.session.logout()
raise http.SessionExpiredException("Session expired for request %s" % request.httprequest)
getattr(self, "_auth_method_%s" % auth_method)()
return auth_method
def _handle_404(self, exception):
raise exception
def _handle_403(self, exception):
raise exception
def _handle_500(self, exception):
raise exception
def _dispatch(self):
# locate the controller method
try:
func, arguments = self._find_handler()
except werkzeug.exceptions.NotFound, e:
return self._handle_404(e)
# check authentication level
try:
auth_method = self._authenticate(func, arguments)
except werkzeug.exceptions.NotFound, e:
return self._handle_403(e)
# post process arg to set uid on browse records
for arg in arguments.itervalues():
if isinstance(arg, orm.browse_record) and arg._uid is _uid:
arg._uid = request.uid
# set and execute handler
try:
request.set_handler(func, arguments, auth_method)
result = request.dispatch()
if isinstance(result, Exception):
raise result
except Exception, e:
fn = getattr(self, '_handle_%s' % getattr(e, 'code', 500),
self._handle_500)
return fn(e)
return result
def routing_map(self):
if not hasattr(self, '_routing_map'):
_logger.info("Generating routing map")
cr = request.cr
m = request.registry.get('ir.module.module')
ids = m.search(cr, openerp.SUPERUSER_ID, [('state', '=', 'installed'), ('name', '!=', 'web')], context=request.context)
installed = set(x['name'] for x in m.read(cr, 1, ids, ['name'], context=request.context))
mods = ['', "web"] + sorted(installed)
self._routing_map = http.routing_map(mods, False, converters=self._get_converters())
return self._routing_map
# vim:et:
+3
View File
@@ -198,6 +198,7 @@ class ir_model(osv.osv):
select=vals.get('select_level', '0'),
update_custom_fields=True)
self.pool[vals['model']]._auto_init(cr, ctx)
self.pool[vals['model']]._auto_end(cr, ctx) # actually create FKs!
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res
@@ -356,6 +357,7 @@ class ir_model_fields(osv.osv):
select=vals.get('select_level', '0'),
update_custom_fields=True)
self.pool[vals['model']]._auto_init(cr, ctx)
self.pool[vals['model']]._auto_end(cr, ctx) # actually create FKs!
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res
@@ -470,6 +472,7 @@ class ir_model_fields(osv.osv):
for col_name, col_prop, val in patch_struct[1]:
setattr(obj._columns[col_name], col_prop, val)
obj._auto_init(cr, ctx)
obj._auto_end(cr, ctx) # actually create FKs!
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
return res
+6 -6
View File
@@ -161,18 +161,18 @@ class ir_translation(osv.osv):
'''
if context is None:
context = {}
res = {}
res = dict.fromkeys(ids, False)
for record in self.browse(cr, uid, ids, context=context):
if record.type != 'model':
res[record.id] = record.src
else:
model_name, field = record.name.split(',')
model = self.pool.get(model_name)
#We need to take the context without the language information, because we want to read the
#value store in db and not on the one associate with current language.
context_wo_lang = context.copy()
context_wo_lang.pop('lang', None)
res[record.id] = model.read(cr, uid, record.res_id, [field], context=context_wo_lang)[field]
if model and model.exists(cr, uid, record.res_id, context=context):
# Pass context without lang, need to read real stored field, not translation
context_no_lang = dict(context, lang=None)
result = model.read(cr, uid, record.res_id, [field], context=context_no_lang)
res[record.id] = result[field] if result else False
return res
def _set_src(self, cr, uid, id, name, value, args, context=None):
@@ -34,6 +34,7 @@
<field name="lang"/>
</group>
<group>
<field name="module" group="base.group_no_one"/>
<field name="type"/>
<field name="res_id"/>
</group>
@@ -47,33 +47,8 @@ class base_module_import(osv.osv_memory):
}
def importzip(self, cr, uid, ids, context):
(data,) = self.browse(cr, uid, ids , context=context)
module_data = data.module_file
zip_data = base64.decodestring(module_data)
fp = StringIO()
fp.write(zip_data)
try:
file_data = zipfile.ZipFile(fp, 'r')
except zipfile.BadZipfile:
raise osv.except_osv(_('Error!'), _('File is not a zip file!'))
init_file_name = sorted(file_data.namelist())[0]
module_name = os.path.split(init_file_name)[0]
file_path = os.path.join(ADDONS_PATH, '%s.zip' % module_name)
try:
zip_file = open(file_path, 'wb')
except IOError:
raise osv.except_osv(_('Error!'),
_('Can not create the module file: %s!') % \
(file_path,) )
zip_file.write(zip_data)
zip_file.close()
self.pool.get('ir.module.module').update_list(cr, uid,
{'module_name': module_name,})
self.write(cr, uid, ids, {'state':'done', 'module_name': module_name},
context)
return False
#TODO: drop this model and the corresponding view/action in trunk
raise NotImplementedError('This feature is not available')
def action_module_open(self, cr, uid, ids, context):
(data,) = self.browse(cr, uid, ids , context=context)
+1 -4
View File
@@ -102,13 +102,10 @@ class res_config_configurable(osv.osv_memory):
res = next.action_launch(context=context)
res['nodestroy'] = False
return res
# reload the client; open the first available root menu
menu_obj = self.pool['ir.ui.menu']
menu_ids = menu_obj.search(cr, uid, [('parent_id', '=', False)], context=context)
return {
'type': 'ir.actions.client',
'tag': 'reload',
'params': {'menu_id': menu_ids and menu_ids[0] or False},
}
def start(self, cr, uid, ids, context=None):
+2 -2
View File
@@ -249,8 +249,8 @@ class res_currency_rate(osv.osv):
_description = "Currency Rate"
_columns = {
'name': fields.date('Date', required=True, select=True),
'rate': fields.float('Rate', digits=(12,6), help='The rate of the currency to the currency of rate 1'),
'name': fields.datetime('Date', required=True, select=True),
'rate': fields.float('Rate', digits=(12, 6), help='The rate of the currency to the currency of rate 1'),
'currency_id': fields.many2one('res.currency', 'Currency', readonly=True),
'currency_rate_type_id': fields.many2one('res.currency.rate.type', 'Currency Rate Type', help="Allow you to define your own currency rate types, like 'Average' or 'Year to Date'. Leave empty if you simply want to use the normal 'spot' rate type"),
}
+1 -1
View File
@@ -329,7 +329,7 @@
<field name="arch" type="xml">
<search string="Search Partner">
<field name="name"
filter_domain="['|','|',('name','ilike',self),('parent_id','ilike',self),('ref','=',self)]"/>
filter_domain="['|','|',('display_name','ilike',self),('ref','=',self),('email,'ilike',self)]"/>
<filter help="My Partners" icon="terp-personal+" domain="[('user_id','=',uid)]"/>
<separator/>
<filter string="Persons" name="type_person" domain="[('is_company','=',0)]"/>
-7
View File
@@ -171,13 +171,6 @@ class res_users(osv.osv):
def on_change_login(self, cr, uid, ids, login, context=None):
return {'value': {'email': login}}
def on_change_company_id(self, cr, uid, ids, company_id):
return {'warning' : {
'title': _("Company Switch Warning"),
'message': _("Please keep in mind that documents currently displayed may not be relevant after switching to another company. If you have unsaved changes, please make sure to save and close all forms before switching to a different company. (You can click on Cancel in the User Preferences now)"),
}
}
def onchange_state(self, cr, uid, ids, state_id, context=None):
partner_ids = [user.partner_id.id for user in self.browse(cr, uid, ids, context=context)]
return self.pool.get('res.partner').onchange_state(cr, uid, partner_ids, state_id, context=context)
+2 -2
View File
@@ -231,7 +231,7 @@
<field name="model">res.users</field>
<field name="arch" type="xml">
<search string="Users">
<field name="name" filter_domain="['|', ('name','ilike',self), ('login','ilike',self)]" string="User"/>
<field name="name" filter_domain="['|', '|', ('name','ilike',self), ('login','ilike',self), ('email,'ilike',self)]" string="User"/>
<field name="company_ids" string="Company" groups="base.group_multi_company"/>
</search>
</field>
@@ -283,7 +283,7 @@
<field name="lang" readonly="0"/>
<field name="tz" readonly="0"/>
<field name="company_id" widget="selection" readonly="0"
groups="base.group_multi_company" on_change="on_change_company_id(company_id)"/>
groups="base.group_multi_company"/>
</group>
<group string="Email Preferences">
<field name="email" widget="email" readonly="0"/>
+5
View File
@@ -168,6 +168,11 @@ def main(args):
import_translation()
sys.exit(0)
# This needs to be done now to ensure the use of the multiprocessing
# signaling mecanism for registries loaded with -d
if config['workers']:
openerp.multi_process = True
# preload registryies, needed for -u --stop_after_init
rc = 0
if config['db_name']:
+1050 -28
View File
File diff suppressed because it is too large Load Diff
+5 -3
View File
@@ -166,11 +166,15 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
# upgrading the module information
modobj.write(cr, SUPERUSER_ID, [module_id], modobj.get_values_from_terp(package.data))
_load_data(cr, module_name, idref, mode, kind='data')
if hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed'):
has_demo = hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed')
if has_demo:
status['progress'] = (index + 0.75) / len(graph)
_load_data(cr, module_name, idref, mode, kind='demo')
cr.execute('update ir_module_module set demo=%s where id=%s', (True, module_id))
migrations.migrate_module(package, 'post')
if has_demo:
# launch tests only in demo mode, as most tests will depend
# on demo data. Other tests can be added into the regular
# 'data' section, but should probably not alter the data,
@@ -186,8 +190,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, skip_modules=
processed_modules.append(package.name)
migrations.migrate_module(package, 'post')
ver = adapt_version(package.data['version'])
# Set new modules and dependencies
modobj.write(cr, SUPERUSER_ID, [module_id], {'state': 'installed', 'latest_version': ver})
+4 -4
View File
@@ -305,18 +305,16 @@ class RegistryManager(object):
r, c = cr.fetchone()
# Check if the model registry must be reloaded (e.g. after the
# database has been updated by another process).
if registry.base_registry_signaling_sequence != r:
if registry.base_registry_signaling_sequence > 1 and registry.base_registry_signaling_sequence != r:
changed = True
_logger.info("Reloading the model registry after database signaling.")
registry = cls.new(db_name)
registry.base_registry_signaling_sequence = r
# Check if the model caches must be invalidated (e.g. after a write
# occured on another process). Don't clear right after a registry
# has been reload.
elif registry.base_cache_signaling_sequence != c:
elif registry.base_cache_signaling_sequence > 1 and registry.base_cache_signaling_sequence != c:
changed = True
_logger.info("Invalidating all model caches after database signaling.")
registry.base_cache_signaling_sequence = c
registry.clear_caches()
registry.reset_any_cache_cleared()
# One possible reason caches have been invalidated is the
@@ -326,6 +324,8 @@ class RegistryManager(object):
for column in model._columns.values():
if hasattr(column, 'digits_change'):
column.digits_change(cr)
registry.base_registry_signaling_sequence = r
registry.base_cache_signaling_sequence = c
finally:
cr.close()
return changed
+1 -1
View File
@@ -1012,7 +1012,7 @@ class expression(object):
else:
if field._type == 'datetime' and right and len(right) == 10:
if operator in ('>', '>='):
if operator in ('>', '>=', '='):
right += ' 00:00:00'
elif operator in ('<', '<='):
right += ' 23:59:59'
+25 -19
View File
@@ -116,8 +116,7 @@ class _column(object):
self.groups = False # CSV list of ext IDs of groups that can access this field
self.deprecated = False # Optional deprecation warning
for a in args:
if args[a]:
setattr(self, a, args[a])
setattr(self, a, args[a])
def restart(self):
pass
@@ -207,27 +206,29 @@ class reference(_column):
return model.name_get(cr, uid, [int(res_id)], context=context)[0][1]
return tools.ustr(value)
# takes a string (encoded in utf8) and returns a string (encoded in utf8)
def _symbol_set_char(self, symb):
#TODO:
# * we need to remove the "symb==False" from the next line BUT
# for now too many things rely on this broken behavior
# * the symb==None test should be common to all data types
if symb is None or symb == False:
return None
# we need to convert the string to a unicode object to be able
# to evaluate its length (and possibly truncate it) reliably
u_symb = tools.ustr(symb)
return u_symb[:self.size].encode('utf8')
class char(_column):
_type = 'char'
def __init__(self, string="unknown", size=None, **args):
_column.__init__(self, string=string, size=size or None, **args)
self._symbol_set = (self._symbol_c, self._symbol_set_char)
# takes a string (encoded in utf8) and returns a string (encoded in utf8)
def _symbol_set_char(self, symb):
#TODO:
# * we need to remove the "symb==False" from the next line BUT
# for now too many things rely on this broken behavior
# * the symb==None test should be common to all data types
if symb is None or symb == False:
return None
# we need to convert the string to a unicode object to be able
# to evaluate its length (and possibly truncate it) reliably
u_symb = tools.ustr(symb)
return u_symb[:self.size].encode('utf8')
# self._symbol_set_char defined to keep the backward compatibility
self._symbol_f = self._symbol_set_char = lambda x: _symbol_set_char(self, x)
self._symbol_set = (self._symbol_c, self._symbol_f)
class text(_column):
@@ -1116,6 +1117,11 @@ class function(_column):
self._symbol_f = integer._symbol_f
self._symbol_set = integer._symbol_set
if type == 'char':
self._symbol_c = char._symbol_c
self._symbol_f = lambda x: _symbol_set_char(self, x)
self._symbol_set = (self._symbol_c, self._symbol_f)
def digits_change(self, cr):
if self._type == 'float':
if self.digits_compute:
@@ -1367,7 +1373,7 @@ class dummy(function):
def __init__(self, *arg, **args):
self.arg = arg
self._relations = []
super(dummy, self).__init__(self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg, fnct_search=None, **args)
super(dummy, self).__init__(self._fnct_read, arg, self._fnct_write, fnct_inv_arg=arg, fnct_search=self._fnct_search, **args)
# ---------------------------------------------------------
# Serialized fields
+35 -25
View File
@@ -1010,8 +1010,10 @@ class BaseModel(object):
raise except_orm('Error',
('Invalid function definition %s in object %s !\nYou must use the definition: store={object:(fnct, fields, priority, time length)}.' % (store_field, self._name)))
self.pool._store_function.setdefault(object, [])
self.pool._store_function[object].append((self._name, store_field, fnct, tuple(fields2) if fields2 else None, order, length))
self.pool._store_function[object].sort(lambda x, y: cmp(x[4], y[4]))
t = (self._name, store_field, fnct, tuple(fields2) if fields2 else None, order, length)
if not t in self.pool._store_function[object]:
self.pool._store_function[object].append((self._name, store_field, fnct, tuple(fields2) if fields2 else None, order, length))
self.pool._store_function[object].sort(lambda x, y: cmp(x[4], y[4]))
for (key, _, msg) in self._sql_constraints:
self.pool._sql_error[self._table+'_'+key] = msg
@@ -2887,8 +2889,12 @@ class BaseModel(object):
"""
Record the creation of a constraint for this model, to make it possible
to delete it later when the module is uninstalled. Type can be either
'f' or 'u' depending on the constraing being a foreign key or not.
'f' or 'u' depending on the constraint being a foreign key or not.
"""
if not self._module:
# no need to save constraints for custom models as they're not part
# of any module
return
assert type in ('f', 'u')
cr.execute("""
SELECT 1 FROM ir_model_constraint, ir_module_module
@@ -4583,9 +4589,9 @@ class BaseModel(object):
return browse_null()
def _store_get_values(self, cr, uid, ids, fields, context):
"""Returns an ordered list of fields.functions to call due to
"""Returns an ordered list of fields.function to call due to
an update operation on ``fields`` of records with ``ids``,
obtained by calling the 'store' functions of these fields,
obtained by calling the 'store' triggers of these fields,
as setup by their 'store' attribute.
:return: [(priority, model_name, [record_ids,], [function_fields,])]
@@ -4594,42 +4600,46 @@ class BaseModel(object):
stored_functions = self.pool._store_function.get(self._name, [])
# use indexed names for the details of the stored_functions:
model_name_, func_field_to_compute_, id_mapping_fnct_, trigger_fields_, priority_ = range(5)
model_name_, func_field_to_compute_, target_ids_func_, trigger_fields_, priority_ = range(5)
# only keep functions that should be triggered for the ``fields``
# only keep store triggers that should be triggered for the ``fields``
# being written to.
to_compute = [f for f in stored_functions \
triggers_to_compute = [f for f in stored_functions \
if ((not f[trigger_fields_]) or set(fields).intersection(f[trigger_fields_]))]
mapping = {}
for function in to_compute:
# use admin user for accessing objects having rules defined on store fields
target_ids = [id for id in function[id_mapping_fnct_](self, cr, SUPERUSER_ID, ids, context) if id]
to_compute_map = {}
target_id_results = {}
for store_trigger in triggers_to_compute:
target_func_id_ = id(store_trigger[target_ids_func_])
if not target_func_id_ in target_id_results:
# use admin user for accessing objects having rules defined on store fields
target_id_results[target_func_id_] = [i for i in store_trigger[target_ids_func_](self, cr, SUPERUSER_ID, ids, context) if i]
target_ids = target_id_results[target_func_id_]
# the compound key must consider the priority and model name
key = (function[priority_], function[model_name_])
key = (store_trigger[priority_], store_trigger[model_name_])
for target_id in target_ids:
mapping.setdefault(key, {}).setdefault(target_id,set()).add(tuple(function))
to_compute_map.setdefault(key, {}).setdefault(target_id,set()).add(tuple(store_trigger))
# Here mapping looks like:
# { (10, 'model_a') : { target_id1: [ (function_1_tuple, function_2_tuple) ], ... }
# (20, 'model_a') : { target_id2: [ (function_3_tuple, function_4_tuple) ], ... }
# (99, 'model_a') : { target_id1: [ (function_5_tuple, function_6_tuple) ], ... }
# Here to_compute_map looks like:
# { (10, 'model_a') : { target_id1: [ (trigger_1_tuple, trigger_2_tuple) ], ... }
# (20, 'model_a') : { target_id2: [ (trigger_3_tuple, trigger_4_tuple) ], ... }
# (99, 'model_a') : { target_id1: [ (trigger_5_tuple, trigger_6_tuple) ], ... }
# }
# Now we need to generate the batch function calls list
# call_map =
# { (10, 'model_a') : [(10, 'model_a', [record_ids,], [function_fields,])] }
call_map = {}
for ((priority,model), id_map) in mapping.iteritems():
functions_ids_maps = {}
for ((priority,model), id_map) in to_compute_map.iteritems():
trigger_ids_maps = {}
# function_ids_maps =
# { (function_1_tuple, function_2_tuple) : [target_id1, target_id2, ..] }
for id, functions in id_map.iteritems():
functions_ids_maps.setdefault(tuple(functions), []).append(id)
for functions, ids in functions_ids_maps.iteritems():
call_map.setdefault((priority,model),[]).append((priority, model, ids,
[f[func_field_to_compute_] for f in functions]))
for target_id, triggers in id_map.iteritems():
trigger_ids_maps.setdefault(tuple(triggers), []).append(target_id)
for triggers, target_ids in trigger_ids_maps.iteritems():
call_map.setdefault((priority,model),[]).append((priority, model, target_ids,
[t[func_field_to_compute_] for t in triggers]))
ordered_keys = call_map.keys()
ordered_keys.sort()
result = []
+5 -2
View File
@@ -3,7 +3,6 @@
#-----------------------------------------------------------
import datetime
import errno
import fcntl
import logging
import os
import os.path
@@ -21,6 +20,11 @@ import time
import traceback
import werkzeug.serving
try:
import fcntl
except ImportError:
pass
try:
from setproctitle import setproctitle
except ImportError:
@@ -828,7 +832,6 @@ def start():
global server
load_server_wide_modules()
if config['workers']:
openerp.multi_process = True
server = PreforkServer(openerp.service.wsgi_server.application)
elif openerp.evented:
server = GeventServer(openerp.service.wsgi_server.application)
+74 -4
View File
@@ -22,11 +22,11 @@
#
##############################################################################
from lxml import etree
import unittest2
from . import test_mail_examples
from openerp.tools import html_sanitize, html_email_clean, append_content_to_html, plaintext2html
class TestSanitizer(unittest2.TestCase):
""" Test the html sanitizer that filters html to remove unwanted attributes """
@@ -76,15 +76,19 @@ class TestSanitizer(unittest2.TestCase):
("<META HTTP-EQUIV=\"Link\" Content=\"<http://ha.ckers.org/xss.css>; REL=stylesheet\">"), # remote style sheet 3
("<STYLE>BODY{-moz-binding:url(\"http://ha.ckers.org/xssmoz.xml#xss\")}</STYLE>"), # remote style sheet 4
("<IMG STYLE=\"xss:expr/*XSS*/ession(alert('XSS'))\">"), # style attribute using a comment to break up expression
("""<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT>
<![endif]-->"""), # down-level hidden block
]
for content in cases:
html = html_sanitize(content)
self.assertNotIn('javascript', html, 'html_sanitize did not remove a malicious javascript')
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))
# Raise an exception if the node is an empty string without any root tag
with self.assertRaises(etree.ParserError):
content = "<!--[if gte IE 4]><SCRIPT>alert('XSS');</SCRIPT><![endif]-->" # down-level hidden block
html = html_sanitize(content, silent=False)
def test_html(self):
sanitized_html = html_sanitize(test_mail_examples.MISC_HTML_SOURCE)
for tag in ['<div', '<b', '<i', '<u', '<strike', '<li', '<blockquote', '<a href']:
@@ -149,6 +153,59 @@ class TestCleaner(unittest2.TestCase):
for text in out_lst:
self.assertNotIn(text, new_html, 'html_email_cleaner did not remove unwanted content')
def test_05_shorten(self):
# TEST: shorten length
test_str = '''<div>
<span>
</span>
<p>Hello, <span>Raoul</span>
<bold>You</bold> are
pretty</p>
<span>Really</span>
</div>
'''
# shorten at 'H' of Hello -> should shorten after Hello,
html = html_email_clean(test_str, shorten=True, max_length=1, remove=True)
self.assertIn('Hello,', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('Raoul', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# shorten at 'are' -> should shorten after are
html = html_email_clean(test_str, shorten=True, max_length=17, remove=True)
self.assertIn('Hello,', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('Raoul', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('are', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('pretty', html, 'html_email_cleaner: shorten error or too long')
self.assertNotIn('Really', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# TEST: shorten in quote
test_str = '''<div> Blahble
bluih blouh
<blockquote>This is a quote
<span>And this is quite a long quote, after all.</span>
</blockquote>
</div>'''
# shorten in the quote
html = html_email_clean(test_str, shorten=True, max_length=25, remove=True)
self.assertIn('Blahble', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('bluih', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('blouh', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('quote', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# shorten in second word
html = html_email_clean(test_str, shorten=True, max_length=9, remove=True)
self.assertIn('Blahble', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('bluih', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('blouh', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('quote', html, 'html_email_cleaner: shorten error or too long')
self.assertIn('read more', html, 'html_email_cleaner: shorten error about read more inclusion')
# shorten waaay too large
html = html_email_clean(test_str, shorten=True, max_length=900, remove=True)
self.assertIn('Blahble', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('bluih', html, 'html_email_cleaner: shorten error or too short')
self.assertIn('blouh', html, 'html_email_cleaner: shorten error or too short')
self.assertNotIn('quote', html, 'html_email_cleaner: shorten error or too long')
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)
@@ -223,6 +280,19 @@ class TestCleaner(unittest2.TestCase):
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_70_read_more(self):
new_html = html_email_clean(test_mail_examples.BUG1, remove=True, shorten=True, max_length=100)
for ext in test_mail_examples.BUG_1_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed valid content')
for ext in test_mail_examples.BUG_1_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not removed invalid content')
new_html = html_email_clean(test_mail_examples.BUG2, remove=True, shorten=True, max_length=250)
for ext in test_mail_examples.BUG_2_IN:
self.assertIn(ext, new_html, 'html_email_cleaner wrongly removed valid content')
for ext in test_mail_examples.BUG_2_OUT:
self.assertNotIn(ext, new_html, 'html_email_cleaner did not removed invalid content')
def test_90_misc(self):
# False boolean for text must return empty string
new_html = html_email_clean(False)
+319
View File
@@ -637,3 +637,322 @@ MSOFFICE_3 = """<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']
# ------------------------------------------------------------
# Test cases coming from bugs
# ------------------------------------------------------------
# bug: read more not apparent, strange message in read more span
BUG1 = """<pre>Hi Migration Team,
Paragraph 1, blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah.
Paragraph 2, blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah.
Paragraph 3, blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah blah blah blah blah blah blah
blah blah blah blah blah blah blah blah.
Thanks.
Regards,
--
Olivier Laurent
Migration Manager
OpenERP SA
Chaussée de Namur, 40
B-1367 Gérompont
Tel: +32.81.81.37.00
Web: http://www.openerp.com</pre>"""
BUG_1_IN = [
'Hi Migration Team',
'Paragraph 1'
]
BUG_1_OUT = [
'Olivier Laurent',
'Chaussée de Namur',
'81.81.37.00',
'openerp.com',
]
BUG2 = """
<div>
<br>
<div class="moz-forward-container"><br>
<br>
-------- Original Message --------
<table class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Subject:
</th>
<td>Fwd: TR: OpenERP S.A. Payment Reminder</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Date: </th>
<td>Wed, 16 Oct 2013 14:11:13 +0200</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">From: </th>
<td>Christine Herrmann <a class="moz-txt-link-rfc2396E" href="mailto:che@openerp.com">&lt;che@openerp.com&gt;</a></td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">To: </th>
<td><a class="moz-txt-link-abbreviated" href="mailto:online@openerp.com">online@openerp.com</a></td>
</tr>
</tbody>
</table>
<br>
<br>
<br>
<div class="moz-forward-container"><br>
<br>
-------- Message original --------
<table class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0">
<tbody>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Sujet:
</th>
<td>TR: OpenERP S.A. Payment Reminder</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Date&nbsp;:
</th>
<td>Wed, 16 Oct 2013 10:34:45 -0000</td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">De&nbsp;: </th>
<td>Ida Siwatala <a class="moz-txt-link-rfc2396E" href="mailto:infos@inzoservices.com">&lt;infos@inzoservices.com&gt;</a></td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Répondre
à&nbsp;: </th>
<td><a class="moz-txt-link-abbreviated" href="mailto:catchall@openerp.my.openerp.com">catchall@openerp.my.openerp.com</a></td>
</tr>
<tr>
<th nowrap="" valign="BASELINE" align="RIGHT">Pour&nbsp;:
</th>
<td>Christine Herrmann (che) <a class="moz-txt-link-rfc2396E" href="mailto:che@openerp.com">&lt;che@openerp.com&gt;</a></td>
</tr>
</tbody>
</table>
<br>
<br>
<div>
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Bonjour,</span></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 class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Pourriez-vous
me faire un retour sur ce point.</span></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 class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cordialement</span></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>
<div>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">De&nbsp;:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">
Ida Siwatala [<a class="moz-txt-link-freetext" href="mailto:infos@inzoservices.com">mailto:infos@inzoservices.com</a>]
<br>
<b>Envoyé&nbsp;:</b> vendredi 4 octobre 2013 20:03<br>
<b>À&nbsp;:</b> 'Followers of
INZO-services-8-all-e-Maxime-Lisbonne-77176-Savigny-le-temple-France'<br>
<b>Objet&nbsp;:</b> RE: OpenERP S.A. Payment Reminder</span></p>
</div>
</div>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Bonsoir,</span></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 class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Je
me permets de revenir vers vous par écrit , car j’ai
fait 2 appels vers votre service en exposant mon
problème, mais je n’ai pas eu de retour.</span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cela
fait un mois que j’ai fait la souscription de votre
produit, mais je me rends compte qu’il est pas adapté à
ma situation ( fonctionnalité manquante et surtout je
n’ai pas beaucoup de temps à passer à résoudre des
bugs). </span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">C’est
pourquoi , j’ai demandé qu’un accord soit trouvé avec
vous pour annuler le contrat (tout en vous payant le
mois d’utilisation de septembre).</span></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 class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Pourriez-vous
me faire un retour sur ce point.</span></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 class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Cordialement,</span></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 class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;;color:#1F497D">Ida
Siwatala</span></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 class="MsoNormal"><b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">De&nbsp;:</span></b><span style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">
<a href="mailto:che@openerp.com">che@openerp.com</a>
[<a href="mailto:che@openerp.com">mailto:che@openerp.com</a>]
<br>
<b>Envoyé&nbsp;:</b> vendredi 4 octobre 2013 17:41<br>
<b>À&nbsp;:</b> <a href="mailto:infos@inzoservices.com">infos@inzoservices.com</a><br>
<b>Objet&nbsp;:</b> OpenERP S.A. Payment Reminder</span></p>
<p>&nbsp;</p>
<div>
<p style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Dear
INZO services,</span></p>
<p style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Exception
made if there was a mistake of ours, it seems that the
following amount stays unpaid. Please, take
appropriate measures in order to carry out this
payment in the next 8 days. </span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222"></span></p>
<p>&nbsp;</p>
<table class="MsoNormalTable" style="width:100.0%;border:outset 1.5pt" width="100%" border="1" cellpadding="0">
<tbody>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Date de facturation</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Description</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Reference</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Due Date</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Amount (€)</p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal">Lit.</p>
</td>
</tr>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>2013-09-24</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>2013/1121</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>Enterprise - Inzo Services
- Juillet 2013</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>2013-09-24</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt">
<p class="MsoNormal"><b>420.0</b></p>
</td>
<td style="padding:.75pt .75pt .75pt .75pt"><br>
</td>
</tr>
<tr>
<td style="padding:.75pt .75pt .75pt .75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
<td style="border:none;padding:.75pt .75pt .75pt
.75pt"><br>
</td>
</tr>
</tbody>
</table>
<p class="MsoNormal" style="text-align:center;background:white" align="center"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Amount
due : 420.00 € </span></p>
<p style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222">Would
your payment have been carried out after this mail was
sent, please ignore this message. Do not hesitate to
contact our accounting department. </span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:&quot;Arial&quot;,&quot;sans-serif&quot;;color:#222222"><br>
Best Regards, <br>
Aurore Lesage <br>
OpenERP<br>
Chaussée de Namur, 40 <br>
B-1367 Grand Rosières <br>
Tel: +32.81.81.37.00 - Fax: +32.81.73.35.01 <br>
E-mail : <a href="mailto:ale@openerp.com">ale@openerp.com</a> <br>
Web: <a href="http://www.openerp.com">http://www.openerp.com</a></span></p>
</div>
</div>
</div>
--<br>
INZO services <small>Sent by <a style="color:inherit" href="http://www.openerp.com">OpenERP
S.A.</a> using <a style="color:inherit" href="https://www.openerp.com/">OpenERP</a>.</small>
<small>Access your messages and documents <a style="color:inherit" href="https://accounts.openerp.com?db=openerp#action=mail.action_mail_redirect&amp;login=che&amp;message_id=5750830">in
OpenERP</a></small> <br>
<pre class="moz-signature" cols="72">--
Christine Herrmann
OpenERP
Chaussée de Namur, 40
B-1367 Grand Rosières
Tel: +32.81.81.37.00 - Fax: +32.81.73.35.01
Web: <a class="moz-txt-link-freetext" href="http://www.openerp.com">http://www.openerp.com</a> </pre>
<br>
</div>
<br>
<br>
</div>
<br>
</div>"""
BUG_2_IN = [
'read more',
'...',
]
BUG_2_OUT = [
'Fwd: TR: OpenERP S.A'
'fait un mois'
]
+80 -33
View File
@@ -175,6 +175,51 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300):
iteration += 1
new_node = _insert_new_node(node, -1, new_node_tag, text[idx:] + (cur_node.tail or ''), None, {})
def _truncate_node(node, position, simplify_whitespaces=True):
""" Truncate a node text at a given position. This algorithm will shorten
at the end of the word whose ending character exceeds position.
:param bool simplify_whitespaces: whether to try to count all successive
whitespaces as one character. This
option should not be True when trying
to keep 'pre' consistency.
"""
if node.text is None:
node.text = ''
truncate_idx = -1
if simplify_whitespaces:
cur_char_nbr = 0
word = None
node_words = node.text.strip(' \t\r\n').split()
for word in node_words:
cur_char_nbr += len(word)
if cur_char_nbr >= position:
break
if word:
truncate_idx = node.text.find(word) + len(word)
else:
truncate_idx = position
if truncate_idx == -1 or truncate_idx > len(node.text):
truncate_idx = len(node.text)
# compose new text bits
innertext = node.text[0:truncate_idx]
outertext = node.text[truncate_idx:]
node.text = innertext
# 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
overtext_node = _create_node('span', outertext)
# tag node
overtext_node.set('in_overlength', '1')
# add newly created nodes in dom
node.append(read_more_node)
node.append(overtext_node)
if not html or not isinstance(html, basestring):
return html
html = ustr(html)
@@ -197,17 +242,16 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300):
html = '<div>%s</div>' % html
root = lxml.html.fromstring(html)
# 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():
quote_tags = re.compile(r'(\n(>)+[^\n\r]*)')
signature = re.compile(r'([-]{2,}[\s]?[\r\n]{1,2}[\s\S]+)')
for node in root.iter():
# remove all tails and replace them by a span element, because managing text and tails can be a pain in the ass
if node.tail:
tail_node = _create_node('span', node.tail)
node.tail = None
node.addnext(tail_node)
# 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():
# form node and tag text-based quotes and signature
_tag_matching_regex_in_text(quote_tags, node, 'span', {'text_quote': '1'})
_tag_matching_regex_in_text(signature, node, 'span', {'text_signature': '1'})
@@ -219,21 +263,26 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300):
quote_begin = False
overlength = False
cur_char_nbr = 0
for node in root.getiterator():
for node in root.iter():
# do not take into account multiple spaces that are displayed as max 1 space in html
node_text = ' '.join((node.text and node.text.strip(' \t\r\n') or '').split())
# 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
# state of the parsing: flag quotes and tails to remove
if quote_begin:
node.set('in_quote', '1')
node.set('tail_remove', '1')
# state of the parsing: flag when being in over-length content
if overlength:
node.set('in_overlength', '1')
node.set('tail_remove', '1')
# find quote in msoffice / hotmail / blockquote / text quote and signatures
if root.get('msoffice') and node.tag == 'div' and 'border-top:solid' in node.get('style', ''):
quote_begin = True
node.set('in_quote', '1')
@@ -242,42 +291,37 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300):
quote_begin = True
node.set('in_quote', '1')
node.set('tail_remove', '1')
if node.tag == 'blockquote' or node.get('text_quote') or node.get('text_signature'):
node.set('in_quote', '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:
if shorten and not overlength and cur_char_nbr + len(node_text) > max_length:
node_to_truncate = node
while node_to_truncate.get('in_quote') and node_to_truncate.getparent() is not None:
node_to_truncate = node_to_truncate.getparent()
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')
node_to_truncate.set('truncate', '1')
if node_to_truncate == node:
node_to_truncate.set('truncate_position', str(max_length - cur_char_nbr))
else:
node_to_truncate.set('truncate_position', str(len(node.text or '')))
cur_char_nbr += len(node_text)
cur_char_nbr += len(node.text or '')
# Tree modification
# ------------------------------------------------------------
if node.tag == 'blockquote' or node.get('text_quote') or node.get('text_signature'):
node.set('in_quote', '1')
for node in root.iter():
if node.get('truncate'):
_truncate_node(node, int(node.get('truncate_position', '0')), node.tag != 'pre')
# Post processing
# ------------------------------------------------------------
to_remove = []
for node in root.getiterator():
for node in root.iter():
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'):
@@ -286,17 +330,20 @@ def html_email_clean(html, remove=False, shorten=False, max_length=300):
to_remove.append(node)
if node.get('tail_remove'):
node.tail = ''
# clean node
for attribute_name in ['in_quote', 'tail_remove', 'in_overlength', 'msoffice', 'hotmail', 'truncate', 'truncate_position']:
node.attrib.pop(attribute_name, None)
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_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)
linebreaks = re.compile(r'<span[^>]*>([\s]*[\r\n]+[\s]*)<\/span>', re.IGNORECASE | re.DOTALL)
html = _replace_matching_regex(linebreaks, html, '\n')
return html