[PATCH] upstream core

This commit is contained in:
Lukas Ziegler
2023-10-22 17:05:47 -03:00
parent af4f42781d
commit ba10cece49
44 changed files with 5316 additions and 2575 deletions

View 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
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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': ['&amp;', ('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': ['&amp;', ('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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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')])

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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