19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:30:27 +01:00
parent d1963a3c3a
commit 2d3ee4855a
7430 changed files with 2687981 additions and 2965473 deletions

View file

@ -66,7 +66,7 @@ This module provides the core of the Odoo Web Client.
'web/static/src/scss/ui.scss',
'web/static/src/views/fields/translation_dialog.scss',
'web/static/src/polyfills/clipboard.js',
'web/static/src/polyfills/**/*.js',
'web/static/lib/popper/popper.js',
'web/static/lib/bootstrap/js/dist/util/index.js',
@ -152,6 +152,7 @@ This module provides the core of the Odoo Web Client.
'web.assets_frontend_minimal': [
'web/static/src/polyfills/object.js',
'web/static/src/polyfills/array.js',
'web/static/src/polyfills/promise.js',
'web/static/src/module_loader.js',
'web/static/src/polyfills/set.js',
'web/static/src/session.js',

View file

@ -175,7 +175,7 @@ class Binary(http.Controller):
'/web/image/<int:id>-<string:unique>/<string:filename>',
'/web/image/<int:id>-<string:unique>/<int:width>x<int:height>',
'/web/image/<int:id>-<string:unique>/<int:width>x<int:height>/<string:filename>',
], type='http', auth='public', readonly=True)
], type='http', auth='public', readonly=True, save_session=False)
# pylint: disable=redefined-builtin,invalid-name
def content_image(self, xmlid=None, model='ir.attachment', id=None, field='raw',
filename_field='name', filename=None, mimetype=None, unique=False,

View file

@ -312,7 +312,8 @@ class Export(http.Controller):
definition_record = field['definition_record']
definition_record_field = field['definition_record_field']
target_model = Model.env[Model._fields[definition_record].comodel_name]
# sudo(): user may lack access to property definition model
target_model = Model.env[Model._fields[definition_record].comodel_name].sudo()
domain_definition = [(definition_record_field, '!=', False)]
# Depends of the records selected to avoid showing useless Properties
if domain:
@ -566,7 +567,7 @@ class ExportFormat(object):
groupby = params.get('groupby')
if not import_compat and groupby:
export_data = records.export_data(['.id'] + field_names).get('datas', [])
groupby_type = [Model._fields[x.split(':')[0]].type for x in groupby]
groupby_type = [Model._fields[x.split(':', 1)[0].split('.', 1)[0]].type for x in groupby]
tree = GroupsTreeNode(Model, field_names, groupby, groupby_type)
if ids:
domain = [('id', 'in', ids)]

View file

@ -4,6 +4,7 @@ import json
from collections import deque
from werkzeug.datastructures import FileStorage
from werkzeug.exceptions import UnprocessableEntity
from odoo import http, _
from odoo.http import content_disposition, request
@ -16,6 +17,8 @@ class TableExporter(http.Controller):
def export_xlsx(self, data, **kw):
import xlsxwriter # noqa: PLC0415
jdata = json.load(data) if isinstance(data, FileStorage) else json.loads(data)
if not jdata:
raise UnprocessableEntity(_('No data to export'))
output = io.BytesIO()
workbook = xlsxwriter.Workbook(output, {'in_memory': True})
worksheet = workbook.add_worksheet(jdata['title'])
@ -24,7 +27,7 @@ class TableExporter(http.Controller):
header_plain = workbook.add_format({'pattern': 1, 'bg_color': '#AAAAAA'})
bold = workbook.add_format({'bold': True})
measure_count = jdata['measure_count']
measure_count = min(jdata['measure_count'], 100000)
# Step 1: writing col group headers
col_group_headers = jdata['col_group_headers']
@ -43,11 +46,12 @@ class TableExporter(http.Controller):
if cell['height'] > 1:
carry.append({'x': x, 'height': cell['height'] - 1})
x = x + measure_count
for j in range(header['width']):
width = min(header['width'], 100000)
for j in range(width):
worksheet.write(y, x + j, header['title'] if j == 0 else '', header_plain)
if header['height'] > 1:
carry.append({'x': x, 'height': header['height'] - 1})
x = x + header['width']
x = x + width
while (carry and carry[0]['x'] == x):
cell = carry.popleft()
for j in range(measure_count):

View file

@ -11,13 +11,15 @@
# Niyas Raphy, 2022
# Malaz Abuidris <msea@odoo.com>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# "Malaz Siddig Elsayed Abuidris (msea)" <msea@odoo.com>, 2025, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 13:43+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-01-06 13:00+0000\n"
"Last-Translator: \"Malaz Siddig Elsayed Abuidris (msea)\" <msea@odoo.com>\n"
"Language-Team: Arabic <https://translate.odoo.com/projects/odoo-19/web/ar/>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
@ -25,7 +27,7 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -302,7 +304,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -483,6 +485,17 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">مفصول (واحد "
"لكل علامة تبويب)</option>\n"
" <option value=\"temporal\">مؤقَّت "
"(تجريبي)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>تحذير:</b> سيؤدي "
"الوضع التجريبي إلى دمج كافة العينات.<br/>يمكن أن يؤدي إلى نتيجة غير صالحة "
"جزئياً في حالة الملفات الشخصية المتزامنة.<br/>كن حذراً عند استخدامه </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -542,8 +555,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2172,7 +2185,7 @@ msgstr "العملة"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "حقل العملة"
#. module: web
#. odoo-javascript
@ -2295,7 +2308,7 @@ msgstr "التاريخ والوقت"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "تنسيق التاريخ"
#. module: web
#. odoo-javascript
@ -3205,6 +3218,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"على سبيل المثال، إذا كانت القيمة \"1\" وأدخلت \"+=2\"، فسيتم تحديثها إلى "
"\"3\"."
#. module: web
#. odoo-javascript
@ -3382,6 +3397,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"انتبه! التغييرات الأخيرة التي أجريتها كبيرة جدًا بحيث لا يمكن حفظها تلقائيًا. "
"يرجى الضغط على زر \" %(upload_icon)s \" الآن لضمان حفظ عملك قبل الخروج من "
"علامة التبويب هذه."
#. module: web
#. odoo-javascript
@ -3452,7 +3470,7 @@ msgstr "القائمة الرئيسية"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "ساعة"
#. module: web
#. odoo-python
@ -3552,6 +3570,14 @@ msgstr ""
"تحريرها مباشرةً. لاحظ أنه إذا تم تعيين حقل ألوان أيضاً، فسوف يسود إصدار "
"العلامة. لذا، لن يتم عرض محدد الألوان عند الضغط على علامة التصنيف."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3704,7 +3730,7 @@ msgstr "الفترة"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "اسم العرض غير صالح"
#. module: web
#. odoo-javascript
@ -4126,19 +4152,19 @@ msgstr "كبير"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "آخر 12 شهراً"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "آخر 30 يوم"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "آخر 7 أيام"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4156,7 +4182,7 @@ msgstr "آخر تحديث في"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "الشهر الماضي"
#. module: web
#. odoo-javascript
@ -4299,7 +4325,7 @@ msgstr "تسجيل الخروج"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "تسجيل الدخول"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4504,6 +4530,12 @@ msgstr "درب التبانة"
msgid "Minimal precision"
msgstr "الدقة الأدنى"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4916,6 +4948,12 @@ msgstr "لا توجد بيانات"
msgid "No data to display"
msgstr "لا توجد بيانات لعرضها"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4931,8 +4969,8 @@ msgstr "تعذر العثور على جهاز."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "ليس هناك أي وجه ضاحك يطابق بحثك"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4983,7 +5021,7 @@ msgstr "لم يتم العثور على نتائج"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "لا توجد نتائج"
#. module: web
#. odoo-javascript
@ -5209,7 +5247,6 @@ msgstr "أوه لا!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6652,10 +6689,11 @@ msgstr "خاص:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "مكدسة"
@ -6757,7 +6795,7 @@ msgstr "خطأ في الشكل"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "اللاحقة"
#. module: web
#. odoo-javascript
@ -6969,6 +7007,12 @@ msgstr "يتضمن النطاق قيماً غير حرفية. قد يفشل تق
msgid "The domain should not involve non-literals"
msgstr "يجب ألا يتضمن النطاق قيماً غير حرفية"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6994,6 +7038,12 @@ msgstr ""
"تمت مقاطعة العملية. عادةً ما يعني هذا أن العملية الحالية تستغرق وقتًا أطول من "
"اللازم."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7643,7 +7693,7 @@ msgstr "واجهة المستخدم"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "إعدادات المستخدم"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7807,6 +7857,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "تحذير"
@ -8211,7 +8262,7 @@ msgstr "اسكليتيوس"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "بعد"
#. module: web
#. odoo-javascript
@ -9188,7 +9239,7 @@ msgstr "خنفساء"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "قبل"
#. module: web
#. odoo-javascript
@ -12811,7 +12862,7 @@ msgstr "إمباندا"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "فارغ"
#. module: web
#. odoo-javascript
@ -26952,6 +27003,12 @@ msgstr "“شاغر”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "ليس هناك أي وجه ضاحك يطابق بحثك"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "الزاوية"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -25,13 +25,16 @@
# Arnau Ros, 2023
# Óscar Fonseca <tecnico@extreme-micro.com>, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# Miriam Amatller Tura <sine2soft@gmail.com>, 2025.
# "Noemi Pla Garcia (nopl)" <nopl@odoo.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 02:36+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-12-22 15:51+0000\n"
"Last-Translator: \"Noemi Pla Garcia (nopl)\" <nopl@odoo.com>\n"
"Language-Team: Catalan <https://translate.odoo.com/projects/odoo-19/web/ca/"
">\n"
"Language: ca\n"
@ -39,7 +42,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -552,8 +555,8 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -894,7 +897,7 @@ msgstr "Afegir"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/x2many/x2many_field.js:0
msgid "Add %s"
msgstr ""
msgstr "Afegir %s"
#. module: web
#. odoo-javascript
@ -1680,7 +1683,7 @@ msgstr "Escolliu una ordre de depuració..."
#. odoo-javascript
#: code:addons/web/static/src/core/user_switch/user_switch.xml:0
msgid "Choose a user"
msgstr ""
msgstr "Tria un usuari"
#. module: web
#. odoo-javascript
@ -1751,7 +1754,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record.xml:0
msgid "Click to select"
msgstr ""
msgstr "Faci clic per a seleccionar"
#. module: web
#. odoo-javascript
@ -1796,7 +1799,7 @@ msgstr "Tancar menú"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/kanban_color_picker/kanban_color_picker_field.js:0
msgid "Color Picker"
msgstr ""
msgstr "Selector de color"
#. module: web
#. odoo-javascript
@ -2120,7 +2123,7 @@ msgstr "Crear %s"
#. module: web
#: model:ir.model,website_form_label:web.model_res_partner
msgid "Create a Customer"
msgstr ""
msgstr "Crear un client"
#. module: web
#. odoo-javascript
@ -2186,7 +2189,7 @@ msgstr "Valor actual"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_custom_tab.js:0
msgid "Custom"
msgstr ""
msgstr "Personalitzat"
#. module: web
#. odoo-javascript
@ -2295,7 +2298,7 @@ msgstr "Data i Temps"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Format de data"
#. module: web
#. odoo-javascript
@ -2748,7 +2751,7 @@ msgstr "Placeholder dinàmic"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/many2one/many2one_field.js:0
msgid "Dynamic placeholder"
msgstr ""
msgstr "Placeholder dinàmic"
#. module: web
#. odoo-javascript
@ -2882,12 +2885,12 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Enter your email"
msgstr ""
msgstr "Introdueix el teu correu"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Enter your password"
msgstr ""
msgstr "Introdueix la teva contrasenya"
#. module: web
#. odoo-javascript
@ -2981,7 +2984,7 @@ msgstr "ID externa"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_field.js:0
msgid "Extra Rights"
msgstr ""
msgstr "Permisos Extra"
#. module: web
#. odoo-javascript
@ -3323,7 +3326,7 @@ msgstr "Verd"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_popover.xml:0
msgid "Group"
msgstr ""
msgstr "Grup"
#. module: web
#. odoo-javascript
@ -3341,7 +3344,7 @@ msgstr "Agrupar per"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
msgid "HTML"
msgstr ""
msgstr "HTML"
#. module: web
#: model:ir.model,name:web.model_ir_http
@ -3378,7 +3381,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "Help"
msgstr ""
msgstr "Ajuda"
#. module: web
#. odoo-javascript
@ -3441,7 +3444,7 @@ msgstr "Menú inici"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Hora"
#. module: web
#. odoo-python
@ -3462,7 +3465,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "Matís"
#. module: web
#. odoo-javascript
@ -3535,6 +3538,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3721,7 +3732,7 @@ msgstr "Adreça de correu electrònic no vàlida:%(addresses)s"
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_invite_users.js:0
msgid "Invalid email addresses: %(two_addresses)s"
msgstr ""
msgstr "Adreça de correu electrònic no vàlida:%(two_addresses)s"
#. module: web
#. odoo-javascript
@ -4108,13 +4119,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Últims 30 dies"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Darrers 7 dies"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4132,7 +4143,7 @@ msgstr "Última actualització el"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Mes anterior"
#. module: web
#. odoo-javascript
@ -4275,7 +4286,7 @@ msgstr "Tancar sessió"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Iniciar sessió"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4480,6 +4491,12 @@ msgstr "Via Làctia"
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4892,6 +4909,12 @@ msgstr "Sense dades"
msgid "No data to display"
msgstr "Sense dades per mostrar"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4907,7 +4930,7 @@ msgstr "No s'ha trobat cap dispositiu."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4959,7 +4982,7 @@ msgstr "No s'han trobat resultats"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Sense resultats"
#. module: web
#. odoo-javascript
@ -4984,7 +5007,7 @@ msgstr "No s'ha pogut trobar cap vista del tipus '%s' a l'acció actual."
#: code:addons/web/static/src/views/calendar/calendar_controller.js:0
#: code:addons/web/static/src/views/view_hook.js:0
msgid "No, keep it"
msgstr "No, guarda'l"
msgstr "No, deixa-ho com està"
#. module: web
#. odoo-javascript
@ -5100,7 +5123,7 @@ msgstr "Error de client Odoo"
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/fields/upgrade_dialog.xml:0
msgid "Odoo Enterprise"
msgstr ""
msgstr "Odoo Enterprise"
#. module: web
#. odoo-javascript
@ -5183,7 +5206,6 @@ msgstr "Oh, vaja!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5245,13 +5267,15 @@ msgstr "Només tu"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.xml:0
msgid "Oops!"
msgstr ""
msgstr "Vaja!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/file_handler.js:0
msgid "Oops! '%(fileName)s' didnt upload since its format isnt allowed."
msgstr ""
"Vaja! '%(fileName)s' no s'ha pogut carregar perquè el format no és "
"compatible."
#. module: web
#. odoo-javascript
@ -5276,7 +5300,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Open"
msgstr ""
msgstr "Oberts"
#. module: web
#. odoo-javascript
@ -6231,7 +6255,7 @@ msgstr "Buscar un menu..."
#. odoo-javascript
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Search more..."
msgstr ""
msgstr "Cerca més..."
#. module: web
#. odoo-javascript
@ -6581,7 +6605,7 @@ msgstr "Emoticones"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_solid_tab.js:0
msgid "Solid"
msgstr ""
msgstr "Sòlid"
#. module: web
#. odoo-javascript
@ -6618,10 +6642,11 @@ msgstr "Especial:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Velocimetre"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Apilat"
@ -6723,7 +6748,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufix"
#. module: web
#. odoo-javascript
@ -6936,6 +6961,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6961,6 +6992,12 @@ msgstr ""
"L'operació s'ha interromput. Això sol significar que l'operació actual "
"s'està prenent molt temps."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7452,7 +7489,7 @@ msgstr "Sense títol"
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_confirmation_dialog.xml:0
msgid "Update"
msgstr ""
msgstr "Actualitza"
#. module: web
#. odoo-javascript
@ -7595,7 +7632,7 @@ msgstr "Interfície d'usuari"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Arranjament d' usuari"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7759,6 +7796,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Avís"
@ -8158,7 +8196,7 @@ msgstr "aesculapi"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "després"
#. module: web
#. odoo-javascript
@ -16832,7 +16870,7 @@ msgstr "llums"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "like"
msgstr "M'agrada"
msgstr "conté"
#. module: web
#. odoo-javascript
@ -18898,7 +18936,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "not like"
msgstr "no m'agrada"
msgstr "no conté"
#. module: web
#. odoo-javascript
@ -26900,6 +26938,9 @@ msgstr "“vacancy”"
msgid "ココ"
msgstr "ココ"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Error"
#~ msgstr "Error"

File diff suppressed because it is too large Load diff

View file

@ -15,13 +15,14 @@
# Martin Trigaux, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Kira Petersen François (peti)" <peti@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-25 13:22+0000\n"
"Last-Translator: \"Kira Petersen François (peti)\" <peti@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 21:56+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Danish <https://translate.odoo.com/projects/odoo-19/web/da/>\n"
"Language: da\n"
"MIME-Version: 1.0\n"
@ -545,8 +546,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2301,7 +2302,7 @@ msgstr "Dato og klokkeslæt"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Dato format"
#. module: web
#. odoo-javascript
@ -3460,7 +3461,7 @@ msgstr "Startmenu"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Time"
#. module: web
#. odoo-python
@ -3562,6 +3563,14 @@ msgstr ""
"vil tag-redigering have forrang, og farvevælgeren vises derfor ikke ved klik "
"på tagget."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4142,19 +4151,19 @@ msgstr "Stor"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Seneste 12 måneder"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Seneste 30 dage"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Seneste 7 dage"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4172,7 +4181,7 @@ msgstr "Sidst opdateret den"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Sidste måned"
#. module: web
#. odoo-javascript
@ -4315,7 +4324,7 @@ msgstr "Log af"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Log ind"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4520,6 +4529,12 @@ msgstr "Mælkevej"
msgid "Minimal precision"
msgstr "Minimal præcision"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4932,6 +4947,12 @@ msgstr "Ingen data"
msgid "No data to display"
msgstr "Ingen data at vise"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4947,8 +4968,8 @@ msgstr "Ingen enhed fundet."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Ingen emoji matcher din søgning"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4999,7 +5020,7 @@ msgstr "Ingen resultater fundet"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Ingen resultater"
#. module: web
#. odoo-javascript
@ -5225,7 +5246,6 @@ msgstr "Pokkers!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6673,10 +6693,11 @@ msgstr "Speciel:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Stablet"
@ -6778,7 +6799,7 @@ msgstr "Stilfejl"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Suffiks"
#. module: web
#. odoo-javascript
@ -6990,6 +7011,12 @@ msgstr "Domænet indeholder ikke-literaler. Deres evaluering kan mislykkes."
msgid "The domain should not involve non-literals"
msgstr "Domænet bør ikke indeholde ikke-literaler"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -7015,6 +7042,12 @@ msgstr ""
"Handlingen blev afbrudt. Dette betyder typisk, at den nuværende handling "
"tager for lang tid."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7670,7 +7703,7 @@ msgstr "Brugergrænseflade"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Bruger indstillinger"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7834,6 +7867,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Advarsel"
@ -8241,7 +8275,7 @@ msgstr "Asklepios"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "efter"
#. module: web
#. odoo-javascript
@ -26982,6 +27016,12 @@ msgstr "\"ledig\""
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Ingen emoji matcher din søgning"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Vinkel"

View file

@ -14,13 +14,15 @@
# Larissa Manderfeld, 2023
# Stefan Reisich <nafex@gmx.net>, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Larissa Manderfeld (lman)" <lman@odoo.com>, 2025.
# "Larissa Manderfeld (lman)" <lman@odoo.com>, 2025, 2026.
# "Malaz Siddig Elsayed Abuidris (msea)" <msea@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-27 02:30+0000\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-13 09:18+0000\n"
"Last-Translator: \"Larissa Manderfeld (lman)\" <lman@odoo.com>\n"
"Language-Team: German <https://translate.odoo.com/projects/odoo-19/web/de/>\n"
"Language: de\n"
@ -28,7 +30,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -305,7 +307,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -486,6 +488,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Getrennt (1 "
"pro Reiter)</option>\n"
" <option value=\"temporal\">Temporär "
"(experimentell)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>Warnung:</b> Im "
"temporären Modus werden alle Proben zusammengeführt.<br/>Bei gleichzeitigen "
"Profilen kann dies zu teilweise ungültigen Ergebnissen führen.<br/>Mit "
"Vorsicht verwenden! </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -545,8 +559,8 @@ msgstr "<span id=\"line_tax_ids\">15 %</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deko-Süchtiger</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -575,7 +589,7 @@ msgid ""
" <span>INV/2023/00003</span>"
msgstr ""
"<span>Rechnung</span>\n"
" <span>INV/2023/00003</span>"
" <span>RG/2023/00003</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -902,7 +916,7 @@ msgstr "Foto hinzufügen"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Eigenschaft hinzufügen"
#. module: web
#. odoo-javascript
@ -1172,12 +1186,14 @@ msgstr "Sind Sie sicher, dass Sie diese eingebettete Aktion entfernen möchten?"
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
"Sind Sie sicher, dass Sie die %(nbSelected)s ausgewählten Datensätze löschen "
"möchten?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Sind Sie sicher, dass Sie die ausgewählten Datensätze löschen möchten?"
#. module: web
#. odoo-javascript
@ -1195,7 +1211,7 @@ msgstr "Sind Sie sicher, dass Sie diese Spalte löschen möchten?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Sind Sie sicher, dass Sie dieses Eigenschaftsfeld löschen möchten?"
#. module: web
#. odoo-javascript
@ -2184,7 +2200,7 @@ msgstr "Währung"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Währungsfeld"
#. module: web
#. odoo-javascript
@ -2239,7 +2255,7 @@ msgstr "Benutzerdefinierte Gruppe"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Benutzerdefinierter Bereich"
#. module: web
#. odoo-python
@ -2305,7 +2321,7 @@ msgstr "Datum & Uhrzeit"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Datumsformat"
#. module: web
#. odoo-javascript
@ -2616,6 +2632,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Zeigt die Sekunden im Datums-/Zeitwert an oder blendet sie aus. Dies "
"betrifft nur das lesbare Datums-/Zeitformat."
#. module: web
#. odoo-javascript
@ -2628,6 +2646,8 @@ msgstr "Zeigt die Zeit im Datum/Zeit-Wert an oder blendet in aus."
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
"Zeigt das Datum entweder im Format 31/01/%(year)s oder als 31. Januar %"
"(year)s an"
#. module: web
#. odoo-javascript
@ -2852,7 +2872,7 @@ msgstr "E-Mail"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Konfiguration eingebetteter Aktionen"
#. module: web
#. odoo-javascript
@ -3219,6 +3239,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Wenn der Wert beispielsweise „1“ ist und Sie „+=2“ eingeben, wird er auf „3“ "
"aktualisiert."
#. module: web
#. odoo-javascript
@ -3396,6 +3418,10 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Achtung! Ihre letzten Änderungen sind zu umfangreich, um automatisch "
"gespeichert zu werden. Klicken Sie jetzt auf die Schaltfläche %"
"(upload_icon)s, um sicherzustellen, dass Ihre Arbeit gespeichert wird, bevor "
"Sie diesen Reiter schließen."
#. module: web
#. odoo-javascript
@ -3466,7 +3492,7 @@ msgstr "Startmenü"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Stunde"
#. module: web
#. odoo-python
@ -3570,6 +3596,16 @@ msgstr ""
"Vorrang hat. Die Farbauswahl wird also nicht angezeigt, wenn Sie auf das "
"Stichwort klicken."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Wenn angekreuzt, werden die Kontrollkästchen in einer Spalte angezeigt. "
"Andernfalls zwischen den Zeilen."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3683,7 +3719,7 @@ msgstr "Installieren"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "Install %s"
msgstr "%s Installieren"
msgstr "%s installieren"
#. module: web
#. odoo-javascript
@ -3726,7 +3762,7 @@ msgstr "Intervall"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Ungültiger Anzeigename"
#. module: web
#. odoo-javascript
@ -3891,18 +3927,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Es wird für alle entfernt, die %(parentFieldLabel)s „%(parentName)s“ "
"verwenden."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Es wird für alle entfernt."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31. Januar %s"
#. module: web
#. odoo-javascript
@ -4151,19 +4189,19 @@ msgstr "Groß"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Letzte 12 Monate"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Letzte 30 Tage"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Letzte 7 Tage"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4181,7 +4219,7 @@ msgstr "Zuletzt aktualisiert am"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Letzten Monat"
#. module: web
#. odoo-javascript
@ -4324,7 +4362,7 @@ msgstr "Abmelden"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Anmelden"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4478,12 +4516,12 @@ msgstr "Meeting-Betreff"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Speicherlimit (in Bytes)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Speicherprofil"
#. module: web
#. odoo-javascript
@ -4529,6 +4567,12 @@ msgstr "Milchstraße"
msgid "Minimal precision"
msgstr "Minimale Genauigkeit"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Mindestanzahl an Ziffern"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4557,7 +4601,7 @@ msgstr "Fehlende Datensatz-ID"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Fehlende Pflichtfelder"
#. module: web
#. odoo-javascript
@ -4644,7 +4688,7 @@ msgstr "Monat"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Monat zu Datum"
#. module: web
#. odoo-javascript
@ -4768,7 +4812,7 @@ msgstr "Mein Odoo.com-Konto"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Meine Präferenzen"
#. module: web
#. odoo-javascript
@ -4941,6 +4985,12 @@ msgstr "Keine Daten"
msgid "No data to display"
msgstr "Keine Daten zum Anzeigen"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "Keine zu exportierenden Daten"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4956,8 +5006,8 @@ msgstr "Es kann kein Gerät gefunden werden."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Kein Emoji passt zu Ihrer Suche"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5008,7 +5058,7 @@ msgstr "Kein Treffer gefunden"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Keine Ergebnisse"
#. module: web
#. odoo-javascript
@ -5065,6 +5115,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Es ist nicht möglich, ein Währungsfeld zu erstellen, da das aktuelle Modell "
"keine Währung enthält."
#. module: web
#. odoo-javascript
@ -5219,7 +5271,7 @@ msgid ""
"have been archived/unarchived."
msgstr ""
"Von den %(selectedRecord)s ausgewählten Datensätzen wurden nur die ersten %"
"(firstRecords)s archiviert/dearchiviert."
"(firstRecords)s archiviert bzw. deren Archivierung aufgehoben."
#. module: web
#: model_terms:ir.ui.view,arch_db:web.webclient_offline
@ -5235,7 +5287,6 @@ msgstr "Huch!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5475,7 +5526,7 @@ msgstr "Passwort"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "Payment Communication: <b><span>INV/2023/00003</span></b>"
msgstr "Zahlungsmitteilung: <b><span>INV/2023/00003</span></b>"
msgstr "Zahlungsmitteilung: <b><span>RG/2023/00003</span></b>"
#. module: web
#. odoo-javascript
@ -5602,12 +5653,12 @@ msgstr "Bitte erneut scannen!"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.brand_promotion_message
msgid "Powered by %s%s"
msgstr "Powered by %s%s"
msgstr "Unterstützt durch %s%s"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login_layout
msgid "Powered by <span>Odoo</span>"
msgstr "Powered by <span>Odoo</span>"
msgstr "Unterstützt durch <span>Odoo</span>"
#. module: web
#. odoo-javascript
@ -5752,7 +5803,7 @@ msgstr "Eigenschaften"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Allgemeine Festlegung der Eigenschaften"
#. module: web
#. odoo-javascript
@ -5883,7 +5934,7 @@ msgstr "Datensatzregeln"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Datensatzspeicher"
#. module: web
#. odoo-javascript
@ -6520,6 +6571,7 @@ msgstr "Zeitzone für Ihren Benutzer einstellen"
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
"Legen Sie ein Ganzzahlen-Feld fest, um Farben mit dem Abzeichen zu verwenden."
#. module: web
#. odoo-javascript
@ -6670,8 +6722,8 @@ msgid ""
"Something went wrong... If you really are stuck, share the report with your "
"friendly support service"
msgstr ""
"Etwas ist schiefgelaufen ... Wenn Sie wirklich feststecken, teilen Sie den "
"Bericht mit Ihrem freundlichen Kundenservice"
"Etwas ist schiefgelaufen Wenn Sie wirklich feststecken, teilen Sie den "
"Bericht mit dem freundlichen Kundenservice."
#. module: web
#. odoo-javascript
@ -6688,10 +6740,11 @@ msgstr "Spezial:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Gestapelt"
@ -6793,7 +6846,7 @@ msgstr "Stilfehler"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Suffix"
#. module: web
#. odoo-javascript
@ -7008,11 +7061,18 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "Die Domain sollte keine Nicht-Buchstabensymbole enthalten."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Die Datei ist kein Bild, die Größe kann nicht geändert werden."
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
"Die ID in %(field_name)s dürfen nicht dupliziert sein: „%(action_ids)s“"
#. module: web
#. odoo-python
@ -7021,6 +7081,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"Die ID in %(field_name)s dürfen nur Ganzzahlen oder „false“ sein: „%"
"(action_ids)s“"
#. module: web
#. odoo-javascript
@ -7033,6 +7095,12 @@ msgstr ""
"Der Vorgang wurde unterbrochen. Dies bedeutet in der Regel, dass der "
"aktuelle Vorgang zu viel Zeit in Anspruch nimmt."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Die Größenänderung des Bildes ist nicht möglich"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7068,6 +7136,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"Der Benutzer sollte über eine eindeutige eingebettete Aktionseinstellung pro "
"Benutzereinstellung, Aktion und Datensatz-ID verfügen."
#. module: web
#. odoo-javascript
@ -7267,7 +7337,7 @@ msgstr "Suchfeld ein/aus"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Modus für Datumsbereich ein/aus"
#. module: web
#. odoo-javascript
@ -7651,6 +7721,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Verwenden Sie die Operatoren „+=“, „-=“, „*=“ und „/=“, um den aktuellen "
"Wert zu aktualisieren."
#. module: web
#. odoo-javascript
@ -7698,12 +7770,12 @@ msgstr "Benutzerschnittstelle"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Benutzereinstellungen"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Benutzereinstellungen für eingebettete Aktionen"
#. module: web
#. odoo-javascript
@ -7795,7 +7867,7 @@ msgstr "Ansicht"
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_renderer.xml:0
msgid "View Button"
msgstr "Schaltfläche anzeigen"
msgstr "„Ansicht“-Schaltfläche"
#. module: web
#. odoo-javascript
@ -7862,6 +7934,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Warnung"
@ -8001,7 +8074,7 @@ msgstr "Jahr"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Seit Jahresbeginn"
#. module: web
#. odoo-javascript
@ -8050,7 +8123,7 @@ msgstr "Sie können die App aus dem Browsermenü installieren"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Sie können diese Felddefinition nicht lesen."
#. module: web
#. odoo-javascript
@ -8274,7 +8347,7 @@ msgstr "Asklepios"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "nach"
#. module: web
#. odoo-javascript
@ -9251,7 +9324,7 @@ msgstr "Käfer"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "vor"
#. module: web
#. odoo-javascript
@ -12383,7 +12456,7 @@ msgstr "Dokument"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "does not contain"
msgstr "beinhaltet nicht"
msgstr "enthält nicht"
#. module: web
#. odoo-javascript
@ -12874,7 +12947,7 @@ msgstr "Empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "leer"
#. module: web
#. odoo-javascript
@ -14704,7 +14777,7 @@ msgstr "Grashüpfer"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "größer als oder gleich"
#. module: web
#. odoo-javascript
@ -17170,13 +17243,13 @@ msgstr "niedrig"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "kleiner als oder gleich"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "kleiner als"
#. module: web
#. odoo-javascript
@ -19376,7 +19449,6 @@ msgstr "optische Platte"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/autocomplete/autocomplete.xml:0
#, fuzzy
msgid "option.label"
msgstr "option.label"
@ -19384,7 +19456,6 @@ msgstr "option.label"
#. odoo-javascript
#: code:addons/web/static/src/core/record_selectors/record_autocomplete.xml:0
#: code:addons/web/static/src/views/fields/relational_utils.xml:0
#, fuzzy
msgid "optionScope.label"
msgstr "optionScope.label"
@ -27019,6 +27090,12 @@ msgstr "„freies Zimmer“"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Kein Emoji passt zu Ihrer Suche"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deko-Süchtiger</span>"
#~ msgid "Angle"
#~ msgstr "Winkel"

View file

@ -12,13 +12,15 @@
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Dionysis Zacharioudakis <d.zacharioudakis@dileanity.com>, 2025.
# Panagiotis karampaglis <panosdotk@gmail.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-10-04 02:31+0000\n"
"Last-Translator: Dionysis Zacharioudakis <d.zacharioudakis@dileanity.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 19:02+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Greek <https://translate.odoo.com/projects/odoo-19/web/el/>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
@ -530,7 +532,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -861,7 +863,7 @@ msgstr "Προσθήκη"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/x2many/x2many_field.js:0
msgid "Add %s"
msgstr ""
msgstr "Προσθέστε%s"
#. module: web
#. odoo-javascript
@ -916,7 +918,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "Add nested rule"
msgstr ""
msgstr "Προσθήκη ένθετου κανόνα"
#. module: web
#. odoo-javascript
@ -2111,7 +2113,7 @@ msgstr "Ημερομηνία Δημιουργίας:"
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_items.xml:0
msgid "Creation User:"
msgstr "Χρήστης δημιουργίας"
msgstr "Χρήστης δημιουργίας:"
#. module: web
#. odoo-javascript
@ -2141,7 +2143,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_custom_tab.js:0
msgid "Custom"
msgstr ""
msgstr "Προσωποποιημένο"
#. module: web
#. odoo-javascript
@ -2165,20 +2167,20 @@ msgstr ""
#: code:addons/web/static/src/search/search_bar/search_bar.js:0
#: code:addons/web/static/src/search/search_model.js:0
msgid "Custom Filter"
msgstr ""
msgstr "Προσαρμοσμένο φίλτρο"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar/search_bar.xml:0
#: code:addons/web/static/src/search/search_bar_menu/search_bar_menu.xml:0
msgid "Custom Filter..."
msgstr ""
msgstr "Προσαρμοσμένο φίλτρο..."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/search/custom_group_by_item/custom_group_by_item.xml:0
msgid "Custom Group"
msgstr ""
msgstr "Προσαρμοσμένη Ομαδοποίηση"
#. module: web
#. odoo-javascript
@ -2250,7 +2252,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Μορφή Ημερομηνίας"
#. module: web
#. odoo-javascript
@ -2412,7 +2414,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "Delete rule"
msgstr ""
msgstr "Διαγραφή κανόνα"
#. module: web
#. odoo-javascript
@ -2936,7 +2938,7 @@ msgstr "Εξωτερικό Αναγνωριστικό"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_field.js:0
msgid "Extra Rights"
msgstr ""
msgstr "Πρόσθετα Δικαιώματα"
#. module: web
#. odoo-javascript
@ -3132,7 +3134,7 @@ msgstr "Υποσέλιδο"
#: model:ir.model.fields,help:web.field_base_document_layout__report_footer
msgid "Footer text displayed at the bottom of all reports."
msgstr ""
"Κείμενο υποσέλιδου που εμφανίζεται στο τέλος της σελίδας όλων των εκτυπώσεων"
"Κείμενο υποσέλιδου που εμφανίζεται στο τέλος της σελίδας όλων των εκτυπώσεων."
#. module: web
#. odoo-javascript
@ -3275,7 +3277,7 @@ msgstr "Πράσινο"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_popover.xml:0
msgid "Group"
msgstr ""
msgstr "Ομάδα"
#. module: web
#. odoo-javascript
@ -3293,7 +3295,7 @@ msgstr "Ομαδοποίηση κατά"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
msgid "HTML"
msgstr ""
msgstr "HTML"
#. module: web
#: model:ir.model,name:web.model_ir_http
@ -3330,7 +3332,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "Help"
msgstr ""
msgstr "Βοήθεια"
#. module: web
#. odoo-javascript
@ -3487,6 +3489,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4057,7 +4067,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Τελευταίες 7 ημέρες"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4218,7 +4228,7 @@ msgstr "Αποσύνδεση"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Σύνδεση"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4424,6 +4434,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4724,7 +4740,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "New Rule"
msgstr ""
msgstr "Νέος Κανόνας"
#. module: web
#. odoo-javascript
@ -4836,6 +4852,12 @@ msgstr ""
msgid "No data to display"
msgstr "Δεν υπάρχουν δεδομένα προς εμφάνιση"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4851,7 +4873,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -5125,7 +5147,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5210,7 +5231,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Open"
msgstr ""
msgstr "Ανοιχτό"
#. module: web
#. odoo-javascript
@ -6072,7 +6093,7 @@ msgstr "Αποθήκευση & Κλείσιμο"
#: code:addons/web/static/src/views/fields/relational_utils.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
msgid "Save & New"
msgstr "Αποθήκευση & Δημιουργία Νέου"
msgstr "Αποθήκευση & Δημιουργία Νέου"
#. module: web
#. odoo-javascript
@ -6277,7 +6298,7 @@ msgstr "Επιλογή προβολής"
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/selection_box.xml:0
msgid "Select all"
msgstr ""
msgstr "Επιλογή όλων"
#. module: web
#. odoo-javascript
@ -6313,7 +6334,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_value_editors.js:0
msgid "Select one or several criteria"
msgstr ""
msgstr "Επιλέξτε μία ή περισσότερες επιλογές"
#. module: web
#. odoo-javascript
@ -6481,7 +6502,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/view_scale_selector.xml:0
msgid "Show weekends"
msgstr ""
msgstr "Εμφάνιση Σαββατοκύριακων"
#. module: web
#. odoo-javascript
@ -6550,6 +6571,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr ""
@ -6651,7 +6673,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Επίθημα"
#. module: web
#. odoo-javascript
@ -6779,7 +6801,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:web.external_layout_striped
#: model_terms:ir.ui.view,arch_db:web.external_layout_wave
msgid "Tax ID"
msgstr "Α.Φ.Μ."
msgstr "ΑΦΜ"
#. module: web
#. odoo-javascript
@ -6859,6 +6881,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6882,6 +6910,12 @@ msgid ""
"is taking too much time."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7365,7 +7399,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_confirmation_dialog.xml:0
msgid "Update"
msgstr ""
msgstr "Ενημέρωση"
#. module: web
#. odoo-javascript
@ -7508,7 +7542,7 @@ msgstr "Χρηστική Διεπιφάνεια"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Ρυθμίσεις Χρήστη"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7672,6 +7706,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Προσοχή"
@ -8140,7 +8175,7 @@ msgstr ""
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
#: code:addons/web/static/src/core/tree_editor/tree_processor.js:0
msgid "all"
msgstr ""
msgstr "όλα"
#. module: web
#. odoo-javascript
@ -8311,7 +8346,7 @@ msgstr ""
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
#: code:addons/web/static/src/core/tree_editor/tree_processor.js:0
msgid "any"
msgstr ""
msgstr "κάθε"
#. module: web
#. odoo-javascript
@ -9110,7 +9145,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "between"
msgstr ""
msgstr "ανάμεσα"
#. module: web
#. odoo-javascript
@ -10004,7 +10039,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "calendar"
msgstr ""
msgstr "ημερολόγιο"
#. module: web
#. odoo-javascript
@ -12176,7 +12211,7 @@ msgstr "εγγραφή"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "does not contain"
msgstr ""
msgstr "δεν περιέχει"
#. module: web
#. odoo-javascript
@ -16969,7 +17004,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "μικρότερη από"
#. module: web
#. odoo-javascript
@ -18709,7 +18744,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "no records"
msgstr ""
msgstr "χωρίς εγγραφές"
#. module: web
#. odoo-javascript
@ -18897,7 +18932,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "of the following rules:"
msgstr ""
msgstr "από τους ακόλουθους κανόνες:"
#. module: web
#. odoo-javascript
@ -22114,7 +22149,7 @@ msgstr ""
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.xml:0
#: code:addons/web/static/src/views/view_components/selection_box.xml:0
msgid "selected"
msgstr ""
msgstr "επιλεγμένα"
#. module: web
#. odoo-javascript

View file

@ -14,22 +14,25 @@
# Pedro M. Baeza <pedro.baeza@tecnativa.com>, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# "Noemi Pla Garcia (nopl)" <nopl@odoo.com>, 2025, 2026.
# "Malaz Siddig Elsayed Abuidris (msea)" <msea@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-17 17:29+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"Language-Team: Spanish <https://translate.odoo.com/projects/odoo-19/web/es/"
">\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-03-06 17:47+0000\n"
"Last-Translator: \"Noemi Pla Garcia (nopl)\" <nopl@odoo.com>\n"
"Language-Team: Spanish <https://translate.odoo.com/projects/odoo-19/web/es/>"
"\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n != 0 && n % 1000000 == "
"0) ? 1 : 2);\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.16.1\n"
#. module: web
#. odoo-javascript
@ -306,7 +309,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -487,6 +490,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Separado (uno "
"por pestaña)</option>\n"
" <option value=\"temporal\">Temporal "
"(experimental)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>Advertencia:</b> el "
"modo temporal fusionará todas las muestras/ejemplos.<br/>Puede causar "
"resultados parcialmente no válidos en caso de perfiles concurrentes.<br/"
">Úsalo con precaución </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -546,8 +561,8 @@ msgstr "<span id=\"line_tax_ids\">15 %</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -681,7 +696,7 @@ msgstr "<strong>Total</strong>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<strong>Untaxed Amount</strong>"
msgstr "<strong>Base imponible</strong>"
msgstr "<strong>Importe base</strong>"
#. module: web
#. odoo-javascript
@ -903,7 +918,7 @@ msgstr "Añadir una fotografía"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Añadir una propiedad"
#. module: web
#. odoo-javascript
@ -1171,12 +1186,14 @@ msgstr "¿Está seguro de que desea eliminar esta acción incrustada?"
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
"¿Estás seguro de que deseas eliminar los registros seleccionados de %"
"(nbSelected)s?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "¿Estás seguro de que deseas eliminar el registro seleccionado?"
#. module: web
#. odoo-javascript
@ -1194,7 +1211,7 @@ msgstr "¿Está seguro de que desea eliminar esta columna?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "¿Estás seguro de que deseas eliminar este campo de propiedad?"
#. module: web
#. odoo-javascript
@ -1326,13 +1343,13 @@ msgstr "Volver"
#. odoo-javascript
#: code:addons/web/static/src/search/breadcrumbs/breadcrumbs.js:0
msgid "Back to “%s”"
msgstr "Regresar a “%s”"
msgstr "Volver a “%s”"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/search/breadcrumbs/breadcrumbs.js:0
msgid "Back to “%s” form"
msgstr "Regresar al formulario “%s”"
msgstr "Volver al formulario “%s”"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
@ -1685,7 +1702,7 @@ msgstr "Elija un comando de depuración..."
#. odoo-javascript
#: code:addons/web/static/src/core/user_switch/user_switch.xml:0
msgid "Choose a user"
msgstr "Elija un usuario"
msgstr "Elige un usuario"
#. module: web
#. odoo-javascript
@ -2185,7 +2202,7 @@ msgstr "Moneda"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Campo de moneda"
#. module: web
#. odoo-javascript
@ -2240,7 +2257,7 @@ msgstr "Grupo personalizado"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Rango personalizado"
#. module: web
#. odoo-python
@ -2308,7 +2325,7 @@ msgstr "Fecha y hora"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Formato de fecha"
#. module: web
#. odoo-javascript
@ -2619,6 +2636,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Muestra u oculta los segundos en el valor de fecha y hora. Solo afecta al "
"formato de fecha y hora legible."
#. module: web
#. odoo-javascript
@ -2631,6 +2650,7 @@ msgstr "Muestra u oculta la hora en el valor de fecha y hora."
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
"Muestra la fecha en formato 31/01/%(year)s o en formato Ene 31, %(year)s"
#. module: web
#. odoo-javascript
@ -2854,7 +2874,7 @@ msgstr "Correo electrónico"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Configuración de acciones integradas"
#. module: web
#. odoo-javascript
@ -2901,12 +2921,12 @@ msgstr "Introduzca un correo electrónico"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Enter your email"
msgstr "Escriba su correo"
msgstr "Introduce tu correo electrónico"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Enter your password"
msgstr "Ingrese su contraseña"
msgstr "Introduce tu contraseña"
#. module: web
#. odoo-javascript
@ -3221,6 +3241,7 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Por ejemplo, si el valor es «1» y se introduce «+=2», se actualizará a «3»."
#. module: web
#. odoo-javascript
@ -3336,7 +3357,7 @@ msgstr "Ir a la URL"
#: code:addons/web/static/src/views/fields/google_slide_viewer/google_slide_viewer.js:0
#: code:addons/web/static/src/views/fields/google_slide_viewer/google_slide_viewer.xml:0
msgid "Google Slide Viewer"
msgstr "Visor de presentaciones de Google"
msgstr "Lector de presentaciones de Google"
#. module: web
#. odoo-javascript
@ -3398,6 +3419,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"¡Atención! Los cambios recientes son demasiado grandes para guardarse "
"automáticamente. Haz clic en el botón « %(upload_icon)s » (Guardar cambios) "
"para asegurarte de que tu trabajo se guarde antes de salir de esta pestaña."
#. module: web
#. odoo-javascript
@ -3468,7 +3492,7 @@ msgstr "Menú de inicio"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Hora"
#. module: web
#. odoo-python
@ -3569,6 +3593,16 @@ msgstr ""
"edición de la etiqueta será la que se conserve y el selector de color no "
"aparecerá al hacer clic en ella."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Si se selecciona, las casillas de verificación se mostrarán en una columna. "
"De lo contrario, aparecerán en línea."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3725,7 +3759,7 @@ msgstr "Intervalo"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Nombre para mostrar no válido"
#. module: web
#. odoo-javascript
@ -3893,18 +3927,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Se eliminará para todos los que utilicen \"%(parentName)s\" %"
"(parentFieldLabel)s."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "¡Se eliminará para todos!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31 Ene, %s"
#. module: web
#. odoo-javascript
@ -4133,7 +4169,7 @@ msgstr "Etiqueta:"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_renderer.xml:0
msgid "Lack of inspiration?"
msgstr "¿Falta la inspiración?"
msgstr "¿Te falta inspiración?"
#. module: web
#. odoo-python
@ -4153,19 +4189,19 @@ msgstr "Grande"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Últimos 12 meses"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Últimos 30 días"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Últimos 7 días"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4183,7 +4219,7 @@ msgstr "Última actualización el"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "El mes pasado"
#. module: web
#. odoo-javascript
@ -4326,7 +4362,7 @@ msgstr "Cerrar sesión"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Usuario"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4481,12 +4517,12 @@ msgstr "Asunto de la reunión"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Límite de memoria (en bytes)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Perfil de uso de memoria"
#. module: web
#. odoo-javascript
@ -4532,6 +4568,12 @@ msgstr "Vía láctea"
msgid "Minimal precision"
msgstr "Precisión mínima"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Mínimo de dígitos"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4560,7 +4602,7 @@ msgstr "Falta el ID del registro"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Faltan campos obligatorios"
#. module: web
#. odoo-javascript
@ -4647,7 +4689,7 @@ msgstr "Mes"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Mes hasta la fecha"
#. module: web
#. odoo-javascript
@ -4771,7 +4813,7 @@ msgstr "Mi cuenta de Odoo.com"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Mis preferencias"
#. module: web
#. odoo-javascript
@ -4944,6 +4986,12 @@ msgstr "Sin datos"
msgid "No data to display"
msgstr "Sin datos que mostrar"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "No hay datos para exportar"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4959,8 +5007,8 @@ msgstr "No se encontró ningún dispositivo."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Ningún emoji coincide con su búsqueda"
msgid "No emojis match your search"
msgstr "No hay emojis que coincidan con tu búsqueda"
#. module: web
#. odoo-javascript
@ -5011,7 +5059,7 @@ msgstr "No se encontraron resultados"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "No hay resultados"
#. module: web
#. odoo-javascript
@ -5023,7 +5071,7 @@ msgstr "No encontramos ningún ajuste"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_renderer.xml:0
msgid "No stages yet, let's create some!"
msgstr "Todavía no hay etapas creadas. ¡Cree una ahora!"
msgstr "Todavía no hay etapas creadas. ¡Crea una ahora!"
#. module: web
#. odoo-javascript
@ -5067,6 +5115,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"No es posible crear un campo monetario porque no hay moneda en el modelo "
"actual."
#. module: web
#. odoo-javascript
@ -5237,7 +5287,6 @@ msgstr "¡Uy!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5374,7 +5423,7 @@ msgstr "Abrir: %s"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "Operator not supported"
msgstr "Operador no permitido"
msgstr "Operador no compatible"
#. module: web
#. odoo-javascript
@ -5429,7 +5478,7 @@ msgstr "PC"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/pdf_viewer/pdf_viewer_field.js:0
msgid "PDF Viewer"
msgstr "Visor de PDF"
msgstr "Lector de PDF"
#. module: web
#. odoo-javascript
@ -5749,7 +5798,7 @@ msgstr "Propiedades"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Definición básica de propiedades"
#. module: web
#. odoo-javascript
@ -5881,7 +5930,7 @@ msgstr "Reglas de registro"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Memoria de registro"
#. module: web
#. odoo-javascript
@ -5935,7 +5984,7 @@ msgstr "Actualizar"
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_items.js:0
msgid "Regenerate Assets"
msgstr "Regenerar activos"
msgstr "Volver a generar activos"
#. module: web
#. odoo-javascript
@ -6517,7 +6566,7 @@ msgstr "Establezca una zona horaria en su usuario"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Establece un campo entero para utilizar colores con la insignia."
#. module: web
#. odoo-javascript
@ -6666,7 +6715,8 @@ msgid ""
"Something went wrong... If you really are stuck, share the report with your "
"friendly support service"
msgstr ""
"Ocurrió un error... Comuníquese con el equipo de soporte si necesita ayuda."
"Se ha producido un error... Comunícate con el equipo de soporte si necesitas "
"ayuda"
#. module: web
#. odoo-javascript
@ -6683,10 +6733,11 @@ msgstr "Especial:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Apilado"
@ -6788,7 +6839,7 @@ msgstr "Error de estilo"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufijo"
#. module: web
#. odoo-javascript
@ -7001,11 +7052,18 @@ msgstr "El dominio incluye no literales. La evaluación podría fallar."
msgid "The domain should not involve non-literals"
msgstr "El dominio no debe incluir no literales"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "El archivo no es una imagen, no es posible cambiar su tamaño"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
"Los identificadores de %(field_name)s no deben duplicarse: «%(action_ids)s»"
#. module: web
#. odoo-python
@ -7014,6 +7072,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"Los identificadores de %(field_name)s solo deben ser números enteros o "
"\"false\": «%(action_ids)s»"
#. module: web
#. odoo-javascript
@ -7026,6 +7086,12 @@ msgstr ""
"La operación fue interrumpida. Esto generalmente significa que la operación "
"actual está tomando demasiado tiempo."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "El cambio de tamaño de la imagen no se ha realizado correctamente"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7061,6 +7127,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"El usuario debe tener una configuración de acción integrada única por cada "
"configuración de usuario, acción e identificador de registro."
#. module: web
#. odoo-javascript
@ -7260,7 +7328,7 @@ msgstr "Alternar panel de búsqueda"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Alternar modo de rango de fechas"
#. module: web
#. odoo-javascript
@ -7640,6 +7708,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Utiliza los operadores «+=», «-=», «*=» y «/=» para actualizar el valor "
"actual."
#. module: web
#. odoo-javascript
@ -7687,12 +7757,12 @@ msgstr "Interfaz de usuario"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Ajustes de usuario"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Configuración del usuario para acciones integradas"
#. module: web
#. odoo-javascript
@ -7820,7 +7890,7 @@ msgstr "Vista: %(displayName)s"
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Viewer"
msgstr "Visor"
msgstr "Lector"
#. module: web
#. odoo-javascript
@ -7851,6 +7921,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Advertencia"
@ -7988,7 +8059,7 @@ msgstr "Año"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Desde el inicio del año hasta la fecha"
#. module: web
#. odoo-javascript
@ -8037,7 +8108,7 @@ msgstr "Puede instalar la aplicación desde el menú del navegador"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "No se puede leer esa definición de campo."
#. module: web
#. odoo-javascript
@ -8259,7 +8330,7 @@ msgstr "esculapio"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "después de"
#. module: web
#. odoo-javascript
@ -9236,7 +9307,7 @@ msgstr "escarabajo"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "antes de"
#. module: web
#. odoo-javascript
@ -12859,7 +12930,7 @@ msgstr "empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "vacío"
#. module: web
#. odoo-javascript
@ -14689,7 +14760,7 @@ msgstr "saltamontes"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "mayor o igual a"
#. module: web
#. odoo-javascript
@ -16081,13 +16152,13 @@ msgstr "no está en"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "is not set"
msgstr "no está establecida(o)"
msgstr "no está definido"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "is set"
msgstr "está establecida(o)"
msgstr "está definido"
#. module: web
#. odoo-javascript
@ -16933,7 +17004,7 @@ msgstr "luces"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "like"
msgstr "como"
msgstr "contiene"
#. module: web
#. odoo-javascript
@ -17155,13 +17226,13 @@ msgstr "brillo bajo"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "inferior o igual a"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "inferior a"
#. module: web
#. odoo-javascript
@ -17875,7 +17946,7 @@ msgstr "masaje"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "match"
msgstr "coincidencia"
msgstr "coincidence con"
#. module: web
#. odoo-javascript
@ -17887,7 +17958,7 @@ msgstr "no coinciden con ninguno de"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "matches"
msgstr "coincidencias"
msgstr "coincidence con"
#. module: web
#. odoo-javascript
@ -18901,7 +18972,7 @@ msgstr "prohibido el paso de peatones"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "no records"
msgstr ""
msgstr "sin registros"
#. module: web
#. odoo-javascript
@ -18979,7 +19050,6 @@ msgstr "no"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
#, fuzzy
msgid "not %(operator_label)s"
msgstr "no %(operator_label)s"
@ -19000,7 +19070,7 @@ msgstr "no todos"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "not like"
msgstr "no como"
msgstr "no contiene"
#. module: web
#. odoo-javascript
@ -19078,7 +19148,7 @@ msgstr "octagonal"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "octopus"
msgstr "pulpo"
msgstr "octopus"
#. module: web
#. odoo-javascript
@ -19362,14 +19432,14 @@ msgstr "disco óptico"
#. odoo-javascript
#: code:addons/web/static/src/core/autocomplete/autocomplete.xml:0
msgid "option.label"
msgstr ""
msgstr "option.label"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/record_selectors/record_autocomplete.xml:0
#: code:addons/web/static/src/views/fields/relational_utils.xml:0
msgid "optionScope.label"
msgstr ""
msgstr "optionScope.label"
#. module: web
#. odoo-javascript
@ -23616,7 +23686,7 @@ msgstr "cara sonriendo con estrellas"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "starts with"
msgstr "inicia con"
msgstr "empieza con"
#. module: web
#. odoo-javascript
@ -27002,6 +27072,12 @@ msgstr "“disponible”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Ningún emoji coincide con su búsqueda"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Ángulo"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -37,21 +37,23 @@
# Ossi Mantylahti <ossi.mantylahti@obs-solutions.fi>, 2023
# Karoliina Nisula <karoliina.nisula@tawasta.fi>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Saara Hakanen <sahak@odoo.com>, 2025, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 15:31+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"Language-Team: Finnish <https://translate.odoo.com/projects/odoo-19/web/fi/"
">\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-03-06 17:47+0000\n"
"Last-Translator: Saara Hakanen <sahak@odoo.com>\n"
"Language-Team: Finnish <https://translate.odoo.com/projects/odoo-19/web/fi/>"
"\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.16.1\n"
#. module: web
#. odoo-javascript
@ -328,7 +330,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -509,6 +511,17 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Eroteltu (yksi per "
"välilehti)</option>\n"
" <option value=\"temporal\">Väliaikainen "
"(kokeellinen)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" class=\"alert "
"alert-warning\" style=\"display:none\"><b>Varoitus:</b> Väliaikainen-tila "
"yhdistää kaikki näytteet.<br/>Se voi johtaa osittain virheelliseen tulokseen "
"samanaikaisten profiilien tapauksessa.<br/>Käytä harkiten </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -568,8 +581,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -879,7 +892,7 @@ msgstr "Aktivoi debug-tila (resurssien kanssa)"
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_dev_tool.xml:0
msgid "Activate the developer mode"
msgstr "Käynnistä kehitystila"
msgstr "Aktivoi kehittäjätila"
#. module: web
#. odoo-javascript
@ -925,7 +938,7 @@ msgstr "Lisää kuva"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Lisää ominaisuus"
#. module: web
#. odoo-javascript
@ -1192,13 +1205,13 @@ msgstr "Oletko varma, että haluat poistaa tämän upotetun toiminnon?"
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
msgstr "Haluatko varmasti poistaa %(nbSelected)s valitut tietueet?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Haluatko varmasti poistaa valitun tietueen?"
#. module: web
#. odoo-javascript
@ -1216,7 +1229,7 @@ msgstr "Haluatko varmasti poistaa tämän sarakkeen?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Haluatko varmasti poistaa tämän ominaisuuskentän?"
#. module: web
#. odoo-javascript
@ -1412,7 +1425,7 @@ msgstr "Viivakoodinlukija"
#. odoo-javascript
#: code:addons/web/static/src/core/barcode/barcode_video_scanner.js:0
msgid "Barcode Video Scanner could not be mounted properly."
msgstr "Viivakoodivideoskanneria ei voitu asentaa oikein."
msgstr "Videon viivakoodinlukijaa ei voitu asentaa oikein."
#. module: web
#: model:ir.model,name:web.model_base
@ -2205,7 +2218,7 @@ msgstr "Valuutta"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Valuuttakenttä"
#. module: web
#. odoo-javascript
@ -2260,7 +2273,7 @@ msgstr "Räätälöity ryhmä"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Mukautettu väli"
#. module: web
#. odoo-python
@ -2327,7 +2340,7 @@ msgstr "Päiväys ja aika"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Päivämäärän muotoilu"
#. module: web
#. odoo-javascript
@ -2443,7 +2456,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/image/image_field.js:0
msgid "Delay the apparition of the zoomed image with a value in milliseconds"
msgstr "Viivyttää zoomatun kuvan näkymistä, arvo millisekunteina"
msgstr "Viivytä suurennetun kuvan ilmestymistä, arvo millisekunneissa"
#. module: web
#. odoo-javascript
@ -2637,6 +2650,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Näyttää tai piilottaa sekunnit aikaleimassa. Vaikuttaa vain luettavaan "
"päivämäärä- ja kellonaikamuotoon."
#. module: web
#. odoo-javascript
@ -2649,6 +2664,7 @@ msgstr "Näyttää tai piilottaa ajan datetime-arvossa."
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
"Näyttää päivämäärän joko muodossa 31/01/%(year)s tai 31. tammikuuta %(year)s"
#. module: web
#. odoo-javascript
@ -2758,7 +2774,7 @@ msgstr "Piirrä"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record.xml:0
msgid "Dropdown menu"
msgstr "Alasvetovalikko"
msgstr "Pudotusvalikko"
#. module: web
#. odoo-javascript
@ -2766,7 +2782,7 @@ msgstr "Alasvetovalikko"
#: code:addons/web/static/src/views/kanban/kanban_controller.js:0
#: code:addons/web/static/src/views/list/list_controller.js:0
msgid "Duplicate"
msgstr "Kopioi"
msgstr "Monista"
#. module: web
#. odoo-javascript
@ -2779,13 +2795,13 @@ msgstr "Kopioi"
#: code:addons/web/static/src/views/fields/text/text_field.js:0
#: code:addons/web/static/src/views/fields/url/url_field.js:0
msgid "Dynamic Placeholder"
msgstr "Dynaaminen paikanvaraaja"
msgstr "Dynaaminen paikkamerkki"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/many2one/many2one_field.js:0
msgid "Dynamic placeholder"
msgstr "Dynaaminen paikanvaraaja"
msgstr "Dynaaminen paikkamerkki"
#. module: web
#. odoo-javascript
@ -2872,7 +2888,7 @@ msgstr "Sähköposti"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Upotettujen toimintojen asetukset"
#. module: web
#. odoo-javascript
@ -2896,7 +2912,7 @@ msgstr "Ota profilointi käyttöön"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/image/image_field.js:0
msgid "Enable zoom"
msgstr "Ota zoom käyttöön"
msgstr "Ota suurennus käyttöön"
#. module: web
#. odoo-javascript
@ -3049,7 +3065,7 @@ msgstr "Kerroin"
#. odoo-javascript
#: code:addons/web/static/src/search/search_model.js:0
msgid "Failed to evaluate the context: %(context)s."
msgstr "Kontekstin arviointi epäonnistui: %(context)s"
msgstr "Kontekstin arvioiminen epäonnistui: %(context)s."
#. module: web
#. odoo-javascript
@ -3239,6 +3255,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Esimerkiksi, jos arvo on \"1\" ja syötät \"+=2\", se päivitetään arvoon "
"\"3\"."
#. module: web
#. odoo-javascript
@ -3417,6 +3435,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Huomio! Viimeaikaiset muutoksesi ovat liian suuria tallennettavaksi "
"automaattisesti. Klikkaa %(upload_icon)s-painiketta nyt varmistaaksesi työsi "
"tallentumisen ennen tästä välilehdestä poistumista."
#. module: web
#. odoo-javascript
@ -3487,7 +3508,7 @@ msgstr "Kotivalikko"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Tunti"
#. module: web
#. odoo-python
@ -3587,6 +3608,16 @@ msgstr ""
"valinta on ensisijainen. Värinvalitsin ei tule näkyviin, kun tunnistetta "
"napsautetaan."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Jos valittu, valintaruudut näytetään sarakkeessa. Muussa tapauksessa ne "
"näytetään rivillä."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3739,7 +3770,7 @@ msgstr "Aikaväli"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Virheellinen näyttönimi"
#. module: web
#. odoo-javascript
@ -3903,18 +3934,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Se poistetaan kaikilta, jotka käyttävät \"%(parentName)s\" %"
"(parentFieldLabel)s."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Se poistetaan kaikilta!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31. tammikuuta %s"
#. module: web
#. odoo-javascript
@ -4163,19 +4196,19 @@ msgstr "Suuri"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Viimeiset 12 kuukautta"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Viimeiset 30 päivää"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Viimeiset 7 päivää"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4193,7 +4226,7 @@ msgstr "Viimeksi päivitetty"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Viime kuukausi"
#. module: web
#. odoo-javascript
@ -4336,7 +4369,7 @@ msgstr "Kirjaudu ulos"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Kirjaudu"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4490,12 +4523,12 @@ msgstr "Tapaamisen aihe"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Muistiraja (tavua)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Muistiprofiili"
#. module: web
#. odoo-javascript
@ -4541,6 +4574,12 @@ msgstr "Linnunrata"
msgid "Minimal precision"
msgstr "Minimaalinen tarkkuus"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Vähimmäismerkkimäärä"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4569,7 +4608,7 @@ msgstr "Tietueen id puuttuu"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Pakollisia kenttiä puuttuu"
#. module: web
#. odoo-javascript
@ -4656,7 +4695,7 @@ msgstr "Kuukausi"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Kuukauden alusta tähän päivään"
#. module: web
#. odoo-javascript
@ -4780,7 +4819,7 @@ msgstr "Oma Odoo.com -tilini"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Omat asetukseni"
#. module: web
#. odoo-javascript
@ -4953,6 +4992,12 @@ msgstr "Ei tietoja"
msgid "No data to display"
msgstr "Ei näytettävää dataa"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "Ei vietäviä tietoja"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4968,8 +5013,8 @@ msgstr "Laitetta ei löydy."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Mikään hymiö ei vastaa hakuasi"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5020,7 +5065,7 @@ msgstr "Tuloksia ei löydetty"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Ei tuloksia"
#. module: web
#. odoo-javascript
@ -5076,6 +5121,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Rahakentän luominen ei ole mahdollista, koska nykyisessä mallissa ei ole "
"valuuttaa."
#. module: web
#. odoo-javascript
@ -5246,7 +5293,6 @@ msgstr "Voi rähmä!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5462,7 +5508,7 @@ msgstr "Sivu <span class=\"page\"/> / <span class=\"topage\"/>"
#. odoo-javascript
#: code:addons/web/static/src/core/pager/pager.xml:0
msgid "Pager"
msgstr "Sivutus"
msgstr "Sivut"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__paperformat_id
@ -5758,7 +5804,7 @@ msgstr "Ominaisuudet"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Ominaisuuksien perusmääritelmä"
#. module: web
#. odoo-javascript
@ -5889,7 +5935,7 @@ msgstr "Tietuesäännöt"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Tietueen muisti"
#. module: web
#. odoo-javascript
@ -6068,7 +6114,7 @@ msgstr "Palauta"
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Reset Zoom (0)"
msgstr "Nollaa zoom"
msgstr "Nollaa suurennus (0)"
#. module: web
#. odoo-javascript
@ -6525,7 +6571,7 @@ msgstr "Aseta käyttäjän aikavyöhyke"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Aseta kokonaislukukenttä käyttääksesi värejä tunnuksen kanssa."
#. module: web
#. odoo-javascript
@ -6673,7 +6719,9 @@ msgstr "Jotain kamalaa tapahtui"
msgid ""
"Something went wrong... If you really are stuck, share the report with your "
"friendly support service"
msgstr "Jokin meni pieleen. Lähetä raportti tukipalvelulle tiedoksi"
msgstr ""
"Jotain meni pieleen... Jos todella olet pulassa, jaa raportti ystävälliselle "
"tukipalvelulle"
#. module: web
#. odoo-javascript
@ -6690,10 +6738,11 @@ msgstr "Erityinen:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Pinottu"
@ -6795,7 +6844,7 @@ msgstr "Tyylivirhe"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Pääte"
#. module: web
#. odoo-javascript
@ -6867,7 +6916,7 @@ msgstr "TV"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Tagline"
msgstr "Sivuston kuvaus"
msgstr "Kuvaus"
#. module: web
#. odoo-javascript
@ -6923,7 +6972,7 @@ msgstr "Härkä"
#: model_terms:ir.ui.view,arch_db:web.external_layout_striped
#: model_terms:ir.ui.view,arch_db:web.external_layout_wave
msgid "Tax ID"
msgstr "ALV-numero"
msgstr "Verotunniste"
#. module: web
#. odoo-javascript
@ -7008,11 +7057,17 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "Hakualue ei saa sisältää muita kuin literaaleja"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Tiedosto ei ole kuva, kokoa ei voi muuttaa"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
msgstr "Tunnuksia %(field_name)s -kentässä ei saa monistaa: ”%(action_ids)s”"
#. module: web
#. odoo-python
@ -7021,6 +7076,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"%(field_name)s -kentän tunnusten on oltava kokonaislukuja tai \"false\": \"%"
"(action_ids)s\""
#. module: web
#. odoo-javascript
@ -7033,6 +7090,12 @@ msgstr ""
"Operaatio keskeytettiin. Tämä tarkoittaa yleensä sitä, että nykyinen "
"toiminto vie liikaa aikaa."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Kuvan koon muuttaminen epäonnistui"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7068,6 +7131,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"Käyttäjällä tulisi olla yksi upotettu toimintoasetus per käyttäjäasetus, "
"toiminto ja tietueen tunnus."
#. module: web
#. odoo-javascript
@ -7258,13 +7323,13 @@ msgstr "Kytke"
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar_menu/search_bar_menu.xml:0
msgid "Toggle Search Panel"
msgstr "Vaihda hakupaneelia"
msgstr "Näytä/piilota hakupaneeli"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Vaihda aikavälin tilaa"
#. module: web
#. odoo-javascript
@ -7363,8 +7428,8 @@ msgid ""
"Try to add some records, or make sure that there is no\n"
" active filter in the search bar."
msgstr ""
"Yritä lisätä joitakin tietueita tai varmista, että hakupalkissa\\n\n"
" ei ole asetettuna suodatinta."
"Yritä lisätä tietueita tai varmista, ettei hakupalkissa\n"
" ole aktiivista suodatinta."
#. module: web
#. odoo-javascript
@ -7643,6 +7708,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Käytä toimintoja \"+=\", \"-=\", \"*=\" ja \"/=\" päivittääksesi nykyisen "
"arvon."
#. module: web
#. odoo-javascript
@ -7688,12 +7755,12 @@ msgstr "Käyttöliittymä"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Käyttäjäasetukset"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Sisäänrakennettujen toimintojen käyttäjäasetukset"
#. module: web
#. odoo-javascript
@ -7852,6 +7919,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Varoitus"
@ -7990,7 +8058,7 @@ msgstr "Vuosi"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Vuoden alusta"
#. module: web
#. odoo-javascript
@ -8039,7 +8107,7 @@ msgstr "Voit asentaa sovelluksen selaimen valikosta"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Et voi lukea tätä kentän määritelmää."
#. module: web
#. odoo-javascript
@ -8122,19 +8190,19 @@ msgstr "ZZZ"
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Zoom In (+)"
msgstr "Lähennä"
msgstr "Suurenna (+)"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Zoom Out (-)"
msgstr "Loitonna"
msgstr "Loitonna (-)"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/image/image_field.js:0
msgid "Zoom delay"
msgstr "Zoomausviive"
msgstr "Suurennusviive"
#. module: web
#. odoo-javascript
@ -8260,7 +8328,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "jälkeen"
#. module: web
#. odoo-javascript
@ -9237,7 +9305,7 @@ msgstr "kuoriainen"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "ennen"
#. module: web
#. odoo-javascript
@ -11517,7 +11585,7 @@ msgstr "olento"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "credit"
msgstr "luotto"
msgstr "kredit"
#. module: web
#. odoo-javascript
@ -12860,7 +12928,7 @@ msgstr "meksikolainen voileipä"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "tyhjä"
#. module: web
#. odoo-javascript
@ -14690,7 +14758,7 @@ msgstr "heinäsirkka"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "suurempi tai yhtä suuri kuin"
#. module: web
#. odoo-javascript
@ -15500,13 +15568,13 @@ msgstr "hurraa"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "horizontal traffic light"
msgstr "vaakasuora liikennevalo"
msgstr "vaakasuuntainen liikennevalo"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "horizontal traffic lights"
msgstr "vaakasuorat liikennevalot"
msgstr "vaakasuuntaiset liikennevalot"
#. module: web
#. odoo-javascript
@ -17156,13 +17224,13 @@ msgstr "vähäinen"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "pienempi tai yhtä pieni kuin"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "pienempi kuin"
#. module: web
#. odoo-javascript
@ -24203,7 +24271,7 @@ msgstr "take away -astia"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "takeout"
msgstr "mukaanotettava"
msgstr "nouto"
#. module: web
#. odoo-javascript
@ -24551,13 +24619,13 @@ msgstr "huivi"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "tick"
msgstr "punkki"
msgstr "ruksi"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "tick box with tick"
msgstr "rasti ruutuun rastitettuna"
msgstr "ruksittu ruutu"
#. module: web
#. odoo-javascript
@ -24599,7 +24667,7 @@ msgstr "ajastinkello"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "tipping"
msgstr "juomarahan keruu"
msgstr "tipin antaminen"
#. module: web
#. odoo-javascript
@ -27001,6 +27069,12 @@ msgstr "\"tilaa\""
msgid "ココ"
msgstr "täällä"
#~ msgid "No emoji matches your search"
#~ msgstr "Mikään hymiö ei vastaa hakuasi"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Kulma"

View file

@ -10,13 +10,15 @@
# Martin Trigaux, 2023
# Jolien De Paepe, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Manon Rondou (ronm)" <ronm@odoo.com>, 2025, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-14 21:18+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-03-06 17:47+0000\n"
"Last-Translator: \"Manon Rondou (ronm)\" <ronm@odoo.com>\n"
"Language-Team: French <https://translate.odoo.com/projects/odoo-19/web/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
@ -24,7 +26,7 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : ((n != 0 && n % "
"1000000 == 0) ? 1 : 2);\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.16.1\n"
#. module: web
#. odoo-javascript
@ -61,7 +63,7 @@ msgstr "'%s' n'est pas une date ou une valeur datetime correcte"
#. odoo-javascript
#: code:addons/web/static/src/core/file_upload/file_upload_progress_record.js:0
msgid "(%(mbLoaded)s/%(mbTotal)sMB)"
msgstr "(%(mbLoaded)s/%(mbTotal)sMB)"
msgstr "(%(mbLoaded)s/%(mbTotal)sMo)"
#. module: web
#. odoo-javascript
@ -301,7 +303,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -482,6 +484,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Séparé (un "
"par onglet)</option>\n"
" <option value=\"temporal\">Temporel "
"(expérimental)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>Attention :</b> Le "
"mode temporel fusionnera tous les échantillons.<br/>Cela peut entraîner un "
"résultat partiellement invalide en cas de profils concurrents.<br/>À "
"utiliser avec prudence.</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -541,8 +555,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -898,7 +912,7 @@ msgstr "Ajouter une photo"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Ajouter une propriété"
#. module: web
#. odoo-javascript
@ -1168,12 +1182,14 @@ msgstr "Êtes-vous sûr de vouloir retirer cette action intégrée ?"
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
"Êtes-vous sûr de vouloir supprimer les %(nbSelected)s enregistrements "
"sélectionnés ?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Êtes-vous sûr de vouloir supprimer lenregistrement sélectionné ?"
#. module: web
#. odoo-javascript
@ -1191,7 +1207,7 @@ msgstr "Êtes-vous sûr de vouloir supprimer cette colonne ?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Êtes-vous sûr de vouloir supprimer ce champ de propriété ?"
#. module: web
#. odoo-javascript
@ -2090,7 +2106,7 @@ msgstr "Impossible de démarrer la numérisation. %(message)s"
#: code:addons/web/static/src/views/kanban/progress_bar_hook.js:0
#: code:addons/web/static/src/views/utils.js:0
msgid "Count"
msgstr "Comptage"
msgstr "Nombre"
#. module: web
#. odoo-javascript
@ -2181,7 +2197,7 @@ msgstr "Devise"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Champ devise"
#. module: web
#. odoo-javascript
@ -2236,7 +2252,7 @@ msgstr "Groupe personnalisé"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Plage personnalisée"
#. module: web
#. odoo-python
@ -2303,7 +2319,7 @@ msgstr "Date & Temps"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Format de date"
#. module: web
#. odoo-javascript
@ -2615,6 +2631,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Affiche ou masque les secondes dans la valeur date-heure. Naffecte que le "
"format date-heure lisible."
#. module: web
#. odoo-javascript
@ -2627,6 +2645,8 @@ msgstr "Affiche ou masque l'heure dans la valeur de la date."
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
"Affiche la date soit au format 31/01/%(year)s, soit au format 31 janv. %"
"(year)s"
#. module: web
#. odoo-javascript
@ -2851,7 +2871,7 @@ msgstr "E-mail"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Configuration des actions intégrées"
#. module: web
#. odoo-javascript
@ -3218,6 +3238,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Par exemple, si la valeur est \"1\" et que vous saisissez \"+=2\", elle sera "
"mise à jour à \"3\"."
#. module: web
#. odoo-javascript
@ -3395,6 +3417,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Attention ! Vos modifications récentes sont trop volumineuses pour être "
"enregistrées automatiquement. Cliquez sur le bouton %(upload_icon)s pour "
"garantir lenregistrement de votre travail avant de quitter cet onglet."
#. module: web
#. odoo-javascript
@ -3465,7 +3490,7 @@ msgstr "Menu de la page d'accueil"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Heure"
#. module: web
#. odoo-python
@ -3568,6 +3593,16 @@ msgstr ""
"défini, la modification de l'étiquette prévaudra. Par conséquent, le "
"sélecteur de couleur ne saffichera pas en cliquant sur l'étiquette."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Si cette option est cochée, les cases à cocher seront affichées en colonne. "
"Sinon, elles seront affichées en ligne."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3650,7 +3685,7 @@ msgstr "ID d'enregistrement inaccessible/manquant : %s"
#. odoo-javascript
#: code:addons/web/static/src/core/domain_selector/domain_selector.xml:0
msgid "Include archived"
msgstr "Inclure les archivés"
msgstr "Inclure les archives"
#. module: web
#. odoo-javascript
@ -3724,7 +3759,7 @@ msgstr "Intervalle"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Nom d'affichage invalide"
#. module: web
#. odoo-javascript
@ -3889,18 +3924,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Cet élément sera supprimé pour tous les utilisateurs du/ de \"%"
"(parentName)s\" %(parentFieldLabel)s."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Cet élément sera supprimé pour tout le monde !"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31 janv. %s"
#. module: web
#. odoo-javascript
@ -4149,19 +4186,19 @@ msgstr "Grande"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "12 derniers mois"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "30 derniers jours"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "7 derniers jours"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4179,7 +4216,7 @@ msgstr "Mis à jour le"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Le mois dernier"
#. module: web
#. odoo-javascript
@ -4322,7 +4359,7 @@ msgstr "Se déconnecter"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Se connecter"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4478,12 +4515,12 @@ msgstr "Sujet de la réunion"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Limite mémoire (en bytes)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Profil mémoire"
#. module: web
#. odoo-javascript
@ -4529,6 +4566,12 @@ msgstr "voie lactée"
msgid "Minimal precision"
msgstr "Précision minimale"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Nombre minimum de chiffres"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4557,7 +4600,7 @@ msgstr "ID d'enregistrement manquant"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Champs obligatoires manquants"
#. module: web
#. odoo-javascript
@ -4644,7 +4687,7 @@ msgstr "Mois"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Depuis le début du mois"
#. module: web
#. odoo-javascript
@ -4768,7 +4811,7 @@ msgstr "Mon compte Odoo.com"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Mes préférences"
#. module: web
#. odoo-javascript
@ -4941,6 +4984,12 @@ msgstr "Pas de données"
msgid "No data to display"
msgstr "Aucune donnée à afficher"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "Aucune donnée à exporter"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4956,7 +5005,7 @@ msgstr "Aucun appareil ne peut être trouvé."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr "Aucun emoji ne correspond à votre recherche"
#. module: web
@ -5008,7 +5057,7 @@ msgstr "Aucun résultat trouvé"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Aucun résultat"
#. module: web
#. odoo-javascript
@ -5064,6 +5113,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Impossible de créer un champ monétaire car aucune devise nest définie sur "
"le modèle actuel."
#. module: web
#. odoo-javascript
@ -5234,7 +5285,6 @@ msgstr "Oh mince !"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5752,7 +5802,7 @@ msgstr "Propriétés"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Définition de base des propriétés"
#. module: web
#. odoo-javascript
@ -5883,7 +5933,7 @@ msgstr "Règles sur les enregistrements"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Mémoire de lenregistrement"
#. module: web
#. odoo-javascript
@ -6519,7 +6569,7 @@ msgstr "Définir un fuseau horaire pour votre utilisateur"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Définissez un champ entier pour utiliser des couleurs avec le badge."
#. module: web
#. odoo-javascript
@ -6687,10 +6737,11 @@ msgstr "Spécial :"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Empilé"
@ -6792,7 +6843,7 @@ msgstr "Erreur de style"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Suffixe"
#. module: web
#. odoo-javascript
@ -7007,11 +7058,19 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "Le domaine ne peut pas contenir déléments non littéraux"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Le fichier nest pas une image, le redimensionnement est impossible"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
"Les ids dans %(field_name)s ne doivent pas être dupliqués : \"%"
"(action_ids)s\""
#. module: web
#. odoo-python
@ -7020,6 +7079,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"Les ids dans %(field_name)s doivent uniquement être des entiers ou "
"\"false\" : \"%(action_ids)s\""
#. module: web
#. odoo-javascript
@ -7032,6 +7093,12 @@ msgstr ""
"L'opération a été interrompue. Cela signifie souvent que l'opération en "
"cours prend trop de temps."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Le redimensionnement de l'image a échoué"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7067,6 +7134,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"Lutilisateur doit avoir un paramètre daction intégrée unique par paramètre "
"utilisateur, action et identifiant denregistrement."
#. module: web
#. odoo-javascript
@ -7266,7 +7335,7 @@ msgstr "Toggle panneau de recherche"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Basculer en mode plage de dates"
#. module: web
#. odoo-javascript
@ -7649,6 +7718,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Utilisez les opérateurs +=, -=, *= et /= pour mettre à jour la valeur "
"actuelle."
#. module: web
#. odoo-javascript
@ -7695,12 +7766,12 @@ msgstr "Interface utilisateur"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Paramètres utilisateur"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Paramètres utilisateur pour les actions intégrées"
#. module: web
#. odoo-javascript
@ -7787,7 +7858,7 @@ msgstr "Vidéo"
#: code:addons/web/static/src/views/list/list_renderer.xml:0
#: model:ir.model,name:web.model_ir_ui_view
msgid "View"
msgstr "Ouvrir"
msgstr "Voir"
#. module: web
#. odoo-javascript
@ -7860,6 +7931,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Avertissement"
@ -7999,7 +8071,7 @@ msgstr "Année"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Depuis le début de lannée"
#. module: web
#. odoo-javascript
@ -8048,7 +8120,7 @@ msgstr "Vous pouvez installer l'application depuis le menu du navigateur"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Vous ne pouvez pas lire cette définition de champ."
#. module: web
#. odoo-javascript
@ -8271,7 +8343,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "après"
#. module: web
#. odoo-javascript
@ -9248,7 +9320,7 @@ msgstr "scarabée"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "avant"
#. module: web
#. odoo-javascript
@ -12871,7 +12943,7 @@ msgstr "empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "vide"
#. module: web
#. odoo-javascript
@ -14035,7 +14107,7 @@ msgstr "interdit"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "forever"
msgstr "toujours"
msgstr "pour toujours"
#. module: web
#. odoo-javascript
@ -14701,7 +14773,7 @@ msgstr "sauterelle"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "supérieur ou égal à"
#. module: web
#. odoo-javascript
@ -17167,13 +17239,13 @@ msgstr "faible"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "inférieur ou égal à"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "inférieur à"
#. module: web
#. odoo-javascript
@ -18763,7 +18835,7 @@ msgstr "nerveux"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "net"
msgstr "filet"
msgstr "net"
#. module: web
#. odoo-javascript
@ -20972,7 +21044,7 @@ msgstr "professeur"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "prohibited"
msgstr "prohibé"
msgstr "interdit"
#. module: web
#. odoo-javascript
@ -27013,6 +27085,12 @@ msgstr "\"chambres disponibles\""
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Aucun emoji ne correspond à votre recherche"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Angle"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -17,13 +17,16 @@
# gezza <geza.nagy@oregional.hu>, 2023
# Szabolcs Rádi, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# Krisztián Juhász <juhasz.krisztian@uzletimegoldasok.hu>, 2025.
# Tommy Gombar <tommy.gombar@kilafornia.net>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-29 19:47+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-17 12:43+0000\n"
"Last-Translator: Tommy Gombar <tommy.gombar@kilafornia.net>\n"
"Language-Team: Hungarian <https://translate.odoo.com/projects/odoo-19/web/hu/"
">\n"
"Language: hu\n"
@ -31,7 +34,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -540,7 +543,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -1646,7 +1649,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/user_switch/user_switch.xml:0
msgid "Choose a user"
msgstr ""
msgstr "Felhasználó választás"
#. module: web
#. odoo-javascript
@ -1717,7 +1720,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record.xml:0
msgid "Click to select"
msgstr ""
msgstr "Kattintson a kiválasztáshoz"
#. module: web
#. odoo-javascript
@ -2148,7 +2151,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_custom_tab.js:0
msgid "Custom"
msgstr ""
msgstr "Egyéni"
#. module: web
#. odoo-javascript
@ -2257,7 +2260,7 @@ msgstr "Dátum és idő"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Dátum Formátum"
#. module: web
#. odoo-javascript
@ -2943,7 +2946,7 @@ msgstr "Külső azonosító"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_field.js:0
msgid "Extra Rights"
msgstr ""
msgstr "Extra jogok"
#. module: web
#. odoo-javascript
@ -3282,7 +3285,7 @@ msgstr "Zöld"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_popover.xml:0
msgid "Group"
msgstr ""
msgstr "Csoport"
#. module: web
#. odoo-javascript
@ -3300,7 +3303,7 @@ msgstr "Csoportosítás"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
msgid "HTML"
msgstr ""
msgstr "HTML"
#. module: web
#: model:ir.model,name:web.model_ir_http
@ -3337,7 +3340,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "Help"
msgstr ""
msgstr "Súgó"
#. module: web
#. odoo-javascript
@ -3400,7 +3403,7 @@ msgstr "Kezdő menü"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Óra"
#. module: web
#. odoo-python
@ -3494,6 +3497,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4058,13 +4069,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Elmúlt 30 nap"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Elmúlt 7 nap"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4082,7 +4093,7 @@ msgstr "Frissítve"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Múlt hónap"
#. module: web
#. odoo-javascript
@ -4225,7 +4236,7 @@ msgstr "Kijelentkezés"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Bejelentkezés"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4430,6 +4441,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4842,6 +4859,12 @@ msgstr "Nincs adat"
msgid "No data to display"
msgstr "Nincs megjeleníthető adat."
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4857,7 +4880,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4909,7 +4932,7 @@ msgstr "Nem talál eredményt"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Nincs eredmény"
#. module: web
#. odoo-javascript
@ -5131,7 +5154,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5216,7 +5238,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Open"
msgstr ""
msgstr "Megnyitás"
#. module: web
#. odoo-javascript
@ -5332,7 +5354,7 @@ msgstr "PDF fájl"
#: model_terms:ir.ui.view,arch_db:web.external_layout_striped
#: model_terms:ir.ui.view,arch_db:web.external_layout_wave
msgid "Page <span class=\"page\"/> / <span class=\"topage\"/>"
msgstr ""
msgstr "Oldal <span class=\"page\"/> / <span class=\"topage\"/>"
#. module: web
#. odoo-javascript
@ -6166,7 +6188,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Search more..."
msgstr ""
msgstr "További keresés..."
#. module: web
#. odoo-javascript
@ -6514,7 +6536,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_solid_tab.js:0
msgid "Solid"
msgstr ""
msgstr "Szolíd"
#. module: web
#. odoo-javascript
@ -6555,6 +6577,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr ""
@ -6656,7 +6679,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Utótag"
#. module: web
#. odoo-javascript
@ -6867,6 +6890,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6890,6 +6919,12 @@ msgid ""
"is taking too much time."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7373,7 +7408,7 @@ msgstr "Névtelen"
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_confirmation_dialog.xml:0
msgid "Update"
msgstr ""
msgstr "Frissítés"
#. module: web
#. odoo-javascript
@ -7516,7 +7551,7 @@ msgstr "Felhasználói felület"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Felhasználói beállítások"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7680,6 +7715,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Figyelmeztetés"
@ -22073,7 +22109,7 @@ msgstr ""
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
#: code:addons/web/static/src/search/search_bar/search_bar.xml:0
msgid "search"
msgstr ""
msgstr "keresés"
#. module: web
#. odoo-javascript

View file

@ -11,13 +11,15 @@
# Martin Trigaux, 2023
# Abe Manyo, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Abe Manyo (abem)" <abem@odoo.com>, 2025, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 02:32+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-01-06 06:53+0000\n"
"Last-Translator: \"Abe Manyo (abem)\" <abem@odoo.com>\n"
"Language-Team: Indonesian <https://translate.odoo.com/projects/odoo-19/web/"
"id/>\n"
"Language: id\n"
@ -25,7 +27,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -302,7 +304,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -542,8 +544,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Penikmat Dekorasi</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -898,7 +900,7 @@ msgstr "Tambah Foto"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Tambahkan Properti"
#. module: web
#. odoo-javascript
@ -1165,12 +1167,13 @@ msgstr "Apakah Anda yakin bahwa Anda ingin menghapus action yang diembed ini?"
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
"Apakah Anda yakin ingin menghapus rekaman-rekaman terpilih %(nbSelected)s?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Apakah Anda yakin ingin menghapus rekaman terpilih?"
#. module: web
#. odoo-javascript
@ -1188,7 +1191,7 @@ msgstr "Apakah Anda yakin ingin menghapus kolom ini?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Apakah Anda yakin ingin menghapus field properti ini?"
#. module: web
#. odoo-javascript
@ -2177,7 +2180,7 @@ msgstr "Mata Uang"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Field mata uang"
#. module: web
#. odoo-javascript
@ -2232,7 +2235,7 @@ msgstr "Kelompok Kustom"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Rentang kustom"
#. module: web
#. odoo-python
@ -2298,7 +2301,7 @@ msgstr "Tanggal & Waktu"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Format Tanggal"
#. module: web
#. odoo-javascript
@ -2607,6 +2610,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Menampilkan atau menyembunyikkan detik-detik di value tanggalwaktu. "
"Berdampak hanya pada format tanggalwaktu yang dapat dibaca."
#. module: web
#. odoo-javascript
@ -2619,6 +2624,7 @@ msgstr "Tampilkan atau sembunyikan waktu di value datetime."
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
"Menampilkan tanggal baik dalam 31/01/%(year)s atau dalam Jan 31, %(year)s"
#. module: web
#. odoo-javascript
@ -2842,7 +2848,7 @@ msgstr "Email"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Konfigurasi Tindakan yang Diembed"
#. module: web
#. odoo-javascript
@ -3209,6 +3215,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Sebagai contoh, bila value adalah \"1\" dan Anda memasukkan \"+=2\", akan "
"diupdate menjadi \"3\"."
#. module: web
#. odoo-javascript
@ -3386,6 +3394,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Siap-siap! Perubahan terkini Anda terlalu besar untuk disimpan otomatis. "
"Silakan klik tombol %(upload_icon)s sekarang untuk memastikan pekerjaan Anda "
"disimpan sebelum Anda keluar dari tab ini."
#. module: web
#. odoo-javascript
@ -3456,7 +3467,7 @@ msgstr "Menu Home"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Jam"
#. module: web
#. odoo-python
@ -3557,6 +3568,16 @@ msgstr ""
"berlaku. Dengan kata lain, pemilih warna tidak akan ditampilkan bila tag "
"diklik."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Bila dicentang, kotak centang akan ditampilkan dalam kolom. Bila tidak, akan "
"inline."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3709,7 +3730,7 @@ msgstr "Interval"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Nama Tampilan Tidak Valid"
#. module: web
#. odoo-javascript
@ -3873,18 +3894,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Akan dihapus untuk semua orang yang menggunakan \"%(parentName)s\" %"
"(parentFieldLabel)s."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Akan dihapus untuk semua orang!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "Jan 31, %s"
#. module: web
#. odoo-javascript
@ -4133,19 +4156,19 @@ msgstr "Besar"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "12 bulan terakhir"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "30 hari terakhir"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "7 hari terakhir"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4163,7 +4186,7 @@ msgstr "Terakhir Diperbarui pada"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Bulan terakhir"
#. module: web
#. odoo-javascript
@ -4306,7 +4329,7 @@ msgstr "Log keluar"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Log masuk"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4513,6 +4536,12 @@ msgstr "Milky Way"
msgid "Minimal precision"
msgstr "Ketepatan minimum"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4541,7 +4570,7 @@ msgstr "Missing record id"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Field-field yang diperlukan kurang"
#. module: web
#. odoo-javascript
@ -4628,7 +4657,7 @@ msgstr "Bulan"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Month to date"
#. module: web
#. odoo-javascript
@ -4752,7 +4781,7 @@ msgstr "Akun Odoo.com Saya"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Preferensi Saya"
#. module: web
#. odoo-javascript
@ -4925,6 +4954,12 @@ msgstr "Data tidak ada"
msgid "No data to display"
msgstr "Tidak data yang bisa ditampilkan"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4940,8 +4975,8 @@ msgstr "Tidak ada perangkat yang ditemukan"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Tidak ada emoji yang cocok dengan pencarian Anda"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4992,7 +5027,7 @@ msgstr "Tidak ada hasil yang ditemukan"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Tidak ada hasil"
#. module: web
#. odoo-javascript
@ -5049,6 +5084,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Tidak mungkin untuk membuat field moneter karena tidak ada mata uang di "
"model saat ini."
#. module: web
#. odoo-javascript
@ -5219,7 +5256,6 @@ msgstr "Oh snap!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5729,7 +5765,7 @@ msgstr "Properti"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Definisi Dasar Properti"
#. module: web
#. odoo-javascript
@ -5860,7 +5896,7 @@ msgstr "Peraturan Record"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Rekam memori"
#. module: web
#. odoo-javascript
@ -6496,7 +6532,7 @@ msgstr "Pilih zona waktu untuk pengguna anda"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Tetapkan field integer untuk menggunakan warna-warna dengan lencana."
#. module: web
#. odoo-javascript
@ -6663,10 +6699,11 @@ msgstr "Spesial:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Tertumpuk"
@ -6768,7 +6805,7 @@ msgstr "Error style"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufiks"
#. module: web
#. odoo-javascript
@ -6981,11 +7018,17 @@ msgstr "Domain melibatkan non-literal. Evaluasi mereka mungkin gagal."
msgid "The domain should not involve non-literals"
msgstr "Domain tidak seharusnya melibatkan non-literal"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "File bukan gambar, mengubah ukuran tidak dapat dilakukan"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
msgstr "Id di %(field_name)s tidak boleh diduplikasi: “%(action_ids)s”"
#. module: web
#. odoo-python
@ -6994,6 +7037,7 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"Id di %(field_name)s hanya boleh integer atau \"false\": “%(action_ids)s”"
#. module: web
#. odoo-javascript
@ -7004,6 +7048,12 @@ msgid ""
"is taking too much time."
msgstr "Operasi terganggu. Biasanya terjadi karena terlalu lama memakan waktu."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Mengubah ukuran gambar gagal"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7038,6 +7088,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"User harus memiliki satu action pengaturan diembed unik per pengaturan user, "
"action dan id rekaman."
#. module: web
#. odoo-javascript
@ -7235,7 +7287,7 @@ msgstr "Toggle Panel Pencarian"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Toggle mode rentang tanggal"
#. module: web
#. odoo-javascript
@ -7613,6 +7665,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Gunakan operator \"+=\", \"-=\", \"*=\" dan \"/=\" untuk mengupdate value "
"saat ini."
#. module: web
#. odoo-javascript
@ -7660,12 +7714,12 @@ msgstr "Antamuka Pengguna"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Pengaturan User"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Pengaturan User untuk Action yang Diembed"
#. module: web
#. odoo-javascript
@ -7824,6 +7878,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Peringatan"
@ -7958,7 +8013,7 @@ msgstr "Tahun"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Year to date"
#. module: web
#. odoo-javascript
@ -8007,7 +8062,7 @@ msgstr "Anda dapat menginstal app dari menu browser"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Anda tidak dapat membaca definisi field tersebut."
#. module: web
#. odoo-javascript
@ -8225,7 +8280,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "setelah"
#. module: web
#. odoo-javascript
@ -9202,7 +9257,7 @@ msgstr "beetle"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "sebelum"
#. module: web
#. odoo-javascript
@ -12675,7 +12730,7 @@ msgstr "earth"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "east"
msgstr "east"
msgstr "timur"
#. module: web
#. odoo-javascript
@ -12825,7 +12880,7 @@ msgstr "empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "kosong"
#. module: web
#. odoo-javascript
@ -14655,7 +14710,7 @@ msgstr "grasshopper"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "lebih besar dari atau sama dengan"
#. module: web
#. odoo-javascript
@ -17121,13 +17176,13 @@ msgstr "low"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "lebih kecil dari atau sama dengan"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "lebih kecil dari"
#. module: web
#. odoo-javascript
@ -18916,19 +18971,19 @@ msgstr "noodle"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "north"
msgstr "north"
msgstr "utara"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "northeast"
msgstr "northeast"
msgstr "timur laut"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "northwest"
msgstr "northwest"
msgstr "barat laut"
#. module: web
#. odoo-javascript
@ -23214,19 +23269,19 @@ msgstr "sorry"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "south"
msgstr "south"
msgstr "selatan"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "southeast"
msgstr "southeast"
msgstr "tenggara"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "southwest"
msgstr "southwest"
msgstr "barat daya"
#. module: web
#. odoo-javascript
@ -25764,7 +25819,7 @@ msgstr "welding"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "west"
msgstr "west"
msgstr "barat"
#. module: web
#. odoo-javascript
@ -26966,6 +27021,12 @@ msgstr "“vacancy”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Tidak ada emoji yang cocok dengan pencarian Anda"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Penikmat Dekorasi</span>"
#~ msgid "Angle"
#~ msgstr "Sudut"

View file

@ -10,22 +10,26 @@
# Marianna Ciofani, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# "Marianna Ciofani (cima)" <cima@odoo.com>, 2025, 2026.
# "Malaz Siddig Elsayed Abuidris (msea)" <msea@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# Andrea Zucca <a.zucca@gruppohermes.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-17 17:26+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"Language-Team: Italian <https://translate.odoo.com/projects/odoo-19/web/it/"
">\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-03-06 17:47+0000\n"
"Last-Translator: \"Marianna Ciofani (cima)\" <cima@odoo.com>\n"
"Language-Team: Italian <https://translate.odoo.com/projects/odoo-19/web/it/>"
"\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n == 1) ? 0 : ((n != 0 && n % 1000000 == "
"0) ? 1 : 2);\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.16.1\n"
#. module: web
#. odoo-javascript
@ -302,7 +306,7 @@ msgstr "3,30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -484,6 +488,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Separati (uno "
"per scheda)</option>\n"
" <option value=\"temporal\">Temporale "
"(sperimentale)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>Attenzione:</b> la "
"modalità temporale unirà tutti i campioni.<br/>Può comportare risultati "
"parziali non validi in caso di profili concorrenti.<br/>Usala con cauzione </"
"span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -543,8 +559,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -894,13 +910,13 @@ msgstr "Aggiungi %s"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/contact_image/contact_image_field.xml:0
msgid "Add Photo"
msgstr "Agguiungi foto"
msgstr "Aggiungi foto"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Aggiungi proprietà"
#. module: web
#. odoo-javascript
@ -1167,13 +1183,13 @@ msgstr "Rimuovere veramente l'azione incorporata?"
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
msgstr "Sei sicuro di voler eliminare i %(nbSelected)s record selezionati?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Sei sicuro di voler eliminare il record selezionato?"
#. module: web
#. odoo-javascript
@ -1191,7 +1207,7 @@ msgstr "Eliminare veramente questa colonna?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Sei sicuro di voler eliminare questo campo proprietà?"
#. module: web
#. odoo-javascript
@ -2181,7 +2197,7 @@ msgstr "Valuta"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Campo valuta"
#. module: web
#. odoo-javascript
@ -2236,7 +2252,7 @@ msgstr "Personalizza gruppo"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Periodo personalizzato"
#. module: web
#. odoo-python
@ -2302,7 +2318,7 @@ msgstr "Data e ora"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Formato data"
#. module: web
#. odoo-javascript
@ -2613,6 +2629,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Mostra o nasconde i secondi nel valore data/ora. Riguarda solo il formato "
"data/ora leggibile."
#. module: web
#. odoo-javascript
@ -2624,7 +2642,7 @@ msgstr "Mostra o nasconde l'orario nel valore data/ora."
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
msgstr "Mostra la data nel formato 31/01/%(year)s oppure 31 gennaio, %(year)s"
#. module: web
#. odoo-javascript
@ -2848,7 +2866,7 @@ msgstr "E-mail"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Configurazione azioni integrate"
#. module: web
#. odoo-javascript
@ -3216,6 +3234,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Ad esempio, se il valore è \"1\" e inserisci \"+=2\", verrà aggiornato a "
"\"3\"."
#. module: web
#. odoo-javascript
@ -3393,6 +3413,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Occhi aperti! Le tue recenti modifiche sono troppo grandi per essere salvate "
"automaticamente. Fai clic sul pulsante %(upload_icon)s per assicurarti che "
"il tuo lavoro venga salvato prima di abbandonare questa scheda."
#. module: web
#. odoo-javascript
@ -3463,7 +3486,7 @@ msgstr "Menu principale"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Ora"
#. module: web
#. odoo-python
@ -3486,7 +3509,6 @@ msgstr "Come ottenere l'applicazione"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
#, fuzzy
msgid "Hue"
msgstr "Tonalità"
@ -3567,6 +3589,16 @@ msgstr ""
"prevarrà l'edizione del tag. Pertanto, il selezionatore di colori non verrà "
"visualizzato quando si fa clic sul tag."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Se contrassegnato, le caselle di controllo verranno visualizzate in una "
"colonna. Altrimenti, saranno allineate."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3722,7 +3754,7 @@ msgstr "Intervallo"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Nome visualizzato non valido"
#. module: web
#. odoo-javascript
@ -3888,18 +3920,19 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Verrà eliminata per tutti usando \"%(parentName)s\" %(parentFieldLabel)s."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Verrà eliminata per tutti!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31 gennaio, %s"
#. module: web
#. odoo-javascript
@ -4148,19 +4181,19 @@ msgstr "Grande"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Ultimi 12 mesi"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Ultimi 30 giorni"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Ultimi 7 giorni"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4178,7 +4211,7 @@ msgstr "Ultimo aggiornamento il"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Ultimo mese"
#. module: web
#. odoo-javascript
@ -4321,7 +4354,7 @@ msgstr "Esci"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Login"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4475,12 +4508,12 @@ msgstr "Oggetto appuntamento"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Limite memoria (in byte)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Profilo memoria"
#. module: web
#. odoo-javascript
@ -4526,6 +4559,12 @@ msgstr "Via lattea"
msgid "Minimal precision"
msgstr "Precisione minima"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Caratteri minimi"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4554,7 +4593,7 @@ msgstr "ID record mancante"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Campi obbligatori mancanti"
#. module: web
#. odoo-javascript
@ -4641,7 +4680,7 @@ msgstr "Mese"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Mese nella data"
#. module: web
#. odoo-javascript
@ -4765,7 +4804,7 @@ msgstr "Il mio account Odoo.com"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Le mie preferenze"
#. module: web
#. odoo-javascript
@ -4938,6 +4977,12 @@ msgstr "Nessun dato"
msgid "No data to display"
msgstr "Nessun dato da visualizzare"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "Nessun dato da esportare"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4953,8 +4998,8 @@ msgstr "Nessun dispositivo trovato."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Nessuna emoji corrisponde alla ricerca"
msgid "No emojis match your search"
msgstr "Nessuna emoji corrisponde alla tua ricerca"
#. module: web
#. odoo-javascript
@ -5005,7 +5050,7 @@ msgstr "Nessun risultato trovato"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Nessun risultato"
#. module: web
#. odoo-javascript
@ -5061,6 +5106,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Non è possibile creare campi monetari perché non è stata configurata nessuna "
"valuta per il modello corrente."
#. module: web
#. odoo-javascript
@ -5231,7 +5278,6 @@ msgstr "Oh, no!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5743,7 +5789,7 @@ msgstr "Proprietà"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Definizione base proprietà"
#. module: web
#. odoo-javascript
@ -5875,7 +5921,7 @@ msgstr "Regole su record"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Memoria record"
#. module: web
#. odoo-javascript
@ -6511,7 +6557,7 @@ msgstr "Impostare un fuso orario per l'utente"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Configura un campo completo per usare colori con il badge."
#. module: web
#. odoo-javascript
@ -6678,10 +6724,11 @@ msgstr "Speciale:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "In pila"
@ -6783,7 +6830,7 @@ msgstr "Errore di stile"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Suffisso"
#. module: web
#. odoo-javascript
@ -6998,11 +7045,18 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "Il dominio non deve includere caratteri non alfabetici"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Il file non è un'immagine, il ridimensionamento non è possibile"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
"Gli id in %(field_name)s non devono essere duplicati: \"%(action_ids)s\""
#. module: web
#. odoo-python
@ -7011,6 +7065,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"Gli id in %(field_name)s devono essere interi oppure \"false\": \"%"
"(action_ids)s\""
#. module: web
#. odoo-javascript
@ -7023,6 +7079,12 @@ msgstr ""
"L'operazione è stata interrotta. Solitamente ciò significa che l'operazione "
"corrente sta impiegando troppo tempo."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Il ridimensionamento dell'immagine non è riuscito"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7058,6 +7120,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"L'utente dovrebbe avere un'unica impostazione di azione incorporata per ogni "
"impostazione utente, azione e ID record."
#. module: web
#. odoo-javascript
@ -7254,7 +7318,7 @@ msgstr "Attiva pannello di ricerca"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Attiva modalità intervallo data"
#. module: web
#. odoo-javascript
@ -7633,6 +7697,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Usa gli operatori \"+=\", \"-=\", \"*=\" e \"/=\" per aggiornare il valore "
"corrente."
#. module: web
#. odoo-javascript
@ -7680,12 +7746,12 @@ msgstr "Interfaccia utente"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Impostazioni utente"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Impostazioni utente per azioni integrate"
#. module: web
#. odoo-javascript
@ -7844,6 +7910,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Attenzione"
@ -7980,7 +8047,7 @@ msgstr "Anno"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Anno fino alla data"
#. module: web
#. odoo-javascript
@ -8029,7 +8096,7 @@ msgstr "Puoi installare l'app dal menu del browser"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Non puoi leggere la definizione di questo campo."
#. module: web
#. odoo-javascript
@ -8253,7 +8320,7 @@ msgstr "Esculapio"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "dopo"
#. module: web
#. odoo-javascript
@ -9230,7 +9297,7 @@ msgstr "scarabeo"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "prima"
#. module: web
#. odoo-javascript
@ -12853,7 +12920,7 @@ msgstr "empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "vuoto"
#. module: web
#. odoo-javascript
@ -14683,7 +14750,7 @@ msgstr "grillo"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "maggiore o uguale a"
#. module: web
#. odoo-javascript
@ -17149,13 +17216,13 @@ msgstr "basso"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "minore o uguale a"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "minore di"
#. module: web
#. odoo-javascript
@ -26995,6 +27062,12 @@ msgstr "“posto”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Nessuna emoji corrisponde alla ricerca"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Angolo"

View file

@ -9,25 +9,25 @@
# Noma Yuki, 2022
# Yoshi Tashiro (Quartile) <tashiro@roomsfor.hk>, 2022
# Andy Yiu, 2023
# Ryoko Tsuda <ryoko@quartile.co>, 2023
# Ryoko Tsuda <ryoko@quartile.co>, 2023, 2025.
# Martin Trigaux, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Junko Augias (juau)" <juau@odoo.com>, 2025.
# "Junko Augias (juau)" <juau@odoo.com>, 2025, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-10-04 02:31+0000\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-11 17:40+0000\n"
"Last-Translator: \"Junko Augias (juau)\" <juau@odoo.com>\n"
"Language-Team: Japanese <https://translate.odoo.com/projects/odoo-19/web/ja/>"
"\n"
"Language-Team: Japanese <https://translate.odoo.com/projects/odoo-19/web/ja/"
">\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -303,7 +303,6 @@ msgstr "3.30"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
#, fuzzy
msgid "31/01/%s"
msgstr "31/01/%s"
@ -558,8 +557,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -1510,7 +1509,7 @@ msgstr ""
#: code:addons/web/static/src/views/calendar/calendar_controller.js:0
#: code:addons/web/static/src/views/view_hook.js:0
msgid "Bye-bye, record!"
msgstr "さよなら、レコード!"
msgstr "このレコードを削除します"
#. module: web
#. odoo-javascript
@ -1910,7 +1909,7 @@ msgstr "条件:"
#. module: web
#: model:ir.model,name:web.model_res_config_settings
msgid "Config Settings"
msgstr "詳細設定"
msgstr "構成設定"
#. module: web
#: model:ir.actions.act_window,name:web.action_base_document_layout_configurator
@ -2463,7 +2462,7 @@ msgstr "プロパティフィールドを削除する"
#. odoo-javascript
#: code:addons/web/static/src/search/control_panel/control_panel.xml:0
msgid "Delete item"
msgstr "項目を削除する"
msgstr "項目を削除"
#. module: web
#. odoo-javascript
@ -2951,7 +2950,7 @@ msgstr "展開"
#. odoo-javascript
#: code:addons/web/static/src/views/pivot/pivot_controller.xml:0
msgid "Expand all"
msgstr "展開"
msgstr "すべて展開"
#. module: web
#. odoo-javascript
@ -3568,6 +3567,16 @@ msgstr ""
"ます。色フィールドも設定されている場合、タグの編集が優先されることにご注意下"
"さい。そのため、タグをクリックしても、カラーピッカーは表示されません。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"チェックを入れると、チェックボックスは縦に並びます。オフの場合は横に並びま"
"す。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3722,7 +3731,7 @@ msgstr "間隔"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "無効な表示名"
#. module: web
#. odoo-javascript
@ -4118,7 +4127,7 @@ msgstr "ラベルフィールド"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/field_tooltip.xml:0
msgid "Label:"
msgstr "得る:"
msgstr "ラベル:"
#. module: web
#. odoo-javascript
@ -4150,13 +4159,13 @@ msgstr "直近12か月"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr "過去30日間"
msgstr "直近30日"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr "過去7日間"
msgstr "直近7日"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4408,7 +4417,7 @@ msgstr "Many2many"
#: code:addons/web/static/src/views/fields/many2one/many2one_field.js:0
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
msgid "Many2one"
msgstr "Many2one"
msgstr "多対1"
#. module: web
#. odoo-javascript
@ -4524,6 +4533,12 @@ msgstr "天の川"
msgid "Minimal precision"
msgstr "最小精度"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4540,7 +4555,7 @@ msgstr "不明なアクション"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
msgid "Missing Record"
msgstr "ミッシングレコード"
msgstr "レコードが見つかりません"
#. module: web
#. odoo-python
@ -4552,7 +4567,7 @@ msgstr "レコードIDが不明です"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "必須項目が未入力です"
#. module: web
#. odoo-javascript
@ -4578,7 +4593,7 @@ msgstr "モデル"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Model Record Rules"
msgstr "モデルレコード規則"
msgstr "モデルレコードルール"
#. module: web
#. odoo-javascript
@ -4654,7 +4669,7 @@ msgstr "月"
#: code:addons/web/static/src/views/form/button_box/button_box.xml:0
#: code:addons/web/static/src/views/form/status_bar_buttons/status_bar_buttons.xml:0
msgid "More"
msgstr "さらに表示"
msgstr "その他"
#. module: web
#. odoo-javascript
@ -4936,6 +4951,12 @@ msgstr "データなし"
msgid "No data to display"
msgstr "表示するデータがありません"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4951,8 +4972,8 @@ msgstr "デバイスが見つかりません"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "検索にマッチする絵文字がありません"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5230,7 +5251,6 @@ msgstr "ご確認ください!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5868,7 +5888,7 @@ msgstr "レコード"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Record Rules"
msgstr "レコード規則"
msgstr "レコードルール"
#. module: web
#. odoo-javascript
@ -6636,13 +6656,13 @@ msgstr "スマイリー & 感情"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_solid_tab.js:0
msgid "Solid"
msgstr "ソリッド"
msgstr "実線"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/dynamic_list.js:0
msgid "Some records could not be duplicated"
msgstr "重複できないレコードがあります"
msgstr "一部のレコードは複製できませんでした"
#. module: web
#. odoo-python
@ -6679,6 +6699,7 @@ msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "積み上げグラフ"
@ -6737,7 +6758,7 @@ msgstr "自由の女神"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/statusbar/statusbar_field.js:0
msgid "Status"
msgstr "状態"
msgstr "ステータス"
#. module: web
#. odoo-javascript
@ -6994,6 +7015,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "ドメインに非リテラルを含めてはいけません"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "ファイルが画像でないため、サイズ変更できません"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -7019,6 +7046,12 @@ msgid ""
"is taking too much time."
msgstr "処理が中断されました。処理に時間がかかりすぎている可能性があります。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "画像のサイズ変更に失敗しました"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7341,7 +7374,7 @@ msgid ""
"Try to add some records, or make sure that there is no\n"
" active filter in the search bar."
msgstr ""
"レコードを追加するか、検索バーにアクティブなフィルタが\n"
"レコードを追加するか、検索バーに有効なフィルタが\n"
" ないことを確認してください。"
#. module: web
@ -7675,12 +7708,12 @@ msgstr "ユーザインタフェース"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr "ユーザ管理設定"
msgstr "ユーザ設定"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr "埋め込みアクションのユーザ管理設定"
msgstr "埋め込みアクションのユーザ設定"
#. module: web
#. odoo-javascript
@ -7839,6 +7872,7 @@ msgstr "トイレ"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "警告"
@ -9978,7 +10012,7 @@ msgstr "茶色い四角"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "bubble"
msgstr ""
msgstr "バブル"
#. module: web
#. odoo-javascript
@ -10494,7 +10528,7 @@ msgstr "チャーム"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "chart"
msgstr "チャート"
msgstr "グラフ"
#. module: web
#. odoo-javascript
@ -11886,7 +11920,7 @@ msgstr "だんご"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "dark"
msgstr "暗い"
msgstr "ダーク"
#. module: web
#. odoo-javascript
@ -16055,7 +16089,7 @@ msgstr "次のいずれかに一致:"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "is not equal to"
msgstr "が次と一致しない"
msgstr "等しくない"
#. module: web
#. odoo-javascript
@ -19009,7 +19043,7 @@ msgstr "装飾カバーがついたノート"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "notes"
msgstr "音符"
msgstr "メモ"
#. module: web
#. odoo-javascript
@ -19075,7 +19109,7 @@ msgstr "おでん"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "of the following rules:"
msgstr "以下の規則の:"
msgstr "以下のルールの:"
#. module: web
#. odoo-javascript
@ -20549,7 +20583,7 @@ msgstr "プラグ"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "plumber"
msgstr "工"
msgstr "配管工"
#. module: web
#. odoo-javascript
@ -26960,7 +26994,7 @@ msgstr "“禁”"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "“reserved”"
msgstr "“”"
msgstr "“予約済”"
#. module: web
#. odoo-javascript
@ -26986,6 +27020,12 @@ msgstr "“空”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "検索にマッチする絵文字がありません"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "角度"

File diff suppressed because it is too large Load diff

View file

@ -10,13 +10,14 @@
# Sarah Park, 2023
# Martin Trigaux, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Kwanghee Park (kwpa)" <kwpa@odoo.com>, 2025.
# "Kwanghee Park (kwpa)" <kwpa@odoo.com>, 2025, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-10-06 08:23+0000\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-11 17:40+0000\n"
"Last-Translator: \"Kwanghee Park (kwpa)\" <kwpa@odoo.com>\n"
"Language-Team: Korean <https://translate.odoo.com/projects/odoo-19/web/ko/>\n"
"Language: ko\n"
@ -24,7 +25,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -541,8 +542,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -896,7 +897,7 @@ msgstr "사진 추가"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "영역 추가"
#. module: web
#. odoo-javascript
@ -2165,7 +2166,7 @@ msgstr "통화"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "통화 필드"
#. module: web
#. odoo-javascript
@ -2220,7 +2221,7 @@ msgstr "사용자 지정 그룹"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "사용자 지정 범위"
#. module: web
#. odoo-python
@ -2286,7 +2287,7 @@ msgstr "날짜 및 시간"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "날짜 형식"
#. module: web
#. odoo-javascript
@ -2830,7 +2831,7 @@ msgstr "이메일"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "내장된 작업 환경설정"
#. module: web
#. odoo-javascript
@ -3537,6 +3538,14 @@ msgstr ""
"상 필드와 태그 편집이 모두 설정되어 있는 경우 태그 편집이 우선하므로 태그 클"
"릭 시 색상 선택기가 표시되지 않습니다."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3689,7 +3698,7 @@ msgstr "간격"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "잘못된 표시명"
#. module: web
#. odoo-javascript
@ -3861,7 +3870,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "1월 31일, %s"
#. module: web
#. odoo-javascript
@ -4110,19 +4119,19 @@ msgstr "크게"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "최근 12개월"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "최근 30일"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "최근 7일"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4140,7 +4149,7 @@ msgstr "최근 갱신 일자"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "지난 달"
#. module: web
#. odoo-javascript
@ -4437,12 +4446,12 @@ msgstr "회의 주제"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "메모리 제한 (바이트 단위)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "메모리 프로파일"
#. module: web
#. odoo-javascript
@ -4488,6 +4497,12 @@ msgstr "은하수"
msgid "Minimal precision"
msgstr "최소 정밀도"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "최소 자릿수"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4516,7 +4531,7 @@ msgstr "누락된 레코드 ID"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "필수 입력 누락"
#. module: web
#. odoo-javascript
@ -4603,7 +4618,7 @@ msgstr "월"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "월별 누계"
#. module: web
#. odoo-javascript
@ -4727,7 +4742,7 @@ msgstr "내 Odoo.com 계정"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "내 추가 설정"
#. module: web
#. odoo-javascript
@ -4900,6 +4915,12 @@ msgstr "데이터 없음"
msgid "No data to display"
msgstr "표시할 데이터가 없습니다"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "내보낼 데이터가 없습니다"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4915,8 +4936,8 @@ msgstr "장치를 찾을 수 없습니다."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "검색어에 해당하는 이모티콘이 없습니다."
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4967,7 +4988,7 @@ msgstr "결과가 없습니다."
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "결과가 없습니다"
#. module: web
#. odoo-javascript
@ -5192,7 +5213,6 @@ msgstr "잠시만요!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5702,7 +5722,7 @@ msgstr "속성"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "속성 기본 정의"
#. module: web
#. odoo-javascript
@ -5833,7 +5853,7 @@ msgstr "레코드 규칙"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "레코드 메모리"
#. module: web
#. odoo-javascript
@ -6639,6 +6659,7 @@ msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "누적 영역 차트"
@ -6952,6 +6973,12 @@ msgstr "도메인에 비문자열이 포함되어 있습니다. 평가가 실패
msgid "The domain should not involve non-literals"
msgstr "도메인에는 문자 외에는 포함될 수 없습니다."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "해당 파일은 이미지 파일이 아니므로 크기 조정이 불가능합니다"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6977,6 +7004,12 @@ msgstr ""
"작업이 중단되었습니다. 이것은 일반적으로 현재 작업에 너무 많은 시간이 걸린다"
"는 것을 의미합니다."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "이미지 크기 조정이 실패했습니다"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7203,7 +7236,7 @@ msgstr "검색 패널 토글"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "날짜 범위 모드 토글"
#. module: web
#. odoo-javascript
@ -7627,12 +7660,12 @@ msgstr "사용자 인터페이스"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "사용자 설정"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "임베디드 액션 사용자 설정"
#. module: web
#. odoo-javascript
@ -7791,6 +7824,7 @@ msgstr "화장실"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "주의"
@ -7924,7 +7958,7 @@ msgstr "년"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "연도별 누계"
#. module: web
#. odoo-javascript
@ -10271,7 +10305,7 @@ msgstr "케어"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "carousel"
msgstr "회전 목마"
msgstr "슬라이드 형식"
#. module: web
#. odoo-javascript
@ -14620,7 +14654,7 @@ msgstr "귀뚜라미"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "다음보다 크거나 같음:"
#. module: web
#. odoo-javascript
@ -17086,13 +17120,13 @@ msgstr "낮음"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "다음보다 작거나 같음:"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "다음보다 낮음"
#. module: web
#. odoo-javascript
@ -26931,6 +26965,12 @@ msgstr "“공석”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "검색어에 해당하는 이모티콘이 없습니다."
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "각"

View file

@ -1,20 +1,23 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web
# * web
#
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2024-10-25 07:49+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: \n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 22:03+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Kurdish (Central) <https://translate.odoo.com/projects/"
"odoo-19/web/ckb/>\n"
"Language: ku\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
#. module: web
#. odoo-javascript
@ -27,7 +30,7 @@ msgstr ""
#. odoo-python
#: code:addons/web/controllers/export.py:0
msgid "%(property_string)s (%(parent_name)s)"
msgstr ""
msgstr "(%(parent_name)s)%(property_string)s"
#. module: web
#. odoo-javascript
@ -480,6 +483,8 @@ msgid ""
"<span class=\"text-nowrap\">$ <span class=\"oe_currency_value\">11,750.00</"
"span></span>"
msgstr ""
"<span class=\"text-nowrap\">$<span class=\"oe_currency_value\">11,750.00</"
"span></span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -487,16 +492,18 @@ msgid ""
"<span class=\"text-nowrap\">$ <span class=\"oe_currency_value\">7,500.00</"
"span></span>"
msgstr ""
"<span class=\"text-nowrap\">$<span class=\"oe_currency_value\">7,500.00</"
"span></span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span class=\"text-nowrap\">1,500.00</span>"
msgstr ""
msgstr "<span class=\"text-nowrap\">1,500.00</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span class=\"text-nowrap\">2,350.00</span>"
msgstr ""
msgstr "<span class=\"text-nowrap\">2,350.00</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -519,28 +526,28 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>$ <span class=\"oe_currency_value\">19,250.00</span></span>"
msgstr ""
msgstr "<span>$<span class=\"oe_currency_value\">19,250.00</span></span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>5.00</span>"
msgstr ""
msgstr "<span>5.00</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>Amount</span>"
msgstr ""
msgstr "<span>بڕ</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>Description</span>"
msgstr ""
msgstr "<span>وەسف</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -557,17 +564,17 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>Quantity</span>"
msgstr ""
msgstr "<span>بڕ</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>Taxes</span>"
msgstr ""
msgstr "<span>باجەکان</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>Unit Price</span>"
msgstr ""
msgstr "<span>نرخی یەکە</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -623,7 +630,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<strong>Due Date</strong>"
msgstr ""
msgstr "<strong>بەرواری کۆتایی هاتنی:</strong>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.address_layout
@ -633,12 +640,12 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<strong>Invoice Date</strong>"
msgstr ""
msgstr "<strong>بەرواری فاکتورە</strong>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<strong>Total</strong>"
msgstr ""
msgstr "<strong>کۆ</strong>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -770,7 +777,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Action"
msgstr ""
msgstr "کردار"
#. module: web
#. odoo-javascript
@ -783,7 +790,7 @@ msgstr ""
#: code:addons/web/static/src/search/action_menus/action_menus.xml:0
#: code:addons/web/static/src/search/cog_menu/cog_menu.xml:0
msgid "Actions"
msgstr ""
msgstr "کردارەکان"
#. module: web
#. odoo-javascript
@ -831,7 +838,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "Activities"
msgstr ""
msgstr "چالاکیەکان"
#. module: web
#. odoo-javascript
@ -841,7 +848,7 @@ msgstr ""
#: code:addons/web/static/src/views/view_components/multi_create_popover.xml:0
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.xml:0
msgid "Add"
msgstr ""
msgstr "زیادکردن"
#. module: web
#. odoo-javascript
@ -884,7 +891,7 @@ msgstr ""
#: code:addons/web/static/src/views/list/list_renderer.js:0
#: code:addons/web/static/src/views/list/list_renderer.xml:0
msgid "Add a line"
msgstr ""
msgstr "هێڵێک زیاد بکە"
#. module: web
#. odoo-javascript
@ -931,7 +938,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Address"
msgstr ""
msgstr "ناونیشان"
#. module: web
#. odoo-javascript
@ -979,7 +986,7 @@ msgstr ""
#: code:addons/web/static/src/search/search_panel/search_panel.xml:0
#: code:addons/web/static/src/views/view_components/selection_box.xml:0
msgid "All"
msgstr ""
msgstr "گشت"
#. module: web
#. odoo-javascript
@ -997,7 +1004,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_items.xml:0
msgid "All users"
msgstr ""
msgstr "هەموو بەکارهێنەران"
#. module: web
#. odoo-javascript
@ -1077,7 +1084,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker_popover.xml:0
msgid "Apply"
msgstr ""
msgstr "جێبەجێکردن"
#. module: web
#. odoo-javascript
@ -1093,7 +1100,7 @@ msgstr ""
#: code:addons/web/static/src/views/kanban/kanban_renderer.js:0
#: code:addons/web/static/src/views/list/list_controller.js:0
msgid "Archive"
msgstr ""
msgstr "ئەرشیف"
#. module: web
#. odoo-javascript
@ -1199,13 +1206,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/many2many_binary/many2many_binary_field.xml:0
msgid "Attach"
msgstr ""
msgstr "هاوپێچکردن"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_cover_image_dialog.xml:0
msgid "Attachment"
msgstr ""
msgstr "هاوپێچ"
#. module: web
#. odoo-javascript
@ -1217,7 +1224,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/debug_items.js:0
msgid "Attachments"
msgstr ""
msgstr "هاوپێچەکان"
#. module: web
#. odoo-javascript
@ -1349,7 +1356,7 @@ msgstr ""
#. module: web
#: model:ir.model,name:web.model_base
msgid "Base"
msgstr ""
msgstr "بناغە"
#. module: web
#. odoo-javascript
@ -1540,7 +1547,7 @@ msgstr ""
#: code:addons/web/static/src/views/view_dialogs/export_data_dialog.xml:0
#: code:addons/web/static/src/webclient/settings_form_view/fields/upgrade_dialog.xml:0
msgid "Cancel"
msgstr ""
msgstr "ڕەتکردنەوە"
#. module: web
#. odoo-javascript
@ -1722,7 +1729,7 @@ msgstr ""
#: code:addons/web/static/src/views/view_dialogs/select_create_dialog.xml:0
#: code:addons/web/static/src/webclient/actions/action_install_kiosk_pwa.xml:0
msgid "Close"
msgstr ""
msgstr "داخستن"
#. module: web
#. odoo-javascript
@ -1768,32 +1775,32 @@ msgstr ""
#: code:addons/web/static/src/webclient/burger_menu/mobile_switch_company_menu/mobile_switch_company_menu.xml:0
#: model:ir.model,name:web.model_res_company
msgid "Companies"
msgstr ""
msgstr "کۆمپانیاکان"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__company_id
msgid "Company"
msgstr ""
msgstr "کۆمپانیا"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__company_details
msgid "Company Details"
msgstr ""
msgstr "وردەکاری کۆمپانیا"
#. module: web
#: model:ir.model,name:web.model_base_document_layout
msgid "Company Document Layout"
msgstr ""
msgstr "شێوازی بەڵگەنامەی کۆمپانیا"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__logo
msgid "Company Logo"
msgstr ""
msgstr "لۆگۆی کۆمپانیا"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__name
msgid "Company Name"
msgstr ""
msgstr "ناوی کۆمپانیا"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__report_header
@ -1844,7 +1851,7 @@ msgstr ""
#. module: web
#: model:ir.actions.act_window,name:web.action_base_document_layout_configurator
msgid "Configure your document layout"
msgstr ""
msgstr "شێوازی بەڵگەنامەکەت ڕێکبخە"
#. module: web
#. odoo-javascript
@ -1853,7 +1860,7 @@ msgstr ""
#: code:addons/web/static/src/model/relational_model/dynamic_list.js:0
#: code:addons/web/static/src/webclient/switch_company_menu/switch_company_menu.xml:0
msgid "Confirm"
msgstr ""
msgstr "دڵنیاکردنەوە"
#. module: web
#. odoo-javascript
@ -1883,7 +1890,7 @@ msgstr ""
#. module: web
#: model:ir.model,name:web.model_res_partner
msgid "Contact"
msgstr ""
msgstr "پەیوەندی"
#. module: web
#. odoo-javascript
@ -1923,7 +1930,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Continue"
msgstr ""
msgstr "بەردەوامبە"
#. module: web
#. odoo-javascript
@ -1950,13 +1957,13 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/views/fields/copy_clipboard/copy_clipboard_field.js:0
msgid "Copied"
msgstr ""
msgstr "کۆپی کراوە"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/copy_clipboard/copy_clipboard_field.js:0
msgid "Copy"
msgstr ""
msgstr "لەبەرگرتنەوە"
#. module: web
#. odoo-javascript
@ -2035,7 +2042,7 @@ msgstr ""
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__country_id
msgid "Country"
msgstr ""
msgstr "وڵات"
#. module: web
#. odoo-javascript
@ -2043,7 +2050,7 @@ msgstr ""
#: code:addons/web/static/src/views/calendar/quick_create/calendar_quick_create.xml:0
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Create"
msgstr ""
msgstr "دروستکردن"
#. module: web
#. odoo-javascript
@ -2079,13 +2086,13 @@ msgstr ""
#: model:ir.model.fields,field_description:web.field_base_document_layout__create_uid
#: model:ir.model.fields,field_description:web.field_res_users_settings_embedded_action__create_uid
msgid "Created by"
msgstr ""
msgstr "دروستکراوە لەلایەن..."
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__create_date
#: model:ir.model.fields,field_description:web.field_res_users_settings_embedded_action__create_date
msgid "Created on"
msgstr ""
msgstr "دروستکراوە لە"
#. module: web
#. odoo-javascript
@ -2109,7 +2116,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/monetary/monetary_field.js:0
msgid "Currency"
msgstr ""
msgstr "دراو"
#. module: web
#. odoo-javascript
@ -2223,7 +2230,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
msgid "Date"
msgstr ""
msgstr "ڕێکەوت"
#. module: web
#. odoo-javascript
@ -2242,7 +2249,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Range"
msgstr ""
msgstr "مەودای بەروار"
#. module: web
#. odoo-javascript
@ -2261,7 +2268,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Days"
msgstr ""
msgstr "ڕۆژەکان"
#. module: web
#. odoo-javascript
@ -2304,7 +2311,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Default"
msgstr ""
msgstr "بنەڕەتی"
#. module: web
#. odoo-javascript
@ -2368,7 +2375,7 @@ msgstr ""
#: code:addons/web/static/src/views/view_dialogs/export_data_dialog.xml:0
#: code:addons/web/static/src/views/view_hook.js:0
msgid "Delete"
msgstr ""
msgstr "سڕینەوە"
#. module: web
#. odoo-javascript
@ -2469,7 +2476,7 @@ msgstr ""
#: code:addons/web/static/src/webclient/settings_form_view/settings_confirmation_dialog.xml:0
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Discard"
msgstr ""
msgstr "ڕەتکردنەوە"
#. module: web
#. odoo-javascript
@ -2627,7 +2634,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/many2many_binary/many2many_binary_field.xml:0
#: code:addons/web/static/src/views/fields/pdf_viewer/pdf_viewer_field.xml:0
msgid "Download"
msgstr ""
msgstr "دابەزاندن"
#. module: web
#: model:ir.actions.server,name:web.download_contact
@ -2771,7 +2778,7 @@ msgstr ""
#: model:ir.model.fields,field_description:web.field_base_document_layout__email
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Email"
msgstr ""
msgstr "ئیمەیڵ"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
@ -2852,7 +2859,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "European"
msgstr ""
msgstr "ئەوروپی"
#. module: web
#. odoo-javascript
@ -2965,7 +2972,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_value_editors.js:0
msgid "False"
msgstr ""
msgstr "هەڵە"
#. module: web
#. odoo-javascript
@ -2989,7 +2996,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar_menu/search_bar_menu.xml:0
msgid "Favorites"
msgstr ""
msgstr "دڵخوازەکان"
#. module: web
#. odoo-javascript
@ -3259,7 +3266,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_popover.xml:0
msgid "Group"
msgstr ""
msgstr "گروپ"
#. module: web
#. odoo-javascript
@ -3271,7 +3278,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar_menu/search_bar_menu.xml:0
msgid "Group By"
msgstr ""
msgstr "گروپ لەلایەن..."
#. module: web
#. odoo-javascript
@ -3424,7 +3431,7 @@ msgstr ""
#: model:ir.model.fields,field_description:web.field_res_users_settings__id
#: model:ir.model.fields,field_description:web.field_res_users_settings_embedded_action__id
msgid "ID"
msgstr ""
msgstr "ID"
#. module: web
#. odoo-javascript
@ -3454,7 +3461,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js:0
msgid "Icon"
msgstr ""
msgstr "ئایکۆن"
#. module: web
#. odoo-javascript
@ -3471,6 +3478,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3603,7 +3618,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/many2one/many2one.xml:0
#: code:addons/web/static/src/views/fields/properties/property_value.xml:0
msgid "Internal link"
msgstr ""
msgstr "بەستەری ناوخۆیی"
#. module: web
#. odoo-javascript
@ -4047,13 +4062,13 @@ msgstr ""
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
#: model:ir.model.fields,field_description:web.field_res_users_settings_embedded_action__write_uid
msgid "Last Updated by"
msgstr ""
msgstr "دوایین نوێکردنەوە لەلایەن..."
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_date
#: model:ir.model.fields,field_description:web.field_res_users_settings_embedded_action__write_date
msgid "Last Updated on"
msgstr ""
msgstr "دوایین نوێکردنەوە لە..."
#. module: web
#. odoo-javascript
@ -4184,7 +4199,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Log in"
msgstr ""
msgstr "چوونەژوورەوە"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
@ -4202,7 +4217,7 @@ msgstr ""
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "چوونەژوورەوە"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4216,7 +4231,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:web.login_layout
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Logo"
msgstr ""
msgstr "لۆگۆ"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__logo_primary_color
@ -4368,7 +4383,7 @@ msgstr ""
#: code:addons/web/static/src/webclient/burger_menu/burger_menu.xml:0
#: model:ir.model,name:web.model_ir_ui_menu
msgid "Menu"
msgstr ""
msgstr "مێنۆ"
#. module: web
#. odoo-javascript
@ -4407,6 +4422,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4455,7 +4476,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/field_selector/field_selector_field.js:0
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Model"
msgstr ""
msgstr "مۆدێل"
#. module: web
#. odoo-javascript
@ -4688,7 +4709,7 @@ msgstr ""
#: code:addons/web/static/src/views/list/list_controller.xml:0
#: code:addons/web/static/src/views/view_dialogs/select_create_dialog.xml:0
msgid "New"
msgstr ""
msgstr "نوێ"
#. module: web
#. odoo-javascript
@ -4772,7 +4793,7 @@ msgstr ""
#: code:addons/web/static/src/search/search_bar/search_bar.js:0
#: code:addons/web/static/src/views/pivot/pivot_model.js:0
msgid "No"
msgstr ""
msgstr "نەخێر"
#. module: web
#. odoo-javascript
@ -4819,6 +4840,12 @@ msgstr ""
msgid "No data to display"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4834,7 +4861,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4921,7 +4948,7 @@ msgstr ""
#: code:addons/web/static/src/views/pivot/pivot_model.js:0
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "None"
msgstr ""
msgstr "هیچکامیان"
#. module: web
#. odoo-python
@ -5015,7 +5042,7 @@ msgstr ""
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_edition.xml:0
#: model_terms:ir.ui.view,arch_db:web.brand_promotion_message
msgid "Odoo"
msgstr ""
msgstr "ئۆدۆ"
#. module: web
#. odoo-javascript
@ -5108,7 +5135,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5193,7 +5219,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Open"
msgstr ""
msgstr "کردنەوە"
#. module: web
#. odoo-javascript
@ -5267,7 +5293,7 @@ msgstr ""
#: code:addons/web/static/src/views/kanban/progress_bar_hook.js:0
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_field.js:0
msgid "Other"
msgstr ""
msgstr "هی تر"
#. module: web
#. odoo-javascript
@ -5325,12 +5351,12 @@ msgstr ""
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__partner_id
msgid "Partner"
msgstr ""
msgstr "هاوبەش"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Password"
msgstr ""
msgstr "وشەی نهێنی"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -5359,14 +5385,14 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/percentage/percentage_field.js:0
msgid "Percentage"
msgstr ""
msgstr "لەسەدا"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/phone/phone_field.js:0
#: model:ir.model.fields,field_description:web.field_base_document_layout__phone
msgid "Phone"
msgstr ""
msgstr "تەلەفۆن"
#. module: web
#. odoo-javascript
@ -5480,7 +5506,7 @@ msgstr ""
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__preview
msgid "Preview"
msgstr ""
msgstr "پێشبینی"
#. module: web
#: model:ir.actions.report,name:web.action_report_externalpreview
@ -5560,7 +5586,7 @@ msgstr ""
#: code:addons/web/static/src/search/action_menus/action_menus.js:0
#: code:addons/web/static/src/webclient/actions/reports/report_action.xml:0
msgid "Print"
msgstr ""
msgstr "چاپ"
#. module: web
#. odoo-javascript
@ -5573,7 +5599,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/priority/priority_field.js:0
#: code:addons/web/static/src/views/fields/priority/priority_field.xml:0
msgid "Priority"
msgstr ""
msgstr "ئەولەویەت"
#. module: web
#. odoo-javascript
@ -5717,7 +5743,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_basic.js:0
msgid "Record"
msgstr ""
msgstr "تۆمار"
#. module: web
#. odoo-javascript
@ -5759,7 +5785,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_basic.js:0
msgid "Records"
msgstr ""
msgstr "تۆمارەکان"
#. module: web
#. odoo-javascript
@ -5771,7 +5797,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/reference/reference_field.js:0
msgid "Reference"
msgstr ""
msgstr "سەرچاوە"
#. module: web
#. odoo-javascript
@ -5807,7 +5833,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/image/image_field.js:0
msgid "Reload"
msgstr ""
msgstr "دووبارە بارکردنەوە"
#. module: web
#. odoo-javascript
@ -5866,7 +5892,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/action_service.js:0
msgid "Report"
msgstr ""
msgstr "ڕاپۆرت"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__report_footer
@ -6039,7 +6065,7 @@ msgstr ""
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
#: code:addons/web/static/src/webclient/settings_form_view/settings_confirmation_dialog.xml:0
msgid "Save"
msgstr ""
msgstr "هەڵگرتن"
#. module: web
#. odoo-javascript
@ -6331,7 +6357,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/email/email_field.xml:0
msgid "Send Email"
msgstr ""
msgstr "ئیمەیڵ بنێرە"
#. module: web
#. odoo-javascript
@ -6530,6 +6556,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr ""
@ -6588,7 +6615,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/statusbar/statusbar_field.js:0
msgid "Status"
msgstr ""
msgstr "دۆخ"
#. module: web
#. odoo-javascript
@ -6711,7 +6738,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Tags"
msgstr ""
msgstr "تاگەکان"
#. module: web
#. odoo-javascript
@ -6794,6 +6821,9 @@ msgid ""
"country format. You can use '/' to indicate that the partner is not subject "
"to tax."
msgstr ""
"ژمارەی ناسنامەی باج. بەهاکان لێرەدا بە پشتبەستن بە فۆرماتەکەی وڵات پشتڕاست "
"دەکرێنەوە. دەتوانیت '/' بەکاربهێنیت بۆ ئەوەی ئاماژە بەوە بکەیت کە هاوبەشەکە "
"باج نادات."
#. module: web
#. odoo-python
@ -6839,6 +6869,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6862,6 +6898,12 @@ msgid ""
"is taking too much time."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7060,7 +7102,7 @@ msgstr ""
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
#: code:addons/web/static/src/views/calendar/calendar_controller.xml:0
msgid "Today"
msgstr ""
msgstr "ئەمڕۆ"
#. module: web
#. odoo-javascript
@ -7121,7 +7163,7 @@ msgstr ""
#: code:addons/web/static/src/views/graph/graph_model.js:0
#: code:addons/web/static/src/views/pivot/pivot_model.js:0
msgid "Total"
msgstr ""
msgstr "کۆ"
#. module: web
#. odoo-javascript
@ -7188,7 +7230,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/float_toggle/float_toggle_field.js:0
#: code:addons/web/static/src/views/fields/integer/integer_field.js:0
msgid "Type"
msgstr ""
msgstr "جۆر"
#. module: web
#. odoo-javascript
@ -7312,7 +7354,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/many2one/many2one.js:0
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Unnamed"
msgstr ""
msgstr "بێ ناو"
#. module: web
#. odoo-javascript
@ -7345,7 +7387,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_confirmation_dialog.xml:0
msgid "Update"
msgstr ""
msgstr "نوێکردنەوە"
#. module: web
#. odoo-javascript
@ -7477,7 +7519,7 @@ msgstr ""
#: code:addons/web/static/src/webclient/user_menu/user_menu.xml:0
#: model:ir.model,name:web.model_res_users
msgid "User"
msgstr ""
msgstr "بەکارهێنەر"
#. module: web
#. odoo-javascript
@ -7579,7 +7621,7 @@ msgstr ""
#: code:addons/web/static/src/views/list/list_renderer.xml:0
#: model:ir.model,name:web.model_ir_ui_view
msgid "View"
msgstr ""
msgstr "بینین"
#. module: web
#. odoo-javascript
@ -7652,8 +7694,9 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr ""
msgstr "ئاگادار کردنەوە"
#. module: web
#. odoo-javascript
@ -7665,7 +7708,7 @@ msgstr ""
#. odoo-python
#: code:addons/web/models/models.py:0
msgid "Warnings"
msgstr ""
msgstr "ئاگادارکردنەوەکان"
#. module: web
#. odoo-javascript
@ -19163,7 +19206,7 @@ msgstr ""
#: code:addons/web/static/src/search/search_model.js:0
#: code:addons/web/static/src/views/fields/dynamic_placeholder_popover.xml:0
msgid "or"
msgstr ""
msgstr "یان"
#. module: web
#. odoo-javascript

View file

@ -25,13 +25,14 @@
# Jonas Zinkevicius <jozi@odoo.com>, 2022
# Linas Versada <linaskrisiukenas@gmail.com>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 18:42+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 21:57+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Lithuanian <https://translate.odoo.com/projects/odoo-19/web/"
"lt/>\n"
"Language: lt\n"
@ -550,7 +551,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -1066,7 +1067,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "Americas"
msgstr ""
msgstr "Amerikos"
#. module: web
#. odoo-javascript
@ -1700,7 +1701,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/label_selection/label_selection_field.js:0
msgid "Classes"
msgstr ""
msgstr "Klasės"
#. module: web
#. odoo-javascript
@ -1776,7 +1777,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/kanban_color_picker/kanban_color_picker_field.js:0
msgid "Color Picker"
msgstr ""
msgstr "Color Picker"
#. module: web
#. odoo-javascript
@ -2271,7 +2272,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Datos formatas"
#. module: web
#. odoo-javascript
@ -2869,7 +2870,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/highlight_text/form_label_highlight_text.xml:0
msgid "Enterprise"
msgstr ""
msgstr "Verslininkystė"
#. module: web
#. odoo-javascript
@ -3209,7 +3210,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "French"
msgstr ""
msgstr "Prancūzų kalba"
#. module: web
#. odoo-javascript
@ -3433,7 +3434,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "Atspalvis"
#. module: web
#. odoo-javascript
@ -3506,6 +3507,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4070,13 +4079,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Paskutinės 30 dienų"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Paskutinės 7 dienos"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4094,7 +4103,7 @@ msgstr "Paskutinį kartą atnaujinta"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Paskutinis mėnesis"
#. module: web
#. odoo-javascript
@ -4237,7 +4246,7 @@ msgstr "Atsijungti"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Prisijungimas"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4442,6 +4451,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4854,6 +4869,12 @@ msgstr ""
msgid "No data to display"
msgstr "Rodymui nėra duomenų"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4869,7 +4890,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -5062,7 +5083,7 @@ msgstr "Odoo programos klaida"
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/fields/upgrade_dialog.xml:0
msgid "Odoo Enterprise"
msgstr ""
msgstr "Odoo Verslininkystė"
#. module: web
#. odoo-javascript
@ -5143,7 +5164,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5197,7 +5217,7 @@ msgstr "Tik jūs"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.xml:0
msgid "Oops!"
msgstr ""
msgstr "Oi!"
#. module: web
#. odoo-javascript
@ -5814,7 +5834,7 @@ msgstr "Numeris"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
msgid "Refresh"
msgstr ""
msgstr "Atnaujinti"
#. module: web
#. odoo-javascript
@ -6569,6 +6589,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Sugrupuota"
@ -6670,7 +6691,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Priešdėlis"
#. module: web
#. odoo-javascript
@ -6833,6 +6854,9 @@ msgid ""
"country format. You can use '/' to indicate that the partner is not subject "
"to tax."
msgstr ""
"Mokesčių identifikacijos numeris. Vertės čia bus tikrinamos pagal šalies "
"formatą. Galite naudoti '/' norėdami nurodyti, kad partneris yra "
"neapmokestinamas."
#. module: web
#. odoo-python
@ -6878,6 +6902,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6903,6 +6933,12 @@ msgstr ""
"Operacija buvo nutraukta. Tai dažniausiai reiškia, kad vykstanti operacija "
"trunka per ilgai."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7693,6 +7729,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Įspėjimas"
@ -8114,7 +8151,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "airplane"
msgstr ""
msgstr "Lėktuvas"
#. module: web
#. odoo-javascript
@ -8230,7 +8267,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "amusement park"
msgstr ""
msgstr "Pramogų parkas"
#. module: web
#. odoo-javascript
@ -8370,13 +8407,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "architect"
msgstr ""
msgstr "Architektas"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "arena"
msgstr ""
msgstr "Arena"
#. module: web
#. odoo-javascript
@ -8418,7 +8455,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "artist"
msgstr ""
msgstr "Menininkas"
#. module: web
#. odoo-javascript
@ -8719,7 +8756,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "bakery"
msgstr ""
msgstr "Kepykla"
#. module: web
#. odoo-javascript
@ -8827,7 +8864,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "bank"
msgstr ""
msgstr "Bankas"
#. module: web
#. odoo-javascript
@ -8845,7 +8882,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "bar"
msgstr ""
msgstr "Baras"
#. module: web
#. odoo-javascript
@ -8875,7 +8912,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "baseball"
msgstr ""
msgstr "Beisbolas"
#. module: web
#. odoo-javascript
@ -9715,7 +9752,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "bridge"
msgstr ""
msgstr "Bridžas"
#. module: web
#. odoo-javascript
@ -10225,7 +10262,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "castle"
msgstr ""
msgstr "Pilis"
#. module: web
#. odoo-javascript
@ -10327,7 +10364,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "chapel"
msgstr ""
msgstr "Koplyčia"
#. module: web
#. odoo-javascript
@ -10591,7 +10628,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "church"
msgstr ""
msgstr "Bažnyčia"
#. module: web
#. odoo-javascript
@ -10621,7 +10658,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "circus"
msgstr ""
msgstr "Cirkas"
#. module: web
#. odoo-javascript
@ -10771,7 +10808,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "clock"
msgstr ""
msgstr "laikrodis"
#. module: web
#. odoo-javascript
@ -11149,7 +11186,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "convenience store"
msgstr ""
msgstr "Savitarnos parduotuvė"
#. module: web
#. odoo-javascript
@ -11695,7 +11732,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "dairy"
msgstr ""
msgstr "Pieno produktai"
#. module: web
#. odoo-javascript
@ -11887,7 +11924,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "dentist"
msgstr ""
msgstr "Odontologas"
#. module: web
#. odoo-javascript
@ -11899,7 +11936,7 @@ msgstr "skyrius"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "department store"
msgstr ""
msgstr "Universalinė parduotuvė"
#. module: web
#. odoo-javascript
@ -11959,7 +11996,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "detective"
msgstr ""
msgstr "Detektyvas"
#. module: web
#. odoo-javascript
@ -12187,7 +12224,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "doctor"
msgstr ""
msgstr "Gydytojas"
#. module: web
#. odoo-javascript
@ -12618,7 +12655,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "electrician"
msgstr ""
msgstr "Elektrikas"
#. module: web
#. odoo-javascript
@ -12702,7 +12739,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "engineer"
msgstr ""
msgstr "Inžinierius"
#. module: web
#. odoo-javascript
@ -12720,7 +12757,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "entertainer"
msgstr ""
msgstr "Pramogų atlikėjas"
#. module: web
#. odoo-javascript
@ -13404,7 +13441,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "ferris wheel"
msgstr ""
msgstr "Apžvalgos ratas"
#. module: web
#. odoo-javascript
@ -13416,7 +13453,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "festival"
msgstr ""
msgstr "Festivalis"
#. module: web
#. odoo-javascript
@ -14154,13 +14191,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "garden"
msgstr ""
msgstr "Sodas"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "gardener"
msgstr ""
msgstr "Sodininkas"
#. module: web
#. odoo-javascript
@ -14742,7 +14779,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "hairdresser"
msgstr ""
msgstr "Kirpėjas"
#. module: web
#. odoo-javascript
@ -15222,7 +15259,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "hindu temple"
msgstr ""
msgstr "Hinduistų šventykla"
#. module: web
#. odoo-javascript
@ -15384,7 +15421,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "hospital"
msgstr ""
msgstr "Ligoninė"
#. module: web
#. odoo-javascript
@ -15438,7 +15475,7 @@ msgstr "dešrainis"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "hotel"
msgstr ""
msgstr "Viešbutis"
#. module: web
#. odoo-javascript
@ -16110,7 +16147,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "karaoke"
msgstr ""
msgstr "Karaoke"
#. module: web
#. odoo-javascript
@ -16554,7 +16591,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "laundry"
msgstr ""
msgstr "Skalbimas"
#. module: web
#. odoo-javascript
@ -16956,7 +16993,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "love hotel"
msgstr ""
msgstr "Meilės viešbutis"
#. module: web
#. odoo-javascript
@ -17778,7 +17815,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "mechanic"
msgstr ""
msgstr "Mechanikas"
#. module: web
#. odoo-javascript
@ -18228,7 +18265,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "mosque"
msgstr ""
msgstr "Mečetė"
#. module: web
#. odoo-javascript
@ -18414,7 +18451,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "museum"
msgstr ""
msgstr "Muziejus"
#. module: web
#. odoo-javascript
@ -18504,7 +18541,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "national park"
msgstr ""
msgstr "Nacionalinis parkas"
#. module: web
#. odoo-javascript
@ -19404,13 +19441,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "painter"
msgstr ""
msgstr "Dailininkas"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "painting"
msgstr ""
msgstr "Tapyba"
#. module: web
#. odoo-javascript
@ -19530,7 +19567,7 @@ msgstr "tėvinis"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "park"
msgstr ""
msgstr "Parkas"
#. module: web
#. odoo-javascript
@ -19740,7 +19777,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "pen"
msgstr ""
msgstr "tušinukas"
#. module: web
#. odoo-javascript
@ -20310,7 +20347,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "place of worship"
msgstr ""
msgstr "Maldos vieta"
#. module: web
#. odoo-javascript
@ -20394,7 +20431,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "plumber"
msgstr ""
msgstr "Santechnikas"
#. module: web
#. odoo-javascript
@ -20568,7 +20605,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "post office"
msgstr ""
msgstr "Pašto skyrius"
#. module: web
#. odoo-javascript
@ -21180,7 +21217,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "record"
msgstr ""
msgstr "įrašyti"
#. module: web
#. odoo-javascript
@ -21385,7 +21422,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "resort"
msgstr ""
msgstr "Kurortas"
#. module: web
#. odoo-javascript
@ -21637,7 +21674,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "roller coaster"
msgstr ""
msgstr "Amerikietiški kalneliai"
#. module: web
#. odoo-javascript
@ -21715,7 +21752,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "rugby"
msgstr ""
msgstr "Rugdby"
#. module: web
#. odoo-javascript
@ -21931,7 +21968,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "sauna"
msgstr ""
msgstr "Pirtis/Sauna"
#. module: web
#. odoo-javascript
@ -22003,7 +22040,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "school"
msgstr ""
msgstr "Mokykla"
#. module: web
#. odoo-javascript
@ -22323,7 +22360,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "shield"
msgstr ""
msgstr "skydas"
#. module: web
#. odoo-javascript
@ -22347,13 +22384,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "shinto shrine"
msgstr ""
msgstr "Šinto šventykla"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "ship"
msgstr ""
msgstr "laivas"
#. module: web
#. odoo-javascript
@ -22383,7 +22420,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "shooting"
msgstr ""
msgstr "diagnotika"
#. module: web
#. odoo-javascript
@ -22443,7 +22480,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "shrine"
msgstr ""
msgstr "Šventykla"
#. module: web
#. odoo-javascript
@ -23391,7 +23428,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "stadium"
msgstr ""
msgstr "Stadionas"
#. module: web
#. odoo-javascript
@ -23571,7 +23608,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "store"
msgstr ""
msgstr "Parduotuvė"
#. module: web
#. odoo-javascript
@ -23955,7 +23992,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "synagogue"
msgstr ""
msgstr "Sinagoga"
#. module: web
#. odoo-javascript
@ -24273,7 +24310,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "theme park"
msgstr ""
msgstr "Teminis parkas"
#. module: web
#. odoo-javascript
@ -24741,7 +24778,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "trophy"
msgstr ""
msgstr "trofėjus"
#. module: web
#. odoo-javascript
@ -24771,7 +24808,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "truck"
msgstr ""
msgstr "sunkvežimis"
#. module: web
#. odoo-javascript
@ -25527,7 +25564,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "wavy"
msgstr ""
msgstr "banguotas"
#. module: web
#. odoo-javascript

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -13,13 +13,14 @@
# Martin Trigaux, 2023
# Henning Fyllingsnes, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 18:42+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 21:57+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Norwegian Bokmål <https://translate.odoo.com/projects/odoo-19/"
"web/nb_NO/>\n"
"Language: nb\n"
@ -174,7 +175,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "100"
msgstr ""
msgstr "100"
#. module: web
#. odoo-javascript
@ -536,7 +537,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -2259,7 +2260,7 @@ msgstr "Dato og tid"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Datoformat"
#. module: web
#. odoo-javascript
@ -3400,7 +3401,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Time"
#. module: web
#. odoo-python
@ -3421,7 +3422,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "Kulør"
#. module: web
#. odoo-javascript
@ -3494,6 +3495,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4058,13 +4067,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Siste 30 dager"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Siste 7 dager"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4082,7 +4091,7 @@ msgstr "Sist oppdatert"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Forrige måned"
#. module: web
#. odoo-javascript
@ -4225,7 +4234,7 @@ msgstr "Logg ut"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Innlogging"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4430,6 +4439,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4842,6 +4857,12 @@ msgstr ""
msgid "No data to display"
msgstr "Ingen data å vise"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4857,7 +4878,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4909,7 +4930,7 @@ msgstr "Ingen treff"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Ingen resultater"
#. module: web
#. odoo-javascript
@ -5131,7 +5152,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6557,6 +6577,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr ""
@ -6658,7 +6679,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Suffiks"
#. module: web
#. odoo-javascript
@ -6866,6 +6887,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6891,6 +6918,12 @@ msgstr ""
"Operasjonen ble avbrutt. Dette betyr som regel at den nåværende operasjonen "
"tar for mye tid."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7519,7 +7552,7 @@ msgstr "Brukergrensesnitt"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Bruker innstillinger"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7683,6 +7716,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Advarsel"
@ -8078,7 +8112,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "etter"
#. module: web
#. odoo-javascript

View file

@ -7,22 +7,24 @@
# Gunther Clauwaert <gclauwae@hotmail.com>, 2022
# Martin Trigaux, 2023
# Jolien De Paepe, 2023
# Erwin van der Ploeg <erwin@odooexperts.nl>, 2023
# Erwin van der Ploeg <erwin@odooexperts.nl>, 2023, 2025.
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Bren Driesen <brdri@odoo.com>, 2025, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-14 08:06+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-03-06 17:47+0000\n"
"Last-Translator: Bren Driesen <brdri@odoo.com>\n"
"Language-Team: Dutch <https://translate.odoo.com/projects/odoo-19/web/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.16.1\n"
#. module: web
#. odoo-javascript
@ -121,7 +123,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/calendar/calendar_filter_section/calendar_filter_section.js:0
msgid "+ Add %s"
msgstr "+ Toevoegen %s"
msgstr "+ %s Toevoegen"
#. module: web
#. odoo-javascript
@ -299,7 +301,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -480,6 +482,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Gescheiden "
"(één per tabblad)</option>\n"
" <option value=\"temporal\">Tijdelijk "
"(experimenteel)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>Waarschuwing:</b> "
"Tijdelijke modus voegt alle voorbeelden samen.<br/>Dit kan leiden tot "
"gedeeltelijk ongeldige resultaten in het geval van paralelle profielen.<br/"
">Voorzichtig mee omgaan! </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -539,8 +553,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -896,7 +910,7 @@ msgstr "Foto toevoegen"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Eigenschap toevoegen"
#. module: web
#. odoo-javascript
@ -914,7 +928,7 @@ msgstr "Voeg een waarde toe"
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar/search_bar.js:0
msgid "Add a custom filter"
msgstr "Aangepast filter toevoegen"
msgstr "Aangepaste filter toevoegen"
#. module: web
#. odoo-javascript
@ -1040,7 +1054,7 @@ msgstr "Alle gebruikers"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.js:0
msgid "Allow expressions"
msgstr "Uitdrukkingen toestaan"
msgstr "Expressies toestaan"
#. module: web
#. odoo-javascript
@ -1164,12 +1178,13 @@ msgstr "Ben je zeker dat je deze ingebedde actie wilt verwijderen?"
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
"Weet je zeker dat je de %(nbSelected)s geselecteerde records wil verwijderen?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Weet je zeker dat je de geselecteerde record wil verwijderen?"
#. module: web
#. odoo-javascript
@ -1187,7 +1202,7 @@ msgstr "Weet je zeker dat je deze kolom wilt verwijderen?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Weet je zeker dat je dit eigenschapsveld wil verwijderen?"
#. module: web
#. odoo-javascript
@ -1777,7 +1792,7 @@ msgstr "Klikbaar"
#: code:addons/web/static/src/views/view_dialogs/select_create_dialog.xml:0
#: code:addons/web/static/src/webclient/actions/action_install_kiosk_pwa.xml:0
msgid "Close"
msgstr "Afsluiten"
msgstr "Sluiten"
#. module: web
#. odoo-javascript
@ -1901,7 +1916,7 @@ msgstr "Configuratie-instellingen"
#. module: web
#: model:ir.actions.act_window,name:web.action_base_document_layout_configurator
msgid "Configure your document layout"
msgstr "Configureer je document lay-out"
msgstr "Configureer de lay-out van je document"
#. module: web
#. odoo-javascript
@ -2117,7 +2132,7 @@ msgstr "Maak \"%s\" aan"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Create %s"
msgstr "%s . maken"
msgstr "%s maken"
#. module: web
#: model:ir.model,website_form_label:web.model_res_partner
@ -2176,7 +2191,7 @@ msgstr "Valuta"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Valutaveld"
#. module: web
#. odoo-javascript
@ -2212,14 +2227,14 @@ msgstr "Aangepaste ingebedde actie"
#: code:addons/web/static/src/search/search_bar/search_bar.js:0
#: code:addons/web/static/src/search/search_model.js:0
msgid "Custom Filter"
msgstr "Aangepast filter"
msgstr "Aangepaste filter"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar/search_bar.xml:0
#: code:addons/web/static/src/search/search_bar_menu/search_bar_menu.xml:0
msgid "Custom Filter..."
msgstr "Aangepast filter..."
msgstr "Aangepaste filter..."
#. module: web
#. odoo-javascript
@ -2231,7 +2246,7 @@ msgstr "Aangepaste groep"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Aangepast bereik"
#. module: web
#. odoo-python
@ -2255,7 +2270,7 @@ msgstr "DNA"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "DVD"
msgstr "DVD"
msgstr "Dvd"
#. module: web
#. odoo-javascript
@ -2298,7 +2313,7 @@ msgstr "Datum & Tijd"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Datumnotatie"
#. module: web
#. odoo-javascript
@ -2565,7 +2580,7 @@ msgstr "Wijzigingen negeren"
#: model:ir.model.fields,field_description:web.field_res_users_settings__display_name
#: model:ir.model.fields,field_description:web.field_res_users_settings_embedded_action__display_name
msgid "Display Name"
msgstr "Schermnaam"
msgstr "Weergavenaam"
#. module: web
#. odoo-javascript
@ -2610,6 +2625,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Toont of verbergt de seconden in de datum-/tijdwaarde. Alleen van invloed op "
"de leesbare datum-/tijdwaarde."
#. module: web
#. odoo-javascript
@ -2621,7 +2638,7 @@ msgstr "Geeft de tijd in de datumwaarde weer of verbergt deze."
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
msgstr "Geeft de datum weer als 31/01/%(year)s of als 31 januari %(year)s"
#. module: web
#. odoo-javascript
@ -2846,7 +2863,7 @@ msgstr "E-mail"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Configuratie ingebedde acties"
#. module: web
#. odoo-javascript
@ -3071,7 +3088,7 @@ msgstr "Rad"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/field_selector/field_selector_field.js:0
msgid "Field Selector"
msgstr "Veldselector"
msgstr "Veldkiezer"
#. module: web
#. odoo-javascript
@ -3212,6 +3229,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Als de waarde bijvoorbeeld \"1\" is en je voert \"+=2\" in, dan wordt deze "
"bijgewerkt naar \"3\"."
#. module: web
#. odoo-javascript
@ -3389,6 +3408,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Let op! Je recente wijzigingen zijn te groot om automatisch op te slaan. "
"Klik nu op de %(upload_icon)s-knop om ervoor te zorgen dat je werk wordt "
"opgeslagen voordat je dit tabblad verlaat."
#. module: web
#. odoo-javascript
@ -3459,7 +3481,7 @@ msgstr "Home menu"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Uur"
#. module: web
#. odoo-python
@ -3562,6 +3584,16 @@ msgstr ""
"de bewerking van het label voorrang. De kleurkiezer wordt in dat geval niet "
"weergegeven bij het klikken op het label."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Als deze optie is aangevinkt, worden de selectievakjes in een kolom "
"weergegeven. Anders worden ze naast elkaar weergegeven."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3717,7 +3749,7 @@ msgstr "Interval"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Ongeldige weergavenaam"
#. module: web
#. odoo-javascript
@ -3883,18 +3915,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Het wordt verwijderd voor iedereen die de %(parentFieldLabel)s \"%"
"(parentName)s\" gebruikt."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Het wordt voor iedereen verwijderd!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31 januari %s"
#. module: web
#. odoo-javascript
@ -4143,19 +4177,19 @@ msgstr "Groot"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Laatste 12 maanden"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Laatste 30 dagen"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Laatste 7 dagen"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4173,7 +4207,7 @@ msgstr "Laatst bijgewerkt op"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Laatste maand"
#. module: web
#. odoo-javascript
@ -4208,7 +4242,7 @@ msgstr "Latijns kruis"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Layout"
msgstr "Layout"
msgstr "Lay-out"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__layout_background
@ -4255,7 +4289,7 @@ msgstr "Laden"
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_dev_tool.xml:0
msgid "Load demo data"
msgstr "Laad demo data"
msgstr "Demodata laden"
#. module: web
#. odoo-javascript
@ -4316,7 +4350,7 @@ msgstr "Afmelden"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Inloggen"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4471,12 +4505,12 @@ msgstr "Afspraak onderwerp"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Geheugenlimiet (in bytes)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Geheugenprofiel"
#. module: web
#. odoo-javascript
@ -4522,6 +4556,12 @@ msgstr "Melkweg"
msgid "Minimal precision"
msgstr "Minimale precisie"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Minimum aantal cijfers"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4550,7 +4590,7 @@ msgstr "Ontbrekend record id"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Ontbrekende verplichte velden"
#. module: web
#. odoo-javascript
@ -4637,7 +4677,7 @@ msgstr "Maand"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Maand tot nu toe"
#. module: web
#. odoo-javascript
@ -4761,7 +4801,7 @@ msgstr "Mijn Odoo.com-account"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Mijn voorkeuren"
#. module: web
#. odoo-javascript
@ -4934,6 +4974,12 @@ msgstr "Geen data"
msgid "No data to display"
msgstr "Geen gegevens om te tonen"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "Geen gegevens om te exporteren"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4949,8 +4995,8 @@ msgstr "Er kan geen apparaat worden gevonden."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Er is geen emoji die overeenkomt met je zoekopdracht"
msgid "No emojis match your search"
msgstr "Er zijn geen emoji's die overeenkomen met je zoekopdracht"
#. module: web
#. odoo-javascript
@ -4977,7 +5023,7 @@ msgstr "Geen record gevonden"
#: code:addons/web/static/src/views/fields/formatters.js:0
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "No records"
msgstr "Geen regels"
msgstr "Geen records"
#. module: web
#. odoo-javascript
@ -5001,7 +5047,7 @@ msgstr "Geen resultaat gevonden"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Geen resultaten"
#. module: web
#. odoo-javascript
@ -5057,6 +5103,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Het is niet mogelijk om een monetair veld te maken omdat er geen valuta is "
"in het huidige model."
#. module: web
#. odoo-javascript
@ -5227,7 +5275,6 @@ msgstr "Oh nee!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5741,7 +5788,7 @@ msgstr "Eigenschappen"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Eigenschappen Basisdefinitie"
#. module: web
#. odoo-javascript
@ -5872,7 +5919,7 @@ msgstr "Recordregels"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Recordgeheugen"
#. module: web
#. odoo-javascript
@ -6508,7 +6555,7 @@ msgstr "Stel een tijdzone in op je gebruiker"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Stel een geheelveld in om kleuren te gebruiken bij de badge."
#. module: web
#. odoo-javascript
@ -6675,10 +6722,11 @@ msgstr "Speciaal:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Gestapeld"
@ -6780,7 +6828,7 @@ msgstr "Stijlfout"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Achtervoegsel"
#. module: web
#. odoo-javascript
@ -6994,11 +7042,18 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "Het domein mag geen niet-letterlijke waarden bevatten"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Het bestand is geen afbeelding. Het formaat kan niet worden gewijzigd"
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
"De id's in %(field_name)s mogen niet gedupliceerd worden: \"%(action_ids)s\""
#. module: web
#. odoo-python
@ -7007,6 +7062,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"De id's in %(field_name)s mogen alleen gehele getallen of \"false\" zijn: \"%"
"(action_ids)s\""
#. module: web
#. odoo-javascript
@ -7019,6 +7076,12 @@ msgstr ""
"De bewerking is onderbroken. Dit betekent meestal dat de huidige bewerking "
"te lang duurt."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Formaat wijzigen van de afbeelding mislukt"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7055,6 +7118,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"De gebruiker moet één unieke embedded actie-instelling hebben per "
"gebruikersinstelling, actie en record-id."
#. module: web
#. odoo-javascript
@ -7134,7 +7199,7 @@ msgstr "Dit veld is al laatste"
#. odoo-javascript
#: code:addons/web/static/src/core/signature/name_and_signature.xml:0
msgid "This file is invalid. Please select an image."
msgstr "Dit bestand is ongeldig. Selecteer een afbeelding."
msgstr "Dit bestand is ongeldig. Selecteer een afbeelding."
#. module: web
#: model_terms:ir.ui.view,arch_db:web.preview_externalreport
@ -7252,7 +7317,7 @@ msgstr "Zoekpaneel in-/uitschakelen"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Schakelen tussen datumbereiken"
#. module: web
#. odoo-javascript
@ -7557,7 +7622,7 @@ msgstr "Uploaden en instellen"
#: code:addons/web/static/src/views/fields/pdf_viewer/pdf_viewer_field.xml:0
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Upload your file"
msgstr "Upload je bestand"
msgstr "Bestand uploaden"
#. module: web
#. odoo-javascript
@ -7632,6 +7697,8 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Gebruik de operatoren \"+=\", \"-=\", \"*=\" en \"/=\" om de actuele waarde "
"bij te werken."
#. module: web
#. odoo-javascript
@ -7679,12 +7746,12 @@ msgstr "Gebruikersinterface"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Gebruikersinstellingen"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Gebruikersinstellingen voor ingesloten acties"
#. module: web
#. odoo-javascript
@ -7725,7 +7792,7 @@ msgstr "VS-knop"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
msgid "Validation Error"
msgstr "Bevestiging fout"
msgstr "Validatiefout"
#. module: web
#. odoo-javascript
@ -7770,7 +7837,7 @@ msgstr "Video"
#: code:addons/web/static/src/views/list/list_renderer.xml:0
#: model:ir.model,name:web.model_ir_ui_view
msgid "View"
msgstr "Weergave"
msgstr "Bekijken"
#. module: web
#. odoo-javascript
@ -7812,7 +7879,7 @@ msgstr "Weergave: %(displayName)s"
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Viewer"
msgstr "Viewer"
msgstr "Kijker"
#. module: web
#. odoo-javascript
@ -7843,6 +7910,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Waarschuwing"
@ -7980,7 +8048,7 @@ msgstr "Jaar"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Jaar tot nu toe"
#. module: web
#. odoo-javascript
@ -8029,7 +8097,7 @@ msgstr "Je kunt de app installeren vanuit het browsermenu"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Je kan die velddefinitie niet lezen."
#. module: web
#. odoo-javascript
@ -8061,7 +8129,7 @@ msgstr "Je hebt exportrechten nodig om de /json route te gebruiken"
msgid ""
"You need to select a model before opening the dynamic placeholder selector."
msgstr ""
"Je moet een model selecteren voordat je de dynamische placeholder kiezen "
"Je moet een model selecteren voordat je de dynamische placeholder-kiezer "
"opent."
#. module: web
@ -8252,7 +8320,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "na"
#. module: web
#. odoo-javascript
@ -9229,7 +9297,7 @@ msgstr "kever"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "voor"
#. module: web
#. odoo-javascript
@ -10693,7 +10761,7 @@ msgstr "kind"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "child of"
msgstr "kind van"
msgstr "onderliggend element van"
#. module: web
#. odoo-javascript
@ -12852,7 +12920,7 @@ msgstr "empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "leeg"
#. module: web
#. odoo-javascript
@ -14682,7 +14750,7 @@ msgstr "sprinkhaan"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "groter dan of gelijk aan"
#. module: web
#. odoo-javascript
@ -15636,7 +15704,7 @@ msgstr "zandloper met lopend zand"
#. odoo-javascript
#: code:addons/web/static/src/views/calendar/calendar_common/calendar_common_popover.js:0
msgid "hours"
msgstr "uren"
msgstr "uur"
#. module: web
#. odoo-javascript
@ -15930,7 +15998,7 @@ msgstr "invoer latijnse letter"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "input Latin lowercase"
msgstr "invoer Latijnse kleine letters"
msgstr "invoer Latijnse kleine letters"
#. module: web
#. odoo-javascript
@ -15948,7 +16016,7 @@ msgstr "invoer latijnse letter"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "input latin lowercase"
msgstr "invoer latijnse kleine letters"
msgstr "invoer Latijnse kleine letters"
#. module: web
#. odoo-javascript
@ -17148,13 +17216,13 @@ msgstr "laag"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "kleiner dan of gelijk aan"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "kleiner dan"
#. module: web
#. odoo-javascript
@ -18894,7 +18962,7 @@ msgstr "geen voetgangers"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor.xml:0
msgid "no records"
msgstr "Geen records"
msgstr "geen records"
#. module: web
#. odoo-javascript
@ -19022,7 +19090,7 @@ msgstr "notities"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "numbers"
msgstr "nummers"
msgstr "getallen"
#. module: web
#. odoo-javascript
@ -19118,7 +19186,7 @@ msgstr "kantoormedewerker"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "officer"
msgstr "officier"
msgstr "Agent"
#. module: web
#. odoo-javascript
@ -22569,7 +22637,7 @@ msgstr "boodschappentassen"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "shopping cart"
msgstr "winkelwagentje"
msgstr "winkelmandje"
#. module: web
#. odoo-javascript
@ -26619,7 +26687,7 @@ msgstr "suf gezicht"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "worker"
msgstr "werker"
msgstr "werknemer"
#. module: web
#. odoo-javascript
@ -26883,7 +26951,7 @@ msgstr "— druk"
#. odoo-javascript
#: code:addons/web/static/src/core/commands/command_items.xml:0
msgid "— search for"
msgstr "— zoeken naar"
msgstr "— zoeken naar"
#. module: web
#. odoo-javascript
@ -26993,6 +27061,12 @@ msgstr "“vacature”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Er is geen emoji die overeenkomt met je zoekopdracht"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Hoek"

View file

@ -41,13 +41,15 @@
# Tomasz Leppich <t.leppich@gmail.com>, 2023
# Tadeusz Karpiński <tadeuszkarpinski@gmail.com>, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# "Marta (wacm)" <wacm@odoo.com>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 10:08+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-25 14:49+0000\n"
"Last-Translator: \"Marta (wacm)\" <wacm@odoo.com>\n"
"Language-Team: Polish <https://translate.odoo.com/projects/odoo-19/web/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
@ -56,7 +58,7 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && "
"(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && "
"n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -99,13 +101,13 @@ msgstr "(%(mbLoaded)s/%(mbTotal)sMB)"
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_edition.xml:0
msgid "(Community Edition)"
msgstr "(Edycja społecznościowa)"
msgstr "(Edycja Community)"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_items.xml:0
msgid "(change)"
msgstr "(zmiana)"
msgstr "(zmi)"
#. module: web
#. odoo-javascript
@ -333,7 +335,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -514,6 +516,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Oddzielone "
"(jeden na zakładkę)</option>\n"
" <option value=\"temporal\">Czasowy "
"(eksperymentalny)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b>Ostrzeżenie:</b> "
"Tryb czasowy scali wszystkie próbki.<br/>Może to prowadzić do częściowo "
"nieprawidłowych wyników w przypadku równoległych profili.<br/>Korzystaj "
"ostrożnie </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -573,8 +587,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr "<span itemprop=\"name\">Acme Corporation</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -927,7 +941,7 @@ msgstr "Dodaj zdjęcie"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Dodaj właściwość"
#. module: web
#. odoo-javascript
@ -1011,13 +1025,13 @@ msgstr "Dostosuj swoje filtry i stwórz nowy rekord."
#. odoo-javascript
#: code:addons/web/static/src/core/signature/signature_dialog.xml:0
msgid "Adopt & Sign"
msgstr "Zaadaptuj i podpisz"
msgstr "Przyjmij i podpisz"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/signature/signature_dialog.xml:0
msgid "Adopt Your Signature"
msgstr "Zaadoptuj swój podpis"
msgstr "Przyjmij swój podpis"
#. module: web
#. odoo-javascript
@ -1194,13 +1208,13 @@ msgstr "Czy na pewno chcesz usunąć to osadzone działanie?"
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
msgstr "Czy na pewno chcesz usunąć wybrane rekordy z pliku %(nbSelected)s?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Czy na pewno chcesz usunąć wybrany rekord?"
#. module: web
#. odoo-javascript
@ -1218,7 +1232,7 @@ msgstr "Czy na pewno chcesz usunąć tę kolumnę?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Czy na pewno chcesz usunąć to pole właściwości?"
#. module: web
#. odoo-javascript
@ -1338,13 +1352,13 @@ msgstr "POWRÓT"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "BACK arrow"
msgstr "Strzałka powrotu"
msgstr "Strzałka WSTECZ"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/dynamic_placeholder_popover.xml:0
msgid "Back"
msgstr "Powrót"
msgstr "Wstecz"
#. module: web
#. odoo-javascript
@ -1461,7 +1475,7 @@ msgstr "Niebieski"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js:0
msgid "Boolean Icon"
msgstr "Ikona Boolean"
msgstr "Ikona Logiczna"
#. module: web
#. odoo-javascript
@ -1470,8 +1484,8 @@ msgid ""
"Boolean field from the model used in the relation, which indicates whether "
"the state is folded or not."
msgstr ""
"Pole typu Boolean z modelu używanego w relacji, które wskazuje, czy stan "
"jest złożony, czy nie."
"Pole logiczne z modelu używanego w relacji, które wskazuje, czy stan jest "
"złożony, czy nie."
#. module: web
#. odoo-javascript
@ -1516,7 +1530,7 @@ msgid ""
"all purposes when it is used on documents, including legally binding "
"contracts."
msgstr ""
"Klikając przycisk Zaadaptuj i podpisz, zgadzam się, że wybrany podpis/"
"Klikając przycisk zaakceptuj i podpisz, zgadzam się, że wybrany podpis/"
"inicjały będzie ważną elektroniczną reprezentacją mojego odręcznego podpisu/"
"inicjałów dla wszystkich celów, kiedy będzie używany na dokumentach, w tym "
"na prawnie wiążących umowach."
@ -1538,7 +1552,7 @@ msgstr "Bajty"
#. odoo-javascript
#: code:addons/web/static/src/core/utils/binary.js:0
msgid "Bytes|Kb|Mb|Gb|Tb|Pb|Eb|Zb|Yb"
msgstr "Bytes|Kb|Mb|Gb|Tb|Pb|Eb|Zb|Yb"
msgstr "Bajty|Kb|Mb|Gb|Tb|Pb|Eb|Zb|Yb"
#. module: web
#. odoo-javascript
@ -1690,7 +1704,7 @@ msgstr "Pole wyboru"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/many2many_checkboxes/many2many_checkboxes_field.js:0
msgid "Checkboxes"
msgstr "Checkboxy"
msgstr "Pola wyboru"
#. module: web
#. odoo-javascript
@ -1917,7 +1931,7 @@ msgstr ""
#: code:addons/web/static/src/core/debug/debug_menu_items.xml:0
#: code:addons/web/static/src/views/debug_items.js:0
msgid "Computed Arch"
msgstr "Wyliczona architektura"
msgstr "Obliczony arch"
#. module: web
#. odoo-javascript
@ -1928,7 +1942,7 @@ msgstr "Warunek:"
#. module: web
#: model:ir.model,name:web.model_res_config_settings
msgid "Config Settings"
msgstr "Ustawienia konfiguracji"
msgstr "Konfiguracja ustawień"
#. module: web
#: model:ir.actions.act_window,name:web.action_base_document_layout_configurator
@ -2070,13 +2084,13 @@ msgstr "Skopiuj do schowka"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.frontend_layout
msgid "Copyright &amp;copy;"
msgstr "Prawa autorskie &amp;copy;"
msgstr "Copyright &amp;copy;"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_edition.xml:0
msgid "Copyright © 2004"
msgstr "Prawa autorskie © 2004"
msgstr "Copyright © 2004"
#. module: web
#. odoo-javascript
@ -2143,7 +2157,7 @@ msgstr "Utwórz"
#: code:addons/web/static/src/views/fields/properties/property_tags.js:0
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Create \"%s\""
msgstr "Stwórz \"%s\""
msgstr "Utwórz \"%s\""
#. module: web
#. odoo-javascript
@ -2166,7 +2180,7 @@ msgstr "Twórz i edytuj..."
#. odoo-javascript
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Create..."
msgstr "Stwórz..."
msgstr "Utwórz..."
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__create_uid
@ -2208,7 +2222,7 @@ msgstr "Waluta"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Pole waluty"
#. module: web
#. odoo-javascript
@ -2220,13 +2234,13 @@ msgstr "Pole wartości bieżącej"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_custom_tab.js:0
msgid "Custom"
msgstr "Własne"
msgstr "Niestandardowe"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
msgid "Custom %s"
msgstr "Własny %s"
msgstr "Niestandardowy %s"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__custom_colors
@ -2263,7 +2277,7 @@ msgstr "Niestandardowa grupa"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Custom range"
msgstr ""
msgstr "Zakres niestandardowy"
#. module: web
#. odoo-python
@ -2330,7 +2344,7 @@ msgstr "Data i czas"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Format daty"
#. module: web
#. odoo-javascript
@ -2641,6 +2655,8 @@ msgid ""
"Displays or hides the seconds in the datetime value. Affect only the "
"readable datetime format."
msgstr ""
"Wyświetla lub ukrywa sekundy w wartości datetime. Wpływa tylko na czytelny "
"format datetime."
#. module: web
#. odoo-javascript
@ -2652,7 +2668,7 @@ msgstr "Wyświetla lub ukrywa czas w wartości daty/godziny."
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Displays the date either in 31/01/%(year)s or in Jan 31, %(year)s"
msgstr ""
msgstr "Wyświetla datę w formacie 31/01/%(year)s lub 31 stycznia %(year)s"
#. module: web
#. odoo-javascript
@ -2762,7 +2778,7 @@ msgstr "Podpisz"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record.xml:0
msgid "Dropdown menu"
msgstr "Menu rozwijane"
msgstr "Rozwijane menu"
#. module: web
#. odoo-javascript
@ -2876,7 +2892,7 @@ msgstr "E-mail"
#. module: web
#: model:ir.model.fields,field_description:web.field_res_users_settings__embedded_actions_config_ids
msgid "Embedded Actions Config"
msgstr ""
msgstr "Konfiguracja osadzonych działań"
#. module: web
#. odoo-javascript
@ -3243,6 +3259,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Na przykład, jeśli wartość wynosi „1”, a wprowadzisz „+=2”, zostanie ona "
"zaktualizowana do „3”."
#. module: web
#. odoo-javascript
@ -3420,6 +3438,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Uwaga! Twoje ostatnie zmiany są zbyt duże, aby można je było zapisać "
"automatycznie. Kliknij przycisk %(upload_icon)s, aby zapisać swoją pracę "
"przed zamknięciem tej karty."
#. module: web
#. odoo-javascript
@ -3490,7 +3511,7 @@ msgstr "Menu główne"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Godzina"
#. module: web
#. odoo-python
@ -3592,6 +3613,16 @@ msgstr ""
"koloru jest również ustawione, edycja tagu będzie nadrzędna. Tak więc "
"selektor kolorów nie będzie wyświetlany po kliknięciu tagu."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
"Jeśli zaznaczysz tę opcję, pola wyboru będą wyświetlane w kolumnie. W "
"przeciwnym razie będą one wyświetlane w linii."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3748,7 +3779,7 @@ msgstr "Interwał"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Nieprawidłowa nazwa wyświetlana"
#. module: web
#. odoo-javascript
@ -3912,18 +3943,20 @@ msgid ""
"It will be removed for everyone using the \"%(parentName)s\" %"
"(parentFieldLabel)s."
msgstr ""
"Zostanie on usunięty dla wszystkich korzystających z „%(parentName)s ” %"
"(parentFieldLabel)s."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "It will be removed for everyone!"
msgstr ""
msgstr "Zostanie usunięty dla wszystkich!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Jan 31, %s"
msgstr ""
msgstr "31 stycznia %s"
#. module: web
#. odoo-javascript
@ -4172,19 +4205,19 @@ msgstr "Duży"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Ostatnie 12 miesięcy"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Ostatnie 30 dni"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Ostatnie 7 dni"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4202,7 +4235,7 @@ msgstr "Data ostatniej aktualizacji"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Ostatni miesiąc"
#. module: web
#. odoo-javascript
@ -4345,7 +4378,7 @@ msgstr "Wyloguj"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Login"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4499,12 +4532,12 @@ msgstr "Temat spotkania"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory limit (in bytes)"
msgstr ""
msgstr "Limit pamięci (w bajtach)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Memory profile"
msgstr ""
msgstr "Profil pamięci"
#. module: web
#. odoo-javascript
@ -4550,6 +4583,12 @@ msgstr "Droga Mleczna"
msgid "Minimal precision"
msgstr "Minimalna precyzja"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr "Minimalna liczba cyfr"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4578,7 +4617,7 @@ msgstr "Brakuje id rekordu"
#. odoo-javascript
#: code:addons/web/static/src/model/relational_model/record.js:0
msgid "Missing required fields"
msgstr ""
msgstr "Brakujące pola obowiązkowe"
#. module: web
#. odoo-javascript
@ -4665,7 +4704,7 @@ msgstr "Miesiąc"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Month to date"
msgstr ""
msgstr "Za miesiąc"
#. module: web
#. odoo-javascript
@ -4789,7 +4828,7 @@ msgstr "Moje konto Odoo.com"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "My Preferences"
msgstr ""
msgstr "Moje preferencje"
#. module: web
#. odoo-javascript
@ -4844,7 +4883,7 @@ msgstr "Nowe wydarzenie"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "New Property"
msgstr "Nowa własność"
msgstr "Nowa właściwość"
#. module: web
#. odoo-javascript
@ -4877,7 +4916,7 @@ msgstr "Nowy:"
#: code:addons/web/static/src/core/pager/pager.xml:0
#: code:addons/web/static/src/views/calendar/calendar_controller.xml:0
msgid "Next"
msgstr "Następny"
msgstr "Dalej"
#. module: web
#. odoo-javascript
@ -4962,6 +5001,12 @@ msgstr "Brak danych"
msgid "No data to display"
msgstr "Brak danych do wyświetlenia"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "Brak danych do eksportu"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4977,8 +5022,8 @@ msgstr "Nie można znaleźć żadnego urządzenia."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Żadne emoji nie pasuje do Twojego wyszukiwania"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5029,7 +5074,7 @@ msgstr "Nic nie znaleziono"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Brak wyników"
#. module: web
#. odoo-javascript
@ -5085,6 +5130,8 @@ msgid ""
"Not possible to create monetary field because there is no currency on "
"current model."
msgstr ""
"Nie można utworzyć pola monetarnego, ponieważ w bieżącym modelu nie ma "
"waluty."
#. module: web
#. odoo-javascript
@ -5255,7 +5302,6 @@ msgstr "O kurcze!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5767,7 +5813,7 @@ msgstr "Właściwości"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Ogólna definicja właściwości"
#. module: web
#. odoo-javascript
@ -5898,7 +5944,7 @@ msgstr "Reguły rekordu"
#. odoo-javascript
#: code:addons/web/static/src/webclient/debug/profiling/profiling_item.xml:0
msgid "Record memory"
msgstr ""
msgstr "Pamięć rekordu"
#. module: web
#. odoo-javascript
@ -6534,7 +6580,7 @@ msgstr "Ustaw strefę czasową na swoim użytkowniku"
#: code:addons/web/static/src/views/fields/badge/badge_field.js:0
#: code:addons/web/static/src/views/fields/badge_selection/list_badge_selection_field.js:0
msgid "Set an integer field to use colors with the badge."
msgstr ""
msgstr "Ustaw pole liczby całkowitej, aby używać kolorów z plakietką."
#. module: web
#. odoo-javascript
@ -6683,8 +6729,8 @@ msgid ""
"Something went wrong... If you really are stuck, share the report with your "
"friendly support service"
msgstr ""
"Coś poszło nie tak... Jeśli utknąłeś, udostępnij raport przyjaznemu działowi "
"wsparcia"
"Coś poszło nie tak... Jeśli utknąłeś, udostępnij raport naszemu "
"sympatycznemu działowi wsparcia"
#. module: web
#. odoo-javascript
@ -6701,10 +6747,11 @@ msgstr "Specjalne:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Ułożone"
@ -6806,7 +6853,7 @@ msgstr "Błąd stylu"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufiks"
#. module: web
#. odoo-javascript
@ -7021,11 +7068,19 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr "W domenie nie powinny występować wartości inne niż literały."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Plik nie jest obrazem, zmiana rozmiaru nie jest możliwa."
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
msgid "The ids in %(field_name)s must not be duplicated: “%(action_ids)s”"
msgstr ""
"Identyfikatory w pliku %(field_name)s nie mogą się powtarzać: „%"
"(action_ids)s”"
#. module: web
#. odoo-python
@ -7034,6 +7089,8 @@ msgid ""
"The ids in %(field_name)s must only be integers or \"false\": “%"
"(action_ids)s”"
msgstr ""
"Identyfikatory w pliku %(field_name)s muszą być wyłącznie liczbami "
"całkowitymi lub wartością „false”: „%(action_ids)s”"
#. module: web
#. odoo-javascript
@ -7046,6 +7103,12 @@ msgstr ""
"Operacja została przerwana. Zwykle oznacza to, że bieżąca operacja zajmuje "
"zbyt dużo czasu."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Zmiana rozmiaru obrazu nie powiodła się"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7081,6 +7144,8 @@ msgid ""
"The user should have one unique embedded action setting per user setting, "
"action and record id."
msgstr ""
"Użytkownik powinien mieć jedno unikalne ustawienie akcji osadzonej na każde "
"ustawienie użytkownika, akcję i identyfikator rekordu."
#. module: web
#. odoo-javascript
@ -7280,7 +7345,7 @@ msgstr "Przełącz panel wyszukiwania"
#. odoo-javascript
#: code:addons/web/static/src/core/datetime/datetime_picker.xml:0
msgid "Toggle date range mode"
msgstr ""
msgstr "Przełącz tryb zakresu dat"
#. module: web
#. odoo-javascript
@ -7658,6 +7723,7 @@ msgid ""
"Use the operators \"+=\", \"-=\", \"*=\" and \"/=\" to update the current "
"value."
msgstr ""
"Użyj operatorów „+=”, „-=”, „*=” i „/=” aby zaktualizować bieżącą wartość."
#. module: web
#. odoo-javascript
@ -7704,12 +7770,12 @@ msgstr "Interfejs użytkownika"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Ustawienia użytkownika"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
msgid "User Settings for Embedded Actions"
msgstr ""
msgstr "Ustawienia użytkownika dla działań osadzonych"
#. module: web
#. odoo-javascript
@ -7868,6 +7934,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Ostrzeżenie"
@ -8003,7 +8070,7 @@ msgstr "Rok"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Year to date"
msgstr ""
msgstr "Rok do chwili obecnej"
#. module: web
#. odoo-javascript
@ -8052,7 +8119,7 @@ msgstr "Możesz zainstalować aplikację z menu przeglądarki"
#. odoo-python
#: code:addons/web/models/properties_base_definition.py:0
msgid "You can not read that field definition."
msgstr ""
msgstr "Nie można odczytać tej definicji pola."
#. module: web
#. odoo-javascript
@ -8274,7 +8341,7 @@ msgstr "Eskulap"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "po"
#. module: web
#. odoo-javascript
@ -9251,7 +9318,7 @@ msgstr "żuk"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "before"
msgstr ""
msgstr "przed"
#. module: web
#. odoo-javascript
@ -12874,7 +12941,7 @@ msgstr "empanada"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "pusty"
#. module: web
#. odoo-javascript
@ -14704,7 +14771,7 @@ msgstr "konik polny"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater or equal to"
msgstr ""
msgstr "większy lub równy"
#. module: web
#. odoo-javascript
@ -17170,13 +17237,13 @@ msgstr "niski"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower or equal to"
msgstr ""
msgstr "niższy lub równy"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "lower than"
msgstr ""
msgstr "niższy niż"
#. module: web
#. odoo-javascript
@ -26899,7 +26966,7 @@ msgstr "zombie"
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.xml:0
msgid "— press"
msgstr "- prasa"
msgstr "— naciśnij"
#. module: web
#. odoo-javascript
@ -27015,6 +27082,12 @@ msgstr "\"wakat\""
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Żadne emoji nie pasuje do Twojego wyszukiwania"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Kąt"

View file

@ -22,13 +22,14 @@
# Manuela Silva <mmsrs@sky.com>, 2023
# Reinaldo Ramos <reinaldo.ramos@arxi.pt>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 21:36+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 19:01+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Portuguese <https://translate.odoo.com/projects/odoo-19/web/"
"pt/>\n"
"Language: pt\n"
@ -554,8 +555,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2312,7 +2313,7 @@ msgstr "Data & Hora"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Formato de Data"
#. module: web
#. odoo-javascript
@ -3470,7 +3471,7 @@ msgstr "Menu da página inicial"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Hora"
#. module: web
#. odoo-python
@ -3571,6 +3572,14 @@ msgstr ""
"edição do marcador prevalecerá. Portanto, o seletor de cores não será "
"exibido ao clicar no marcador."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4158,13 +4167,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Últimos 30 dias"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Últimos 7 dias"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4325,7 +4334,7 @@ msgstr "Terminar sessão"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Início de Sessão"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4530,6 +4539,12 @@ msgstr "Via Láctea"
msgid "Minimal precision"
msgstr "Precisão mínima"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4942,6 +4957,12 @@ msgstr "Nenhum dado"
msgid "No data to display"
msgstr "Sem dados a mostrar"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4957,8 +4978,8 @@ msgstr "Nenhum dispositivo encontrado."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Nenhum emoji corresponde à sua busca"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5009,7 +5030,7 @@ msgstr "Nenhum resultado encontrado"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Nenhum resultado"
#. module: web
#. odoo-javascript
@ -5235,7 +5256,6 @@ msgstr "Ops!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6685,10 +6705,11 @@ msgstr "Especial:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Empilhados"
@ -6790,7 +6811,7 @@ msgstr "Erro de estilo"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufixo"
#. module: web
#. odoo-javascript
@ -7003,6 +7024,12 @@ msgstr "O domínio envolve não literais. Sua avaliação pode falhar."
msgid "The domain should not involve non-literals"
msgstr "O domínio não deve envolver não literais"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -7028,6 +7055,12 @@ msgstr ""
"A operação foi interrompida. Isso geralmente significa que a operação atual "
"está demorando muito."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7688,7 +7721,7 @@ msgstr "Interface do usuário"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Configurações do Utilizador"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7852,6 +7885,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Aviso"
@ -8259,7 +8293,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "após"
#. module: web
#. odoo-javascript
@ -27000,6 +27034,12 @@ msgstr "“vagas”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Nenhum emoji corresponde à sua busca"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Ângulo"

View file

@ -13,13 +13,15 @@
# Kevilyn Rosa, 2023
# Éder Brito <britoederr@gmail.com>, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# "Maitê Dietze (madi)" <madi@odoo.com>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 10:08+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-12-27 08:37+0000\n"
"Last-Translator: \"Maitê Dietze (madi)\" <madi@odoo.com>\n"
"Language-Team: Portuguese (Brazil) <https://translate.odoo.com/projects/"
"odoo-19/web/pt_BR/>\n"
"Language: pt_BR\n"
@ -28,7 +30,7 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : ((n != 0 && n % "
"1000000 == 0) ? 1 : 2);\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -305,7 +307,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -486,6 +488,17 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Separados (um "
"por aba)</option>\n"
" <option value=\"temporal\">Temporal "
"(experimental)</option>\n"
" </select> <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b> Aviso:</b> O modo "
"temporal mescla todas as amostras.<br/>Isso pode levar a resultados "
"parcialmente inválidos no caso de perfis simultâneos.<br/>Use com cautela </"
"span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -545,8 +558,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -901,7 +914,7 @@ msgstr "Adicionar foto"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.xml:0
msgid "Add Property"
msgstr ""
msgstr "Adicionar propriedade"
#. module: web
#. odoo-javascript
@ -1169,12 +1182,13 @@ msgstr "Tem certeza de que quer remover essa ação incorporada?"
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the %(nbSelected)s selected records?"
msgstr ""
"Tem certeza de que quer excluir os registros selecionados %(nbSelected)s?"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/multi_selection_buttons.js:0
msgid "Are you sure you want to delete the selected record?"
msgstr ""
msgstr "Tem certeza de que quer excluir o registro selecionado?"
#. module: web
#. odoo-javascript
@ -1192,7 +1206,7 @@ msgstr "Tem certeza de que quer excluir esta coluna?"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/properties_field.js:0
msgid "Are you sure you want to delete this property field?"
msgstr ""
msgstr "Tem certeza de que deseja excluir este campo de propriedade?"
#. module: web
#. odoo-javascript
@ -2182,7 +2196,7 @@ msgstr "Moeda"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Campo de moeda"
#. module: web
#. odoo-javascript
@ -2303,7 +2317,7 @@ msgstr "Data e hora"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Formato de data"
#. module: web
#. odoo-javascript
@ -3461,7 +3475,7 @@ msgstr "Menu da página inicial"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Hora"
#. module: web
#. odoo-python
@ -3562,6 +3576,14 @@ msgstr ""
"edição do marcador prevalecerá. Portanto, o seletor de cores não será "
"exibido ao clicar no marcador."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4143,19 +4165,19 @@ msgstr "Grande"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "Últimos 12 meses"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Últimos 30 dias"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Últimos 7 dias"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4173,7 +4195,7 @@ msgstr "Última atualização em"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Último mês"
#. module: web
#. odoo-javascript
@ -4316,7 +4338,7 @@ msgstr "Sair"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Login"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4521,6 +4543,12 @@ msgstr "Via Láctea"
msgid "Minimal precision"
msgstr "Precisão mínima"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4933,6 +4961,12 @@ msgstr "Nenhum dado"
msgid "No data to display"
msgstr "Nenhum dado para exibir"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4948,8 +4982,8 @@ msgstr "Nenhum dispositivo encontrado."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Nenhum emoji corresponde à sua busca"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5000,7 +5034,7 @@ msgstr "Nenhum resultado encontrado"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Nenhum resultado"
#. module: web
#. odoo-javascript
@ -5226,7 +5260,6 @@ msgstr "Ops!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6676,10 +6709,11 @@ msgstr "Especial:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Empilhado"
@ -6781,7 +6815,7 @@ msgstr "Erro de estilo"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufixo"
#. module: web
#. odoo-javascript
@ -6994,6 +7028,12 @@ msgstr "O domínio envolve não literais. Sua avaliação pode falhar."
msgid "The domain should not involve non-literals"
msgstr "O domínio não deve envolver não literais"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -7019,6 +7059,12 @@ msgstr ""
"A operação foi interrompida. Isso geralmente significa que a operação atual "
"está demorando muito."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7679,7 +7725,7 @@ msgstr "Interface do usuário"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Configurações do usuário"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7843,6 +7889,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Aviso"
@ -8250,7 +8297,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "após"
#. module: web
#. odoo-javascript
@ -26991,6 +27038,12 @@ msgstr "“vagas”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Nenhum emoji corresponde à sua busca"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Ângulo"

File diff suppressed because it is too large Load diff

View file

@ -4,13 +4,15 @@
#
# Translators:
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# "Anastasiia Koroleva (koan)" <koan@odoo.com>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 17.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 02:34+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-11 17:40+0000\n"
"Last-Translator: \"Anastasiia Koroleva (koan)\" <koan@odoo.com>\n"
"Language-Team: Russian <https://translate.odoo.com/projects/odoo-19/web/ru/"
">\n"
"Language: ru\n"
@ -20,7 +22,7 @@ msgstr ""
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -451,12 +453,12 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "<i class=\"fa fa-download\"/> (html)"
msgstr ""
msgstr "<i class=\"fa fa-download\"/> (HTML)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "<i class=\"fa fa-download\"/> (json)"
msgstr ""
msgstr "<i class=\"fa fa-download\"/> (JSON)"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
@ -537,8 +539,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -823,7 +825,7 @@ msgstr "Действия"
#. odoo-javascript
#: code:addons/web/static/src/search/cog_menu/cog_menu.xml:0
msgid "Actions menu"
msgstr ""
msgstr "Меню действий"
#. module: web
#. odoo-javascript
@ -881,7 +883,7 @@ msgstr "Добавить"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/x2many/x2many_field.js:0
msgid "Add %s"
msgstr ""
msgstr "Добавить: %s"
#. module: web
#. odoo-javascript
@ -994,12 +996,12 @@ msgstr "Африка"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Aggregate SQL"
msgstr ""
msgstr "Агрегировать SQL"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Aggregation mode"
msgstr ""
msgstr "Режим агрегации"
#. module: web
#. odoo-javascript
@ -1746,7 +1748,7 @@ msgstr "Очистить всё"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record.xml:0
msgid "Click to select"
msgstr ""
msgstr "Нажмите, чтобы выбрать"
#. module: web
#. odoo-javascript
@ -1930,7 +1932,7 @@ msgstr "Соединение восстановлено. Вы снова онл
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Constant Time"
msgstr ""
msgstr "Константное время"
#. module: web
#: model:ir.model,name:web.model_res_partner
@ -2086,7 +2088,7 @@ msgstr "Количество"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.js:0
msgid "Count Limit"
msgstr ""
msgstr "Ограничение кол-ва"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__country_id
@ -2117,7 +2119,7 @@ msgstr "Создать %s"
#. module: web
#: model:ir.model,website_form_label:web.model_res_partner
msgid "Create a Customer"
msgstr ""
msgstr "Создать клиента"
#. module: web
#. odoo-javascript
@ -2171,7 +2173,7 @@ msgstr "Валюта"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Поле валюты"
#. module: web
#. odoo-javascript
@ -2183,7 +2185,7 @@ msgstr "Поле текущего значения"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_custom_tab.js:0
msgid "Custom"
msgstr ""
msgstr "Пользовательский"
#. module: web
#. odoo-javascript
@ -2294,7 +2296,7 @@ msgstr "Дата и время"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Формат даты"
#. module: web
#. odoo-javascript
@ -2574,7 +2576,7 @@ msgstr "Отображать в карточках"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Display presets"
msgstr ""
msgstr "Отобразить пресеты"
#. module: web
#. odoo-javascript
@ -2811,7 +2813,7 @@ msgstr "Редактировать теги"
#. odoo-javascript
#: code:addons/web/static/src/search/search_bar_menu/search_bar_menu.xml:0
msgid "Edit favorite"
msgstr ""
msgstr "Редактировать избранное"
#. module: web
#. odoo-javascript
@ -2983,7 +2985,7 @@ msgstr "Внешний ID"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_field.js:0
msgid "Extra Rights"
msgstr ""
msgstr "Дополнительные права"
#. module: web
#. odoo-javascript
@ -3014,7 +3016,7 @@ msgstr "Коэффициент"
#. odoo-javascript
#: code:addons/web/static/src/search/search_model.js:0
msgid "Failed to evaluate the context: %(context)s."
msgstr ""
msgstr "Не удалось обработать контекст: %(context)s."
#. module: web
#. odoo-javascript
@ -3062,7 +3064,7 @@ msgstr "Феррис"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/field_selector/field_selector_field.js:0
msgid "Field Selector"
msgstr ""
msgstr "Выбор поля"
#. module: web
#. odoo-javascript
@ -3235,12 +3237,12 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Frames"
msgstr ""
msgstr "Фреймы"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Frames + sql (Combined)"
msgstr ""
msgstr "Фреймы + SQL (Объединенные)"
#. module: web
#. odoo-javascript
@ -3331,7 +3333,7 @@ msgstr "Зеленый"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_popover.xml:0
msgid "Group"
msgstr ""
msgstr "Группа"
#. module: web
#. odoo-javascript
@ -3349,7 +3351,7 @@ msgstr "Группировать по"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.js:0
msgid "HTML"
msgstr ""
msgstr "HTML"
#. module: web
#: model:ir.model,name:web.model_ir_http
@ -3386,7 +3388,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "Help"
msgstr ""
msgstr "Поддержка"
#. module: web
#. odoo-javascript
@ -3449,7 +3451,7 @@ msgstr "Главное меню"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Час"
#. module: web
#. odoo-python
@ -3473,7 +3475,7 @@ msgstr "Как получить приложение"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "Оттенок"
#. module: web
#. odoo-javascript
@ -3550,6 +3552,14 @@ msgstr ""
"тега будет иметь приоритет. Поэтому палитра цветов не будет отображаться при "
"нажатии на тег."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3597,7 +3607,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.js:0
msgid "If true, non-literals are accepted"
msgstr ""
msgstr "Если значение установлено в TRUE, допускаются нелитералы"
#. module: web
#. odoo-javascript
@ -3702,7 +3712,7 @@ msgstr "Интервал"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record_quick_create.js:0
msgid "Invalid Display Name"
msgstr ""
msgstr "Недопустимое отображаемое имя"
#. module: web
#. odoo-javascript
@ -3744,7 +3754,7 @@ msgstr "Недействительные адреса электронной п
#. odoo-javascript
#: code:addons/web/static/src/webclient/settings_form_view/widgets/res_config_invite_users.js:0
msgid "Invalid email addresses: %(two_addresses)s"
msgstr ""
msgstr "Недействительные адреса электронной почты: %(two_addresses)s"
#. module: web
#. odoo-javascript
@ -4132,13 +4142,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Последние 30 дней"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Последние 7 дней"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4156,7 +4166,7 @@ msgstr "Дата последнего обновления:"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Прошлый месяц"
#. module: web
#. odoo-javascript
@ -4299,7 +4309,7 @@ msgstr "Выйти"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Войти"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4504,6 +4514,12 @@ msgstr "Млечный Путь"
msgid "Minimal precision"
msgstr "Минимальная точность"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4719,7 +4735,7 @@ msgstr "Многострочный текст"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Multiple profile"
msgstr ""
msgstr "Множественный профиль"
#. module: web
#. odoo-javascript
@ -4916,6 +4932,12 @@ msgstr "Нет данных"
msgid "No data to display"
msgstr "Нет данных для отображения"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4931,8 +4953,8 @@ msgstr "Устройство не найдено."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Эмодзи по вашему запросу не найдены"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4983,7 +5005,7 @@ msgstr "Результатов не найдено"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Нет результатов"
#. module: web
#. odoo-javascript
@ -5209,7 +5231,6 @@ msgstr "Ох!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5276,6 +5297,8 @@ msgstr "Упс!"
#: code:addons/web/static/src/views/fields/file_handler.js:0
msgid "Oops! '%(fileName)s' didnt upload since its format isnt allowed."
msgstr ""
"Ой! Файл «%(fileName)s» не был загружен, так как его формат не "
"поддерживается."
#. module: web
#. odoo-javascript
@ -5300,7 +5323,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Open"
msgstr ""
msgstr "Открыть"
#. module: web
#. odoo-javascript
@ -5676,7 +5699,7 @@ msgstr "Печать"
#. odoo-javascript
#: code:addons/web/static/src/search/cog_menu/cog_menu.js:0
msgid "Print report: %s"
msgstr ""
msgstr "Печать отчета: %s"
#. module: web
#. odoo-javascript
@ -6093,12 +6116,12 @@ msgstr "Кнопка SOS"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "SQL density"
msgstr ""
msgstr "Плотность SQL"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "SQL no gap"
msgstr ""
msgstr "SQL без разрывов"
#. module: web
#. odoo-javascript
@ -6255,7 +6278,7 @@ msgstr "Поиск меню..."
#. odoo-javascript
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Search more..."
msgstr ""
msgstr "Искать больше..."
#. module: web
#. odoo-javascript
@ -6607,7 +6630,7 @@ msgstr "Смайлики и эмоции"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_solid_tab.js:0
msgid "Solid"
msgstr ""
msgstr "Сплошная"
#. module: web
#. odoo-javascript
@ -6628,8 +6651,8 @@ msgid ""
"Something went wrong... If you really are stuck, share the report with your "
"friendly support service"
msgstr ""
"Что-то пошло не так... Если вы действительно застряли, поделитесь отчетом с "
"вашей дружелюбной службой поддержки"
"Что-то пошло не так... Если вы не можете решить проблему самостоятельно, "
"поделитесь отчетом с нашей службой поддержки"
#. module: web
#. odoo-javascript
@ -6646,10 +6669,11 @@ msgstr "Специальный:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "С накоплением"
@ -6751,7 +6775,7 @@ msgstr "Ошибка стиля"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Суффикс"
#. module: web
#. odoo-javascript
@ -6956,13 +6980,19 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.js:0
msgid "The domain involves non-literals. Their evaluation might fail."
msgstr ""
msgstr "Домен содержит нелитералы. Их вычисление может завершиться с ошибкой."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.js:0
msgid "The domain should not involve non-literals"
msgstr ""
msgstr "Домен не должен содержать нелитералы"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr "Этот файл не является изображением, изменение размера невозможно"
#. module: web
#. odoo-python
@ -6989,6 +7019,12 @@ msgstr ""
"Операция была прервана. Обычно это означает, что текущая операция занимает "
"слишком много времени."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr "Ошибка при изменении размера изображения"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7065,7 +7101,7 @@ msgstr "Этот блок присутствует не всегда в зави
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "This date is in the future"
msgstr ""
msgstr "Эта дата в будущем"
#. module: web
#. odoo-javascript
@ -7357,7 +7393,7 @@ msgstr "Тип:"
#: code:addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js:0
#: code:addons/web/static/src/views/fields/many2one/many2one_field.js:0
msgid "Typeahead search"
msgstr ""
msgstr "Автопоиск"
#. module: web
#. odoo-javascript
@ -7491,7 +7527,7 @@ msgstr "Без названия"
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_confirmation_dialog.xml:0
msgid "Update"
msgstr ""
msgstr "Обновить"
#. module: web
#. odoo-javascript
@ -7578,7 +7614,7 @@ msgstr "Использовать другого пользователя"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Use execution context"
msgstr ""
msgstr "Использовать контекст выполнения"
#. module: web
#. odoo-javascript
@ -7638,7 +7674,7 @@ msgstr "Интерфейс пользователя"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Настройки пользователя"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7802,6 +7838,7 @@ msgstr "Туалет"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Предупреждение"
@ -8207,7 +8244,7 @@ msgstr "эскулап"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "после"
#. module: web
#. odoo-javascript
@ -14643,7 +14680,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater than"
msgstr ""
msgstr "больше чем"
#. module: web
#. odoo-javascript
@ -25452,7 +25489,7 @@ msgstr "вирус"
#. odoo-python
#: code:addons/web/controllers/vcard.py:0
msgid "vobject library is not installed"
msgstr ""
msgstr "библиотека vobject не установлена"
#. module: web
#. odoo-javascript
@ -26948,6 +26985,12 @@ msgstr "«вакансия»"
msgid "ココ"
msgstr "Коко"
#~ msgid "No emoji matches your search"
#~ msgstr "Эмодзи по вашему запросу не найдены"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Error"
#~ msgstr "Ошибка"

File diff suppressed because it is too large Load diff

View file

@ -16,13 +16,14 @@
# Tadej Lupšina <tadej@hbs.si>, 2023
# Tomaž Jug <tomaz@editor.si>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 21:28+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 19:01+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Slovenian <https://translate.odoo.com/projects/odoo-19/web/sl/"
">\n"
"Language: sl\n"
@ -540,7 +541,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -2140,7 +2141,7 @@ msgstr "Valuta"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Polje Valuta"
#. module: web
#. odoo-javascript
@ -2261,7 +2262,7 @@ msgstr "Datum & čas"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Oblika datuma"
#. module: web
#. odoo-javascript
@ -3402,7 +3403,7 @@ msgstr "Meni \"Domov\""
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Ura"
#. module: web
#. odoo-python
@ -3423,7 +3424,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "Odtenek"
#. module: web
#. odoo-javascript
@ -3496,6 +3497,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3646,7 +3655,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
msgid "Invalid Operation"
msgstr ""
msgstr "Neveljavna operacija"
#. module: web
#. odoo-javascript
@ -4060,13 +4069,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Zadnjih 30 dni"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Zadnjih 7 dni"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4227,7 +4236,7 @@ msgstr "Odjava"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Prijava"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4432,6 +4441,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4844,6 +4859,12 @@ msgstr "Ni podatkov"
msgid "No data to display"
msgstr "Ni podatkov za prikaz"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4859,7 +4880,7 @@ msgstr "Ni mogoče najti nobene naprave."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4911,7 +4932,7 @@ msgstr "Ni najdenih rezultatov"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Ni rezultatov"
#. module: web
#. odoo-javascript
@ -5133,7 +5154,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5737,6 +5757,10 @@ msgid ""
"\n"
"Think twice before you click that 'Delete' button!"
msgstr ""
"Pripravljeni, da zapis izgine v nič? Ste prepričani?\n"
"Izginil bo za vedno!\n"
"\n"
"Premislite dvakrat, preden kliknete gumb 'Izbriši'!"
#. module: web
#. odoo-javascript
@ -6557,6 +6581,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Zloženo"
@ -6658,7 +6683,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Pripona"
#. module: web
#. odoo-javascript
@ -6869,6 +6894,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6892,6 +6923,12 @@ msgid ""
"is taking too much time."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7332,7 +7369,7 @@ msgstr "Nedoločeno"
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_header.xml:0
msgid "Unfold"
msgstr ""
msgstr "Razvij"
#. module: web
#. odoo-javascript
@ -7518,7 +7555,7 @@ msgstr "Uporabniški vmesnik"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Uporabniške nastavitve"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7615,7 +7652,7 @@ msgstr "Prikaz"
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_renderer.xml:0
msgid "View Button"
msgstr ""
msgstr "Gumb za prikaz"
#. module: web
#. odoo-javascript
@ -7682,6 +7719,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Opozorilo"
@ -8078,7 +8116,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "po"
#. module: web
#. odoo-javascript
@ -12187,7 +12225,7 @@ msgstr "dokument"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "does not contain"
msgstr ""
msgstr "ne vsebuje"
#. module: web
#. odoo-javascript

File diff suppressed because it is too large Load diff

View file

@ -1,29 +1,30 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * web
# * web
#
# Translators:
# Djordje Marjanovic <djvmarjanovic@gmail.com>, 2022
# Bojan Borovnjak <bojan.borovnjak@modoolar.com>, 2022
# Martin Trigaux, 2022
# Uros Kalajdzic <ukalajdzic@gmail.com>, 2022
# Dragan Vukosavljevic <dragan.vukosavljevic@gmail.com>, 2023
#
# Dragan Vukosavljevic <dragan.vukosavljevic@gmail.com>, 2023, 2026.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2022-09-22 05:55+0000\n"
"Last-Translator: Dragan Vukosavljevic <dragan.vukosavljevic@gmail.com>, "
"2023\n"
"Language-Team: Serbian (https://app.transifex.com/odoo/teams/41243/sr/)\n"
"Language: sr\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-11 17:40+0000\n"
"Last-Translator: Dragan Vukosavljevic <dragan.vukosavljevic@gmail.com>\n"
"Language-Team: Serbian (Latin script) <https://translate.odoo.com/projects/"
"odoo-19/web/sr_Latn/>\n"
"Language: sr@latin\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -532,7 +533,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -543,7 +544,7 @@ msgstr "<span>$ <span class=\"oe_currency_value\">19,250.00</span></span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span>5.00</span>"
msgstr ""
msgstr "<span>5.00</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -759,13 +760,13 @@ msgstr "Pristup odbijen"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
msgid "Access Error"
msgstr ""
msgstr "Greška u pristupu"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Access Rights"
msgstr ""
msgstr "Prava pristupa"
#. module: web
#. odoo-javascript
@ -796,7 +797,7 @@ msgstr "ID Radnje:"
#: code:addons/web/static/src/search/action_menus/action_menus.xml:0
#: code:addons/web/static/src/search/cog_menu/cog_menu.xml:0
msgid "Actions"
msgstr ""
msgstr "Radnje"
#. module: web
#. odoo-javascript
@ -844,7 +845,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "Activities"
msgstr ""
msgstr "Aktivnosti"
#. module: web
#. odoo-javascript
@ -944,7 +945,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Address"
msgstr ""
msgstr "Adresa"
#. module: web
#. odoo-javascript
@ -1066,7 +1067,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/file_upload/file_upload_service.js:0
msgid "An error occured while uploading."
msgstr ""
msgstr "Došlo je do greške prilikom učitavanja."
#. module: web
#. odoo-javascript
@ -1230,13 +1231,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/debug_items.js:0
msgid "Attachments"
msgstr ""
msgstr "Prilozi"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "Australia"
msgstr ""
msgstr "Australija"
#. module: web
#. odoo-javascript
@ -1287,7 +1288,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/dynamic_placeholder_popover.xml:0
msgid "Back"
msgstr ""
msgstr "Nazad"
#. module: web
#. odoo-javascript
@ -1304,7 +1305,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Background"
msgstr ""
msgstr "Pozadina"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__layout_background_image
@ -1351,7 +1352,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/barcode/barcode_dialog.xml:0
msgid "Barcode Scanner"
msgstr ""
msgstr "Barkod čitač"
#. module: web
#. odoo-javascript
@ -1383,7 +1384,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/image/image_field.js:0
#: code:addons/web/static/src/views/fields/signature/signature_field.xml:0
msgid "Binary file"
msgstr ""
msgstr "Binarna datoteka"
#. module: web
#. odoo-javascript
@ -1458,7 +1459,7 @@ msgstr ""
#: code:addons/web/static/src/views/calendar/calendar_controller.js:0
#: code:addons/web/static/src/views/view_hook.js:0
msgid "Bye-bye, record!"
msgstr ""
msgstr "Zbogom, zapis!"
#. module: web
#. odoo-javascript
@ -1638,7 +1639,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/user_switch/user_switch.xml:0
msgid "Choose a user"
msgstr ""
msgstr "Izaberite korisnika"
#. module: web
#. odoo-javascript
@ -1666,7 +1667,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "Christmas"
msgstr ""
msgstr "Božić"
#. module: web
#. odoo-javascript
@ -1748,7 +1749,7 @@ msgstr ""
#: code:addons/web/static/src/webclient/burger_menu/burger_menu.xml:0
#: code:addons/web/static/src/webclient/navbar/navbar.xml:0
msgid "Close menu"
msgstr ""
msgstr "Zatvori meni"
#. module: web
#. odoo-javascript
@ -1852,7 +1853,7 @@ msgstr "Uslov:"
#. module: web
#: model:ir.model,name:web.model_res_config_settings
msgid "Config Settings"
msgstr ""
msgstr "Podešavanje konfiguracije"
#. module: web
#: model:ir.actions.act_window,name:web.action_base_document_layout_configurator
@ -1866,7 +1867,7 @@ msgstr ""
#: code:addons/web/static/src/model/relational_model/dynamic_list.js:0
#: code:addons/web/static/src/webclient/switch_company_menu/switch_company_menu.xml:0
msgid "Confirm"
msgstr ""
msgstr "Potvrdi"
#. module: web
#. odoo-javascript
@ -1896,7 +1897,7 @@ msgstr ""
#. module: web
#: model:ir.model,name:web.model_res_partner
msgid "Contact"
msgstr ""
msgstr "Kontakt"
#. module: web
#. odoo-javascript
@ -1936,13 +1937,13 @@ msgstr "Sadržaj:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Continue"
msgstr ""
msgstr "Nastavi"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/x2many/x2many_field.xml:0
msgid "Control panel buttons"
msgstr ""
msgstr "Dugmad kontrolnog panela"
#. module: web
#. odoo-javascript
@ -1963,7 +1964,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/views/fields/copy_clipboard/copy_clipboard_field.js:0
msgid "Copied"
msgstr ""
msgstr "Kopirano"
#. module: web
#. odoo-javascript
@ -2122,7 +2123,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/monetary/monetary_field.js:0
msgid "Currency"
msgstr ""
msgstr "Valuta"
#. module: web
#. odoo-javascript
@ -2140,7 +2141,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/tabs/color_picker_custom_tab.js:0
msgid "Custom"
msgstr ""
msgstr "Prilagođeno"
#. module: web
#. odoo-javascript
@ -2213,7 +2214,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/debug_items.js:0
msgid "Data"
msgstr ""
msgstr "Podaci"
#. module: web
#. odoo-javascript
@ -2249,7 +2250,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Format datuma"
#. module: web
#. odoo-javascript
@ -2274,7 +2275,7 @@ msgstr "Dan"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Days"
msgstr ""
msgstr "dana"
#. module: web
#. odoo-javascript
@ -2430,7 +2431,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/float/float_field.js:0
#: code:addons/web/static/src/views/fields/float_toggle/float_toggle_field.js:0
msgid "Digits"
msgstr ""
msgstr "Brojevi"
#. module: web
#. odoo-javascript
@ -2675,7 +2676,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/kanban/kanban_record.xml:0
msgid "Dropdown menu"
msgstr ""
msgstr "Padajući meni"
#. module: web
#. odoo-javascript
@ -2929,7 +2930,7 @@ msgstr ""
#: code:addons/web/controllers/export.py:0
#: code:addons/web/static/src/views/view_hook.js:0
msgid "External ID"
msgstr ""
msgstr "Externi ID"
#. module: web
#. odoo-javascript
@ -3047,7 +3048,7 @@ msgstr "Polje:"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Fields"
msgstr ""
msgstr "Polja"
#. module: web
#. odoo-javascript
@ -3272,7 +3273,7 @@ msgstr "Zeleno"
#. odoo-javascript
#: code:addons/web/static/src/webclient/res_user_group_ids_field/res_user_group_ids_popover.xml:0
msgid "Group"
msgstr ""
msgstr "Grupa"
#. module: web
#. odoo-javascript
@ -3327,7 +3328,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/webclient/user_menu/user_menu_items.js:0
msgid "Help"
msgstr ""
msgstr "Pomoć"
#. module: web
#. odoo-javascript
@ -3467,7 +3468,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_icon/boolean_icon_field.js:0
msgid "Icon"
msgstr ""
msgstr "Ikona"
#. module: web
#. odoo-javascript
@ -3484,6 +3485,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -3581,7 +3590,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/install_scoped_app/install_scoped_app.xml:0
msgid "Install"
msgstr ""
msgstr "Instaliraj"
#. module: web
#. odoo-javascript
@ -3799,7 +3808,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "Japan"
msgstr ""
msgstr "Japan"
#. module: web
#. odoo-javascript
@ -3997,7 +4006,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Label"
msgstr ""
msgstr "Natpis"
#. module: web
#. odoo-javascript
@ -4048,7 +4057,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Poslednjih 30 dana"
#. module: web
#. odoo-javascript
@ -4215,7 +4224,7 @@ msgstr ""
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Prijava"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4358,7 +4367,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/image_url/image_url_field.js:0
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
msgid "Medium"
msgstr ""
msgstr "Posrednik"
#. module: web
#. odoo-javascript
@ -4420,6 +4429,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4460,7 +4475,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/ace/ace_field.js:0
msgid "Mode"
msgstr ""
msgstr "Model"
#. module: web
#. odoo-javascript
@ -4503,7 +4518,7 @@ msgstr ""
#. module: web
#: model:ir.model,name:web.model_ir_model
msgid "Models"
msgstr ""
msgstr "Modeli"
#. module: web
#. odoo-javascript
@ -4541,7 +4556,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Months"
msgstr ""
msgstr "Meseci"
#. module: web
#. odoo-javascript
@ -4689,7 +4704,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/calendar/quick_create/calendar_quick_create.xml:0
msgid "Name:"
msgstr ""
msgstr "Naziv:"
#. module: web
#. odoo-javascript
@ -4753,7 +4768,7 @@ msgstr "Sledeće"
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Next (Right-Arrow)"
msgstr ""
msgstr "Sledeće (Desna strelica)"
#. module: web
#. odoo-javascript
@ -4830,6 +4845,12 @@ msgstr ""
#: code:addons/web/static/src/views/action_helper.xml:0
#: code:addons/web/static/src/views/no_content_helpers.xml:0
msgid "No data to display"
msgstr "Nema podataka za prikaz"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
@ -4847,7 +4868,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4899,7 +4920,7 @@ msgstr "Nema pronađenih rezultata"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Nema rezultata"
#. module: web
#. odoo-javascript
@ -4924,7 +4945,7 @@ msgstr ""
#: code:addons/web/static/src/views/calendar/calendar_controller.js:0
#: code:addons/web/static/src/views/view_hook.js:0
msgid "No, keep it"
msgstr ""
msgstr "Ne, zadrži ga"
#. module: web
#. odoo-javascript
@ -4972,7 +4993,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "OK"
msgstr ""
msgstr "U redu"
#. module: web
#. odoo-javascript
@ -5110,7 +5131,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.webclient_offline
msgid "Offline"
msgstr ""
msgstr "Offline"
#. module: web
#. odoo-javascript
@ -5121,7 +5142,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5206,7 +5226,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Open"
msgstr ""
msgstr "Otvori"
#. module: web
#. odoo-javascript
@ -5536,7 +5556,7 @@ msgstr "Prethodno"
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Previous (Left-Arrow)"
msgstr ""
msgstr "Prethodno (leva-strelica)"
#. module: web
#. odoo-javascript
@ -5604,7 +5624,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/column_progress.xml:0
msgid "Progress bar"
msgstr ""
msgstr "Traka napretka"
#. module: web
#. odoo-javascript
@ -5669,7 +5689,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Quarter"
msgstr ""
msgstr "Kvartal"
#. module: web
#. odoo-javascript
@ -5730,13 +5750,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_basic.js:0
msgid "Record"
msgstr ""
msgstr "Zapis"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Record Rules"
msgstr ""
msgstr "Pravila zapisa"
#. module: web
#. odoo-javascript
@ -5790,7 +5810,7 @@ msgstr "Referenca"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
msgid "Refresh"
msgstr ""
msgstr "Osveži"
#. module: web
#. odoo-javascript
@ -5915,7 +5935,7 @@ msgstr ""
#: code:addons/web/static/src/core/color_picker/color_picker.xml:0
#: code:addons/web/static/src/webclient/switch_company_menu/switch_company_menu.xml:0
msgid "Reset"
msgstr ""
msgstr "Resetuj"
#. module: web
#. odoo-javascript
@ -6058,7 +6078,7 @@ msgstr "Sačuvaj"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/relational_utils.xml:0
msgid "Save & Close"
msgstr ""
msgstr "Sačuvaj & zatvori"
#. module: web
#. odoo-javascript
@ -6202,7 +6222,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_basic.js:0
msgid "Security"
msgstr ""
msgstr "Bezbednost"
#. module: web
#. odoo-javascript
@ -6270,7 +6290,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/selection_box.xml:0
msgid "Select all"
msgstr ""
msgstr "Označi sve"
#. module: web
#. odoo-javascript
@ -6482,7 +6502,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/image_url/image_url_field.js:0
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
msgid "Size"
msgstr ""
msgstr "Veličina"
#. module: web
#. odoo-javascript
@ -6490,7 +6510,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/image_url/image_url_field.js:0
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
msgid "Small"
msgstr ""
msgstr "Malo"
#. module: web
#. odoo-javascript
@ -6543,6 +6563,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr ""
@ -6619,14 +6640,14 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/form/form_error_dialog/form_error_dialog.xml:0
msgid "Stay here"
msgstr ""
msgstr "Ostani ovde"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
#: code:addons/web/static/src/views/fields/integer/integer_field.js:0
msgid "Step"
msgstr ""
msgstr "Korak"
#. module: web
#. odoo-javascript
@ -6644,7 +6665,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Sufiks"
#. module: web
#. odoo-javascript
@ -6772,7 +6793,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:web.external_layout_striped
#: model_terms:ir.ui.view,arch_db:web.external_layout_wave
msgid "Tax ID"
msgstr ""
msgstr "ID takse"
#. module: web
#. odoo-javascript
@ -6852,6 +6873,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6875,6 +6902,12 @@ msgid ""
"is taking too much time."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7121,13 +7154,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_basic.js:0
msgid "Tools"
msgstr ""
msgstr "Alati"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/widgets/ribbon/ribbon.js:0
msgid "Tooltip"
msgstr ""
msgstr "Objašnjenje"
#. module: web
#. odoo-javascript
@ -7201,7 +7234,7 @@ msgstr "Utorak"
#: code:addons/web/static/src/views/fields/float_toggle/float_toggle_field.js:0
#: code:addons/web/static/src/views/fields/integer/integer_field.js:0
msgid "Type"
msgstr ""
msgstr "Vrsta"
#. module: web
#. odoo-javascript
@ -7325,7 +7358,7 @@ msgstr ""
#: code:addons/web/static/src/views/fields/many2one/many2one.js:0
#: code:addons/web/static/src/views/fields/relational_utils.js:0
msgid "Unnamed"
msgstr ""
msgstr "Neimenovano"
#. module: web
#. odoo-javascript
@ -7358,7 +7391,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/list/list_confirmation_dialog.xml:0
msgid "Update"
msgstr ""
msgstr "Ažuriraj"
#. module: web
#. odoo-javascript
@ -7439,7 +7472,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/user_switch/user_switch.xml:0
msgid "Use another user"
msgstr ""
msgstr "Koristite drugog korisnika"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
@ -7496,12 +7529,12 @@ msgstr "Korisnik"
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu_basic.js:0
msgid "User Interface"
msgstr ""
msgstr "Korisnički interfejs"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Podešavanja korisnika"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7571,7 +7604,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Values"
msgstr ""
msgstr "Vrijednosti"
#. module: web
#. odoo-javascript
@ -7584,7 +7617,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Video"
msgstr ""
msgstr "Video"
#. module: web
#. odoo-javascript
@ -7592,7 +7625,7 @@ msgstr ""
#: code:addons/web/static/src/views/list/list_renderer.xml:0
#: model:ir.model,name:web.model_ir_ui_view
msgid "View"
msgstr ""
msgstr "Pregled"
#. module: web
#. odoo-javascript
@ -7634,7 +7667,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/file_viewer/file_viewer.xml:0
msgid "Viewer"
msgstr ""
msgstr "Posmatrač"
#. module: web
#. odoo-javascript
@ -7665,6 +7698,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Upozorenje"
@ -7678,7 +7712,7 @@ msgstr ""
#. odoo-python
#: code:addons/web/models/models.py:0
msgid "Warnings"
msgstr ""
msgstr "Upozorenja"
#. module: web
#. odoo-javascript
@ -7804,7 +7838,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Years"
msgstr ""
msgstr "Godine"
#. module: web
#. odoo-javascript
@ -8449,7 +8483,7 @@ msgstr ""
#: code:addons/web/static/src/search/search_bar/search_bar.js:0
#: code:addons/web/static/src/views/view_components/multi_currency_popover.xml:0
msgid "at"
msgstr ""
msgstr "u"
#. module: web
#. odoo-javascript
@ -11317,7 +11351,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "credit"
msgstr ""
msgstr "potražuje"
#. module: web
#. odoo-javascript
@ -11863,7 +11897,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "department"
msgstr ""
msgstr "Odeljenje"
#. module: web
#. odoo-javascript
@ -12163,7 +12197,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "document"
msgstr ""
msgstr "dokument"
#. module: web
#. odoo-javascript
@ -18450,7 +18484,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "name"
msgstr ""
msgstr "Ime"
#. module: web
#. odoo-javascript
@ -19590,7 +19624,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "password"
msgstr ""
msgstr "lozinka"
#. module: web
#. odoo-javascript

View file

@ -25,21 +25,23 @@
# Kim Asplund <kim.asplund@gmail.com>, 2023
# Daniel Osser <danielosser@gmail.com>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# Hanna Kharraziha <hakha@odoo.com>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 21:14+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"Language-Team: Swedish <https://translate.odoo.com/projects/odoo-19/web/sv/"
">\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-03-06 17:48+0000\n"
"Last-Translator: Hanna Kharraziha <hakha@odoo.com>\n"
"Language-Team: Swedish <https://translate.odoo.com/projects/odoo-19/web/sv/>"
"\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.16.1\n"
#. module: web
#. odoo-javascript
@ -556,8 +558,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -824,7 +826,7 @@ msgstr "Ace-redigerare"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/debug_items.js:0
msgid "Action"
msgstr "Åtgärder"
msgstr "Åtgärd"
#. module: web
#. odoo-javascript
@ -1679,7 +1681,7 @@ msgstr "Kryssrutor"
#. odoo-javascript
#: code:addons/web/static/src/core/file_input/file_input.xml:0
msgid "Choose File"
msgstr "Välj fil"
msgstr "Markera fil"
#. module: web
#. odoo-javascript
@ -2137,7 +2139,7 @@ msgstr "Skapa %s"
#. module: web
#: model:ir.model,website_form_label:web.model_res_partner
msgid "Create a Customer"
msgstr ""
msgstr "Skapa en kund"
#. module: web
#. odoo-javascript
@ -2191,7 +2193,7 @@ msgstr "Valuta"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Valuta fält"
#. module: web
#. odoo-javascript
@ -2313,7 +2315,7 @@ msgstr "Datum & tid"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Datumformat"
#. module: web
#. odoo-javascript
@ -2706,7 +2708,7 @@ msgstr "Gå inte ännu,"
#: code:addons/web/static/src/views/fields/many2many_binary/many2many_binary_field.xml:0
#: code:addons/web/static/src/views/fields/pdf_viewer/pdf_viewer_field.xml:0
msgid "Download"
msgstr "Nedladdningar"
msgstr "Ladda ner"
#. module: web
#: model:ir.actions.server,name:web.download_contact
@ -2907,7 +2909,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login
msgid "Enter your password"
msgstr ""
msgstr "Ange ditt lösenord"
#. module: web
#. odoo-javascript
@ -3146,7 +3148,7 @@ msgstr "Vänd axel"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Float"
msgstr "Flottör"
msgstr "Flyttal"
#. module: web
#. odoo-javascript
@ -3165,7 +3167,7 @@ msgstr "Vik fält"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.js:0
msgid "Foldable"
msgstr "Vikbar"
msgstr "Går att dölja"
#. module: web
#. odoo-javascript
@ -3465,7 +3467,7 @@ msgstr "Startmeny"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Timme"
#. module: web
#. odoo-python
@ -3489,7 +3491,7 @@ msgstr "Så här hämtar du applikationen"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "Färgton"
#. module: web
#. odoo-javascript
@ -3567,6 +3569,14 @@ msgstr ""
"utgåva att gälla. Färgväljaren kommer alltså inte att visas när du klickar "
"på taggen."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4152,13 +4162,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "Senaste 30 dagarna"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "Senaste 7 dagarna"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4176,7 +4186,7 @@ msgstr "Senast uppdaterad den"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Förra månaden"
#. module: web
#. odoo-javascript
@ -4319,7 +4329,7 @@ msgstr "Logga ut"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Inloggning"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4333,7 +4343,7 @@ msgstr ""
#: model_terms:ir.ui.view,arch_db:web.login_layout
#: model_terms:ir.ui.view,arch_db:web.view_base_document_layout
msgid "Logo"
msgstr "Logotyp"
msgstr "Logga"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__logo_primary_color
@ -4525,6 +4535,12 @@ msgstr "Vintergatan"
msgid "Minimal precision"
msgstr "Minimal precision"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4937,6 +4953,12 @@ msgstr "Ingen data"
msgid "No data to display"
msgstr "Ingen data att visa"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4952,8 +4974,8 @@ msgstr "Ingen enhet kunde hittas."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Ingen emoji matchar din sökning"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -5004,7 +5026,7 @@ msgstr "Inga resultat hittade"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Inga resultat"
#. module: web
#. odoo-javascript
@ -5230,7 +5252,6 @@ msgstr "Åh, sjutton också!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5290,7 +5311,7 @@ msgstr "Bara du"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.xml:0
msgid "Oops!"
msgstr "Oops!"
msgstr "Ojdå!"
#. module: web
#. odoo-javascript
@ -5611,7 +5632,7 @@ msgstr "Förhindra färg-utgåva"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__preview
msgid "Preview"
msgstr "Förhandsgranskning"
msgstr "Förhandsvisning"
#. module: web
#: model:ir.actions.report,name:web.action_report_externalpreview
@ -5733,7 +5754,7 @@ msgstr "Fastigheter"
#. module: web
#: model:ir.model,name:web.model_properties_base_definition
msgid "Properties Base Definition"
msgstr ""
msgstr "Egenskaper Bas Definition"
#. module: web
#. odoo-javascript
@ -5913,7 +5934,7 @@ msgstr "Referens"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
msgid "Refresh"
msgstr "Ladda om"
msgstr "Uppdatera"
#. module: web
#. odoo-javascript
@ -5943,7 +5964,7 @@ msgstr "Relationell tabell"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/image/image_field.js:0
msgid "Reload"
msgstr "Ladda om"
msgstr "Uppdatera"
#. module: web
#. odoo-javascript
@ -6337,7 +6358,7 @@ msgstr "Visa exempel"
#. odoo-javascript
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
msgid "See technical details"
msgstr "Se tekniska detaljer"
msgstr "Visa teknisk information"
#. module: web
#. odoo-javascript
@ -6395,7 +6416,7 @@ msgstr "Välj en vy"
#. odoo-javascript
#: code:addons/web/static/src/views/view_components/selection_box.xml:0
msgid "Select all"
msgstr "Välj alla"
msgstr "Markera alla"
#. module: web
#. odoo-javascript
@ -6650,8 +6671,8 @@ msgid ""
"Something went wrong... If you really are stuck, share the report with your "
"friendly support service"
msgstr ""
"Någonting gick fel... Om du verkligen har fastnat, dela rapporten med din "
"vänliga supporttjänst"
"Något verkar ha gått fel... Om du upplever problemet upprepade gånger, kan "
"du välja att skicka en felrapport till kundtjänsten"
#. module: web
#. odoo-javascript
@ -6668,10 +6689,11 @@ msgstr "Special:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Stackad"
@ -6773,7 +6795,7 @@ msgstr "Stil-fel"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Suffix"
#. module: web
#. odoo-javascript
@ -6986,6 +7008,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -7011,6 +7039,12 @@ msgstr ""
"Operationen avbröts. Detta innebär vanligtvis att den aktuella operationen "
"tar för lång tid."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7663,7 +7697,7 @@ msgstr "Användargränssnitt"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Användarinställningar"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7827,6 +7861,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Varning"
@ -8153,7 +8188,7 @@ msgstr "tillbehör"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "accounting"
msgstr "redovisning"
msgstr "bokföring"
#. module: web
#. odoo-javascript
@ -8231,7 +8266,7 @@ msgstr "aesculapius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "efter"
#. module: web
#. odoo-javascript
@ -8686,7 +8721,7 @@ msgstr "automatiserad"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "automobile"
msgstr "fordon"
msgstr "bil"
#. module: web
#. odoo-javascript
@ -8866,7 +8901,7 @@ msgstr "bageri"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "balance"
msgstr "balans"
msgstr "saldo"
#. module: web
#. odoo-javascript
@ -9334,7 +9369,7 @@ msgstr "bikini"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "bill"
msgstr "räkning"
msgstr "leverantörsfaktura"
#. module: web
#. odoo-javascript
@ -12831,7 +12866,7 @@ msgstr "empanadas"
#. odoo-javascript
#: code:addons/web/static/src/webclient/actions/blank_component.xml:0
msgid "empty"
msgstr ""
msgstr "tomt"
#. module: web
#. odoo-javascript
@ -19253,7 +19288,7 @@ msgstr "lök"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "oops"
msgstr "hoppsan"
msgstr "ojdå"
#. module: web
#. odoo-javascript
@ -21472,7 +21507,7 @@ msgstr "religion"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "reload"
msgstr "ladda om"
msgstr "uppdatera"
#. module: web
#. odoo-javascript
@ -25920,7 +25955,7 @@ msgstr "tjänsteman"
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_data.js:0
msgid "whoops"
msgstr "hoppsan"
msgstr "ojdå"
#. module: web
#. odoo-javascript
@ -26972,6 +27007,12 @@ msgstr "\"ledig tjänst\""
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Ingen emoji matchar din sökning"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Vinkel"

View file

@ -12,13 +12,14 @@
# Amin Cheloh <amincheloh@gmail.com>, 2022
# Odoo Thaidev <odoothaidev@gmail.com>, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 21:18+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 21:57+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Thai <https://translate.odoo.com/projects/odoo-19/web/th/>\n"
"Language: th\n"
"MIME-Version: 1.0\n"
@ -542,8 +543,8 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2158,7 +2159,7 @@ msgstr "สกุลเงิน"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "ฟิลด์สกุลเงิน"
#. module: web
#. odoo-javascript
@ -2279,7 +2280,7 @@ msgstr "วันที่และเวลา"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "รูปแบบวันที่"
#. module: web
#. odoo-javascript
@ -3426,7 +3427,7 @@ msgstr "เมนูหลัก"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "ชั่วโมง"
#. module: web
#. odoo-python
@ -3449,7 +3450,7 @@ msgstr "วิธีรับใบสมัคร"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "สี"
#. module: web
#. odoo-javascript
@ -3525,6 +3526,14 @@ msgstr ""
"โปรดทราบว่าหากตั้งค่าช่องสีไว้ด้วย การแก้ไขแท็กจะมีผลเหนือกว่า ดังนั้น "
"ตัวเลือกสีจะไม่ปรากฏขึ้นเมื่อคลิกที่แท็ก"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4099,13 +4108,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "30 วันล่าสุด"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "7 วันล่าสุด"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4123,7 +4132,7 @@ msgstr "อัปเดตครั้งล่าสุดเมื่อ"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "เดือนที่แล้ว"
#. module: web
#. odoo-javascript
@ -4266,7 +4275,7 @@ msgstr "ออกระบบ"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "เข้าสู่ระบบ"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4471,6 +4480,12 @@ msgstr "ทางช้างเผือก"
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4883,6 +4898,12 @@ msgstr "ไม่มีข้อมูล"
msgid "No data to display"
msgstr "ไม่มีข้อมูลให้แสดง"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4898,7 +4919,7 @@ msgstr "ไม่พบอุปกรณ์"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -4950,7 +4971,7 @@ msgstr "ไม่พบผลลัพธ์"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "ไม่มีผลลัพธ์"
#. module: web
#. odoo-javascript
@ -5174,7 +5195,6 @@ msgstr "โอ้ว!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6605,10 +6625,11 @@ msgstr "พิเศษ:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "ซ้อนกัน"
@ -6710,7 +6731,7 @@ msgstr "ข้อผิดพลาดในรูปแบบ"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "คำต่อท้าย"
#. module: web
#. odoo-javascript
@ -6922,6 +6943,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6945,6 +6972,12 @@ msgid ""
"is taking too much time."
msgstr "การปฏิบัติการถูกขัดจังหวะ ซึ่งมักจะหมายความว่าการดำเนินการปัจจุบันใช้เวลามากเกินไป"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7305,7 +7338,7 @@ msgstr "ประเภท:"
#: code:addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js:0
#: code:addons/web/static/src/views/fields/many2one/many2one_field.js:0
msgid "Typeahead search"
msgstr ""
msgstr "การค้นหาแบบพิมพ์ล่วงหน้า"
#. module: web
#. odoo-javascript
@ -7584,7 +7617,7 @@ msgstr "ส่วนติดต่อผู้ใช้"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "การตั้งค่าผู้ใช้"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7748,6 +7781,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "คำเตือน"
@ -8146,7 +8180,7 @@ msgstr "เอสคิวลาเปียส"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "หลังจาก"
#. module: web
#. odoo-javascript
@ -26887,6 +26921,9 @@ msgstr "“ว่าง”"
msgid "ココ"
msgstr "ココ"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "มุม"

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -11,13 +11,15 @@
# Martin Trigaux, 2023
# Thi Huong Nguyen, 2023
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# "Thi Huong Nguyen (thng)" <thng@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 04:44+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-12-04 17:51+0000\n"
"Last-Translator: \"Thi Huong Nguyen (thng)\" <thng@odoo.com>\n"
"Language-Team: Vietnamese <https://translate.odoo.com/projects/odoo-19/web/"
"vi/>\n"
"Language: vi\n"
@ -25,7 +27,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -302,7 +304,7 @@ msgstr "3.30"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "31/01/%s"
msgstr ""
msgstr "31/01/%s"
#. module: web
#. odoo-javascript
@ -483,6 +485,18 @@ msgid ""
"Temporal mode will merge all samples.<br/>It can lead to partially invalid "
"result in case of concurrent profiles.<br/>Use with caution </span>"
msgstr ""
"<select class=\"form-select\" name=\"profile_aggregation_mode\" "
"id=\"profile_aggregation_mode\">\n"
" <option value=\"tabs\">Tách biệt "
"(một cho mỗi tab)</option>\n"
" <option value=\"temporal\">Tạm thời "
"(thử nghiệm)</option>\n"
" </select>\n"
" <span id=\"temporal_warning\" "
"class=\"alert alert-warning\" style=\"display:none\"><b> Cảnh báo:</b> Chế "
"độ tạm thời sẽ gộp tất cả các mẫu.<br/>Điều này có thể dẫn đến kết quả không "
"chính xác một phần trong trường hợp có nhiều hồ sơ đồng thời.<br/>Hãy sử "
"dụng cẩn thận </span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -542,8 +556,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2176,7 +2190,7 @@ msgstr "Tiền tệ"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "Trường tiền tệ"
#. module: web
#. odoo-javascript
@ -2299,7 +2313,7 @@ msgstr "Ngày & giờ"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "Định dạng Ngày"
#. module: web
#. odoo-javascript
@ -2548,7 +2562,7 @@ msgstr "Huỷ bỏ mọi thay đổi"
#. odoo-javascript
#: code:addons/web/static/src/views/form/form_error_dialog/form_error_dialog.xml:0
msgid "Discard changes"
msgstr "Loại bỏ những thay đổi"
msgstr "Huỷ bỏ thay đổi"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__display_name
@ -3210,6 +3224,8 @@ msgid ""
"For example, if the value is \"1\" and you enter \"+=2\", it will be updated "
"to \"3\"."
msgstr ""
"Ví dụ, nếu giá trị là \"1\" và bạn nhập \"+=2\", nó sẽ được cập nhật thành "
"\"3\"."
#. module: web
#. odoo-javascript
@ -3387,6 +3403,9 @@ msgid ""
"click the %(upload_icon)s button now to ensure your work is saved before you "
"exit this tab."
msgstr ""
"Cảnh báo! Các thay đổi gần đây của bạn quá lớn để lưu tự động. Vui lòng nhấn "
"nút %(upload_icon)s ngay để đảm bảo công việc của bạn được lưu trước khi "
"thoát khỏi tab này."
#. module: web
#. odoo-javascript
@ -3455,7 +3474,7 @@ msgstr "Menu Chính"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "Giờ"
#. module: web
#. odoo-python
@ -3557,6 +3576,14 @@ msgstr ""
"tiếp. Lưu ý rằng nếu trường màu cũng được thiết lập, phiên bản thẻ sẽ được "
"ưu tiên. Vì vậy, bộ chọn màu sẽ không được hiển thị khi nhấp vào thẻ."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4137,13 +4164,13 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "30 ngày qua"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "7 ngày qua"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4161,7 +4188,7 @@ msgstr "Cập nhật lần cuối vào"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "Tháng trước"
#. module: web
#. odoo-javascript
@ -4304,7 +4331,7 @@ msgstr "Đăng xuất"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "Đăng nhập"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4509,6 +4536,12 @@ msgstr "Dải Ngân Hà"
msgid "Minimal precision"
msgstr "Độ chính xác tối thiểu"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4921,6 +4954,12 @@ msgstr "Không có dữ liệu"
msgid "No data to display"
msgstr "Không có dữ liệu để hiển thị"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4936,8 +4975,8 @@ msgstr "Không tìm thấy thiết bị nào."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "Không có biểu tượng cảm xúc nào phù hợp với tìm kiếm của bạn"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4988,7 +5027,7 @@ msgstr "Không có kết quả nào"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "Không có kết quả"
#. module: web
#. odoo-javascript
@ -5212,7 +5251,6 @@ msgstr "Ôi chao!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -5571,12 +5609,12 @@ msgstr "Vui lòng quét lại!"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.brand_promotion_message
msgid "Powered by %s%s"
msgstr "Cung cấp bởi %s%s"
msgstr "Được hỗ trợ bởi %s%s"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.login_layout
msgid "Powered by <span>Odoo</span>"
msgstr "Cung cấp bởi <span>Odoo</span>"
msgstr "Được hỗ trợ bởi <span>Odoo</span>"
#. module: web
#. odoo-javascript
@ -6655,10 +6693,11 @@ msgstr "Đặc biệt:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "Speedscope"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "Chồng"
@ -6760,7 +6799,7 @@ msgstr "Lỗi kiểu"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "Hậu tố"
#. module: web
#. odoo-javascript
@ -6972,6 +7011,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6997,6 +7042,12 @@ msgstr ""
"Thao tác bị gián đoạn. Điều này thường có nghĩa là hoạt động hiện tại cần "
"nhiều thời gian hơn để xử lý."
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7317,6 +7368,8 @@ msgid ""
"Try to add some records, or make sure that there is no\n"
" active filter in the search bar."
msgstr ""
"Hãy thử thêm một số bản ghi, hoặc đảm bảo rằng không có\n"
"bộ lọc nào đang hoạt động trong thanh tìm kiếm."
#. module: web
#. odoo-javascript
@ -7366,7 +7419,7 @@ msgstr "Loại:"
#: code:addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js:0
#: code:addons/web/static/src/views/fields/many2one/many2one_field.js:0
msgid "Typeahead search"
msgstr ""
msgstr "Tìm kiếm theo kiểu gõ trước"
#. module: web
#. odoo-javascript
@ -7653,7 +7706,7 @@ msgstr "Giao diện Người dùng"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "Cài đặt của người dùng"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7817,6 +7870,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "Cảnh báo"
@ -8219,7 +8273,7 @@ msgstr "cây gậy của Asclepius"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "sau"
#. module: web
#. odoo-javascript
@ -26960,6 +27014,12 @@ msgstr "“vacancy”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "Không có biểu tượng cảm xúc nào phù hợp với tìm kiếm của bạn"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "Góc độ"

View file

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 19.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-30 18:36+0000\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-02-27 18:38+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -510,7 +510,7 @@ msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
@ -3459,6 +3459,14 @@ msgid ""
"prevail. So, the color picker will not be displayed on click on the tag."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4390,6 +4398,12 @@ msgstr ""
msgid "Minimal precision"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4802,6 +4816,12 @@ msgstr ""
msgid "No data to display"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4817,7 +4837,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgid "No emojis match your search"
msgstr ""
#. module: web
@ -5091,7 +5111,6 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6511,6 +6530,7 @@ msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr ""
@ -6820,6 +6840,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6843,6 +6869,12 @@ msgid ""
" is taking too much time."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7630,6 +7662,7 @@ msgstr ""
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr ""

View file

@ -15,13 +15,14 @@
# Emily Jia <eji@odoo.com>, 2023
# Martin Trigaux, 2023
# "Tiffany Chang (tic)" <tic@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 15:32+0000\n"
"Last-Translator: \"Tiffany Chang (tic)\" <tic@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2025-11-08 21:57+0000\n"
"Last-Translator: Weblate <noreply-mt-weblate@weblate.org>\n"
"Language-Team: Chinese (Simplified Han script) <https://translate.odoo.com/"
"projects/odoo-19/web/zh_Hans/>\n"
"Language: zh_CN\n"
@ -546,8 +547,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2159,7 +2160,7 @@ msgstr "币别"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "币别字段"
#. module: web
#. odoo-javascript
@ -2280,7 +2281,7 @@ msgstr "日期和时间"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "日期格式"
#. module: web
#. odoo-javascript
@ -3427,7 +3428,7 @@ msgstr "主页菜单"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "小时"
#. module: web
#. odoo-python
@ -3450,7 +3451,7 @@ msgstr "如何获取申请表"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "色调"
#. module: web
#. odoo-javascript
@ -3525,6 +3526,14 @@ msgstr ""
"如果选中,点击标签将打开一个可以直接编辑它的表单。请注意,如果还设置了颜色字"
"段,则标签编辑将优先。因此,点击标签时不会显示颜色选择器。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4092,19 +4101,19 @@ msgstr "大"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "过去 12 个月"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "最近30天"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "最近7天"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4122,7 +4131,7 @@ msgstr "上次更新日期"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "上月"
#. module: web
#. odoo-javascript
@ -4265,7 +4274,7 @@ msgstr "登出"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "登录"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4470,6 +4479,12 @@ msgstr "银河"
msgid "Minimal precision"
msgstr "最小精度"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4882,6 +4897,12 @@ msgstr "无数据"
msgid "No data to display"
msgstr "无数据显示"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4897,8 +4918,8 @@ msgstr "找不到任何设备。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "没有符合您搜索的表情符号"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4949,7 +4970,7 @@ msgstr "找不到结果"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "没有结果"
#. module: web
#. odoo-javascript
@ -5172,7 +5193,6 @@ msgstr "哦,快!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6602,10 +6622,11 @@ msgstr "特殊:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "测速仪"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "堆叠"
@ -6707,7 +6728,7 @@ msgstr "样式错误"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "后缀"
#. module: web
#. odoo-javascript
@ -6917,6 +6938,12 @@ msgstr "域名涉及非字母。它们的评估可能会失败。"
msgid "The domain should not involve non-literals"
msgstr "域名不应涉及非字母"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6940,6 +6967,12 @@ msgid ""
"is taking too much time."
msgstr "操作被中断了。这通常意味着当前的操作花费了太多时间。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7575,7 +7608,7 @@ msgstr "用户界面"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "用户设置"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7739,6 +7772,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "警告"
@ -8136,7 +8170,7 @@ msgstr "医神"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "之后"
#. module: web
#. odoo-javascript
@ -26877,6 +26911,12 @@ msgstr "“空缺”"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "没有符合您搜索的表情符号"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "角度"

View file

@ -8,13 +8,15 @@
# Tony Ng, 2025
#
# "Dylan Kiss (dyki)" <dyki@odoo.com>, 2025.
# Weblate <noreply-mt-weblate@weblate.org>, 2025.
# "Tony Ng (ngto)" <ngto@odoo.com>, 2026.
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server saas~18.3\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-09-30 18:36+0000\n"
"PO-Revision-Date: 2025-09-16 08:12+0000\n"
"Last-Translator: \"Dylan Kiss (dyki)\" <dyki@odoo.com>\n"
"POT-Creation-Date: 2026-02-27 18:38+0000\n"
"PO-Revision-Date: 2026-01-14 11:38+0000\n"
"Last-Translator: \"Tony Ng (ngto)\" <ngto@odoo.com>\n"
"Language-Team: Chinese (Traditional Han script) <https://translate.odoo.com/"
"projects/odoo-19/web/zh_Hant/>\n"
"Language: zh_TW\n"
@ -22,7 +24,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.12.2\n"
"X-Generator: Weblate 5.14.3\n"
#. module: web
#. odoo-javascript
@ -538,8 +540,8 @@ msgstr "<span id=\"line_tax_ids\">15%</span>"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
msgid "<span itemprop=\"name\">Deco Addict</span>"
msgstr "<span itemprop=\"name\">Deco Addict</span>"
msgid "<span itemprop=\"name\">Acme Corporation</span>"
msgstr ""
#. module: web
#: model_terms:ir.ui.view,arch_db:web.report_invoice_wizard_preview
@ -2149,7 +2151,7 @@ msgstr "貨幣"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Currency field"
msgstr ""
msgstr "貨幣欄位"
#. module: web
#. odoo-javascript
@ -2270,7 +2272,7 @@ msgstr "日期及時間"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/datetime/datetime_field.js:0
msgid "Date Format"
msgstr ""
msgstr "日期格式"
#. module: web
#. odoo-javascript
@ -3097,7 +3099,7 @@ msgstr "篩選"
#. odoo-javascript
#: code:addons/web/static/src/views/pivot/pivot_controller.xml:0
msgid "Flip axis"
msgstr "翻轉軸"
msgstr "對調數軸"
#. module: web
#. odoo-javascript
@ -3166,9 +3168,9 @@ msgid ""
"\n"
"Tip: try to flip axis, filter further or reduce the number of measures."
msgstr ""
"對於 Excel 兼容性,如果列數超過 16384無法匯出資料。\n"
"為兼容 Excel若有超過 16384 個直欄,便無法匯出資料。\n"
"\n"
"提示:嘗試翻轉軸,進一步過濾或減少所選資料"
"提示:你可嘗試對調數軸、進一步篩選資料,或減少量度項目。"
#. module: web
#. odoo-javascript
@ -3418,7 +3420,7 @@ msgstr "首頁功能表"
#. odoo-javascript
#: code:addons/web/static/src/search/utils/dates.js:0
msgid "Hour"
msgstr ""
msgstr "小時"
#. module: web
#. odoo-python
@ -3441,7 +3443,7 @@ msgstr "如何取得應用程式"
#. odoo-javascript
#: code:addons/web/static/src/core/color_picker/custom_color_picker/custom_color_picker.xml:0
msgid "Hue"
msgstr ""
msgstr "色調"
#. module: web
#. odoo-javascript
@ -3516,6 +3518,14 @@ msgstr ""
"若勾選,按下標籤會開啟允許直接編輯它的表單。請留意,如果也有設定顏色欄位,會"
"以標籤版本先行。因此,按下標籤時,不會顯示顏色選擇器。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
msgid ""
"If checked, the checkboxes will be displayed in a column. Otherwise, they "
"will be inlined."
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/boolean_favorite/boolean_favorite_field.js:0
@ -4079,19 +4089,19 @@ msgstr "大"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 12 months"
msgstr ""
msgstr "過去 12 個月"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 30 days"
msgstr ""
msgstr "最近30天"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last 7 days"
msgstr ""
msgstr "最近7天"
#. module: web
#: model:ir.model.fields,field_description:web.field_base_document_layout__write_uid
@ -4109,7 +4119,7 @@ msgstr "最後更新於"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_components.js:0
msgid "Last month"
msgstr ""
msgstr "上個月"
#. module: web
#. odoo-javascript
@ -4252,7 +4262,7 @@ msgstr "登出"
#. odoo-python
#: code:addons/web/controllers/home.py:0
msgid "Login"
msgstr ""
msgstr "登入"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.external_layout_bold
@ -4457,6 +4467,12 @@ msgstr "銀河"
msgid "Minimal precision"
msgstr "最小精確度"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/float/float_field.js:0
msgid "Minimum Digits"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/timezone_mismatch/timezone_mismatch_field.js:0
@ -4869,6 +4885,12 @@ msgstr "沒有資料"
msgid "No data to display"
msgstr "無資料可供顯示"
#. module: web
#. odoo-python
#: code:addons/web/controllers/pivot.py:0
msgid "No data to export"
msgstr "沒有數據可匯出"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/debug/debug_menu.js:0
@ -4884,8 +4906,8 @@ msgstr "找不到任何裝置。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/emoji_picker/emoji_picker.xml:0
msgid "No emoji matches your search"
msgstr "沒有表情符號符合你的搜尋"
msgid "No emojis match your search"
msgstr ""
#. module: web
#. odoo-javascript
@ -4936,7 +4958,7 @@ msgstr "找不到結果"
#. odoo-javascript
#: code:addons/web/static/src/core/select_menu/select_menu.xml:0
msgid "No results"
msgstr ""
msgstr "沒有結果"
#. module: web
#. odoo-javascript
@ -5160,7 +5182,6 @@ msgstr "出錯了!"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/confirmation_dialog/confirmation_dialog.js:0
#: code:addons/web/static/src/core/dialog/dialog.xml:0
#: code:addons/web/static/src/public/error_notifications.js:0
#: code:addons/web/static/src/views/calendar/calendar_year/calendar_year_popover.xml:0
#: code:addons/web/static/src/views/view_dialogs/form_view_dialog.xml:0
@ -6588,10 +6609,11 @@ msgstr "特殊:"
#. module: web
#: model_terms:ir.ui.view,arch_db:web.config_speedscope_index
msgid "Speedscope"
msgstr ""
msgstr "速度計"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.js:0
#: code:addons/web/static/src/views/graph/graph_controller.xml:0
msgid "Stacked"
msgstr "堆疊"
@ -6693,7 +6715,7 @@ msgstr "樣式錯誤"
#. odoo-javascript
#: code:addons/web/static/src/views/fields/properties/property_definition.xml:0
msgid "Suffix"
msgstr ""
msgstr "後綴"
#. module: web
#. odoo-javascript
@ -6905,6 +6927,12 @@ msgstr ""
msgid "The domain should not involve non-literals"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The file is not an image, resizing is not possible"
msgstr ""
#. module: web
#. odoo-python
#: code:addons/web/models/res_users_settings_embedded_action.py:0
@ -6928,6 +6956,12 @@ msgid ""
"is taking too much time."
msgstr "操作被中斷了。這通常意味著目前的操作花費了太多時間。"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/utils/files.js:0
msgid "The resizing of the image failed"
msgstr ""
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/views/fields/signature/signature_field.js:0
@ -7564,7 +7598,7 @@ msgstr "使用者界面"
#. module: web
#: model:ir.model,name:web.model_res_users_settings
msgid "User Settings"
msgstr ""
msgstr "使用者設定"
#. module: web
#: model:ir.model,name:web.model_res_users_settings_embedded_action
@ -7728,6 +7762,7 @@ msgstr "WC"
#: code:addons/web/static/src/core/errors/error_dialogs.js:0
#: code:addons/web/static/src/search/control_panel/control_panel.js:0
#: code:addons/web/static/src/views/fields/domain/domain_field.xml:0
#: code:addons/web/static/src/views/fields/json_checkboxes/json_checkboxes_field.xml:0
msgid "Warning"
msgstr "警告"
@ -8125,7 +8160,7 @@ msgstr "醫神"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "after"
msgstr ""
msgstr "之後"
#. module: web
#. odoo-javascript
@ -14561,7 +14596,7 @@ msgstr ""
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "greater than"
msgstr ""
msgstr "大於"
#. module: web
#. odoo-javascript
@ -15947,13 +15982,13 @@ msgstr "非存在於"
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "is not set"
msgstr ""
msgstr "未設定"
#. module: web
#. odoo-javascript
#: code:addons/web/static/src/core/tree_editor/tree_editor_operator_editor.js:0
msgid "is set"
msgstr ""
msgstr "已設定"
#. module: web
#. odoo-javascript
@ -26866,6 +26901,12 @@ msgstr "空缺"
msgid "ココ"
msgstr "ココ"
#~ msgid "No emoji matches your search"
#~ msgstr "沒有表情符號符合你的搜尋"
#~ msgid "<span itemprop=\"name\">Deco Addict</span>"
#~ msgstr "<span itemprop=\"name\">Deco Addict</span>"
#~ msgid "Angle"
#~ msgstr "角度"

View file

@ -147,7 +147,7 @@ class IrHttp(models.AbstractModel):
'id': comp.id,
'name': comp.name,
'sequence': comp.sequence,
'child_ids': (comp.child_ids & user_companies).ids,
'child_ids': (comp.child_ids & all_companies_in_hierarchy_sudo).ids,
'parent_id': comp.parent_id.id,
'currency_id': comp.currency_id.id,
} for comp in user_companies

View file

@ -446,7 +446,7 @@ class Base(models.AbstractModel):
all_records = self.browse().union(*recordset_groups)
record_mapped = dict(zip(
all_records._ids,
all_records.web_read(unfold_read_specification),
all_records.web_read(unfold_read_specification or {}),
strict=True,
))
@ -561,7 +561,7 @@ class Base(models.AbstractModel):
fold = group.pop('__fold', False)
groupby_value = group[groupby_spec]
# For relational/date/datetime field
# For relational/date/datetime/property tags field
raw_groupby_value = groupby_value[0] if isinstance(groupby_value, tuple) else groupby_value
limit = unfold_read_default_limit
@ -841,7 +841,7 @@ class Base(models.AbstractModel):
):
# It doesn't respect the order with aggregates inside
expand_groups = self._web_read_group_expand(domain, groups, groupby[0], aggregates, order)
if not limit or len(expand_groups) < limit:
if not limit or len(expand_groups) <= limit:
# Ditch the result of expand_groups because the limit is reached and to avoid
# returning inconsistent result inside length of web_read_group
groups = expand_groups
@ -1265,7 +1265,7 @@ class Base(models.AbstractModel):
if property_type == 'tags':
tags = definition.get('tags') or []
tags = {tag[0]: tag for tag in tags}
tags = {tag[0]: tuple(tag) for tag in tags}
def formatter_property_tags(value):
if not value:
@ -1274,7 +1274,7 @@ class Base(models.AbstractModel):
AND([[(fullname, 'not in', tag)] for tag in tags]),
]) if tags else []
# replace tag raw value with list of raw value, label and color
# replace tag raw value with tuple of raw value, label and color
return tags.get(value), [(fullname, 'in', value)]
return formatter_property_tags
@ -1345,19 +1345,21 @@ class Base(models.AbstractModel):
"""
Return the values in the image of the provided domain by field_name.
:param model_domain: domain whose image is returned
:param extra_domain: extra domain to use when counting records
associated with field values
:param field_name: the name of a field (type ``many2one`` or
``selection``)
:param enable_counters: whether to set the key ``'__count'`` in
image values
:param only_counters: whether to retrieve information on the
``model_domain`` image or only counts based on
``model_domain`` and ``extra_domain``. In the later case,
the counts are set whatever is enable_counters.
:param limit: maximal number of values to fetch
:param bool set_limit: whether to use the provided limit (if any)
:param kwargs: Keyword arguments:
* ``model_domain``: domain whose image is returned
* ``extra_domain``: extra domain to use when counting records
associated with field values
* ``enable_counters``: whether to set the key ``'__count'`` in
image values
* ``only_counters``: whether to retrieve information on the
``model_domain`` image or only counts based on
``model_domain`` and ``extra_domain``. In the later case,
the counts are set whatever is enable_counters.
* ``limit``: maximal number of values to fetch
* ``set_limit``: whether to use the provided limit (if any)
:return: a dict of the form:
::
@ -1532,14 +1534,16 @@ class Base(models.AbstractModel):
Return the values of a field of type selection possibly enriched
with counts of associated records in domain.
:param enable_counters: whether to set the key ``'__count'`` on
values returned. Default is ``False``.
:param expand: whether to return the full range of values for
the selection field or only the field image values. Default
is ``False``.
:param field_name: the name of a field of type selection
:param model_domain: domain used to determine the field image
values and counts. Default is an empty list.
:param kwargs:
* model_domain: domain used to determine the field image
values and counts. Default is an empty list.
* enable_counters: whether to set the key ``'__count'`` on
values returned. Default is ``False``.
* expand: whether to return the full range of values for
the selection field or only the field image values. Default
is ``False``.
:return: a list of dicts of the form
::
@ -1585,26 +1589,26 @@ class Base(models.AbstractModel):
:param field_name: the name of a field; of type many2one or selection.
:param kwargs: additional features
:param category_domain: domain generated by categories.
Default is ``[]``.
:param comodel_domain: domain of field values (if relational).
Default is ``[]``.
:param enable_counters: whether to count records by value.
Default is ``False``.
:param expand: whether to return the full range of field values in
comodel_domain or only the field image values (possibly
filtered and/or completed with parents if hierarchize is set).
Default is ``False``.
:param filter_domain: domain generated by filters.
Default is ``[]``.
:param hierarchize: determines if the categories must be displayed
hierarchically (if possible). If set to true and
``_parent_name`` is set on the comodel field, the information
necessary for the hierarchization will be returned.
Default is ``True``.
:param limit: integer, maximal number of values to fetch.
Default is ``None`` (no limit).
:param search_domain: base domain of search. Default is ``[]``.
* category_domain: domain generated by categories.
Default is ``[]``.
* comodel_domain: domain of field values (if relational).
Default is ``[]``.
* enable_counters: whether to count records by value.
Default is ``False``.
* expand: whether to return the full range of field values in
comodel_domain or only the field image values (possibly
filtered and/or completed with parents if hierarchize is set).
Default is ``False``.
* filter_domain: domain generated by filters.
Default is ``[]``.
* hierarchize: determines if the categories must be displayed
hierarchically (if possible). If set to true and
``_parent_name`` is set on the comodel field, the information
necessary for the hierarchization will be returned.
Default is ``True``.
* limit: integer, maximal number of values to fetch.
Default is ``None`` (no limit).
* search_domain: base domain of search. Default is ``[]``.
:return: ::

View file

@ -22,14 +22,17 @@ class ResUsersSettings(models.Model):
embedded_actions_config = self.env['res.users.settings.embedded.action'].search([
('user_setting_id', '=', self.id), ('action_id', '=', action_id), ('res_id', '=', res_id)
], limit=1)
new_vals = {}
for field, value in vals.items():
if field in ('embedded_actions_order', 'embedded_actions_visibility'):
vals[field] = ','.join('false' if action_id is False else str(action_id) for action_id in value)
new_vals[field] = ','.join('false' if action_id is False else str(action_id) for action_id in value)
else:
new_vals[field] = value
if embedded_actions_config:
embedded_actions_config.write(vals)
embedded_actions_config.write(new_vals)
else:
self.env['res.users.settings.embedded.action'].create({
**vals,
**new_vals,
'user_setting_id': self.id,
'action_id': action_id,
'res_id': res_id,

View file

@ -34,7 +34,16 @@ $lato-font-path: './lato';
font-style: $style;
unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF;
}
// Telugu: U+0C00-0C7F
@font-face {
font-family: 'Odoo Unicode Support Noto';
src: url('https://fonts.odoocdn.com/fonts/noto/NotoSansTelugu-#{$type}.woff2') format('woff2'),
url('https://fonts.odoocdn.com/fonts/noto/NotoSansTelugu-#{$type}.woff') format('woff'),
url('https://fonts.odoocdn.com/fonts/noto/NotoSansTelugu-#{$type}.ttf') format('truetype');
font-weight: $weight;
font-style: $style;
unicode-range: U+0C00-0C7F;
}
@font-face {
font-family: 'Lato';
src: url('#{$lato-font-path}/Lato-#{$type}-webfont.eot');

View file

@ -59,10 +59,10 @@ import { waitUntil } from "./time";
*
* @typedef {{
* contains?: string;
* count?: number;
* displayed?: boolean;
* empty?: boolean;
* eq?: number;
* exact?: number;
* first?: boolean;
* focusable?: boolean;
* has?: boolean;
@ -90,6 +90,10 @@ import { waitUntil } from "./time";
* raw?: boolean;
* }} QueryTextOptions
*
* @typedef {{
* raw?: boolean;
* }} QueryValueOptions
*
* @typedef {"both" | "x" | "y"} ScrollAxis
*
* @typedef {import("./time").WaitOptions} WaitOptions
@ -116,11 +120,9 @@ const {
innerWidth,
innerHeight,
Map,
MutationObserver,
Number: { isInteger: $isInteger, isNaN: $isNaN, parseInt: $parseInt, parseFloat: $parseFloat },
Object: { entries: $entries, keys: $keys, values: $values },
RegExp,
Set,
String: { raw: $raw },
window,
} = globalThis;
@ -326,6 +328,13 @@ function getFiltersDescription(modifierInfo) {
return description;
}
/**
* @param {Node} node
*/
function getInlineNodeText(node) {
return getNodeText(node, { inline: true });
}
/**
* @param {Node} node
* @returns {NodeValue}
@ -337,7 +346,7 @@ function getNodeContent(node) {
case "textarea":
return getNodeValue(node);
case "select":
return [...node.selectedOptions].map(getNodeValue).join(",");
return [...node.selectedOptions].map((node) => getNodeValue(node)).join(",");
}
return getNodeText(node);
}
@ -355,6 +364,30 @@ function getNodeShadowRoot(node) {
return node.shadowRoot;
}
/**
* @param {string} pseudoClass
*/
function getQueryFilter(pseudoClass, content) {
const makeQueryFilter = customPseudoClasses.get(pseudoClass);
try {
return makeQueryFilter(content);
} catch (err) {
let message = `error while parsing pseudo-class ':${pseudoClass}'`;
const cause = String(err?.message || err);
if (cause) {
message += `: ${cause}`;
}
throw new HootDomError(message);
}
}
/**
* @param {Node} node
*/
function getRawValue(node) {
return node.value;
}
/**
* @param {string} string
*/
@ -374,6 +407,17 @@ function getWaitForNoneMessage() {
return message;
}
/**
*
* @param {number} count
* @param {Parameters<NodeFilter>[0]} _node
* @param {Parameters<NodeFilter>[1]} _i
* @param {Parameters<NodeFilter>[2]} nodes
*/
function hasNodeCount(count, _node, _i, nodes) {
return count === nodes.length;
}
/**
* @param {string} [char]
*/
@ -477,28 +521,27 @@ function isWhiteSpace(char) {
}
/**
* @param {string} pseudoClass
* @param {(node: Node) => NodeValue} getContent
* @param {(node: Node) => string} getContent
* @param {boolean} exact
*/
function makePatternBasedPseudoClass(pseudoClass, getContent) {
return (content) => {
let regex;
try {
regex = parseRegExp(content);
} catch (err) {
throw selectorError(pseudoClass, err.message);
}
function makePseudoClassMatcher(getContent, exact) {
return function makePartialMatcher(content) {
const regex = parseRegExp(content);
if (isInstanceOf(regex, RegExp)) {
return function containsRegExp(node) {
return regex.test(String(getContent(node)));
return function stringMatches(node) {
return regex.test(getContent(node));
};
} else {
const lowerContent = content.toLowerCase();
return function containsString(node) {
return getStringContent(String(getContent(node)))
.toLowerCase()
.includes(lowerContent);
};
if (exact) {
return function stringEquals(node) {
return getContent(node).toLowerCase() === lowerContent;
};
} else {
return function stringContains(node) {
return getContent(node).toLowerCase().includes(lowerContent);
};
}
}
};
}
@ -709,7 +752,6 @@ function parseSelector(selector) {
if (currentPseudo) {
if (parens[0] === parens[1]) {
const [pseudo, content] = currentPseudo;
const makeFilter = customPseudoClasses.get(pseudo);
if (pseudo === "iframe" && !currentPart[0].startsWith("iframe")) {
// Special case: to optimise the ":iframe" pseudo class, we
// always select actual `iframe` elements.
@ -717,7 +759,7 @@ function parseSelector(selector) {
// but this pseudo won't work on non-iframe elements anyway.
currentPart[0] = `iframe${currentPart[0]}`;
}
const filter = makeFilter(getStringContent(content));
const filter = getQueryFilter(pseudo, getStringContent(content));
selectorFilterDescriptors.set(filter, [pseudo, content]);
currentPart.push(filter);
currentPseudo = null;
@ -872,14 +914,6 @@ function registerQueryMessage(filteredNodes, expectedCount) {
return invalidCount ? lastQueryMessage : "";
}
/**
* @param {string} pseudoClass
* @param {string} message
*/
function selectorError(pseudoClass, message) {
return new HootDomError(`invalid selector \`:${pseudoClass}\`: ${message}`);
}
/**
* Wrapper around '_queryAll' calls to ensure global variables are properly cleaned
* up on any thrown error.
@ -906,7 +940,10 @@ function _guardedQueryAll(target, options) {
function _queryAll(target, options) {
queryAllLevel++;
const { exact, root, ...modifiers } = options || {};
const { count, root, ...modifiers } = options || {};
if (count !== null && count !== undefined && (!$isInteger(count) || count <= 0)) {
throw new HootDomError(`invalid 'count' option: should be a positive integer`);
}
/** @type {Node[]} */
let nodes = [];
@ -946,15 +983,14 @@ function _queryAll(target, options) {
if (content === false || !customPseudoClasses.has(modifier)) {
continue;
}
const makeFilter = customPseudoClasses.get(modifier);
const filter = makeFilter(content);
const filter = getQueryFilter(modifier, content);
modifierFilters.push(filter);
globalFilterDescriptors.set(filter, [modifier, content]);
}
const filteredNodes = applyFilters(modifierFilters, nodes);
// Register query message (if needed), and/or throw an error accordingly
const message = registerQueryMessage(filteredNodes, exact);
const message = registerQueryMessage(filteredNodes, count);
if (message) {
throw new HootDomError(message);
}
@ -969,7 +1005,7 @@ function _queryAll(target, options) {
* @param {QueryOptions} options
*/
function _queryOne(target, options) {
return _guardedQueryAll(target, { ...options, exact: 1 })[0];
return _guardedQueryAll(target, { ...options, count: 1 })[0];
}
/**
@ -1081,13 +1117,20 @@ let queryAllLevel = 0;
const customPseudoClasses = new Map();
customPseudoClasses
.set("contains", makePatternBasedPseudoClass("contains", getNodeText))
.set("contains", makePseudoClassMatcher(getInlineNodeText, false))
.set("count", (strCount) => {
const count = $parseInt(strCount);
if (!$isInteger(count) || count <= 0) {
throw new HootDomError(`expected count to be a positive integer (got "${strCount}")`);
}
return hasNodeCount.bind(null, count);
})
.set("displayed", () => isNodeDisplayed)
.set("empty", () => isEmpty)
.set("eq", (strIndex) => {
const index = $parseInt(strIndex);
if (!$isInteger(index)) {
throw selectorError("eq", `expected index to be an integer (got ${strIndex})`);
throw new HootDomError(`expected index to be an integer (got "${strIndex}")`);
}
return index;
})
@ -1103,7 +1146,8 @@ customPseudoClasses
.set("scrollable", (axis) => isNodeScrollable.bind(null, axis))
.set("selected", () => isNodeSelected)
.set("shadow", () => getNodeShadowRoot)
.set("value", makePatternBasedPseudoClass("value", getNodeValue))
.set("text", makePseudoClassMatcher(getInlineNodeText, true))
.set("value", makePseudoClassMatcher(getRawValue, false))
.set("viewPort", () => isNodeInViewPort)
.set("visible", () => isNodeVisible);
@ -1167,9 +1211,13 @@ export function getNodeAttribute(node, attribute) {
/**
* @param {Node} node
* @param {QueryValueOptions} [options]
* @returns {NodeValue}
*/
export function getNodeValue(node) {
export function getNodeValue(node, options) {
if (options?.raw) {
return getRawValue(node);
}
switch (node.type) {
case "checkbox":
case "radio":
@ -1185,8 +1233,9 @@ export function getNodeValue(node) {
case "time":
case "week":
return node.valueAsDate.toISOString();
default:
return node.value || "";
}
return node.value;
}
/**
@ -1801,51 +1850,6 @@ export function matches(target, selector) {
return elementsMatch(_guardedQueryAll(target), selector);
}
/**
* Listens for DOM mutations on a given target.
*
* This helper has 2 main advantages over directly calling the native MutationObserver:
* - it ensures a single observer is created for a given target, even if multiple
* callbacks are registered;
* - it keeps track of these observers, which allows to check whether an observer
* is still running while it should not, and to disconnect all running observers
* at once.
*
* @param {HTMLElement} target
* @param {MutationCallback} callback
*/
export function observe(target, callback) {
if (observers.has(target)) {
observers.get(target).callbacks.add(callback);
} else {
const callbacks = new Set([callback]);
const observer = new MutationObserver((mutations, observer) => {
for (const callback of callbacks) {
callback(mutations, observer);
}
});
observer.observe(target, {
attributes: true,
characterData: true,
childList: true,
subtree: true,
});
observers.set(target, { callbacks, observer });
}
return function disconnect() {
if (!observers.has(target)) {
return;
}
const { callbacks, observer } = observers.get(target);
callbacks.delete(callback);
if (!callbacks.size) {
observer.disconnect();
observers.delete(target);
}
};
}
/**
* Returns a list of nodes matching the given {@link Target}.
* This function can either be used as a **template literal tag** (only supports
@ -1859,12 +1863,11 @@ export function observe(target, callback) {
* This function allows all string selectors supported by the native {@link Element.querySelector}
* along with some additional custom pseudo-classes:
*
* - `:contains(text)`: matches nodes whose *content* matches the given *text*;
* * given *text* supports regular expression syntax (e.g. `:contains(/^foo.+/)`)
* and is case-insensitive;
* * given *text* will be matched against:
* - an `<input>`, `<textarea>` or `<select>` element's **value**;
* - or any other element's **inner text**.
* - `:contains(text)`: matches nodes whose *text content* includes the given *text*.
* * The match is **partial** and **case-insensitive**;
* * Given *text* also supports regular expressions (e.g. `:contains(/^foo.+/)`).
* - `:count`: return nodes if their count match the given *count*.
* If not matching, an error is thrown;
* - `:displayed`: matches nodes that are "displayed" (see {@link isDisplayed});
* - `:empty`: matches nodes that have an empty *content* (**value** or **inner text**);
* - `:eq(n)`: matches the *nth* node (0-based index);
@ -1880,22 +1883,23 @@ export function observe(target, callback) {
* - `:selected`: matches nodes that are selected (e.g. `<option>` elements);
* - `:shadow`: matches nodes that have shadow roots, and returns their shadow root;
* - `:scrollable(axis)`: matches nodes that are scrollable (see {@link isScrollable});
* - `:text(text)`: matches nodes whose *content* is strictly equal to the given *text*;
* * The match is **exact**, and **case-insensitive**;
* * Given *text* also supports regular expressions (e.g. `:text(/^foo.+/)`).
* - `:value(value)`: matches nodes whose *value* is strictly equal to the given *value*;
* * The match is **partial**, and **case-insensitive**;
* * Given *value* also supports regular expressions (e.g. `:value(/^foo.+/)`).
* - `:viewPort`: matches nodes that are contained in the current view port (see
* {@link isInViewPort});
* - `:visible`: matches nodes that are "visible" (see {@link isVisible});
*
* An `options` object can be specified to filter[1] the results:
* - `displayed`: whether the nodes must be "displayed" (see {@link isDisplayed});
* - `exact`: the exact number of nodes to match (throws an error if the number of
* nodes doesn't match);
* - `focusable`: whether the nodes must be "focusable" (see {@link isFocusable});
* - `root`: the root node to query the selector in (defaults to the current fixture);
* - `viewPort`: whether the nodes must be partially visible in the current viewport
* (see {@link isInViewPort});
* - `visible`: whether the nodes must be "visible" (see {@link isVisible}).
* * This option implies `displayed`
* - any of the *custom pseudo-classes* can be given as an option, with the value
* being a boolean for standalone pseudo-classes (e.g. `{ empty: true }`), or a
* string for the others (e.g. `{ contains: "text" }`).
*
* [1] these filters (except for `exact` and `root`) achieve the same result as
* [1] these filters (except for `count` and `root`) achieve the same result as
* using their homonym pseudo-classes on the final group of the given selector
* string (e.g. ```queryAll`ul > li:visible`;``` = ```queryAll("ul > li", { visible: true })```).
*
@ -1917,10 +1921,11 @@ export function observe(target, callback) {
* queryAll`#editor:shadow div`; // -> [div, div, ...] (inside shadow DOM)
* @example
* // with options
* queryAll(`div:first`, { exact: 1 }); // -> [div]
* queryAll(`div:first`, { count: 1 }); // -> [div]
* queryAll(`div`, { root: queryOne`iframe` }); // -> [div, div, ...]
* // redundant, but possible
* queryAll(`button:visible`, { visible: true }); // -> [button, button, ...]
* // the next 2 queries will return the same results
* queryAll(`button:visible`); // -> [button, button, ...]
* queryAll(`button`, { visible: true }); // -> [button, button, ...]
*/
export function queryAll(target, options) {
[target, options] = parseRawArgs(arguments);
@ -1989,12 +1994,12 @@ export function queryAllTexts(target, options) {
* *values* of the matching nodes.
*
* @param {Target} target
* @param {QueryOptions} [options]
* @param {QueryOptions & QueryValueOptions} [options]
* @returns {NodeValue[]}
*/
export function queryAllValues(target, options) {
[target, options] = parseRawArgs(arguments);
return _guardedQueryAll(target, options).map(getNodeValue);
return _guardedQueryAll(target, options).map((node) => getNodeValue(node, options));
}
/**
@ -2039,20 +2044,20 @@ export function queryFirst(target, options) {
}
/**
* Performs a {@link queryAll} with the given arguments, along with a forced `exact: 1`
* Performs a {@link queryAll} with the given arguments, along with a forced `count: 1`
* option to ensure only one node matches the given {@link Target}.
*
* The returned value is a single node instead of a list of nodes.
*
* @param {Target} target
* @param {Omit<QueryOptions, "exact">} [options]
* @param {Omit<QueryOptions, "count">} [options]
* @returns {Element}
*/
export function queryOne(target, options) {
[target, options] = parseRawArgs(arguments);
if ($isInteger(options?.exact)) {
if ($isInteger(options?.count)) {
throw new HootDomError(
`cannot call \`queryOne\` with 'exact'=${options.exact}: did you mean to use \`queryAll\`?`
`cannot call \`queryOne\` with 'count'=${options.count}: did you mean to use \`queryAll\`?`
);
}
return _queryOne(target, options);
@ -2094,12 +2099,12 @@ export function queryText(target, options) {
* the matching node.
*
* @param {Target} target
* @param {QueryOptions} [options]
* @param {QueryOptions & QueryValueOptions} [options]
* @returns {NodeValue}
*/
export function queryValue(target, options) {
[target, options] = parseRawArgs(arguments);
return getNodeValue(_queryOne(target, options));
return getNodeValue(_queryOne(target, options), options);
}
/**

View file

@ -24,7 +24,6 @@ import {
setDimensions,
toSelector,
} from "./dom";
import { microTick } from "./time";
/**
* @typedef {Target | Promise<Target>} AsyncTarget
@ -78,6 +77,10 @@ import { microTick } from "./time";
*
* @typedef {EventOptions & KeyboardEventInit} KeyboardOptions
*
* @typedef {{
* fullClear?: boolean;
* }} KeyDownOptions
*
* @typedef {string | string[]} KeyStrokes
*
* @typedef {EventOptions & QueryOptions & {
@ -101,6 +104,11 @@ import { microTick } from "./time";
* @typedef {"bottom" | "left" | "right" | "top"} Side
*/
/**
* @template T
* @typedef {T | () => T} Resolver
*/
/**
* @template [T=EventInit]
* @typedef {T & {
@ -137,6 +145,7 @@ const {
File,
FocusEvent,
HashChangeEvent,
HTMLElement,
KeyboardEvent,
Math: { ceil: $ceil, max: $max, min: $min },
MouseEvent,
@ -160,6 +169,22 @@ const {
const $createRange = document.createRange.bind(document);
const $toString = Object.prototype.toString;
const $blur = HTMLElement.prototype.blur;
HTMLElement.prototype.blur = function mockBlur() {
if (runTime.changeTarget && runTime.changeTarget === this) {
triggerChange();
}
return $blur.call(this, ...arguments);
};
const $focus = HTMLElement.prototype.focus;
HTMLElement.prototype.focus = function mockFocus() {
if (runTime.changeTarget && runTime.changeTarget !== this) {
triggerChange();
}
return $focus.call(this, ...arguments);
};
//-----------------------------------------------------------------------------
// Internal
//-----------------------------------------------------------------------------
@ -266,7 +291,7 @@ function deleteSelection(target) {
* target: T;
* events: EventType[];
* additionalEvents?: EventType[];
* callback?: (target: T) => any;
* callback?: () => any;
* options?: EventInit;
* }} params
*/
@ -274,9 +299,7 @@ async function dispatchAndIgnore({ target, events, additionalEvents = [], callba
for (const eventType of [...events, ...additionalEvents]) {
runTime.eventsToIgnore.push(eventType);
}
if (callback) {
callback(target);
}
callback?.();
for (const eventType of events) {
await _dispatch(target, eventType, options);
}
@ -325,12 +348,19 @@ async function dispatchRelatedEvents(events, eventType, eventInit) {
}
/**
* @template T
* @template T, [R=T]
* @param {MaybeIterable<T>} value
* @param {(item: T) => R} [mapFn]
* @returns {T[]}
*/
function ensureArray(value) {
return isIterable(value) ? [...value] : [value];
function ensureArray(value, mapFn) {
if (Array.isArray(value)) {
return mapFn ? value.map(mapFn) : value;
}
if (isIterable(value)) {
return Array.from(value, mapFn);
}
return [mapFn ? mapFn(value) : value];
}
function getCurrentEvents() {
@ -344,13 +374,20 @@ function getCurrentEvents() {
function getDefaultRunTimeValue() {
return {
isComposing: false,
// Data transfers
// Keyboard & data transfers
/** @type {HTMLElement | null} */
changeTarget: null,
/** @type {(() => any)[]} */
changeTargetListeners: [],
/** @type {DataTransfer | null} */
clipboardData: null,
/** @type {DataTransfer | null} */
dataTransfer: null,
/** @type {string | null} */
initialValue: null,
isComposing: false,
/** @type {string | null} */
key: null,
// Drag & drop
canStartDrag: false,
@ -359,7 +396,6 @@ function getDefaultRunTimeValue() {
// Pointer
clickCount: 0,
key: null,
/** @type {HTMLElement | null} */
pointerDownTarget: null,
pointerDownTimeout: 0,
@ -567,18 +603,22 @@ function getFirstCommonParent(a, b) {
}
/**
* Returns the interactive pointer target from a given element, unless the element
* is falsy, or the 'interactive' option is set to `false`.
*
* If an 'originalTarget' is given, the helper will deliberately throw an error if
* no interactive elements are found.
*
* @param {HTMLElement} element
* @param {Target} originalTarget
* @param {QueryOptions} options
* @param {AsyncTarget} [originalTarget]
*/
function getPointerTarget(element, originalTarget, options) {
if (options?.interactive === false) {
// Explicit 'interactive: false' option
// -> element can be a non-interactive element
function getPointerTarget(element, options, originalTarget) {
if (!element || options?.interactive === false) {
return element;
}
const interactiveElement = getInteractiveNode(element);
if (!interactiveElement) {
if (!interactiveElement && originalTarget) {
queryAny(originalTarget, { ...options, interactive: true }); // Will throw if no elements are found
}
return interactiveElement;
@ -662,7 +702,7 @@ function getStringSelection(target) {
/**
* @param {Node} node
* @param {...string} tagNames
* @param {...string} tagNames
*/
function hasTagName(node, ...tagNames) {
return tagNames.includes(getTag(node));
@ -716,7 +756,7 @@ function isPrevented(event) {
* @returns {KeyboardEventInit}
*/
function parseKeyStrokes(keyStrokes, options) {
return (isIterable(keyStrokes) ? [...keyStrokes] : [keyStrokes]).map((key) => {
return ensureArray(keyStrokes, (key) => {
const lower = key.toLowerCase();
return {
...options,
@ -789,8 +829,9 @@ function registerButton(eventInit, toggle) {
* @param {Event} ev
*/
function registerFileInput({ target }) {
if (getTag(target) === "input" && target.type === "file") {
runTime.fileInput = target;
const actualTarget = target.shadowRoot ? target.shadowRoot.activeElement : target;
if (getTag(actualTarget) === "input" && actualTarget.type === "file") {
runTime.fileInput = actualTarget;
} else {
runTime.fileInput = null;
}
@ -798,46 +839,32 @@ function registerFileInput({ target }) {
/**
* @param {EventTarget} target
* @param {string} initialValue
* @param {ConfirmAction} confirmAction
*/
async function registerForChange(target, initialValue, confirmAction) {
function dispatchChange() {
return target.value !== initialValue && _dispatch(target, "change");
}
async function registerForChange(target, confirmAction) {
confirmAction &&= confirmAction.toLowerCase();
if (confirmAction === "auto") {
confirmAction = getTag(target) === "input" ? "enter" : "blur";
}
if (getTag(target) === "input") {
changeTargetListeners.push(
on(target, "keydown", (ev) => {
if (isPrevented(ev) || ev.key !== "Enter") {
return;
}
removeChangeTargetListeners();
afterNextDispatch = dispatchChange;
})
);
} else if (confirmAction === "enter") {
const parentDocument = getDocument(target);
const parentView = parentDocument.defaultView;
if (confirmAction === "enter" && getTag(target) !== "input") {
throw new HootInteractionError(
`"enter" confirm action is only supported on <input/> elements`
);
}
changeTargetListeners.push(
on(target, "blur", () => {
removeChangeTargetListeners();
dispatchChange();
}),
on(target, "change", removeChangeTargetListeners)
runTime.changeTarget = target;
runTime.changeTargetListeners.push(
on(parentView, "focusout", triggerChange),
on(parentView, "change", removeChangeTargetListeners)
);
switch (confirmAction) {
case "blur": {
await _hover(
getDocument(target).body,
parentDocument.body,
{ position: { x: 0, y: 0 } },
{ originalTarget: target }
);
@ -881,19 +908,31 @@ function registerSpecialKey(eventInit, toggle) {
}
function removeChangeTargetListeners() {
while (changeTargetListeners.length) {
changeTargetListeners.pop()();
for (const listener of runTime.changeTargetListeners) {
listener();
}
runTime.changeTarget = null;
runTime.changeTargetListeners = [];
}
/**
* @template T
* @param {Resolver<T>} resolver
* @returns {T}
*/
function resolve(resolver) {
return typeof resolver === "function" ? resolver() : resolver;
}
/**
* @param {HTMLElement | null} target
* @param {QueryOptions} [options]
*/
function setPointerDownTarget(target) {
function setPointerDownTarget(target, options) {
if (runTime.pointerDownTarget) {
runTime.previousPointerDownTarget = runTime.pointerDownTarget;
}
runTime.pointerDownTarget = target;
runTime.pointerDownTarget = getPointerTarget(target, options);
runTime.canStartDrag = false;
}
@ -991,6 +1030,16 @@ function toEventPosition(clientX, clientY, position) {
};
}
async function triggerChange() {
const target = runTime.changeTarget;
const hasValueChanged = runTime.initialValue !== target.value;
runTime.initialValue = null;
removeChangeTargetListeners();
if (target && hasValueChanged) {
return _dispatch(target, "change");
}
}
/**
* @param {EventTarget} target
* @param {PointerEventInit} pointerInit
@ -1057,10 +1106,13 @@ async function triggerFocus(target) {
return;
}
if (previous !== target.ownerDocument.body) {
if (runTime.changeTarget) {
await triggerChange();
}
await dispatchAndIgnore({
target: previous,
events: ["blur", "focusout"],
callback: (el) => el.blur(),
callback: $blur.bind(previous),
options: { relatedTarget: target },
});
}
@ -1070,7 +1122,7 @@ async function triggerFocus(target) {
target,
events: ["focus", "focusin"],
additionalEvents: ["select"],
callback: (el) => el.focus(),
callback: $focus.bind(target),
options: { relatedTarget: previous },
});
if (previousSelection && previousSelection === getStringSelection(target)) {
@ -1080,22 +1132,17 @@ async function triggerFocus(target) {
}
/**
* @param {EventTarget} target
* @param {Resolver<EventTarget>} targetResolver
* @param {FillOptions} [options]
*/
async function _clear(target, options) {
// Inputs and text areas
const initialValue = target.value;
async function _clear(targetResolver, options) {
// Simulates 2 key presses:
// - Control + A: selects all the text
// - Backspace: deletes the text
fullClear = true;
await _press(target, { ctrlKey: true, key: "a" });
await _press(target, { key: "Backspace" });
fullClear = false;
await _press(targetResolver, { ctrlKey: true, key: "a" });
await _press(targetResolver, { key: "Backspace" }, { fullClear: true });
await registerForChange(target, initialValue, options?.confirm);
await registerForChange(resolve(targetResolver), options?.confirm);
}
/**
@ -1143,45 +1190,41 @@ async function _dispatch(target, type, eventInit) {
const event = new Constructor(type, params);
target.dispatchEvent(event);
await Promise.resolve();
getCurrentEvents().push(event);
if (afterNextDispatch) {
const callback = afterNextDispatch;
afterNextDispatch = null;
await microTick().then(callback);
}
return event;
}
/**
* @param {EventTarget} target
* @param {Resolver<EventTarget>} targetResolver
* @param {InputValue} value
* @param {FillOptions} [options]
*/
async function _fill(target, value, options) {
const initialValue = target.value;
async function _fill(targetResolver, value, options) {
const initialTarget = resolve(targetResolver);
if (getTag(target) === "input") {
switch (target.type) {
case "color": {
target.value = String(value);
await _dispatch(target, "input");
await _dispatch(target, "change");
if (getTag(initialTarget) === "input") {
switch (initialTarget.type) {
case "color":
case "time": {
initialTarget.value = String(value);
await _dispatch(initialTarget, "input");
await _dispatch(initialTarget, "change");
return;
}
case "file": {
const files = ensureArray(value);
if (files.length > 1 && !target.multiple) {
if (files.length > 1 && !initialTarget.multiple) {
throw new HootInteractionError(
`input[type="file"] does not support multiple files`
);
}
target.files = createDataTransfer({ files }).files;
initialTarget.files = createDataTransfer({ files }).files;
await _dispatch(target, "change");
await _dispatch(initialTarget, "change");
return;
}
case "range": {
@ -1190,9 +1233,9 @@ async function _fill(target, value, options) {
throw new TypeError(`input[type="range"] only accept 'number' values`);
}
target.value = String(numberValue);
await _dispatch(target, "input");
await _dispatch(target, "change");
initialTarget.value = String(numberValue);
await _dispatch(initialTarget, "input");
await _dispatch(initialTarget, "change");
return;
}
}
@ -1201,25 +1244,25 @@ async function _fill(target, value, options) {
if (options?.instantly) {
// Simulates filling the clipboard with the value (can be from external source)
globalThis.navigator.clipboard.writeText(value).catch();
await _press(target, { ctrlKey: true, key: "v" });
await _press(targetResolver, { ctrlKey: true, key: "v" });
} else {
if (options?.composition) {
runTime.isComposing = true;
// Simulates the start of a composition
await _dispatch(target, "compositionstart");
await _dispatch(initialTarget, "compositionstart");
}
for (const char of String(value)) {
const key = char.toLowerCase();
await _press(target, { key, shiftKey: key !== char });
await _press(targetResolver, { key, shiftKey: key !== char });
}
if (options?.composition) {
runTime.isComposing = false;
// Simulates the end of a composition
await _dispatch(target, "compositionend");
await _dispatch(initialTarget, "compositionend");
}
}
await registerForChange(target, initialValue, options?.confirm);
await registerForChange(resolve(targetResolver), options?.confirm);
}
/**
@ -1228,7 +1271,7 @@ async function _fill(target, value, options) {
* @param {{ implicit?: boolean, originalTarget: AsyncTarget }} hoverOptions
*/
async function _hover(target, options, hoverOptions) {
const pointerTarget = target && getPointerTarget(target, hoverOptions.originalTarget, options);
const pointerTarget = getPointerTarget(target, options, hoverOptions.originalTarget);
const position = target && getPosition(target, options);
const previousPT = runTime.pointerTarget;
@ -1340,17 +1383,22 @@ async function _hover(target, options, hoverOptions) {
}
/**
* @param {EventTarget} target
* @param {Resolver<EventTarget>} targetResolver
* @param {KeyboardEventInit} eventInit
* @param {KeyDownOptions} [options]
*/
async function _keyDown(target, eventInit) {
async function _keyDown(targetResolver, eventInit, options) {
eventInit = { ...eventInit, ...currentEventInit.keydown };
registerSpecialKey(eventInit, true);
const keyDownTarget = resolve(targetResolver);
const repeat =
typeof eventInit.repeat === "boolean" ? eventInit.repeat : runTime.key === eventInit.key;
runTime.key = eventInit.key;
const keyDownEvent = await _dispatch(target, "keydown", { ...eventInit, repeat });
const keyDownEvent = await _dispatch(keyDownTarget, "keydown", {
...eventInit,
repeat,
});
if (isPrevented(keyDownEvent)) {
return;
@ -1361,10 +1409,11 @@ async function _keyDown(target, eventInit) {
* @param {string} type
*/
function insertValue(toInsert, type) {
const { selectionStart, selectionEnd, value } = target;
const { selectionStart, selectionEnd, value } = inputTarget;
inputData = toInsert;
inputType = type;
if (isNil(selectionStart) && isNil(selectionEnd)) {
nextValue ||= inputTarget.value;
nextValue += toInsert;
} else {
nextValue = value.slice(0, selectionStart) + toInsert + value.slice(selectionEnd);
@ -1375,21 +1424,27 @@ async function _keyDown(target, eventInit) {
}
const { ctrlKey, key, shiftKey } = keyDownEvent;
const initialValue = target.value;
const inputTarget = resolve(targetResolver);
let inputData = null;
let inputType = null;
let nextSelectionEnd = null;
let nextSelectionStart = null;
let nextValue = initialValue;
let nextValue = null;
let triggerSelect = false;
if (isEditable(target)) {
if (runTime.initialValue === null || keyDownTarget !== inputTarget) {
// If the 'keydown' event changes the target:
// -> initial value needs to be re-evaluated from the new target
runTime.initialValue = inputTarget.value;
}
if (isEditable(inputTarget)) {
switch (key) {
case "ArrowDown":
case "ArrowLeft":
case "ArrowUp":
case "ArrowRight": {
const { selectionStart, selectionEnd, value } = target;
const { selectionStart, selectionEnd, value } = inputTarget;
if (isNil(selectionStart) || isNil(selectionEnd)) {
break;
}
@ -1410,9 +1465,11 @@ async function _keyDown(target, eventInit) {
break;
}
case "Backspace": {
const { selectionStart, selectionEnd, value } = target;
if (fullClear) {
// Remove all characters
const { selectionStart, selectionEnd, value } = inputTarget;
if (options?.fullClear) {
// Remove all characters, regardless of the selection. This
// is to be used to ensure that an input without selection properties
// (e.g. input[type="number"]) can still be properly cleared.
nextValue = "";
} else if (isNil(selectionStart) || isNil(selectionEnd)) {
// Remove last character
@ -1422,17 +1479,14 @@ async function _keyDown(target, eventInit) {
nextValue = value.slice(0, selectionStart - 1) + value.slice(selectionEnd);
} else {
// Remove current selection from target value
nextValue = deleteSelection(target);
nextValue = deleteSelection(inputTarget);
}
inputType = "deleteContentBackward";
break;
}
case "Delete": {
const { selectionStart, selectionEnd, value } = target;
if (fullClear) {
// Remove all characters
nextValue = "";
} else if (isNil(selectionStart) || isNil(selectionEnd)) {
const { selectionStart, selectionEnd, value } = inputTarget;
if (isNil(selectionStart) || isNil(selectionEnd)) {
// Remove first character
nextValue = value.slice(1);
} else if (selectionStart === selectionEnd) {
@ -1440,18 +1494,11 @@ async function _keyDown(target, eventInit) {
nextValue = value.slice(0, selectionStart) + value.slice(selectionEnd + 1);
} else {
// Remove current selection from target value
nextValue = deleteSelection(target);
nextValue = deleteSelection(inputTarget);
}
inputType = "deleteContentForward";
break;
}
case "Enter": {
if (target.tagName === "TEXTAREA") {
// Insert new line
insertValue("\n", "insertLineBreak");
}
break;
}
default: {
if (key.length === 1 && !ctrlKey) {
// Character coming from the keystroke
@ -1469,14 +1516,14 @@ async function _keyDown(target, eventInit) {
case "a": {
if (ctrlKey) {
// Select all
if (isEditable(target)) {
if (isEditable(inputTarget)) {
nextSelectionStart = 0;
nextSelectionEnd = target.value.length;
nextSelectionEnd = inputTarget.value.length;
triggerSelect = true;
} else {
const selection = globalThis.getSelection();
const range = $createRange();
range.selectNodeContents(target);
range.selectNodeContents(inputTarget);
selection.removeAllRanges();
selection.addRange(range);
}
@ -1495,14 +1542,21 @@ async function _keyDown(target, eventInit) {
globalThis.navigator.clipboard.writeText(text).catch();
runTime.clipboardData = createDataTransfer(eventInit);
await _dispatch(target, "copy", { clipboardData: runTime.clipboardData });
await _dispatch(inputTarget, "copy", { clipboardData: runTime.clipboardData });
}
break;
}
case "Enter": {
const tag = getTag(target);
const parentForm = target.closest("form");
if (parentForm && target.type !== "button") {
if (runTime.changeTarget) {
await triggerChange();
}
if (inputTarget.tagName === "TEXTAREA" && isEditable(inputTarget)) {
// Insert new line
insertValue("\n", "insertLineBreak");
}
const tag = getTag(inputTarget);
const parentForm = inputTarget.closest("form");
if (parentForm && inputTarget.type !== "button") {
/**
* Special action: <form> 'Enter'
* On: unprevented 'Enter' keydown on any element that
@ -1512,14 +1566,16 @@ async function _keyDown(target, eventInit) {
await _dispatch(parentForm, "submit");
} else if (
!keyDownEvent.repeat &&
(tag === "a" || tag === "button" || (tag === "input" && target.type === "button"))
(tag === "a" ||
tag === "button" ||
(tag === "input" && inputTarget.type === "button"))
) {
/**
* Special action: <a>, <button> or <input type="button"> 'Enter'
* On: unprevented and unrepeated 'Enter' keydown on mentioned elements
* Do: triggers a 'click' event on the element
*/
await _dispatch(target, "click", { button: btn.LEFT });
await _dispatch(inputTarget, "click", { button: btn.LEFT });
}
break;
}
@ -1548,7 +1604,7 @@ async function _keyDown(target, eventInit) {
* Do: paste current clipboard content to current element
*/
case "v": {
if (ctrlKey && isEditable(target)) {
if (ctrlKey && isEditable(inputTarget)) {
// Set target value (if possible)
try {
nextValue = await globalThis.navigator.clipboard.readText();
@ -1557,7 +1613,7 @@ async function _keyDown(target, eventInit) {
}
inputType = "insertFromPaste";
await _dispatch(target, "paste", {
await _dispatch(inputTarget, "paste", {
clipboardData: runTime.clipboardData || createDataTransfer(eventInit),
});
runTime.clipboardData = null;
@ -1570,59 +1626,64 @@ async function _keyDown(target, eventInit) {
* Do: cut current selection to clipboard and remove selection
*/
case "x": {
if (ctrlKey && isEditable(target)) {
if (ctrlKey && isEditable(inputTarget)) {
// Get selection from window
const text = globalThis.getSelection().toString();
globalThis.navigator.clipboard.writeText(text).catch();
nextValue = deleteSelection(target);
nextValue = deleteSelection(inputTarget);
inputType = "deleteByCut";
runTime.clipboardData = createDataTransfer(eventInit);
await _dispatch(target, "cut", { clipboardData: runTime.clipboardData });
await _dispatch(inputTarget, "cut", { clipboardData: runTime.clipboardData });
}
break;
}
}
if (initialValue !== nextValue) {
target.value = nextValue;
if (nextValue !== null) {
inputTarget.value = nextValue;
const inputEventInit = {
data: inputData,
inputType,
};
const beforeInputEvent = await _dispatch(target, "beforeinput", inputEventInit);
const beforeInputEvent = await _dispatch(inputTarget, "beforeinput", inputEventInit);
if (!isPrevented(beforeInputEvent)) {
await _dispatch(target, "input", inputEventInit);
await _dispatch(inputTarget, "input", inputEventInit);
}
}
changeSelection(target, nextSelectionStart, nextSelectionEnd);
changeSelection(inputTarget, nextSelectionStart, nextSelectionEnd);
if (triggerSelect) {
await dispatchAndIgnore({
target,
target: inputTarget,
events: ["select"],
});
}
}
/**
* @param {EventTarget} target
* @param {Resolver<EventTarget>} targetResolver
* @param {KeyboardEventInit} eventInit
*/
async function _keyUp(target, eventInit) {
async function _keyUp(targetResolver, eventInit) {
eventInit = { ...eventInit, ...currentEventInit.keyup };
await _dispatch(target, "keyup", eventInit);
await _dispatch(resolve(targetResolver), "keyup", eventInit);
runTime.key = null;
registerSpecialKey(eventInit, false);
if (eventInit.key === " " && getTag(target) === "input" && target.type === "checkbox") {
const finalTarget = resolve(targetResolver);
if (
eventInit.key === " " &&
getTag(finalTarget) === "input" &&
finalTarget.type === "checkbox"
) {
/**
* Special action: input[type=checkbox] 'Space'
* On: unprevented ' ' keydown on an <input type="checkbox"/>
* Do: triggers a 'click' event on the input
*/
await triggerClick(target, { button: btn.LEFT });
await triggerClick(finalTarget, { button: btn.LEFT });
}
}
@ -1630,7 +1691,7 @@ async function _keyUp(target, eventInit) {
* @param {DragOptions} [options]
*/
async function _pointerDown(options) {
setPointerDownTarget(runTime.pointerTarget);
setPointerDownTarget(runTime.pointerTarget, options);
if (options?.dataTransfer || options?.files || options?.items) {
runTime.dataTransfer = createDataTransfer(options);
@ -1690,6 +1751,7 @@ async function _pointerUp(options) {
const target = runTime.pointerTarget;
const isLongTap = globalThis.Date.now() - runTime.touchStartTimeOffset > LONG_TAP_DELAY;
const pointerDownTarget = runTime.pointerDownTarget;
const pointerUpTarget = getPointerTarget(target, options);
const eventInit = {
...runTime.position,
...currentEventInit.pointerup,
@ -1709,10 +1771,10 @@ async function _pointerUp(options) {
* - On: pointer up after a prevented 'dragover' or 'dragenter'
* - Do: triggers a 'drop' event on the target
*/
await _dispatch(target, "drop", eventInitWithDT);
await _dispatch(pointerUpTarget, "drop", eventInitWithDT);
}
await _dispatch(target, "dragend", eventInitWithDT);
await _dispatch(pointerUpTarget, "dragend", eventInitWithDT);
return;
}
@ -1720,8 +1782,8 @@ async function _pointerUp(options) {
...eventInit,
detail: runTime.clickCount + 1,
};
await dispatchPointerEvent(target, "pointerup", eventInit, {
mouse: !target.disabled && ["mouseup", mouseEventInit],
await dispatchPointerEvent(pointerUpTarget, "pointerup", eventInit, {
mouse: !pointerUpTarget.disabled && ["mouseup", mouseEventInit],
touch: ["touchend"],
});
@ -1737,9 +1799,9 @@ async function _pointerUp(options) {
let clickTarget;
if (hasTouch()) {
clickTarget = pointerDownTarget === target && target;
clickTarget = pointerDownTarget === pointerUpTarget && pointerUpTarget;
} else {
clickTarget = getFirstCommonParent(target, pointerDownTarget);
clickTarget = getFirstCommonParent(pointerUpTarget, pointerDownTarget);
}
if (clickTarget) {
await triggerClick(clickTarget, mouseEventInit);
@ -1751,7 +1813,7 @@ async function _pointerUp(options) {
}
}
setPointerDownTarget(null);
setPointerDownTarget(null, options);
if (runTime.pointerDownTimeout) {
globalThis.clearTimeout(runTime.pointerDownTimeout);
}
@ -1764,12 +1826,13 @@ async function _pointerUp(options) {
}
/**
* @param {EventTarget} target
* @param {Resolver<EventTarget>} targetResolver
* @param {KeyboardEventInit} eventInit
* @param {KeyDownOptions} [options]
*/
async function _press(target, eventInit) {
await _keyDown(target, eventInit);
await _keyUp(target, eventInit);
async function _press(targetResolver, eventInit, options) {
await _keyDown(targetResolver, eventInit, options);
await _keyUp(targetResolver, eventInit);
}
/**
@ -1777,7 +1840,7 @@ async function _press(target, eventInit) {
* @param {string | number | (string | number)[]} value
*/
async function _select(target, value) {
const values = ensureArray(value).map(String);
const values = ensureArray(value, String);
let found = false;
for (const option of target.options) {
option.selected = values.includes(option.value);
@ -1880,13 +1943,7 @@ const currentEvents = $create(null);
const currentEventInit = $create(null);
/** @type {string[]} */
const currentEventTypes = [];
/** @type {(() => Promise<void>) | null} */
let afterNextDispatch = null;
let allowLogs = false;
let fullClear = false;
// Keyboard global variables
const changeTargetListeners = [];
// Other global variables
const runTime = getDefaultRunTimeValue();
@ -2063,19 +2120,19 @@ export function cleanupEvents() {
*/
export async function clear(options) {
const finalizeEvents = setupEvents("clear", options);
const element = getActiveElement();
const activeElement = getActiveElement();
if (!hasTagName(element, "select") && !isEditable(element)) {
if (!hasTagName(activeElement, "select") && !isEditable(activeElement)) {
throw new HootInteractionError(
`cannot call \`clear()\`: target should be editable or a <select> element`
);
}
if (isEditable(element)) {
await _clear(element, options);
if (isEditable(activeElement)) {
await _clear(getActiveElement, options);
} else {
// Selects
await _select(element, "");
await _select(activeElement, "");
}
return finalizeEvents();
@ -2311,15 +2368,15 @@ export async function drag(target, options) {
*/
export async function edit(value, options) {
const finalizeEvents = setupEvents("edit", options);
const element = getActiveElement();
if (!isEditable(element)) {
const activeElement = getActiveElement();
if (!isEditable(activeElement)) {
throw new HootInteractionError(`cannot call \`edit()\`: target should be editable`);
}
if (getNodeValue(element)) {
await _clear(element);
if (getNodeValue(activeElement)) {
await _clear(getActiveElement);
}
await _fill(element, value, options);
await _fill(getActiveElement, value, options);
return finalizeEvents();
}
@ -2358,13 +2415,12 @@ export function enableEventLogs(toggle) {
*/
export async function fill(value, options) {
const finalizeEvents = setupEvents("fill", options);
const element = getActiveElement();
if (!isEditable(element)) {
if (!isEditable(getActiveElement())) {
throw new HootInteractionError(`cannot call \`fill()\`: target should be editable`);
}
await _fill(element, value, options);
await _fill(getActiveElement, value, options);
return finalizeEvents();
}
@ -2422,7 +2478,7 @@ export async function keyDown(keyStrokes, options) {
const finalizeEvents = setupEvents("keyDown", options);
const eventInits = parseKeyStrokes(keyStrokes, options);
for (const eventInit of eventInits) {
await _keyDown(getActiveElement(), eventInit);
await _keyDown(getActiveElement, eventInit);
}
return finalizeEvents();
@ -2444,7 +2500,7 @@ export async function keyUp(keyStrokes, options) {
const finalizeEvents = setupEvents("keyUp", options);
const eventInits = parseKeyStrokes(keyStrokes, options);
for (const eventInit of eventInits) {
await _keyUp(getActiveElement(), eventInit);
await _keyUp(getActiveElement, eventInit);
}
return finalizeEvents();
@ -2597,13 +2653,12 @@ export async function pointerUp(target, options) {
export async function press(keyStrokes, options) {
const finalizeEvents = setupEvents("press", options);
const eventInits = parseKeyStrokes(keyStrokes, options);
const activeElement = getActiveElement();
for (const eventInit of eventInits) {
await _keyDown(activeElement, eventInit);
await _keyDown(getActiveElement, eventInit);
}
for (const eventInit of eventInits.reverse()) {
await _keyUp(activeElement, eventInit);
await _keyUp(getActiveElement, eventInit);
}
return finalizeEvents();
@ -2729,7 +2784,7 @@ export async function scroll(target, position, options) {
await dispatchAndIgnore({
target: element,
events: ["scroll", "scrollend"],
callback: (el) => el.scrollTo(scrollTopOptions),
callback: () => element.scrollTo(scrollTopOptions),
});
}
if (initiator === "keyboard") {
@ -2740,8 +2795,8 @@ export async function scroll(target, position, options) {
}
/**
* Performs a selection event sequence current **active element**. This helper is
* intended for `<select>` elements only.
* Performs a selection event sequence on the current **active element**. This helper
* is intended for `<select>` elements only.
*
* The event sequence is as follows:
* - `change`
@ -2755,8 +2810,8 @@ export async function scroll(target, position, options) {
*/
export async function select(value, options) {
const finalizeEvents = setupEvents("select", options);
const target = options?.target || getActiveElement();
const element = queryAny(await target);
const manualTarget = options?.target;
const element = manualTarget ? queryAny(await manualTarget) : getActiveElement();
if (!hasTagName(element, "select")) {
throw new HootInteractionError(
@ -2764,12 +2819,12 @@ export async function select(value, options) {
);
}
if (options?.target) {
await _hover(element, null, { implicit: true, originalTarget: target });
if (manualTarget) {
await _hover(element, null, { implicit: true, originalTarget: manualTarget });
await _pointerDown();
}
await _select(element, value);
if (options?.target) {
if (manualTarget) {
await _pointerUp();
}
@ -2896,7 +2951,7 @@ export async function uncheck(target, options) {
}
/**
* Triggers a "beforeunload" event the current **window**.
* Triggers a "beforeunload" event on the current **window**.
*
* @param {EventOptions} [options]
* @returns {Promise<EventList>}

View file

@ -71,7 +71,6 @@ export {
//-----------------------------------------------------------------------------
// DOM
export const observe = interactor("query", dom.observe);
export const waitFor = interactor("query", dom.waitFor);
export const waitForNone = interactor("query", dom.waitForNone);

View file

@ -17,7 +17,7 @@
* | "symbol"
* | "undefined"} ArgumentPrimitive
*
* @typedef {[string, any[], any]} InteractionDetails
* @typedef {[string, string | undefined, any[], any]} InteractionDetails
*
* @typedef {"interaction" | "query" | "server" | "time"} InteractionType
*/
@ -55,27 +55,28 @@ const $toString = Object.prototype.toString;
* @param {InteractionType} type
* @param {T} fn
* @param {string} name
* @param {string} [alias]
* @returns {T}
*/
function makeInteractorFn(type, fn, name) {
function makeInteractorFn(type, fn, name, alias) {
return {
[name](...args) {
[alias || name](...args) {
const result = fn(...args);
if (isInstanceOf(result, Promise)) {
if (isPromise(result)) {
for (let i = 0; i < args.length; i++) {
if (isInstanceOf(args[i], Promise)) {
if (isPromise(args[i])) {
// Get promise result for async arguments if possible
args[i].then((result) => (args[i] = result));
}
}
return result.then((promiseResult) =>
dispatchInteraction(type, name, args, promiseResult)
dispatchInteraction(type, name, alias, args, promiseResult)
);
} else {
return dispatchInteraction(type, name, args, result);
return dispatchInteraction(type, name, alias, args, result);
}
},
}[name];
}[alias || name];
}
function polyfillIsError(value) {
@ -237,20 +238,21 @@ export function addInteractionListener(types, callback) {
/**
* @param {InteractionType} type
* @param {string} name
* @param {string | undefined} alias
* @param {any[]} args
* @param {any} returnValue
*/
export function dispatchInteraction(type, name, args, returnValue) {
export function dispatchInteraction(type, name, alias, args, returnValue) {
interactionBus.dispatchEvent(
new CustomEvent(type, {
detail: [name, args, returnValue],
detail: [name, alias, args, returnValue],
})
);
return returnValue;
}
/**
* @param {...any} helpers
* @param {...any} helpers
*/
export function exposeHelpers(...helpers) {
let nameSpaceIndex = 1;
@ -299,7 +301,7 @@ export function getTag(node) {
export function interactor(type, fn) {
return $assign(makeInteractorFn(type, fn, fn.name), {
as(alias) {
return makeInteractorFn(type, fn, alias);
return makeInteractorFn(type, fn, fn.name, alias);
},
get silent() {
return fn;
@ -314,6 +316,16 @@ export function isFirefox() {
return /firefox/i.test($userAgent);
}
Array.isArray;
/**
* @param {any} instance
* @returns {instance is Promise<any>}
*/
export function isPromise(instance) {
return instance && typeof instance.then === "function";
}
/**
* Cross-realm equivalent to 'instanceof'.
* Can be called with multiple constructors, and will return true if the given object
@ -412,7 +424,7 @@ export function toSelector(node, options) {
export class HootDebugHelpers {
/**
* @param {...any} helpers
* @param {...any} helpers
*/
constructor(...helpers) {
$assign(this, ...helpers);

View file

@ -45,6 +45,7 @@ import {
S_NONE,
strictEqual,
} from "../hoot_utils";
import { mockFetch } from "../mock/network";
import { logger } from "./logger";
import { Test } from "./test";
@ -134,6 +135,7 @@ const {
Array: { isArray: $isArray },
clearTimeout,
Error,
Intl: { ListFormat },
Math: { abs: $abs, floor: $floor },
Object: { assign: $assign, create: $create, entries: $entries, keys: $keys },
parseFloat,
@ -177,7 +179,7 @@ function detailsFromValues(...args) {
* @param {...unknown} args
*/
function detailsFromValuesWithDiff(...args) {
return [...detailsFromValues(...args), Markup.diff(...args)];
return detailsFromValues(...args).concat([Markup.diff(...args)]);
}
/**
@ -446,6 +448,7 @@ export function makeExpect(params) {
if (currentResult.currentSteps.length) {
currentResult.registerEvent("assertion", {
label: "step",
docLabel: "expect.step",
pass: false,
failedDetails: detailsFromEntries([["Steps:", currentResult.currentSteps]]),
reportMessage: [r`unverified steps`],
@ -456,6 +459,7 @@ export function makeExpect(params) {
if (!(assertionCount + queryCount)) {
currentResult.registerEvent("assertion", {
label: "assertions",
docLabel: "expect.assertions",
pass: false,
reportMessage: [
r`expected at least`,
@ -469,6 +473,7 @@ export function makeExpect(params) {
) {
currentResult.registerEvent("assertion", {
label: "assertions",
docLabel: "expect.assertions",
pass: false,
reportMessage: [
r`expected`,
@ -484,6 +489,7 @@ export function makeExpect(params) {
if (currentResult.currentErrors.length) {
currentResult.registerEvent("assertion", {
label: "errors",
docLabel: "expect.errors",
pass: false,
reportMessage: [currentResult.currentErrors.length, r`unverified error(s)`],
});
@ -493,6 +499,7 @@ export function makeExpect(params) {
if (currentResult.expectedErrors && currentResult.expectedErrors !== errorCount) {
currentResult.registerEvent("assertion", {
label: "errors",
docLabel: "expect.errors",
pass: false,
reportMessage: [
r`expected`,
@ -539,6 +546,7 @@ export function makeExpect(params) {
/** @type {import("../hoot_utils").Reporting} */
const report = {
assertions: assertionCount,
duration: test.lastResults?.duration || 0,
tests: 1,
};
if (!currentResult.pass) {
@ -562,6 +570,12 @@ export function makeExpect(params) {
}
/**
* Expects the current test to have the `expected` amount of assertions. This
* number cannot be less than 1.
*
* Note that it is generally preferred to use `expect.step` and `expect.verifySteps`
* instead as it is more reliable and allows to test more extensively.
*
* @param {number} expected
*/
function assertions(expected) {
@ -605,10 +619,10 @@ export function makeExpect(params) {
return false;
}
const { errors, options } = resolver;
const actualErrors = currentResult.currentErrors;
const { currentErrors } = currentResult;
const pass =
actualErrors.length === errors.length &&
actualErrors.every(
currentErrors.length === errors.length &&
currentErrors.every(
(error, i) =>
match(error, errors[i]) || (error.cause && match(error.cause, errors[i]))
);
@ -623,12 +637,13 @@ export function makeExpect(params) {
: "expected the following errors";
const assertion = {
label: "verifyErrors",
docLabel: "expect.verifyErrors",
message: options?.message,
pass,
reportMessage,
};
if (!pass) {
const fActual = actualErrors.map(formatError);
const fActual = currentErrors.map(formatError);
const fExpected = errors.map(formatError);
assertion.failedDetails = detailsFromValuesWithDiff(fExpected, fActual);
assertion.stack = getStack(1);
@ -662,6 +677,7 @@ export function makeExpect(params) {
: "expected the following steps";
const assertion = {
label: "verifySteps",
docLabel: "expect.verifySteps",
message: options?.message,
pass,
reportMessage,
@ -677,6 +693,11 @@ export function makeExpect(params) {
}
/**
* Expects the current test to have the `expected` amount of errors.
*
* This also means that from the moment this function is called, the test will
* accept that amount of errors before being considered as failed.
*
* @param {number} expected
*/
function errors(expected) {
@ -718,6 +739,9 @@ export function makeExpect(params) {
}
/**
* Registers a step for the current test, that can be consumed by `expect.verifySteps`.
* Unconsumed steps will fail the test.
*
* @param {unknown} value
*/
function step(value) {
@ -748,6 +772,11 @@ export function makeExpect(params) {
throw scopeError("expect.verifyErrors");
}
ensureArguments(arguments, "any[]", ["object", null]);
if (errors.length > currentResult.expectedErrors) {
throw new HootError(
`cannot call \`expect.verifyErrors()\` without calling \`expect.errors()\` beforehand`
);
}
return checkErrors({ errors, options }, true);
}
@ -761,6 +790,8 @@ export function makeExpect(params) {
* @param {VerifierOptions} [options]
* @returns {boolean}
* @example
* expect.step("web_read_group");
* expect.step([1, 2]);
* expect.verifySteps(["web_read_group", "web_search_read"]);
*/
function verifySteps(steps, options) {
@ -988,6 +1019,9 @@ export class CaseResult {
this.counts[type]++;
switch (type) {
case "assertion": {
if (value && this.headless) {
delete value.docLabel; // Only required in UI
}
caseEvent = new Assertion(this.counts.assertion, value);
this.pass &&= caseEvent.pass;
break;
@ -2032,13 +2066,15 @@ export class Matcher {
* - contain file objects matching the given `files` list.
*
* @param {ReturnType<typeof getNodeValue>} [value]
* @param {ExpectOptions} [options]
* @param {ExpectOptions & { raw?: boolean }} [options]
* @example
* expect("input[type=email]").toHaveValue("john@doe.com");
* expect("input[name=age]").toHaveValue(29);
* @example
* expect("input[type=file]").toHaveValue(new File(["foo"], "foo.txt"));
* @example
* expect("select[multiple]").toHaveValue(["foo", "bar"]);
* @example
* expect("input[name=age]").toHaveValue("29", { raw: true });
*/
toHaveValue(value, options) {
this._ensureArguments(arguments, [
@ -2055,7 +2091,7 @@ export class Matcher {
return this._resolve(() => ({
name: "toHaveValue",
acceptedType: ["string", "node", "node[]"],
mapElements: (el) => getNodeValue(el),
mapElements: (el) => getNodeValue(el, options?.raw),
predicate: (elValue, el) => {
if (isCheckable(el)) {
throw new HootError(
@ -2201,10 +2237,17 @@ export class Matcher {
const types = ensureArray(acceptedType);
if (!types.some((type) => isOfType(this._received, type))) {
const joinedTypes =
types.length > 1
? new ListFormat("en-GB", {
type: "disjunction",
style: "long",
}).format(types)
: types[0];
throw new TypeError(
`expected received value to be of type ${listJoin(types, ",", "or").join(
" "
)}, got ${formatHumanReadable(this._received)}`
`expected received value to be of type ${joinedTypes}, got ${formatHumanReadable(
this._received
)}`
);
}
@ -2300,11 +2343,14 @@ export class CaseEvent {
export class Assertion extends CaseEvent {
/** @type {string | null | undefined} */
additionalMessage;
/** @type {string | undefined} */
docLabel;
type = CASE_EVENT_TYPES.assertion.value;
/**
* @param {number} number
* @param {Partial<Assertion & {
* docLabel?: string;
* message: AssertionMessage,
* reportMessage: AssertionReportMessage,
* }>} values
@ -2312,6 +2358,7 @@ export class Assertion extends CaseEvent {
constructor(number, values) {
super();
this.docLabel = values.docLabel;
this.label = values.label;
this.flags = values.flags || 0;
this.pass = values.pass || false;
@ -2388,11 +2435,16 @@ export class DOMCaseEvent extends CaseEvent {
* @param {InteractionType} type
* @param {InteractionDetails} details
*/
constructor(type, [name, args, returnValue]) {
constructor(type, [name, alias, args, returnValue]) {
super();
this.type = CASE_EVENT_TYPES[type].value;
this.label = name;
this.label = alias || name;
if (type === "server") {
this.docLabel = mockFetch.name;
} else {
this.docLabel = name;
}
for (let i = 0; i < args.length; i++) {
if (args[i] !== undefined && (i === 0 || typeof args[i] !== "object")) {
this.message.push(makeLabelOrString(args[i]));
@ -2419,12 +2471,20 @@ export class CaseError extends CaseEvent {
this.message = error.message.split(R_WHITE_SPACE);
/** @type {string} */
this.stack = error.stack;
// Ensures that the stack contains the error name & message.
// This can happen when setting the 'message' after creating the error.
const errorNameAndMessage = String(error);
if (!this.stack.startsWith(errorNameAndMessage)) {
this.stack = errorNameAndMessage + this.stack.slice(error.name.length);
}
}
}
export class Step extends CaseEvent {
type = CASE_EVENT_TYPES.step.value;
label = "step";
docLabel = "expect.step";
/**
* @param {any} value

View file

@ -25,7 +25,8 @@ import { getViewPortHeight, getViewPortWidth } from "../mock/window";
// Global
//-----------------------------------------------------------------------------
const { customElements, document, getSelection, HTMLElement, Promise, WeakSet } = globalThis;
const { customElements, document, getSelection, HTMLElement, MutationObserver, Promise, WeakSet } =
globalThis;
//-----------------------------------------------------------------------------
// Internal

View file

@ -1,7 +1,7 @@
/** @odoo-module */
import { getColorHex } from "../../hoot-dom/hoot_dom_utils";
import { stringify } from "../hoot_utils";
import { isNil, stringify } from "../hoot_utils";
import { urlParams } from "./url";
//-----------------------------------------------------------------------------
@ -123,13 +123,13 @@ class Logger {
$groupEnd();
}
/**
* @param {...any} args
* @param {...any} args
*/
table(...args) {
$table(...args);
}
/**
* @param {...any} args
* @param {...any} args
*/
trace(...args) {
$trace(...args);
@ -190,7 +190,7 @@ class Logger {
`(${withArgs.shift()}`,
...withArgs,
"time:",
suite.jobs.reduce((acc, job) => acc + (job.duration || 0), 0),
suite.reporting.duration,
"ms)"
);
}
@ -203,16 +203,7 @@ class Logger {
if (!this.canLog("tests")) {
return;
}
const { fullName, lastResults } = test;
$log(
...styledArguments([
`Test ${stringify(fullName)} passed (assertions:`,
lastResults.counts.assertion || 0,
`/ time:`,
lastResults.duration,
`ms)`,
])
);
$log(...styledArguments([`Running test ${stringify(test.fullName)}`]));
}
/**
* @param {[label: string, color: string]} prefix
@ -285,32 +276,56 @@ let nextNetworkLogId = 1;
*/
export function makeNetworkLogger(prefix, title) {
const id = nextNetworkLogId++;
const slicedTitle =
title.length > 128 ? title.slice(0, 128) + " (click to show full input)" : title;
return {
/**
* Request logger: blue-ish.
* @param {() => any} getData
* Request logger: blue lotus.
* @param {() => any[]} getData
*/
async logRequest(getData) {
logRequest(getData) {
if (!logger.canLog("debug")) {
return;
}
const color = `color: #66e`;
const styles = [`${color}; font-weight: bold;`, color];
$groupCollapsed(`-> %c${prefix}#${id}%c<${title}>`, ...styles, await getData());
$trace("request trace");
const color = `color: #6960ec`;
const args = [`${color}; font-weight: bold;`, color];
const [dataHeader, ...otherData] = getData();
if (!isNil(dataHeader)) {
args.push(dataHeader);
}
$groupCollapsed(`-> %c${prefix}#${id}%c ${slicedTitle}`, ...args);
if (slicedTitle !== title) {
$log(title);
}
for (const data of otherData) {
$log(data);
}
$trace("Request trace:");
$groupEnd();
},
/**
* Response logger: orange.
* @param {() => any} getData
* Response logger: dark orange.
* @param {() => any[]} getData
*/
async logResponse(getData) {
logResponse(getData) {
if (!logger.canLog("debug")) {
return;
}
const color = `color: #f80`;
const styles = [`${color}; font-weight: bold;`, color];
$log(`<- %c${prefix}#${id}%c<${title}>`, ...styles, await getData());
const color = `color: #ff8c00`;
const args = [`${color}; font-weight: bold;`, color];
const [dataHeader, ...otherData] = getData();
if (!isNil(dataHeader)) {
args.push(dataHeader);
}
$groupCollapsed(`<- %c${prefix}#${id}%c ${slicedTitle}`, ...args);
if (slicedTitle !== title) {
$log(title);
}
for (const data of otherData) {
$log(data);
}
$trace("Response trace:");
$groupEnd();
},
};
}

View file

@ -31,7 +31,7 @@ import {
import { cleanupAnimations } from "../mock/animation";
import { cleanupDate } from "../mock/date";
import { internalRandom } from "../mock/math";
import { cleanupNavigator, mockUserAgent } from "../mock/navigator";
import { cleanupNavigator } from "../mock/navigator";
import { cleanupNetwork, throttleNetwork } from "../mock/network";
import {
cleanupWindow,
@ -50,8 +50,16 @@ import { Test, testError } from "./test";
import { EXCLUDE_PREFIX, createUrlFromId, setParams } from "./url";
// Import all helpers for debug mode
import * as hootDom from "@odoo/hoot-dom";
import * as hootMock from "@odoo/hoot-mock";
import * as _hootDom from "@odoo/hoot-dom";
import * as _animation from "../mock/animation";
import * as _date from "../mock/date";
import * as _math from "../mock/math";
import * as _navigator from "../mock/navigator";
import * as _network from "../mock/network";
import * as _notification from "../mock/notification";
import * as _window from "../mock/window";
const { isPrevented, mockPreventDefault } = _window;
/**
* @typedef {{
@ -115,7 +123,7 @@ const {
Number: { parseFloat: $parseFloat },
Object: {
assign: $assign,
defineProperties: $defineProperties,
defineProperty: $defineProperty,
entries: $entries,
freeze: $freeze,
fromEntries: $fromEntries,
@ -163,8 +171,11 @@ function formatIncludes(values) {
*/
function formatAssertions(assertions) {
const lines = [];
for (const { failedDetails, label, message, number } of assertions) {
for (const { additionalMessage, failedDetails, label, message, number } of assertions) {
const formattedMessage = message.map((part) => (isLabel(part) ? part[0] : String(part)));
if (additionalMessage) {
formattedMessage.push(`(${additionalMessage})`);
}
lines.push(`\n${number}. [${label}] ${formattedMessage.join(" ")}`);
if (failedDetails) {
for (const detail of failedDetails) {
@ -191,15 +202,6 @@ function formatAssertions(assertions) {
return lines;
}
/**
* @param {Event} ev
*/
function safePrevent(ev) {
if (ev.cancelable) {
ev.preventDefault();
}
}
/**
* @template T
* @param {T[]} array
@ -832,6 +834,7 @@ export class Runner {
}
manualStart() {
this._canStartDef ||= Promise.withResolvers();
this._canStartDef.resolve(true);
}
@ -981,6 +984,8 @@ export class Runner {
continue;
}
logger.logTest(test);
// Suppress console errors and warnings if test is in "todo" mode
// (and not in debug).
const restoreConsole = handleConsoleIssues(test, !this.debug);
@ -1048,14 +1053,7 @@ export class Runner {
// Log test errors and increment counters
this.expectHooks.after(this);
if (lastResults.pass) {
logger.logTest(test);
if (this.state.failedIds.has(test.id)) {
this.state.failedIds.delete(test.id);
storageSet(STORAGE.failed, [...this.state.failedIds]);
}
} else {
if (!lastResults.pass) {
this._failed++;
const failReasons = [];
@ -1088,6 +1086,9 @@ export class Runner {
this.state.failedIds.add(test.id);
storageSet(STORAGE.failed, [...this.state.failedIds]);
}
} else if (this.state.failedIds.has(test.id)) {
this.state.failedIds.delete(test.id);
storageSet(STORAGE.failed, [...this.state.failedIds]);
}
await this._callbacks.call("after-post-test", test, handleError);
@ -1151,6 +1152,17 @@ export class Runner {
await this._callbacks.call("after-all", this, logger.error);
if (this.headless) {
// Log root suite results in headless
const restoreLogLevel = logger.setLogLevel("suites");
for (const suite of this.suites.values()) {
if (!suite.parent) {
logger.logSuite(suite);
}
}
restoreLogLevel();
}
const { passed, failed, assertions } = this.reporting;
if (failed > 0) {
const errorMessage = ["Some tests failed: see above for details"];
@ -1317,17 +1329,16 @@ export class Runner {
/** @type {Configurators} */
const configurators = { ...configuratorGetters, ...configuratorMethods };
const properties = {};
for (const [key, getter] of $entries(configuratorGetters)) {
properties[key] = { get: getter };
$defineProperty(configurableFn, key, { get: getter });
}
for (const [key, getter] of $entries(configuratorMethods)) {
properties[key] = { value: getter };
$defineProperty(configurableFn, key, { value: getter });
}
/** @type {{ tags: Tag[], [key: string]: any }} */
let currentConfig = { tags: [] };
return $defineProperties(configurableFn, properties);
return configurableFn;
}
/**
@ -1395,7 +1406,7 @@ export class Runner {
}
/**
* @param {...string} tagNames
* @param {...string} tagNames
*/
const addTagsToCurrent = (...tagNames) => {
const current = getCurrent();
@ -1425,7 +1436,6 @@ export class Runner {
* @param {boolean} [canEraseParent]
*/
_erase(job, canEraseParent = false) {
job.minimize();
if (job instanceof Suite) {
if (!job.reporting.failed) {
this.suites.delete(job.id);
@ -1435,6 +1445,7 @@ export class Runner {
this.tests.delete(job.id);
}
}
job.minimize();
if (canEraseParent && job.parent) {
const jobIndex = job.parent.jobs.indexOf(job);
if (jobIndex >= 0) {
@ -1694,9 +1705,6 @@ export class Runner {
if (preset.tags?.length) {
this._include(this.state.includeSpecs.tag, preset.tags, INCLUDE_LEVEL.preset);
}
if (preset.platform) {
mockUserAgent(preset.platform);
}
if (typeof preset.touch === "boolean") {
this.beforeEach(() => mockTouch(preset.touch));
}
@ -1731,7 +1739,7 @@ export class Runner {
this._populateState = false;
if (!this.state.tests.length) {
throw new HootError(`no tests to run`, { level: "critical" });
logger.logGlobal(`no tests to run`);
}
// Reduce non-included suites & tests info to a miminum
@ -1778,7 +1786,7 @@ export class Runner {
const error = ensureError(ev);
if (handledErrors.has(error)) {
// Already handled
return safePrevent(ev);
return ev.preventDefault();
}
handledErrors.add(error);
@ -1786,27 +1794,32 @@ export class Runner {
ev = new ErrorEvent("error", { error });
}
mockPreventDefault(ev);
if (error.message.includes(RESIZE_OBSERVER_MESSAGE)) {
// Stop event
ev.stopImmediatePropagation();
if (ev.bubbles) {
ev.stopPropagation();
}
return safePrevent(ev);
return ev.preventDefault();
}
if (this.state.currentTest && !(error instanceof HootError)) {
if (this.state.currentTest) {
// Handle the error in the current test
const handled = this._handleErrorInTest(ev, error);
if (handled) {
return safePrevent(ev);
if (!(error instanceof HootError)) {
ev.preventDefault();
}
return;
}
} else {
this._handleGlobalError(ev, error);
}
// Prevent error event
safePrevent(ev);
ev.preventDefault();
// Log error
if (error.level) {
@ -1826,7 +1839,7 @@ export class Runner {
_handleErrorInTest(ev, error) {
for (const callbackRegistry of this._getCallbackChain(this.state.currentTest)) {
callbackRegistry.callSync("error", ev, logger.error);
if (ev.defaultPrevented) {
if (isPrevented(ev)) {
// Prevented in tests
return true;
}
@ -1875,7 +1888,7 @@ export class Runner {
async _setupStart() {
this._startTime = $now();
if (this.config.manual) {
this._canStartDef = Promise.withResolvers();
this._canStartDef ||= Promise.withResolvers();
}
// Config log
@ -1903,10 +1916,21 @@ export class Runner {
this.config.debugTest = false;
this.debug = false;
} else {
const nameSpace = exposeHelpers(hootDom, hootMock, {
destroy,
getFixture: this.fixture.get,
});
const nameSpace = exposeHelpers(
_hootDom,
_animation,
_date,
_math,
_navigator,
_network,
_notification,
_window,
{
__debug__: this,
destroy,
getFixture: this.fixture.get,
}
);
logger.setLogLevel("debug");
logger.logDebug(
`Debug mode is active: Hoot helpers available from \`window.${nameSpace}\``

View file

@ -157,7 +157,7 @@ export function getTagSimilarities() {
* Used in Hoot internal tests to remove tags introduced within a test.
*
* @private
* @param {Iterable<string>} tagKeys
* @param {Iterable<string>} tagKeys
*/
export function undefineTags(tagKeys) {
for (const tagKey of tagKeys) {

View file

@ -1,33 +1,84 @@
/** @odoo-module alias=@odoo/hoot-mock default=false */
/**
* @typedef {import("./mock/network").ServerWebSocket} ServerWebSocket
*/
import * as _hootDom from "@odoo/hoot-dom";
import * as _animation from "./mock/animation";
import * as _date from "./mock/date";
import * as _math from "./mock/math";
import * as _navigator from "./mock/navigator";
import * as _network from "./mock/network";
import * as _notification from "./mock/notification";
import * as _window from "./mock/window";
export {
advanceFrame,
advanceTime,
animationFrame,
cancelAllTimers,
Deferred,
delay,
freezeTime,
microTick,
runAllTimers,
setFrameRate,
tick,
unfreezeTime,
} from "@odoo/hoot-dom";
export { disableAnimations, enableTransitions } from "./mock/animation";
export { mockDate, mockLocale, mockTimeZone, onTimeZoneChange } from "./mock/date";
export { makeSeededRandom } from "./mock/math";
export { mockPermission, mockSendBeacon, mockUserAgent, mockVibrate } from "./mock/navigator";
export { mockFetch, mockLocation, mockWebSocket, mockWorker } from "./mock/network";
export { flushNotifications } from "./mock/notification";
export {
mockMatchMedia,
mockTouch,
watchAddedNodes,
watchKeys,
watchListeners,
} from "./mock/window";
/** @deprecated use `import { advanceFrame } from "@odoo/hoot";` */
export const advanceFrame = _hootDom.advanceFrame;
/** @deprecated use `import { advanceTime } from "@odoo/hoot";` */
export const advanceTime = _hootDom.advanceTime;
/** @deprecated use `import { animationFrame } from "@odoo/hoot";` */
export const animationFrame = _hootDom.animationFrame;
/** @deprecated use `import { cancelAllTimers } from "@odoo/hoot";` */
export const cancelAllTimers = _hootDom.cancelAllTimers;
/** @deprecated use `import { Deferred } from "@odoo/hoot";` */
export const Deferred = _hootDom.Deferred;
/** @deprecated use `import { delay } from "@odoo/hoot";` */
export const delay = _hootDom.delay;
/** @deprecated use `import { freezeTime } from "@odoo/hoot";` */
export const freezeTime = _hootDom.freezeTime;
/** @deprecated use `import { microTick } from "@odoo/hoot";` */
export const microTick = _hootDom.microTick;
/** @deprecated use `import { runAllTimers } from "@odoo/hoot";` */
export const runAllTimers = _hootDom.runAllTimers;
/** @deprecated use `import { setFrameRate } from "@odoo/hoot";` */
export const setFrameRate = _hootDom.setFrameRate;
/** @deprecated use `import { tick } from "@odoo/hoot";` */
export const tick = _hootDom.tick;
/** @deprecated use `import { unfreezeTime } from "@odoo/hoot";` */
export const unfreezeTime = _hootDom.unfreezeTime;
/** @deprecated use `import { disableAnimations } from "@odoo/hoot";` */
export const disableAnimations = _animation.disableAnimations;
/** @deprecated use `import { enableTransitions } from "@odoo/hoot";` */
export const enableTransitions = _animation.enableTransitions;
/** @deprecated use `import { mockDate } from "@odoo/hoot";` */
export const mockDate = _date.mockDate;
/** @deprecated use `import { mockLocale } from "@odoo/hoot";` */
export const mockLocale = _date.mockLocale;
/** @deprecated use `import { mockTimeZone } from "@odoo/hoot";` */
export const mockTimeZone = _date.mockTimeZone;
/** @deprecated use `import { onTimeZoneChange } from "@odoo/hoot";` */
export const onTimeZoneChange = _date.onTimeZoneChange;
/** @deprecated use `import { makeSeededRandom } from "@odoo/hoot";` */
export const makeSeededRandom = _math.makeSeededRandom;
/** @deprecated use `import { mockPermission } from "@odoo/hoot";` */
export const mockPermission = _navigator.mockPermission;
/** @deprecated use `import { mockSendBeacon } from "@odoo/hoot";` */
export const mockSendBeacon = _navigator.mockSendBeacon;
/** @deprecated use `import { mockUserAgent } from "@odoo/hoot";` */
export const mockUserAgent = _navigator.mockUserAgent;
/** @deprecated use `import { mockVibrate } from "@odoo/hoot";` */
export const mockVibrate = _navigator.mockVibrate;
/** @deprecated use `import { mockFetch } from "@odoo/hoot";` */
export const mockFetch = _network.mockFetch;
/** @deprecated use `import { mockLocation } from "@odoo/hoot";` */
export const mockLocation = _network.mockLocation;
/** @deprecated use `import { mockWebSocket } from "@odoo/hoot";` */
export const mockWebSocket = _network.mockWebSocket;
/** @deprecated use `import { mockWorker } from "@odoo/hoot";` */
export const mockWorker = _network.mockWorker;
/** @deprecated use `import { flushNotifications } from "@odoo/hoot";` */
export const flushNotifications = _notification.flushNotifications;
/** @deprecated use `import { mockMatchMedia } from "@odoo/hoot";` */
export const mockMatchMedia = _window.mockMatchMedia;
/** @deprecated use `import { mockTouch } from "@odoo/hoot";` */
export const mockTouch = _window.mockTouch;
/** @deprecated use `import { watchAddedNodes } from "@odoo/hoot";` */
export const watchAddedNodes = _window.watchAddedNodes;
/** @deprecated use `import { watchKeys } from "@odoo/hoot";` */
export const watchKeys = _window.watchKeys;
/** @deprecated use `import { watchListeners } from "@odoo/hoot";` */
export const watchListeners = _window.watchListeners;

View file

@ -3,11 +3,29 @@
import { logger } from "./core/logger";
import { Runner } from "./core/runner";
import { urlParams } from "./core/url";
import { makeRuntimeHook } from "./hoot_utils";
import { copyAndBind, makeRuntimeHook } from "./hoot_utils";
import { setRunner } from "./main_runner";
import { setupHootUI } from "./ui/setup_hoot_ui";
/**
* @typedef {import("../hoot-dom/helpers/dom").Dimensions} Dimensions
* @typedef {import("../hoot-dom/helpers/dom").FormatXmlOptions} FormatXmlOptions
* @typedef {import("../hoot-dom/helpers/dom").Position} Position
* @typedef {import("../hoot-dom/helpers/dom").QueryOptions} QueryOptions
* @typedef {import("../hoot-dom/helpers/dom").QueryRectOptions} QueryRectOptions
* @typedef {import("../hoot-dom/helpers/dom").QueryTextOptions} QueryTextOptions
* @typedef {import("../hoot-dom/helpers/dom").Target} Target
*
* @typedef {import("../hoot-dom/helpers/events").DragHelpers} DragHelpers
* @typedef {import("../hoot-dom/helpers/events").DragOptions} DragOptions
* @typedef {import("../hoot-dom/helpers/events").EventType} EventType
* @typedef {import("../hoot-dom/helpers/events").FillOptions} FillOptions
* @typedef {import("../hoot-dom/helpers/events").InputValue} InputValue
* @typedef {import("../hoot-dom/helpers/events").KeyStrokes} KeyStrokes
* @typedef {import("../hoot-dom/helpers/events").PointerOptions} PointerOptions
*
* @typedef {import("./mock/network").ServerWebSocket} ServerWebSocket
*
* @typedef {{
* runner: Runner;
* ui: import("./ui/setup_hoot_ui").UiState
@ -26,19 +44,12 @@ setRunner(runner);
// Exports
//-----------------------------------------------------------------------------
/**
* @param {...unknown} values
*/
export function registerDebugInfo(...values) {
logger.logDebug(...values);
}
// Main test API
export const describe = runner.describe;
export const expect = runner.expect;
export const test = runner.test;
// Hooks
// Test hooks
export const after = makeRuntimeHook("after");
export const afterEach = makeRuntimeHook("afterEach");
export const before = makeRuntimeHook("before");
@ -48,7 +59,7 @@ export const onError = makeRuntimeHook("onError");
// Fixture
export const getFixture = runner.fixture.get;
// Other functions
// Other test runner functions
export const definePreset = runner.exportFn(runner.definePreset);
export const dryRun = runner.exportFn(runner.dryRun);
export const getCurrent = runner.exportFn(runner.getCurrent);
@ -61,59 +72,102 @@ export { defineTags } from "./core/tag";
export { createJobScopedGetter } from "./hoot_utils";
// Constants
export const globals = {
AbortController: globalThis.AbortController,
Array: globalThis.Array,
Boolean: globalThis.Boolean,
DataTransfer: globalThis.DataTransfer,
Date: globalThis.Date,
Document: globalThis.Document,
Element: globalThis.Element,
Error: globalThis.Error,
ErrorEvent: globalThis.ErrorEvent,
EventTarget: globalThis.EventTarget,
Map: globalThis.Map,
MutationObserver: globalThis.MutationObserver,
Number: globalThis.Number,
Object: globalThis.Object,
ProgressEvent: globalThis.ProgressEvent,
Promise: globalThis.Promise,
PromiseRejectionEvent: globalThis.PromiseRejectionEvent,
Proxy: globalThis.Proxy,
RegExp: globalThis.RegExp,
Request: globalThis.Request,
Response: globalThis.Response,
Set: globalThis.Set,
SharedWorker: globalThis.SharedWorker,
String: globalThis.String,
TypeError: globalThis.TypeError,
URIError: globalThis.URIError,
URL: globalThis.URL,
URLSearchParams: globalThis.URLSearchParams,
WebSocket: globalThis.WebSocket,
Window: globalThis.Window,
Worker: globalThis.Worker,
XMLHttpRequest: globalThis.XMLHttpRequest,
cancelAnimationFrame: globalThis.cancelAnimationFrame,
clearInterval: globalThis.clearInterval,
clearTimeout: globalThis.clearTimeout,
console: globalThis.console,
document: globalThis.document,
fetch: globalThis.fetch,
history: globalThis.history,
JSON: globalThis.JSON,
localStorage: globalThis.localStorage,
location: globalThis.location,
matchMedia: globalThis.matchMedia,
Math: globalThis.Math,
navigator: globalThis.navigator,
ontouchstart: globalThis.ontouchstart,
performance: globalThis.performance,
requestAnimationFrame: globalThis.requestAnimationFrame,
sessionStorage: globalThis.sessionStorage,
setInterval: globalThis.setInterval,
setTimeout: globalThis.setTimeout,
};
export const globals = copyAndBind(globalThis);
export const isHootReady = setupHootUI();
// Mock
export { disableAnimations, enableTransitions } from "./mock/animation";
export { mockDate, mockLocale, mockTimeZone, onTimeZoneChange } from "./mock/date";
export { makeSeededRandom } from "./mock/math";
export { mockPermission, mockSendBeacon, mockUserAgent, mockVibrate } from "./mock/navigator";
export { mockFetch, mockLocation, mockWebSocket, mockWorker, withFetch } from "./mock/network";
export { flushNotifications } from "./mock/notification";
export {
mockMatchMedia,
mockTouch,
watchAddedNodes,
watchKeys,
watchListeners,
} from "./mock/window";
// HOOT-DOM
export {
advanceFrame,
advanceTime,
animationFrame,
cancelAllTimers,
check,
clear,
click,
dblclick,
Deferred,
delay,
drag,
edit,
fill,
formatXml,
freezeTime,
getActiveElement,
getFocusableElements,
getNextFocusableElement,
getParentFrame,
getPreviousFocusableElement,
hover,
isDisplayed,
isEditable,
isFocusable,
isInDOM,
isInViewPort,
isScrollable,
isVisible,
keyDown,
keyUp,
leave,
manuallyDispatchProgrammaticEvent,
matches,
microTick,
middleClick,
on,
pointerDown,
pointerUp,
press,
queryAll,
queryAllAttributes,
queryAllProperties,
queryAllRects,
queryAllTexts,
queryAllValues,
queryAny,
queryAttribute,
queryFirst,
queryOne,
queryRect,
queryText,
queryValue,
resize,
rightClick,
runAllTimers,
scroll,
select,
setFrameRate,
setInputFiles,
setInputRange,
tick,
uncheck,
unfreezeTime,
unload,
waitFor,
waitForNone,
waitUntil,
} from "@odoo/hoot-dom";
// Debug
export { exposeHelpers } from "../hoot-dom/hoot_dom_utils";
export const __debug__ = runner;
export const isHootReady = setupHootUI();
/**
* @param {...unknown} values
*/
export function registerDebugInfo(...values) {
logger.logDebug(...values);
}

View file

@ -6,6 +6,7 @@ import { isNode } from "@web/../lib/hoot-dom/helpers/dom";
import {
isInstanceOf,
isIterable,
isPromise,
parseRegExp,
R_WHITE_SPACE,
toSelector,
@ -114,6 +115,7 @@ const {
TypeError,
URL,
URLSearchParams,
WeakMap,
WeakSet,
window,
} = globalThis;
@ -165,10 +167,21 @@ function getGenericSerializer(value) {
}
function makeObjectCache() {
const cache = new Set();
const cache = new WeakSet();
return {
add: (...values) => values.forEach((value) => cache.add(value)),
has: (...values) => values.every((value) => cache.has(value)),
add: (...values) => {
for (const value of values) {
cache.add(value);
}
},
has: (...values) => {
for (const value of values) {
if (!cache.has(value)) {
return false;
}
}
return true;
},
};
}
@ -178,11 +191,7 @@ function makeObjectCache() {
* @returns {T}
*/
function resolve(value) {
if (typeof value === "function") {
return value();
} else {
return value;
}
return typeof value === "function" ? value() : value;
}
/**
@ -205,6 +214,51 @@ function truncate(value, length = MAX_HUMAN_READABLE_SIZE) {
return strValue.length <= length ? strValue : strValue.slice(0, length) + ELLIPSIS;
}
/**
* @template T
* @param {T} value
* @param {ReturnType<makeObjectCache>} cache
* @returns {T}
*/
function _deepCopy(value, cache) {
if (!value) {
return value;
}
if (typeof value === "function") {
if (value.name) {
return `<function ${value.name}>`;
} else {
return "<anonymous function>";
}
}
if (typeof value === "object" && !Markup.isMarkup(value)) {
if (isInstanceOf(value, String, Number, Boolean)) {
return value;
}
if (isNode(value)) {
// Nodes
return value.cloneNode(true);
} else if (isInstanceOf(value, Date, RegExp)) {
// Dates & regular expressions
return new (getConstructor(value))(value);
} else if (isIterable(value)) {
const isArray = $isArray(value);
const valueArray = isArray ? value : [...value];
// Iterables
const values = valueArray.map((item) => _deepCopy(item, cache));
return $isArray(value) ? values : new (getConstructor(value))(values);
} else {
// Other objects
if (cache.has(value)) {
return S_CIRCULAR;
}
cache.add(value);
return $fromEntries($ownKeys(value).map((key) => [key, _deepCopy(value[key], cache)]));
}
}
return value;
}
/**
* @param {unknown} a
* @param {unknown} b
@ -521,6 +575,8 @@ class QueryPartialString extends QueryString {
compareFn = getFuzzyScore;
}
const EMPTY_CONSTRUCTOR = { name: null };
/** @type {Map<Function, (value: unknown) => string>} */
const GENERIC_SERIALIZERS = new Map([
[BigInt, (v) => v.valueOf()],
@ -551,10 +607,12 @@ const R_NAMED_FUNCTION = /^\s*(async\s+)?function/;
const R_INVISIBLE_CHARACTERS = /[\u00a0\u200b-\u200d\ufeff]/g;
const R_OBJECT = /^\[object ([\w-]+)\]$/;
const labelObjects = new WeakSet();
const objectConstructors = new Map();
/** @type {(KeyboardEventInit & { callback: (ev: KeyboardEvent) => any })[]} */
const hootKeys = [];
const labelObjects = new WeakSet();
const objectConstructors = new Map();
/** @type {WeakMap<unknown, unknown>} */
const syncValues = new WeakMap();
const windowTarget = {
addEventListener: window.addEventListener.bind(window),
removeEventListener: window.removeEventListener.bind(window),
@ -597,6 +655,22 @@ export function callHootKey(ev) {
}
}
/**
* @template T
* @param {T} object
* @returns {T}
*/
export function copyAndBind(object) {
const copy = {};
for (const [key, desc] of $entries($getOwnPropertyDescriptors(object))) {
if (key !== "constructor" && typeof desc.value === "function") {
desc.value = desc.value.bind(object);
}
$defineProperty(copy, key, desc);
}
return copy;
}
/**
* @template {(previous: any, ...args: any[]) => any} T
* @param {T} instanceGetter
@ -666,6 +740,7 @@ export function createReporting(parentReporting) {
const reporting = reactive({
assertions: 0,
duration: 0,
failed: 0,
passed: 0,
skipped: 0,
@ -714,45 +789,6 @@ export function createMock(target, descriptors) {
return mock;
}
/**
* @template T
* @param {T} value
* @returns {T}
*/
export function deepCopy(value) {
if (!value) {
return value;
}
if (typeof value === "function") {
if (value.name) {
return `<function ${value.name}>`;
} else {
return "<anonymous function>";
}
}
if (typeof value === "object" && !Markup.isMarkup(value)) {
if (isInstanceOf(value, String, Number, Boolean)) {
return value;
}
if (isNode(value)) {
// Nodes
return value.cloneNode(true);
} else if (isInstanceOf(value, Date, RegExp)) {
// Dates & regular expressions
return new (getConstructor(value))(value);
} else if (isIterable(value)) {
// Iterables
const values = [...value].map(deepCopy);
return $isArray(value) ? values : new (getConstructor(value))(values);
} else {
// Other objects
return $fromEntries($ownKeys(value).map((key) => [key, deepCopy(value[key])]));
}
}
return value;
}
/**
* @template {(...args: any[]) => any} T
* @param {T} fn
@ -801,6 +837,15 @@ export function debounce(fn, delay) {
}[name];
}
/**
* @template T
* @param {T} value
* @returns {T}
*/
export function deepCopy(value) {
return _deepCopy(value, makeObjectCache());
}
/**
* @param {unknown} a
* @param {unknown} b
@ -955,7 +1000,7 @@ export function generateHash(...strings) {
export function getConstructor(value) {
const { constructor } = value;
if (constructor !== Object) {
return constructor || { name: null };
return constructor || EMPTY_CONSTRUCTOR;
}
const str = value.toString();
const match = str.match(R_OBJECT);
@ -1021,6 +1066,30 @@ export function getFuzzyScore(pattern, string) {
return score;
}
/**
* Returns the value associated to the given object.
* If 'toStringValue' is set, the result will concatenate any inner object that
* also has an associated sync value. This is typically useful for nested Blobs.
*
* @param {unknown} object
* @param {boolean} toStringValue
*/
export function getSyncValue(object, toStringValue) {
const result = syncValues.get(object);
if (!toStringValue) {
return result;
}
let textResult = "";
if (isIterable(result)) {
for (const part of result) {
textResult += syncValues.has(part) ? getSyncValue(part, toStringValue) : String(part);
}
} else {
textResult += String(result);
}
return textResult;
}
/**
* @param {unknown} value
* @returns {ArgumentType}
@ -1389,6 +1458,14 @@ export async function paste() {
}
}
/**
* @param {unknown} object
* @param {unknown} value
*/
export function setSyncValue(object, value) {
syncValues.set(object, value);
}
/**
* @param {string} key
*/
@ -1591,7 +1668,7 @@ export class Callbacks {
* @param {boolean} [once]
*/
add(type, callback, once) {
if (isInstanceOf(callback, Promise)) {
if (isPromise(callback)) {
const promiseValue = callback;
callback = function waitForPromise() {
return Promise.resolve(promiseValue).then(resolve);
@ -1994,9 +2071,12 @@ export const INCLUDE_LEVEL = {
};
export const MIME_TYPE = {
formData: "multipart/form-data",
blob: "application/octet-stream",
html: "text/html",
json: "application/json",
text: "text/plain",
xml: "text/xml",
};
export const STORAGE = {
@ -2006,6 +2086,7 @@ export const STORAGE = {
};
export const S_ANY = Symbol("any value");
export const S_CIRCULAR = Symbol("circular object");
export const S_NONE = Symbol("no value");
export const R_QUERY_EXACT = new RegExp(

View file

@ -11,6 +11,15 @@ let runner;
// Exports
//-----------------------------------------------------------------------------
/**
* @param {string} funcName
*/
export function ensureTest(funcName) {
if (!runner?.getCurrent().test) {
throw new Error(`Cannot call '${funcName}' from outside a test`);
}
}
export function getRunner() {
return runner;
}

View file

@ -2,6 +2,7 @@
import { on } from "@odoo/hoot-dom";
import { MockEventTarget } from "../hoot_utils";
import { ensureTest } from "../main_runner";
//-----------------------------------------------------------------------------
// Global
@ -95,6 +96,7 @@ export function cleanupAnimations() {
* @param {boolean} [enable=false]
*/
export function disableAnimations(enable = false) {
ensureTest("disableAnimations");
allowAnimations = enable;
}
@ -105,6 +107,7 @@ export function disableAnimations(enable = false) {
* @param {boolean} [enable=true]
*/
export function enableTransitions(enable = true) {
ensureTest("enableTransitions");
allowTransitions = enable;
animationChangeBus.dispatchEvent(new CustomEvent("toggle-transitions"));
}

View file

@ -1,22 +1,71 @@
/** @odoo-module */
//-----------------------------------------------------------------------------
// Global
//-----------------------------------------------------------------------------
const {
Math: { random: $random, floor: $floor },
TextEncoder,
} = globalThis;
//-----------------------------------------------------------------------------
// Internal
//-----------------------------------------------------------------------------
/** @type {SubtleCrypto["decrypt"]} */
function decrypt(algorithm, key, data) {
return Promise.resolve($encode(data.replace("encrypted data:", "")));
}
/** @type {SubtleCrypto["encrypt"]} */
function encrypt(algorithm, key, data) {
return Promise.resolve(`encrypted data:${$decode(data)}`);
}
/** @type {Crypto["getRandomValues"]} */
function getRandomValues(array) {
for (let i = 0; i < array.length; i++) {
array[i] = $floor($random() * 256);
}
return array;
}
/** @type {SubtleCrypto["importKey"]} */
function importKey(format, keyData, algorithm, extractable, keyUsages) {
if (arguments.length < 5) {
throw new TypeError(
`Failed to execute 'importKey' on 'SubtleCrypto': 5 arguments required, but only ${arguments.length} present.`
);
}
if (!keyData || keyData.length === 0) {
throw new TypeError(
`Failed to execute 'importKey' on 'SubtleCrypto': The provided value cannot be converted to a sequence.`
);
}
const key = Symbol([algorithm, String(extractable), "secret", ...keyUsages].join("/"));
return Promise.resolve(key);
}
function randomUUID() {
return [4, 2, 2, 2, 6]
.map((length) => getRandomValues(new Uint8Array(length)).toHex())
.join("-");
}
const $encode = TextEncoder.prototype.encode.bind(new TextEncoder());
const $decode = TextDecoder.prototype.decode.bind(new TextDecoder("utf-8"));
//-----------------------------------------------------------------------------
// Exports
//-----------------------------------------------------------------------------
export const mockCrypto = {
getRandomValues,
randomUUID,
subtle: {
importKey: (_format, keyData, _algorithm, _extractable, _keyUsages) => {
if (!keyData || keyData.length === 0) {
throw Error(`KeyData is mandatory`);
}
return Promise.resolve("I'm a key");
},
encrypt: (_algorithm, _key, data) =>
Promise.resolve(`encrypted data:${new TextDecoder().decode(data)}`),
decrypt: (_algorithm, _key, data) =>
Promise.resolve(new TextEncoder().encode(data.replace("encrypted data:", ""))),
},
getRandomValues: (typedArray) => {
typedArray.forEach((_element, index) => {
typedArray[index] = Math.round(Math.random() * 100);
});
return typedArray;
decrypt,
encrypt,
importKey,
},
};

View file

@ -2,6 +2,7 @@
import { getTimeOffset, isTimeFrozen, resetTimeOffset } from "@web/../lib/hoot-dom/helpers/time";
import { createMock, HootError, isNil } from "../hoot_utils";
import { ensureTest } from "../main_runner";
/**
* @typedef DateSpecs
@ -161,7 +162,7 @@ export function cleanupDate() {
* @see {@link mockTimeZone} for the time zone params.
*
* @param {string | DateSpecs} [date]
* @param {string | number | null} [tz]
* @param {string | number | null} [tz]
* @example
* mockDate("2023-12-25T20:45:00"); // 2023-12-25 20:45:00 UTC
* @example
@ -170,6 +171,7 @@ export function cleanupDate() {
* mockDate("2019-02-11 09:30:00.001", +2);
*/
export function mockDate(date, tz) {
ensureTest("mockDate");
setDateParams(date ? parseDateParams(date) : DEFAULT_DATE);
if (!isNil(tz)) {
setTimeZone(tz);
@ -187,6 +189,7 @@ export function mockDate(date, tz) {
* mockTimeZone("ja-JP"); // UTC + 9
*/
export function mockLocale(newLocale) {
ensureTest("mockLocale");
locale = newLocale;
if (!isNil(locale) && isNil(timeZoneName)) {
@ -213,6 +216,7 @@ export function mockLocale(newLocale) {
* mockTimeZone(null) // Resets to test default (+1)
*/
export function mockTimeZone(tz) {
ensureTest("mockTimeZone");
setTimeZone(tz);
}

View file

@ -1,8 +1,15 @@
/** @odoo-module */
import { isInstanceOf } from "../../hoot-dom/hoot_dom_utils";
import { createMock, HootError, MIME_TYPE, MockEventTarget } from "../hoot_utils";
import { getSyncValue, setSyncValue } from "./sync_values";
import {
createMock,
getSyncValue,
HootError,
MIME_TYPE,
MockEventTarget,
setSyncValue,
} from "../hoot_utils";
import { ensureTest } from "../main_runner";
/**
* @typedef {"android" | "ios" | "linux" | "mac" | "windows"} Platform
@ -220,7 +227,7 @@ export class MockClipboardItem extends ClipboardItem {
// Added synchronous methods to enhance speed in tests
async getType(type) {
return getSyncValue(this)[type];
return getSyncValue(this, false)[type];
}
}
@ -264,18 +271,137 @@ export class MockPermissionStatus extends MockEventTarget {
}
}
export class MockServiceWorker extends MockEventTarget {
static publicListeners = ["error", "message"];
/** @type {ServiceWorkerState} */
state = "activated";
/**
* @param {string} scriptURL
*/
constructor(scriptURL) {
super(...arguments);
/** @type {string} */
this.scriptURL = scriptURL;
}
/**
* @param {any} _message
*/
postMessage(_message) {}
}
export class MockServiceWorkerContainer extends MockEventTarget {
static publicListeners = ["controllerchange", "message", "messageerror"];
/**
* @private
*/
_readyResolved = false;
/**
* @private
* @type {Map<string, MockServiceWorkerRegistration>}
*/
_registrations = new Map();
/** @type {MockServiceWorker | null} */
controller = null;
get ready() {
return this._readyPromise;
}
constructor() {
super(...arguments);
const { promise, resolve } = Promise.withResolvers();
/**
* @type {Promise<MockServiceWorkerRegistration>}
* @private
*/
this._readyPromise = promise;
/**
* @type {(value: MockServiceWorkerRegistration) => void}
* @private
*/
this._resolveReady = resolve;
}
async getRegistration(scope = "/") {
return this._registrations.get(scope);
}
async getRegistrations() {
return Array.from(this._registrations.values());
}
/**
* @param {string} scriptURL
* @param {{ scope?: string }} [options]
*/
async register(scriptURL, options = {}) {
const scope = options.scope ?? "/";
const registration = new MockServiceWorkerRegistration(scriptURL, scope);
this._registrations.set(scope, registration);
if (!this.controller) {
this.controller = registration.active;
this.dispatchEvent(new Event("controllerchange"));
}
if (!this._readyResolved) {
this._readyResolved = true;
this._resolveReady(registration);
}
return registration;
}
startMessages() {}
}
export class MockServiceWorkerRegistration {
/** @type {MockServiceWorker | null} */
installing = null;
/** @type {MockServiceWorker | null} */
waiting = null;
/**
* @param {string} scriptURL
* @param {string} scope
*/
constructor(scriptURL, scope) {
/** @type {MockServiceWorker | null} */
this.active = new MockServiceWorker(scriptURL);
/** @type {string} */
this.scope = scope;
}
async unregister() {
return true;
}
async update() {}
}
export const currentPermissions = getPermissions();
export const mockClipboard = new MockClipboard();
export const mockPermissions = new MockPermissions();
export const mockServiceWorker = new MockServiceWorkerContainer();
export const mockNavigator = createMock(navigator, {
clipboard: { value: mockClipboard },
maxTouchPoints: { get: () => (globalThis.ontouchstart === undefined ? 0 : 1) },
permissions: { value: mockPermissions },
sendBeacon: { get: () => mockValues.sendBeacon },
serviceWorker: { get: () => undefined },
serviceWorker: { value: mockServiceWorker },
userAgent: { get: () => mockValues.userAgent },
vibrate: { get: () => mockValues.vibrate },
});
@ -291,6 +417,7 @@ export function cleanupNavigator() {
* @param {PermissionState} [value]
*/
export function mockPermission(name, value) {
ensureTest("mockPermission");
if (!(name in currentPermissions)) {
throw new TypeError(
`The provided value '${name}' is not a valid enum value of type PermissionName`
@ -310,6 +437,7 @@ export function mockPermission(name, value) {
* @param {Navigator["sendBeacon"]} callback
*/
export function mockSendBeacon(callback) {
ensureTest("mockSendBeacon");
mockValues.sendBeacon = callback;
}
@ -317,6 +445,7 @@ export function mockSendBeacon(callback) {
* @param {Platform} platform
*/
export function mockUserAgent(platform = "linux") {
ensureTest("mockUserAgent");
mockValues.userAgent = makeUserAgent(platform);
}
@ -324,5 +453,6 @@ export function mockUserAgent(platform = "linux") {
* @param {Navigator["vibrate"]} callback
*/
export function mockVibrate(callback) {
ensureTest("mockVibrate");
mockValues.vibrate = callback;
}

View file

@ -7,10 +7,22 @@ import {
} from "@web/../lib/hoot-dom/helpers/time";
import { isInstanceOf } from "../../hoot-dom/hoot_dom_utils";
import { makeNetworkLogger } from "../core/logger";
import { ensureArray, MIME_TYPE, MockEventTarget } from "../hoot_utils";
import { getSyncValue, MockBlob, setSyncValue } from "./sync_values";
import {
ensureArray,
getSyncValue,
isNil,
MIME_TYPE,
MockEventTarget,
setSyncValue,
} from "../hoot_utils";
import { ensureTest } from "../main_runner";
/**
* @typedef {ResponseInit & {
* type?: ResponseType;
* url?: string;
* }} MockResponseInit
*
* @typedef {AbortController
* | MockBroadcastChannel
* | MockMessageChannel
@ -28,19 +40,32 @@ import { getSyncValue, MockBlob, setSyncValue } from "./sync_values";
const {
AbortController,
Blob,
BroadcastChannel,
document,
fetch,
FormData,
Headers,
Map,
Math: { floor: $floor, max: $max, min: $min, random: $random },
Object: { assign: $assign, create: $create, entries: $entries },
Object: {
assign: $assign,
create: $create,
defineProperty: $defineProperty,
entries: $entries,
},
ProgressEvent,
ReadableStream,
Request,
Response,
Set,
TextEncoder,
Uint8Array,
URL,
WebSocket,
XMLHttpRequest,
} = globalThis;
const { parse: $parse, stringify: $stringify } = globalThis.JSON;
//-----------------------------------------------------------------------------
// Internal
@ -86,6 +111,34 @@ async function dispatchMessage(target, data, transfer) {
}
}
/**
*
* @param {{ headers?: HeadersInit } | undefined} object
* @param {string} content
*/
function getHeaders(object, content) {
/** @type {Headers} */
let headers;
if (isInstanceOf(object?.headers, Headers)) {
headers = object.headers;
} else {
headers = new Headers(object?.headers);
}
if (content && !headers.has(HEADER.contentType)) {
if (typeof content === "string") {
headers.set(HEADER.contentType, MIME_TYPE.text);
} else if (isInstanceOf(content, Blob)) {
headers.set(HEADER.contentType, MIME_TYPE.blob);
} else if (isInstanceOf(content, FormData)) {
headers.set(HEADER.contentType, MIME_TYPE.formData);
} else {
headers.set(HEADER.contentType, MIME_TYPE.json);
}
}
return headers;
}
/**
* @param {...NetworkInstance} instances
*/
@ -111,6 +164,37 @@ function markOpen(instance) {
return instance;
}
/**
* Helper used to parse JSON-RPC request/response parameters, and to make their
* "jsonrpc", "id" and "method" properties non-enumerable, as to make them more
* inconspicuous in console logs, effectively highlighting the 'params' or 'result'
* keys.
*
* @param {string} stringParams
*/
function parseJsonRpcParams(stringParams) {
const jsonParams = $assign($create(null), $parse(stringParams));
if (jsonParams && "jsonrpc" in jsonParams) {
$defineProperty(jsonParams, "jsonrpc", {
value: jsonParams.jsonrpc,
enumerable: false,
});
if ("id" in jsonParams) {
$defineProperty(jsonParams, "id", {
value: jsonParams.id,
enumerable: false,
});
}
if ("method" in jsonParams) {
$defineProperty(jsonParams, "method", {
value: jsonParams.method,
enumerable: false,
});
}
}
return jsonParams;
}
/**
* @param {number} min
* @param {number} [max]
@ -130,15 +214,50 @@ function parseNetworkDelay(min, max) {
}
}
/**
* @param {Uint8Array<ArrayBuffer> | string} value
* @returns {Uint8Array<ArrayBuffer>}
*/
function toBytes(value) {
return isInstanceOf(value, Uint8Array) ? value : new TextEncoder().encode(value);
}
const DEFAULT_URL = "https://www.hoot.test/";
const ENDLESS_PROMISE = new Promise(() => {});
const HEADER = {
contentLength: "Content-Length",
contentType: "Content-Type",
};
const R_EQUAL = /\s*=\s*/;
const R_INTERNAL_URL = /^(blob|data|file):/;
const R_INTERNAL_URL = /^(blob|data):/;
const R_SEMICOLON = /\s*;\s*/;
const requestResponseMixin = {
async arrayBuffer() {
return toBytes(this._readValue("arrayBuffer", true)).buffer;
},
async blob() {
const value = this._readValue("blob", false);
return isInstanceOf(value, Blob) ? value : new MockBlob([value]);
},
async bytes() {
return toBytes(this._readValue("bytes", true));
},
async formData() {
const data = this._readValue("formData", false);
if (!isInstanceOf(data, FormData)) {
throw new TypeError("Failed to fetch");
}
return data;
},
async json() {
return $parse(this._readValue("json", true));
},
async text() {
return this._readValue("text", true);
},
};
/** @type {Set<NetworkInstance>} */
const openNetworkInstances = new Set();
@ -148,8 +267,8 @@ let getNetworkDelay = null;
let mockFetchFn = null;
/** @type {((websocket: ServerWebSocket) => any) | null} */
let mockWebSocketConnection = null;
/** @type {Array<(worker: MockSharedWorker | MockWorker) => any>} */
let mockWorkerConnection = [];
/** @type {((worker: MockSharedWorker | MockWorker) => any)[]} */
const mockWorkerConnections = [];
//-----------------------------------------------------------------------------
// Exports
@ -159,7 +278,7 @@ export function cleanupNetwork() {
// Mocked functions
mockFetchFn = null;
mockWebSocketConnection = null;
mockWorkerConnection = [];
mockWorkerConnections.length = 0;
// Network instances
for (const instance of openNetworkInstances) {
@ -194,33 +313,57 @@ export function cleanupNetwork() {
/** @type {typeof fetch} */
export async function mockedFetch(input, init) {
if (R_INTERNAL_URL.test(input)) {
// Internal URL: directly handled by the browser
return fetch(input, init);
}
const strInput = String(input);
const isInternalUrl = R_INTERNAL_URL.test(strInput);
if (!mockFetchFn) {
throw new Error("Can't make a request when fetch is not mocked");
if (isInternalUrl) {
// Internal URL without mocked 'fetch': directly handled by the browser
return fetch(input, init);
}
throw new Error(
`Could not fetch "${strInput}": cannot make a request when fetch is not mocked`
);
}
init ||= {};
const method = init.method?.toUpperCase() || (init.body ? "POST" : "GET");
const { logRequest, logResponse } = makeNetworkLogger(method, input);
const controller = markOpen(new AbortController());
init.signal = controller.signal;
logRequest(() => (typeof init.body === "string" ? JSON.parse(init.body) : init));
init = { ...init };
init.headers = getHeaders(init, init.body);
init.method = init.method?.toUpperCase() || (isNil(init.body) ? "GET" : "POST");
// Allows 'signal' to not be logged with 'logRequest'.
$defineProperty(init, "signal", {
value: controller.signal,
enumerable: false,
});
const { logRequest, logResponse } = makeNetworkLogger(init.method, strInput);
logRequest(() => {
const readableInit = {
...init,
// Make headers easier to read in the console
headers: new Map(init.headers),
};
if (init.headers.get(HEADER.contentType) === MIME_TYPE.json) {
return [parseJsonRpcParams(init.body), readableInit];
} else {
return [init.body, readableInit];
}
});
if (getNetworkDelay) {
await getNetworkDelay();
}
// keep separate from 'error', as it can be null or undefined even though the
// callback has thrown an error.
let failed = false;
let result;
let error, result;
try {
result = await mockFetchFn(input, init);
} catch (err) {
result = err;
failed = true;
error = err;
}
if (isOpen(controller)) {
markClosed(controller);
@ -228,33 +371,34 @@ export async function mockedFetch(input, init) {
return ENDLESS_PROMISE;
}
if (failed) {
throw result;
throw error;
}
/** @type {Headers} */
let headers;
if (result && isInstanceOf(result.headers, Headers)) {
headers = result.headers;
} else if (isInstanceOf(init.headers, Headers)) {
headers = init.headers;
} else {
headers = new Headers(init.headers);
if (isInternalUrl && isNil(result)) {
// Internal URL without mocked result: directly handled by the browser
return fetch(input, init);
}
let contentType = headers.get(HEADER.contentType);
// Result can be a request or the final request value
const responseHeaders = getHeaders(result, result);
if (result instanceof MockResponse) {
// Mocked response
logResponse(async () => {
const textValue = getSyncValue(result);
return contentType === MIME_TYPE.json ? JSON.parse(textValue) : textValue;
logResponse(() => {
const textValue = getSyncValue(result, true);
return [
responseHeaders.get(HEADER.contentType) === MIME_TYPE.json
? parseJsonRpcParams(textValue)
: textValue,
result,
];
});
return result;
}
if (isInstanceOf(result, Response)) {
// Actual fetch
logResponse(() => "(go to network tab for request content)");
logResponse(() => ["(go to network tab for request content)", result]);
return result;
}
@ -262,26 +406,28 @@ export async function mockedFetch(input, init) {
// Determine the return type based on:
// - the content type header
// - or the type of the returned value
if (!contentType) {
if (typeof result === "string") {
contentType = MIME_TYPE.text;
} else if (isInstanceOf(result, Blob)) {
contentType = MIME_TYPE.blob;
} else {
contentType = MIME_TYPE.json;
}
}
if (contentType === MIME_TYPE.json) {
if (responseHeaders.get(HEADER.contentType) === MIME_TYPE.json) {
// JSON response
const strBody = JSON.stringify(result ?? null);
logResponse(() => result);
return new MockResponse(strBody, { [HEADER.contentType]: contentType });
const strBody = $stringify(result ?? null);
const response = new MockResponse(strBody, {
headers: responseHeaders,
statusText: "OK",
type: "basic",
url: strInput,
});
logResponse(() => [parseJsonRpcParams(strBody), response]);
return response;
}
// Any other type (blob / text)
logResponse(() => result);
return new MockResponse(result, { [HEADER.contentType]: contentType });
// Any other type
const response = new MockResponse(result, {
headers: responseHeaders,
statusText: "OK",
type: "basic",
url: strInput,
});
logResponse(() => [result, response]);
return response;
}
/**
@ -310,6 +456,7 @@ export async function mockedFetch(input, init) {
* });
*/
export function mockFetch(fetchFn) {
ensureTest("mockFetch");
mockFetchFn = fetchFn;
}
@ -321,6 +468,7 @@ export function mockFetch(fetchFn) {
* @param {typeof mockWebSocketConnection} [onWebSocketConnected]
*/
export function mockWebSocket(onWebSocketConnected) {
ensureTest("mockWebSocket");
mockWebSocketConnection = onWebSocketConnected;
}
@ -330,7 +478,7 @@ export function mockWebSocket(onWebSocketConnected) {
* (see {@link mockFetch});
* - the `onWorkerConnected` callback will be called after a worker has been created.
*
* @param {typeof mockWorkerConnection} [onWorkerConnected]
* @param {typeof mockWorkerConnections[number]} [onWorkerConnected]
* @example
* mockWorker((worker) => {
* worker.addEventListener("message", (event) => {
@ -339,7 +487,8 @@ export function mockWebSocket(onWebSocketConnected) {
* });
*/
export function mockWorker(onWorkerConnected) {
mockWorkerConnection.push(onWorkerConnected);
ensureTest("mockWorker");
mockWorkerConnections.push(onWorkerConnected);
}
/**
@ -349,6 +498,42 @@ export function throttleNetwork(...args) {
getNetworkDelay = parseNetworkDelay(...args);
}
/**
* @param {typeof mockFetchFn} fetchFn
* @param {() => void} callback
*/
export async function withFetch(fetchFn, callback) {
mockFetchFn = fetchFn;
const result = await callback();
mockFetchFn = null;
return result;
}
export class MockBlob extends Blob {
constructor(blobParts, options) {
super(blobParts, options);
setSyncValue(this, blobParts);
}
async arrayBuffer() {
return toBytes(getSyncValue(this, true)).buffer;
}
async bytes() {
return toBytes(getSyncValue(this, true));
}
async stream() {
const value = getSyncValue(this, true);
return isInstanceOf(value, ReadableStream) ? value : new ReadableStream(value);
}
async text() {
return getSyncValue(this, true);
}
}
export class MockBroadcastChannel extends BroadcastChannel {
constructor() {
super(...arguments);
@ -650,58 +835,91 @@ export class MockMessagePort extends MockEventTarget {
}
export class MockRequest extends Request {
static {
Object.assign(this.prototype, requestResponseMixin);
}
/**
* @param {RequestInfo} input
* @param {RequestInit} [init]
*/
constructor(input, init) {
super(input, init);
super(new MockURL(input), init);
setSyncValue(this, init?.body ?? null);
}
async arrayBuffer() {
return new TextEncoder().encode(getSyncValue(this));
clone() {
const request = new this.constructor(this.url, this);
setSyncValue(request, getSyncValue(this, false));
return request;
}
async blob() {
return new MockBlob([getSyncValue(this)]);
}
async json() {
return JSON.parse(getSyncValue(this));
}
async text() {
return getSyncValue(this);
/**
* In tests, requests objects are expected to be read by multiple network handlers.
* As such, their 'body' isn't consumed upon reading.
*
* @protected
* @param {string} reader
* @param {boolean} toStringValue
*/
_readValue(reader, toStringValue) {
return getSyncValue(this, toStringValue);
}
}
export class MockResponse extends Response {
static {
Object.assign(this.prototype, requestResponseMixin);
}
/**
* @param {BodyInit} body
* @param {ResponseInit} [init]
* @param {MockResponseInit} [init]
*/
constructor(body, init) {
super(body, init);
if (init?.type) {
$defineProperty(this, "type", {
value: init.type,
configurable: true,
enumerable: true,
writable: false,
});
}
if (init?.url) {
$defineProperty(this, "url", {
value: String(new MockURL(init.url)),
configurable: true,
enumerable: true,
writable: false,
});
}
setSyncValue(this, body ?? null);
}
async arrayBuffer() {
return new TextEncoder().encode(getSyncValue(this)).buffer;
clone() {
return new this.constructor(getSyncValue(this, false), this);
}
async blob() {
return new MockBlob([getSyncValue(this)]);
}
async json() {
return JSON.parse(getSyncValue(this));
}
async text() {
return getSyncValue(this);
/**
* Reading the 'body' of a response always consumes it, as opposed to the {@link MockRequest}
* body.
*
* @protected
* @param {string} reader
* @param {boolean} toStringValue
*/
_readValue(reader, toStringValue) {
if (this.bodyUsed) {
throw new TypeError(
`Failed to execute '${reader}' on '${this.constructor.name}': body stream already read`
);
}
$defineProperty(this, "bodyUsed", { value: true, configurable: true, enumerable: true });
return getSyncValue(this, toStringValue);
}
}
@ -732,7 +950,7 @@ export class MockSharedWorker extends MockEventTarget {
// First port has to be started manually
this._messageChannel.port2.start();
for (const onWorkerConnected of mockWorkerConnection) {
for (const onWorkerConnected of mockWorkerConnections) {
onWorkerConnected(this);
}
}
@ -745,6 +963,10 @@ export class MockURL extends URL {
}
export class MockWebSocket extends MockEventTarget {
static CONNECTING = 0;
static OPEN = 1;
static CLOSING = 2;
static CLOSED = 3;
static publicListeners = ["close", "error", "message", "open"];
/**
@ -788,7 +1010,7 @@ export class MockWebSocket extends MockEventTarget {
markOpen(this);
this._readyState = WebSocket.OPEN;
this._logger.logRequest(() => "connection open");
this._logger.logRequest(() => ["connection open"]);
this.dispatchEvent(new Event("open"));
});
@ -808,7 +1030,7 @@ export class MockWebSocket extends MockEventTarget {
if (this.readyState !== WebSocket.OPEN) {
return;
}
this._logger.logRequest(() => data);
this._logger.logRequest(() => [data]);
dispatchMessage(this._serverWs, data);
}
}
@ -839,7 +1061,7 @@ export class MockWorker extends MockEventTarget {
this.dispatchEvent(new MessageEvent("message", { data: ev.data }));
});
for (const onWorkerConnected of mockWorkerConnection) {
for (const onWorkerConnected of mockWorkerConnections) {
onWorkerConnected(this);
}
}
@ -865,11 +1087,11 @@ export class MockWorker extends MockEventTarget {
export class MockXMLHttpRequest extends MockEventTarget {
static publicListeners = ["error", "load"];
static {
// Assign status codes
Object.assign(this, XMLHttpRequest);
}
/**
* @private
*/
_headers = {};
/**
* @private
*/
@ -877,28 +1099,72 @@ export class MockXMLHttpRequest extends MockEventTarget {
/**
* @private
*/
_readyState = XMLHttpRequest.UNSENT;
/**
* @type {Record<string, string>}
* @private
*/
_requestHeaders = Object.create(null);
/**
* @private
*/
_requestUrl = "";
/**
* @type {Response | null}
* @private
*/
_response = null;
/**
* @private
*/
_status = XMLHttpRequest.UNSENT;
_responseMimeType = "";
/**
* @private
*/
_url = "";
_responseValue = null;
abort() {
markClosed(this);
get readyState() {
return this._readyState;
}
upload = new MockXMLHttpRequestUpload();
get response() {
return this._response;
return this._responseValue;
}
get responseText() {
return String(this._responseValue);
}
get responseURL() {
return this._response.url;
}
get responseXML() {
const parser = new DOMParser();
try {
return parser.parseFromString(this._responseValue, this._responseMimeType);
} catch {
return null;
}
}
get status() {
return this._status;
return this._response?.status || 0;
}
get statusText() {
return this._readyState >= XMLHttpRequest.LOADING ? "OK" : "";
}
/**
* @type {XMLHttpRequestResponseType}
*/
responseType = "";
upload = new MockXMLHttpRequestUpload();
abort() {
this._setReadyState(XMLHttpRequest.DONE);
markClosed(this);
}
/** @type {XMLHttpRequest["dispatchEvent"]} */
@ -909,12 +1175,31 @@ export class MockXMLHttpRequest extends MockEventTarget {
return super.dispatchEvent(event);
}
getAllResponseHeaders() {
let result = "";
for (const [key, value] of this._response?.headers || []) {
result += `${key}: ${value}\r\n`;
}
return result;
}
/** @type {XMLHttpRequest["getResponseHeader"]} */
getResponseHeader(name) {
return this._response?.headers.get(name) || "";
}
/** @type {XMLHttpRequest["open"]} */
open(method, url) {
markOpen(this);
this._method = method;
this._url = url;
this._requestUrl = url;
this._setReadyState(XMLHttpRequest.OPENED);
}
/** @type {XMLHttpRequest["overrideMimeType"]} */
overrideMimeType(mime) {
this._responseMimeType = mime;
}
/** @type {XMLHttpRequest["send"]} */
@ -922,35 +1207,56 @@ export class MockXMLHttpRequest extends MockEventTarget {
if (!isOpen(this)) {
return ENDLESS_PROMISE;
}
this._setReadyState(XMLHttpRequest.HEADERS_RECEIVED);
try {
const response = await window.fetch(this._url, {
this._response = await window.fetch(this._requestUrl, {
method: this._method,
body,
headers: this._headers,
headers: this._requestHeaders,
});
this._status = response.status;
if (new URL(this._url, mockLocation.origin).protocol === "blob:") {
this._response = await response.arrayBuffer();
this._setReadyState(XMLHttpRequest.LOADING);
if (!this._responseMimeType) {
if (this._response.url.startsWith("blob:")) {
this._responseMimeType = MIME_TYPE.blob;
} else {
this._responseMimeType = this._response.headers.get(HEADER.contentType);
}
}
if (this._response instanceof MockResponse) {
// Mock response: get bound value (synchronously)
this._responseValue = getSyncValue(this._response, false);
} else if (this._responseMimeType === MIME_TYPE.blob) {
// Actual "blob:" response: get array buffer
this._responseValue = await this._response.arrayBuffer();
} else if (this._responseMimeType === MIME_TYPE.json) {
// JSON response: get parsed JSON value
this._responseValue = await this._response.json();
} else {
this._response = await response.text();
// Anything else: parse response body as text
this._responseValue = await this._response.text();
}
this.dispatchEvent(new ProgressEvent("load"));
} catch (error) {
this.dispatchEvent(new ProgressEvent("error", { error }));
} catch {
this.dispatchEvent(new ProgressEvent("error"));
}
this._setReadyState(XMLHttpRequest.DONE);
markClosed(this);
}
/** @type {XMLHttpRequest["setRequestHeader"]} */
setRequestHeader(name, value) {
this._headers[name] = value;
this._requestHeaders[name] = value;
}
/** @type {XMLHttpRequest["getResponseHeader"]} */
getResponseHeader(name) {
return this._headers[name];
/**
* @private
* @param {number} readyState
*/
_setReadyState(readyState) {
this._readyState = readyState;
this.dispatchEvent(new Event("readystatechange"));
}
}
@ -989,7 +1295,6 @@ export class ServerWebSocket extends MockEventTarget {
/**
* @param {WebSocket} websocket
* @param {ReturnType<typeof makeNetworkLogger>} logger
* @param {ReturnType<typeof makeNetworkLogger>} logger
*/
constructor(websocket, logger) {
super();
@ -1001,7 +1306,7 @@ export class ServerWebSocket extends MockEventTarget {
this.addEventListener("close", (ev) => {
dispatchClose(this._clientWs, ev);
this._logger.logResponse(() => "connection closed");
this._logger.logResponse(() => ["connection closed", ev]);
});
mockWebSocketConnection?.(this);
@ -1018,7 +1323,7 @@ export class ServerWebSocket extends MockEventTarget {
if (!isOpen(this)) {
return;
}
this._logger.logResponse(() => data);
this._logger.logResponse(() => [data]);
dispatchMessage(this._clientWs, data);
}
}

View file

@ -1,48 +0,0 @@
/** @odoo-module */
//-----------------------------------------------------------------------------
// Global
//-----------------------------------------------------------------------------
const { Blob, TextEncoder } = globalThis;
//-----------------------------------------------------------------------------
// Internal
//-----------------------------------------------------------------------------
const syncValues = new WeakMap();
//-----------------------------------------------------------------------------
// Exports
//-----------------------------------------------------------------------------
/**
* @param {any} object
*/
export function getSyncValue(object) {
return syncValues.get(object);
}
/**
* @param {any} object
* @param {any} value
*/
export function setSyncValue(object, value) {
syncValues.set(object, value);
}
export class MockBlob extends Blob {
constructor(blobParts, options) {
super(blobParts, options);
setSyncValue(this, blobParts);
}
async arrayBuffer() {
return new TextEncoder().encode(getSyncValue(this));
}
async text() {
return getSyncValue(this).join("");
}
}

View file

@ -12,7 +12,7 @@ import {
} from "@web/../lib/hoot-dom/helpers/time";
import { interactor } from "../../hoot-dom/hoot_dom_utils";
import { MockEventTarget, strictEqual, waitForDocument } from "../hoot_utils";
import { getRunner } from "../main_runner";
import { ensureTest, getRunner } from "../main_runner";
import {
MockAnimation,
mockedAnimate,
@ -25,9 +25,11 @@ import {
mockedWindowScrollTo,
} from "./animation";
import { MockConsole } from "./console";
import { mockCrypto } from "./crypto";
import { MockDate, MockIntl } from "./date";
import { MockClipboardItem, mockNavigator } from "./navigator";
import {
MockBlob,
MockBroadcastChannel,
MockMessageChannel,
MockMessagePort,
@ -46,8 +48,6 @@ import {
} from "./network";
import { MockNotification } from "./notification";
import { MockStorage } from "./storage";
import { MockBlob } from "./sync_values";
import { mockCrypto } from "./crypto";
//-----------------------------------------------------------------------------
// Global
@ -61,6 +61,7 @@ const {
Object: {
assign: $assign,
defineProperties: $defineProperties,
defineProperty: $defineProperty,
entries: $entries,
getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
getPrototypeOf: $getPrototypeOf,
@ -70,9 +71,11 @@ const {
Reflect: { ownKeys: $ownKeys },
Set,
WeakMap,
WeakSet,
} = globalThis;
const { addEventListener, removeEventListener } = EventTarget.prototype;
const { preventDefault } = Event.prototype;
//-----------------------------------------------------------------------------
// Internal
@ -327,6 +330,11 @@ function mockedMatchMedia(mediaQueryString) {
return new MockMediaQueryList(mediaQueryString);
}
function mockedPreventDefault() {
preventedEvents.add(this);
return preventDefault.call(this, ...arguments);
}
/** @type {typeof removeEventListener} */
function mockedRemoveEventListener(...args) {
if (getRunner().dry) {
@ -420,6 +428,18 @@ class MockMediaQueryList extends MockEventTarget {
}
}
class MockMutationObserver extends MutationObserver {
disconnect() {
activeMutationObservers.delete(this);
return super.disconnect(...arguments);
}
observe() {
activeMutationObservers.add(this);
return super.observe(...arguments);
}
}
const DEFAULT_MEDIA_VALUES = {
"display-mode": "browser",
pointer: "fine",
@ -438,12 +458,16 @@ const R_OWL_SYNTHETIC_LISTENER = /\bnativeToSyntheticEvent\b/;
const originalDescriptors = new WeakMap();
const originalTouchFunctions = getTouchTargets(globalThis).map(getTouchDescriptors);
/** @type {Set<MockMutationObserver>} */
const activeMutationObservers = new Set();
/** @type {Set<MockMediaQueryList>} */
const mediaQueryLists = new Set();
const mockConsole = new MockConsole();
const mockLocalStorage = new MockStorage();
const mockMediaValues = { ...DEFAULT_MEDIA_VALUES };
const mockSessionStorage = new MockStorage();
/** @type {WeakSet<Event>} */
const preventedEvents = new WeakSet();
let mockTitle = "";
// Mock descriptors
@ -493,6 +517,7 @@ const WINDOW_MOCK_DESCRIPTORS = {
matchMedia: { value: mockedMatchMedia },
MessageChannel: { value: MockMessageChannel },
MessagePort: { value: MockMessagePort },
MutationObserver: { value: MockMutationObserver },
navigator: { value: mockNavigator },
Notification: { value: MockNotification },
outerHeight: { get: () => getCurrentDimensions().height },
@ -547,6 +572,11 @@ export function cleanupWindow() {
// Touch
restoreTouch(view);
// Mutation observers
for (const observer of activeMutationObservers) {
observer.disconnect();
}
}
export function getTitle() {
@ -579,19 +609,37 @@ export function getViewPortWidth() {
}
}
/**
* @param {Event} event
*/
export function isPrevented(event) {
return event.defaultPrevented || preventedEvents.has(event);
}
/**
* @param {Record<string, string>} name
*/
export function mockMatchMedia(values) {
ensureTest("mockMatchMedia");
$assign(mockMediaValues, values);
callMediaQueryChanges($keys(values));
}
/**
* @param {Event} event
*/
export function mockPreventDefault(event) {
$defineProperty(event, "preventDefault", {
value: mockedPreventDefault,
});
}
/**
* @param {boolean} setTouch
*/
export function mockTouch(setTouch) {
ensureTest("mockTouch");
const objects = getTouchTargets(getWindow());
if (setTouch) {
for (const object of objects) {
@ -695,13 +743,13 @@ export function watchListeners(view = getWindow()) {
* afterEach(watchKeys(window, ["odoo"]));
*/
export function watchKeys(target, whiteList) {
const acceptedKeys = new Set([...$ownKeys(target), ...(whiteList || [])]);
const acceptedKeys = new Set($ownKeys(target).concat(whiteList || []));
return function checkKeys() {
const keysDiff = $ownKeys(target).filter(
(key) => $isNaN($parseFloat(key)) && !acceptedKeys.has(key)
);
for (const key of keysDiff) {
for (const key of $ownKeys(target)) {
if (!$isNaN($parseFloat(key)) || acceptedKeys.has(key)) {
continue;
}
const descriptor = $getOwnPropertyDescriptor(target, key);
if (descriptor.configurable) {
delete target[key];

View file

@ -228,6 +228,20 @@ describe(parseUrl(import.meta.url), () => {
expect(testResult.events.map(({ label }) => label)).toEqual(matchers.map(([name]) => name));
});
test("'expect' error handling", async () => {
const [customExpect, hooks] = makeExpect({ headless: true });
hooks.before();
expect(() => customExpect(undefined).toInclude("3")).toThrow(
"expected received value to be of type string, any[] or object, got undefined"
);
const testResult = hooks.after();
expect(testResult.pass).toBe(false);
});
test("assertions are prevented after an error", async () => {
const [customExpect, hooks] = makeExpect({ headless: true });
@ -414,7 +428,12 @@ describe(parseUrl(import.meta.url), () => {
});
test("verifyErrors", async () => {
expect.assertions(1);
expect.assertions(2);
expect(() => expect.verifyErrors(["event", "promise", "timeout"])).toThrow(
"cannot call `expect.verifyErrors()` without calling `expect.errors()` beforehand"
);
expect.errors(3);
const boom = (msg) => {

View file

@ -1,11 +1,13 @@
/** @odoo-module */
import { describe, expect, getFixture, test } from "@odoo/hoot";
import {
animationFrame,
click,
describe,
expect,
formatXml,
getActiveElement,
getFixture,
getFocusableElements,
getNextFocusableElement,
getPreviousFocusableElement,
@ -14,16 +16,17 @@ import {
isFocusable,
isInDOM,
isVisible,
mockTouch,
queryAll,
queryAllRects,
queryAllTexts,
queryFirst,
queryOne,
queryRect,
test,
waitFor,
waitForNone,
} from "@odoo/hoot-dom";
import { mockTouch } from "@odoo/hoot-mock";
} from "@odoo/hoot";
import { getParentFrame } from "@web/../lib/hoot-dom/helpers/dom";
import { mountForTest, parseUrl } from "../local_helpers";
@ -466,12 +469,16 @@ describe(parseUrl(import.meta.url), () => {
expectSelector(".title:eq('1')").toEqualNodes(".title", { index: 1 });
expectSelector('.title:eq("1")').toEqualNodes(".title", { index: 1 });
// :contains (text)
// :contains
expectSelector("main > .text:contains(ipsum)").toEqualNodes("p");
expectSelector(".text:contains(/\\bL\\w+\\b\\sipsum/)").toEqualNodes("p");
expectSelector(".text:contains(item)").toEqualNodes("li");
// :contains (value)
// :text
expectSelector(".text:text(item)").toEqualNodes("");
expectSelector(".text:text(first item)").toEqualNodes("li:first-of-type");
// :value
expectSelector("input:value(john)").toEqualNodes("[name=name],[name=email]");
expectSelector("input:value(john doe)").toEqualNodes("[name=name]");
expectSelector("input:value('John Doe (JOD)')").toEqualNodes("[name=name]");
@ -493,6 +500,17 @@ describe(parseUrl(import.meta.url), () => {
});
});
test("query options", async () => {
await mountForTest(FULL_HTML_TEMPLATE);
expect($$("input", { count: 2 })).toHaveLength(2);
expect(() => $$("input", { count: 1 })).toThrow();
expect($$("option", { count: 6 })).toHaveLength(6);
expect($$("option", { count: 3, root: "[name=title]" })).toHaveLength(3);
expect(() => $$("option", { count: 6, root: "[name=title]" })).toThrow();
});
test("advanced use cases", async () => {
await mountForTest(FULL_HTML_TEMPLATE);
@ -596,9 +614,9 @@ describe(parseUrl(import.meta.url), () => {
<div>PA4: PAV41</div>
</span>
`);
expectSelector(
`span:contains("Matrix (PAV11, PAV22, PAV31)\nPA4: PAV41")`
).toEqualNodes("span");
expectSelector(`span:contains("Matrix (PAV11, PAV22, PAV31) PA4: PAV41")`).toEqualNodes(
"span"
);
});
test(":has(...):first", async () => {
@ -730,7 +748,7 @@ describe(parseUrl(import.meta.url), () => {
`);
expectSelector(
`.o_content:has(.o_field_widget[name=messages]):has(td:contains(/^bbb$/)):has(td:contains(/^\\[test_trigger\\] Mitchell Admin$/))`
`.o_content:has(.o_field_widget[name=messages]):has(td:text(bbb)):has(td:contains(/^\\[test_trigger\\] Mitchell Admin/))`
).toEqualNodes(".o_content");
});
@ -861,7 +879,7 @@ describe(parseUrl(import.meta.url), () => {
expect($1(".title:first")).toBe(getFixture().querySelector("header .title"));
expect(() => $1(".title")).toThrow();
expect(() => $1(".title", { exact: 2 })).toThrow();
expect(() => $1(".title", { count: 2 })).toThrow();
});
test("queryRect", async () => {
@ -899,10 +917,10 @@ describe(parseUrl(import.meta.url), () => {
// queryOne error messages
expect(() => $1()).toThrow(`found 0 elements instead of 1`);
expect(() => $$([], { exact: 18 })).toThrow(`found 0 elements instead of 18`);
expect(() => $$([], { count: 18 })).toThrow(`found 0 elements instead of 18`);
expect(() => $1("")).toThrow(`found 0 elements instead of 1: 0 matching ""`);
expect(() => $$(".tralalero", { exact: -20 })).toThrow(
`found 1 element instead of -20: 1 matching ".tralalero"`
expect(() => $$(".tralalero", { count: -20 })).toThrow(
`invalid 'count' option: should be a positive integer`
);
expect(() => $1`.tralalero:contains(Tralala):visible:scrollable:first`).toThrow(
`found 0 elements instead of 1: 0 matching ".tralalero:contains(Tralala):visible:scrollable:first" (1 element with text "Tralala" > 1 visible element > 0 scrollable elements)`

View file

@ -1,20 +1,26 @@
/** @odoo-module */
import { after, describe, expect, getFixture, test } from "@odoo/hoot";
import {
advanceTime,
after,
animationFrame,
clear,
click,
dblclick,
describe,
drag,
edit,
expect,
fill,
getFixture,
hover,
keyDown,
keyUp,
leave,
middleClick,
mockFetch,
mockTouch,
mockUserAgent,
on,
pointerDown,
pointerUp,
@ -26,9 +32,9 @@ import {
select,
setInputFiles,
setInputRange,
test,
uncheck,
} from "@odoo/hoot-dom";
import { mockFetch, mockTouch, mockUserAgent } from "@odoo/hoot-mock";
} from "@odoo/hoot";
import { Component, xml } from "@odoo/owl";
import { EventList } from "@web/../lib/hoot-dom/helpers/events";
import { mountForTest, parseUrl } from "../local_helpers";
@ -1230,8 +1236,8 @@ describe(parseUrl(import.meta.url), () => {
"pointerleave:0@input",
"mouseleave:0@input",
// Change
"blur@input",
"change@input",
"blur@input",
"focusout@input",
]);
});
@ -1428,6 +1434,24 @@ describe(parseUrl(import.meta.url), () => {
expect("input").toHaveValue(/file\.txt/);
});
test("setInputFiles: shadow root", async () => {
await mountForTest(/* xml */ `
<div class="container" />
`);
const shadow = queryOne(".container").attachShadow({
mode: "open",
});
const input = document.createElement("input");
input.type = "file";
shadow.appendChild(input);
await click(".container:shadow input");
await setInputFiles(new File([""], "file.txt"));
expect(".container:shadow input").toHaveValue(/file\.txt/);
});
test("setInputRange: basic case and events", async () => {
await mountForTest(/* xml */ `<input type="range" min="10" max="40" />`);
@ -1735,6 +1759,8 @@ describe(parseUrl(import.meta.url), () => {
"focus@input",
"focusin@input",
"focusin@form",
"keyup:Tab@input",
"keyup:Tab@form",
// Enter
"keydown:Enter@input",
"keydown:Enter@form",
@ -1766,6 +1792,8 @@ describe(parseUrl(import.meta.url), () => {
"focus@button",
"focusin@button",
"focusin@form",
"keyup:Tab@button",
"keyup:Tab@form",
// Enter
"keydown:Enter@button",
"keydown:Enter@form",
@ -1798,6 +1826,8 @@ describe(parseUrl(import.meta.url), () => {
"focus@button",
"focusin@button",
"focusin@form",
"keyup:Tab@button",
"keyup:Tab@form",
// Enter
"keydown:Enter@button",
"keydown:Enter@form",
@ -1817,10 +1847,11 @@ describe(parseUrl(import.meta.url), () => {
</form>
`);
mockFetch((url, { body, method }) => {
mockFetch((url, { body, headers, method }) => {
expect.step(new URL(url).pathname);
expect(method).toBe("post");
expect(method).toBe("POST");
expect(headers).toEqual(new Headers([["Content-Type", "multipart/form-data"]]));
expect(body).toBeInstanceOf(FormData);
expect(body.get("csrf_token")).toBe("CSRF_TOKEN_VALUE");
expect(body.get("name")).toBe("Pierre");

View file

@ -1,15 +1,17 @@
/** @odoo-module */
import { describe, expect, test } from "@odoo/hoot";
import {
Deferred,
advanceTime,
animationFrame,
describe,
expect,
microTick,
runAllTimers,
test,
tick,
waitUntil,
} from "@odoo/hoot-dom";
} from "@odoo/hoot";
import { parseUrl } from "../local_helpers";
// timeout of 1 second to ensure all timeouts are actually mocked

View file

@ -4,6 +4,7 @@ import { describe, expect, test } from "@odoo/hoot";
import { queryOne } from "@odoo/hoot-dom";
import { isInstanceOf, isIterable } from "@web/../lib/hoot-dom/hoot_dom_utils";
import {
deepCopy,
deepEqual,
formatHumanReadable,
formatTechnical,
@ -12,16 +13,30 @@ import {
lookup,
match,
parseQuery,
S_CIRCULAR,
title,
toExplicitString,
} from "../hoot_utils";
import { mountForTest, parseUrl } from "./local_helpers";
describe(parseUrl(import.meta.url), () => {
test("deepEqual", () => {
const recursive = {};
recursive.self = recursive;
const recursive = {};
recursive.self = recursive;
describe(parseUrl(import.meta.url), () => {
test("deepCopy", () => {
expect(deepCopy(true)).toEqual(true);
expect(deepCopy(false)).toEqual(false);
expect(deepCopy(null)).toEqual(null);
expect(deepCopy(recursive)).toEqual({ self: S_CIRCULAR });
expect(deepCopy(new Date(0))).toEqual(new Date(0));
expect(deepCopy({ a: 1, b: 2 })).toEqual({ a: 1, b: 2 });
expect(deepCopy({ o: { a: [{ b: 1 }] } })).toEqual({ o: { a: [{ b: 1 }] } });
expect(deepCopy(Symbol.for("a"))).toEqual(Symbol.for("a"));
expect(deepCopy(document.createElement("div"))).toEqual(document.createElement("div"));
expect(deepCopy([1, 2, 3])).toEqual([1, 2, 3]);
});
test("deepEqual", () => {
const TRUTHY_CASES = [
[true, true],
[false, false],

View file

@ -10,7 +10,6 @@
{
"imports": {
"@odoo/hoot-dom": "/web/static/lib/hoot-dom/hoot-dom.js",
"@odoo/hoot-mock": "/web/static/lib/hoot/hoot-mock.js",
"@odoo/hoot": "/web/static/lib/hoot/hoot.js",
"@odoo/owl": "/web/static/lib/hoot/tests/hoot-owl-module.js",
"@web/../lib/hoot-dom/helpers/dom": "/web/static/lib/hoot-dom/helpers/dom.js",
@ -34,7 +33,6 @@
"/web/static/lib/hoot/core/test": "/web/static/lib/hoot/core/test.js",
"/web/static/lib/hoot/core/url": "/web/static/lib/hoot/core/url.js",
"/web/static/lib/hoot/hoot_utils": "/web/static/lib/hoot/hoot_utils.js",
"/web/static/lib/hoot/hoot-mock": "/web/static/lib/hoot/hoot-mock.js",
"/web/static/lib/hoot/hoot": "/web/static/lib/hoot/hoot.js",
"/web/static/lib/hoot/lib/diff_match_patch": "/web/static/lib/hoot/lib/diff_match_patch.js",
"/web/static/lib/hoot/main_runner": "/web/static/lib/hoot/main_runner.js",
@ -47,7 +45,6 @@
"/web/static/lib/hoot/mock/network": "/web/static/lib/hoot/mock/network.js",
"/web/static/lib/hoot/mock/notification": "/web/static/lib/hoot/mock/notification.js",
"/web/static/lib/hoot/mock/storage": "/web/static/lib/hoot/mock/storage.js",
"/web/static/lib/hoot/mock/sync_values": "/web/static/lib/hoot/mock/sync_values.js",
"/web/static/lib/hoot/mock/window": "/web/static/lib/hoot/mock/window.js",
"/web/static/lib/hoot/tests/local_helpers": "/web/static/lib/hoot/tests/local_helpers.js",
"/web/static/lib/hoot/ui/hoot_buttons": "/web/static/lib/hoot/ui/hoot_buttons.js",
@ -85,7 +82,6 @@
<!-- Test assets -->
<script src="/web/static/lib/owl/owl.js"></script>
<script src="../hoot.js" type="module" defer></script>
<link rel="stylesheet" href="/web/static/lib/hoot/ui/hoot_style.css" />
<link rel="stylesheet" href="/web/static/src/libs/fontawesome/css/font-awesome.css" />

View file

@ -1,7 +1,6 @@
/** @odoo-module */
import { describe, expect, test } from "@odoo/hoot";
import { mockSendBeacon, mockTouch, mockVibrate } from "@odoo/hoot-mock";
import { describe, expect, mockSendBeacon, mockTouch, mockVibrate, test } from "@odoo/hoot";
import { parseUrl } from "../local_helpers";
/**

View file

@ -1,9 +1,17 @@
/** @odoo-module */
import { describe, expect, test } from "@odoo/hoot";
import { mockFetch } from "@odoo/hoot-mock";
import { after, describe, expect, mockFetch, test } from "@odoo/hoot";
import { parseUrl } from "../local_helpers";
/**
* @param {Blob | MediaSource} obj
*/
function createObjectURL(obj) {
const url = URL.createObjectURL(obj);
after(() => URL.revokeObjectURL(url));
return url;
}
describe(parseUrl(import.meta.url), () => {
test("setup network values", async () => {
expect(document.cookie).toBe("");
@ -20,13 +28,170 @@ describe(parseUrl(import.meta.url), () => {
expect(document.title).toBe("");
});
test("fetch should not mock internal URLs", async () => {
test("fetch with internal URLs works without mocking fetch", async () => {
const blob = new Blob([JSON.stringify({ name: "coucou" })], {
type: "application/json",
});
const blobUrl = createObjectURL(blob);
const blobResponse = await fetch(blobUrl).then((res) => res.json());
const dataResponse = await fetch("data:text/html,<body></body>").then((res) => res.text());
expect(blobResponse).toEqual({ name: "coucou" });
expect(dataResponse).toBe("<body></body>");
await expect(fetch("http://some.url")).rejects.toThrow(/fetch is not mocked/);
});
test("fetch with internal URLs should return default value", async () => {
mockFetch(expect.step);
await fetch("http://some.url");
await fetch("/odoo");
await fetch(URL.createObjectURL(new Blob([""])));
const external = await fetch("http://some.url").then((res) => res.text());
const internal = await fetch("/odoo").then((res) => res.text());
const data = await fetch("data:text/html,<body></body>").then((res) => res.text());
expect.verifySteps(["http://some.url", "/odoo"]);
expect(external).toBe("null");
expect(internal).toBe("null");
expect(data).toBe("<body></body>");
expect.verifySteps(["http://some.url", "/odoo", "data:text/html,<body></body>"]);
});
test("fetch JSON with blob URLs", async () => {
mockFetch(expect.step);
const blob = new Blob([JSON.stringify({ name: "coucou" })], {
type: "application/json",
});
const blobUrl = createObjectURL(blob);
const response = await fetch(blobUrl);
const json = await response.json();
expect(json).toEqual({ name: "coucou" });
expect.verifySteps([blobUrl]);
});
test("fetch with mocked blob URLs", async () => {
mockFetch((input) => {
expect.step(input);
return "Some other content";
});
const blob = new Blob([JSON.stringify({ name: "coucou" })], {
type: "application/json",
});
const blobUrl = createObjectURL(blob);
const response = await fetch(blobUrl);
expect(response.headers).toEqual(new Headers([["Content-Type", "text/plain"]]));
const text = await response.text();
expect(text).toBe("Some other content");
expect.verifySteps([blobUrl]);
});
test("mock response with nested blobs", async () => {
mockFetch(
() =>
new Blob(["some blob", new Blob([" with nested content"], { type: "text/plain" })])
);
const response = await fetch("/nestedBlob");
const blob = await response.blob();
const result = await blob.text();
expect(result).toBe("some blob with nested content");
});
test("mock responses: array buffer", async () => {
mockFetch(() => "some text");
const response = await fetch("/arrayBuffer");
const result = await response.arrayBuffer();
expect(result).toBeInstanceOf(ArrayBuffer);
expect(new TextDecoder("utf-8").decode(result)).toBe("some text");
});
test("mock responses: blob", async () => {
mockFetch(() => "blob content");
const response = await fetch("/blob");
const result = await response.blob();
expect(result).toBeInstanceOf(Blob);
expect(result.size).toBe(12);
const buffer = await result.arrayBuffer();
expect(new TextDecoder("utf-8").decode(buffer)).toBe("blob content");
});
test("mock responses: bytes", async () => {
mockFetch(() => "some text");
const response = await fetch("/bytes");
const result = await response.bytes();
expect(result).toBeInstanceOf(Uint8Array);
expect(new TextDecoder("utf-8").decode(result)).toBe("some text");
});
test("mock responses: formData", async () => {
mockFetch(() => {
const data = new FormData();
data.append("name", "Frodo");
return data;
});
const response = await fetch("/formData");
const result = await response.formData();
expect(result).toBeInstanceOf(FormData);
expect(result.get("name")).toBe("Frodo");
});
test("mock responses: json", async () => {
mockFetch(() => ({ json: "content" }));
const response = await fetch("/json");
const result = await response.json();
expect(result).toEqual({ json: "content" });
});
test("mock responses: text", async () => {
mockFetch(() => "some text");
const response = await fetch("/text");
const result = await response.text();
expect(result).toBe("some text");
});
test("mock responses: error handling after reading body", async () => {
mockFetch(() => "some text");
const response = await fetch("/text");
const responseClone = response.clone();
const result = await response.text(); // read once
expect(result).toBe("some text");
// Rejects for every reader after body is used
await expect(response.arrayBuffer()).rejects.toThrow(TypeError);
await expect(response.blob()).rejects.toThrow(TypeError);
await expect(response.bytes()).rejects.toThrow(TypeError);
await expect(response.formData()).rejects.toThrow(TypeError);
await expect(response.json()).rejects.toThrow(TypeError);
await expect(response.text()).rejects.toThrow(TypeError);
const cloneResult = await responseClone.text(); // read clone
expect(cloneResult).toBe(result);
// Clone rejects reader as well
await expect(responseClone.text()).rejects.toThrow(TypeError);
});
});

View file

@ -1,10 +1,9 @@
/** @odoo-module */
import { after, describe, expect, test } from "@odoo/hoot";
import { after, describe, expect, test, watchListeners } from "@odoo/hoot";
import { queryOne } from "@odoo/hoot-dom";
import { EventBus } from "@odoo/owl";
import { mountForTest, parseUrl } from "../local_helpers";
import { watchListeners } from "@odoo/hoot-mock";
describe(parseUrl(import.meta.url), () => {
class TestBus extends EventBus {

View file

@ -40,7 +40,6 @@ export class HootButtons extends Component {
<t t-set="isRunning" t-value="runnerState.status === 'running'" />
<t t-set="showAll" t-value="env.runner.hasRemovableFilter" />
<t t-set="showFailed" t-value="runnerState.failedIds.size" />
<t t-set="failedSuites" t-value="getFailedSuiteIds()" />
<div
class="${HootButtons.name} relative"
t-on-pointerenter="onPointerEnter"
@ -69,29 +68,35 @@ export class HootButtons extends Component {
</div>
<t t-if="state.open">
<div
class="animate-slide-down w-fit absolute flex flex-col end-0 shadow rounded overflow-hidden shadow z-2"
class="
w-fit absolute animate-slide-down
flex flex-col end-0
bg-base text-base shadow rounded z-2"
>
<t t-if="showAll">
<HootLink class="'bg-btn p-2 whitespace-nowrap transition-colors'">
Run <strong>all</strong> tests
<HootLink
class="'p-3 whitespace-nowrap transition-colors hover:bg-gray-300 dark:hover:bg-gray-700'"
title="'Run all tests'"
>
Run <strong class="text-primary">all</strong> tests
</HootLink>
</t>
<t t-if="showFailed">
<HootLink
ids="{ id: runnerState.failedIds }"
class="'bg-btn p-2 whitespace-nowrap transition-colors'"
class="'p-3 whitespace-nowrap transition-colors hover:bg-gray-300 dark:hover:bg-gray-700'"
title="'Run failed tests'"
ids="{ id: runnerState.failedIds }"
onClick="onRunFailedClick"
>
Run failed <strong>tests</strong>
Run <strong class="text-rose">failed</strong> tests
</HootLink>
<HootLink
ids="{ id: failedSuites }"
class="'bg-btn p-2 whitespace-nowrap transition-colors'"
class="'p-3 whitespace-nowrap transition-colors hover:bg-gray-300 dark:hover:bg-gray-700'"
title="'Run failed suites'"
ids="{ id: getFailedSuiteIds() }"
onClick="onRunFailedClick"
>
Run failed <strong>suites</strong>
Run <strong class="text-rose">failed</strong> suites
</HootLink>
</t>
</div>

View file

@ -118,7 +118,7 @@ export class HootConfigMenu extends Component {
>
<input
type="checkbox"
class="appearance-none border border-primary rounded-sm w-4 h-4"
class="appearance-none border border-primary rounded-xs w-4 h-4"
t-model="config.manual"
/>
<span>Run tests manually</span>
@ -129,7 +129,7 @@ export class HootConfigMenu extends Component {
>
<input
type="checkbox"
class="appearance-none border border-primary rounded-sm w-4 h-4"
class="appearance-none border border-primary rounded-xs w-4 h-4"
t-att-checked="config.bail"
t-on-change="onBailChange"
/>
@ -152,7 +152,7 @@ export class HootConfigMenu extends Component {
>
<input
type="checkbox"
class="appearance-none border border-primary rounded-sm w-4 h-4"
class="appearance-none border border-primary rounded-xs w-4 h-4"
t-att-checked="config.loglevel"
t-on-change="onLogLevelChange"
/>
@ -181,7 +181,7 @@ export class HootConfigMenu extends Component {
>
<input
type="checkbox"
class="appearance-none border border-primary rounded-sm w-4 h-4"
class="appearance-none border border-primary rounded-xs w-4 h-4"
t-model="config.notrycatch"
/>
<span>No try/catch</span>
@ -232,7 +232,7 @@ export class HootConfigMenu extends Component {
>
<input
type="checkbox"
class="appearance-none border border-primary rounded-sm w-4 h-4"
class="appearance-none border border-primary rounded-xs w-4 h-4"
t-model="config.headless"
/>
<span>Headless</span>
@ -243,7 +243,7 @@ export class HootConfigMenu extends Component {
>
<input
type="checkbox"
class="appearance-none border border-primary rounded-sm w-4 h-4"
class="appearance-none border border-primary rounded-xs w-4 h-4"
t-model="config.fun"
/>
<span>Enable incentives</span>

View file

@ -154,6 +154,34 @@ export class HootReporting extends Component {
</t>.
</em>
</t>
<t t-elif="!runnerReporting.tests">
<div class="flex flex-col gap-3 p-5 rounded bg-gray-200 dark:bg-gray-800">
<h3 class="border-b border-gray pb-1">
Test runner is ready
</h3>
<div class="flex items-center gap-2">
<t t-if="config.manual">
<button
class="bg-btn px-2 py-1 transition-colors rounded"
t-on-click="onRunClick"
>
<strong>Start</strong>
</button>
or press
<kbd class="px-2 py-1 rounded text-primary bg-gray-300 dark:bg-gray-700">
Enter
</kbd>
</t>
<t t-else="">
Waiting for assets
<div
class="animate-spin shrink-0 grow-0 w-4 h-4 border-2 border-primary border-t-transparent rounded-full"
role="status"
/>
</t>
</div>
</div>
</t>
<t t-else="">
<div class="flex flex-col gap-3 p-5 rounded bg-gray-200 dark:bg-gray-800">
<h3 class="border-b border-gray pb-1">
@ -350,6 +378,10 @@ export class HootReporting extends Component {
});
}
onRunClick() {
this.env.runner.manualStart();
}
/**
* @param {PointerEvent} ev
* @param {string} id

View file

@ -339,7 +339,7 @@ export class HootSearch extends Component {
<input
type="search"
class="w-full rounded p-1 outline-none"
autofocus="autofocus"
t-att-autofocus="!config.manual"
placeholder="Filter suites, tests or tags"
t-ref="search-input"
t-att-class="{ 'text-gray': !config.filter }"

View file

@ -115,7 +115,10 @@ export class HootStatusPanel extends Component {
static props = {};
static template = xml`
<div class="${HootStatusPanel.name} flex items-center justify-between gap-3 px-3 py-1 bg-gray-300 dark:bg-gray-700" t-att-class="state.className">
<div
class="${HootStatusPanel.name} flex items-center justify-between gap-3 px-3 py-1 min-h-10 bg-gray-300 dark:bg-gray-700"
t-att-class="state.className"
>
<div class="flex items-center gap-2 overflow-hidden">
<t t-if="runnerState.status === 'ready'">
Ready

View file

@ -5,6 +5,8 @@
"Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 0.875rem;
line-height: 1.5;
--hoot-spacing: 0.25rem;
}
/* Scrollbar */
@ -116,7 +118,7 @@ ul {
.hoot-controls {
align-items: center;
display: flex;
gap: 0.5rem;
gap: calc(var(--hoot-spacing) * 2);
}
.hoot-dropdown {
@ -775,14 +777,14 @@ input[type="checkbox"]:checked {
inset-inline-end: 0;
}
.end-2 {
inset-inline-end: 0.5rem;
inset-inline-end: calc(var(--hoot-spacing) * 2);
}
.top-0 {
top: 0;
}
.top-2 {
top: 0.5rem;
top: calc(var(--hoot-spacing) * 2);
}
.bottom-0 {
@ -826,19 +828,22 @@ input[type="checkbox"]:checked {
width: 0;
}
.w-1 {
width: 0.25rem;
width: calc(var(--hoot-spacing) * 1);
}
.w-2 {
width: 0.5rem;
width: calc(var(--hoot-spacing) * 2);
}
.w-3 {
width: 0.75rem;
width: calc(var(--hoot-spacing) * 3);
}
.w-4 {
width: 1rem;
width: calc(var(--hoot-spacing) * 4);
}
.w-5 {
width: 1.25rem;
width: calc(var(--hoot-spacing) * 5);
}
.w-64 {
width: calc(var(--hoot-spacing) * 64);
}
.w-fit {
width: fit-content;
@ -847,27 +852,23 @@ input[type="checkbox"]:checked {
width: 100%;
}
.w-64 {
width: 16rem;
}
.min-w-0 {
min-width: 0;
}
.min-w-1 {
min-width: 0.25rem;
min-width: calc(var(--hoot-spacing) * 1);
}
.min-w-2 {
min-width: 0.5rem;
min-width: calc(var(--hoot-spacing) * 2);
}
.min-w-3 {
min-width: 0.75rem;
min-width: calc(var(--hoot-spacing) * 3);
}
.min-w-4 {
min-width: 1rem;
min-width: calc(var(--hoot-spacing) * 4);
}
.min-w-5 {
min-width: 1.25rem;
min-width: calc(var(--hoot-spacing) * 5);
}
.min-w-fit {
min-width: fit-content;
@ -880,19 +881,19 @@ input[type="checkbox"]:checked {
max-width: 0;
}
.max-w-1 {
max-width: 0.25rem;
max-width: calc(var(--hoot-spacing) * 1);
}
.max-w-2 {
max-width: 0.5rem;
max-width: calc(var(--hoot-spacing) * 2);
}
.max-w-3 {
max-width: 0.75rem;
max-width: calc(var(--hoot-spacing) * 3);
}
.max-w-4 {
max-width: 1rem;
max-width: calc(var(--hoot-spacing) * 4);
}
.max-w-5 {
max-width: 1.25rem;
max-width: calc(var(--hoot-spacing) * 5);
}
.max-w-full {
max-width: 100%;
@ -902,19 +903,22 @@ input[type="checkbox"]:checked {
height: 0;
}
.h-1 {
height: 0.25rem;
height: calc(var(--hoot-spacing) * 1);
}
.h-2 {
height: 0.5rem;
height: calc(var(--hoot-spacing) * 2);
}
.h-3 {
height: 0.75rem;
height: calc(var(--hoot-spacing) * 3);
}
.h-4 {
height: 1rem;
height: calc(var(--hoot-spacing) * 4);
}
.h-5 {
height: 1.25rem;
height: calc(var(--hoot-spacing) * 5);
}
.h-7 {
height: calc(var(--hoot-spacing) * 7);
}
.h-fit {
height: fit-content;
@ -923,27 +927,26 @@ input[type="checkbox"]:checked {
height: 100%;
}
.h-7 {
height: 1.75rem;
}
.min-h-0 {
min-height: 0;
}
.min-h-1 {
min-height: 0.25rem;
min-height: calc(var(--hoot-spacing) * 1);
}
.min-h-2 {
min-height: 0.5rem;
min-height: calc(var(--hoot-spacing) * 2);
}
.min-h-3 {
min-height: 0.75rem;
min-height: calc(var(--hoot-spacing) * 3);
}
.min-h-4 {
min-height: 1rem;
min-height: calc(var(--hoot-spacing) * 4);
}
.min-h-5 {
min-height: 1.25rem;
min-height: calc(var(--hoot-spacing) * 5);
}
.min-h-10 {
min-height: calc(var(--hoot-spacing) * 10);
}
.min-h-full {
min-height: 100%;
@ -953,22 +956,22 @@ input[type="checkbox"]:checked {
max-height: 0;
}
.max-h-1 {
max-height: 0.25rem;
max-height: calc(var(--hoot-spacing) * 1);
}
.max-h-2 {
max-height: 0.5rem;
max-height: calc(var(--hoot-spacing) * 2);
}
.max-h-3 {
max-height: 0.75rem;
max-height: calc(var(--hoot-spacing) * 3);
}
.max-h-4 {
max-height: 1rem;
max-height: calc(var(--hoot-spacing) * 4);
}
.max-h-5 {
max-height: 1.25rem;
max-height: calc(var(--hoot-spacing) * 5);
}
.max-h-48 {
max-height: 12rem;
max-height: calc(var(--hoot-spacing) * 48);
}
.max-h-full {
max-height: 100%;
@ -983,48 +986,48 @@ input[type="checkbox"]:checked {
gap: 1px;
}
.gap-1 {
gap: 0.25rem;
gap: calc(var(--hoot-spacing) * 1);
}
.gap-2 {
gap: 0.5rem;
gap: calc(var(--hoot-spacing) * 2);
}
.gap-3 {
gap: 0.75rem;
gap: calc(var(--hoot-spacing) * 3);
}
.gap-4 {
gap: 1rem;
gap: calc(var(--hoot-spacing) * 4);
}
.gap-x-0 {
column-gap: 0;
}
.gap-x-1 {
column-gap: 0.25rem;
column-gap: calc(var(--hoot-spacing) * 1);
}
.gap-x-2 {
column-gap: 0.5rem;
column-gap: calc(var(--hoot-spacing) * 2);
}
.gap-x-3 {
column-gap: 0.75rem;
column-gap: calc(var(--hoot-spacing) * 3);
}
.gap-x-4 {
column-gap: 1rem;
column-gap: calc(var(--hoot-spacing) * 4);
}
.gap-y-0 {
row-gap: 0;
}
.gap-y-1 {
row-gap: 0.25rem;
row-gap: calc(var(--hoot-spacing) * 1);
}
.gap-y-2 {
row-gap: 0.5rem;
row-gap: calc(var(--hoot-spacing) * 2);
}
.gap-y-3 {
row-gap: 0.75rem;
row-gap: calc(var(--hoot-spacing) * 3);
}
.gap-y-4 {
row-gap: 1rem;
row-gap: calc(var(--hoot-spacing) * 4);
}
/* Spacing: margin */
@ -1033,16 +1036,16 @@ input[type="checkbox"]:checked {
margin: 0;
}
.m-1 {
margin: 0.25rem;
margin: calc(var(--hoot-spacing) * 1);
}
.m-2 {
margin: 0.5rem;
margin: calc(var(--hoot-spacing) * 2);
}
.m-3 {
margin: 0.75rem;
margin: calc(var(--hoot-spacing) * 3);
}
.m-4 {
margin: 1rem;
margin: calc(var(--hoot-spacing) * 4);
}
.mx-0 {
@ -1050,20 +1053,20 @@ input[type="checkbox"]:checked {
margin-right: 0;
}
.mx-1 {
margin-left: 0.25rem;
margin-right: 0.25rem;
margin-left: calc(var(--hoot-spacing) * 1);
margin-right: calc(var(--hoot-spacing) * 1);
}
.mx-2 {
margin-left: 0.5rem;
margin-right: 0.5rem;
margin-left: calc(var(--hoot-spacing) * 2);
margin-right: calc(var(--hoot-spacing) * 2);
}
.mx-3 {
margin-left: 0.75rem;
margin-right: 0.75rem;
margin-left: calc(var(--hoot-spacing) * 3);
margin-right: calc(var(--hoot-spacing) * 3);
}
.mx-4 {
margin-left: 1rem;
margin-right: 1rem;
margin-left: calc(var(--hoot-spacing) * 4);
margin-right: calc(var(--hoot-spacing) * 4);
}
.my-0 {
@ -1071,36 +1074,36 @@ input[type="checkbox"]:checked {
margin-bottom: 0;
}
.my-1 {
margin-top: 0.25rem;
margin-bottom: 0.25rem;
margin-top: calc(var(--hoot-spacing) * 1);
margin-bottom: calc(var(--hoot-spacing) * 1);
}
.my-2 {
margin-top: 0.5rem;
margin-bottom: 0.5rem;
margin-top: calc(var(--hoot-spacing) * 2);
margin-bottom: calc(var(--hoot-spacing) * 2);
}
.my-3 {
margin-top: 0.75rem;
margin-bottom: 0.75rem;
margin-top: calc(var(--hoot-spacing) * 3);
margin-bottom: calc(var(--hoot-spacing) * 3);
}
.my-3 {
margin-top: 1rem;
margin-bottom: 1rem;
margin-top: calc(var(--hoot-spacing) * 4);
margin-bottom: calc(var(--hoot-spacing) * 4);
}
.ms-0 {
margin-inline-start: 0;
}
.ms-1 {
margin-inline-start: 0.25rem;
margin-inline-start: calc(var(--hoot-spacing) * 1);
}
.ms-2 {
margin-inline-start: 0.5rem;
margin-inline-start: calc(var(--hoot-spacing) * 2);
}
.ms-3 {
margin-inline-start: 0.75rem;
margin-inline-start: calc(var(--hoot-spacing) * 3);
}
.ms-4 {
margin-inline-start: 1rem;
margin-inline-start: calc(var(--hoot-spacing) * 4);
}
.ms-auto {
margin-inline-start: auto;
@ -1110,16 +1113,16 @@ input[type="checkbox"]:checked {
margin-inline-end: 0;
}
.me-1 {
margin-inline-end: 0.25rem;
margin-inline-end: calc(var(--hoot-spacing) * 1);
}
.me-2 {
margin-inline-end: 0.5rem;
margin-inline-end: calc(var(--hoot-spacing) * 2);
}
.me-3 {
margin-inline-end: 0.75rem;
margin-inline-end: calc(var(--hoot-spacing) * 3);
}
.me-4 {
margin-inline-end: 1rem;
margin-inline-end: calc(var(--hoot-spacing) * 4);
}
.me-auto {
margin-inline-end: auto;
@ -1129,32 +1132,32 @@ input[type="checkbox"]:checked {
margin-top: 0;
}
.mt-1 {
margin-top: 0.25rem;
margin-top: calc(var(--hoot-spacing) * 1);
}
.mt-2 {
margin-top: 0.5rem;
margin-top: calc(var(--hoot-spacing) * 2);
}
.mt-3 {
margin-top: 0.75rem;
margin-top: calc(var(--hoot-spacing) * 3);
}
.mt-4 {
margin-top: 1rem;
margin-top: calc(var(--hoot-spacing) * 4);
}
.mb-0 {
margin-bottom: 0;
}
.mb-1 {
margin-bottom: 0.25rem;
margin-bottom: calc(var(--hoot-spacing) * 1);
}
.mb-2 {
margin-bottom: 0.5rem;
margin-bottom: calc(var(--hoot-spacing) * 2);
}
.mb-3 {
margin-bottom: 0.75rem;
margin-bottom: calc(var(--hoot-spacing) * 3);
}
.mb-4 {
margin-bottom: 1rem;
margin-bottom: calc(var(--hoot-spacing) * 4);
}
/* Spacing: padding */
@ -1166,19 +1169,19 @@ input[type="checkbox"]:checked {
padding: 1px;
}
.p-1 {
padding: 0.25rem;
padding: calc(var(--hoot-spacing) * 1);
}
.p-2 {
padding: 0.5rem;
padding: calc(var(--hoot-spacing) * 2);
}
.p-3 {
padding: 0.75rem;
padding: calc(var(--hoot-spacing) * 3);
}
.p-4 {
padding: 1rem;
padding: calc(var(--hoot-spacing) * 4);
}
.p-5 {
padding: 1.25rem;
padding: calc(var(--hoot-spacing) * 5);
}
.px-0 {
@ -1186,20 +1189,20 @@ input[type="checkbox"]:checked {
padding-right: 0;
}
.px-1 {
padding-left: 0.25rem;
padding-right: 0.25rem;
padding-left: calc(var(--hoot-spacing) * 1);
padding-right: calc(var(--hoot-spacing) * 1);
}
.px-2 {
padding-left: 0.5rem;
padding-right: 0.5rem;
padding-left: calc(var(--hoot-spacing) * 2);
padding-right: calc(var(--hoot-spacing) * 2);
}
.px-3 {
padding-left: 0.75rem;
padding-right: 0.75rem;
padding-left: calc(var(--hoot-spacing) * 3);
padding-right: calc(var(--hoot-spacing) * 3);
}
.px-4 {
padding-left: 1rem;
padding-right: 1rem;
padding-left: calc(var(--hoot-spacing) * 4);
padding-right: calc(var(--hoot-spacing) * 4);
}
.py-0 {
@ -1207,84 +1210,84 @@ input[type="checkbox"]:checked {
padding-bottom: 0;
}
.py-1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
padding-top: calc(var(--hoot-spacing) * 1);
padding-bottom: calc(var(--hoot-spacing) * 1);
}
.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
padding-top: calc(var(--hoot-spacing) * 2);
padding-bottom: calc(var(--hoot-spacing) * 2);
}
.py-3 {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
padding-top: calc(var(--hoot-spacing) * 3);
padding-bottom: calc(var(--hoot-spacing) * 3);
}
.py-4 {
padding-top: 1rem;
padding-bottom: 1rem;
padding-top: calc(var(--hoot-spacing) * 4);
padding-bottom: calc(var(--hoot-spacing) * 4);
}
.ps-0 {
padding-inline-start: 0;
}
.ps-1 {
padding-inline-start: 0.25rem;
padding-inline-start: calc(var(--hoot-spacing) * 1);
}
.ps-2 {
padding-inline-start: 0.5rem;
padding-inline-start: calc(var(--hoot-spacing) * 2);
}
.ps-3 {
padding-inline-start: 0.75rem;
padding-inline-start: calc(var(--hoot-spacing) * 3);
}
.ps-4 {
padding-inline-start: 1rem;
padding-inline-start: calc(var(--hoot-spacing) * 4);
}
.pe-0 {
padding-inline-end: 0;
}
.pe-1 {
padding-inline-end: 0.25rem;
padding-inline-end: calc(var(--hoot-spacing) * 1);
}
.pe-2 {
padding-inline-end: 0.5rem;
padding-inline-end: calc(var(--hoot-spacing) * 2);
}
.pe-3 {
padding-inline-end: 0.75rem;
padding-inline-end: calc(var(--hoot-spacing) * 3);
}
.pe-4 {
padding-inline-end: 1rem;
padding-inline-end: calc(var(--hoot-spacing) * 4);
}
.pt-0 {
padding-top: 0;
}
.pt-1 {
padding-top: 0.25rem;
padding-top: calc(var(--hoot-spacing) * 1);
}
.pt-2 {
padding-top: 0.5rem;
padding-top: calc(var(--hoot-spacing) * 2);
}
.pt-3 {
padding-top: 0.75rem;
padding-top: calc(var(--hoot-spacing) * 3);
}
.pt-4 {
padding-top: 1rem;
padding-top: calc(var(--hoot-spacing) * 4);
}
.pb-0 {
padding-bottom: 0;
}
.pb-1 {
padding-bottom: 0.25rem;
padding-bottom: calc(var(--hoot-spacing) * 1);
}
.pb-2 {
padding-bottom: 0.5rem;
padding-bottom: calc(var(--hoot-spacing) * 2);
}
.pb-3 {
padding-bottom: 0.75rem;
padding-bottom: calc(var(--hoot-spacing) * 3);
}
.pb-4 {
padding-bottom: 1rem;
padding-bottom: calc(var(--hoot-spacing) * 4);
}
/* Text: alignment */
@ -1472,15 +1475,15 @@ input[type="checkbox"]:checked {
.text-xs {
font-size: 0.625rem;
line-height: 1rem;
line-height: calc(var(--hoot-spacing) * 4);
}
.text-sm {
font-size: 0.75rem;
line-height: 1.25rem;
line-height: calc(var(--hoot-spacing) * 5);
}
.text-2xl {
font-size: 1.25rem;
line-height: 1.75rem;
line-height: calc(var(--hoot-spacing) * 7);
}
/* Transform: rotate */
@ -1566,8 +1569,8 @@ input[type="checkbox"]:checked {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.sm\:px-4 {
padding-left: 1rem;
padding-right: 1rem;
padding-left: calc(var(--hoot-spacing) * 4);
padding-right: calc(var(--hoot-spacing) * 4);
}
}
@ -1596,7 +1599,7 @@ input[type="checkbox"]:checked {
@media (max-width: 640px) {
.hoot-controls {
display: grid;
gap: 0.25rem;
gap: var(--hoot-spacing);
grid-template: 1fr auto auto / 1fr auto auto;
}

View file

@ -9,13 +9,14 @@ import {
useState,
} from "@odoo/owl";
import { isNode, toSelector } from "@web/../lib/hoot-dom/helpers/dom";
import { isInstanceOf, isIterable } from "@web/../lib/hoot-dom/hoot_dom_utils";
import { isInstanceOf, isIterable, isPromise } from "@web/../lib/hoot-dom/hoot_dom_utils";
import { logger } from "../core/logger";
import {
getTypeOf,
isSafe,
Markup,
S_ANY,
S_CIRCULAR,
S_NONE,
stringify,
toExplicitString,
@ -96,7 +97,7 @@ export class HootTechnicalValue extends Component {
<t>/&gt;</t>
</button>
</t>
<t t-elif="value === S_ANY or value === S_NONE">
<t t-elif="SPECIAL_SYMBOLS.includes(value)">
<span class="italic">
&lt;<t t-esc="symbolValue(value)" />&gt;
</span>
@ -175,8 +176,7 @@ export class HootTechnicalValue extends Component {
stringify = stringify;
toSelector = toSelector;
S_ANY = S_ANY;
S_NONE = S_NONE;
SPECIAL_SYMBOLS = [S_ANY, S_CIRCULAR, S_NONE];
get explicitValue() {
return toExplicitString(this.value);
@ -249,7 +249,7 @@ export class HootTechnicalValue extends Component {
}
wrapPromiseValue(promise) {
if (!isInstanceOf(promise, Promise)) {
if (!isPromise(promise)) {
return;
}
this.state.promiseState = ["pending", null];

View file

@ -90,6 +90,8 @@ function stackTemplate(label, owner) {
`;
}
const DOC_URL = `https://www.odoo.com/documentation/18.0/developer/reference/frontend/unit_testing/hoot.html#`;
const ERROR_TEMPLATE = /* xml */ `
<div class="text-rose flex items-center gap-1 px-2 truncate">
<i class="fa fa-exclamation" />
@ -114,8 +116,12 @@ const EVENT_TEMPLATE = /* xml */ `
<t t-else="">
<i class="fa" t-att-class="eventIcon" />
</t>
<!-- TODO: add documentation links once they exist -->
<a href="#" class="hover:text-primary flex gap-1 items-center" t-att-class="{ 'text-cyan': sType === 'assertion' }">
<a
class="hover:text-primary flex gap-1 items-center"
t-att-class="{ 'text-cyan': sType === 'assertion' }"
t-att-href="DOC_URL + (event.docLabel or event.label)"
target="_blank"
>
<t t-if="event.flags">
<i t-if="event.hasFlag('rejects')" class="fa fa-times" />
<i t-elif="event.hasFlag('resolves')" class="fa fa-arrow-right" />
@ -306,6 +312,7 @@ export class HootTestResult extends Component {
`;
CASE_EVENT_TYPES = CASE_EVENT_TYPES;
DOC_URL = DOC_URL;
Tag = Tag;
formatHumanReadable = formatHumanReadable;

View file

@ -684,7 +684,7 @@
const characterDataSetData = getDescriptor$1(characterDataProto, "data").set;
const nodeGetFirstChild = getDescriptor$1(nodeProto$2, "firstChild").get;
const nodeGetNextSibling = getDescriptor$1(nodeProto$2, "nextSibling").get;
const NO_OP = () => { };
const NO_OP$1 = () => { };
function makePropSetter(name) {
return function setProp(value) {
// support 0, fallback to empty string for other falsy values
@ -1014,7 +1014,7 @@
idx: info.idx,
refIdx: info.refIdx,
setData: makeRefSetter(index, ctx.refList),
updateData: NO_OP,
updateData: NO_OP$1,
});
}
}
@ -1640,6 +1640,7 @@
let current = fiber;
do {
current.node.fiber = current;
fibersInError.set(current, error);
current = current.parent;
} while (current);
fibersInError.set(fiber.root, error);
@ -2386,13 +2387,19 @@
const node = getCurrent();
let render = batchedRenderFunctions.get(node);
if (!render) {
render = batched(node.render.bind(node, false));
const wrapper = { fn: batched(node.render.bind(node, false)) };
render = (...args) => wrapper.fn(...args);
batchedRenderFunctions.set(node, render);
// manual implementation of onWillDestroy to break cyclic dependency
node.willDestroy.push(clearReactivesForCallback.bind(null, render));
node.willDestroy.push(cleanupRenderAndReactives.bind(null, wrapper, render));
}
return reactive(state, render);
}
const NO_OP = () => { };
function cleanupRenderAndReactives(wrapper, render) {
wrapper.fn = NO_OP;
clearReactivesForCallback(render);
}
class ComponentNode {
constructor(C, props, app, parent, parentKey) {
this.fiber = null;
@ -5816,7 +5823,7 @@
}
// do not modify manually. This file is generated by the release script.
const version = "2.8.1";
const version = "2.8.2";
// -----------------------------------------------------------------------------
// Scheduler
@ -6325,8 +6332,8 @@
Object.defineProperty(exports, '__esModule', { value: true });
__info__.date = '2025-09-23T07:17:45.055Z';
__info__.hash = '5211116';
__info__.date = '2026-01-30T07:49:47.618Z';
__info__.hash = '52abf8d';
__info__.url = 'https://github.com/odoo/owl';

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,11 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 4.5H6.5V7H4V4.5Z" fill="black"/>
<path d="M6.5 10.5H4V13H6.5V10.5Z" fill="black"/>
<path d="M13.25 10.5H10.75V13H13.25V10.5Z" fill="black"/>
<path d="M17.5 10.5H20V13H17.5V10.5Z" fill="black"/>
<path d="M6.5 16.5H4V19H6.5V16.5Z" fill="black"/>
<path d="M10.75 16.5H13.25V19H10.75V16.5Z" fill="black"/>
<path d="M20 16.5H17.5V19H20V16.5Z" fill="black"/>
<path d="M13.25 4.5H10.75V7H13.25V4.5Z" fill="black"/>
<path d="M17.5 4.5H20V7H17.5V4.5Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 573 B

View file

@ -287,6 +287,8 @@ pdfjs-editor-ink-opacity-input = Boullder
pdfjs-editor-stamp-add-image-button =
.title = Ouzhpennañ ur skeudenn
pdfjs-editor-stamp-add-image-button-label = Ouzhpennañ ur skeudenn
# This refers to the thickness of the line used for free highlighting (not bound to text)
pdfjs-editor-free-highlight-thickness-input = Tevded
pdfjs-free-text =
.aria-label = Aozer testennoù
pdfjs-ink =
@ -306,7 +308,33 @@ pdfjs-editor-alt-text-save-button = Enrollañ
## Color picker
pdfjs-editor-colorpicker-button =
.title = Cheñch liv
pdfjs-editor-colorpicker-yellow =
.title = Melen
pdfjs-editor-colorpicker-blue =
.title = Glas
pdfjs-editor-colorpicker-pink =
.title = Roz
pdfjs-editor-colorpicker-red =
.title = Ruz
## Show all highlights
## This is a toggle button to show/hide all the highlights.
pdfjs-editor-highlight-show-all-button-label = Diskouez pep tra
pdfjs-editor-highlight-show-all-button =
.title = Diskouez pep tra
## New alt-text dialog
## Group note for entire feature: Alternative text (alt text) helps when people can't see the image. This feature includes a tool to create alt text automatically using an AI model that works locally on the user's device to preserve privacy.
pdfjs-editor-new-alt-text-disclaimer-learn-more-url = Gouzout hiroch
pdfjs-editor-new-alt-text-error-close-button = Serriñ
## Image alt-text settings
pdfjs-editor-alt-text-settings-delete-model-button = Dilemel
pdfjs-editor-alt-text-settings-download-model-button = Pellgargañ
pdfjs-editor-alt-text-settings-downloading-model-button = O pellgargañ…
pdfjs-editor-alt-text-settings-close-button = Serriñ

View file

@ -348,9 +348,10 @@ pdfjs-editor-free-highlight-thickness-input = Thickness
pdfjs-editor-free-highlight-thickness-title =
.title = Change thickness when highlighting items other than text
pdfjs-free-text =
# .default-content is used as a placeholder in an empty text editor.
pdfjs-free-text2 =
.aria-label = Text Editor
pdfjs-free-text-default-content = Start typing…
.default-content = Start typing…
pdfjs-ink =
.aria-label = Draw Editor
pdfjs-ink-canvas =
@ -359,9 +360,12 @@ pdfjs-ink-canvas =
## Alt-text dialog
# Alternative text (alt text) helps when people can't see the image.
pdfjs-editor-alt-text-button =
.aria-label = Alt text
pdfjs-editor-alt-text-button-label = Alt text
pdfjs-editor-alt-text-edit-button-label = Edit alt text
pdfjs-editor-alt-text-edit-button =
.aria-label = Edit alt text
pdfjs-editor-alt-text-dialog-label = Choose an option
pdfjs-editor-alt-text-dialog-description = Alt text (alternative text) helps when people cant see the image or when it doesnt load.
pdfjs-editor-alt-text-add-description-label = Add a description
@ -456,12 +460,18 @@ pdfjs-editor-new-alt-text-ai-model-downloading-progress = Downloading alt text A
.aria-valuetext = Downloading alt text AI model ({ $downloadedSize } of { $totalSize } MB)
# This is a button that users can click to edit the alt text they have already added.
pdfjs-editor-new-alt-text-added-button =
.aria-label = Alt text added
pdfjs-editor-new-alt-text-added-button-label = Alt text added
# This is a button that users can click to open the alt text editor and add alt text when it is not present.
pdfjs-editor-new-alt-text-missing-button =
.aria-label = Missing alt text
pdfjs-editor-new-alt-text-missing-button-label = Missing alt text
# This is a button that opens up the alt text modal where users should review the alt text that was automatically generated.
pdfjs-editor-new-alt-text-to-review-button =
.aria-label = Review alt text
pdfjs-editor-new-alt-text-to-review-button-label = Review alt text
# "Created automatically" is a prefix that will be added to the beginning of any alt text that has been automatically generated. After the colon, the user will see/hear the actual alt text description. If the alt text has been edited by a human, this prefix will not appear.

Some files were not shown because too many files have changed in this diff Show more