mirror of
https://gitlab.com/flectra-hq/flectra.git
synced 2025-02-25 18:55:21 -06:00
[PATCH] upstream core
This commit is contained in:
21
flectra/addons/base/data/rtlcss.json
Normal file
21
flectra/addons/base/data/rtlcss.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"options": {
|
||||
"autoRename": false,
|
||||
"autoRenameStrict": false,
|
||||
"blacklist": {
|
||||
"rtlcss": {
|
||||
"config": true,
|
||||
"options": true
|
||||
}
|
||||
},
|
||||
"clean": true,
|
||||
"greedy": false,
|
||||
"processUrls": false,
|
||||
"stringMap": [],
|
||||
"useCalc": false,
|
||||
"aliases": {},
|
||||
"processEnv": false
|
||||
},
|
||||
"plugins": [],
|
||||
"map": false
|
||||
}
|
||||
@@ -15530,6 +15530,18 @@ msgstr "خطأ"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "رسالة خطأ تظهر عندما يتم اختراق القيود. "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"حدث خطأ أثناء تحليل نافذة العرض:\n"
|
||||
"\n"
|
||||
"%s "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18569,6 +18581,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "معامل 'تجميع حسب' غير صالح"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
@@ -27155,7 +27173,7 @@ msgstr "Test Belgian Payroll"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.ir_mail_server_form
|
||||
msgid "Test Connection"
|
||||
msgstr "اختبار اتصال"
|
||||
msgstr "اختبار الاتصال "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_test_data_cleaning
|
||||
@@ -28326,7 +28344,7 @@ msgstr "To return an action, assign: <code>action = {...}</code>"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.ir_actions_todo_tree
|
||||
msgid "Todo"
|
||||
msgstr "المطلوب تنفيذه"
|
||||
msgstr "قائمة المهام "
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.tg
|
||||
@@ -30253,7 +30271,7 @@ msgstr "لا يمكنك تعطيل المستخدم المُسجل منه دخو
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
msgstr "لا يمكنك حذف سجل %s. "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
@@ -30281,7 +30299,7 @@ msgstr "لا يمكنك دمج جهة اتصال مع إحدى عناصره ال
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
msgstr "لا يمكنك إعادة تسمية معايير التهيئة مع المفاتيح %s "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
|
||||
@@ -14898,6 +14898,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -22,10 +22,10 @@
|
||||
# Pete M, 2022
|
||||
# oscaryuu, 2022
|
||||
# CristianCruzParra, 2022
|
||||
# jabelchi, 2022
|
||||
# Guspy12, 2022
|
||||
# Óscar Fonseca <tecnico@extreme-micro.com>, 2023
|
||||
# martioodo hola, 2023
|
||||
# Josep Anton Belchi, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -33,7 +33,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: martioodo hola, 2023\n"
|
||||
"Last-Translator: Josep Anton Belchi, 2023\n"
|
||||
"Language-Team: Catalan (https://app.transifex.com/odoo/teams/41243/ca/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -13341,7 +13341,7 @@ msgstr "Calcula"
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
msgstr "El mètode de càlcul no pot dependre del camp 'id'"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
@@ -15763,6 +15763,15 @@ msgstr "Error"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "S'ha retornat un missatge d'error quan es viola la restricció."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18837,6 +18846,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Paràmetre 'group by' no vàlid"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr "Format JSON no vàlid en camp de valor per defecte."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -30800,6 +30815,12 @@ msgstr "No pots crear vistes recursives heretades."
|
||||
msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr "No pots desactivar l'usuari amb el que estas loguejat."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr "No podeu esborrar el registre %s."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -30822,6 +30843,12 @@ msgstr "No podeu suprimir l'idioma que és l'idioma preferit de l'usuari."
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "No es pot combinar un contacte amb un dels seus pares."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -15639,6 +15639,18 @@ msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
"Fehlermeldung, die zurückgegeben wird, wenn das Constraint verletzt wird."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Fehler bei der Analyse der Ansicht:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18719,6 +18731,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Fehlerhafter 'group by'-Parameter"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Ungültiger Ausdruck beim Parsen von xpath %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
@@ -25161,7 +25179,7 @@ msgstr "Lager kaufen"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_purchase_stock_enterprise
|
||||
msgid "Purchase Stock Enterprise"
|
||||
msgstr ""
|
||||
msgstr "Einkauf Bestand Enterprise"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_purchase_mrp
|
||||
@@ -31048,7 +31066,7 @@ msgstr ""
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
msgstr "Sie können den %s-Datensatz nicht löschen."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
@@ -31078,7 +31096,7 @@ msgstr ""
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
msgstr "Sie können Konfigurationsparameter nicht mit %s umbenennen"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
# Elena Aguirre Claeyssens <eac@odoo.com>, 2020
|
||||
# Soluntec <abraham@soluntec.es>, 2020
|
||||
# ced903afe967c2a46d1036224972db9d, 2020
|
||||
# gabriumaa <gabriel.umana@delfixcr.com>, 2020
|
||||
# Gabriel Umaña <gabriel.umana@delfixcr.com>, 2020
|
||||
# Sergio Flores <vitavitae1@gmail.com>, 2020
|
||||
# Julián Andrés Osorio López <mcjulian1107@gmail.com>, 2020
|
||||
# 966ff43e6966712895a590e7320ca288, 2020
|
||||
@@ -764,8 +764,8 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Agregar información cuando hacemos la descripción de un cliente potencial para incluir\n"
|
||||
" las preguntas y respuestas vinculadas a los registros.\n"
|
||||
" Agregar información cuando hacemos la descripción de una oportunidad para incluir\n"
|
||||
" las preguntas y respuestas vinculadas a las inscripciones.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -3677,16 +3677,16 @@ msgid ""
|
||||
"this event.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Crear registros con ordenes de venta.\n"
|
||||
"========================================\n"
|
||||
"Crear inscripciones con pedidos de venta.\n"
|
||||
"=========================================\n"
|
||||
"\n"
|
||||
"Este módulo permite automatizar y conectar la creación del registro con el flujo de venta\n"
|
||||
"principal y, por tanto, disponer de la opción de facturación de los registros.\n"
|
||||
"Este módulo permite automatizar y conectar la creación de la inscripción con el flujo de venta\n"
|
||||
"principal y, por tanto, disponer de la opción de facturación de las inscripciones.\n"
|
||||
"\n"
|
||||
"Indica un nuevo tipo de productos de servicio que te ofrece la posibilidad de\n"
|
||||
"elegir una categoría de un evento asociado a este. Cuando codifique un pedido para\n"
|
||||
"Indica un nuevo tipo de productos de servicio que le ofrece la posibilidad de\n"
|
||||
"elegir una categoría de un evento asociado al mismo. Cuando introduzca un pedido para\n"
|
||||
"ese producto, podrá elegir un evento existente de esa categoría y,\n"
|
||||
"cuando confirme su pedido automáticamente, se creará un registro para\n"
|
||||
"cuando confirme su pedido automáticamente, se creará una inscripción para\n"
|
||||
"este evento.\n"
|
||||
|
||||
#. module: base
|
||||
@@ -10811,8 +10811,8 @@ msgid ""
|
||||
"Add information of sale order linked to the registration for the creation of"
|
||||
" the lead."
|
||||
msgstr ""
|
||||
"Agrega información de la orden de venta para el registro de la creación del "
|
||||
"cliente potencial."
|
||||
"Agrega información del pedido de venta enlazado a la inscripción en la "
|
||||
"creación de la oportunidad."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_mass_mailing_crm
|
||||
@@ -13471,7 +13471,7 @@ msgstr "Calcular"
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
msgstr "El método compute no puede depender del campo 'id'"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
@@ -14060,7 +14060,7 @@ msgstr "Crear una nueva iniciativa desde una conversación de chat "
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_event_crm
|
||||
msgid "Create leads from event registrations."
|
||||
msgstr "Crea leads a partir de los registros de un evento"
|
||||
msgstr "Crea oportunidades a partir de las inscripciones de un evento"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_crm_livechat
|
||||
@@ -15892,6 +15892,18 @@ msgstr "Error"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Mensaje de error devuelto cuando se viola la restricción."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Ocurrió un error al procesar la vista:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18964,11 +18976,17 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Parametro 'group by' no valido"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Expresión no válida al procesar el xpath %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
msgstr "Formato JSON no válido en el campo \"valor predeterminado\"."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -19432,7 +19450,7 @@ msgstr "LGPL versión 3"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_lt_reports
|
||||
msgid "Lithuania - Accounting Reports"
|
||||
msgstr ""
|
||||
msgstr "Lituania - Informes contables "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
@@ -31896,7 +31914,7 @@ msgstr "No puede desactivar el usuario que está usando ahora mismo."
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
msgstr "No puede eliminar el registro %s."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
@@ -31925,6 +31943,8 @@ msgstr "No se puede combinar un contacto con uno de sus padres."
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
"No puede cambiar el nombre de los parámetros de configuración con las claves"
|
||||
" %s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
|
||||
@@ -1102,7 +1102,7 @@ msgid ""
|
||||
" Make calls using a VOIP system"
|
||||
msgstr ""
|
||||
"\n"
|
||||
" Hacer llamadas usando el sistema de VOIP"
|
||||
" Haga llamadas mediante el sistema VOIP"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_sale_renting
|
||||
@@ -4677,21 +4677,21 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Helpdesk - Aplicación de gestión de tickets\n"
|
||||
"Servicio de asistencia - Aplicación de gestión de tickets\n"
|
||||
"================================\n"
|
||||
"\n"
|
||||
"Características:\n"
|
||||
"\n"
|
||||
" - Procesar tickets por diferentes etapas para resolverlos.\n"
|
||||
" - Agregue prioridades, tipos, descripciones y etiquetas para definir sus boletos.\n"
|
||||
" - Utiliza la charla para comunicar información adicional y hacer ping a los compañeros de trabajo en los tickets.\n"
|
||||
" - Disfrute del uso de un panel de control adaptado y una vista kanban fácil de usar para manejar sus tickets.\n"
|
||||
" - Realice un análisis en profundidad de sus tickets a través de la vista dinámica en el menú de informes.\n"
|
||||
" - Crea un equipo y define sus miembros, usa un método de asignación automática si lo deseas.\n"
|
||||
" - Utiliza un alias de correo para crear tickets automáticamente y comunicarse con sus clientes.\n"
|
||||
" - Agregue fechas límite del Acuerdo de nivel de servicio automáticamente a sus boletos.\n"
|
||||
" - Obtén comentarios de los clientes mediante el uso de calificaciones.\n"
|
||||
" - Instala funciones adicionales fácilmente usando la vista de formulario de su equipo.\n"
|
||||
" - Procese tickets por diferentes etapas para resolverlos.\n"
|
||||
" - Agregue prioridades, tipos, descripciones y etiquetas para definir sus tickets.\n"
|
||||
" - Utilice el chatter para comunicar información adicional y etiquetar a los compañeros de trabajo en los tickets.\n"
|
||||
" - Disfrute del uso de un tablero adaptado y una vista kanban fácil de usar para gestionar sus tickets.\n"
|
||||
" - Realice un análisis en profundidad de sus tickets a través de la vista dinámica en el menú de reportes.\n"
|
||||
" - Cree un equipo y define sus miembros, use un método de asignación automática si lo desea.\n"
|
||||
" - Utilice un alias de correo para crear tickets automáticamente y comunicarse con sus clientes.\n"
|
||||
" - Agregue fechas límite del Acuerdo de nivel de servicio automáticamente a sus tickets.\n"
|
||||
" - Obtenga comentarios de los clientes mediante el uso de calificaciones.\n"
|
||||
" - Instale funciones adicionales fácilmente usando la vista de formulario de su equipo.\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
@@ -7702,10 +7702,10 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo añade un acceso directo a uno o varios casos de oportunidad en el CRM.\n"
|
||||
"Este módulo agrega un acceso directo a uno o varios casos de oportunidad en el CRM.\n"
|
||||
"===========================================================================\n"
|
||||
"\n"
|
||||
"Este acceso te permite general una orden de renta en el caso seleccionado.\n"
|
||||
"Este acceso le permite generar una orden de alquiler en el caso seleccionado.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -7724,14 +7724,14 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo añade un atajo a uno o varios casos de oportunidades en el sistema CRM.\n"
|
||||
"Este módulo agrega un atajo a uno o varios casos de oportunidades en el sistema CRM.\n"
|
||||
"===========================================================================\n"
|
||||
"\n"
|
||||
"Este atajo permite generar un pedido basado en un caso seleccionado.\n"
|
||||
"Si hay varios casos diferentes abiertos (una lista), se genera una orden por caso.\n"
|
||||
"El caso se cierra y se vincula al pedido generado.\n"
|
||||
"Este atajo le permite generar una orden de ventas según el caso seleccionado.\n"
|
||||
"Si hay varios casos diferentes abiertos (una lista), genera una orden por caso.\n"
|
||||
"El caso se cierra y se vincula a la orden de venta generada.\n"
|
||||
"\n"
|
||||
"Te sugerimos que instales este módulo si instalaste tanto el módulo de compras\n"
|
||||
"Le sugerimos que instale este módulo si instaló tanto el módulo de compras\n"
|
||||
"como el de CRM."
|
||||
|
||||
#. module: base
|
||||
@@ -7841,7 +7841,7 @@ msgstr ""
|
||||
"Este módulo tiene como objetivo gestionar la asistencia de los empleados.\n"
|
||||
"==================================================\n"
|
||||
"\n"
|
||||
"Mantiene la cuenta de las asistencias de los empleados dependiendo de las acciones (Check in / Check out) que realicen."
|
||||
"Lleva el número de asistencias de los empleados según las acciones que realicen (como registrar su entrada o salida)."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_pos_hr
|
||||
@@ -7956,20 +7956,20 @@ msgid ""
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo permite imprimir sus pagos en papel de cheque preimpreso.\n"
|
||||
"Puede configurar la salida (diseño, información de stubs, etc.) en la configuración de la empresa y administrar la\n"
|
||||
"Puede configurar el resultado (diseño, información del talonario, etc.) en los ajustes de la empresa y administrar la\n"
|
||||
"numeración de cheques (si utiliza cheques preimpresos sin números) en la configuración del diario.\n"
|
||||
"\n"
|
||||
"Formatos admitidos\n"
|
||||
"-----------------\n"
|
||||
"Este módulo admite los tres formatos de cheques más comunes y funcionará de inmediato con los cheques vinculados de checkdepot.net.\n"
|
||||
"\n"
|
||||
"Vea todos los cheques en: https://www.checkdepot.net/checks/laser/Odoo.htm\n"
|
||||
"Consulte todos los cheques en: https://www.checkdepot.net/checks/laser/Odoo.htm\n"
|
||||
"\n"
|
||||
"Puede elegir entre:\n"
|
||||
"\n"
|
||||
"- Verifique en la parte superior: estándar Quicken / QuickBooks (https://www.checkdepot.net/checks/checkorder/laser_topcheck.htm)\n"
|
||||
"- Verificación en el medio: estándar Peachtree (https://www.checkdepot.net/checks/checkorder/laser_middlecheck.htm)\n"
|
||||
"- Verifique en la parte inferior: estándar ADP (https://www.checkdepot.net/checks/checkorder/laser_bottomcheck.htm)\n"
|
||||
"- Cheque en la parte superior: estándar Quicken / QuickBooks (https://www.checkdepot.net/checks/checkorder/laser_topcheck.htm)\n"
|
||||
"- Cheque en el medio: estándar Peachtree (https://www.checkdepot.net/checks/checkorder/laser_middlecheck.htm)\n"
|
||||
"- Cheque en la parte inferior: estándar ADP (https://www.checkdepot.net/checks/checkorder/laser_bottomcheck.htm)\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -7989,16 +7989,16 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo te permite imprimir tus pagos en cheques preimpresos. Puedes\n"
|
||||
"configurar la salida (diseño, apéndices, formato de papel, etc.) en la configuración de la empresa y administrar los\n"
|
||||
"cheques numerados (si utiliza cheques sin numeración) en la configuración del diario.\n"
|
||||
"Según la Asociación Canadiense de Pagos (https://www.payments.ca/sites/default/files/standard_006_complete_0.pdf)\n"
|
||||
"Este módulo permite imprimir sus pagos en cheques preimpresos. \n"
|
||||
"Puede configurar el resultado (diseño, talones, formato de papel, etc.) en los ajustes de la empresa y gestionar la\n"
|
||||
"numeración de los cheques (si utiliza cheques preimpresos sin números) en los ajustes del diario.\n"
|
||||
"Conforme a la Asociación Canadiense de Pago (https://www.payments.ca/sites/default/files/standard_006_complete_0.pdf)\n"
|
||||
"\n"
|
||||
"Formatos compatibles\n"
|
||||
"----------------------------\n"
|
||||
"- Cheque en la parte superior : Quicken / QuickBooks standard\n"
|
||||
"- Cheque en la parte media: Peachtree standard\n"
|
||||
"- Cheque en la parte inferior: ADP standard\n"
|
||||
"- Cheque en la parte superior: Quicken / QuickBooks estándar\n"
|
||||
"- Cheque en la parte media: Peachtree estándar \n"
|
||||
"- Cheque en la parte inferior: ADP estándar\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -8021,18 +8021,18 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo permite publicar sus revendedores / socios en su sitio web y enviarles oportunidades / clientes potenciales entrantes.\n"
|
||||
"Este módulo permite que publique a sus distribuidores y socios en su sitio web y enviarles leads y oportunidades entrantes.\n"
|
||||
"\n"
|
||||
"\n"
|
||||
"** Publica un socio **\n"
|
||||
"**Publique un socio**\n"
|
||||
"\n"
|
||||
"Para publicar un socio, establezca un * Nivel * en su formulario de contacto (en la sección Asignación de socio) y haga clic en el botón * Publicar *.\n"
|
||||
"Para publicar a un socio, establezca un *Nivel* en su formulario de contacto (en la sección Asignación de contacto) y haga clic en el botón *Publicar*.\n"
|
||||
"\n"
|
||||
"** Reenviar clientes potenciales **\n"
|
||||
"**Reenviar leads**\n"
|
||||
"\n"
|
||||
"El reenvío de clientes potenciales se puede realizar para uno o varios clientes potenciales a la vez. La acción está disponible en la sección * Socio asignado * de la vista del formulario de cliente potencial / oportunidad y en el menú * Acción * de la vista de lista.\n"
|
||||
"El reenvío de leads se puede realizar para uno o varios leads a la vez. La acción está disponible en la sección *Contacto asignado* de la vista del formulario de lead u oportunidad y en el menú *Acción* de la vista de lista.\n"
|
||||
"\n"
|
||||
"La asignación automática se calcula a partir del peso de los niveles de socios y la geolocalización. Los socios obtienen clientes potenciales que se encuentran a su alrededor.\n"
|
||||
"La asignación automática se calcula a partir de los niveles de socios y la geolocalización. Los socios reciben los leads que se encuentran cerca de ellos.\n"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
@@ -8130,8 +8130,8 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo presenta un nuevo bloque de construcción con una herramienta de lista de correo que se puede añadir en cualquier página de su web.\n"
|
||||
"Con un simple clic, tus visitantes pueden suscribirse a las listas de correo gestionadas en la aplicación marketing por email.\n"
|
||||
"Este módulo presenta un nuevo bloque de construcción con una herramienta de lista de correo que se puede agregar a cualquier página de su sitio web.\n"
|
||||
"Con un simple clic, sus visitantes pueden suscribirse a las listas de correo gestionadas en la aplicación Marketing por correo electrónico.\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -8176,10 +8176,10 @@ msgid ""
|
||||
"The service is provided by the In App Purchase Odoo platform.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"Este módulo proporciona un marco para la mensajería instantánea de SMS\n"
|
||||
"Este módulo proporciona estructura para la mensajería instantánea de SMS\n"
|
||||
"----------------------------------------------------\n"
|
||||
"\n"
|
||||
"El servicio lo presta la plataforma de la aplicación de compras de Odoo.\n"
|
||||
"El servicio lo proporciona la plataforma de compras dentro de la aplicación de Odoo.\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_contacts
|
||||
@@ -8880,19 +8880,19 @@ msgstr ""
|
||||
"\n"
|
||||
"Vehículos, arrendamiento, seguros y costos\n"
|
||||
"==================================\n"
|
||||
"Este módulo de Odoo te ayudará a gestionar todos tus vehículos, los\n"
|
||||
"Este módulo de Odoo le ayudará a gestionar todos sus vehículos, los\n"
|
||||
"contratos a los que están asociados esos vehículos, así como como los servicios, costos\n"
|
||||
"y muchas otras funciones que son necesarias para gestionar tu flota\n"
|
||||
"de vehículo(s).\n"
|
||||
"y muchas otras funciones que son necesarias para gestionar su flota\n"
|
||||
"de vehículos.\n"
|
||||
"\n"
|
||||
"Características principales\n"
|
||||
"-------------\n"
|
||||
"* Agrega vehículos a tu flota\n"
|
||||
"* Gestiona los contratos de tus vehículos\n"
|
||||
"* Recordatorio cuando se acerca la fecha de conclusión de un contrato.\n"
|
||||
"* Agrega servicios y valores de odómetro para todos tus servicios\n"
|
||||
"* Muestra todos los costos asociados a un vehículo o a un tipo de servicio\n"
|
||||
"* Análisis en gráfica de los costos\n"
|
||||
"* Agregue vehículos a su flota\n"
|
||||
"* Gestione los contratos de sus vehículos\n"
|
||||
"* Reciba un recordatorio cuando se aproxime la fecha de conclusión de un contrato.\n"
|
||||
"* Agregue servicios y valores de kilometraje a todos sus vehículos\n"
|
||||
"* Muestre todos los costos asociados a un vehículo o a un tipo de servicio\n"
|
||||
"* Reciba un análisis gráfico de los costos\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_website_mail_channel
|
||||
@@ -10085,8 +10085,7 @@ msgstr "Un módulo para generar excepciones."
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_test_lint
|
||||
msgid "A module to test Odoo code with various linters."
|
||||
msgstr ""
|
||||
"Un módulo para comprobar el código Odoo con varias comprobaciones de lint."
|
||||
msgstr "Un módulo para comprobar el código de Odoo con varios linters."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_test_impex
|
||||
@@ -11275,7 +11274,7 @@ msgid ""
|
||||
"(karma, badges, etc..)"
|
||||
msgstr ""
|
||||
"Permite entrar al perfil del sitio web de los usuarios para ver sus "
|
||||
"estadísticas (recompensas, insignias, etc.)"
|
||||
"estadísticas (karma, insignias, etc...)"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_slides_forum
|
||||
@@ -15859,6 +15858,18 @@ msgstr "Error"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Mensaje de error que aparece cuando se viola la restricción."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Ocurrió un error al procesar la vista:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18777,8 +18788,8 @@ msgstr "Versión instalada"
|
||||
#: model:ir.module.module,description:base.module_bus
|
||||
msgid "Instant Messaging Bus allow you to send messages to users, in live."
|
||||
msgstr ""
|
||||
"El canal de mensajería instantánea te permite enviar mensajes en vivo a las "
|
||||
"usuarios."
|
||||
"El canal de mensajería instantánea le permite enviar mensajes en tiempo real"
|
||||
" a los usuarios."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -18907,7 +18918,7 @@ msgstr "Unidad de intervalo"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_intrastat
|
||||
msgid "Intrastat Reports"
|
||||
msgstr "Informes Instrastat"
|
||||
msgstr "Reportes Intrastat"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.report_irmodulereference
|
||||
@@ -18932,6 +18943,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Parametro 'agrupar por' no valido"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Expresión no válida al procesar xpath %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
@@ -21266,7 +21283,7 @@ msgstr "Categoría de módulo"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.module_view_kanban
|
||||
msgid "Module Info"
|
||||
msgstr "Más información"
|
||||
msgstr "Información del módulo"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_ir_module_module__shortdesc
|
||||
@@ -31395,7 +31412,7 @@ msgstr "Servicio de asistencia del sitio web"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_helpdesk_livechat
|
||||
msgid "Website IM Livechat Helpdesk"
|
||||
msgstr "Mesa de ayuda mediante el chat en vivo del sitio web"
|
||||
msgstr "Servicio de asistencia mediante el chat en vivo del sitio web"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_jitsi
|
||||
@@ -31457,7 +31474,7 @@ msgstr "Tablero de ventas del sitio web"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_helpdesk_slides
|
||||
msgid "Website Slides Helpdesk"
|
||||
msgstr "Servicio de mesa de ayuda mediante presentaciones en el sitio web"
|
||||
msgstr "Servicio de asistencia mediante presentaciones en el sitio web"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_studio
|
||||
|
||||
@@ -33,9 +33,10 @@
|
||||
# Miika Nissi <miika.nissi@tawasta.fi>, 2022
|
||||
# Tuomo Aura <tuomo.aura@web-veistamo.fi>, 2022
|
||||
# Joakim Weckman, 2022
|
||||
# Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>, 2022
|
||||
# Richard Mouthier <rmo@odoo.com>, 2022
|
||||
# Kari Lindgren <kari.lindgren@emsystems.fi>, 2023
|
||||
# Jarmo Kortetjärvi <jarmo.kortetjarvi@gmail.com>, 2023
|
||||
# Tuomas Suutari <tuomas.suutari@anders.fi>, 2023
|
||||
# Ossi Mantylahti <ossi.mantylahti@obs-solutions.fi>, 2023
|
||||
#
|
||||
msgid ""
|
||||
@@ -14512,6 +14513,18 @@ msgstr "Virhe"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Virheilmoitus, joka palautetaan, kun rajoitusta rikotaan."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Virhe näkymää jäsentäessä:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -17548,11 +17561,17 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Virheellinen 'group by' -parametri"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Virheellinen lauseke xpathin jäsentämisen aikana %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
msgstr "Oletusarvo-kentän JSON-muoto on virheellinen."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -23121,7 +23140,7 @@ msgstr "Prioriteetti"
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__res_partner__type__private
|
||||
msgid "Private Address"
|
||||
msgstr "Kotiosoite"
|
||||
msgstr "Yksityinen osoite"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.res_partner_view_form_private
|
||||
@@ -29243,6 +29262,12 @@ msgstr "Et voi luoda rekursiivisia perittyjä näkymiä."
|
||||
msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr "Et voi poistaa itseäsi."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr "Et voi poistaa %s-tietuetta."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -29265,6 +29290,12 @@ msgstr "Et voi poistaa kieltä, joka on käyttäjän suosima kieli."
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "Et voi yhdistää yhteystietoja ylemmän tason kanssa."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr "Et voi nimetä uudelleen asetusparametrejä, joilla on avainarvoja %s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -15847,6 +15847,18 @@ msgstr "Erreur"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Message d'erreur renvoyé quand la contrainte n'est pas respectée. "
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Erreur lors de l'analyse de la vue :\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18935,6 +18947,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Paramètre invalide pour 'group by'"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Expression invalide lors de l'analyse de xpath %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -21,11 +21,12 @@
|
||||
# Vladimir Olujić <olujic.vladimir@storm.hr>, 2020
|
||||
# Karolina Tonković <karolina.tonkovic@storm.hr>, 2020
|
||||
# Tina Milas, 2020
|
||||
# Hrvoje Sić <hrvoje.sic@gmail.com>, 2021
|
||||
# hrvoje sić <hrvoje.sic@gmail.com>, 2021
|
||||
# 0ba0ac30481a756f36528ba6f9a4317e_6443a87 <52eefe24349934c364624ef40611b7a3_1010754>, 2021
|
||||
# Vladimir Vrgoč, 2022
|
||||
# Matej Mijoč, 2022
|
||||
# Bole <bole@dajmi5.com>, 2023
|
||||
# Antonijo Kovacevic, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -33,7 +34,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Bole <bole@dajmi5.com>, 2023\n"
|
||||
"Last-Translator: Antonijo Kovacevic, 2023\n"
|
||||
"Language-Team: Croatian (https://app.transifex.com/odoo/teams/41243/hr/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -10384,6 +10385,12 @@ msgstr "Puni naziv"
|
||||
msgid "Compute"
|
||||
msgstr "Izračunaj"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
msgid "Compute scores and assign leads automatically"
|
||||
@@ -10800,7 +10807,7 @@ msgstr "Županija/fed.država"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_coupon
|
||||
msgid "Coupon"
|
||||
msgstr ""
|
||||
msgstr "Kupon"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_sale_coupon
|
||||
@@ -12696,6 +12703,15 @@ msgstr "Greška"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -15619,6 +15635,18 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Neispravan 'grupiraj po' parametar"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -26883,6 +26911,12 @@ msgstr "Ne možete stvoriti rekurzivne naslijeđene prikaze."
|
||||
msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr "Ne možete deaktivirati korisnika ako ste trenutno prijavljeni kao on."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -26905,6 +26939,12 @@ msgstr ""
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "Nije moguće spajanje kontakta sa jednim od njemu nadređenih."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -8221,7 +8221,7 @@ msgstr ""
|
||||
"\n"
|
||||
"次の日付を追跡できます:\n"
|
||||
"-------------------------------\n"
|
||||
"- 人生の終わり\n"
|
||||
"- 廃棄\n"
|
||||
"- 賞味期限\n"
|
||||
"- 除去日\n"
|
||||
"- アラート日\n"
|
||||
@@ -9510,6 +9510,78 @@ msgid ""
|
||||
"\n"
|
||||
".. figure:: static/description/invoice_custom_xml.png\n"
|
||||
msgstr ""
|
||||
"==========================================\n"
|
||||
"Odooメキシコローカライゼーション 在庫/陸揚用\n"
|
||||
"==========================================\n"
|
||||
"\n"
|
||||
"このモジュールは、メキシコ・ローカライゼーションの機能を拡張し、\n"
|
||||
"電子請求書を作成する際に、陸揚原価に関連する通関番号を\n"
|
||||
"サポートします。\n"
|
||||
"\n"
|
||||
"使用\n"
|
||||
"=====\n"
|
||||
"\n"
|
||||
"このモジュールを使用するには以下が必要です:\n"
|
||||
"\n"
|
||||
"* 海外からのプロダクトの新規購買オーダを生成します。陸揚原価は\n"
|
||||
"'先入先出法'原価計算方法の'自動'評価で設定されたプロダクト\n"
|
||||
"に対してのみ可能です。原価計算方法は\n"
|
||||
"プロダクトカテゴリで設定します。\n"
|
||||
"\n"
|
||||
".. figure:: static/description/purchase_order_new.png\n"
|
||||
"\n"
|
||||
"* 購買オーダのプロダクトを受け取ります。\n"
|
||||
"\n"
|
||||
".. figure:: static/description/picking_done_purchase.png\n"
|
||||
"\n"
|
||||
"* 在庫 -> 在庫コントロール -> 陸揚原価に行きます。\n"
|
||||
"\n"
|
||||
"* 購買オーダのピッキングと通関情報の数字(pedimento)を示す新しい陸揚原価を作成します。陸揚原価は\n"
|
||||
" 実勢価格原価計算法を用いてリアルタイム評価で設定されたプロダクトに対してのみ可能です。 原価計算法はプロダクトカテゴリ\n"
|
||||
"で設定されます。\n"
|
||||
"\n"
|
||||
".. figure:: static/description/landed_cost_picking.png\n"
|
||||
"\n"
|
||||
"* Start by creating specific products to indicate your various Landed\n"
|
||||
" Costs, such as freight, insurance or custom duties.\n"
|
||||
"\n"
|
||||
" Go to Inventory -> Configuration -> Landed Cost types. Landed costs are\n"
|
||||
" only possible for products configured in real time valuation with real\n"
|
||||
" price costing method. The costing method is configured on the product\n"
|
||||
" category.\n"
|
||||
"\n"
|
||||
".. figure:: static/description/product_landed_cost.png\n"
|
||||
"\n"
|
||||
"* Click the Compute button to see how the landed costs will be split across\n"
|
||||
" the picking lines.\n"
|
||||
"\n"
|
||||
".. figure:: static/description/compute_landed_cost.png\n"
|
||||
"\n"
|
||||
"* To confirm the landed costs attribution, click on the Validate button.\n"
|
||||
"\n"
|
||||
".. figure:: static/description/validate_landed_cost.png\n"
|
||||
"\n"
|
||||
"* Create a sales order for the product purchased from abroad\n"
|
||||
"\n"
|
||||
".. figure:: static/description/sale_order_new.png\n"
|
||||
"\n"
|
||||
"* Delivery the product related to the sales order\n"
|
||||
"\n"
|
||||
".. figure:: static/description/picking_done_sale.png\n"
|
||||
"\n"
|
||||
"* Create and validate a new invoice associated with the sales order\n"
|
||||
"\n"
|
||||
".. figure:: static/description/validate_invoice_customs.png\n"
|
||||
"\n"
|
||||
"* The customs information is found in the lines of the invoice associated\n"
|
||||
" with each product.\n"
|
||||
"\n"
|
||||
".. figure:: static/description/invoice_custom_pedimento.png\n"
|
||||
"\n"
|
||||
"* Check the electronic invoice associated with the product where the node\n"
|
||||
" of the customs information is displayed\n"
|
||||
"\n"
|
||||
".. figure:: static/description/invoice_custom_xml.png\n"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
@@ -10413,6 +10485,71 @@ msgid ""
|
||||
" user with the same login (and a blank password), then rename this new\n"
|
||||
" user to a username that does not exist in LDAP, and setup its groups\n"
|
||||
msgstr ""
|
||||
"LDAPサーバによる認証のサポートを追加。===============================================\n"
|
||||
"このモジュールはユーザがLDAPユーザ名とパスワードでログインすることを許可し\n"
|
||||
"その場で自動的にOdooユーザを作成します。\n"
|
||||
"\n"
|
||||
"**メモ:** このモジュールは Python's ``python-ldap``モジュールがインストールされている場合にのみ機能します。\n"
|
||||
"\n"
|
||||
"設定:\n"
|
||||
"--------------\n"
|
||||
"このモジュールをインストールした後、一般設定メニューでLDAPパラメータを\n"
|
||||
"設定する必要があります。異なる会社は、一意のユーザ名を持っている限り、異なる\n"
|
||||
"LDAPサーバを持つことが可能です。 (ユーザ名はたとえ複数の会社にまたがっていても、\n"
|
||||
"Odoo内で一意である必要があります)\n"
|
||||
"\n"
|
||||
"Anonymous LDAP binding is also supported (for LDAP servers that allow it), by\n"
|
||||
"simply keeping the LDAP user and password empty in the LDAP configuration.\n"
|
||||
"This does not allow anonymous authentication for users, it is only for the master\n"
|
||||
"LDAP account that is used to verify if a user exists before attempting to\n"
|
||||
"authenticate it.\n"
|
||||
"\n"
|
||||
"Securing the connection with STARTTLS is available for LDAP servers supporting\n"
|
||||
"it, by enabling the TLS option in the LDAP configuration.\n"
|
||||
"\n"
|
||||
"For further options configuring the LDAP settings, refer to the ldap.conf\n"
|
||||
"manpage: manpage:`ldap.conf(5)`.\n"
|
||||
"\n"
|
||||
"Security Considerations:\n"
|
||||
"------------------------\n"
|
||||
"Users' LDAP passwords are never stored in the Odoo database, the LDAP server\n"
|
||||
"is queried whenever a user needs to be authenticated. No duplication of the\n"
|
||||
"password occurs, and passwords are managed in one place only.\n"
|
||||
"\n"
|
||||
"Odoo does not manage password changes in the LDAP, so any change of password\n"
|
||||
"should be conducted by other means in the LDAP directory directly (for LDAP users).\n"
|
||||
"\n"
|
||||
"It is also possible to have local Odoo users in the database along with\n"
|
||||
"LDAP-authenticated users (the Administrator account is one obvious example).\n"
|
||||
"\n"
|
||||
"Here is how it works:\n"
|
||||
"---------------------\n"
|
||||
" * The system first attempts to authenticate users against the local Odoo\n"
|
||||
" database;\n"
|
||||
" * if this authentication fails (for example because the user has no local\n"
|
||||
" password), the system then attempts to authenticate against LDAP;\n"
|
||||
"\n"
|
||||
"As LDAP users have blank passwords by default in the local Odoo database\n"
|
||||
"(which means no access), the first step always fails and the LDAP server is\n"
|
||||
"queried to do the authentication.\n"
|
||||
"\n"
|
||||
"Enabling STARTTLS ensures that the authentication query to the LDAP server is\n"
|
||||
"encrypted.\n"
|
||||
"\n"
|
||||
"User Template:\n"
|
||||
"--------------\n"
|
||||
"In the LDAP configuration on the General Settings, it is possible to select a *User\n"
|
||||
"Template*. If set, this user will be used as template to create the local users\n"
|
||||
"whenever someone authenticates for the first time via LDAP authentication. This\n"
|
||||
"allows pre-setting the default groups and menus of the first-time users.\n"
|
||||
"\n"
|
||||
"**Warning:** if you set a password for the user template, this password will be\n"
|
||||
" assigned as local password for each new LDAP user, effectively setting\n"
|
||||
" a *master password* for these users (until manually changed). You\n"
|
||||
" usually do not want this. One easy way to setup a template user is to\n"
|
||||
" login once with a valid LDAP user, let Odoo create a blank local\n"
|
||||
" user with the same login (and a blank password), then rename this new\n"
|
||||
" user to a username that does not exist in LDAP, and setup its groups\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_administration
|
||||
@@ -12756,7 +12893,7 @@ msgstr "集計"
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
msgstr "計算メソッドはフィールド 'id' に依存できません。"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
@@ -14871,6 +15008,45 @@ msgid ""
|
||||
"* Nhomar Hernandez <nhomar@vauxoo.com> (Planner/Auditor)\n"
|
||||
"* Luis Torres <luis_t@vauxoo.com> (Developer)\n"
|
||||
msgstr ""
|
||||
"メキシコ用電子会計と財務レポート\n"
|
||||
"===================================================\n"
|
||||
"\n"
|
||||
"メキシコ電子請求に会計レポートを追加\n"
|
||||
"\n"
|
||||
"- COA\n"
|
||||
"- 残高試算表\n"
|
||||
"- 仕訳帳項目\n"
|
||||
"\n"
|
||||
"DIOTのような他の業務レポートを追加\n"
|
||||
"\n"
|
||||
"- DIOT\n"
|
||||
"\n"
|
||||
"既知の機能漏れ:\n"
|
||||
"\n"
|
||||
"- 宣言された文書の履歴を利用できるように生成されたxmlを保存。\n"
|
||||
"-このモジュールのカバレッジを高め、将来的なリグレッションを回避するためのユニットテスト。\n"
|
||||
"\n"
|
||||
"メモ:\n"
|
||||
"------\n"
|
||||
"\n"
|
||||
" - In the taxes could be set the account `Base Tax Received Account` that is the\n"
|
||||
" account that will be set on lines created in cash basis journal entry and\n"
|
||||
" used to keep track of the tax base amount, this account is not considered in\n"
|
||||
" the Mexican reports.\n"
|
||||
"\n"
|
||||
"Configuration\n"
|
||||
"=============\n"
|
||||
"\n"
|
||||
"To configure this module, it is strongly recommended your chart of account depends of the l10n_mx data and structure,\n"
|
||||
"you can set this afterwards if you CoA do not depends of what l10n_mx does, but you will need extra manual work.\n"
|
||||
"\n"
|
||||
"Credits\n"
|
||||
"=======\n"
|
||||
"\n"
|
||||
"**Contributors**\n"
|
||||
"\n"
|
||||
"* Nhomar Hernandez <nhomar@vauxoo.com> (Planner/Auditor)\n"
|
||||
"* Luis Torres <luis_t@vauxoo.com> (Developer)\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_co_edi
|
||||
@@ -15078,6 +15254,18 @@ msgstr "エラー"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "制約に違反するとエラーメッセージが返されます。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"ビューの解析中のエラー:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18036,11 +18224,17 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "無効な グループ化 パラメーター"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
msgstr "デフォルト値フィールド内での無効なJSONフォーマット"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -18115,7 +18309,7 @@ msgstr "無効なモデル名 %r がアクションの定義にあります。"
|
||||
#: code:addons/base/models/ir_actions.py:611
|
||||
#, python-format
|
||||
msgid "many2many fields cannot be evaluated by reference"
|
||||
msgstr ""
|
||||
msgstr "多対多フィールドは参照によって評価できません。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
@@ -18490,7 +18684,7 @@ msgstr "LGPL Version 3"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_lt_reports
|
||||
msgid "Lithuania - Accounting Reports"
|
||||
msgstr ""
|
||||
msgstr "リトアニア - 会計レポート"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
@@ -26874,7 +27068,7 @@ msgstr "その `%s` モジュールは現時点では利用できないようで
|
||||
#: code:addons/base/models/ir_module.py:0
|
||||
#, python-format
|
||||
msgid "Those modules cannot be uninstalled: %s"
|
||||
msgstr ""
|
||||
msgstr "これらのモジュールはアンインストールできません:%s"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,help:base.field_res_partner_category__active
|
||||
@@ -27045,7 +27239,7 @@ msgstr "この連絡先を担当する内部ユーザー。"
|
||||
#: code:addons/base/models/res_country.py:106
|
||||
#, python-format
|
||||
msgid "The layout contains an invalid format key"
|
||||
msgstr ""
|
||||
msgstr "レイアウトは無効なフォーマットキーを含んでいます。"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,help:base.field_ir_model__inherited_model_ids
|
||||
@@ -29704,7 +29898,7 @@ msgstr "現在ログインしているユーザを無効にすることはでき
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
msgstr "%sレコードを削除することはできません。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
@@ -29732,7 +29926,7 @@ msgstr "連絡先を親の1つにマージすることはできません。"
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
msgstr "キー%sで設定パラメータの名前を変更することはできません。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -29910,7 +30104,7 @@ msgstr "バイナリ"
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__ir_model_fields__ttype__boolean
|
||||
msgid "boolean"
|
||||
msgstr "ブーリアン"
|
||||
msgstr "ブール値"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_delivery_bpost
|
||||
@@ -30142,7 +30336,7 @@ msgstr "mail_bot_hr"
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__ir_model_fields__ttype__many2many
|
||||
msgid "many2many"
|
||||
msgstr "多2多"
|
||||
msgstr "多対多"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__ir_model_fields__ttype__many2one
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
# JH CHOI <hwangtog@gmail.com>, 2021
|
||||
# Linkup <link-up@naver.com>, 2021
|
||||
# Sarah Park, 2023
|
||||
# Daye Jeong, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -19,7 +20,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Sarah Park, 2023\n"
|
||||
"Last-Translator: Daye Jeong, 2023\n"
|
||||
"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -15796,6 +15797,18 @@ msgstr "오류"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "제약 조건을 위반하면 오류 메시지가 돌아옵니다."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"보기 분석 중 오류가 발생했습니다:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -31444,7 +31457,7 @@ msgstr "현재 사용중인 사용자를 비활성화 할 수 없습니다."
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
msgstr "%s 레코드를 삭제할 수 없습니다."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
@@ -31472,7 +31485,7 @@ msgstr "연락처를 부모와 병합할 수 없습니다."
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
msgstr "%s 키를 사용하여 구성 매개 변수의 이름을 변경할 수 없습니다."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
|
||||
@@ -9077,7 +9077,7 @@ msgstr "Appraisals"
|
||||
#: model:ir.module.category,name:base.module_category_human_resources_approvals
|
||||
#: model:ir.module.module,shortdesc:base.module_approvals
|
||||
msgid "Approvals"
|
||||
msgstr ""
|
||||
msgstr "Apstiprinājumi"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_approvals_purchase
|
||||
@@ -13293,6 +13293,15 @@ msgstr "Kļūda"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -16265,6 +16274,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Invalid 'group by' parameter"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
# baaska sh <sh.baaskash@gmail.com>, 2020
|
||||
# Батмөнх Ганбат <batmunkh2522@gmail.com>, 2020
|
||||
# Sanjaajamts Badamjunai <b.sanjaajamtsfc@gmail.com>, 2021
|
||||
# hish, 2022
|
||||
# Baskhuu Lodoikhuu <baskhuujacara@gmail.com>, 2023
|
||||
# Bayarkhuu Bataa, 2023
|
||||
# hish, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -27,7 +27,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Bayarkhuu Bataa, 2023\n"
|
||||
"Last-Translator: hish, 2023\n"
|
||||
"Language-Team: Mongolian (https://app.transifex.com/odoo/teams/41243/mn/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -13019,6 +13019,15 @@ msgstr "Алдаа"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -15982,6 +15991,18 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Буруу 'бүлэглэх' параметр"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -22678,7 +22699,7 @@ msgstr "Борлуулалт"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_partner_form
|
||||
msgid "Sales & Purchase"
|
||||
msgstr ""
|
||||
msgstr "Борлуулалт, Худалдан авалт"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_project
|
||||
@@ -27333,6 +27354,12 @@ msgstr ""
|
||||
"Та өөрийн одоогоор нэвтэрсэн байгаа хэрэглэгчийн бүртгэлийг идэвхигүй болгох"
|
||||
" боломжгүй."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -27355,6 +27382,12 @@ msgstr "Та хэрэглэгчийн сонгосон хэлийг устгах
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "Эцэг хаягтай нь холбох хаягийг нэгтгэж болохгүй."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -15723,6 +15723,18 @@ msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
"Foutmelding die teruggestuurd wordt nadat de beperking niet voldaan is."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Fout bij het parseren van de weergave: \n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18798,6 +18810,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Incorrecte 'groep door' instelling"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Ongeldige expressie bij het verwerken van xpath %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -40,8 +40,8 @@
|
||||
# Tymoteusz Motylewski, 2023
|
||||
# Tadeusz Karpiński, 2023
|
||||
# Tadeusz Karpiński <tadeusz.karpinski@braintec.com>, 2023
|
||||
# Paweł Wodyński <pw@myodoo.pl>, 2023
|
||||
# Tadeusz Karpiński <tadeuszkarpinski@gmail.com>, 2023
|
||||
# Paweł Wodyński <pw@myodoo.pl>, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -49,7 +49,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Tadeusz Karpiński <tadeuszkarpinski@gmail.com>, 2023\n"
|
||||
"Last-Translator: Paweł Wodyński <pw@myodoo.pl>, 2023\n"
|
||||
"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -9023,6 +9023,14 @@ msgid ""
|
||||
" <b attrs=\"{'invisible': ['&', ('parent_id', '!=', False), ('type', '!=', False)]}\">Address</b>\n"
|
||||
" </span>"
|
||||
msgstr ""
|
||||
"<span class=\"o_form_label o_td_label\" name=\"address_name\">\n"
|
||||
" <b attrs=\"{'invisible': ['|', ('parent_id', '=', False), ('type', '!=', 'contact')]}\">Adres Firmy</b>\n"
|
||||
" <b attrs=\"{'invisible': ['|', ('parent_id', '=', False), ('type', '!=', 'invoice')]}\">Adres do Faktury</b>\n"
|
||||
" <b attrs=\"{'invisible': ['|', ('parent_id', '=', False), ('type', '!=', 'delivery')]}\">Adres Dostawy</b>\n"
|
||||
" <b attrs=\"{'invisible': ['|', ('parent_id', '=', False), ('type', '!=', 'other')]}\">Inny Adres</b>\n"
|
||||
" <b attrs=\"{'invisible': ['|', ('parent_id', '=', False), ('type', '!=', 'private')]}\">Prywatny Adres</b>\n"
|
||||
" <b attrs=\"{'invisible': ['&', ('parent_id', '!=', False), ('type', '!=', False)]}\">Adres</b>\n"
|
||||
" </span>"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_base_module_update
|
||||
@@ -15242,6 +15250,15 @@ msgstr "Błąd"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Komunikat o błędzie zwracany w przypadku naruszenia ograniczenia."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18280,6 +18297,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Nieprawidłowy parametr \"grupuj według\""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -25,9 +25,10 @@
|
||||
# Luiz Fernando <lfpsgs@outlook.com>, 2022
|
||||
# luisfreitasarxi, 2022
|
||||
# Reinaldo Ramos <reinaldo.ramos@arxi.pt>, 2022
|
||||
# Manuela Silva <mmsrs@sky.com>, 2023
|
||||
# Jolien De Paepe, 2023
|
||||
# Salomao Neto, 2023
|
||||
# Carlos Teles, 2023
|
||||
# Manuela Silva <mmsrs@sky.com>, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -35,7 +36,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Salomao Neto, 2023\n"
|
||||
"Last-Translator: Manuela Silva <mmsrs@sky.com>, 2023\n"
|
||||
"Language-Team: Portuguese (https://app.transifex.com/odoo/teams/41243/pt/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -6321,7 +6322,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_hr_appraisal_survey
|
||||
msgid "360 Feedback"
|
||||
msgstr ""
|
||||
msgstr "Avaliação 360"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.res_lang_form
|
||||
@@ -11882,7 +11883,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_documents_l10n_be_hr_payroll
|
||||
msgid "Documents - Belgian Payroll"
|
||||
msgstr ""
|
||||
msgstr "Documentos - Folha de Pagamento Belga"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_documents_hr_contract
|
||||
@@ -12409,6 +12410,15 @@ msgstr "Erro"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -15327,6 +15337,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Parâmetro 'group by' inválido"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
@@ -15538,7 +15554,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_pos_iot
|
||||
msgid "IoT for PoS"
|
||||
msgstr ""
|
||||
msgstr "IoT para PoS"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_pos_restaurant_iot
|
||||
@@ -21194,7 +21210,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_qweb
|
||||
msgid "Qweb"
|
||||
msgstr ""
|
||||
msgstr "Qweb"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_qweb_field
|
||||
@@ -25190,7 +25206,7 @@ msgstr "URL"
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_res_lang__url_code
|
||||
msgid "URL Code"
|
||||
msgstr ""
|
||||
msgstr "Código do URL"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_us_reports
|
||||
@@ -26702,6 +26718,12 @@ msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr ""
|
||||
"Não pode desativar o utilizador que utilizou para iniciar esta sessão."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -26724,6 +26746,12 @@ msgstr "Não pode eliminar o idioma que é o idioma preferido do utilizador."
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -38,11 +38,11 @@
|
||||
# Rafael H L Moretti <rafael.moretti@gmail.com>, 2020
|
||||
# Marcel Savegnago <marcel.savegnago@gmail.com>, 2020
|
||||
# Mateus Lopes <mateus1@gmail.com>, 2020
|
||||
# grazziano <gra.negocia@gmail.com>, 2020
|
||||
# grazziano <grazziano.do+transifex@gmail.com>, 2020
|
||||
# PopSolutions Cooperativa Digital <popsolutions.co@gmail.com>, 2020
|
||||
# Éder Brito <britoederr@gmail.com>, 2021
|
||||
# douglas custodio <douglascstd@yahoo.com>, 2022
|
||||
# Kevilyn Rosa, 2023
|
||||
# Éder Brito <britoederr@gmail.com>, 2023
|
||||
# Layna Nascimento, 2023
|
||||
#
|
||||
msgid ""
|
||||
@@ -10580,12 +10580,12 @@ msgstr "Tipo de Ação"
|
||||
#: model:ir.model,name:base.model_ir_actions_act_url
|
||||
#: model:ir.model.fields,field_description:base.field_ir_actions_act_url__url
|
||||
msgid "Action URL"
|
||||
msgstr "URL de ação"
|
||||
msgstr "URL da ação"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_ir_actions_act_window__usage
|
||||
msgid "Action Usage"
|
||||
msgstr "Uso de ação"
|
||||
msgstr "Uso da ação"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_actions_act_window
|
||||
@@ -13001,8 +13001,8 @@ msgid ""
|
||||
"Child server actions that will be executed. Note that the last return "
|
||||
"returned action value will be used as global return value."
|
||||
msgstr ""
|
||||
"Ações de servidor filho que serão executadas. Note-se que o último retorno "
|
||||
"retornou o valor da ação que será usado como valor de retorno global."
|
||||
"Ações secundárias de servidor que serão executadas. Observe que o último "
|
||||
"valor de ação retornado será usado como valor de retorno global."
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.cl
|
||||
@@ -13421,7 +13421,7 @@ msgstr "Calcular"
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
msgstr "O método de cálculo não pode depender do campo 'id'"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
@@ -13983,10 +13983,10 @@ msgid ""
|
||||
"not connect to the system. You can assign them groups in order to give them "
|
||||
"specific access to the applications they need to use in the system."
|
||||
msgstr ""
|
||||
"Crie e gerencie os usuários que irão acessar o sistema. Usuários podem ser "
|
||||
"desativados se não devem se conectar no sistema por um período de tempo. "
|
||||
"Você pode atribuir grupos para permitir acesso específico a aplicações que "
|
||||
"eles precisam usar no sistema."
|
||||
"Crie e gerencie os usuários que acessarão o sistema. Usuários podem ser "
|
||||
"desativados caso haja um período de tempo em que eles não devam se conectar "
|
||||
"ao sistema. Você pode atribuir grupos para conceder acesso específico aos "
|
||||
"aplicativos que eles precisam usar no sistema."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_approvals
|
||||
@@ -15835,6 +15835,18 @@ msgstr "Erro"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Mensagem de erro retornada quando a restrição é violada."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Erro ao analisar a visualização:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18142,7 +18154,7 @@ msgstr "Código ISO"
|
||||
#. module: base
|
||||
#: model:ir.model.fields,help:base.field_base_language_import__code
|
||||
msgid "ISO Language and Country code, e.g. en_US"
|
||||
msgstr "Código ISO do país e língua (ex. pt_BR)"
|
||||
msgstr "Código ISO do idioma e código do país (ex., pt_BR)"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_res_lang__iso_code
|
||||
@@ -18886,7 +18898,7 @@ msgstr "Intrastat Reports"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.report_irmodulereference
|
||||
msgid "Introspection report on objects"
|
||||
msgstr "Relatório de instrospecção nos objetos"
|
||||
msgstr "Relatório de introspecção de objetos"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -18906,11 +18918,17 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Invalid 'group by' parameter"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
msgstr "Formato JSON inválido no campo Valor padrão."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
@@ -20781,7 +20799,7 @@ msgstr "Merge Partner Line"
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_base_partner_merge_automatic_wizard
|
||||
msgid "Merge Partner Wizard"
|
||||
msgstr "Merge Partner Wizard"
|
||||
msgstr "Assistente de mesclagem de usuário"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.base_partner_merge_automatic_wizard_form
|
||||
@@ -30706,7 +30724,7 @@ msgstr "Usuários"
|
||||
#. module: base
|
||||
#: model:ir.ui.menu,name:base.menu_users
|
||||
msgid "Users & Companies"
|
||||
msgstr "Usuários & Empresas"
|
||||
msgstr "Usuários e Empresas"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_res_users_log
|
||||
@@ -31686,6 +31704,12 @@ msgstr "Você não pode criar visualizações herdadas recursivas."
|
||||
msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr "You cannot deactivate the user you're currently logged in as."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr "Você não pode deletar o registro %s."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -31709,6 +31733,12 @@ msgstr ""
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "Não é possível mesclar um contato com um de seus pais."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr "Você não pode renomear os parâmetros de configuração com as chaves %s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -11503,6 +11503,12 @@ msgstr "Полное название"
|
||||
msgid "Compute"
|
||||
msgstr "Вычислить"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
msgid "Compute scores and assign leads automatically"
|
||||
@@ -12722,7 +12728,7 @@ msgstr "Дедуплицировать другие контакты"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_users_form
|
||||
msgid "Default Company"
|
||||
msgstr ""
|
||||
msgstr "Компания по умолчанию"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_ir_filters__is_default
|
||||
@@ -13876,6 +13882,15 @@ msgstr "Ошибка"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -16876,6 +16891,18 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Ошибочный параметр 'Группировать'"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -28554,6 +28581,12 @@ msgstr ""
|
||||
"Вы не можете деактивировать пользователя, под логином которого вошли в "
|
||||
"систему."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -28576,6 +28609,12 @@ msgstr "Вы не можете удалить язык, которым поль
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "Нельзя объединить контакт со своим родителем."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -12974,6 +12974,15 @@ msgstr "Napaka"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
# Odoo Thaidev <odoothaidev@gmail.com>, 2021
|
||||
# Amin Cheloh <amincheloh@gmail.com>, 2021
|
||||
# Wichanon Jamwutthipreecha, 2022
|
||||
# Rasareeyar Lappiam, 2023
|
||||
# Ped Sansiri, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -23,7 +25,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Wichanon Jamwutthipreecha, 2022\n"
|
||||
"Last-Translator: Ped Sansiri, 2023\n"
|
||||
"Language-Team: Thai (https://app.transifex.com/odoo/teams/41243/th/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -7453,7 +7455,7 @@ msgstr "รายชื่อและที่อยู่"
|
||||
#. module: base
|
||||
#: model:res.groups,name:base.group_allow_export
|
||||
msgid "Access to export feature"
|
||||
msgstr ""
|
||||
msgstr "การใช้การส่งออกข้อมูล"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/api.py:0 code:addons/api.py:0
|
||||
@@ -7858,7 +7860,7 @@ msgstr ""
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
#, python-format
|
||||
msgid "Add direction"
|
||||
msgstr ""
|
||||
msgstr "เพิ่มทิศทาง"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
@@ -7945,7 +7947,7 @@ msgstr "ที่อยู่"
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_format_address_mixin
|
||||
msgid "Address Format"
|
||||
msgstr ""
|
||||
msgstr "รูปแบบที่อยู่"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__type
|
||||
@@ -10367,7 +10369,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_reset_view_arch_wizard__compare_view_id
|
||||
msgid "Compare To View"
|
||||
msgstr ""
|
||||
msgstr "เปรียบเทียบกับมุมมอง"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_project_timesheet_forecast_sale
|
||||
@@ -10405,6 +10407,12 @@ msgstr "Complete Name"
|
||||
msgid "Compute"
|
||||
msgstr "คำนวน"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
msgid "Compute scores and assign leads automatically"
|
||||
@@ -11897,7 +11905,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_disallowed_expenses
|
||||
msgid "Disallowed Expenses"
|
||||
msgstr ""
|
||||
msgstr "รายจ่ายต้องห้าม"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_disallowed_expenses_fleet
|
||||
@@ -12726,6 +12734,15 @@ msgstr "ผิดพลาด"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -13712,7 +13729,7 @@ msgstr ""
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.identity_check_wizard
|
||||
msgid "Forgot password?"
|
||||
msgstr ""
|
||||
msgstr "ลืมรหัสผ่าน?"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__ir_actions_act_window_view__view_mode__form
|
||||
@@ -15658,6 +15675,18 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "จัดกลุ่มตาม..."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -16654,7 +16683,7 @@ msgstr "Line"
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
#, python-format
|
||||
msgid "Linebreak"
|
||||
msgstr ""
|
||||
msgstr "แบ่งบรรทัด"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_base_partner_merge_automatic_wizard__line_ids
|
||||
@@ -20478,7 +20507,7 @@ msgstr "อื่นๆ"
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__res_partner__type__other
|
||||
msgid "Other Address"
|
||||
msgstr ""
|
||||
msgstr "ที่อยู่อื่น"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_extra
|
||||
@@ -21980,7 +22009,7 @@ msgstr "รายการ:"
|
||||
#: code:addons/base/models/ir_rule.py:0
|
||||
#, python-format
|
||||
msgid "Records: %s"
|
||||
msgstr ""
|
||||
msgstr "รายการ: %s"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_human_resources_recruitment
|
||||
@@ -22050,7 +22079,7 @@ msgstr "การตั้งค่าที่เกี่ยวข้องก
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_ir_model_fields__relation
|
||||
msgid "Related Model"
|
||||
msgstr ""
|
||||
msgstr "โมเดลที่เกี่ยวข้อง"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__partner_id
|
||||
@@ -24265,7 +24294,7 @@ msgstr "Test API"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_test_action_bindings
|
||||
msgid "Test Action Bindings"
|
||||
msgstr ""
|
||||
msgstr "Test Action Bindings"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_test_l10n_be_hr_payroll_account
|
||||
@@ -25377,6 +25406,7 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid "Too many login failures, please wait a bit before trying again."
|
||||
msgstr ""
|
||||
"การลงชื่อเข้าใช้ล้มเหลวหลายครั้ง กรุณารอซักครู่ก่อนลงชื่อเข้าใช้อีกครั้ง"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_hidden_tools
|
||||
@@ -27076,7 +27106,7 @@ msgstr "สิทธิ์การแก้ไข"
|
||||
#: model:ir.model.fields,field_description:base.field_ir_model_constraint__write_date
|
||||
#: model:ir.model.fields,field_description:base.field_ir_model_relation__write_date
|
||||
msgid "Write Date"
|
||||
msgstr ""
|
||||
msgstr "เขียนวันที่"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,help:base.field_ir_actions_server__code
|
||||
@@ -27256,6 +27286,12 @@ msgstr "You cannot create recursive Partner hierarchies."
|
||||
msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -27278,6 +27314,12 @@ msgstr ""
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -27703,7 +27745,7 @@ msgstr "many2one_reference"
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
#, python-format
|
||||
msgid "minute"
|
||||
msgstr ""
|
||||
msgstr "นาที"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.demo_failures_dialog
|
||||
|
||||
@@ -15931,6 +15931,18 @@ msgstr "Помилка"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "Повідомлення про помилку повертається, коли порушується обмеження."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"Помилка під час аналізу перегляду:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -19002,6 +19014,12 @@ msgstr ""
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "Недійсний параметр \"групувати за\""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr "Недійсний вираз під час парсингу xpath %r"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
@@ -31891,7 +31909,7 @@ msgstr "Ви не можете вимкнути користувача, чере
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr ""
|
||||
msgstr "Ви не можете видалити запис %s."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
@@ -31921,6 +31939,7 @@ msgstr ""
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr ""
|
||||
"Ви не можете перейменувати параметри конфігурації за допомогою ключів %s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
# 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2022
|
||||
# Raymond Yu <cl_yu@hotmail.com>, 2022
|
||||
# Emily Jia <eji@odoo.com>, 2023
|
||||
# Chloe Wang, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
@@ -73,7 +74,7 @@ msgstr ""
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-11-27 13:50+0000\n"
|
||||
"PO-Revision-Date: 2020-09-07 08:09+0000\n"
|
||||
"Last-Translator: Emily Jia <eji@odoo.com>, 2023\n"
|
||||
"Last-Translator: Chloe Wang, 2023\n"
|
||||
"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -13443,6 +13444,12 @@ msgstr "完整名称"
|
||||
msgid "Compute"
|
||||
msgstr "计算"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_model.py:0
|
||||
#, python-format
|
||||
msgid "Compute method cannot depend on field 'id'"
|
||||
msgstr "计算方法不能依赖于字段 \"id\""
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_crm_score
|
||||
msgid "Compute scores and assign leads automatically"
|
||||
@@ -15802,6 +15809,18 @@ msgstr "错误"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "违反约束时返回的错误信息。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
"解析视图时出错:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -18775,6 +18794,18 @@ msgstr "指定的无效\"订单\"(%s)。有效的\"订单\"规范是有效
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "无效的“分组”参数"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
msgid "Invalid JSON format in Default Value field."
|
||||
msgstr "默认值字段中的 JSON 格式无效。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
@@ -31332,6 +31363,12 @@ msgstr "您不能创建递归继承视图。"
|
||||
msgid "You cannot deactivate the user you're currently logged in as."
|
||||
msgstr "不能禁用你当前正在使用的用户。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot delete the %s record."
|
||||
msgstr "您不能删除 %s 记录。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/res_lang.py:0
|
||||
#, python-format
|
||||
@@ -31354,6 +31391,12 @@ msgstr "不能删除用户的默认语言。"
|
||||
msgid "You cannot merge a contact with one of his parent."
|
||||
msgstr "您不能把联系人和其父项合并。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_config_parameter.py:0
|
||||
#, python-format
|
||||
msgid "You cannot rename config parameters with keys %s"
|
||||
msgstr "不能重命名键值为%s的配置参数"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/models.py:0
|
||||
#, python-format
|
||||
|
||||
@@ -4,14 +4,15 @@
|
||||
#
|
||||
# Translators:
|
||||
# amos lin <seeing@edirect168.com>, 2020
|
||||
# Martin Trigaux, 2020
|
||||
# sejun huang <sejun.huang@gmail.com>, 2020
|
||||
# zhengwei wu <wzw15199@gmail.com>, 2020
|
||||
# Mandy Choy <mnc@odoo.com>, 2021
|
||||
# dott.dev <dottdot.dev@gmail.com>, 2021
|
||||
# Shigurefox <tom.liang@omniwaresoft.com.tw>, 2021
|
||||
# 敬雲 林 <chingyun@yuanchih-consult.com>, 2022
|
||||
# Benson <Benson.Dr@Gmail.com>, 2022
|
||||
# Martin Trigaux, 2023
|
||||
# Wil Odoo, 2023
|
||||
# 敬雲 林 <chingyun@yuanchih-consult.com>, 2023
|
||||
# Benson <Benson.Dr@Gmail.com>, 2023
|
||||
# Tony Ng, 2023
|
||||
#
|
||||
msgid ""
|
||||
@@ -1478,7 +1479,7 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"在 稅務雲 計算中管理折扣.\n"
|
||||
"在 TaxCloud 計算中管理折扣.\n"
|
||||
" 請參閱 https://taxcloud.com/support/discounts 或\n"
|
||||
" https://service.taxcloud.net/hc/en-us/articles/360015649791-How-can-discounts-be-applied-\n"
|
||||
"\n"
|
||||
@@ -1508,7 +1509,7 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"在 稅務雲 計算中通過交付管理折扣.\n"
|
||||
"在 TaxCloud 計算中通過交付管理折扣.\n"
|
||||
" 本模組遵循與\"會計稅雲-銷售(優惠券)\"相同的邏輯.\n"
|
||||
" 可以在那裡找到有關如何為 TaxCloud 進行折扣計算的更多信息.\n"
|
||||
"\n"
|
||||
@@ -2273,7 +2274,7 @@ msgid ""
|
||||
"Add relation information between Sale Orders and Purchase Orders if Make to Order (MTO) is activated on one sold product.\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"如果在一個已售產品上啟用按訂單生產 (MTO),則增加銷售訂單和採購訂單之間的關係訊息. \n"
|
||||
"若出售產品已啟用特別訂製(MTO),會加入銷售訂單與採購訂單之間的關係資訊。\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_documents_project
|
||||
@@ -3330,7 +3331,7 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"使用 稅務雲 和美國客戶的位址自動計算加值稅。\n"
|
||||
"使用 TaxCloud 和美國客戶的位址自動計算加值稅。\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
@@ -4121,66 +4122,6 @@ msgid ""
|
||||
"For Development information go to http://www.afip.gob.ar/fe/documentos/WSBFEv1%20-%20Manual%20para%20el%20desarrollador.pdf\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"\n"
|
||||
"功能性\n"
|
||||
"----------\n"
|
||||
"\n"
|
||||
"能夠在 Odoo 中建立日誌以建立電子客戶應收憑單並報告給 AFIP (通過網路服務).\n"
|
||||
"可用的選項有:\n"
|
||||
"\n"
|
||||
" * 電子票據 - 網路服務\n"
|
||||
" * 出口憑證 - 網路服務\n"
|
||||
" * 電子財政債券 - 網路服務\n"
|
||||
"\n"
|
||||
"在電子日記帳中,如果您驗證票據,此票據將同時在 Odoo 和 AFIP 中驗證. 此驗證是即時進行的,我們收到來自 AFIP 的 \"已批准/已批准/已觀察/拒絕\" 狀態. 如果票據已被 AFIP 拒絕,則不會在系統中過帳,並且將顯示一條彈出訊息,其中包含我們收到的錯誤詳細訊息 (拒絕原因) 和有關問題可能是什麼的提示.\n"
|
||||
"\n"
|
||||
"出於審計和故障排除目的,我們還增加了一個功能表\"在 AFIP 中諮詢票據\",讓我們可以查閱先前發送到 AFIP 的票據和用作支援 Odoo 和 AFIP 之間序列同步的任何可能問題的最後一個號碼.\n"
|
||||
"\n"
|
||||
" 注意:從日誌的表單視圖中,我們可以強制同步\n"
|
||||
" 在每個文檔類型的 odoo 序列之間使用 AFIP 中登記的最後一個數字.\n"
|
||||
"\n"
|
||||
"從供應商賬單中,我們增加了一個功能,可以\n"
|
||||
" 在會計設定中設定能夠驗證 AFIP 中的供應商賬單以檢查供應商賬單是否真實 (更多訊息請查看設定說明).\n"
|
||||
"\n"
|
||||
"設定:\n"
|
||||
"\n"
|
||||
"1. 轉到會計設定 > 阿根廷本地化部分\n"
|
||||
"\n"
|
||||
" 1.1.設定 AFIP Web 服務模式:\n"
|
||||
"\n"
|
||||
" * 測試環境,以便使用演示證書來測試實例,並向 AFIP 開具非真實發票。只是為了測試。對於已經預先定義的演示實例,您無需對其進行設定(在 AFIP 中通常稱為 Homologation 環境)。\n"
|
||||
" * 為AFIP產生真實證書和合法發票的生產環境,\n"
|
||||
"\n"
|
||||
" 1.2.設定您的 AFIP 證書:如果您在演示實例中,則預設情況下已設定該證書。如果您在生產實例中,只需上傳您的 AFIP 證書\n"
|
||||
"\n"
|
||||
" 1.3.您可以選擇定義是否可以驗證供應商 AFIP 中的賬單.\n"
|
||||
"\n"
|
||||
"2. 建立銷售日誌,代表您想在 Odoo 中使用的每個 AFIP POS (在 AFIP 門戶中可用).\n"
|
||||
"\n"
|
||||
" 2.1.預設情況下設定使用文件欄位請不要更改\n"
|
||||
" 2.2.為其中一個電子系統設定 AFIP POS 系統.\n"
|
||||
"\n"
|
||||
" * 電子發票 - 網路服務'\n"
|
||||
" * 電子財政債券 - 網路服務'\n"
|
||||
" * 出口憑證 - 網路服務'\n"
|
||||
"\n"
|
||||
" 2.3.考慮到您在 AFIP 門戶中設定的內容,設定 AFIP POS 號碼和 AFIP POS 地址.\n"
|
||||
"\n"
|
||||
" 注意: 您可以使用日記帳表單中的\"檢查可用的 AFIP POS\"按鈕來確認用於建立日記帳的.\n"
|
||||
"\n"
|
||||
"有關阿根廷電子發票的更多信息,請存取 http://www.afip.gob.ar/fe/ayuda.asp\n"
|
||||
"\n"
|
||||
"技術的\n"
|
||||
"---------\n"
|
||||
"\n"
|
||||
"實現的 Web 服務是最常見的:\n"
|
||||
"\n"
|
||||
"* wsfev1 - “Factura Electrónica”(電子發票)\n"
|
||||
"* wsbfev1 - “Bono Fiscal Electrónico”(電子財政債券)\n"
|
||||
"* wsfexv1 - “Factura de Exportación Electrónica”(電子出口發票 - 與出口憑證相同)\n"
|
||||
"* wscdc - “Constatación de Comprobantes”(發票驗證)\n"
|
||||
"\n"
|
||||
"有關開發信息,請存取 http://www.afip.gob.ar/fe/documentos/WSBFEv1%20-%20Manual%20para%20el%20desarrollador.pdf\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_l10n_latam_invoice_document
|
||||
@@ -4898,10 +4839,11 @@ msgid ""
|
||||
" "
|
||||
msgstr ""
|
||||
"\n"
|
||||
"導致門票\n"
|
||||
"潛在客戶至支援請求\n"
|
||||
"===============\n"
|
||||
"\n"
|
||||
"連結模組以對應指向票證的導線 "
|
||||
"連結模組,以將潛在客戶對應至支援請求\n"
|
||||
" "
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_board
|
||||
@@ -8919,7 +8861,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"%(previous_message)s\n"
|
||||
"\n"
|
||||
"Implicitly accessed through '%(document_kind)s' (%(document_model)s)."
|
||||
"透過「%(document_kind)s」(%(document_model)s)隱含存取。"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
@@ -9496,7 +9438,7 @@ msgstr "<strong>依賴:</strong>"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_res_company_kanban
|
||||
msgid "<strong>Email:</strong>"
|
||||
msgstr "<strong>電子郵件地址:</strong>"
|
||||
msgstr "<strong>電郵:</strong>"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.report_irmodeloverview
|
||||
@@ -9542,7 +9484,7 @@ msgstr "<strong>姓名</strong>"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_res_company_kanban
|
||||
msgid "<strong>Phone:</strong>"
|
||||
msgstr "<strong>電話:</strong>"
|
||||
msgstr "<strong>電話:</strong>"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_res_company_kanban
|
||||
@@ -10174,12 +10116,12 @@ msgstr "科目 TaxCloud - 銷售"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_coupon_taxcloud
|
||||
msgid "Account Taxcloud - Sale (coupon)"
|
||||
msgstr "會計科目稅務雲 - 銷售(優惠券)"
|
||||
msgstr "會計科目TaxCloud - 銷售(優惠券)"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_sale_coupon_taxcloud_delivery
|
||||
msgid "Account Taxcloud - Sale (coupon) - Delivery"
|
||||
msgstr "會計科目稅務雲 - 銷售(優惠券) - 交貨"
|
||||
msgstr "會計科目TaxCloud - 銷售(優惠券) - 交貨"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_winbooks_import
|
||||
@@ -10442,7 +10384,7 @@ msgstr "在討論中加入OdooBot"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_sale_subscription_sepa_direct_debit
|
||||
msgid "Add SEPA Direct Debit as payment method to subscriptions"
|
||||
msgstr "將 SEPA 直接借記增加為訂閱的付款方式"
|
||||
msgstr "新增 SEPA 直接扣賬,作為定期訂購可用付款方式"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_crm_sms
|
||||
@@ -10580,9 +10522,6 @@ msgid ""
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
msgstr ""
|
||||
"Addison Olson works in IT sector <b>since 10 years</b>. He is known\n"
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
@@ -11232,7 +11171,7 @@ msgstr "應用在寫入"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_calendar
|
||||
msgid "Appointments"
|
||||
msgstr "約會"
|
||||
msgstr "預約"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_hr_appraisal
|
||||
@@ -11620,9 +11559,7 @@ msgstr "阿塞拜疆"
|
||||
msgid ""
|
||||
"Azure Interior brings honesty and seriousness to wood industry while helping"
|
||||
" customers deal with trees, flowers and fungi."
|
||||
msgstr ""
|
||||
"Azure Interior brings honesty and seriousness to wood industry while helping"
|
||||
" customers deal with trees, flowers and fungi."
|
||||
msgstr "Azure Interior 在幫助客戶處理樹木、花卉和真菌的同時,為木材行業帶來誠實和認真."
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.industry,full_name:base.res_partner_industry_B
|
||||
@@ -12104,7 +12041,7 @@ msgstr "綁定檢視類型"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_blog
|
||||
msgid "Blogs"
|
||||
msgstr "部落格"
|
||||
msgstr "網誌"
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.bo
|
||||
@@ -12153,9 +12090,9 @@ msgid ""
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
msgstr ""
|
||||
"Brandon works in IT sector <b>since 10 years</b>. He is known\n"
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
"Brandon <b>在 IT 行業工作了 10 年</b>。 他是眾所周知的\n"
|
||||
" 尤其是出售捕鼠器。 用那個把戲他砍了\n"
|
||||
" IT 預算在過去 2 年內減少了近一半."
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.br
|
||||
@@ -12858,9 +12795,9 @@ msgid ""
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
msgstr ""
|
||||
"Colleen Diaz works in IT sector <b>since 10 years</b>. He is known\n"
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
"Colleen Diaz <b>在 IT 領域工作了 10 年</b>。 他是眾所周知的\n"
|
||||
" 尤其是出售捕鼠器。 用那個把戲他砍了\n"
|
||||
" IT 預算在過去 2 年內減少了近一半."
|
||||
|
||||
#. module: base
|
||||
#: model:res.country,name:base.co
|
||||
@@ -13060,7 +12997,7 @@ msgstr "公司標語"
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__company_type
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__company_type
|
||||
msgid "Company Type"
|
||||
msgstr "公司類別"
|
||||
msgstr "公司類型"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
@@ -13595,7 +13532,7 @@ msgstr "為現場服務工作人員創建報告"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_crm_helpdesk
|
||||
msgid "Create Tickets from Leads"
|
||||
msgstr ""
|
||||
msgstr "從潛在客戶建立支援請求"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_model_menu_create
|
||||
@@ -14303,9 +14240,7 @@ msgstr "小數分割符"
|
||||
msgid ""
|
||||
"Deco Addict brings honesty and seriousness to wood industry while helping "
|
||||
"customers deal with trees, flowers and fungi."
|
||||
msgstr ""
|
||||
"Deco Addict brings honesty and seriousness to wood industry while helping "
|
||||
"customers deal with trees, flowers and fungi."
|
||||
msgstr "Deco Addict 為木材行業帶來誠實和認真,同時幫助客戶處理樹木、花卉和真菌."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.actions.act_window,name:base.action_partner_deduplicate
|
||||
@@ -15024,9 +14959,9 @@ msgid ""
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
msgstr ""
|
||||
"Douglas Fletcher works in IT sector <b>since 10 years</b>. He is known\n"
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
"Douglas Fletcher <b>在 IT 領域工作了 10 年</b>。 他是眾所周知的\n"
|
||||
" 尤其是出售捕鼠器。 用那個把戲他砍了\n"
|
||||
" IT 預算在過去 2 年內減少了近一半."
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.title,shortcut:base.res_partner_title_doctor
|
||||
@@ -15290,7 +15225,7 @@ msgstr "元素 '%s' 在父視圖中沒有找到"
|
||||
#: model_terms:ir.ui.view,arch_db:base.contact
|
||||
#, python-format
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
msgstr "電郵"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_users_form
|
||||
@@ -15478,6 +15413,15 @@ msgstr "錯誤"
|
||||
msgid "Error message returned when the constraint is violated."
|
||||
msgstr "違反約束時返回的錯誤消息."
|
||||
|
||||
#. module: base
|
||||
#: code:addons/translate.py:0
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Error while parsing view:\n"
|
||||
"\n"
|
||||
"%s"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_ui_view.py:0
|
||||
#, python-format
|
||||
@@ -15744,7 +15688,7 @@ msgstr "導出用ABA信用轉帳的付款"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_account_sepa
|
||||
msgid "Export payments as SEPA Credit Transfer files"
|
||||
msgstr "導出用SEPA信用轉帳的付款"
|
||||
msgstr "將付款匯出為 SEPA 轉賬付款文件"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_ir_exports
|
||||
@@ -16454,9 +16398,9 @@ msgid ""
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
msgstr ""
|
||||
"Floyd Steward works in IT sector <b>since 10 years</b>. He is known\n"
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years."
|
||||
"Floyd Steward <b>在 IT 領域工作了 10 年</b>。 他是眾所周知的\n"
|
||||
" 尤其是出售捕鼠器。 用那個把戲他砍了\n"
|
||||
" IT 預算在過去 2 年內減少了近一半."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__report_paperformat__format__folio
|
||||
@@ -16624,7 +16568,7 @@ msgstr "週五"
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_ir_sequence_date_range__date_from
|
||||
msgid "From"
|
||||
msgstr "來自"
|
||||
msgstr "由"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_sale_management
|
||||
@@ -16814,7 +16758,7 @@ msgstr "產生定期憑單並管理續訂"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_links
|
||||
msgid "Generate trackable & short URLs"
|
||||
msgstr "產生可追蹤的 & 短連結URLs"
|
||||
msgstr "產生可追蹤的簡短網址"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.ir_property_view_search
|
||||
@@ -16996,10 +16940,10 @@ msgid ""
|
||||
" IT budget by almost half within the last 2 years.\n"
|
||||
" Famous Senior Consultant."
|
||||
msgstr ""
|
||||
"Gordon Owens works in IT sector <b>since 10 years</b>. He is known\n"
|
||||
" notably for selling mouse traps. With that trick he cut\n"
|
||||
" IT budget by almost half within the last 2 years.\n"
|
||||
" Famous Senior Consultant."
|
||||
"Gordon Owens <b>在 IT 領域工作了 10 年</b>。 他是眾所周知的\n"
|
||||
" 尤其是出售捕鼠器。 用那個把戲他砍了\n"
|
||||
" IT 預算在過去 2 年內減少了近一半。\n"
|
||||
" 著名高級顧問."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields.selection,name:base.selection__ir_actions_act_window_view__view_mode__graph
|
||||
@@ -17927,28 +17871,28 @@ msgstr "圖像"
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__image_1024
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__image_1024
|
||||
msgid "Image 1024"
|
||||
msgstr "畫素 1024"
|
||||
msgstr "圖像 1024"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_image_mixin__image_128
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__image_128
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__image_128
|
||||
msgid "Image 128"
|
||||
msgstr "畫素 128"
|
||||
msgstr "圖像 128"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_image_mixin__image_256
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__image_256
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__image_256
|
||||
msgid "Image 256"
|
||||
msgstr "畫素 256"
|
||||
msgstr "圖像 256"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_image_mixin__image_512
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__image_512
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__image_512
|
||||
msgid "Image 512"
|
||||
msgstr "畫素 512"
|
||||
msgstr "圖像 512"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model,name:base.model_image_mixin
|
||||
@@ -18456,6 +18400,12 @@ msgstr "指定的\"訂單\"無效(%s). 有效的\"順序\"規範是以逗號分
|
||||
msgid "Invalid 'group by' parameter"
|
||||
msgstr "無效的「分組」參數"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/template_inheritance.py:0
|
||||
#, python-format
|
||||
msgid "Invalid Expression while parsing xpath %r"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_default.py:0
|
||||
#, python-format
|
||||
@@ -19341,7 +19291,7 @@ msgstr "線索評分"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_crm_helpdesk
|
||||
msgid "Lead to Tickets"
|
||||
msgstr ""
|
||||
msgstr "潛在客戶至支援請求"
|
||||
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.module_view_kanban
|
||||
@@ -19629,7 +19579,7 @@ msgstr "長"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_pos_loyalty
|
||||
msgid "Loyalty Program"
|
||||
msgstr "忠誠計劃"
|
||||
msgstr "會員計劃"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_pos_loyalty
|
||||
@@ -22361,103 +22311,6 @@ msgid ""
|
||||
"emails directly into the application.\n"
|
||||
"\n"
|
||||
msgstr ""
|
||||
"Odoo Mass Mailing\n"
|
||||
"-----------------\n"
|
||||
"\n"
|
||||
"Easily send mass mailing to your leads, opportunities or customers\n"
|
||||
"with Odoo <a href=\"https://www.odoo.com/page/mailing#\">Email Marketing</a>. Track\n"
|
||||
"marketing campaigns performance to improve conversion rates. Design\n"
|
||||
"professional emails and reuse templates in a few clicks.\n"
|
||||
"\n"
|
||||
"Send Professional Emails\n"
|
||||
"------------------------\n"
|
||||
"\n"
|
||||
"Import database of prospects or filter on existing leads, opportunities and\n"
|
||||
"customers in just a few clicks.\n"
|
||||
"\n"
|
||||
"Define email templates to reuse content or specific design for your newsletter.\n"
|
||||
"Setup several email servers with their own IP/domain to optimise opening rates.\n"
|
||||
"\n"
|
||||
"Organize Marketing Campaigns\n"
|
||||
"----------------------------\n"
|
||||
"\n"
|
||||
"Design, Send, Track by Campaigns with our <a href=\"https://www.odoo.com/page/mailing\">Lead Automation</a> app.\n"
|
||||
"\n"
|
||||
"Get real time statistics on campaigns performance to improve your conversion\n"
|
||||
"rate. Track mails sent, received, opened and answered.\n"
|
||||
"\n"
|
||||
"Easily manage your marketing campaigns, discussion groups, leads and\n"
|
||||
"opportunities in one simple and powerful platform.\n"
|
||||
"\n"
|
||||
"Integrated with Odoo Apps\n"
|
||||
"-------------------------\n"
|
||||
"\n"
|
||||
"Get access to mass mailing features from every Odoo app to improve the way your\n"
|
||||
"users communicate.\n"
|
||||
"\n"
|
||||
"Send template of emails from Odoo <a href=\"https://www.odoo.com/page/mailing\">CRM opportunities</a>, select leads based\n"
|
||||
"on marketing segments, send <a href=\"https://www.odoo.com/page/recruitment\">job offers</a> and automate\n"
|
||||
"answers to applicants, reuse email template in the lead automation marketing\n"
|
||||
"campaigns.\n"
|
||||
"\n"
|
||||
"Answers to your emails appears automatically in the history of every document\n"
|
||||
"with the social network module.\n"
|
||||
"\n"
|
||||
"Clean Your Lead Database\n"
|
||||
"------------------------\n"
|
||||
"\n"
|
||||
"Get a clean lead database that improves over the time using the performance of\n"
|
||||
"your mails. Odoo handle bounce mails efficiently, flag erroneous leads\n"
|
||||
"accordingly and gives you statistics on the quality of your leads.\n"
|
||||
"\n"
|
||||
"One click emails send\n"
|
||||
"---------------------\n"
|
||||
"\n"
|
||||
"The marketing department will love working on campaigns. But you can also give\n"
|
||||
"a one click mass mailing facility to all others users on their own prospects or\n"
|
||||
"documents.\n"
|
||||
"\n"
|
||||
"Select a few documents (e.g. leads, support tickets, suppliers, applicants,\n"
|
||||
"...) and send emails to their contacts in one click, reusing existing emails\n"
|
||||
"templates.\n"
|
||||
"\n"
|
||||
"Follow-up On Answers\n"
|
||||
"--------------------\n"
|
||||
"\n"
|
||||
"The chatter feature enables you to communicate faster and more efficiently with\n"
|
||||
"your customer. Get documents created automatically (leads, opportunities,\n"
|
||||
"tasks, ...) based on answers to your mass mailing campaigns Follow the\n"
|
||||
"discussion directly on the business documents within Odoo or via email.\n"
|
||||
"\n"
|
||||
"Get all the negotiations and discussions attached to the right document and\n"
|
||||
"relevent managers notified on specific events.\n"
|
||||
"\n"
|
||||
"Campaigns Dashboard\n"
|
||||
"-------------------\n"
|
||||
"\n"
|
||||
"Get the insights you need to make smarter marketing campaign. Track statistics\n"
|
||||
"per campaign: bounce rates, sent mails, best content, etc. The clear dashboards\n"
|
||||
"gives you a direct overview of your campaign performance.\n"
|
||||
"\n"
|
||||
"Fully Integrated With Others Apps\n"
|
||||
"---------------------------------\n"
|
||||
"\n"
|
||||
"Define automated actions (e.g. ask a salesperson to call, send an email, ...)\n"
|
||||
"based on triggers (no activity since 20 days, answered a promotional email,\n"
|
||||
"etc.)\n"
|
||||
"\n"
|
||||
"Optimize campaigns from lead to close, on every channel. Make smarter decisions\n"
|
||||
"about where to invest and show the impact of your marketing activities on your\n"
|
||||
"company's bottom line.\n"
|
||||
"\n"
|
||||
"Integrate a contact form in your website easily. Forms submissions create leads\n"
|
||||
"automatically in Odoo CRM. Leads can be used in marketing campaigns.\n"
|
||||
"\n"
|
||||
"Manage your <a href=\"https://www.odoo.com/page/crm\">sales funnel</a> with no\n"
|
||||
"effort. Attract leads, follow-up on phone calls and meetings. Analyse the\n"
|
||||
"quality of your leads to make informed decisions and save time by integrating\n"
|
||||
"emails directly into the application.\n"
|
||||
"\n"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_l10n_mx_reports
|
||||
@@ -23475,7 +23328,7 @@ msgstr "選項"
|
||||
#: model:ir.model.fields,help:base.field_ir_actions_act_window__domain
|
||||
msgid ""
|
||||
"Optional domain filtering of the destination data, as a Python expression"
|
||||
msgstr "目標資料的可選篩選條件,使用 Python 表達式"
|
||||
msgstr "目標資料的可選用篩選範圍,使用 Python 表達式"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,help:base.field_ir_actions_act_url__help
|
||||
@@ -25302,9 +25155,7 @@ msgstr "只讀"
|
||||
msgid ""
|
||||
"Ready Mat brings honesty and seriousness to wood industry while helping "
|
||||
"customers deal with trees, flowers and fungi."
|
||||
msgstr ""
|
||||
"Ready Mat brings honesty and seriousness to wood industry while helping "
|
||||
"customers deal with trees, flowers and fungi."
|
||||
msgstr "Ready Mat 為木材行業帶來誠實和認真,同時幫助客戶處理樹木、花卉和真菌."
|
||||
|
||||
#. module: base
|
||||
#: model:res.partner.industry,name:base.res_partner_industry_L
|
||||
@@ -25420,7 +25271,7 @@ msgstr "服務端動作存在循環調用"
|
||||
#: model:ir.model.fields.selection,name:base.selection__ir_server_object_lines__evaluation_type__reference
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_partner_form
|
||||
msgid "Reference"
|
||||
msgstr "編號"
|
||||
msgstr "客戶成功案例"
|
||||
|
||||
#. module: base
|
||||
#: code:addons/base/models/ir_qweb_fields.py:0
|
||||
@@ -25799,7 +25650,7 @@ msgstr "規則"
|
||||
#. module: base
|
||||
#: model_terms:ir.ui.view,arch_db:base.view_rule_form
|
||||
msgid "Rule Definition (Domain Filter)"
|
||||
msgstr "規則定義( Domain 篩選)"
|
||||
msgstr "規則定義(範圍篩選)"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.constraint,message:base.constraint_ir_rule_no_access_rights
|
||||
@@ -25860,12 +25711,12 @@ msgstr "SEPA國家"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_sepa
|
||||
msgid "SEPA Credit Transfer"
|
||||
msgstr "SEPA 信用轉帳"
|
||||
msgstr "SEPA 轉賬付款"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_account_sepa_direct_debit
|
||||
msgid "SEPA Direct Debit"
|
||||
msgstr "SEPA 直接借記"
|
||||
msgstr "SEPA 直接扣賬"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_hr_payroll_account_sepa
|
||||
@@ -26529,7 +26380,7 @@ msgstr "塞內加爾"
|
||||
#: model:ir.module.module,description:base.module_payment_sepa_direct_debit
|
||||
#: model:ir.module.module,shortdesc:base.module_payment_sepa_direct_debit
|
||||
msgid "Sepa Direct Debit Payment Acquirer"
|
||||
msgstr "Sepa 直接借記收款方"
|
||||
msgstr "SEPA 直接扣賬付款服務商"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,field_description:base.field_res_lang__grouping
|
||||
@@ -27264,7 +27115,7 @@ msgstr "街道..."
|
||||
#: model:ir.model.fields,field_description:base.field_res_partner__street2
|
||||
#: model:ir.model.fields,field_description:base.field_res_users__street2
|
||||
msgid "Street2"
|
||||
msgstr "街道 2"
|
||||
msgstr "街道第二行"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,description:base.module_payment_stripe
|
||||
@@ -27368,7 +27219,7 @@ msgstr "補充參數"
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_event_track_live
|
||||
msgid "Support live tracks: streaming, participation, youtube"
|
||||
msgstr "支援直播曲目: 流媒體、參與、youtube"
|
||||
msgstr ""
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_quality_control_picking_batch
|
||||
@@ -27378,7 +27229,7 @@ msgstr "支持批量調撥的品質管控"
|
||||
#. module: base
|
||||
#: model:res.country,name:base.sr
|
||||
msgid "Suriname"
|
||||
msgstr "蘇裡南"
|
||||
msgstr "蘇里南"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.category,name:base.module_category_marketing_surveys
|
||||
@@ -27801,9 +27652,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"The Jackson Group brings honesty and seriousness to wood industry while "
|
||||
"helping customers deal with trees, flowers and fungi."
|
||||
msgstr ""
|
||||
"The Jackson Group brings honesty and seriousness to wood industry while "
|
||||
"helping customers deal with trees, flowers and fungi."
|
||||
msgstr "傑克遜集團為木業帶來誠實和認真,同時幫助客戶處理樹木、花卉和真菌."
|
||||
|
||||
#. module: base
|
||||
#: model:ir.model.fields,help:base.field_res_lang__url_code
|
||||
@@ -29093,12 +28942,12 @@ msgstr "推特片段"
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_website_twitter_wall
|
||||
msgid "Twitter Wall"
|
||||
msgstr "推特牆"
|
||||
msgstr "Twitter 訊息牆"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,summary:base.module_website_twitter
|
||||
msgid "Twitter scroller snippet in website"
|
||||
msgstr "網站上的推特(Twitter)滾動條代碼段"
|
||||
msgstr "網站內 Twitter 捲動小資料"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_auth_totp
|
||||
@@ -29805,7 +29654,7 @@ msgstr "烏茲別克斯坦"
|
||||
#: model:res.country,vat_label:base.uk
|
||||
#, python-format
|
||||
msgid "VAT"
|
||||
msgstr "增值稅"
|
||||
msgstr "統一編號"
|
||||
|
||||
#. module: base
|
||||
#: model:ir.module.module,shortdesc:base.module_base_vat
|
||||
|
||||
@@ -573,8 +573,8 @@ class AssetsBundle(object):
|
||||
rtlcss = misc.find_in_path('rtlcss.cmd')
|
||||
except IOError:
|
||||
rtlcss = 'rtlcss'
|
||||
cmd = [rtlcss, '-']
|
||||
|
||||
cmd = [rtlcss, '-c', get_resource_path("base", "data/rtlcss.json"), '-']
|
||||
|
||||
try:
|
||||
rtlcss = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
||||
|
||||
@@ -1429,7 +1429,7 @@ class IrModelSelection(models.Model):
|
||||
# the orphaned 'ir.model.fields' down the stack, and will log a
|
||||
# warning prompting the developer to write a migration script.
|
||||
field = Model._fields.get(selection.field_id.name)
|
||||
if not field or not field.store or Model._abstract:
|
||||
if not field or not field.store or not Model._auto:
|
||||
continue
|
||||
|
||||
ondelete = (field.ondelete or {}).get(selection.value)
|
||||
|
||||
@@ -147,6 +147,12 @@ STATES = [
|
||||
('to install', 'To be installed'),
|
||||
]
|
||||
|
||||
XML_DECLARATION = (
|
||||
'<?xml version='.encode('utf-8'),
|
||||
'<?xml version='.encode('utf-16-be'),
|
||||
'<?xml version='.encode('utf-16-le'),
|
||||
)
|
||||
|
||||
class Module(models.Model):
|
||||
_name = "ir.module.module"
|
||||
_rec_name = "shortdesc"
|
||||
@@ -180,6 +186,11 @@ class Module(models.Model):
|
||||
if path:
|
||||
with tools.file_open(path, 'rb') as desc_file:
|
||||
doc = desc_file.read()
|
||||
if not doc.startswith(XML_DECLARATION):
|
||||
try:
|
||||
doc = doc.decode('utf-8')
|
||||
except UnicodeDecodeError:
|
||||
pass
|
||||
html = lxml.html.document_fromstring(doc)
|
||||
for element, attribute, link, pos in html.iterlinks():
|
||||
if element.get('src') and not '//' in element.get('src') and not 'static/' in element.get('src'):
|
||||
|
||||
@@ -216,6 +216,7 @@ class IrRule(models.Model):
|
||||
|
||||
def _make_access_error(self, operation, records):
|
||||
_logger.info('Access Denied by record rules for operation: %s on record ids: %r, uid: %s, model: %s', operation, records.ids[:6], self._uid, records._name)
|
||||
self = self.with_context(self.env.user.context_get())
|
||||
|
||||
model = records._name
|
||||
description = self.env['ir.model']._get(model).name or model
|
||||
@@ -229,7 +230,7 @@ class IrRule(models.Model):
|
||||
operation_error = msg_heads[operation]
|
||||
resolution_info = _("Contact your administrator to request access if necessary.")
|
||||
|
||||
if not self.env.user.has_group('base.group_no_one') or not self.env.user.has_group('base.group_user'):
|
||||
if not self.user_has_groups('base.group_no_one') or not self.env.user.has_group('base.group_user'):
|
||||
msg = """{operation_error}
|
||||
|
||||
{resolution_info}""".format(
|
||||
|
||||
@@ -134,7 +134,7 @@ class Partner(models.Model):
|
||||
_description = 'Contact'
|
||||
_inherit = ['format.address.mixin', 'image.mixin']
|
||||
_name = "res.partner"
|
||||
_order = "display_name"
|
||||
_order = "display_name ASC, id DESC"
|
||||
|
||||
def _default_category(self):
|
||||
return self.env['res.partner.category'].browse(self._context.get('category_id'))
|
||||
@@ -379,11 +379,36 @@ class Partner(models.Model):
|
||||
|
||||
@api.depends('name', 'email')
|
||||
def _compute_email_formatted(self):
|
||||
""" Compute formatted email for partner, using formataddr. Be defensive
|
||||
in computation, notably
|
||||
|
||||
* double format: if email already holds a formatted email like
|
||||
'Name' <email@domain.com> we should not use it as it to compute
|
||||
email formatted like "Name <'Name' <email@domain.com>>";
|
||||
* multi emails: sometimes this field is used to hold several addresses
|
||||
like email1@domain.com, email2@domain.com. We currently let this value
|
||||
untouched, but remove any formatting from multi emails;
|
||||
* invalid email: if something is wrong, keep it in email_formatted as
|
||||
this eases management and understanding of failures at mail.mail,
|
||||
mail.notification and mailing.trace level;
|
||||
* void email: email_formatted is False, as we cannot do anything with
|
||||
it;
|
||||
"""
|
||||
self.email_formatted = False
|
||||
for partner in self:
|
||||
if partner.email:
|
||||
partner.email_formatted = tools.formataddr((partner.name or u"False", partner.email or u"False"))
|
||||
else:
|
||||
partner.email_formatted = ''
|
||||
emails_normalized = tools.email_normalize_all(partner.email)
|
||||
if emails_normalized:
|
||||
# note: multi-email input leads to invalid email like "Name" <email1, email2>
|
||||
# but this is current behavior in Odoo 14+ and some servers allow it
|
||||
partner.email_formatted = tools.formataddr((
|
||||
partner.name or u"False",
|
||||
','.join(emails_normalized)
|
||||
))
|
||||
elif partner.email:
|
||||
partner.email_formatted = tools.formataddr((
|
||||
partner.name or u"False",
|
||||
partner.email
|
||||
))
|
||||
|
||||
@api.depends('is_company')
|
||||
def _compute_company_type(self):
|
||||
@@ -400,8 +425,9 @@ class Partner(models.Model):
|
||||
|
||||
@api.constrains('barcode')
|
||||
def _check_barcode_unicity(self):
|
||||
if self.barcode and self.env['res.partner'].search_count([('barcode', '=', self.barcode)]) > 1:
|
||||
raise ValidationError('An other user already has this barcode')
|
||||
for partner in self:
|
||||
if partner.barcode and self.env['res.partner'].search_count([('barcode', '=', partner.barcode)]) > 1:
|
||||
raise ValidationError(_('Another partner already has this barcode'))
|
||||
|
||||
def _update_fields_values(self, fields):
|
||||
""" Returns dict of write() values for synchronizing ``fields`` """
|
||||
@@ -699,7 +725,9 @@ class Partner(models.Model):
|
||||
|
||||
* Raoul <raoul@grosbedon.fr>
|
||||
* "Raoul le Grand" <raoul@grosbedon.fr>
|
||||
* Raoul raoul@grosbedon.fr (strange fault tolerant support from df40926d2a57c101a3e2d221ecfd08fbb4fea30e)
|
||||
* Raoul raoul@grosbedon.fr (strange fault tolerant support from
|
||||
df40926d2a57c101a3e2d221ecfd08fbb4fea30e now supported directly
|
||||
in 'email_split_tuples';
|
||||
|
||||
Otherwise: default, everything is set as the name. Starting from 13.3
|
||||
returned email will be normalized to have a coherent encoding.
|
||||
@@ -709,12 +737,6 @@ class Partner(models.Model):
|
||||
if split_results:
|
||||
name, email = split_results[0]
|
||||
|
||||
if email and not name:
|
||||
fallback_emails = tools.email_split(text.replace(' ', ','))
|
||||
if fallback_emails:
|
||||
email = fallback_emails[0]
|
||||
name = text[:text.index(email)].replace('"', '').replace('<', '').strip()
|
||||
|
||||
if email:
|
||||
email = tools.email_normalize(email)
|
||||
else:
|
||||
|
||||
@@ -5,6 +5,7 @@ import ast
|
||||
|
||||
from flectra import SUPERUSER_ID
|
||||
from flectra.exceptions import UserError, ValidationError
|
||||
from flectra.tests import tagged
|
||||
from flectra.tests.common import TransactionCase, BaseCase
|
||||
from flectra.tools import mute_logger
|
||||
from flectra.tools.safe_eval import safe_eval, const_eval, expr_eval
|
||||
@@ -73,6 +74,7 @@ SAMPLES = [
|
||||
]
|
||||
|
||||
|
||||
@tagged('res_partner')
|
||||
class TestBase(TransactionCase):
|
||||
|
||||
def _check_find_or_create(self, test_string, expected_name, expected_email, check_partner=False, should_create=False):
|
||||
@@ -88,12 +90,13 @@ class TestBase(TransactionCase):
|
||||
def test_00_res_partner_name_create(self):
|
||||
res_partner = self.env['res.partner']
|
||||
parse = res_partner._parse_partner_name
|
||||
for text, name, mail in SAMPLES:
|
||||
self.assertEqual((name, mail.lower()), parse(text))
|
||||
partner_id, dummy = res_partner.name_create(text)
|
||||
partner = res_partner.browse(partner_id)
|
||||
self.assertEqual(name or mail.lower(), partner.name)
|
||||
self.assertEqual(mail.lower() or False, partner.email)
|
||||
for text, expected_name, expected_mail in SAMPLES:
|
||||
with self.subTest(text=text):
|
||||
self.assertEqual((expected_name, expected_mail.lower()), parse(text))
|
||||
partner_id, dummy = res_partner.name_create(text)
|
||||
partner = res_partner.browse(partner_id)
|
||||
self.assertEqual(expected_name or expected_mail.lower(), partner.name)
|
||||
self.assertEqual(expected_mail.lower() or False, partner.email)
|
||||
|
||||
# name_create supports default_email fallback
|
||||
partner = self.env['res.partner'].browse(
|
||||
|
||||
@@ -1086,7 +1086,7 @@ class TestQueries(TransactionCase):
|
||||
)
|
||||
)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
Model.search(domain)
|
||||
|
||||
@@ -1098,7 +1098,7 @@ class TestQueries(TransactionCase):
|
||||
SELECT "res_partner".id
|
||||
FROM "res_partner"
|
||||
WHERE (("res_partner"."active" = %s) AND ("res_partner"."name"::text LIKE %s))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
Model.search([('name', 'like', 'foo')])
|
||||
|
||||
@@ -1201,7 +1201,7 @@ class TestMany2one(TransactionCase):
|
||||
SELECT "res_partner".id
|
||||
FROM "res_partner"
|
||||
WHERE ("res_partner"."company_id" = %s)
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id', '=', self.company.id)])
|
||||
|
||||
@@ -1213,7 +1213,7 @@ class TestMany2one(TransactionCase):
|
||||
FROM "res_company"
|
||||
WHERE ("res_company"."name"::text like %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id.name', 'like', self.company.name)])
|
||||
|
||||
@@ -1229,7 +1229,7 @@ class TestMany2one(TransactionCase):
|
||||
WHERE ("res_partner"."name"::text LIKE %s)
|
||||
))
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id.partner_id.name', 'like', self.company.name)])
|
||||
|
||||
@@ -1245,7 +1245,7 @@ class TestMany2one(TransactionCase):
|
||||
FROM "res_country"
|
||||
WHERE ("res_country"."code"::text LIKE %s)
|
||||
)))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([
|
||||
'|',
|
||||
@@ -1264,7 +1264,7 @@ class TestMany2one(TransactionCase):
|
||||
FROM "res_company"
|
||||
WHERE ("res_company"."name"::text like %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
company_ids = self.company._search([('name', 'like', self.company.name)], order='id')
|
||||
self.Partner.search([('company_id', 'in', company_ids)])
|
||||
@@ -1280,7 +1280,7 @@ class TestMany2one(TransactionCase):
|
||||
ORDER BY "res_company"."id"
|
||||
LIMIT 1
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
company_ids = self.company._search([('name', 'like', self.company.name)], order='id', limit=1)
|
||||
self.Partner.search([('company_id', 'in', company_ids)])
|
||||
@@ -1297,7 +1297,7 @@ class TestMany2one(TransactionCase):
|
||||
LEFT JOIN "res_company" AS "res_partner__company_id" ON
|
||||
("res_partner"."company_id" = "res_partner__company_id"."id")
|
||||
WHERE ("res_partner__company_id"."name"::text LIKE %s)
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id.name', 'like', self.company.name)])
|
||||
|
||||
@@ -1311,7 +1311,7 @@ class TestMany2one(TransactionCase):
|
||||
FROM "res_partner"
|
||||
WHERE ("res_partner"."name"::text LIKE %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id.partner_id.name', 'like', self.company.name)])
|
||||
|
||||
@@ -1330,7 +1330,7 @@ class TestMany2one(TransactionCase):
|
||||
("res_company"."partner_id" = "res_company__partner_id"."id")
|
||||
WHERE ("res_company__partner_id"."name"::text LIKE %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id.partner_id.name', 'like', self.company.name)])
|
||||
|
||||
@@ -1347,7 +1347,7 @@ class TestMany2one(TransactionCase):
|
||||
LEFT JOIN "res_partner" AS "res_partner__company_id__partner_id" ON
|
||||
("res_partner__company_id"."partner_id" = "res_partner__company_id__partner_id"."id")
|
||||
WHERE ("res_partner__company_id__partner_id"."name"::text LIKE %s)
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id.partner_id.name', 'like', self.company.name)])
|
||||
|
||||
@@ -1369,7 +1369,7 @@ class TestMany2one(TransactionCase):
|
||||
("res_partner"."company_id" = "res_partner__company_id"."id")
|
||||
WHERE (("res_partner__company_id"."name"::text LIKE %s)
|
||||
OR ("res_partner__country_id"."code"::text LIKE %s))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([
|
||||
'|',
|
||||
@@ -1388,7 +1388,7 @@ class TestMany2one(TransactionCase):
|
||||
FROM "res_company"
|
||||
WHERE ("res_company"."name"::text LIKE %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('company_id', 'like', self.company.name)])
|
||||
|
||||
@@ -1417,7 +1417,7 @@ class TestOne2many(TransactionCase):
|
||||
WHERE ("res_partner"."id" IN (
|
||||
SELECT "partner_id" FROM "res_partner_bank" WHERE "id" IN %s
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('bank_ids', 'in', self.partner.bank_ids.ids)])
|
||||
|
||||
@@ -1429,7 +1429,7 @@ class TestOne2many(TransactionCase):
|
||||
FROM "res_partner_bank"
|
||||
WHERE ("res_partner_bank"."sanitized_acc_number"::text LIKE %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('bank_ids.sanitized_acc_number', 'like', '12')])
|
||||
|
||||
@@ -1445,7 +1445,7 @@ class TestOne2many(TransactionCase):
|
||||
WHERE ("res_partner_bank"."sanitized_acc_number"::text LIKE %s)
|
||||
)) AND "res_partner"."parent_id" IS NOT NULL
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('child_ids.bank_ids.sanitized_acc_number', 'like', '12')])
|
||||
|
||||
@@ -1462,7 +1462,7 @@ class TestOne2many(TransactionCase):
|
||||
WHERE ("res_partner"."id" IN (
|
||||
SELECT "partner_id" FROM "res_partner_bank" WHERE "id" IN %s
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('bank_ids', 'in', self.partner.bank_ids.ids)])
|
||||
|
||||
@@ -1474,7 +1474,7 @@ class TestOne2many(TransactionCase):
|
||||
FROM "res_partner_bank"
|
||||
WHERE ("res_partner_bank"."sanitized_acc_number"::text LIKE %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('bank_ids.sanitized_acc_number', 'like', '12')])
|
||||
|
||||
@@ -1490,7 +1490,7 @@ class TestOne2many(TransactionCase):
|
||||
FROM "res_partner_bank"
|
||||
WHERE ("res_partner_bank"."sanitized_acc_number"::text LIKE %s)
|
||||
)))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([
|
||||
('bank_ids.sanitized_acc_number', 'like', '12'),
|
||||
@@ -1509,7 +1509,7 @@ class TestOne2many(TransactionCase):
|
||||
WHERE ("res_partner_bank"."sanitized_acc_number"::text LIKE %s)
|
||||
)) AND ("res_partner"."active" = %s))
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('child_ids.bank_ids.sanitized_acc_number', 'like', '12')])
|
||||
|
||||
@@ -1539,7 +1539,7 @@ class TestOne2many(TransactionCase):
|
||||
("res_partner"."name" != %s) OR "res_partner"."name" IS NULL
|
||||
))
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('child_ids.bank_ids.id', 'in', self.partner.bank_ids.ids)])
|
||||
|
||||
@@ -1565,7 +1565,7 @@ class TestOne2many(TransactionCase):
|
||||
"res_partner"."active" = %s
|
||||
))
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('child_ids.state_id.country_id.code', 'like', 'US')])
|
||||
|
||||
@@ -1580,7 +1580,7 @@ class TestOne2many(TransactionCase):
|
||||
FROM "res_partner_bank"
|
||||
WHERE ("res_partner_bank"."sanitized_acc_number"::text LIKE %s)
|
||||
))
|
||||
ORDER BY "res_partner"."display_name"
|
||||
ORDER BY "res_partner"."display_name"asc,"res_partner"."id"desc
|
||||
''']):
|
||||
self.Partner.search([('bank_ids', 'like', '12')])
|
||||
|
||||
|
||||
@@ -8,10 +8,11 @@ import email.message
|
||||
import re
|
||||
import threading
|
||||
|
||||
from flectra.tests import tagged
|
||||
from flectra.tests.common import BaseCase, SavepointCase, TransactionCase
|
||||
from flectra.tools import (
|
||||
is_html_empty, html_sanitize, append_content_to_html, plaintext2html,
|
||||
email_split,
|
||||
email_normalize, email_split, email_split_and_format,
|
||||
misc, formataddr,
|
||||
prepend_html_content,
|
||||
)
|
||||
@@ -388,10 +389,67 @@ class TestHtmlTools(BaseCase):
|
||||
self.assertEqual(result, "<html><body><div>test</div><div>test</div></body></html>")
|
||||
|
||||
|
||||
@tagged('mail_tools')
|
||||
class TestEmailTools(BaseCase):
|
||||
""" Test some of our generic utility functions for emails """
|
||||
|
||||
def test_email_normalize(self):
|
||||
""" Test 'email_normalize'. Note that it is built on 'email_split' so
|
||||
some use cases are already managed in 'test_email_split(_and_format)'
|
||||
hence having more specific test cases here about normalization itself. """
|
||||
format_name = 'My Super Prénom'
|
||||
format_name_ascii = '=?utf-8?b?TXkgU3VwZXIgUHLDqW5vbQ==?='
|
||||
sources = [
|
||||
'"Super Déboulonneur" <deboulonneur@example.com>', # formatted
|
||||
'Déboulonneur deboulonneur@example.com', # wrong formatting
|
||||
'deboulonneur@example.com Déboulonneur', # wrong formatting (happens, alas)
|
||||
'"Super Déboulonneur" <DEBOULONNEUR@example.com>, "Super Déboulonneur 2" <deboulonneur2@EXAMPLE.com>', # multi + case
|
||||
' Déboulonneur deboulonneur@example.com déboulonneur deboulonneur2@example.com', # wrong formatting + wrong multi
|
||||
'"Déboulonneur 😊" <deboulonneur.😊@example.com>', # unicode in name and email left-part
|
||||
'"Déboulonneur" <déboulonneur@examplé.com>', # utf-8
|
||||
'"Déboulonneur" <DéBoulonneur@Examplé.com>', # utf-8
|
||||
]
|
||||
expected_list = [
|
||||
'deboulonneur@example.com',
|
||||
'deboulonneur@example.com',
|
||||
'deboulonneur@example.comdéboulonneur',
|
||||
False,
|
||||
'@example.com', # funny
|
||||
'deboulonneur.😊@example.com',
|
||||
'déboulonneur@examplé.com',
|
||||
'DéBoulonneur@examplé.com',
|
||||
]
|
||||
expected_fmt_utf8_list = [
|
||||
f'"{format_name}" <deboulonneur@example.com>',
|
||||
f'"{format_name}" <deboulonneur@example.com>',
|
||||
f'"{format_name}" <deboulonneur@example.comdéboulonneur>',
|
||||
f'"{format_name}" <@>',
|
||||
f'"{format_name}" <@example.com>',
|
||||
f'"{format_name}" <deboulonneur.😊@example.com>',
|
||||
f'"{format_name}" <déboulonneur@examplé.com>',
|
||||
f'"{format_name}" <DéBoulonneur@examplé.com>',
|
||||
]
|
||||
expected_fmt_ascii_list = [
|
||||
f'{format_name_ascii} <deboulonneur@example.com>',
|
||||
f'{format_name_ascii} <deboulonneur@example.com>',
|
||||
f'{format_name_ascii} <deboulonneur@example.xn--comdboulonneur-ekb>',
|
||||
f'{format_name_ascii} <@>',
|
||||
f'{format_name_ascii} <@example.com>',
|
||||
f'{format_name_ascii} <deboulonneur.😊@example.com>',
|
||||
f'{format_name_ascii} <déboulonneur@xn--exampl-gva.com>',
|
||||
f'{format_name_ascii} <DéBoulonneur@xn--exampl-gva.com>',
|
||||
]
|
||||
for source, expected, expected_utf8_fmt, expected_ascii_fmt in zip(sources, expected_list, expected_fmt_utf8_list, expected_fmt_ascii_list):
|
||||
with self.subTest(source=source):
|
||||
self.assertEqual(email_normalize(source, force_single=True), expected)
|
||||
# standard usage of formataddr
|
||||
self.assertEqual(formataddr((format_name, (expected or '')), charset='utf-8'), expected_utf8_fmt)
|
||||
# check using INDA at format time, using ascii charset as done when
|
||||
# sending emails (see extract_rfc2822_addresses)
|
||||
self.assertEqual(formataddr((format_name, (expected or '')), charset='ascii'), expected_ascii_fmt)
|
||||
|
||||
def test_email_split(self):
|
||||
""" Test 'email_split' """
|
||||
cases = [
|
||||
("John <12345@gmail.com>", ['12345@gmail.com']), # regular form
|
||||
("d@x; 1@2", ['d@x', '1@2']), # semi-colon + extra space
|
||||
@@ -402,6 +460,51 @@ class TestEmailTools(BaseCase):
|
||||
for text, expected in cases:
|
||||
self.assertEqual(email_split(text), expected, 'email_split is broken')
|
||||
|
||||
def test_email_split_and_format(self):
|
||||
""" Test 'email_split_and_format', notably in case of multi encapsulation
|
||||
or multi emails. """
|
||||
sources = [
|
||||
'deboulonneur@example.com',
|
||||
'"Super Déboulonneur" <deboulonneur@example.com>', # formatted
|
||||
# wrong formatting
|
||||
'Déboulonneur <deboulonneur@example.com', # with a final typo
|
||||
'Déboulonneur deboulonneur@example.com', # wrong formatting
|
||||
'deboulonneur@example.com Déboulonneur', # wrong formatting (happens, alas)
|
||||
# multi
|
||||
'Déboulonneur, deboulonneur@example.com', # multi-like with errors
|
||||
'deboulonneur@example.com, deboulonneur2@example.com', # multi
|
||||
' Déboulonneur deboulonneur@example.com déboulonneur deboulonneur2@example.com', # wrong formatting + wrong multi
|
||||
# format / misc
|
||||
'"Déboulonneur" <"Déboulonneur Encapsulated" <deboulonneur@example.com>>', # double formatting
|
||||
'"Super Déboulonneur" <deboulonneur@example.com>, "Super Déboulonneur 2" <deboulonneur2@example.com>',
|
||||
'"Super Déboulonneur" <deboulonneur@example.com>, wrong, ',
|
||||
'"Déboulonneur 😊" <deboulonneur@example.com>', # unicode in name
|
||||
'"Déboulonneur 😊" <deboulonneur.😊@example.com>', # unicode in name and email left-part
|
||||
'"Déboulonneur" <déboulonneur@examplé.com>', # utf-8
|
||||
]
|
||||
expected_list = [
|
||||
['deboulonneur@example.com'],
|
||||
['"Super Déboulonneur" <deboulonneur@example.com>'],
|
||||
# wrong formatting
|
||||
['"Déboulonneur" <deboulonneur@example.com>'],
|
||||
['"Déboulonneur" <deboulonneur@example.com>'], # extra part correctly considered as a name
|
||||
['deboulonneur@example.comDéboulonneur'], # concatenated, not sure why
|
||||
# multi
|
||||
['deboulonneur@example.com'],
|
||||
['deboulonneur@example.com', 'deboulonneur2@example.com'],
|
||||
['@example.com'], # funny one
|
||||
# format / misc
|
||||
['deboulonneur@example.com'],
|
||||
['"Super Déboulonneur" <deboulonneur@example.com>', '"Super Déboulonneur 2" <deboulonneur2@example.com>'],
|
||||
['"Super Déboulonneur" <deboulonneur@example.com>'],
|
||||
['"Déboulonneur 😊" <deboulonneur@example.com>'],
|
||||
['"Déboulonneur 😊" <deboulonneur.😊@example.com>'],
|
||||
['"Déboulonneur" <déboulonneur@examplé.com>'],
|
||||
]
|
||||
for source, expected in zip(sources, expected_list):
|
||||
with self.subTest(source=source):
|
||||
self.assertEqual(email_split_and_format(source), expected)
|
||||
|
||||
def test_email_formataddr(self):
|
||||
email = 'joe@example.com'
|
||||
email_idna = 'joe@examplé.com'
|
||||
|
||||
@@ -357,3 +357,14 @@ class TestRemoveAccents(BaseCase):
|
||||
def test_non_latin(self):
|
||||
self.assertEqual(remove_accents('العربية'), 'العربية')
|
||||
self.assertEqual(remove_accents('русский алфавит'), 'русскии алфавит')
|
||||
|
||||
|
||||
class TestDictTools(BaseCase):
|
||||
def test_readonly_dict(self):
|
||||
d = misc.ReadonlyDict({'foo': 'bar'})
|
||||
with self.assertRaises(TypeError):
|
||||
d['baz'] = 'xyz'
|
||||
with self.assertRaises(AttributeError):
|
||||
d.update({'baz': 'xyz'})
|
||||
with self.assertRaises(TypeError):
|
||||
dict.update(d, {'baz': 'xyz'})
|
||||
|
||||
@@ -4,10 +4,89 @@
|
||||
from flectra.tests import Form
|
||||
from flectra.tests.common import TransactionCase
|
||||
from flectra.exceptions import AccessError, UserError
|
||||
from flectra.tests import tagged
|
||||
|
||||
|
||||
@tagged('res_partner')
|
||||
class TestPartner(TransactionCase):
|
||||
|
||||
def test_email_formatted(self):
|
||||
""" Test various combinations of name / email, notably to check result
|
||||
of email_formatted field. """
|
||||
# multi create
|
||||
new_partners = self.env['res.partner'].create([{
|
||||
'name': "Vlad the Impaler",
|
||||
'email': f'vlad.the.impaler.{idx:02d}@example.com',
|
||||
} for idx in range(2)])
|
||||
self.assertEqual(
|
||||
sorted(new_partners.mapped('email_formatted')),
|
||||
sorted([f'"Vlad the Impaler" <vlad.the.impaler.{idx:02d}@example.com>' for idx in range(2)]),
|
||||
'Email formatted should be "name" <email>'
|
||||
)
|
||||
|
||||
# test name_create with formatting / multi emails
|
||||
for source, (exp_name, exp_email, exp_email_formatted) in [
|
||||
(
|
||||
'Balázs <vlad.the.negociator@example.com>, vlad.the.impaler@example.com',
|
||||
("Balázs", "vlad.the.negociator@example.com", '"Balázs" <vlad.the.negociator@example.com>')
|
||||
),
|
||||
(
|
||||
'Balázs <vlad.the.impaler@example.com>',
|
||||
("Balázs", "vlad.the.impaler@example.com", '"Balázs" <vlad.the.impaler@example.com>')
|
||||
),
|
||||
]:
|
||||
with self.subTest(source=source):
|
||||
new_partner_id = self.env['res.partner'].name_create(source)[0]
|
||||
new_partner = self.env['res.partner'].browse(new_partner_id)
|
||||
self.assertEqual(new_partner.name, exp_name)
|
||||
self.assertEqual(new_partner.email, exp_email)
|
||||
self.assertEqual(
|
||||
new_partner.email_formatted, exp_email_formatted,
|
||||
'Name_create should take first found email'
|
||||
)
|
||||
|
||||
# check name updates
|
||||
for source, exp_email_formatted in [
|
||||
('Vlad the Impaler', '"Vlad the Impaler" <vlad.the.impaler@example.com>'),
|
||||
('Balázs', '"Balázs" <vlad.the.impaler@example.com>'),
|
||||
('Balázs <email.in.name@example.com>', '"Balázs <email.in.name@example.com>" <vlad.the.impaler@example.com>'),
|
||||
]:
|
||||
with self.subTest(source=source):
|
||||
new_partner.write({'name': source})
|
||||
self.assertEqual(new_partner.email_formatted, exp_email_formatted)
|
||||
|
||||
# check email updates
|
||||
new_partner.write({'name': 'Balázs'})
|
||||
for source, exp_email_formatted in [
|
||||
# encapsulated email
|
||||
(
|
||||
"Vlad the Impaler <vlad.the.impaler@example.com>",
|
||||
'"Balázs" <vlad.the.impaler@example.com>'
|
||||
), (
|
||||
'"Balázs" <balazs@adam.hu>',
|
||||
'"Balázs" <balazs@adam.hu>'
|
||||
),
|
||||
# multi email
|
||||
(
|
||||
"vlad.the.impaler@example.com, vlad.the.dragon@example.com",
|
||||
'"Balázs" <vlad.the.impaler@example.com,vlad.the.dragon@example.com>'
|
||||
), (
|
||||
"vlad.the.impaler.com, vlad.the.dragon@example.com",
|
||||
'"Balázs" <vlad.the.dragon@example.com>'
|
||||
), (
|
||||
'vlad.the.impaler.com, "Vlad the Dragon" <vlad.the.dragon@example.com>',
|
||||
'"Balázs" <vlad.the.dragon@example.com>'
|
||||
),
|
||||
# falsy emails
|
||||
(False, False),
|
||||
('', False),
|
||||
(' ', '"Balázs" <@ >'),
|
||||
('notanemail', '"Balázs" <@notanemail>'),
|
||||
]:
|
||||
with self.subTest(source=source):
|
||||
new_partner.write({'email': source})
|
||||
self.assertEqual(new_partner.email_formatted, exp_email_formatted)
|
||||
|
||||
def test_name_search(self):
|
||||
""" Check name_search on partner, especially with domain based on auto_join
|
||||
user_ids field. Check specific SQL of name_search correctly handle joined tables. """
|
||||
|
||||
@@ -218,7 +218,7 @@ class MergePartnerAutomatic(models.TransientModel):
|
||||
# unknown model or field => skip
|
||||
continue
|
||||
|
||||
if field.compute is not None:
|
||||
if Model._abstract or field.compute is not None:
|
||||
continue
|
||||
|
||||
for partner in src_partners:
|
||||
|
||||
@@ -158,11 +158,19 @@ class TestIRRuleFeedback(Feedback):
|
||||
"""
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self.model = self.env['ir.model'].search([('model', '=', 'test_access_right.some_obj')])
|
||||
self.record = self.env['test_access_right.some_obj'].create({
|
||||
'val': 0,
|
||||
}).with_user(self.user)
|
||||
|
||||
|
||||
def debug_mode(self):
|
||||
odoo.http._request_stack.push(Mock(db=self.env.cr.dbname, env=self.env, debug=True))
|
||||
self.addCleanup(odoo.http._request_stack.pop)
|
||||
self.env['base'].invalidate_cache()
|
||||
|
||||
|
||||
def _make_rule(self, name, domain, global_=False, attr='write'):
|
||||
res = self.env['ir.rule'].create({
|
||||
'name': name,
|
||||
@@ -187,9 +195,7 @@ class TestIRRuleFeedback(Feedback):
|
||||
|
||||
Contact your administrator to request access if necessary.""")
|
||||
|
||||
# debug mode
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
self.record.write({'val': 1})
|
||||
self.assertEqual(
|
||||
@@ -215,10 +221,9 @@ Contact your administrator to request access if necessary.""" % (self.record.dis
|
||||
p.with_user(self.user).write({'val': 1})
|
||||
|
||||
def test_locals(self):
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self._make_rule('rule 0', '[("val", "=", 42)]')
|
||||
self._make_rule('rule 1', '[("val", "=", 78)]')
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
self.record.write({'val': 1})
|
||||
self.assertEqual(
|
||||
@@ -236,10 +241,9 @@ Contact your administrator to request access if necessary.""" % (self.record.dis
|
||||
)
|
||||
|
||||
def test_globals_all(self):
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self._make_rule('rule 0', '[("val", "=", 42)]', global_=True)
|
||||
self._make_rule('rule 1', '[("val", "=", 78)]', global_=True)
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
self.record.write({'val': 1})
|
||||
self.assertEqual(
|
||||
@@ -260,10 +264,9 @@ Contact your administrator to request access if necessary.""" % (self.record.dis
|
||||
""" Global rules are AND-eded together, so when an access fails it
|
||||
might be just one of the rules, and we want an exact listing
|
||||
"""
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self._make_rule('rule 0', '[("val", "=", 42)]', global_=True)
|
||||
self._make_rule('rule 1', '[(1, "=", 1)]', global_=True)
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
self.record.write({'val': 1})
|
||||
self.assertEqual(
|
||||
@@ -280,12 +283,11 @@ Contact your administrator to request access if necessary.""" % (self.record.dis
|
||||
)
|
||||
|
||||
def test_combination(self):
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self._make_rule('rule 0', '[("val", "=", 42)]', global_=True)
|
||||
self._make_rule('rule 1', '[(1, "=", 1)]', global_=True)
|
||||
self._make_rule('rule 2', '[(0, "=", 1)]')
|
||||
self._make_rule('rule 3', '[("val", "=", 55)]')
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
self.record.write({'val': 1})
|
||||
self.assertEqual(
|
||||
@@ -307,10 +309,9 @@ Contact your administrator to request access if necessary.""" % (self.record.dis
|
||||
""" If one of the failing rules mentions company_id, add a note that
|
||||
this might be a multi-company issue.
|
||||
"""
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self._make_rule('rule 0', "[('company_id', '=', user.company_id.id)]")
|
||||
self._make_rule('rule 1', '[("val", "=", 0)]', global_=True)
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
self.record.write({'val': 1})
|
||||
self.assertEqual(
|
||||
@@ -332,10 +333,9 @@ Contact your administrator to request access if necessary.""" % (self.record.dis
|
||||
""" because of prefetching, read() goes through a different codepath
|
||||
to apply rules
|
||||
"""
|
||||
self.env.ref('base.group_no_one').write({'users': [(4, self.user.id)]})
|
||||
self.env.ref('base.group_user').write({'users': [(4, self.user.id)]})
|
||||
self._make_rule('rule 0', "[('company_id', '=', user.company_id.id)]", attr='read')
|
||||
self._make_rule('rule 1', '[("val", "=", 1)]', global_=True, attr='read')
|
||||
self.debug_mode()
|
||||
with self.assertRaises(AccessError) as ctx:
|
||||
_ = self.record.val
|
||||
self.assertEqual(
|
||||
|
||||
@@ -22,8 +22,11 @@ from inspect import signature
|
||||
from pprint import pformat
|
||||
from weakref import WeakSet
|
||||
|
||||
from decorator import decorate
|
||||
from werkzeug.local import Local, release_local
|
||||
try:
|
||||
from decorator import decoratorx as decorator
|
||||
except ImportError:
|
||||
from decorator import decorator
|
||||
|
||||
from .exceptions import CacheMiss
|
||||
from .tools import frozendict, classproperty, lazy_property, StackMap
|
||||
@@ -320,6 +323,7 @@ def model(method):
|
||||
_create_logger = logging.getLogger(__name__ + '.create')
|
||||
|
||||
|
||||
@decorator
|
||||
def _model_create_single(create, self, arg):
|
||||
# 'create' expects a dict and returns a record
|
||||
if isinstance(arg, Mapping):
|
||||
@@ -336,11 +340,12 @@ def model_create_single(method):
|
||||
record = model.create(vals)
|
||||
records = model.create([vals, ...])
|
||||
"""
|
||||
wrapper = decorate(method, _model_create_single)
|
||||
wrapper = _model_create_single(method) # pylint: disable=no-value-for-parameter
|
||||
wrapper._api = 'model_create'
|
||||
return wrapper
|
||||
|
||||
|
||||
@decorator
|
||||
def _model_create_multi(create, self, arg):
|
||||
# 'create' expects a list of dicts and returns a recordset
|
||||
if isinstance(arg, Mapping):
|
||||
@@ -356,7 +361,7 @@ def model_create_multi(method):
|
||||
record = model.create(vals)
|
||||
records = model.create([vals, ...])
|
||||
"""
|
||||
wrapper = decorate(method, _model_create_multi)
|
||||
wrapper = _model_create_multi(method) # pylint: disable=no-value-for-parameter
|
||||
wrapper._api = 'model_create'
|
||||
return wrapper
|
||||
|
||||
|
||||
@@ -1071,6 +1071,10 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
# Failed to write, log to messages, rollback savepoint (to
|
||||
# avoid broken transaction) and keep going
|
||||
errors += 1
|
||||
except UserError as e:
|
||||
info = rec_data['info']
|
||||
messages.append(dict(info, type='error', message=str(e)))
|
||||
errors += 1
|
||||
except Exception as e:
|
||||
_logger.debug("Error while loading record", exc_info=True)
|
||||
info = rec_data['info']
|
||||
@@ -2650,10 +2654,9 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
|
||||
|
||||
for (key, definition, message) in self._sql_constraints:
|
||||
conname = '%s_%s' % (self._table, key)
|
||||
if len(conname) > 63:
|
||||
_logger.info("Constraint name %r has more than 63 characters", conname)
|
||||
|
||||
current_definition = tools.constraint_definition(cr, self._table, conname)
|
||||
if len(conname) > 63 and not current_definition:
|
||||
_logger.info("Constraint name %r has more than 63 characters", conname)
|
||||
if current_definition == definition:
|
||||
continue
|
||||
|
||||
@@ -4240,6 +4243,17 @@ Fields:
|
||||
if data.get('xml_id') and not data['xml_id'].startswith(prefix):
|
||||
_logger.warning("Creating record %s in module %s.", data['xml_id'], module)
|
||||
|
||||
if self.env.context.get('import_file'):
|
||||
existing_modules = self.env['ir.module.module'].sudo().search([]).mapped('name')
|
||||
for data in to_create:
|
||||
xml_id = data.get('xml_id')
|
||||
if xml_id:
|
||||
module_name, sep, record_id = xml_id.partition('.')
|
||||
if sep and module_name in existing_modules:
|
||||
raise UserError(
|
||||
_("The record %(xml_id)s has the module prefix %(module_name)s. This is the part before the '.' in the external id. Because the prefix refers to an existing module, the record would be deleted when the module is upgraded. Use either no prefix and no dot or a prefix that isn't an existing module. For example, __import__, resulting in the external id __import__.%(record_id)s.",
|
||||
xml_id=xml_id, module_name=module_name, record_id=record_id))
|
||||
|
||||
# create records
|
||||
records = self._load_records_create([data['values'] for data in to_create])
|
||||
for data, record in zip(to_create, records):
|
||||
|
||||
@@ -92,7 +92,7 @@ class UpgradeHook(object):
|
||||
"""Makes the legacy `migrations` package being `flectra.upgrade`"""
|
||||
|
||||
def find_module(self, name, path=None):
|
||||
if re.match(r"^flectra.addons.base.maintenance.migrations\b", name):
|
||||
if re.match(r"^flectra\.addons\.base\.maintenance\.migrations\b", name):
|
||||
# We can't trigger a DeprecationWarning in this case.
|
||||
# In order to be cross-versions, the multi-versions upgrade scripts (0.0.0 scripts),
|
||||
# the tests, and the common files (utility functions) still needs to import from the
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import ast
|
||||
import os
|
||||
from shutil import copyfileobj
|
||||
from types import CodeType
|
||||
|
||||
from werkzeug.datastructures import FileStorage
|
||||
from werkzeug.routing import Rule
|
||||
from werkzeug.wrappers import Request, Response
|
||||
|
||||
from .json import scriptsafe
|
||||
@@ -30,6 +32,14 @@ FileStorage.save = lambda self, dst, buffer_size=1<<20: copyfileobj(self.stream,
|
||||
|
||||
Request.json_module = Response.json_module = scriptsafe
|
||||
|
||||
get_func_code = getattr(Rule, '_get_func_code', None)
|
||||
if get_func_code:
|
||||
@staticmethod
|
||||
def _get_func_code(code, name):
|
||||
assert isinstance(code, CodeType)
|
||||
return get_func_code(code, name)
|
||||
Rule._get_func_code = _get_func_code
|
||||
|
||||
orig_literal_eval = ast.literal_eval
|
||||
|
||||
def literal_eval(expr):
|
||||
|
||||
@@ -1576,6 +1576,40 @@ pickle.dump = pickle_.dump
|
||||
pickle.dumps = pickle_.dumps
|
||||
|
||||
|
||||
class ReadonlyDict(Mapping):
|
||||
"""Helper for an unmodifiable dictionary, not even updatable using `dict.update`.
|
||||
|
||||
This is similar to a `frozendict`, with one drawback and one advantage:
|
||||
|
||||
- `dict.update` works for a `frozendict` but not for a `ReadonlyDict`.
|
||||
- `json.dumps` works for a `frozendict` by default but not for a `ReadonlyDict`.
|
||||
|
||||
This comes from the fact `frozendict` inherits from `dict`
|
||||
while `ReadonlyDict` inherits from `collections.abc.Mapping`.
|
||||
|
||||
So, depending on your needs,
|
||||
whether you absolutely must prevent the dictionary from being updated (e.g., for security reasons)
|
||||
or you require it to be supported by `json.dumps`, you can choose either option.
|
||||
|
||||
E.g.
|
||||
data = ReadonlyDict({'foo': 'bar'})
|
||||
data['baz'] = 'xyz' # raises exception
|
||||
data.update({'baz', 'xyz'}) # raises exception
|
||||
dict.update(data, {'baz': 'xyz'}) # raises exception
|
||||
"""
|
||||
def __init__(self, data):
|
||||
self.__data = dict(data)
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.__data[key]
|
||||
|
||||
def __len__(self):
|
||||
return len(self.__data)
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.__data)
|
||||
|
||||
|
||||
class DotDict(dict):
|
||||
"""Helper for dot.notation access to dictionary attributes
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import logging
|
||||
|
||||
from flectra.tools.translate import _
|
||||
from flectra.tools import SKIPPED_ELEMENT_TYPES
|
||||
from flectra.exceptions import ValidationError
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -56,9 +57,8 @@ def locate_node(arch, spec):
|
||||
expr = spec.get('expr')
|
||||
try:
|
||||
xPath = etree.ETXPath(expr)
|
||||
except etree.XPathSyntaxError:
|
||||
_logger.error("XPathSyntaxError while parsing xpath %r", expr)
|
||||
raise
|
||||
except etree.XPathSyntaxError as e:
|
||||
raise ValidationError(_("Invalid Expression while parsing xpath %r", expr)) from e
|
||||
nodes = xPath(arch)
|
||||
return nodes[0] if nodes else None
|
||||
elif spec.tag == 'field':
|
||||
|
||||
Reference in New Issue
Block a user