[MERGE] trunk
bzr revid: qdp-launchpad@openerp.com-20121004084807-i3vh4fw8sk7nz7ek
This commit is contained in:
commit
bcf6dccf2d
|
@ -44,6 +44,7 @@ The kernel of OpenERP, needed for all installation.
|
|||
'data/res.country.state.csv',
|
||||
'ir/wizard/wizard_menu_view.xml',
|
||||
'ir/ir.xml',
|
||||
'ir/ir_translation_view.xml',
|
||||
'ir/ir_filters.xml',
|
||||
'ir/ir_config_parameter_view.xml',
|
||||
'ir/workflow/workflow_view.xml',
|
||||
|
|
|
@ -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: 2012-09-20 04:35+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:35+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:09+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:35+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:35+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"X-Poedit-Language: Czech\n"
|
||||
|
||||
#. module: base
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -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: 2012-09-20 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"X-Poedit-Country: GREECE\n"
|
||||
"X-Poedit-Language: Greek\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
@ -25,17 +25,17 @@ msgstr "Santa Helena"
|
|||
#. module: base
|
||||
#: view:ir.actions.report.xml:0
|
||||
msgid "Other Configuration"
|
||||
msgstr ""
|
||||
msgstr "Otra configuración"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.property,type:0
|
||||
msgid "DateTime"
|
||||
msgstr ""
|
||||
msgstr "Fecha y hora"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_mailgate
|
||||
msgid "Tasks-Mail Integration"
|
||||
msgstr ""
|
||||
msgstr "Integración Tareas-Email"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/fields.py:582
|
||||
|
@ -44,6 +44,8 @@ msgid ""
|
|||
"The second argument of the many2many field %s must be a SQL table !You used "
|
||||
"%s, which is not a valid SQL table name."
|
||||
msgstr ""
|
||||
"¡El segundo argumento del campo many2many %s debe ser una tabla SQL! Has "
|
||||
"utilizado %s, que no es un nombre de tabla SQL válido."
|
||||
|
||||
#. module: base
|
||||
#: field:ir.ui.view,arch:0
|
||||
|
@ -70,6 +72,21 @@ msgid ""
|
|||
" * Graph of My Remaining Hours by Project\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"El módulo de Gestión de Proyectos permite gestionar proyectos con varios "
|
||||
"niveles, tareas, trabajo realizado en tareas, etc.\n"
|
||||
"============================================================================="
|
||||
"=========\n"
|
||||
"\n"
|
||||
"Es capaz de generar planificaciones, ordenar tareas, etc.\n"
|
||||
"\n"
|
||||
"El tablero de control para los miembros del proyecto incluye:\n"
|
||||
"--------------------------------------------\n"
|
||||
"* Lista de mis tareas abiertas\n"
|
||||
"* Lista de mis tareas delegadas\n"
|
||||
"* Gráfico de mis proyectos: Planificado vs Horas totales\n"
|
||||
"* Gráfico de mis horas pendientes por proyecto\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:base.language.import,code:0
|
||||
|
@ -89,7 +106,7 @@ msgstr "Workflow"
|
|||
#. module: base
|
||||
#: selection:ir.sequence,implementation:0
|
||||
msgid "No gap"
|
||||
msgstr ""
|
||||
msgstr "Sin hueco"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
|
@ -99,7 +116,7 @@ msgstr "Húngaro / Magyar"
|
|||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
msgid "Spanish (PY) / Español (PY)"
|
||||
msgstr ""
|
||||
msgstr "Español (UY) / Español (UY)"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,description:base.module_category_project_management
|
||||
|
@ -107,22 +124,26 @@ msgid ""
|
|||
"Helps you manage your projects and tasks by tracking them, generating "
|
||||
"plannings, etc..."
|
||||
msgstr ""
|
||||
"Le ayuda a gestionar sus proyectos y tareas realizando un seguimiento de los "
|
||||
"mismos, generando planificaciones, ..."
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,display_menu_tip:0
|
||||
msgid "Display Menu Tips"
|
||||
msgstr ""
|
||||
msgstr "Mostrar consejos de menú"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.cron,model:0
|
||||
msgid ""
|
||||
"Model name on which the method to be called is located, e.g. 'res.partner'."
|
||||
msgstr ""
|
||||
"Nombre del módelo en el que se encuentra el método al que se llama, por "
|
||||
"ejemplo 'res.partner'."
|
||||
|
||||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
msgid "Created Views"
|
||||
msgstr ""
|
||||
msgstr "Vistas creadas"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_model.py:532
|
||||
|
@ -131,6 +152,8 @@ msgid ""
|
|||
"You can not write in this document (%s) ! Be sure your user belongs to one "
|
||||
"of these groups: %s."
|
||||
msgstr ""
|
||||
"¡No puede escribir en este documento (%s)! Asegúrese que su usuario "
|
||||
"pertenezca a alguno de estos grupos: %s."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_event_project
|
||||
|
@ -141,6 +164,11 @@ msgid ""
|
|||
"\n"
|
||||
"This module allows you to create retro planning for managing your events.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Organización y gestión de eventos.\n"
|
||||
"======================================\n"
|
||||
"\n"
|
||||
"Este módulo permite crear retro planning para gestionar tus eventos.\n"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.model.fields,domain:0
|
||||
|
@ -149,16 +177,19 @@ msgid ""
|
|||
"specified as a Python expression defining a list of triplets. For example: "
|
||||
"[('color','=','red')]"
|
||||
msgstr ""
|
||||
"El dominio opcional para restringir los posibles valores para los campos de "
|
||||
"relación, se especifica como una expresión Python compuesta por una lista de "
|
||||
"tripletas. Por ejemplo: [('color','=',' red')]"
|
||||
|
||||
#. module: base
|
||||
#: field:res.partner,ref:0
|
||||
msgid "Reference"
|
||||
msgstr ""
|
||||
msgstr "Referencia"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba
|
||||
msgid "Belgium - Structured Communication"
|
||||
msgstr ""
|
||||
msgstr "Bélgica - Comunicación Estructurada"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,target:0
|
||||
|
@ -168,12 +199,12 @@ msgstr "Ventana destino"
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_analytic_plans
|
||||
msgid "Sales Analytic Distribution"
|
||||
msgstr ""
|
||||
msgstr "Distribución Analítica de Ventas"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_process
|
||||
msgid "Process"
|
||||
msgstr ""
|
||||
msgstr "Procesar"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_analytic_journal_billing_rate
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:18+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"Language: \n"
|
||||
|
||||
#. module: base
|
||||
|
|
|
@ -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: 2012-09-20 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:18+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:18+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
|
||||
"X-Poedit-Language: Persian\n"
|
||||
|
||||
|
@ -22,7 +22,7 @@ msgstr "سنت هلن"
|
|||
#. module: base
|
||||
#: view:ir.actions.report.xml:0
|
||||
msgid "Other Configuration"
|
||||
msgstr ""
|
||||
msgstr "پیکربندی های دیگر"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.property,type:0
|
||||
|
@ -81,12 +81,12 @@ msgstr "کد (مثلا:en__US)"
|
|||
#: field:workflow.transition,wkf_id:0
|
||||
#: field:workflow.workitem,wkf_id:0
|
||||
msgid "Workflow"
|
||||
msgstr "کارگردش"
|
||||
msgstr "گردش کار"
|
||||
|
||||
#. module: base
|
||||
#: selection:ir.sequence,implementation:0
|
||||
msgid "No gap"
|
||||
msgstr ""
|
||||
msgstr "بدون فاصله"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
|
@ -96,7 +96,7 @@ msgstr "مجاری / Magyar"
|
|||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
msgid "Spanish (PY) / Español (PY)"
|
||||
msgstr ""
|
||||
msgstr "اسپانیایی"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,description:base.module_category_project_management
|
||||
|
@ -108,7 +108,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: field:ir.actions.act_window,display_menu_tip:0
|
||||
msgid "Display Menu Tips"
|
||||
msgstr ""
|
||||
msgstr "نمایش منوی نکات"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.cron,model:0
|
||||
|
@ -150,12 +150,12 @@ msgstr ""
|
|||
#. module: base
|
||||
#: field:res.partner,ref:0
|
||||
msgid "Reference"
|
||||
msgstr ""
|
||||
msgstr "ارجاع"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_be_invoice_bba
|
||||
msgid "Belgium - Structured Communication"
|
||||
msgstr ""
|
||||
msgstr "بلژیک ساختار ارتباطات"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,target:0
|
||||
|
@ -170,7 +170,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_web_process
|
||||
msgid "Process"
|
||||
msgstr ""
|
||||
msgstr "روند"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_analytic_journal_billing_rate
|
||||
|
@ -181,7 +181,7 @@ msgstr ""
|
|||
#: code:addons/base/res/res_users.py:558
|
||||
#, python-format
|
||||
msgid "Warning!"
|
||||
msgstr ""
|
||||
msgstr "هشدار!"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_model.py:344
|
||||
|
@ -217,12 +217,12 @@ msgstr "سوازیلند"
|
|||
#: code:addons/orm.py:4206
|
||||
#, python-format
|
||||
msgid "created."
|
||||
msgstr ""
|
||||
msgstr "ایجاد میشود."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_tr
|
||||
msgid "Turkey - Accounting"
|
||||
msgstr ""
|
||||
msgstr "ترکیه - حسابداری"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_mrp_subproduct
|
||||
|
@ -260,7 +260,7 @@ msgstr ""
|
|||
#: model:ir.module.category,name:base.module_category_sales_management
|
||||
#: model:ir.module.module,shortdesc:base.module_sale
|
||||
msgid "Sales Management"
|
||||
msgstr ""
|
||||
msgstr "مدیریت فروش"
|
||||
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
|
@ -271,7 +271,7 @@ msgstr "جستجوی همکار"
|
|||
#: code:addons/base/module/wizard/base_export_language.py:60
|
||||
#, python-format
|
||||
msgid "new"
|
||||
msgstr "تازه"
|
||||
msgstr "جدید"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.report.xml,multi:0
|
||||
|
@ -304,7 +304,7 @@ msgstr "اندازه بیشینه"
|
|||
#: model:ir.ui.menu,name:base.next_id_73
|
||||
#: model:ir.ui.menu,name:base.reporting_menu
|
||||
msgid "Reporting"
|
||||
msgstr ""
|
||||
msgstr "گزارش"
|
||||
|
||||
#. module: base
|
||||
#: view:res.partner:0
|
||||
|
@ -337,7 +337,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: sql_constraint:res.lang:0
|
||||
msgid "The name of the language must be unique !"
|
||||
msgstr ""
|
||||
msgstr "نام زبان باید منحصر به فرد باشد !"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_import_base
|
||||
|
@ -356,7 +356,7 @@ msgstr "نام تردست"
|
|||
#. module: base
|
||||
#: model:res.groups,name:base.group_partner_manager
|
||||
msgid "Partner Manager"
|
||||
msgstr ""
|
||||
msgstr "مدیریت شریک"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_customer_relationship_management
|
||||
|
@ -366,7 +366,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: view:ir.module.module:0
|
||||
msgid "Extra"
|
||||
msgstr ""
|
||||
msgstr "اضافی"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/orm.py:2526
|
||||
|
@ -387,7 +387,7 @@ msgstr "حد اعتبار"
|
|||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_web_graph
|
||||
msgid "Openerp web graph view"
|
||||
msgstr ""
|
||||
msgstr "مشاهده گراف Openerp در وب"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.model.data,date_update:0
|
||||
|
@ -402,7 +402,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: view:ir.attachment:0
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
msgstr "مالک"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.act_window,src_model:0
|
||||
|
@ -428,7 +428,7 @@ msgstr "ir.ui.view_sc"
|
|||
#: field:res.widget.user,widget_id:0
|
||||
#: field:res.widget.wizard,widgets_list:0
|
||||
msgid "Widget"
|
||||
msgstr ""
|
||||
msgstr "ویجت"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.model.access:0
|
||||
|
@ -454,7 +454,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_pad_project
|
||||
msgid "Specifications on PADs"
|
||||
msgstr ""
|
||||
msgstr "مشخصات به روی پد"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.filters,user_id:0
|
||||
|
@ -466,7 +466,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: help:res.partner,website:0
|
||||
msgid "Website of Partner."
|
||||
msgstr ""
|
||||
msgstr "وب سایت همکار"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.act_window,views:0
|
||||
|
@ -495,13 +495,13 @@ msgstr "قالب تاریخ"
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_base_report_designer
|
||||
msgid "OpenOffice Report Designer"
|
||||
msgstr ""
|
||||
msgstr "طراح گزارش اپن آفیس"
|
||||
|
||||
#. module: base
|
||||
#: field:res.bank,email:0
|
||||
#: field:res.partner.address,email:0
|
||||
msgid "E-Mail"
|
||||
msgstr "ایمیل"
|
||||
msgstr "پست الکترونیکی"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.an
|
||||
|
@ -532,7 +532,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: model:res.country,name:base.gf
|
||||
msgid "French Guyana"
|
||||
msgstr "امریکا/گویانا"
|
||||
msgstr "گوویان فرانسوی"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.ui.view.custom,ref_id:0
|
||||
|
@ -556,22 +556,22 @@ msgstr ""
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_layout
|
||||
msgid "Sales Orders Print Layout"
|
||||
msgstr ""
|
||||
msgstr "چیدمان سفارش های فروش در چاپ"
|
||||
|
||||
#. module: base
|
||||
#: selection:base.language.install,lang:0
|
||||
msgid "Spanish (VE) / Español (VE)"
|
||||
msgstr ""
|
||||
msgstr "اسپانیایی (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
|
||||
msgid "Your system will be updated."
|
||||
msgstr ""
|
||||
msgstr "سیستم شما به روز خواهد شد."
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.todo,note:0
|
||||
|
@ -641,7 +641,7 @@ msgstr "فروشها و خریدها"
|
|||
#. module: base
|
||||
#: view:ir.translation:0
|
||||
msgid "Untranslated"
|
||||
msgstr ""
|
||||
msgstr "ترجمهنشده"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.act_window,context:0
|
||||
|
@ -670,7 +670,7 @@ msgstr "نام فیلدهای دلخواه باید با 'x_' آغاز شوند!
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_mx
|
||||
msgid "Mexico - Accounting"
|
||||
msgstr ""
|
||||
msgstr "حسابداری - مکزیک"
|
||||
|
||||
#. module: base
|
||||
#: help:ir.actions.server,action_id:0
|
||||
|
@ -680,17 +680,17 @@ msgstr "پنچره کُنش، گزارش، تَردست را برای اجرا
|
|||
#. module: base
|
||||
#: model:res.country,name:base.ai
|
||||
msgid "Anguilla"
|
||||
msgstr "آنگیل"
|
||||
msgstr "آنگولا"
|
||||
|
||||
#. module: base
|
||||
#: view:base.language.export:0
|
||||
msgid "Export done"
|
||||
msgstr "برونش انجام شد"
|
||||
msgstr "صادرات انجام شد"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_plugin_outlook
|
||||
msgid "Outlook Plug-In"
|
||||
msgstr ""
|
||||
msgstr "پلاگین Outlook"
|
||||
|
||||
#. module: base
|
||||
#: view:ir.model:0
|
||||
|
@ -717,7 +717,7 @@ msgstr "اردن"
|
|||
#. module: base
|
||||
#: help:ir.cron,nextcall:0
|
||||
msgid "Next planned execution date for this job."
|
||||
msgstr ""
|
||||
msgstr "تاریخ برنامه ریزی شده بعدی برای انجام این کار"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/ir/ir_model.py:139
|
||||
|
@ -733,24 +733,24 @@ msgstr "اریتره"
|
|||
#. module: base
|
||||
#: sql_constraint:res.company:0
|
||||
msgid "The company name must be unique !"
|
||||
msgstr ""
|
||||
msgstr "نام شرکت باید منحصر به فرد باشد !"
|
||||
|
||||
#. module: base
|
||||
#: view:res.config:0
|
||||
#: view:res.config.installer:0
|
||||
msgid "description"
|
||||
msgstr ""
|
||||
msgstr "توضیحات"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_base_action_rule
|
||||
#: model:ir.ui.menu,name:base.menu_base_action_rule_admin
|
||||
msgid "Automated Actions"
|
||||
msgstr ""
|
||||
msgstr "عملیات خودکار"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_ro
|
||||
msgid "Romania - Accounting"
|
||||
msgstr ""
|
||||
msgstr "حسابداری - رومانی"
|
||||
|
||||
#. module: base
|
||||
#: view:partner.wizard.ean.check:0
|
||||
|
|
|
@ -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: 2012-09-20 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:18+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
"Language: hr\n"
|
||||
|
||||
#. module: base
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:35+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-21 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:37+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:12+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:38+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:13+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:36+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:11+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
@ -397,7 +397,7 @@ msgstr "Naam assistent"
|
|||
#. module: base
|
||||
#: model:res.groups,name:base.group_partner_manager
|
||||
msgid "Partner Manager"
|
||||
msgstr "Relatie manager"
|
||||
msgstr "Relatiemanager"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_customer_relationship_management
|
||||
|
@ -1403,7 +1403,7 @@ msgstr "Document Beheer Systeem"
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_crm_claim
|
||||
msgid "Claims Management"
|
||||
msgstr "Claimsmanagement"
|
||||
msgstr "Klachtenregistratie"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_purchase_root
|
||||
|
@ -1453,7 +1453,7 @@ msgid ""
|
|||
" * Effective Date\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"deze module voegt extra informatie toe aan een verkooporder.\n"
|
||||
"Deze module voegt extra informatie toe aan een verkooporder.\n"
|
||||
"===================================================\n"
|
||||
"\n"
|
||||
"U kunt de navolgende extra data toevoegen aan een verkooporder:\n"
|
||||
|
@ -2502,8 +2502,8 @@ msgstr ""
|
|||
"Helpdesk management.\n"
|
||||
"===================\n"
|
||||
"\n"
|
||||
"Net als administratie en verwerking van claims is de Helpdesk en "
|
||||
"ondersteuning tool, een goed instrument\n"
|
||||
"Net als de klachtenregistratie module is de Helpdesk en ondersteuning tool, "
|
||||
"een goed instrument\n"
|
||||
"om uw acties vast te leggen. Dit menu is meer aangepast aan de mondelinge "
|
||||
"communicatie,\n"
|
||||
"die niet noodzakelijkerwijs verband houden met een claim. Selecteer een "
|
||||
|
@ -2614,7 +2614,7 @@ msgstr "Ideeën"
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_crm
|
||||
msgid "Opportunity to Quotation"
|
||||
msgstr "Verkoopkans naar offerte"
|
||||
msgstr "Prospect naar offerte"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_sale_analytic_plans
|
||||
|
@ -4255,6 +4255,15 @@ msgid ""
|
|||
"automatically new claims based on incoming emails.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Met deze module kunt u alle klachten van uw klanten en leveranciers "
|
||||
"registreren.\n"
|
||||
"==================================================================\n"
|
||||
"\n"
|
||||
"Deze module is volledig geïntegreerd met de e-mail gateway, zodat u "
|
||||
"automatisch\n"
|
||||
"nieuwe klachten kunt registreren op basis van inkomende e-mails.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: selection:workflow.activity,join_mode:0
|
||||
|
@ -7672,7 +7681,7 @@ msgstr "Canada"
|
|||
#: code:addons/base/res/res_company.py:158
|
||||
#, python-format
|
||||
msgid "Reg: "
|
||||
msgstr "Reg: "
|
||||
msgstr "KVK: "
|
||||
|
||||
#. module: base
|
||||
#: help:res.currency.rate,currency_rate_type_id:0
|
||||
|
@ -12076,7 +12085,7 @@ msgstr "Wizards welke worden gestart"
|
|||
#: model:ir.module.category,name:base.module_category_manufacturing
|
||||
#: model:ir.ui.menu,name:base.menu_mrp_root
|
||||
msgid "Manufacturing"
|
||||
msgstr "Productie"
|
||||
msgstr "Productiebeheer"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.km
|
||||
|
@ -14542,7 +14551,7 @@ msgstr ""
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_fetchmail_crm_claim
|
||||
msgid "eMail Gateway for CRM Claim"
|
||||
msgstr "E-mail Gateway voor CRM Claims"
|
||||
msgstr "E-mail Gateway voor klachtenregistratie"
|
||||
|
||||
#. module: base
|
||||
#: help:res.partner,supplier:0
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:39+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:14+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
@ -1944,6 +1944,47 @@ msgid ""
|
|||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Validação de IVA para os números Parceiros 'IVA\n"
|
||||
"========================================\n"
|
||||
"\n"
|
||||
"Depois de instalar este módulo, os valores inseridos no domínio do IVA de "
|
||||
"parceiros\n"
|
||||
"ser validado para todos os países suportados. O país é inferida a partir da\n"
|
||||
"2-letra código do país que prefixos o número de IVA, por exemplo, `` `` "
|
||||
"BE0477472701\n"
|
||||
"será validado usando as regras belgas.\n"
|
||||
"\n"
|
||||
"Existem dois níveis diferentes de validação Número de IVA:\n"
|
||||
"\n"
|
||||
" * Por padrão, uma verificação off-line simples é realizado utilizando a "
|
||||
"validação conhecido\n"
|
||||
" regras para o país, geralmente uma verificação simples dígito. Isto é "
|
||||
"rápido e\n"
|
||||
" sempre disponível, mas permite que os números que não são "
|
||||
"verdadeiramente talvez alocados,\n"
|
||||
" ou não mais válido.\n"
|
||||
" * Quando os \"VIES IVA Verifique\" está activada (na configuração do "
|
||||
"usuário do\n"
|
||||
" Empresa), números de IVA será submetido ao invés linha UE VIES\n"
|
||||
" banco de dados, o que vai realmente verificar se o número é válido e, "
|
||||
"atualmente,\n"
|
||||
" atribuídos a uma empresa da UE. Este é um pouco mais lento do que o "
|
||||
"simples\n"
|
||||
" off-line, cheque, requer uma ligação à Internet, e pode não estar "
|
||||
"disponível\n"
|
||||
" o tempo todo. Se o serviço não está disponível ou não suporta o\n"
|
||||
" país requerido (por exemplo, para países fora da UE), uma simples "
|
||||
"verificação será realizada\n"
|
||||
" em vez disso.\n"
|
||||
"\n"
|
||||
"Países suportados atualmente são os países da UE, e alguns países não "
|
||||
"comunitários\n"
|
||||
"como Chile, Colômbia, México, Noruega ou a Rússia. Para os países não "
|
||||
"suportados,\n"
|
||||
"apenas o código do país serão validados.\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: view:ir.sequence:0
|
||||
|
@ -2467,6 +2508,22 @@ msgid ""
|
|||
"re-invoice your customer's expenses if your work by project.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo tem como objetivo gerenciar as despesas dos funcionários.\n"
|
||||
"===============================================\n"
|
||||
"\n"
|
||||
"O fluxo de trabalho inteiro é implementado:\n"
|
||||
" * Projeto de despesa\n"
|
||||
" * Confirmação da folha pelo empregado\n"
|
||||
" * Validação por seu empresário\n"
|
||||
" * A validação pelo contador e criação de fatura\n"
|
||||
" * Pagamento da fatura para o empregado\n"
|
||||
"\n"
|
||||
"Este módulo também utiliza a contabilidade analítica e é compatível com a\n"
|
||||
"a fatura no módulo de folha de ponto, de modo que você vai ser capaz de "
|
||||
"automaticamente\n"
|
||||
"cobrar seu cliente despesas se você trabalhar por projeto.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:ir.values,action_id:0
|
||||
|
@ -2948,6 +3005,31 @@ msgid ""
|
|||
"performing those tasks.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo implementa todos os conceitos definidos pela metodologia GTD - "
|
||||
"Getting Things Done.\n"
|
||||
"================================================== "
|
||||
"=================================\n"
|
||||
"\n"
|
||||
"Este módulo implementa um simples lista Todo pessoal baseado em tarefas. Ele "
|
||||
"acrescenta\n"
|
||||
"a aplicação do projeto uma lista editável de tarefas simplificadas para o "
|
||||
"mínimo\n"
|
||||
"campos obrigatórios.\n"
|
||||
"\n"
|
||||
"A lista de afazeres é baseado na metodologia GTD. Esta metodologia "
|
||||
"mundialmente utilizada\n"
|
||||
"é utilizado para a melhoria pessoal de gerenciamento de tempo.\n"
|
||||
"\n"
|
||||
"Getting Things Done (comumente abreviado como GTD) é uma ação de gestão\n"
|
||||
"método criado por David Allen, e descrito em um livro de mesmo nome.\n"
|
||||
"\n"
|
||||
"GTD se baseia no princípio de que uma pessoa precisa para mover as tarefas "
|
||||
"fora da mente por\n"
|
||||
"gravá-las externamente. Dessa forma, a mente se liberta do trabalho de\n"
|
||||
"lembrando de tudo que precisa ser feito, e pode se concentrar em realmente\n"
|
||||
"executar essas tarefas.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tt
|
||||
|
@ -3084,7 +3166,7 @@ msgstr "Erro!"
|
|||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_fr_rib
|
||||
msgid "French RIB Bank Details"
|
||||
msgstr ""
|
||||
msgstr "Detalhes do RIB do Banco Francês"
|
||||
|
||||
#. module: base
|
||||
#: view:res.lang:0
|
||||
|
@ -3200,12 +3282,12 @@ msgid ""
|
|||
"The decimal precision is configured per company.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Você precisa configurar a precisão do preço para diferentes tipos de uso: "
|
||||
"contabilidade, venda, compras, etc.\n"
|
||||
"Configurar a precisão preço que você precisa para diferentes tipos de uso: "
|
||||
"contabilidade, vendas, compras, etc\n"
|
||||
"============================================================================="
|
||||
"=========================\n"
|
||||
"\n"
|
||||
"A precisão decimal é configurada por empresa.\n"
|
||||
"A precisão decimal é configurado por empresa.\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_l10n_pl
|
||||
|
@ -3223,6 +3305,18 @@ msgid ""
|
|||
"że wszystkie towary są w obrocie hurtowym.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este é o módulo para gerenciar o gráfico contabilidade e impostos para a "
|
||||
"Polónia no OpenERP.\n"
|
||||
"================================================== "
|
||||
"================================\n"
|
||||
"\n"
|
||||
"To jest moduł do tworzenia wzorcowego planu kont i podstawowych ustawień do "
|
||||
"podatków\n"
|
||||
"VAT 0%, 7% i 22%. Moduł ustawia też konta do kupna i sprzedaży towarów "
|
||||
"zakładając,\n"
|
||||
"że wszystkie towary są w obrocie hurtowym.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:ir.actions.client,params_store:0
|
||||
|
@ -3258,6 +3352,21 @@ msgid ""
|
|||
"since it's the same which has been renamed.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo permite aos usuários executar a segmentação entre os parceiros.\n"
|
||||
"================================================== ===============\n"
|
||||
"\n"
|
||||
"Ele utiliza os critérios de perfis a partir do módulo de segmentação mais "
|
||||
"cedo e melhorá-lo. Graças ao novo conceito de questionário. Agora você pode "
|
||||
"reagrupar as perguntas em um questionário e usá-lo diretamente em um "
|
||||
"parceiro.\n"
|
||||
"\n"
|
||||
"Ele também foi fundida com a anterior ferramenta de CRM & SRM segmentação "
|
||||
"porque foram sobrepostos.\n"
|
||||
"\n"
|
||||
" * Nota: Este módulo não é compatível com o módulo de segmentação, já "
|
||||
"que é o mesmo que foi renomeado.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/report_sxw.py:434
|
||||
|
@ -3379,6 +3488,30 @@ msgid ""
|
|||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" \n"
|
||||
"Localização belga para as facturas em-e de saída (pré-requisito para "
|
||||
"account_coda):\n"
|
||||
" Rótulos 'referência' Renomear campo para 'Comunicação' -\n"
|
||||
" - Adicionar suporte para comunicação estruturada belga\n"
|
||||
"\n"
|
||||
"Uma comunicação estruturada pode ser gerado automaticamente em faturas de "
|
||||
"saída de acordo com os seguintes algoritmos:\n"
|
||||
" 1) aleatória: + + + RRR / RRRR / RRRDD + + +\n"
|
||||
" R. R =. Dígitos aleatórios, Dígitos DD = Verificar\n"
|
||||
" 2) Data: + + + DOY / ano / SSSDD + + +\n"
|
||||
" Doy = dia do ano, o SSS = número de seqüência, DD dígitos = "
|
||||
"Verificar)\n"
|
||||
" 3) Referência ao Cliente + + + RRR / RRRR / SSSDDD + + +\n"
|
||||
" R.. = R Referência do cliente sem caracteres não numéricos, SSS = "
|
||||
"Número sequencial, DD dígitos = Verificar)\n"
|
||||
" \n"
|
||||
"O tipo preferido de comunicação estruturada e algoritmo associado pode ser "
|
||||
"especificado nos registros de parceiros.\n"
|
||||
"Uma comunicação \"aleatória\" estruturado gerado se nenhum algoritmo é "
|
||||
"especificado no registro de parceiros. \n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_wiki_quality_manual
|
||||
|
@ -3515,6 +3648,14 @@ msgid ""
|
|||
"for Wiki FAQ.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo oferece um Wiki Modelo FAQ.\n"
|
||||
"=========================================\n"
|
||||
"\n"
|
||||
"Ele fornece dados de demonstração, criando um Grupo de wiki e uma página "
|
||||
"Wiki\n"
|
||||
"para Wiki FAQ.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.server:0
|
||||
|
@ -3789,6 +3930,13 @@ msgid ""
|
|||
" * the Tax Code Chart for Luxembourg\n"
|
||||
" * the main taxes used in Luxembourg"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este é o módulo de base para gerenciar o Plano Contábil de Luxemburgo.\n"
|
||||
"================================================== ====================\n"
|
||||
"\n"
|
||||
" * Quadro da KLUWER de Contas,\n"
|
||||
" * O Gráfico Código Tributário para o Luxemburgo\n"
|
||||
" * Os principais impostos usados no Luxemburgo"
|
||||
|
||||
#. module: base
|
||||
#: field:ir.module.module,demo:0
|
||||
|
@ -3813,6 +3961,21 @@ msgid ""
|
|||
"module 'share'.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo define \"portais\" para personalizar o acesso ao seu banco de "
|
||||
"dados OpenERP\n"
|
||||
"para usuários externos.\n"
|
||||
"\n"
|
||||
"Um portal define menu de usuário personalizada e direitos de acesso para um "
|
||||
"grupo de usuários\n"
|
||||
"(os associados a esse portal). Ela também se associa grupos de usuários para "
|
||||
"o\n"
|
||||
"usuários do portal (adicionando um grupo no portal adiciona automaticamente "
|
||||
"para o portal\n"
|
||||
"usuários, etc.) Essa característica é muito útil quando utilizada em "
|
||||
"combinação com a\n"
|
||||
"'share' módulo.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: selection:res.request,priority:0
|
||||
|
@ -3959,6 +4122,22 @@ msgid ""
|
|||
"\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo oferece alguns recursos para melhorar o layout das faturas.\n"
|
||||
"================================================== =======================\n"
|
||||
"\n"
|
||||
"Ele lhe dá a possibilidade de:\n"
|
||||
"--------------------------------\n"
|
||||
" * Ordem todas as linhas de uma fatura\n"
|
||||
" * Adicionar títulos, linhas de comentário, sub total de linhas\n"
|
||||
" * Desenhar linhas horizontais e colocar quebras de página\n"
|
||||
"\n"
|
||||
"Além disso, há uma opção que permite a impressão de todas as faturas "
|
||||
"selecionados com uma mensagem dada especial na parte inferior do mesmo. Este "
|
||||
"recurso pode ser muito útil para imprimir as suas facturas com o fim-de-ano "
|
||||
"desejos, condições especiais pontuais.\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: constraint:res.partner:0
|
||||
|
@ -4156,6 +4335,14 @@ msgid ""
|
|||
"templates to target objects.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" * Apoio a Multi Idiomas de Plano de Contas, Impostos, códigos fiscais, "
|
||||
"diários, Modelos de Contabilidade,\n"
|
||||
" Plano de Contas Analítico e Diários analíticos.\n"
|
||||
" * Assistente de Configuração mudanças\n"
|
||||
" - Copia traduções para COA, Imposto de Código Tributário, e Posição "
|
||||
"Fiscal a partir de modelos para objetos de destino.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: view:ir.actions.todo:0
|
||||
|
@ -4547,6 +4734,15 @@ msgid ""
|
|||
"automatically new claims based on incoming emails.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo permite que você acompanhe as solicitações de seus clientes / "
|
||||
"fornecedores.\n"
|
||||
"================================================== "
|
||||
"==============================\n"
|
||||
"\n"
|
||||
"É totalmente integrado com o gateway de e-mail para que você possa criar\n"
|
||||
"automaticamente novos pedidos baseados em e-mails recebidos.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: selection:workflow.activity,join_mode:0
|
||||
|
@ -6667,6 +6863,26 @@ msgid ""
|
|||
"an other object.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo permite que você gerencie seus contatos\n"
|
||||
"==============================================\n"
|
||||
"\n"
|
||||
"Ele permite que você definir:\n"
|
||||
" * Contatos não relacionados a um parceiro,\n"
|
||||
" * Contatos trabalhando em vários endereços (possivelmente para "
|
||||
"parceiros diferentes),\n"
|
||||
" * Contatos com funções possivelmente diferentes para cada um dos "
|
||||
"endereços do seu trabalho\n"
|
||||
"\n"
|
||||
"Ele também adiciona novos itens de menu localizado na\n"
|
||||
" Compras / Livro de Endereços / Contatos\n"
|
||||
" Vendas / Livro de Endereços / Contatos\n"
|
||||
"\n"
|
||||
"Preste atenção que este módulo converte os endereços existentes em "
|
||||
"\"endereços + contatos\". Isso significa que alguns campos dos endereços vai "
|
||||
"estar ausente (como o nome do contato), uma vez que estes devem ser "
|
||||
"definidos em um outro objeto.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.act_res_partner_event
|
||||
|
@ -8017,6 +8233,14 @@ msgid ""
|
|||
"that exceeds minimum amount set by configuration wizard.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Dupla-validação para compras superiores a quantidade mínima.\n"
|
||||
"================================================== =======\n"
|
||||
"\n"
|
||||
"Este módulo modifica o fluxo de trabalho de compra, a fim de validar "
|
||||
"compras\n"
|
||||
"que exceder o valor mínimo fixado pelo assistente de configuração.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:res.currency,rounding:0
|
||||
|
@ -14393,6 +14617,15 @@ msgid ""
|
|||
"plans.\n"
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"O módulo base para gerenciar a distribuição analítica e ordens de compra.\n"
|
||||
"================================================== ==================\n"
|
||||
"\n"
|
||||
"Permite que o usuário manter planos de análise diversas. Estes permitem-lhe "
|
||||
"dividir\n"
|
||||
"uma linha em um pedido de compra de fornecedores em várias contas e planos "
|
||||
"analíticos.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: field:res.company,vat:0
|
||||
|
|
|
@ -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: 2012-09-20 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-25 04:44+0000\n"
|
||||
"X-Generator: Launchpad (build 16019)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:35+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:10+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:40+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:15+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:19+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:41+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:16+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:43+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:18+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:17+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -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: 2012-09-20 04:42+0000\n"
|
||||
"X-Generator: Launchpad (build 15985)\n"
|
||||
"X-Launchpad-Export-Date: 2012-10-04 05:18+0000\n"
|
||||
"X-Generator: Launchpad (build 16061)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sh
|
||||
|
|
|
@ -1147,75 +1147,6 @@
|
|||
<menuitem action="action_model_relation" id="ir_model_relation_menu" parent="base.next_id_9"
|
||||
groups="base.group_no_one"/>
|
||||
|
||||
<!-- Translations -->
|
||||
|
||||
<record id="view_translation_search" model="ir.ui.view">
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Translations">
|
||||
<filter icon="terp-gdu-smart-failing"
|
||||
string="Untranslated"
|
||||
domain="['|',('value', '=', False),('value','=','')]"/>
|
||||
<field name="name" operator="="/>
|
||||
<field name="lang"/>
|
||||
<field name="src"/>
|
||||
<field name="value"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_translation_form" model="ir.ui.view">
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Translations" version="7.0">
|
||||
<header>
|
||||
<field name="state" widget="statusbar" nolabel="1"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="lang"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="type"/>
|
||||
<field name="res_id"/>
|
||||
</group>
|
||||
<group string="Source Term">
|
||||
<field name="src" nolabel="1" height="400"/>
|
||||
</group>
|
||||
<group string="Translation">
|
||||
<field name="value" nolabel="1" height="400"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_translation_tree" model="ir.ui.view">
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Translations" editable="bottom">
|
||||
<field name="src" readonly="True"/>
|
||||
<field name="value"/>
|
||||
<field name="name" readonly="True"/>
|
||||
<field name="lang" readonly="True"/>
|
||||
<field name="type" readonly="True"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_translation" model="ir.actions.act_window">
|
||||
<field name="name">Translated Terms</field>
|
||||
<field name="res_model">ir.translation</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="view_translation_tree"/>
|
||||
</record>
|
||||
<menuitem action="action_translation" id="menu_action_translation" parent="base.menu_translation_app" />
|
||||
|
||||
<!--
|
||||
=============================================================
|
||||
Menu Edition
|
||||
|
|
|
@ -329,7 +329,7 @@ class act_wizard(osv.osv):
|
|||
act_wizard()
|
||||
|
||||
class act_url(osv.osv):
|
||||
_name = 'ir.actions.url'
|
||||
_name = 'ir.actions.act_url'
|
||||
_table = 'ir_act_url'
|
||||
_sequence = 'ir_actions_id_seq'
|
||||
_order = 'name'
|
||||
|
|
|
@ -19,10 +19,12 @@
|
|||
#
|
||||
##############################################################################
|
||||
|
||||
from osv import fields, osv
|
||||
import tools
|
||||
import logging
|
||||
|
||||
import openerp.modules
|
||||
from openerp.osv import fields, osv
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
TRANSLATION_TYPE = [
|
||||
|
@ -57,7 +59,6 @@ class ir_translation_import_cursor(object):
|
|||
the data.
|
||||
@param parent an instance of ir.translation ORM model
|
||||
"""
|
||||
|
||||
self._cr = cr
|
||||
self._uid = uid
|
||||
self._context = context
|
||||
|
@ -67,29 +68,23 @@ class ir_translation_import_cursor(object):
|
|||
|
||||
# Note that Postgres will NOT inherit the constraints or indexes
|
||||
# of ir_translation, so this copy will be much faster.
|
||||
|
||||
cr.execute('''CREATE TEMP TABLE %s(
|
||||
imd_model VARCHAR(64),
|
||||
imd_module VARCHAR(64),
|
||||
imd_name VARCHAR(128)
|
||||
) INHERITS (%s) ''' % (self._table_name, self._parent_table))
|
||||
|
||||
def push(self, ddict):
|
||||
def push(self, trans_dict):
|
||||
"""Feed a translation, as a dictionary, into the cursor
|
||||
"""
|
||||
state = "translated" if (ddict['value'] and ddict['value'] != "") else "to_translate"
|
||||
self._cr.execute("INSERT INTO " + self._table_name \
|
||||
+ """(name, lang, res_id, src, type,
|
||||
imd_model, imd_module, imd_name, value,state)
|
||||
VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
|
||||
(ddict['name'], ddict['lang'], ddict.get('res_id'), ddict['src'], ddict['type'],
|
||||
ddict.get('imd_model'), ddict.get('imd_module'), ddict.get('imd_name'),
|
||||
ddict['value'],state))
|
||||
params = dict(trans_dict, state="translated" if trans_dict['value'] else "to_translate")
|
||||
self._cr.execute("""INSERT INTO %s (name, lang, res_id, src, type, imd_model, module, imd_name, value, state, comments)
|
||||
VALUES (%%(name)s, %%(lang)s, %%(res_id)s, %%(src)s, %%(type)s, %%(imd_model)s, %%(module)s,
|
||||
%%(imd_name)s, %%(value)s, %%(state)s, %%(comments)s)""" % self._table_name,
|
||||
params)
|
||||
|
||||
def finish(self):
|
||||
""" Transfer the data from the temp table to ir.translation
|
||||
"""
|
||||
|
||||
cr = self._cr
|
||||
if self._debug:
|
||||
cr.execute("SELECT count(*) FROM %s" % self._table_name)
|
||||
|
@ -101,22 +96,21 @@ class ir_translation_import_cursor(object):
|
|||
SET res_id = imd.res_id
|
||||
FROM ir_model_data AS imd
|
||||
WHERE ti.res_id IS NULL
|
||||
AND ti.imd_module IS NOT NULL AND ti.imd_name IS NOT NULL
|
||||
AND ti.module IS NOT NULL AND ti.imd_name IS NOT NULL
|
||||
|
||||
AND ti.imd_module = imd.module AND ti.imd_name = imd.name
|
||||
AND ti.module = imd.module AND ti.imd_name = imd.name
|
||||
AND ti.imd_model = imd.model; """ % self._table_name)
|
||||
|
||||
if self._debug:
|
||||
cr.execute("SELECT imd_module, imd_model, imd_name FROM %s " \
|
||||
"WHERE res_id IS NULL AND imd_module IS NOT NULL" % self._table_name)
|
||||
cr.execute("SELECT module, imd_model, imd_name FROM %s " \
|
||||
"WHERE res_id IS NULL AND module IS NOT NULL" % self._table_name)
|
||||
for row in cr.fetchall():
|
||||
_logger.debug("ir.translation.cursor: missing res_id for %s. %s/%s ", *row)
|
||||
|
||||
cr.execute("DELETE FROM %s WHERE res_id IS NULL AND imd_module IS NOT NULL" % \
|
||||
self._table_name)
|
||||
|
||||
# Records w/o res_id must _not_ be inserted into our db, because they are
|
||||
# referencing non-existent data.
|
||||
cr.execute("DELETE FROM %s WHERE res_id IS NULL AND module IS NOT NULL" % \
|
||||
self._table_name)
|
||||
|
||||
find_expr = "irt.lang = ti.lang AND irt.type = ti.type " \
|
||||
" AND irt.name = ti.name AND irt.src = ti.src " \
|
||||
|
@ -126,15 +120,14 @@ class ir_translation_import_cursor(object):
|
|||
if self._overwrite:
|
||||
cr.execute("""UPDATE ONLY %s AS irt
|
||||
SET value = ti.value,
|
||||
state = 'translated'
|
||||
state = 'translated'
|
||||
FROM %s AS ti
|
||||
WHERE %s AND ti.value IS NOT NULL AND ti.value != ''
|
||||
""" % (self._parent_table, self._table_name, find_expr))
|
||||
|
||||
# Step 3: insert new translations
|
||||
|
||||
cr.execute("""INSERT INTO %s(name, lang, res_id, src, type, value,state)
|
||||
SELECT name, lang, res_id, src, type, value,state
|
||||
cr.execute("""INSERT INTO %s(name, lang, res_id, src, type, value, module, state, comments)
|
||||
SELECT name, lang, res_id, src, type, value, module, state, comments
|
||||
FROM %s AS ti
|
||||
WHERE NOT EXISTS(SELECT 1 FROM ONLY %s AS irt WHERE %s);
|
||||
""" % (self._parent_table, self._table_name, self._parent_table, find_expr))
|
||||
|
@ -162,26 +155,37 @@ class ir_translation(osv.osv):
|
|||
return [(d['code'], d['name']) for d in lang_data]
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Field Name', size=128, required=True),
|
||||
'res_id': fields.integer('Resource ID', select=True),
|
||||
'lang': fields.selection(_get_language, string='Language', size=16),
|
||||
'type': fields.selection(TRANSLATION_TYPE, string='Type', size=16, select=True),
|
||||
'name': fields.char('Translated field', required=True),
|
||||
'res_id': fields.integer('Record ID', select=True),
|
||||
'lang': fields.selection(_get_language, string='Language'),
|
||||
'type': fields.selection(TRANSLATION_TYPE, string='Type', select=True),
|
||||
'src': fields.text('Source'),
|
||||
'value': fields.text('Translation Value'),
|
||||
'state':fields.selection([('to_translate','To Translate'),('inprogress','Translation in Progress'),('translated','Translated')])
|
||||
'module': fields.char('Module', help="Module this term belongs to", select=True),
|
||||
|
||||
'state': fields.selection(
|
||||
[('to_translate','To Translate'),
|
||||
('inprogress','Translation in Progress'),
|
||||
('translated','Translated')],
|
||||
string="State",
|
||||
help="Automatically set to let administators find new terms that might need to be translated"),
|
||||
|
||||
# aka gettext extracted-comments - we use them to flag openerp-web translation
|
||||
# cfr: http://www.gnu.org/savannah-checkouts/gnu/gettext/manual/html_node/PO-Files.html
|
||||
'comments': fields.text('Translation comments', select=True),
|
||||
}
|
||||
|
||||
|
||||
_defaults = {
|
||||
'state':'to_translate',
|
||||
'state': 'to_translate',
|
||||
}
|
||||
|
||||
_sql_constraints = [ ('lang_fkey_res_lang', 'FOREIGN KEY(lang) REFERENCES res_lang(code)',
|
||||
|
||||
_sql_constraints = [ ('lang_fkey_res_lang', 'FOREIGN KEY(lang) REFERENCES res_lang(code)',
|
||||
'Language code of translation item must be among known languages' ), ]
|
||||
|
||||
def _auto_init(self, cr, context=None):
|
||||
super(ir_translation, self)._auto_init(cr, context)
|
||||
|
||||
# FIXME: there is a size limit on btree indexed values so we can't index src column with normal btree.
|
||||
# FIXME: there is a size limit on btree indexed values so we can't index src column with normal btree.
|
||||
cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('ir_translation_ltns',))
|
||||
if cr.fetchone():
|
||||
#temporarily removed: cr.execute('CREATE INDEX ir_translation_ltns ON ir_translation (name, lang, type, src)')
|
||||
|
@ -207,7 +211,7 @@ class ir_translation(osv.osv):
|
|||
if field == 'lang':
|
||||
return
|
||||
return super(ir_translation, self)._check_selection_field_value(cr, uid, field, value, context=context)
|
||||
|
||||
|
||||
@tools.ormcache_multi(skiparg=3, multi=6)
|
||||
def _get_ids(self, cr, uid, name, tt, lang, ids):
|
||||
translations = dict.fromkeys(ids, False)
|
||||
|
@ -271,10 +275,10 @@ class ir_translation(osv.osv):
|
|||
if isinstance(types, basestring):
|
||||
types = (types,)
|
||||
if source:
|
||||
query = """SELECT value
|
||||
FROM ir_translation
|
||||
WHERE lang=%s
|
||||
AND type in %s
|
||||
query = """SELECT value
|
||||
FROM ir_translation
|
||||
WHERE lang=%s
|
||||
AND type in %s
|
||||
AND src=%s"""
|
||||
params = (lang or '', types, tools.ustr(source))
|
||||
if name:
|
||||
|
@ -308,9 +312,9 @@ class ir_translation(osv.osv):
|
|||
if isinstance(ids, (int, long)):
|
||||
ids = [ids]
|
||||
if vals.get('src') or ('value' in vals and not(vals.get('value'))):
|
||||
result = vals.update({'state':'to_translate'})
|
||||
vals.update({'state':'to_translate'})
|
||||
if vals.get('value'):
|
||||
result = vals.update({'state':'translated'})
|
||||
vals.update({'state':'translated'})
|
||||
result = super(ir_translation, self).write(cursor, user, ids, vals, context=context)
|
||||
for trans_obj in self.read(cursor, user, ids, ['name','type','res_id','src','lang'], context=context):
|
||||
self._get_source.clear_cache(self, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], trans_obj['src'])
|
||||
|
@ -379,7 +383,34 @@ class ir_translation(osv.osv):
|
|||
"""
|
||||
return ir_translation_import_cursor(cr, uid, self, context=context)
|
||||
|
||||
ir_translation()
|
||||
def load(self, cr, modules, langs, context=None):
|
||||
context = dict(context or {}) # local copy
|
||||
for module_name in modules:
|
||||
modpath = openerp.modules.get_module_path(module_name)
|
||||
if not modpath:
|
||||
continue
|
||||
for lang in langs:
|
||||
lang_code = tools.get_iso_codes(lang)
|
||||
base_lang_code = None
|
||||
if '_' in lang_code:
|
||||
base_lang_code = lang_code.split('_')[0]
|
||||
|
||||
# Step 1: for sub-languages, load base language first (e.g. es_CL.po is loaded over es.po)
|
||||
if base_lang_code:
|
||||
base_trans_file = openerp.modules.get_module_resource(module_name, 'i18n', base_lang_code + '.po')
|
||||
if base_trans_file:
|
||||
_logger.info('module %s: loading base translation file %s for language %s', module_name, base_lang_code, lang)
|
||||
tools.trans_load(cr, base_trans_file, lang, verbose=False, module_name=module_name, context=context)
|
||||
context['overwrite'] = True # make sure the requested translation will override the base terms later
|
||||
|
||||
# Step 2: then load the main translation file, possibly overriding the terms coming from the base language
|
||||
trans_file = openerp.modules.get_module_resource(module_name, 'i18n', lang_code + '.po')
|
||||
if trans_file:
|
||||
_logger.info('module %s: loading translation file (%s) for language %s', module_name, lang_code, lang)
|
||||
tools.trans_load(cr, trans_file, lang, verbose=False, module_name=module_name, context=context)
|
||||
elif lang_code != 'en':
|
||||
_logger.warning('module %s: no translation for language %s', module_name, lang_code)
|
||||
return True
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
<openerp>
|
||||
<data>
|
||||
<!-- Translations -->
|
||||
<record id="view_translation_search" model="ir.ui.view">
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="Translations">
|
||||
<filter icon="terp-gdu-smart-failing"
|
||||
string="Untranslated"
|
||||
domain="['|',('value', '=', False),('value','=','')]"/>
|
||||
<filter name="openerp-web"
|
||||
string="Web-only translations"
|
||||
domain="[('comments', 'like', 'openerp-web')]"/>
|
||||
<field name="name" operator="="/>
|
||||
<field name="lang"/>
|
||||
<field name="src"/>
|
||||
<field name="value"/>
|
||||
</search>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="view_translation_form" model="ir.ui.view">
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Translations" version="7.0">
|
||||
<header>
|
||||
<field name="state" widget="statusbar" nolabel="1"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="lang"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="type"/>
|
||||
<field name="res_id"/>
|
||||
</group>
|
||||
<group string="Source Term">
|
||||
<field name="src" nolabel="1" height="400"/>
|
||||
</group>
|
||||
<group string="Translation">
|
||||
<field name="value" nolabel="1" height="400"/>
|
||||
</group>
|
||||
<group string="Comments">
|
||||
<field name="comments" nolabel="1" height="100"/>
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
<record id="view_translation_tree" model="ir.ui.view">
|
||||
<field name="name">Translations</field>
|
||||
<field name="model">ir.translation</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Translations" editable="bottom">
|
||||
<field name="src" readonly="True"/>
|
||||
<field name="value"/>
|
||||
<field name="name" readonly="True"/>
|
||||
<field name="lang" readonly="True"/>
|
||||
<field name="type" readonly="True"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_translation" model="ir.actions.act_window">
|
||||
<field name="name">Translated Terms</field>
|
||||
<field name="res_model">ir.translation</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="view_translation_tree"/>
|
||||
</record>
|
||||
|
||||
<menuitem action="action_translation" id="menu_action_translation" parent="base.menu_translation_app" />
|
||||
|
||||
</data>
|
||||
</openerp>
|
|
@ -298,7 +298,7 @@ class ir_ui_menu(osv.osv):
|
|||
('ir.actions.report.xml', 'ir.actions.report.xml'),
|
||||
('ir.actions.act_window', 'ir.actions.act_window'),
|
||||
('ir.actions.wizard', 'ir.actions.wizard'),
|
||||
('ir.actions.url', 'ir.actions.url'),
|
||||
('ir.actions.act_url', 'ir.actions.act_url'),
|
||||
('ir.actions.server', 'ir.actions.server'),
|
||||
('ir.actions.client', 'ir.actions.client'),
|
||||
]),
|
||||
|
|
|
@ -19,6 +19,5 @@
|
|||
#
|
||||
##############################################################################
|
||||
import wizard_menu
|
||||
import wizard_screen
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
||||
|
|
|
@ -47,25 +47,6 @@ class wizard_model_menu(osv.osv_memory):
|
|||
'icon': 'STOCK_INDENT'
|
||||
}, context)
|
||||
return {'type':'ir.actions.act_window_close'}
|
||||
wizard_model_menu()
|
||||
|
||||
class wizard_model_menu_line(osv.osv_memory):
|
||||
_name = 'wizard.ir.model.menu.create.line'
|
||||
_columns = {
|
||||
'wizard_id': fields.many2one('wizard.ir.model.menu.create','Wizard'),
|
||||
'sequence': fields.integer('Sequence'),
|
||||
'view_type': fields.selection([
|
||||
('tree','Tree'),
|
||||
('form','Form'),
|
||||
('graph','Graph'),
|
||||
('calendar','Calendar'),
|
||||
('gantt','Gantt')],'View Type',required=True),
|
||||
'view_id': fields.many2one('ir.ui.view', 'View'),
|
||||
}
|
||||
_defaults = {
|
||||
'view_type': lambda self,cr,uid,ctx: 'tree'
|
||||
}
|
||||
wizard_model_menu_line()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# Copyright (C) 2010 OpenERP s.a. (<http://www.openerp.com>).
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
# published by the Free Software Foundation, either version 3 of the
|
||||
# License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Affero General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
##############################################################################
|
||||
import base64
|
||||
import os
|
||||
import random
|
||||
|
||||
import tools
|
||||
from osv import fields,osv
|
||||
|
||||
# Simple base class for wizards that wish to use random images on the left
|
||||
# side of the form.
|
||||
class wizard_screen(osv.osv_memory):
|
||||
_name = 'ir.wizard.screen'
|
||||
|
||||
def _get_image(self, cr, uid, context=None):
|
||||
path = os.path.join('base','res','config_pixmaps','%d.png'%random.randrange(1,4))
|
||||
image_file = file_data = tools.file_open(path,'rb')
|
||||
try:
|
||||
file_data = image_file.read()
|
||||
return base64.encodestring(file_data)
|
||||
finally:
|
||||
image_file.close()
|
||||
|
||||
def _get_image_fn(self, cr, uid, ids, name, args, context=None):
|
||||
image = self._get_image(cr, uid, context)
|
||||
return dict.fromkeys(ids, image) # ok to use .fromkeys() as the image is same for all
|
||||
|
||||
_columns = {
|
||||
'config_logo': fields.function(_get_image_fn, string='Image', type='binary'),
|
||||
}
|
||||
|
||||
_defaults = {
|
||||
'config_logo': _get_image
|
||||
}
|
||||
wizard_screen()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -627,45 +627,14 @@ class module(osv.osv):
|
|||
self.write(cr, uid, [mod_browse.id], {'category_id': p_id})
|
||||
|
||||
def update_translations(self, cr, uid, ids, filter_lang=None, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
if not filter_lang:
|
||||
pool = pooler.get_pool(cr.dbname)
|
||||
lang_obj = pool.get('res.lang')
|
||||
lang_ids = lang_obj.search(cr, uid, [('translatable', '=', True)])
|
||||
filter_lang = [lang.code for lang in lang_obj.browse(cr, uid, lang_ids)]
|
||||
res_lang = self.pool.get('res.lang')
|
||||
lang_ids = res_lang.search(cr, uid, [('translatable', '=', True)])
|
||||
filter_lang = [lang.code for lang in res_lang.browse(cr, uid, lang_ids)]
|
||||
elif not isinstance(filter_lang, (list, tuple)):
|
||||
filter_lang = [filter_lang]
|
||||
|
||||
for mod in self.browse(cr, uid, ids):
|
||||
if mod.state != 'installed':
|
||||
continue
|
||||
modpath = modules.get_module_path(mod.name)
|
||||
if not modpath:
|
||||
# unable to find the module. we skip
|
||||
continue
|
||||
for lang in filter_lang:
|
||||
iso_lang = tools.get_iso_codes(lang)
|
||||
f = modules.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
|
||||
context2 = context and context.copy() or {}
|
||||
if f and '_' in iso_lang:
|
||||
iso_lang2 = iso_lang.split('_')[0]
|
||||
f2 = modules.get_module_resource(mod.name, 'i18n', iso_lang2 + '.po')
|
||||
if f2:
|
||||
_logger.info('module %s: loading base translation file %s for language %s', mod.name, iso_lang2, lang)
|
||||
tools.trans_load(cr, f2, lang, verbose=False, context=context)
|
||||
context2['overwrite'] = True
|
||||
# Implementation notice: we must first search for the full name of
|
||||
# the language derivative, like "en_UK", and then the generic,
|
||||
# like "en".
|
||||
if (not f) and '_' in iso_lang:
|
||||
iso_lang = iso_lang.split('_')[0]
|
||||
f = modules.get_module_resource(mod.name, 'i18n', iso_lang + '.po')
|
||||
if f:
|
||||
_logger.info('module %s: loading translation file (%s) for language %s', mod.name, iso_lang, lang)
|
||||
tools.trans_load(cr, f, lang, verbose=False, context=context2)
|
||||
elif iso_lang != 'en':
|
||||
_logger.warning('module %s: no translation for language %s', mod.name, iso_lang)
|
||||
modules = [m.name for m in self.browse(cr, uid, ids) if m.state == 'installed']
|
||||
self.pool.get('ir.translation').load(cr, modules, filter_lang, context=context)
|
||||
|
||||
def check(self, cr, uid, ids, context=None):
|
||||
for mod in self.browse(cr, uid, ids, context=context):
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
##############################################################################
|
||||
#
|
||||
# OpenERP, Open Source Management Solution
|
||||
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
|
||||
# OpenERP, Open Source Business Applications
|
||||
# Copyright (c) 2004-2012 OpenERP S.A. <http://openerp.com>
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Affero General Public License as
|
||||
|
@ -22,68 +22,58 @@
|
|||
import tools
|
||||
import base64
|
||||
import cStringIO
|
||||
import pooler
|
||||
from osv import fields,osv
|
||||
from tools.translate import _
|
||||
from tools.misc import get_iso_codes
|
||||
|
||||
NEW_LANG_KEY = '__new__'
|
||||
|
||||
class base_language_export(osv.osv_memory):
|
||||
_name = "base.language.export"
|
||||
|
||||
def _get_languages(self, cr, uid, context):
|
||||
lang_obj=pooler.get_pool(cr.dbname).get('res.lang')
|
||||
ids=lang_obj.search(cr, uid, ['&', ('active', '=', True), ('translatable', '=', True),])
|
||||
langs=lang_obj.browse(cr, uid, ids)
|
||||
return [(lang.code, lang.name) for lang in langs]
|
||||
|
||||
def act_cancel(self, cr, uid, ids, context=None):
|
||||
#self.unlink(cr, uid, ids, context)
|
||||
return {'type':'ir.actions.act_window_close' }
|
||||
|
||||
def act_destroy(self, *args):
|
||||
return {'type':'ir.actions.act_window_close' }
|
||||
lang_obj = self.pool.get('res.lang')
|
||||
ids = lang_obj.search(cr, uid, [('translatable', '=', True)])
|
||||
langs = lang_obj.browse(cr, uid, ids)
|
||||
return [(NEW_LANG_KEY, _('New Language (Empty translation template)'))] + [(lang.code, lang.name) for lang in langs]
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('File Name', readonly=True),
|
||||
'lang': fields.selection(_get_languages, 'Language', required=True),
|
||||
'format': fields.selection([('csv','CSV File'),
|
||||
('po','PO File'),
|
||||
('tgz', 'TGZ Archive')], 'File Format', required=True),
|
||||
'modules': fields.many2many('ir.module.module', 'rel_modules_langexport', 'wiz_id', 'module_id', 'Modules To Export', domain=[('state','=','installed')]),
|
||||
'data': fields.binary('File', readonly=True),
|
||||
'state': fields.selection([('choose', 'choose'), # choose language
|
||||
('get', 'get')]) # get the file
|
||||
}
|
||||
_defaults = {
|
||||
'state': 'choose',
|
||||
'name': 'lang.tar.gz',
|
||||
'lang': NEW_LANG_KEY,
|
||||
'format': 'csv',
|
||||
}
|
||||
|
||||
def act_getfile(self, cr, uid, ids, context=None):
|
||||
this = self.browse(cr, uid, ids)[0]
|
||||
lang = this.lang if this.lang != NEW_LANG_KEY else False
|
||||
mods = map(lambda m: m.name, this.modules) or ['all']
|
||||
mods.sort()
|
||||
buf=cStringIO.StringIO()
|
||||
tools.trans_export(this.lang, mods, buf, this.format, cr)
|
||||
if this.format == 'csv':
|
||||
this.advice = _("Save this document to a .CSV file and open it with your favourite spreadsheet software. The file encoding is UTF-8. You have to translate the latest column before reimporting it.")
|
||||
elif this.format == 'po':
|
||||
if not this.lang:
|
||||
this.format = 'pot'
|
||||
this.advice = _("Save this document to a %s file and edit it with a specific software or a text editor. The file encoding is UTF-8.") % ('.'+this.format,)
|
||||
elif this.format == 'tgz':
|
||||
ext = this.lang and '.po' or '.pot'
|
||||
this.advice = _('Save this document to a .tgz file. This archive containt UTF-8 %s files and may be uploaded to launchpad.') % (ext,)
|
||||
filename = _('new')
|
||||
if not this.lang and len(mods) == 1:
|
||||
buf = cStringIO.StringIO()
|
||||
tools.trans_export(lang, mods, buf, this.format, cr)
|
||||
filename = 'new'
|
||||
if lang:
|
||||
filename = get_iso_codes(lang)
|
||||
elif len(mods) == 1:
|
||||
filename = mods[0]
|
||||
if this.lang:
|
||||
filename = get_iso_codes(this.lang)
|
||||
this.name = "%s.%s" % (filename, this.format)
|
||||
out=base64.encodestring(buf.getvalue())
|
||||
out = base64.encodestring(buf.getvalue())
|
||||
buf.close()
|
||||
return self.write(cr, uid, ids, {'state':'get', 'data':out, 'advice':this.advice, 'name':this.name}, context=context)
|
||||
self.write(cr, uid, ids, {'state': 'get',
|
||||
'data': out,
|
||||
'name':this.name}, context=context)
|
||||
return True
|
||||
|
||||
_name = "base.language.export"
|
||||
_inherit = "ir.wizard.screen"
|
||||
_columns = {
|
||||
'name': fields.char('File Name', 16, readonly=True),
|
||||
'lang': fields.selection(_get_languages, 'Language', help='To export a new language, do not select a language.'), # not required: unset = new language
|
||||
'format': fields.selection( ( ('csv','CSV File'), ('po','PO File'), ('tgz', 'TGZ Archive')), 'File Format', required=True),
|
||||
'modules': fields.many2many('ir.module.module', 'rel_modules_langexport', 'wiz_id', 'module_id', 'Modules', domain=[('state','=','installed')]),
|
||||
'data': fields.binary('File', readonly=True),
|
||||
'advice': fields.text('Advice', readonly=True),
|
||||
'state': fields.selection( ( ('choose','choose'), # choose language
|
||||
('get','get'), # get the file
|
||||
) ),
|
||||
}
|
||||
_defaults = {
|
||||
'state': lambda *a: 'choose',
|
||||
'name': lambda *a: 'lang.tar.gz'
|
||||
}
|
||||
base_language_export()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -1,31 +1,43 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data>
|
||||
|
||||
<record id="wizard_lang_export" model="ir.ui.view">
|
||||
<field name="name">Export Translations</field>
|
||||
<field name="model">base.language.export</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Export Translations" version="7.0">
|
||||
<group colspan="4" states="choose">
|
||||
<separator colspan="4" string="Export Translation"/>
|
||||
<field invisible="1" name="state"/>
|
||||
<field name="name" invisible="1"/>
|
||||
<group states="choose" string="Export Settings">
|
||||
<field name="lang"/>
|
||||
<field name="format" required="1"/>
|
||||
<field name="modules" nolabel="1"/>
|
||||
<field invisible="1" name="state"/>
|
||||
</group>
|
||||
<group colspan="4" states="get">
|
||||
<separator string="Export done" colspan="4"/>
|
||||
<field name="name" invisible="1" colspan="4"/>
|
||||
<field name="data" nolabel="1" readonly="1" filename="name" colspan="4"/>
|
||||
<field height="80" name="advice" nolabel="1" colspan="4"/>
|
||||
<field name="format"/>
|
||||
<field name="modules"/>
|
||||
</group>
|
||||
<div states="get">
|
||||
<h2>Export Complete</h2>
|
||||
<p>Here is the exported translation file: <field name="data" readonly="1" filename="name"/></p>
|
||||
<p>This file was generated using the universal <strong>Unicode/UTF-8</strong> file encoding, please be sure to view and edit
|
||||
using the same encoding.</p>
|
||||
<p>The next step depends on the file format:
|
||||
<ul>
|
||||
<li>CSV format: you may edit it directly with your favorite spreadsheet software,
|
||||
the rightmost column (value) contains the translations</li>
|
||||
<li>PO(T) format: you should edit it with a PO editor such as
|
||||
<a href="http://www.poedit.net/" target="_blank">POEdit</a>, or your preferred text editor</li>
|
||||
<li>TGZ format: this is a compressed archive containing a PO file, directly suitable
|
||||
for uploading to OpenERP's translation platform,
|
||||
<a href="https://translations.launchpad.net/openobject-addons" target="_blank">Launchpad</a></li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>For more details about translating OpenERP in your language, please refer to the
|
||||
<a href="http://doc.openerp.com/v6.1/contribute/07_improving_translations.html" target="_blank">documentation</a>.</p>
|
||||
</div>
|
||||
<footer states="choose">
|
||||
<button name="act_getfile" string="_Export" type="object" class="oe_highlight"/> or
|
||||
<button name="act_cancel" special="cancel" string="_Cancel" type="object" class="oe_link"/>
|
||||
<button name="act_getfile" string="Export" type="object" class="oe_highlight"/> or
|
||||
<button special="cancel" string="Cancel" type="object" class="oe_link"/>
|
||||
</footer>
|
||||
<footer states="get">
|
||||
<button name="act_cancel" special="cancel" string="_Close" type="object"/>
|
||||
<button special="cancel" string="Close" type="object"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
@ -29,11 +29,9 @@ class base_language_import(osv.osv_memory):
|
|||
|
||||
_name = "base.language.import"
|
||||
_description = "Language Import"
|
||||
_inherit = "ir.wizard.screen"
|
||||
|
||||
_columns = {
|
||||
'name': fields.char('Language Name',size=64 , required=True),
|
||||
'code': fields.char('Code (eg:en__US)',size=5 , required=True),
|
||||
'name': fields.char('Language Name', size=64 , required=True),
|
||||
'code': fields.char('ISO Code', size=5, help="ISO Language and Country code, e.g. en_US", required=True),
|
||||
'data': fields.binary('File', required=True),
|
||||
'overwrite': fields.boolean('Overwrite Existing Terms',
|
||||
help="If you enable this option, existing translations (including custom ones) "
|
||||
|
@ -41,31 +39,25 @@ class base_language_import(osv.osv_memory):
|
|||
}
|
||||
|
||||
def import_lang(self, cr, uid, ids, context=None):
|
||||
"""
|
||||
Import Language
|
||||
@param cr: the current row, from the database cursor.
|
||||
@param uid: the current user’s ID for security checks.
|
||||
@param ids: the ID or list of IDs
|
||||
@param context: A standard dictionary
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
import_data = self.browse(cr, uid, ids)[0]
|
||||
if import_data.overwrite:
|
||||
this = self.browse(cr, uid, ids[0])
|
||||
if this.overwrite:
|
||||
context.update(overwrite=True)
|
||||
fileobj = TemporaryFile('w+')
|
||||
fileobj.write(base64.decodestring(import_data.data))
|
||||
try:
|
||||
fileobj.write(base64.decodestring(this.data))
|
||||
|
||||
# now we determine the file format
|
||||
fileobj.seek(0)
|
||||
first_line = fileobj.readline().strip().replace('"', '').replace(' ', '')
|
||||
fileformat = first_line.endswith("type,name,res_id,src,value") and 'csv' or 'po'
|
||||
fileobj.seek(0)
|
||||
|
||||
tools.trans_load_data(cr, fileobj, fileformat, this.code, lang_name=this.name, context=context)
|
||||
finally:
|
||||
fileobj.close()
|
||||
return True
|
||||
|
||||
# now we determine the file format
|
||||
fileobj.seek(0)
|
||||
first_line = fileobj.readline().strip().replace('"', '').replace(' ', '')
|
||||
fileformat = first_line.endswith("type,name,res_id,src,value") and 'csv' or 'po'
|
||||
fileobj.seek(0)
|
||||
|
||||
tools.trans_load_data(cr, fileobj, fileformat, import_data.code, lang_name=import_data.name, context=context)
|
||||
fileobj.close()
|
||||
return {}
|
||||
|
||||
base_language_import()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<field name="arch" type="xml">
|
||||
<form string="Import Translation" version="7.0">
|
||||
<group>
|
||||
<field name="name"/>
|
||||
<field name="name" placeholder="e.g. English"/>
|
||||
<field name="code" string="Code" placeholder="e.g. en_US"/>
|
||||
<field name="data"/>
|
||||
<field name="overwrite"/>
|
||||
|
|
|
@ -27,9 +27,7 @@ class base_language_install(osv.osv_memory):
|
|||
""" Install Language"""
|
||||
|
||||
_name = "base.language.install"
|
||||
_inherit = "ir.wizard.screen"
|
||||
_description = "Install Language"
|
||||
|
||||
_columns = {
|
||||
'lang': fields.selection(tools.scan_languages(),'Language', required=True),
|
||||
'overwrite': fields.boolean('Overwrite Existing Terms', help="If you check this box, your customized translations will be overwritten and replaced by the official ones."),
|
||||
|
@ -63,6 +61,5 @@ class base_language_install(osv.osv_memory):
|
|||
'target': 'new',
|
||||
'res_id': ids and ids[0] or False,
|
||||
}
|
||||
base_language_install()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -34,9 +34,7 @@ class base_module_import(osv.osv_memory):
|
|||
""" Import Module """
|
||||
|
||||
_name = "base.module.import"
|
||||
_inherit = "ir.wizard.screen"
|
||||
_description = "Import Module"
|
||||
|
||||
_columns = {
|
||||
'module_file': fields.binary('Module .ZIP file', required=True),
|
||||
'state':fields.selection([('init','init'),('done','done')],
|
||||
|
@ -88,7 +86,5 @@ class base_module_import(osv.osv_memory):
|
|||
'type': 'ir.actions.act_window',
|
||||
}
|
||||
|
||||
base_module_import()
|
||||
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -25,7 +25,6 @@ class base_module_update(osv.osv_memory):
|
|||
|
||||
_name = "base.module.update"
|
||||
_description = "Update Module"
|
||||
_inherit = "ir.wizard.screen"
|
||||
|
||||
_columns = {
|
||||
'update': fields.integer('Number of modules updated', readonly=True),
|
||||
|
@ -55,7 +54,4 @@ class base_module_update(osv.osv_memory):
|
|||
}
|
||||
return res
|
||||
|
||||
|
||||
base_module_update()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
|
@ -21,31 +21,28 @@
|
|||
|
||||
from osv import osv, fields
|
||||
import tools
|
||||
import pooler
|
||||
import cStringIO
|
||||
from tools.translate import _
|
||||
|
||||
class base_update_translations(osv.osv_memory):
|
||||
def _get_languages(self, cr, uid, context):
|
||||
lang_obj=pooler.get_pool(cr.dbname).get('res.lang')
|
||||
ids=lang_obj.search(cr, uid, ['&', ('active', '=', True), ('translatable', '=', True),])
|
||||
langs=lang_obj.browse(cr, uid, ids)
|
||||
lang_obj = self.pool.get('res.lang')
|
||||
ids = lang_obj.search(cr, uid, ['&', ('active', '=', True), ('translatable', '=', True),])
|
||||
langs = lang_obj.browse(cr, uid, ids)
|
||||
return [(lang.code, lang.name) for lang in langs]
|
||||
|
||||
def _get_lang_name(self, cr, uid, lang_code):
|
||||
lang_obj=pooler.get_pool(cr.dbname).get('res.lang')
|
||||
ids=lang_obj.search(cr, uid, [('code', '=', lang_code)])
|
||||
lang_obj = self.pool.get('res.lang')
|
||||
ids = lang_obj.search(cr, uid, [('code', '=', lang_code)])
|
||||
if not ids:
|
||||
raise osv.except_osv(_('Error!'), _('No language with code "%s" exists') % lang_code)
|
||||
lang = lang_obj.browse(cr, uid, ids[0])
|
||||
return lang.name
|
||||
def act_cancel(self, cr, uid, ids, context=None):
|
||||
return {'type': 'ir.actions.act_window_close'}
|
||||
|
||||
def act_update(self, cr, uid, ids, context=None):
|
||||
this = self.browse(cr, uid, ids)[0]
|
||||
lang_name = self._get_lang_name(cr, uid, this.lang)
|
||||
buf=cStringIO.StringIO()
|
||||
buf = cStringIO.StringIO()
|
||||
tools.trans_export(this.lang, ['all'], buf, 'csv', cr)
|
||||
tools.trans_load_data(cr, buf, 'csv', this.lang, lang_name=lang_name)
|
||||
buf.close()
|
||||
|
@ -66,11 +63,8 @@ class base_update_translations(osv.osv_memory):
|
|||
return res
|
||||
|
||||
_name = 'base.update.translations'
|
||||
_inherit = "ir.wizard.screen"
|
||||
_columns = {
|
||||
'lang': fields.selection(_get_languages, 'Language', required=True),
|
||||
}
|
||||
|
||||
base_update_translations()
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<footer>
|
||||
<button name="act_update" string="Update" type="object" class="oe_highlight"/>
|
||||
or
|
||||
<button name="act_cancel" special="cancel" string="Cancel" type="object" class="oe_link"/>
|
||||
<button special="cancel" string="Cancel" type="object" class="oe_link"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
|
|
|
@ -37,7 +37,6 @@ class res_config_configurable(osv.osv_memory):
|
|||
their view inherit from the related res_config_view_base view.
|
||||
'''
|
||||
_name = 'res.config'
|
||||
_inherit = 'ir.wizard.screen'
|
||||
|
||||
def _next_action(self, cr, uid, context=None):
|
||||
Todos = self.pool['ir.actions.todo']
|
||||
|
|
|
@ -100,8 +100,8 @@
|
|||
"access_workflow_workitem_all","workflow_workitem_all","model_workflow_workitem",,1,1,1,1
|
||||
"access_ir_actions_act_window_view_all","ir_actions_act_window_view_all","model_ir_actions_act_window_view",,1,0,0,0
|
||||
"access_ir_actions_act_window_view_group_system","ir_actions_act_window_view_group_system","model_ir_actions_act_window_view","group_system",1,1,1,1
|
||||
"access_ir_actions_url_all","ir_actions_url_all","model_ir_actions_url",,1,0,0,0
|
||||
"access_ir_actions_url_group_system","ir_actions_url_group_system","model_ir_actions_url","group_system",1,1,1,1
|
||||
"access_ir_actions_act_url_all","ir_actions_act_url_all","model_ir_actions_act_url",,1,0,0,0
|
||||
"access_ir_actions_act_url_group_system","ir_actions_act_url_group_system","model_ir_actions_act_url","group_system",1,1,1,1
|
||||
"access_ir_server_object_lines_all","ir_server_object_lines_all","model_ir_server_object_lines",,1,0,0,0
|
||||
"access_ir_server_object_lines_group_system","ir_server_object_lines_group_system","model_ir_server_object_lines","group_system",1,1,1,1
|
||||
"access_ir_actions_server_all","ir_actions_server_all","model_ir_actions_server",,1,0,0,0
|
||||
|
|
|
|
@ -84,7 +84,8 @@ def start_services():
|
|||
netrpc_server.init_servers()
|
||||
|
||||
# Start the main cron thread.
|
||||
openerp.cron.start_master_thread()
|
||||
if openerp.conf.max_cron_threads:
|
||||
openerp.cron.start_master_thread()
|
||||
|
||||
# Start the top-level servers threads (normally HTTP, HTTPS, and NETRPC).
|
||||
openerp.netsvc.Server.startAll()
|
||||
|
|
|
@ -386,18 +386,8 @@ form: module.record_id""" % (xml_id,)
|
|||
|
||||
res = {'name': name, 'url': url, 'target':target}
|
||||
|
||||
id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
|
||||
id = self.pool.get('ir.model.data')._update(cr, self.uid, "ir.actions.act_url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
|
||||
self.idref[xml_id] = int(id)
|
||||
# ir_set
|
||||
if (not rec.get('menu') or eval(rec.get('menu','False'))) and id:
|
||||
keyword = str(rec.get('keyword','') or 'client_action_multi')
|
||||
value = 'ir.actions.url,'+str(id)
|
||||
replace = rec.get("replace",'') or True
|
||||
self.pool.get('ir.model.data').ir_set(cr, self.uid, 'action', keyword, url, ["ir.actions.url"], value, replace=replace, isobject=True, xml_id=xml_id)
|
||||
elif self.mode=='update' and (rec.get('menu') and eval(rec.get('menu','False'))==False):
|
||||
# Special check for URL having attribute menu=False on update
|
||||
value = 'ir.actions.url,'+str(id)
|
||||
self._remove_ir_values(cr, url, value, "ir.actions.url")
|
||||
|
||||
def _tag_act_window(self, cr, rec, data_node=None):
|
||||
name = rec.get('name','').encode('utf-8')
|
||||
|
|
|
@ -33,6 +33,7 @@ import logging
|
|||
import tarfile
|
||||
import tempfile
|
||||
import threading
|
||||
from babel.messages import extract
|
||||
from os.path import join
|
||||
|
||||
from datetime import datetime
|
||||
|
@ -47,6 +48,9 @@ from openerp import SUPERUSER_ID
|
|||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
# used to notify web client that these translations should be loaded in the UI
|
||||
WEB_TRANSLATION_COMMENT = "openerp-web"
|
||||
|
||||
_LOCALE2WIN32 = {
|
||||
'af_ZA': 'Afrikaans_South Africa',
|
||||
'sq_AL': 'Albanian_Albania',
|
||||
|
@ -262,7 +266,7 @@ class TinyPoFile(object):
|
|||
self.lines_count = len(self.lines);
|
||||
|
||||
self.first = True
|
||||
self.tnrs= []
|
||||
self.extra_lines= []
|
||||
return self
|
||||
|
||||
def _get_lines(self):
|
||||
|
@ -278,14 +282,14 @@ class TinyPoFile(object):
|
|||
return (self.lines_count - len(self.lines))
|
||||
|
||||
def next(self):
|
||||
type = name = res_id = source = trad = None
|
||||
|
||||
if self.tnrs:
|
||||
type, name, res_id, source, trad = self.tnrs.pop(0)
|
||||
trans_type = name = res_id = source = trad = None
|
||||
if self.extra_lines:
|
||||
trans_type, name, res_id, source, trad, comments = self.extra_lines.pop(0)
|
||||
if not res_id:
|
||||
res_id = '0'
|
||||
else:
|
||||
tmp_tnrs = []
|
||||
comments = []
|
||||
targets = []
|
||||
line = None
|
||||
fuzzy = False
|
||||
while (not line):
|
||||
|
@ -295,15 +299,20 @@ class TinyPoFile(object):
|
|||
while line.startswith('#'):
|
||||
if line.startswith('#~ '):
|
||||
break
|
||||
if line.startswith('#:'):
|
||||
if line.startswith('#.'):
|
||||
line = line[2:].strip()
|
||||
if not line.startswith('module:'):
|
||||
comments.append(line)
|
||||
elif line.startswith('#:'):
|
||||
for lpart in line[2:].strip().split(' '):
|
||||
trans_info = lpart.strip().split(':',2)
|
||||
if trans_info and len(trans_info) == 2:
|
||||
# looks like the translation type is missing, which is not
|
||||
# looks like the translation trans_type is missing, which is not
|
||||
# unexpected because it is not a GetText standard. Default: 'code'
|
||||
trans_info[:0] = ['code']
|
||||
if trans_info and len(trans_info) == 3:
|
||||
tmp_tnrs.append(trans_info)
|
||||
# this is a ref line holding the destination info (model, field, record)
|
||||
targets.append(trans_info)
|
||||
elif line.startswith('#,') and (line[2:].strip() == 'fuzzy'):
|
||||
fuzzy = True
|
||||
line = self.lines.pop(0).strip()
|
||||
|
@ -326,7 +335,7 @@ class TinyPoFile(object):
|
|||
# if the source is "" and it's the first msgid, it's the special
|
||||
# msgstr with the informations about the traduction and the
|
||||
# traductor; we skip it
|
||||
self.tnrs = []
|
||||
self.extra_lines = []
|
||||
while line:
|
||||
line = self.lines.pop(0).strip()
|
||||
return self.next()
|
||||
|
@ -343,10 +352,11 @@ class TinyPoFile(object):
|
|||
trad += unquote(line)
|
||||
line = self.lines.pop(0).strip()
|
||||
|
||||
if tmp_tnrs and not fuzzy:
|
||||
type, name, res_id = tmp_tnrs.pop(0)
|
||||
for t, n, r in tmp_tnrs:
|
||||
self.tnrs.append((t, n, r, source, trad))
|
||||
if targets and not fuzzy:
|
||||
trans_type, name, res_id = targets.pop(0)
|
||||
for t, n, r in targets:
|
||||
if t == trans_type == 'code': continue
|
||||
self.extra_lines.append((t, n, r, source, trad, comments))
|
||||
|
||||
self.first = False
|
||||
|
||||
|
@ -355,7 +365,7 @@ class TinyPoFile(object):
|
|||
self.warn('Missing "#:" formated comment at line %d for the following source:\n\t%s',
|
||||
self.cur_line(), source[:30])
|
||||
return self.next()
|
||||
return type, name, res_id, source, trad
|
||||
return trans_type, name, res_id, source, trad, '\n'.join(comments)
|
||||
|
||||
def write_infos(self, modules):
|
||||
import openerp.release as release
|
||||
|
@ -384,11 +394,13 @@ class TinyPoFile(object):
|
|||
}
|
||||
)
|
||||
|
||||
def write(self, modules, tnrs, source, trad):
|
||||
def write(self, modules, tnrs, source, trad, comments=None):
|
||||
|
||||
plurial = len(modules) > 1 and 's' or ''
|
||||
self.buffer.write("#. module%s: %s\n" % (plurial, ', '.join(modules)))
|
||||
|
||||
if comments:
|
||||
self.buffer.write(''.join(('#. %s\n' % c for c in comments)))
|
||||
|
||||
code = False
|
||||
for typy, name, res_id in tnrs:
|
||||
|
@ -415,44 +427,43 @@ class TinyPoFile(object):
|
|||
|
||||
def trans_export(lang, modules, buffer, format, cr):
|
||||
|
||||
def _process(format, modules, rows, buffer, lang, newlang):
|
||||
def _process(format, modules, rows, buffer, lang):
|
||||
if format == 'csv':
|
||||
writer=csv.writer(buffer, 'UNIX')
|
||||
for row in rows:
|
||||
writer.writerow(row)
|
||||
writer = csv.writer(buffer, 'UNIX')
|
||||
# write header first
|
||||
writer.writerow(("module","type","name","res_id","src","value"))
|
||||
for module, type, name, res_id, src, trad, comments in rows:
|
||||
# Comments are ignored by the CSV writer
|
||||
writer.writerow((module, type, name, res_id, src, trad))
|
||||
elif format == 'po':
|
||||
rows.pop(0)
|
||||
writer = TinyPoFile(buffer)
|
||||
writer.write_infos(modules)
|
||||
|
||||
# we now group the translations by source. That means one translation per source.
|
||||
grouped_rows = {}
|
||||
for module, type, name, res_id, src, trad in rows:
|
||||
for module, type, name, res_id, src, trad, comments in rows:
|
||||
row = grouped_rows.setdefault(src, {})
|
||||
row.setdefault('modules', set()).add(module)
|
||||
if ('translation' not in row) or (not row['translation']):
|
||||
row['translation'] = trad
|
||||
row.setdefault('tnrs', []).append((type, name, res_id))
|
||||
row.setdefault('comments', set()).update(comments)
|
||||
|
||||
for src, row in grouped_rows.items():
|
||||
writer.write(row['modules'], row['tnrs'], src, row['translation'])
|
||||
writer.write(row['modules'], row['tnrs'], src, row['translation'], row['comments'])
|
||||
|
||||
elif format == 'tgz':
|
||||
rows.pop(0)
|
||||
rows_by_module = {}
|
||||
for row in rows:
|
||||
module = row[0]
|
||||
# first row is the "header", as in csv, it will be popped
|
||||
rows_by_module.setdefault(module, [['module', 'type', 'name', 'res_id', 'src', ''],])
|
||||
rows_by_module[module].append(row)
|
||||
|
||||
rows_by_module.setdefault(module, []).append(row)
|
||||
tmpdir = tempfile.mkdtemp()
|
||||
for mod, modrows in rows_by_module.items():
|
||||
tmpmoddir = join(tmpdir, mod, 'i18n')
|
||||
os.makedirs(tmpmoddir)
|
||||
pofilename = (newlang and mod or lang) + ".po" + (newlang and 't' or '')
|
||||
pofilename = (lang if lang else mod) + ".po" + ('t' if not lang else '')
|
||||
buf = file(join(tmpmoddir, pofilename), 'w')
|
||||
_process('po', [mod], modrows, buf, lang, newlang)
|
||||
_process('po', [mod], modrows, buf, lang)
|
||||
buf.close()
|
||||
|
||||
tar = tarfile.open(fileobj=buffer, mode='w|gz')
|
||||
|
@ -463,16 +474,15 @@ def trans_export(lang, modules, buffer, format, cr):
|
|||
raise Exception(_('Unrecognized extension: must be one of '
|
||||
'.csv, .po, or .tgz (received .%s).' % format))
|
||||
|
||||
newlang = not bool(lang)
|
||||
if newlang:
|
||||
lang = 'en_US'
|
||||
trans = trans_generate(lang, modules, cr)
|
||||
if newlang and format!='csv':
|
||||
for trx in trans:
|
||||
trx[-1] = ''
|
||||
modules = set([t[0] for t in trans[1:]])
|
||||
_process(format, modules, trans, buffer, lang, newlang)
|
||||
del trans
|
||||
trans_lang = lang
|
||||
if not trans_lang and format == 'csv':
|
||||
# CSV files are meant for translators and they need a starting point,
|
||||
# so we at least put the original term in the translation column
|
||||
trans_lang = 'en_US'
|
||||
translations = trans_generate(lang, modules, cr)
|
||||
modules = set([t[0] for t in translations[1:]])
|
||||
_process(format, modules, translations, buffer, lang)
|
||||
del translations
|
||||
|
||||
def trans_parse_xsl(de):
|
||||
res = []
|
||||
|
@ -535,6 +545,46 @@ def in_modules(object_name, modules):
|
|||
module = module_dict.get(module, module)
|
||||
return module in modules
|
||||
|
||||
|
||||
def babel_extract_qweb(fileobj, keywords, comment_tags, options):
|
||||
"""Babel message extractor for qweb template files.
|
||||
:param fileobj: the file-like object the messages should be extracted from
|
||||
:param keywords: a list of keywords (i.e. function names) that should
|
||||
be recognized as translation functions
|
||||
:param comment_tags: a list of translator tags to search for and
|
||||
include in the results
|
||||
:param options: a dictionary of additional options (optional)
|
||||
:return: an iterator over ``(lineno, funcname, message, comments)``
|
||||
tuples
|
||||
:rtype: ``iterator``
|
||||
"""
|
||||
result = []
|
||||
def handle_text(text, lineno):
|
||||
text = (text or "").strip()
|
||||
if len(text) > 1: # Avoid mono-char tokens like ':' ',' etc.
|
||||
result.append((lineno, None, text, []))
|
||||
|
||||
# not using elementTree.iterparse because we need to skip sub-trees in case
|
||||
# the ancestor element had a reason to be skipped
|
||||
def iter_elements(current_element):
|
||||
for el in current_element:
|
||||
if isinstance(el, SKIPPED_ELEMENT_TYPES): continue
|
||||
if "t-js" not in el.attrib and \
|
||||
not ("t-jquery" in el.attrib and "t-operation" not in el.attrib) and \
|
||||
not ("t-translation" in el.attrib and el.attrib["t-translation"].strip() == "off"):
|
||||
handle_text(el.text, el.sourceline)
|
||||
for att in ('title', 'alt', 'label', 'placeholder'):
|
||||
if att in el.attrib:
|
||||
handle_text(el.attrib[att], el.sourceline)
|
||||
iter_elements(el)
|
||||
handle_text(el.tail, el.sourceline)
|
||||
|
||||
tree = etree.parse(fileobj)
|
||||
iter_elements(tree.getroot())
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def trans_generate(lang, modules, cr):
|
||||
dbname = cr.dbname
|
||||
|
||||
|
@ -566,8 +616,8 @@ def trans_generate(lang, modules, cr):
|
|||
cr.execute(query, query_param)
|
||||
|
||||
_to_translate = []
|
||||
def push_translation(module, type, name, id, source):
|
||||
tuple = (module, source, name, id, type)
|
||||
def push_translation(module, type, name, id, source, comments=None):
|
||||
tuple = (module, source, name, id, type, comments or [])
|
||||
if source and tuple not in _to_translate:
|
||||
_to_translate.append(tuple)
|
||||
|
||||
|
@ -717,7 +767,7 @@ def trans_generate(lang, modules, cr):
|
|||
if not hasattr(msg, '__call__'):
|
||||
push_translation(module, term_type, model, 0, encode(msg))
|
||||
|
||||
for (model_id, model, module) in cr.fetchall():
|
||||
for (_, model, module) in cr.fetchall():
|
||||
module = encode(module)
|
||||
model = encode(model)
|
||||
|
||||
|
@ -733,7 +783,6 @@ def trans_generate(lang, modules, cr):
|
|||
for constraint in getattr(model_obj, '_sql_constraints', []):
|
||||
push_constraint_msg(module, 'sql_constraint', model, constraint[2])
|
||||
|
||||
# parse source code for _() calls
|
||||
def get_module_from_path(path, mod_paths=None):
|
||||
if not mod_paths:
|
||||
# First, construct a list of possible paths
|
||||
|
@ -771,92 +820,71 @@ def trans_generate(lang, modules, cr):
|
|||
_logger.debug("Scanning modules at paths: ", path_list)
|
||||
|
||||
mod_paths = []
|
||||
join_dquotes = re.compile(r'([^\\])"[\s\\]*"', re.DOTALL)
|
||||
join_quotes = re.compile(r'([^\\])\'[\s\\]*\'', re.DOTALL)
|
||||
re_dquotes = re.compile(r'[^a-zA-Z0-9_]_\([\s]*"(.+?)"[\s]*?\)', re.DOTALL)
|
||||
re_quotes = re.compile(r'[^a-zA-Z0-9_]_\([\s]*\'(.+?)\'[\s]*?\)', re.DOTALL)
|
||||
|
||||
def export_code_terms_from_file(fname, path, root, terms_type):
|
||||
def verified_module_filepaths(fname, path, root):
|
||||
fabsolutepath = join(root, fname)
|
||||
frelativepath = fabsolutepath[len(path):]
|
||||
display_path = "addons%s" % frelativepath
|
||||
module = get_module_from_path(fabsolutepath, mod_paths=mod_paths)
|
||||
is_mod_installed = module in installed_modules
|
||||
if (('all' in modules) or (module in modules)) and is_mod_installed:
|
||||
_logger.debug("Scanning code of %s at module: %s", frelativepath, module)
|
||||
src_file = misc.file_open(fabsolutepath, subdir='')
|
||||
if (('all' in modules) or (module in modules)) and module in installed_modules:
|
||||
return module, fabsolutepath, frelativepath, display_path
|
||||
return None, None, None, None
|
||||
|
||||
def babel_extract_terms(fname, path, root, extract_method="python", trans_type='code',
|
||||
extra_comments=None, extract_keywords={'_': None}):
|
||||
module, fabsolutepath, _, display_path = verified_module_filepaths(fname, path, root)
|
||||
extra_comments = extra_comments or []
|
||||
if module:
|
||||
src_file = open(fabsolutepath, 'r')
|
||||
try:
|
||||
code_string = src_file.read()
|
||||
for lineno, message, comments in extract.extract(extract_method, src_file,
|
||||
keywords=extract_keywords):
|
||||
push_translation(module, trans_type, display_path, lineno,
|
||||
encode(message), comments + extra_comments)
|
||||
finally:
|
||||
src_file.close()
|
||||
if module in installed_modules:
|
||||
frelativepath = str("addons" + frelativepath)
|
||||
ite = re_dquotes.finditer(code_string)
|
||||
code_offset = 0
|
||||
code_line = 1
|
||||
for i in ite:
|
||||
src = i.group(1)
|
||||
if src.startswith('""'):
|
||||
assert src.endswith('""'), "Incorrect usage of _(..) function (should contain only literal strings!) in file %s near: %s" % (frelativepath, src[:30])
|
||||
src = src[2:-2]
|
||||
else:
|
||||
src = join_dquotes.sub(r'\1', src)
|
||||
# try to count the lines from the last pos to our place:
|
||||
code_line += code_string[code_offset:i.start(1)].count('\n')
|
||||
# now, since we did a binary read of a python source file, we
|
||||
# have to expand pythonic escapes like the interpreter does.
|
||||
src = src.decode('string_escape')
|
||||
push_translation(module, terms_type, frelativepath, code_line, encode(src))
|
||||
code_line += i.group(1).count('\n')
|
||||
code_offset = i.end() # we have counted newlines up to the match end
|
||||
|
||||
ite = re_quotes.finditer(code_string)
|
||||
code_offset = 0 #reset counters
|
||||
code_line = 1
|
||||
for i in ite:
|
||||
src = i.group(1)
|
||||
if src.startswith("''"):
|
||||
assert src.endswith("''"), "Incorrect usage of _(..) function (should contain only literal strings!) in file %s near: %s" % (frelativepath, src[:30])
|
||||
src = src[2:-2]
|
||||
else:
|
||||
src = join_quotes.sub(r'\1', src)
|
||||
code_line += code_string[code_offset:i.start(1)].count('\n')
|
||||
src = src.decode('string_escape')
|
||||
push_translation(module, terms_type, frelativepath, code_line, encode(src))
|
||||
code_line += i.group(1).count('\n')
|
||||
code_offset = i.end() # we have counted newlines up to the match end
|
||||
|
||||
for path in path_list:
|
||||
_logger.debug("Scanning files of modules at %s", path)
|
||||
for root, dummy, files in osutil.walksymlinks(path):
|
||||
for fname in itertools.chain(fnmatch.filter(files, '*.py')):
|
||||
export_code_terms_from_file(fname, path, root, 'code')
|
||||
for fname in itertools.chain(fnmatch.filter(files, '*.mako')):
|
||||
export_code_terms_from_file(fname, path, root, 'report')
|
||||
for fname in fnmatch.filter(files, '*.py'):
|
||||
babel_extract_terms(fname, path, root)
|
||||
for fname in fnmatch.filter(files, '*.mako'):
|
||||
babel_extract_terms(fname, path, root, trans_type='report')
|
||||
# Javascript source files in the static/src/js directory, rest is ignored (libs)
|
||||
if fnmatch.fnmatch(root, '*/static/src/js*'):
|
||||
for fname in fnmatch.filter(files, '*.js'):
|
||||
babel_extract_terms(fname, path, root, 'javascript',
|
||||
extra_comments=[WEB_TRANSLATION_COMMENT],
|
||||
extract_keywords={'_t': None})
|
||||
# QWeb template files
|
||||
if fnmatch.fnmatch(root, '*/static/src/xml*'):
|
||||
for fname in fnmatch.filter(files, '*.xml'):
|
||||
babel_extract_terms(fname, path, root, 'openerp.tools.translate:babel_extract_qweb',
|
||||
extra_comments=[WEB_TRANSLATION_COMMENT])
|
||||
|
||||
|
||||
out = [["module","type","name","res_id","src","value"]] # header
|
||||
out = []
|
||||
_to_translate.sort()
|
||||
# translate strings marked as to be translated
|
||||
for module, source, name, id, type in _to_translate:
|
||||
trans = trans_obj._get_source(cr, uid, name, type, lang, source)
|
||||
out.append([module, type, name, id, source, encode(trans) or ''])
|
||||
|
||||
for module, source, name, id, type, comments in _to_translate:
|
||||
trans = '' if not lang else trans_obj._get_source(cr, uid, name, type, lang, source)
|
||||
out.append([module, type, name, id, source, encode(trans) or '', comments])
|
||||
return out
|
||||
|
||||
def trans_load(cr, filename, lang, verbose=True, context=None):
|
||||
def trans_load(cr, filename, lang, verbose=True, module_name=None, context=None):
|
||||
try:
|
||||
fileobj = misc.file_open(filename)
|
||||
_logger.info("loading %s", filename)
|
||||
fileformat = os.path.splitext(filename)[-1][1:].lower()
|
||||
r = trans_load_data(cr, fileobj, fileformat, lang, verbose=verbose, context=context)
|
||||
result = trans_load_data(cr, fileobj, fileformat, lang, verbose=verbose, module_name=module_name, context=context)
|
||||
fileobj.close()
|
||||
return r
|
||||
return result
|
||||
except IOError:
|
||||
if verbose:
|
||||
_logger.error("couldn't read translation file %s", filename)
|
||||
return None
|
||||
|
||||
def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, context=None):
|
||||
def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True, module_name=None, context=None):
|
||||
"""Populates the ir_translation table."""
|
||||
if verbose:
|
||||
_logger.info('loading translation file for language %s', lang)
|
||||
|
@ -868,8 +896,7 @@ def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True,
|
|||
trans_obj = pool.get('ir.translation')
|
||||
iso_lang = misc.get_iso_codes(lang)
|
||||
try:
|
||||
uid = 1
|
||||
ids = lang_obj.search(cr, uid, [('code','=', lang)])
|
||||
ids = lang_obj.search(cr, SUPERUSER_ID, [('code','=', lang)])
|
||||
|
||||
if not ids:
|
||||
# lets create the language with locale information
|
||||
|
@ -886,14 +913,14 @@ def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True,
|
|||
break
|
||||
elif fileformat == 'po':
|
||||
reader = TinyPoFile(fileobj)
|
||||
f = ['type', 'name', 'res_id', 'src', 'value']
|
||||
f = ['type', 'name', 'res_id', 'src', 'value', 'comments']
|
||||
else:
|
||||
_logger.error('Bad file format: %s', fileformat)
|
||||
raise Exception(_('Bad file format'))
|
||||
|
||||
# read the rest of the file
|
||||
line = 1
|
||||
irt_cursor = trans_obj._get_import_cursor(cr, uid, context=context)
|
||||
irt_cursor = trans_obj._get_import_cursor(cr, SUPERUSER_ID, context=context)
|
||||
|
||||
for row in reader:
|
||||
line += 1
|
||||
|
@ -903,39 +930,32 @@ def trans_load_data(cr, fileobj, fileformat, lang, lang_name=None, verbose=True,
|
|||
|
||||
# dictionary which holds values for this line of the csv file
|
||||
# {'lang': ..., 'type': ..., 'name': ..., 'res_id': ...,
|
||||
# 'src': ..., 'value': ...}
|
||||
dic = {'lang': lang}
|
||||
dic_module = False
|
||||
for i in range(len(f)):
|
||||
if f[i] in ('module',):
|
||||
continue
|
||||
dic[f[i]] = row[i]
|
||||
# 'src': ..., 'value': ..., 'module':...}
|
||||
dic = dict.fromkeys(('name', 'res_id', 'src', 'type', 'imd_model', 'imd_name', 'module', 'value', 'comments'))
|
||||
dic['lang'] = lang
|
||||
for i, field in enumerate(f):
|
||||
dic[field] = row[i]
|
||||
|
||||
# This would skip terms that fail to specify a res_id
|
||||
if not dic.get('res_id', False):
|
||||
if not dic.get('res_id'):
|
||||
continue
|
||||
|
||||
res_id = dic.pop('res_id')
|
||||
if res_id and isinstance(res_id, (int, long)) \
|
||||
or (isinstance(res_id, basestring) and res_id.isdigit()):
|
||||
dic['res_id'] = int(res_id)
|
||||
dic['module'] = module_name
|
||||
else:
|
||||
try:
|
||||
tmodel = dic['name'].split(',')[0]
|
||||
if '.' in res_id:
|
||||
tmodule, tname = res_id.split('.', 1)
|
||||
else:
|
||||
tmodule = dic_module
|
||||
tname = res_id
|
||||
dic['imd_model'] = tmodel
|
||||
dic['imd_module'] = tmodule
|
||||
dic['imd_name'] = tname
|
||||
|
||||
dic['res_id'] = None
|
||||
except Exception:
|
||||
_logger.warning("Could not decode resource for %s, please fix the po file.",
|
||||
dic['res_id'], exc_info=True)
|
||||
dic['res_id'] = None
|
||||
tmodel = dic['name'].split(',')[0]
|
||||
if '.' in res_id:
|
||||
tmodule, tname = res_id.split('.', 1)
|
||||
else:
|
||||
tmodule = False
|
||||
tname = res_id
|
||||
dic['imd_model'] = tmodel
|
||||
dic['imd_name'] = tname
|
||||
dic['module'] = tmodule
|
||||
dic['res_id'] = None
|
||||
|
||||
irt_cursor.push(dic)
|
||||
|
||||
|
|
|
@ -730,15 +730,15 @@ class YamlInterpreter(object):
|
|||
res = {'name': node.name, 'url': node.url, 'target': node.target}
|
||||
|
||||
id = self.pool.get('ir.model.data')._update(self.cr, SUPERUSER_ID, \
|
||||
"ir.actions.url", self.module, res, node.id, mode=self.mode)
|
||||
"ir.actions.act_url", self.module, res, node.id, mode=self.mode)
|
||||
self.id_map[node.id] = int(id)
|
||||
# ir_set
|
||||
if (not node.menu or eval(node.menu)) and id:
|
||||
keyword = node.keyword or 'client_action_multi'
|
||||
value = 'ir.actions.url,%s' % id
|
||||
value = 'ir.actions.act_url,%s' % id
|
||||
replace = node.replace or True
|
||||
self.pool.get('ir.model.data').ir_set(self.cr, SUPERUSER_ID, 'action', \
|
||||
keyword, node.url, ["ir.actions.url"], value, replace=replace, \
|
||||
keyword, node.url, ["ir.actions.act_url"], value, replace=replace, \
|
||||
noupdate=self.isnoupdate(node), isobject=True, xml_id=node.id)
|
||||
|
||||
def process_ir_set(self, node):
|
||||
|
|
Loading…
Reference in New Issue