From 3109245fcf468164203878c0e7d5bfe80377b189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Sun, 15 Dec 2024 22:36:45 +0800 Subject: [PATCH] pengyuthon wechat --- voip/__init__.py | 3 + voip/__manifest__.py | 45 + voip/data/neutralize.sql | 5 + voip/doc/index.rst | 130 + voip/i18n/af.po | 1139 + voip/i18n/am.po | 1135 + voip/i18n/ar.po | 1169 + voip/i18n/az.po | 1140 + voip/i18n/bg.po | 1121 + voip/i18n/bs.po | 1140 + voip/i18n/ca.po | 1168 + voip/i18n/cs.po | 1143 + voip/i18n/da.po | 1121 + voip/i18n/de.po | 1190 + voip/i18n/el.po | 1141 + voip/i18n/es.po | 1181 + voip/i18n/es_419.po | 1181 + voip/i18n/es_CL.po | 1138 + voip/i18n/et.po | 1170 + voip/i18n/eu.po | 1140 + voip/i18n/fa.po | 1122 + voip/i18n/fi.po | 1180 + voip/i18n/fo.po | 1138 + voip/i18n/fr.po | 1181 + voip/i18n/fr_BE.po | 1137 + voip/i18n/fr_CA.po | 1138 + voip/i18n/gl.po | 1138 + voip/i18n/gu.po | 1139 + voip/i18n/he.po | 1130 + voip/i18n/hr.po | 1147 + voip/i18n/hu.po | 1122 + voip/i18n/hy.po | 1111 + voip/i18n/id.po | 1173 + voip/i18n/is.po | 1116 + voip/i18n/it.po | 1183 + voip/i18n/ja.po | 1136 + voip/i18n/ka.po | 1140 + voip/i18n/kab.po | 1138 + voip/i18n/km.po | 1141 + voip/i18n/ko.po | 1148 + voip/i18n/lb.po | 1135 + voip/i18n/lo.po | 1138 + voip/i18n/lt.po | 1128 + voip/i18n/lv.po | 1120 + voip/i18n/mk.po | 1138 + voip/i18n/ml_IN.po | 1137 + voip/i18n/mn.po | 1150 + voip/i18n/my.po | 1140 + voip/i18n/nb.po | 1120 + voip/i18n/ne.po | 1140 + voip/i18n/nl.po | 1187 + voip/i18n/nl_BE.po | 1138 + voip/i18n/pl.po | 1142 + voip/i18n/pt.po | 1117 + voip/i18n/pt_BR.po | 1179 + voip/i18n/ro.po | 1126 + voip/i18n/ru.po | 1184 + voip/i18n/sk.po | 1116 + voip/i18n/sl.po | 1125 + voip/i18n/sq.po | 1138 + voip/i18n/sr.po | 1143 + voip/i18n/sr@latin.po | 1141 + voip/i18n/sv.po | 1127 + voip/i18n/ta.po | 1139 + voip/i18n/th.po | 1165 + voip/i18n/tr.po | 1129 + voip/i18n/uk.po | 1172 + voip/i18n/vi.po | 1170 + voip/i18n/voip.pot | 1111 + voip/i18n/zh_CN.po | 1137 + voip/i18n/zh_TW.po | 1137 + voip/models/__init__.py | 9 + voip/models/mail_activity.py | 134 + voip/models/res_config_settings.py | 23 + voip/models/res_partner.py | 31 + voip/models/res_users.py | 134 + voip/models/res_users_settings.py | 41 + voip/models/voip_call.py | 168 + voip/models/voip_queue_mixin.py | 121 + voip/security/ir.model.access.csv | 3 + voip/security/voip_security.xml | 15 + voip/static/description/icon.png | Bin 0 -> 1288 bytes voip/static/description/icon.svg | 1 + voip/static/lib/sip.js | 20562 ++++++++++++++++ voip/static/src/activity/@types/models.d.ts | 5 + .../src/activity/activity_model_patch.js | 25 + voip/static/src/activity/activity_patch.js | 21 + voip/static/src/activity/activity_patch.xml | 29 + voip/static/src/core/call_model.js | 120 + voip/static/src/core/call_service.js | 90 + voip/static/src/core/correspondence_model.js | 51 + .../src/core/messaging_service_patch.js | 12 + voip/static/src/core/registerer.js | 91 + voip/static/src/core/user_agent_service.js | 642 + .../src/core/user_settings_service_patch.js | 26 + voip/static/src/core/voip_service.js | 316 + .../mobile/call_method_selection_dialog.js | 38 + .../mobile/call_method_selection_dialog.xml | 23 + .../src/mobile/device_selection_dialog.js | 54 + .../src/mobile/devise_selection_dialog.xml | 15 + voip/static/src/ringtones/dialtone.mp3 | Bin 0 -> 76402 bytes voip/static/src/ringtones/incomingcall.mp3 | Bin 0 -> 81954 bytes voip/static/src/ringtones/ringbacktone.mp3 | Bin 0 -> 775969 bytes voip/static/src/ringtones/ringtone_service.js | 38 + voip/static/src/softphone/activities_tab.js | 68 + voip/static/src/softphone/activities_tab.xml | 18 + voip/static/src/softphone/call_invitation.js | 34 + .../static/src/softphone/call_invitation.scss | 7 + voip/static/src/softphone/call_invitation.xml | 21 + voip/static/src/softphone/contacts_tab.js | 30 + voip/static/src/softphone/contacts_tab.xml | 15 + .../src/softphone/correspondence_details.js | 274 + .../src/softphone/correspondence_details.scss | 3 + .../src/softphone/correspondence_details.xml | 68 + voip/static/src/softphone/numpad.js | 67 + voip/static/src/softphone/numpad.xml | 16 + voip/static/src/softphone/recent_tab.js | 25 + voip/static/src/softphone/recent_tab.xml | 18 + voip/static/src/softphone/softphone.dark.scss | 3 + voip/static/src/softphone/softphone.js | 265 + voip/static/src/softphone/softphone.scss | 30 + voip/static/src/softphone/softphone.xml | 43 + .../src/softphone/softphone_container.js | 26 + voip/static/src/softphone/softphone_model.js | 125 + voip/static/src/softphone/transfer_popover.js | 87 + .../src/softphone/transfer_popover.scss | 7 + .../static/src/softphone/transfer_popover.xml | 27 + voip/static/src/utils/utils.js | 24 + voip/static/src/web/call_queue_switch.js | 107 + voip/static/src/web/call_queue_switch.scss | 16 + voip/static/src/web/call_queue_switch.xml | 13 + voip/static/src/web/phone_field_patch.js | 40 + voip/static/src/web/phone_field_patch.xml | 19 + voip/static/src/web/voip_systray_item.js | 46 + voip/static/src/web/voip_systray_item.xml | 11 + .../tests/activity/activity_patch_tests.js | 84 + .../mock_server/models/mail_activity.js | 83 + .../helpers/mock_server/models/res_partner.js | 44 + .../helpers/mock_server/models/res_users.js | 24 + .../helpers/mock_server/models/voip_call.js | 173 + .../tests/helpers/model_definitions_setup.js | 18 + .../tests/helpers/webclient_setup_patch.js | 32 + .../tests/softphone/activity_tab_tests.js | 101 + .../tests/softphone/contacts_tab_tests.js | 39 + .../softphone/correspondence_details_tests.js | 52 + .../device_selection_dialog.mobile.js | 57 + voip/static/tests/softphone/numpad_tests.js | 169 + .../static/tests/softphone/softphone_tests.js | 151 + .../tests/softphone/softphone_tests.mobile.js | 32 + .../tests/softphone/transfer_popover_tests.js | 29 + voip/static/tests/web/phone_field_tests.js | 55 + .../tests/web/voip_systray_item_tests.js | 34 + voip/tests/__init__.py | 4 + voip/tests/test_voip_access_rights.py | 47 + voip/tests/test_voip_user_config.py | 40 + voip/views/res_config_settings_views.xml | 27 + voip/views/res_partner_views.xml | 16 + voip/views/res_users_settings_views.xml | 20 + voip/views/res_users_views.xml | 43 + voip/views/voip_call_views.xml | 32 + voip_crm/__init__.py | 3 + voip_crm/__manifest__.py | 20 + voip_crm/i18n/ar.po | 36 + voip_crm/i18n/cs.po | 37 + voip_crm/i18n/da.po | 37 + voip_crm/i18n/de.po | 35 + voip_crm/i18n/es.po | 35 + voip_crm/i18n/fr.po | 36 + voip_crm/i18n/he.po | 25 + voip_crm/i18n/hr.po | 31 + voip_crm/i18n/hu.po | 37 + voip_crm/i18n/it.po | 35 + voip_crm/i18n/lb.po | 26 + voip_crm/i18n/lt.po | 25 + voip_crm/i18n/mn.po | 37 + voip_crm/i18n/nb.po | 30 + voip_crm/i18n/nl.po | 36 + voip_crm/i18n/pl.po | 37 + voip_crm/i18n/pt.po | 25 + voip_crm/i18n/pt_BR.po | 35 + voip_crm/i18n/ro.po | 36 + voip_crm/i18n/ru.po | 28 + voip_crm/i18n/tr.po | 37 + voip_crm/i18n/uk.po | 35 + voip_crm/i18n/vi.po | 35 + voip_crm/i18n/voip_crm.pot | 26 + voip_crm/i18n/zh_CN.po | 35 + voip_crm/i18n/zh_TW.po | 25 + voip_crm/models/__init__.py | 3 + voip_crm/models/crm_lead.py | 8 + .../tests/correspondence_details_tests.js | 37 + .../tests/helpers/mock_server/crm_lead.js | 24 + voip_crm/views/crm_lead_views.xml | 17 + voip_onsip/__init__.py | 3 + voip_onsip/__manifest__.py | 19 + voip_onsip/i18n/af.po | 56 + voip_onsip/i18n/am.po | 52 + voip_onsip/i18n/ar.po | 56 + voip_onsip/i18n/az.po | 56 + voip_onsip/i18n/bg.po | 58 + voip_onsip/i18n/bs.po | 55 + voip_onsip/i18n/ca.po | 60 + voip_onsip/i18n/cs.po | 57 + voip_onsip/i18n/da.po | 59 + voip_onsip/i18n/de.po | 56 + voip_onsip/i18n/el.po | 55 + voip_onsip/i18n/es.po | 57 + voip_onsip/i18n/es_419.po | 56 + voip_onsip/i18n/es_CL.po | 52 + voip_onsip/i18n/et.po | 58 + voip_onsip/i18n/eu.po | 52 + voip_onsip/i18n/fa.po | 58 + voip_onsip/i18n/fi.po | 57 + voip_onsip/i18n/fo.po | 52 + voip_onsip/i18n/fr.po | 56 + voip_onsip/i18n/gl.po | 52 + voip_onsip/i18n/gu.po | 56 + voip_onsip/i18n/he.po | 59 + voip_onsip/i18n/hr.po | 58 + voip_onsip/i18n/hu.po | 57 + voip_onsip/i18n/hy.po | 52 + voip_onsip/i18n/id.po | 57 + voip_onsip/i18n/is.po | 56 + voip_onsip/i18n/it.po | 56 + voip_onsip/i18n/ja.po | 56 + voip_onsip/i18n/ka.po | 55 + voip_onsip/i18n/kab.po | 52 + voip_onsip/i18n/km.po | 55 + voip_onsip/i18n/ko.po | 56 + voip_onsip/i18n/lb.po | 52 + voip_onsip/i18n/lo.po | 52 + voip_onsip/i18n/lt.po | 57 + voip_onsip/i18n/lv.po | 57 + voip_onsip/i18n/mk.po | 52 + voip_onsip/i18n/mn.po | 57 + voip_onsip/i18n/nb.po | 57 + voip_onsip/i18n/ne.po | 55 + voip_onsip/i18n/nl.po | 56 + voip_onsip/i18n/nl_BE.po | 52 + voip_onsip/i18n/pl.po | 56 + voip_onsip/i18n/pt.po | 57 + voip_onsip/i18n/pt_BR.po | 56 + voip_onsip/i18n/ro.po | 57 + voip_onsip/i18n/ru.po | 58 + voip_onsip/i18n/sk.po | 56 + voip_onsip/i18n/sl.po | 57 + voip_onsip/i18n/sq.po | 52 + voip_onsip/i18n/sr.po | 58 + voip_onsip/i18n/sr@latin.po | 55 + voip_onsip/i18n/sv.po | 58 + voip_onsip/i18n/th.po | 57 + voip_onsip/i18n/tr.po | 60 + voip_onsip/i18n/uk.po | 56 + voip_onsip/i18n/vi.po | 57 + voip_onsip/i18n/voip_onsip.pot | 52 + voip_onsip/i18n/zh_CN.po | 56 + voip_onsip/i18n/zh_TW.po | 57 + voip_onsip/models/__init__.py | 5 + voip_onsip/models/res_config_settings.py | 9 + voip_onsip/models/res_users.py | 24 + voip_onsip/models/res_users_settings.py | 9 + voip_onsip/static/description/icon.png | Bin 0 -> 631 bytes voip_onsip/static/description/icon.svg | 1 + .../static/src/user_settings_service_patch.js | 14 + voip_onsip/static/src/voip_service_patch.js | 14 + .../views/res_config_settings_views.xml | 15 + voip_onsip/views/res_users_views.xml | 23 + 267 files changed, 107181 insertions(+) create mode 100644 voip/__init__.py create mode 100644 voip/__manifest__.py create mode 100644 voip/data/neutralize.sql create mode 100644 voip/doc/index.rst create mode 100644 voip/i18n/af.po create mode 100644 voip/i18n/am.po create mode 100644 voip/i18n/ar.po create mode 100644 voip/i18n/az.po create mode 100644 voip/i18n/bg.po create mode 100644 voip/i18n/bs.po create mode 100644 voip/i18n/ca.po create mode 100644 voip/i18n/cs.po create mode 100644 voip/i18n/da.po create mode 100644 voip/i18n/de.po create mode 100644 voip/i18n/el.po create mode 100644 voip/i18n/es.po create mode 100644 voip/i18n/es_419.po create mode 100644 voip/i18n/es_CL.po create mode 100644 voip/i18n/et.po create mode 100644 voip/i18n/eu.po create mode 100644 voip/i18n/fa.po create mode 100644 voip/i18n/fi.po create mode 100644 voip/i18n/fo.po create mode 100644 voip/i18n/fr.po create mode 100644 voip/i18n/fr_BE.po create mode 100644 voip/i18n/fr_CA.po create mode 100644 voip/i18n/gl.po create mode 100644 voip/i18n/gu.po create mode 100644 voip/i18n/he.po create mode 100644 voip/i18n/hr.po create mode 100644 voip/i18n/hu.po create mode 100644 voip/i18n/hy.po create mode 100644 voip/i18n/id.po create mode 100644 voip/i18n/is.po create mode 100644 voip/i18n/it.po create mode 100644 voip/i18n/ja.po create mode 100644 voip/i18n/ka.po create mode 100644 voip/i18n/kab.po create mode 100644 voip/i18n/km.po create mode 100644 voip/i18n/ko.po create mode 100644 voip/i18n/lb.po create mode 100644 voip/i18n/lo.po create mode 100644 voip/i18n/lt.po create mode 100644 voip/i18n/lv.po create mode 100644 voip/i18n/mk.po create mode 100644 voip/i18n/ml_IN.po create mode 100644 voip/i18n/mn.po create mode 100644 voip/i18n/my.po create mode 100644 voip/i18n/nb.po create mode 100644 voip/i18n/ne.po create mode 100644 voip/i18n/nl.po create mode 100644 voip/i18n/nl_BE.po create mode 100644 voip/i18n/pl.po create mode 100644 voip/i18n/pt.po create mode 100644 voip/i18n/pt_BR.po create mode 100644 voip/i18n/ro.po create mode 100644 voip/i18n/ru.po create mode 100644 voip/i18n/sk.po create mode 100644 voip/i18n/sl.po create mode 100644 voip/i18n/sq.po create mode 100644 voip/i18n/sr.po create mode 100644 voip/i18n/sr@latin.po create mode 100644 voip/i18n/sv.po create mode 100644 voip/i18n/ta.po create mode 100644 voip/i18n/th.po create mode 100644 voip/i18n/tr.po create mode 100644 voip/i18n/uk.po create mode 100644 voip/i18n/vi.po create mode 100644 voip/i18n/voip.pot create mode 100644 voip/i18n/zh_CN.po create mode 100644 voip/i18n/zh_TW.po create mode 100644 voip/models/__init__.py create mode 100644 voip/models/mail_activity.py create mode 100644 voip/models/res_config_settings.py create mode 100644 voip/models/res_partner.py create mode 100644 voip/models/res_users.py create mode 100644 voip/models/res_users_settings.py create mode 100644 voip/models/voip_call.py create mode 100644 voip/models/voip_queue_mixin.py create mode 100644 voip/security/ir.model.access.csv create mode 100644 voip/security/voip_security.xml create mode 100644 voip/static/description/icon.png create mode 100644 voip/static/description/icon.svg create mode 100644 voip/static/lib/sip.js create mode 100644 voip/static/src/activity/@types/models.d.ts create mode 100644 voip/static/src/activity/activity_model_patch.js create mode 100644 voip/static/src/activity/activity_patch.js create mode 100644 voip/static/src/activity/activity_patch.xml create mode 100644 voip/static/src/core/call_model.js create mode 100644 voip/static/src/core/call_service.js create mode 100644 voip/static/src/core/correspondence_model.js create mode 100644 voip/static/src/core/messaging_service_patch.js create mode 100644 voip/static/src/core/registerer.js create mode 100644 voip/static/src/core/user_agent_service.js create mode 100644 voip/static/src/core/user_settings_service_patch.js create mode 100644 voip/static/src/core/voip_service.js create mode 100644 voip/static/src/mobile/call_method_selection_dialog.js create mode 100644 voip/static/src/mobile/call_method_selection_dialog.xml create mode 100644 voip/static/src/mobile/device_selection_dialog.js create mode 100644 voip/static/src/mobile/devise_selection_dialog.xml create mode 100644 voip/static/src/ringtones/dialtone.mp3 create mode 100644 voip/static/src/ringtones/incomingcall.mp3 create mode 100644 voip/static/src/ringtones/ringbacktone.mp3 create mode 100644 voip/static/src/ringtones/ringtone_service.js create mode 100644 voip/static/src/softphone/activities_tab.js create mode 100644 voip/static/src/softphone/activities_tab.xml create mode 100644 voip/static/src/softphone/call_invitation.js create mode 100644 voip/static/src/softphone/call_invitation.scss create mode 100644 voip/static/src/softphone/call_invitation.xml create mode 100644 voip/static/src/softphone/contacts_tab.js create mode 100644 voip/static/src/softphone/contacts_tab.xml create mode 100644 voip/static/src/softphone/correspondence_details.js create mode 100644 voip/static/src/softphone/correspondence_details.scss create mode 100644 voip/static/src/softphone/correspondence_details.xml create mode 100644 voip/static/src/softphone/numpad.js create mode 100644 voip/static/src/softphone/numpad.xml create mode 100644 voip/static/src/softphone/recent_tab.js create mode 100644 voip/static/src/softphone/recent_tab.xml create mode 100644 voip/static/src/softphone/softphone.dark.scss create mode 100644 voip/static/src/softphone/softphone.js create mode 100644 voip/static/src/softphone/softphone.scss create mode 100644 voip/static/src/softphone/softphone.xml create mode 100644 voip/static/src/softphone/softphone_container.js create mode 100644 voip/static/src/softphone/softphone_model.js create mode 100644 voip/static/src/softphone/transfer_popover.js create mode 100644 voip/static/src/softphone/transfer_popover.scss create mode 100644 voip/static/src/softphone/transfer_popover.xml create mode 100644 voip/static/src/utils/utils.js create mode 100644 voip/static/src/web/call_queue_switch.js create mode 100644 voip/static/src/web/call_queue_switch.scss create mode 100644 voip/static/src/web/call_queue_switch.xml create mode 100644 voip/static/src/web/phone_field_patch.js create mode 100644 voip/static/src/web/phone_field_patch.xml create mode 100644 voip/static/src/web/voip_systray_item.js create mode 100644 voip/static/src/web/voip_systray_item.xml create mode 100644 voip/static/tests/activity/activity_patch_tests.js create mode 100644 voip/static/tests/helpers/mock_server/models/mail_activity.js create mode 100644 voip/static/tests/helpers/mock_server/models/res_partner.js create mode 100644 voip/static/tests/helpers/mock_server/models/res_users.js create mode 100644 voip/static/tests/helpers/mock_server/models/voip_call.js create mode 100644 voip/static/tests/helpers/model_definitions_setup.js create mode 100644 voip/static/tests/helpers/webclient_setup_patch.js create mode 100644 voip/static/tests/softphone/activity_tab_tests.js create mode 100644 voip/static/tests/softphone/contacts_tab_tests.js create mode 100644 voip/static/tests/softphone/correspondence_details_tests.js create mode 100644 voip/static/tests/softphone/device_selection_dialog.mobile.js create mode 100644 voip/static/tests/softphone/numpad_tests.js create mode 100644 voip/static/tests/softphone/softphone_tests.js create mode 100644 voip/static/tests/softphone/softphone_tests.mobile.js create mode 100644 voip/static/tests/softphone/transfer_popover_tests.js create mode 100644 voip/static/tests/web/phone_field_tests.js create mode 100644 voip/static/tests/web/voip_systray_item_tests.js create mode 100644 voip/tests/__init__.py create mode 100644 voip/tests/test_voip_access_rights.py create mode 100644 voip/tests/test_voip_user_config.py create mode 100644 voip/views/res_config_settings_views.xml create mode 100644 voip/views/res_partner_views.xml create mode 100644 voip/views/res_users_settings_views.xml create mode 100644 voip/views/res_users_views.xml create mode 100644 voip/views/voip_call_views.xml create mode 100644 voip_crm/__init__.py create mode 100644 voip_crm/__manifest__.py create mode 100644 voip_crm/i18n/ar.po create mode 100644 voip_crm/i18n/cs.po create mode 100644 voip_crm/i18n/da.po create mode 100644 voip_crm/i18n/de.po create mode 100644 voip_crm/i18n/es.po create mode 100644 voip_crm/i18n/fr.po create mode 100644 voip_crm/i18n/he.po create mode 100644 voip_crm/i18n/hr.po create mode 100644 voip_crm/i18n/hu.po create mode 100644 voip_crm/i18n/it.po create mode 100644 voip_crm/i18n/lb.po create mode 100644 voip_crm/i18n/lt.po create mode 100644 voip_crm/i18n/mn.po create mode 100644 voip_crm/i18n/nb.po create mode 100644 voip_crm/i18n/nl.po create mode 100644 voip_crm/i18n/pl.po create mode 100644 voip_crm/i18n/pt.po create mode 100644 voip_crm/i18n/pt_BR.po create mode 100644 voip_crm/i18n/ro.po create mode 100644 voip_crm/i18n/ru.po create mode 100644 voip_crm/i18n/tr.po create mode 100644 voip_crm/i18n/uk.po create mode 100644 voip_crm/i18n/vi.po create mode 100644 voip_crm/i18n/voip_crm.pot create mode 100644 voip_crm/i18n/zh_CN.po create mode 100644 voip_crm/i18n/zh_TW.po create mode 100644 voip_crm/models/__init__.py create mode 100644 voip_crm/models/crm_lead.py create mode 100644 voip_crm/static/tests/correspondence_details_tests.js create mode 100644 voip_crm/static/tests/helpers/mock_server/crm_lead.js create mode 100644 voip_crm/views/crm_lead_views.xml create mode 100644 voip_onsip/__init__.py create mode 100644 voip_onsip/__manifest__.py create mode 100644 voip_onsip/i18n/af.po create mode 100644 voip_onsip/i18n/am.po create mode 100644 voip_onsip/i18n/ar.po create mode 100644 voip_onsip/i18n/az.po create mode 100644 voip_onsip/i18n/bg.po create mode 100644 voip_onsip/i18n/bs.po create mode 100644 voip_onsip/i18n/ca.po create mode 100644 voip_onsip/i18n/cs.po create mode 100644 voip_onsip/i18n/da.po create mode 100644 voip_onsip/i18n/de.po create mode 100644 voip_onsip/i18n/el.po create mode 100644 voip_onsip/i18n/es.po create mode 100644 voip_onsip/i18n/es_419.po create mode 100644 voip_onsip/i18n/es_CL.po create mode 100644 voip_onsip/i18n/et.po create mode 100644 voip_onsip/i18n/eu.po create mode 100644 voip_onsip/i18n/fa.po create mode 100644 voip_onsip/i18n/fi.po create mode 100644 voip_onsip/i18n/fo.po create mode 100644 voip_onsip/i18n/fr.po create mode 100644 voip_onsip/i18n/gl.po create mode 100644 voip_onsip/i18n/gu.po create mode 100644 voip_onsip/i18n/he.po create mode 100644 voip_onsip/i18n/hr.po create mode 100644 voip_onsip/i18n/hu.po create mode 100644 voip_onsip/i18n/hy.po create mode 100644 voip_onsip/i18n/id.po create mode 100644 voip_onsip/i18n/is.po create mode 100644 voip_onsip/i18n/it.po create mode 100644 voip_onsip/i18n/ja.po create mode 100644 voip_onsip/i18n/ka.po create mode 100644 voip_onsip/i18n/kab.po create mode 100644 voip_onsip/i18n/km.po create mode 100644 voip_onsip/i18n/ko.po create mode 100644 voip_onsip/i18n/lb.po create mode 100644 voip_onsip/i18n/lo.po create mode 100644 voip_onsip/i18n/lt.po create mode 100644 voip_onsip/i18n/lv.po create mode 100644 voip_onsip/i18n/mk.po create mode 100644 voip_onsip/i18n/mn.po create mode 100644 voip_onsip/i18n/nb.po create mode 100644 voip_onsip/i18n/ne.po create mode 100644 voip_onsip/i18n/nl.po create mode 100644 voip_onsip/i18n/nl_BE.po create mode 100644 voip_onsip/i18n/pl.po create mode 100644 voip_onsip/i18n/pt.po create mode 100644 voip_onsip/i18n/pt_BR.po create mode 100644 voip_onsip/i18n/ro.po create mode 100644 voip_onsip/i18n/ru.po create mode 100644 voip_onsip/i18n/sk.po create mode 100644 voip_onsip/i18n/sl.po create mode 100644 voip_onsip/i18n/sq.po create mode 100644 voip_onsip/i18n/sr.po create mode 100644 voip_onsip/i18n/sr@latin.po create mode 100644 voip_onsip/i18n/sv.po create mode 100644 voip_onsip/i18n/th.po create mode 100644 voip_onsip/i18n/tr.po create mode 100644 voip_onsip/i18n/uk.po create mode 100644 voip_onsip/i18n/vi.po create mode 100644 voip_onsip/i18n/voip_onsip.pot create mode 100644 voip_onsip/i18n/zh_CN.po create mode 100644 voip_onsip/i18n/zh_TW.po create mode 100644 voip_onsip/models/__init__.py create mode 100644 voip_onsip/models/res_config_settings.py create mode 100644 voip_onsip/models/res_users.py create mode 100644 voip_onsip/models/res_users_settings.py create mode 100644 voip_onsip/static/description/icon.png create mode 100644 voip_onsip/static/description/icon.svg create mode 100644 voip_onsip/static/src/user_settings_service_patch.js create mode 100644 voip_onsip/static/src/voip_service_patch.js create mode 100644 voip_onsip/views/res_config_settings_views.xml create mode 100644 voip_onsip/views/res_users_views.xml diff --git a/voip/__init__.py b/voip/__init__.py new file mode 100644 index 0000000..d6210b1 --- /dev/null +++ b/voip/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/voip/__manifest__.py b/voip/__manifest__.py new file mode 100644 index 0000000..79fcc2f --- /dev/null +++ b/voip/__manifest__.py @@ -0,0 +1,45 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + "name": "VoIP", + "summary": """Make and receive phone calls from within Odoo.""", + "description": """Adds a softphone and helpers to make phone calls directly from within your Odoo database.""", + "category": "Productivity/VOIP", + "sequence": 280, + "version": "2.0", + "depends": ["base", "mail", "phone_validation", "web", "web_mobile"], + "data": [ + "security/ir.model.access.csv", + "security/voip_security.xml", + "views/res_config_settings_views.xml", + "views/res_partner_views.xml", + "views/res_users_views.xml", + "views/res_users_settings_views.xml", + "views/voip_call_views.xml", + ], + "application": True, + "license": "OEEL-1", + "assets": { + "voip.assets_sip": [ + "voip/static/lib/sip.js" + ], + "web.assets_backend": [ + "voip/static/src/**/*", + ("remove", "voip/static/src/**/*.dark.scss"), + ], + "web.assets_web_dark": [ + "voip/static/src/**/*.dark.scss", + ], + "web.tests_assets": [ + "voip/static/tests/helpers/**/*.js", + ], + "web.qunit_suite_tests": [ + "voip/static/tests/**/*.js", + ("remove", "voip/static/tests/helpers/**/*"), + ("remove", "voip/static/tests/**/*.mobile.js"), + ], + "web.qunit_mobile_suite_tests": [ + "voip/static/tests/**/*.mobile.js", + ], + }, +} diff --git a/voip/data/neutralize.sql b/voip/data/neutralize.sql new file mode 100644 index 0000000..d26d3b3 --- /dev/null +++ b/voip/data/neutralize.sql @@ -0,0 +1,5 @@ +-- disable voip +INSERT INTO ir_config_parameter (key, value) +VALUES ('voip.mode', 'demo') + ON CONFLICT (key) DO + UPDATE SET value = 'demo'; diff --git a/voip/doc/index.rst b/voip/doc/index.rst new file mode 100644 index 0000000..e44c405 --- /dev/null +++ b/voip/doc/index.rst @@ -0,0 +1,130 @@ +================= +Odoo VOIP +================= + +Installing Asterisk server +========================== + +Before installing Asterisk you need to install the following dependencies: + +* wget +* gcc +* gcc-c++ +* ncurses-devel +* libxml2-devel +* sqlite-devel +* libsrtp-devel +* libuuid-devel +* openssl-devel + +If libsrtp is not available in the repo install it from source. + +* cd /usr/local/src/ +* wget http://srtp.sourceforge.net/srtp-1.4.2.tgz +* tar zxvf srtp-1.4.2.tgz +* cd /usr/local/src/srtp +* ./configure CFLAGS=-fPIC +* make && make install + +You also need to install PJSIP, you can download the source `here `_. +Once the source directory is extracted: + +* Change to the pjproject source directory: + * # cd pjproject +* run : + * # ./configure --prefix=/usr --enable-shared --disable-sound --disable-resample --disable-video --disable-opencore-amr CFLAGS='-O2 -DNDEBUG' +* Build and install pjproject: + * # make dep + * # make + * # make install +* update shared library links: + * # ldconfig +* Verify that pjproject is installed,: + * # ldconfig -p | grep pj + * The result should be: + libpjsua.so (libc6,x86-64) => /usr/lib/libpjsua.so + libpjsip.so (libc6,x86-64) => /usr/lib/libpjsip.so + libpjsip-ua.so (libc6,x86-64) => /usr/lib/libpjsip-ua.so + libpjsip-simple.so (libc6,x86-64) => /usr/lib/libpjsip-simple.so + libpjnath.so (libc6,x86-64) => /usr/lib/libpjnath.so + libpjmedia.so (libc6,x86-64) => /usr/lib/libpjmedia.so + libpjmedia-videodev.so (libc6,x86-64) => /usr/lib/libpjmedia-videodev.so + libpjmedia-codec.so (libc6,x86-64) => /usr/lib/libpjmedia-codec.so + libpjmedia-audiodev.so (libc6,x86-64) => /usr/lib/libpjmedia-audiodev.so + libpjlib-util.so (libc6,x86-64) => /usr/lib/libpjlib-util.so + libpj.so (libc6,x86-64) => /usr/lib/libpj.so + +In order to install Asterisk 13.2.0, you can download the source directly `here `_. + +* Extract Asterisk: tar zxvf asterisk*. +* Enter the Asterisk directory: cd /usr/local/src/asterisk*. +* Run the Asterisk configure script: ./configure --libdir=/usr/lib64. +* Run the Asterisk menuselect tool: make menuselect. +* In the menuselect, go to the resources option and ensure that res_srtp is enabled. If there are 3 x’s next to res_srtp, there is a problem with the srtp library and you must reinstall it. Save the configuration (press x). You should also see stars in front of the res_pjsip lines. +* Compile and install Asterisk: make && make install. +* If you need the sample configs you can run make samples to install the sample configs. If you need to install the Asterisk startup script you can run make config. + +After you need to setup the DTLS certificates. + +* mkdir /etc/asterisk/keys +* Enter the Asterisk scripts directory: cd /usr/local/src/asterisk*/contrib/scripts. +* Create the DTLS certificates (replace pbx.mycompany.com with your ip address or dns name, replace My Super Company with your company name): ./ast_tls_cert -C pbx.mycompany.com -O "My Super Company" -d /etc/asterisk/keys + +Configure Asterisk server +========================== + +For WebRTC, a lot of the settings that are needed MUST be in the peer settings. The global settings do not flow down into the peer settings very well. By default, Asterisk config files are located in /etc/asterisk/. Start by editing http.conf and make sure that the following lines are uncommented:: + + ;http.conf + [general] + enabled=yes + bindaddr=127.0.0.1 ; Replace this with your IP address + bindport=8088 ; Replace this with the port you want to listen on + +Next, edit sip.conf. The WebRTC peer requires encryption, avpf, and icesupport to be enabled. In most cases, directmedia should be disabled. Also under the WebRTC client, the transport needs to be listed as ‘ws’ to allow websocket connections. All of these config lines should be under the peer itself; setting these config lines globally might not work:: + + ;sip.conf + [general] + realm=127.0.0.1 ; Replace this with your IP address + udpbindaddr=127.0.0.1 ; Replace this with your IP address + transport=udp + + [1060] ; This will be WebRTC client + type=friend + username=1060 ; The Auth user for SIP.js + host=dynamic ; Allows any host to register + secret=password ; The SIP Password for SIP.js + encryption=yes ; Tell Asterisk to use encryption for this peer + avpf=yes ; Tell Asterisk to use AVPF for this peer + icesupport=yes ; Tell Asterisk to use ICE for this peer + context=default ; Tell Asterisk which context to use when this peer is dialing + directmedia=no ; Asterisk will relay media for this peer + transport=udp,ws ; Asterisk will allow this peer to register on UDP or WebSockets + force_avp=yes ; Force Asterisk to use avp. Introduced in Asterisk 11.11 + dtlsenable=yes ; Tell Asterisk to enable DTLS for this peer + dtlsverify=no ; Tell Asterisk to not verify your DTLS certs + dtlscertfile=/etc/asterisk/keys/asterisk.pem ; Tell Asterisk where your DTLS cert file is + dtlsprivatekey=/etc/asterisk/keys/asterisk.pem ; Tell Asterisk where your DTLS private key is + dtlssetup=actpass ; Tell Asterisk to use actpass SDP parameter when setting up DTLS + +In the sip.conf and rtp.conf files you also need to add or uncomment the lines: + +* icesupport = yes +* stunaddr = stun.l.google.com:19302 + +Lastly, set up extensions.conf:: + + ;extensions.conf + [default] + exten => 1060,1,Dial(SIP/1060) ; Dialing 1060 will call the SIP client registered to 1060 + +Configure Odoo VOIP +========================== + +In Odoo, the configuration should be done in the user's preferences. + +The VoIP username / Extension number is the number you configured previously in the sip.conf file. In our example, 1060. +The VoIP secret is the secret you chose in the sip.conf file. +The external device number is not a required field but it is used if you want to transfer your call from Odoo to an external phone also configured in the sip.conf file. + +The configuration needs also to be done in the sale settings under the title "PBX Configuration". You need to put the IP you define in the http.conf file and the WebSocket should be: ws://127.0.0.1:8088/ws. The part "127.0.0.1" needs to be the same as the IP defined previously and the "8088" is the port you defined in the http.conf file. diff --git a/voip/i18n/af.po b/voip/i18n/af.po new file mode 100644 index 0000000..3aa74bc --- /dev/null +++ b/voip/i18n/af.po @@ -0,0 +1,1139 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0beta+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Afrikaans (https://www.transifex.com/odoo/teams/41243/af/)\n" +"Language: af\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktiwiteit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Gekanselleer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Gekanselleer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Kontak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Geskep deur" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Geskep op" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Skeppingsdatum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klient" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Datum" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Vertoningsnaam" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "Dokument" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Duur" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Groepeer deur" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Laas Opgedateer deur" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Laas Opgedateer op" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "Stuur epos" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Volgorde" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Stand" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/am.po b/voip/i18n/am.po new file mode 100644 index 0000000..2aae96d --- /dev/null +++ b/voip/i18n/am.po @@ -0,0 +1,1135 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Language-Team: Amharic (https://app.transifex.com/odoo/teams/41243/am/)\n" +"Language: am\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "መሰረዝ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "ተሰርዟል" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "ፈጣሪው" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "የተፈጠረበት" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "ተባባሪ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "በመደብ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "ቅደም ተከተል" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "ሁኔታው" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/ar.po b/voip/i18n/ar.po new file mode 100644 index 0000000..153c50b --- /dev/null +++ b/voip/i18n/ar.po @@ -0,0 +1,1169 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Malaz Abuidris , 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\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 && n%100<=99 ? 4 : 5;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s دقيقة %(seconds)s ثانية " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s دقيقة " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s مكالمات فائتة " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s ثانية " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "دقيقة واحدة 1 " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 مكالمة فائتة " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "ثانية واحدة 1 " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "دقيقتان 2 " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 مكالمة فائتة " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "ثانيتان 2 " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"حدث خطأ في الجهاز أثناء محاولة الوصول إلى جهاز تسجيل الصوت. يرجى التأكد من " +"أن أجهزتك محدثة ثم حاول مجدداً. " + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "مكالمة هاتفية يتم إجراؤها باستخدام تطبيق VoIP " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "تم إلغاؤها " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "تم إلغاء المكالمة لـ %(phone_number)s " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "النشاط" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "اسم النشاط " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "إضافة إلى قائمة انتظار الاتصالات " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"حدث خطأ أثناء تضمين جهاز تسجيل الصوت (%(errorName)s):\n" +"%(errorMessage)s " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"حدث خطأ أثناء تثبيت عميل المستخدم:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"حدث خطأ أثناء محاولة دعوة العضو التالي: %(phoneNumber)s\n" +"\n" +"الخطأ: %(error)s " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"هل أنت متأكد من أنك ترغب في حذف هذا النشاط؟ سيختفي للأبد. هذا وقت طويل جداً " +"😔 " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "اسأل " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "تراجع" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "مكالمة" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "مكالمة من %(correspondent)s " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "مكالمة من %(phone_number)s " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "مكالمة من جهاز آخر " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "تم رفض المكالمة (السبب: “%(reasonPhrase)s”) " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "مكالمة إلى %(correspondent)s " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "مكالمة إلى %(phone_number)s " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "جاري الاتصال " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "الاتصال بـ %(phone number)s " + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "المكالمات " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "إلغاء" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "إلغاء النشاط" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"تعذر الوصول إلى جهاز تسجيل الصوت. إذا كنت قد منعت الوصول إلى المايكروفون " +"الخاص بك، يرجى منح صلاحية الوصول ثم المحاولة من جديد، وإلا، تأكد من أن هذا " +"الموقع الإلكتروني يعمل على HTTPS وأن متصفحك لم يتم ضبطه لرفض الوصول إلى " +"أجهزة الوسائط. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "تغيير جهاز الإدخال " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "اختر جهازاً " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"اختر الطريقة لاستخدامها لإجراء مكالمة عند استخدام تطبيق الهاتف المحمول:\n" +" • VoIP: استخدام هاتف أودو الرقمي دائماً\n" +" • هاتف الجهاز: استخدام هاتف الجهاز دائماً\n" +" • السؤال: السؤال دائماً ما إذا كان يجب استخدام الهاتف الرقمي أم هاتف الجهاز.\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "إغلاق" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "إغلاق لوحة الأرقام " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "إغلاق الهاتف الرقمي " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "إغلاق التفاصيل " + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "تهيئة الإعدادات " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "تأكيد" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "جاري التوصيل... " + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "جهة الاتصال" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "جهات الاتصال" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "سيتم إظهار جهات الاتصال التي لها أرقام هواتف هنا. " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "أنشئ بواسطة" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "أنشئ في" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "العميل" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "النسخة التجريبية" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "هاتف الجهاز " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "الاتجاه" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "اسم العرض " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "المستندات" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "تحرير" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "إنهاء المكالمة " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "تاريخ الانتهاء" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "إدخال رقم أو اسم " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "قم بإدخال الرقم... " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "رقم الجهاز الخارجي " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "رقم الجهاز الخارجي " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"تعذر تحميل مكتبة SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "قم بإنهاء المكالمة ولكن أبقِ المكالمة في قائمة الانتظار " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "انتظر قليلاً! " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "كيفية الاتصال عن طريق الهاتف المحمول " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "كيفية إجراء مكالمات على الهاتف المحمول " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "المُعرف" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "إذا كان مفعلاً، سيتم رفض المكالمات الواردة تلقائياً في أودو. " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"إذا كان مفعلاً، سيؤدي إجراء مكالمة في أودو إلى تحويل المكالمة إلى \"رقم " +"الجهاز الخارجي\". استخدم هذا الخيار لإجراء المكالمة في أودو ولكن التعامل " +"معها من جهاز آخر - مثال: الهاتف الأرضي. " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"إذا كان خيار \"الاتصال من جهاز آخر\" مفعلاً، سيتم تحويل المكالمات التي قد تم" +" إجراؤها في أودو إلى رقم الهاتف هذا. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "في مكالمة لمدة: %(minutes)s:%(seconds)s " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "واردة " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "مكالمة واردة من.... " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "اختيار جهاز الإدخال " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "في قائمة انتظار المكالمات " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "آخر مكالمة هاتفية مرئية " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "آخر تحديث بواسطة" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "آخر تحديث في" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "التعيين كمنتهي " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "عذراً، ضغطت عن طريق الخطأ. " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "فائتة " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "مكالمة فائتة من %(phone_number)s " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "الهاتف المحمول" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "الجوال:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "كتم الصوت" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "الأنشطة التالية" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"ليس هناك جهاز تسجيل صوتي متاح. هذا التطبيق بحاجة إلى مايكروفون حتى تتمكن من " +"استخدامه. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "لم تتم جدولة أي مكالمات اليوم 😎 " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "ليست هناك أي نتائج للبحث 💔 " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "جاري" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "فتح لوحة الأرقام " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "فتح الهاتف الرقمي " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "الصادرة " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "عنوان الـIP لخادم PBX " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "عنوان PBX أو Websocket غير موجود. يرجى التحقق من الإعدادات. " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "رقم الهاتف" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "رقم الهاتف" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "الهاتف:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "يرجى قبول استخدام المايكروفون. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"يرجى المحاولة مجدداً لاحقاً. في حال استمرار المشكلة، اطلب من أحد المدراء " +"التحقق من التهيئة. " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "الإنتاج" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "حديث" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "تم رفض التسجيل: %(statusCode)s %(reasonPhrase)s. " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "رفض المكالمات الواردة " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "تم الرفض " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "تم رفض المكالمة من %(phone_number)s " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "تم رفض المكالمة لـ %(phone_number)s " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "أتذكُر ذلك؟ " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "الإزالة من قائمة انتظار المكالمات " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "المسؤول " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "يرن... " + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "قم بجدولة وإجراء المكالمات من قاعدة بياناتك " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "جدولة نشاط " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "بحث" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "اختر طريقة الاتصال " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "إرسال بريد إلكتروني " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "يجب رفض المكالمات الواردة تلقائياً " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "يجب الاتصال من جهاز آخر " + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"تعذر إضافة بعض المستندات إلى قائمة انتظار المكالمات لعدم وجود أرقام هواتف " +"مسجلة: %(record_names)s " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "تاريخ البدء " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "الولاية " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "أخبرنا كيف نقوم بإجراء المكالمة: " + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "تم إنهاؤها " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "عنوان IP لخادم PBX الخاص بك " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "رابط WebSocket الخاص بك " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "تم فقد الاتصال مع منفذ الويب وتعذر إعادة الاتصال. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"قد يأتي الخطأ من طبقة النقل. يرجى الطلب من أحد المدراء التحقق من URL خادم " +"مقبس الويب في الإعدادات العامة. في حال استمرار المشكلة، قد تكون المشكلة في " +"الخادم على الأغلب. " + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "اسم النشاط المتعلق بهذه المكالمة الهاتفية، إن وجد. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"الرقم غير صحيح. قد تكون بيانات اعتماد المستخدم خاطئة أو قد يكون قد تعذر الاتصال. يرجى التحقق من التهيئة.\n" +"(السبب: %(reasonPhrase)s) " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "كلمة المرور التي سيتم استخدامها للتسجيل بخادم PBX. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "الشخص الذي تحاول التواصل معه غير متاح حالياً. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"لم يتمكن الخادم من المصادقو معك. اطلب من أحد المدراء التحقق من أنك تصل إلى " +"الخادم الصحيح (عنوان IP لخادم PBX في الإعدادات العامة) ومن أن بيانات " +"الاعتماد المسجلة في تفضيلات المستخدم صحيحة. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"تعذر تشغيل وكيل المستخدم. قد لا يكون رابط URL الخاص بخادم مقبس الويب صحيحاً." +" يرجى طلب التحقق من URL خادم مقبس الويب بواسطة أحد المدراء في الإعدادات " +"العامة. " + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"اسم المستخدم (عادة ما يكون رقم الوصلة) الذي سيتم استخدامه للتسجيل بخادم PBX." +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "تم فقد الاتصال بين مقبس الويب والخادم. جاري إعادة محاولة الاتصال... " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "هناك مكالمة جارية حالياً، هل أنت متأكد أنك ترغب في مغادرة الصفحة؟ " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "تحويل " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "النقل إلى " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "إظهار الهاتف الرقمي " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "إلغاء الكتم " + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "المستخدم" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "إعدادات المستخدم " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "باستخدام VoIP " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "باستخدام هاتف الجهاز " + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "قائمة انتظار دعم VOIP " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "تهيئة VoIP " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "بيئة VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "سر VoIP " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "اسم مستخدم VoIP / رقم الوصلة " + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / المكالمات " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "سر Voip " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "اسم مستخدم Voip " + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "نعم، قم بذلك. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"لا يدعم متصفحك بعض الخصائص المطلوبة حتى يعمل VoIP. يرجى محاولة تحديث متصفحك " +"أو استخدام واحد مختلف. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"سجل المكالمات الخاص بك فارغ! قم بإجراء مكالمة الآن وسيتم إدراجها هنا 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"لم يتم تعيين بيانات تسجيل الدخول الخاصة بك بشكل صحيح. يرجى التواصل مع مديرك." +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "أقل من ثانية " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "الهاتف المتحرك " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/az.po b/voip/i18n/az.po new file mode 100644 index 0000000..932f80e --- /dev/null +++ b/voip/i18n/az.po @@ -0,0 +1,1140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Jumshud Sultanov , 2022 +# erpgo translator , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: erpgo translator , 2022\n" +"Language-Team: Azerbaijani (https://app.transifex.com/odoo/teams/41243/az/)\n" +"Language: az\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "Qəbul edin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Fəaliyyət" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "avatar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Ləğv edin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Ləğv olundu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "Bağlayın" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Parametrləri Konfiqurasiya edin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "Kontaktlar" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Tərəfindən yaradılıb" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Tarixdə yaradıldı" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Yaradılma Tarixi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Müştəri" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Tarix" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "İstiqamət" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Ekran Adı" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "sənəd" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Gözlənilən Tarix" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Müddət" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Redaktə edin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Aşağıdakılara görə Qrupla" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "Gələn" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Son Yeniləyən" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Son Yenilənmə tarixi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Qeyd" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "Gedən" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "Gözləmədədir" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Məhsul" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "İmtina edildi" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "Məsul" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Fəaliyyət Planı" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "Axtarın" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Ardıcıllıq" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "Xülasə" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "Görülməli iş" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "Köçürmə" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "Təyin olunmamış" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "İstifadəçi" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/bg.po b/voip/i18n/bg.po new file mode 100644 index 0000000..948fa74 --- /dev/null +++ b/voip/i18n/bg.po @@ -0,0 +1,1121 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Ивайло Малинов , 2023 +# Rosen Vladimirov , 2023 +# Martin Trigaux, 2023 +# Albena Mincheva , 2023 +# KeyVillage, 2023 +# aleksandar ivanov, 2023 +# Maria Boyadjieva , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Maria Boyadjieva , 2023\n" +"Language-Team: Bulgarian (https://app.transifex.com/odoo/teams/41243/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Дейност" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Добавете към опашката за повиквания" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Бутон за връщане назад" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Обаждане" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Отказ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Затвори" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Настройки" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Потвърждение" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Контакт" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Контакти" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Създадено от" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Създадено на" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Клиент" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Демо" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Посока" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Име за Показване" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Документи" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Редактирай" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Крайна Дата" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Входящ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Е на опашката за разговори" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Последно актуализирано от" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Последно актуализирано на" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Маркирайте като готово" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Мобилен" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Мобилен:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Следващи дейности" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Протичащ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Изходящ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP на PBX сървър " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Телефон" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Телефонен номер" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Телефон:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Продукция" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Отхвърлен" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Отстранете от опашката за разговори" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Отговорно лице" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Планирайте дейност" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Потърсете" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Начална Дата" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Област" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL адреса на уеб гнездото Ви" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Прехвърлете" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Потребител" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "Уеб гнездо" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/bs.po b/voip/i18n/bs.po new file mode 100644 index 0000000..b3b2c48 --- /dev/null +++ b/voip/i18n/bs.po @@ -0,0 +1,1140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux, 2018 +# Boško Stojaković , 2018 +# Bole , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2018-09-21 14:06+0000\n" +"Last-Translator: Bole , 2018\n" +"Language-Team: Bosnian (https://www.transifex.com/odoo/teams/41243/bs/)\n" +"Language: bs\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "# Slučajeva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivnost" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "Pozovi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Otkaži" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Otkazan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "Zatvori" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Datum kreiranja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kupac" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Datum" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Datum dospijeća" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Trajanje" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Grupiši po" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "Održan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "Ulazni" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Označi kao završeno" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "Mobitel" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "Nije održano" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Zabilješka" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "Odlazeći" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "Na čekanju" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "Tel. pozivi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Proizvodnja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "Odgovoran" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "Traži telefonske pozive" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Sekvenca" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Status" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "Sažetak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "Za uraditi" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "Sutra" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "Prenos" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "Nedodeljen" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "min" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/ca.po b/voip/i18n/ca.po new file mode 100644 index 0000000..85d0a07 --- /dev/null +++ b/voip/i18n/ca.po @@ -0,0 +1,1168 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Marc Tormo i Bochaca , 2023 +# Albert Parera, 2023 +# Pere Martínez, 2023 +# Carles Antoli , 2023 +# Quim - eccit , 2023 +# Josep Sànchez , 2023 +# Eric Antones , 2023 +# Óscar Fonseca , 2023 +# Manel Fernandez Ramirez , 2023 +# eriiikgt, 2023 +# Martin Trigaux, 2023 +# Jonatan Gk, 2023 +# Ivan Espinola, 2023 +# marcescu, 2023 +# Josep Anton Belchi, 2024 +# Harcogourmet, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Harcogourmet, 2024\n" +"Language-Team: Catalan (https://app.transifex.com/odoo/teams/41243/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s seg" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minuts" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s trucades perdudes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s segons" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 trucada perduda" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 segon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minuts" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 trucades perdudes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 segons" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"S'ha esdevingut un error de hardware mentre s'intentava accedir al " +"dispositiu d'enregistrament d'àudio. Assegureu-vos que els vostres drivers " +"estan actualitzats i torneu-ho a provar." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Una trucada telefónica gestionada amb l'aplicació de veu IP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Cancel·lat" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Trucada a %(phone_number)s cancel·lada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Activitat" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nom de l'activitat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Afegeix a la Cua de Trucades" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"S'ha esdevingut un error relacionat amb el dispositiu d'enregistrament (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"S'ha esdevingut un error mentre s'instanciava l'agent d'usuari:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "Segur que voleu esborrar aquesta activitat? Es perdrà definitivament" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Pregunta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Retrocés" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Trucada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Trucada des de %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Trucada des de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Truca des d'un altre dispositiu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Trucada rebutjada (motiu: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Trucant" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Trucant %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Trucades" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancel·la" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Cancel·la l'activitat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"No es pot accedir al dispositiu d'enregistrament d'àudio. Si heu denegat " +"l'accés al vostre micròfon, permeteu-lo i torneu a provar. En altre cas, " +"assegureu-vos que aquest lloc web fa servir HTTPS i que el vostre navegador " +"no està configurat per a denegar accés a dispositius multimèdia." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Trieu el mètode que s'utilitzarà per a fer una trucada quan s'utilitzi l'aplicació mòbil:\n" +" the VoIP: Usa sempre el telèfon mòbil Odoo\n" +" the Telèfon del dispositiu: Utilitza sempre el telèfon del dispositiu\n" +" the Pregunta: Pregunta sempre si s'ha d'utilitzar el telèfon mòbil o el telèfon del dispositiu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Tancar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Paràmetres de configuració" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contacte" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contactes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Creat per" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Creat el" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Client/a" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "De prova" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telèfon del dispositiu" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Direcció" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nom mostrat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documents" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Modificar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Finalitza la trucada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Data de finalització" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Introduïu el número o el nom" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Número de dispositiu extern" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Penjar però mantenir la trucada en la cua" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Com fer trucades al mòbil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Si s'habilita, les trucades entrants es rebutjaran automàticament a Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Si s'habilita, la col·locació d'una trucada a Odoo transferirà la trucada al" +" \"número de dispositiu extern\". Utilitzeu aquesta opció per col·locar la " +"trucada a Odoo però gestionar-la des d'un altre dispositiu -p. ex., el " +"telèfon d'escriptori." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Si l'opció \"Call from other device\" està activada, les trucades " +"col·locades a Odoo es transferiran a aquest número de telèfon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Entrant" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "És a la cua de trucades" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Darrera trucada telefònica" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Última actualització per" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Última actualització el" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marcar com fet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "S'ha perdut" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mòbil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mòbil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Silenci" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Activitat següent" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"No hi ha cap dispositiu d'enregistrament d'àudio disponible. L'aplicació " +"requereix un micròfon per poder utilitzar-lo." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "En marxa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Sortida" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP del servidor PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Falta l'adreça PBX o Websocket. Comproveu la configuració." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telèfon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Número de telèfon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telèfon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Si us plau, accepti l'ús del micròfon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Torneu-ho a provar més tard. Si el problema persisteix, és possible que " +"vulgueu demanar a un administrador que comprovi la configuració." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Producció" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Recent" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registre rebutjat: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Rebutja les trucades entrants" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rebutjada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Elimina de la cua de trucades" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsable" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planificar activitat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Cercar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Alguns documents no es poden afegir a la cua de trucades perquè no tenen un " +"número de telèfon establert: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Data inicial" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Estat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "L'adreça IP del vostre servidor PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "L'URL del WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"L'error pot provenir de la capa de transport. Teniu un administrador que " +"verifiqui l'URL del servidor websocket a la Configuració General. Si el " +"problema persisteix, probablement és un problema amb el servidor." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "La contrasenya que s'utilitzarà per registrar-se amb el servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "La persona que intentes contactar no està disponible actualment." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"El servidor no us ha pogut autenticar. Teniu un administrador que verifiqui " +"que esteu arribant al servidor correcte (IP del servidor PBX a la " +"Configuració General) i que les credencials a les vostres preferències " +"d'usuari són correctes." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"El nom d'usuari (normalment el número d'extensió) que s'utilitzarà per " +"registrar-se amb el servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transferència" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transfereix a" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Activa el so" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Usuari" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Arranjament d' usuari" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Implementació de la cua VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Configuració del VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Entorn VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Secret VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nom d'usuari / número d'extensió VoIP" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telèfon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/cs.po b/voip/i18n/cs.po new file mode 100644 index 0000000..fbe56c7 --- /dev/null +++ b/voip/i18n/cs.po @@ -0,0 +1,1143 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# karolína schusterová , 2023 +# Ivana Bartonkova, 2023 +# Aleš Fiala , 2023 +# Jakub Smolka, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Czech (https://app.transifex.com/odoo/teams/41243/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 zmeškaný hovor" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 zmeškané hovory" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivita" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Přidat do fronty hovorů" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Dotaz:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Hovor" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Volejte z jiného zařízení" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Povolání" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Zrušit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Zrušit aktivitu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Vyberte metodu, která se použije k uskutečnění hovoru při používání mobilní aplikace:\n" +" • VoIP: Vždy používejte softwarový telefon Odoo\n" +" • Telefon zařízení: Vždy používejte telefon zařízení\n" +" • Zeptat se: Vždy se zeptejte, zda je nutné použít softwarový telefon nebo telefon zařízení\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Zavřít" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurační nastavení" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Potvrdit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Vytvořeno uživatelem" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Vytvořeno dne" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Zákazník" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telefon zařízení" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Směr" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Zobrazovací název" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Upravit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Konec hovoru" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Datum do" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Vložte číslo nebo jméno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Číslo externího zařízení" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Zavěsit, ale podržet hovor ve frontě" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Jak volat na mobil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "Je-li zapnuto, budou příchozí hovory v Odoo automaticky odmítnuty." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Je-li zapnuto, volání v Odoo převede hovor na „číslo externího zařízení“. " +"Tuto možnost použijte, chcete-li uskutečnit hovor v Odoo, ale vyřídit jej z " +"jiného zařízení – např. váš stolní telefon." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Pokud je zapnuta možnost „Volání z jiného zařízení“, hovory uskutečněné v " +"Odoo budou přesměrovány na toto telefonní číslo." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Příchozí" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Ve volací frontě" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Naposledy viděný telefonát" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Naposledy upraveno uživatelem" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Naposledy upraveno dne" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Označit jako hotovo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Zmeškané" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Ztišit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Další aktivity" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Není k dispozici žádné zařízení pro záznam zvuku. Aplikace vyžaduje k " +"použití mikrofon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Pokračující" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Odchozí" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Server IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Chybí adresa PBX nebo Websocket. Zkontrolujte prosím svá nastavení." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefonní číslo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Přijměte prosím použití mikrofonu." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Prosím zkuste to znovu později. Pokud problém přetrvává, můžete požádat " +"správce o kontrolu nastavení." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Výroba" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Nedávné" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registrace zamítnuta: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Zamítnout příchozí hovory" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Odmítnuto" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Odstranit z volací fronty" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Odpovědný" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Naplánovat aktivitu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Vyhledávání" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Některé dokumenty nelze přidat do fronty hovorů, protože nemají nastavené " +"telefonní číslo: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Počáteční datum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stát" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "IP adresa vašeho PBX serveru" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Adresa URL vašeho webu WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Chyba může pocházet z transportní vrstvy. Požádejte správce, aby ověřil " +"adresu URL serveru websocket v části Obecná nastavení. Pokud problém " +"přetrvává, pravděpodobně se jedná o problém se serverem." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Heslo, které bude použito pro registraci k serveru PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Osoba, kterou se snažíte kontaktovat, je momentálně nedostupná." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Serveru se nepodařilo ověřit vás. Požádejte správce, aby ověřil, že se " +"nacházíte na správném serveru (IP serveru PBX v Obecném nastavení) a zda " +"jsou přihlašovací údaje ve vašich uživatelských předvolbách správné." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Uživatelské jméno (obvykle číslo rozšíření), které bude použito pro " +"registraci na serveru PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Převod" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Přenést do" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Uživatel" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Uživatelské nastavení" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP podpora fronty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Nastavení VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Prostředí VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Tajný klíč VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Uživatelské jméno VoIP / Číslo rozšíření" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/da.po b/voip/i18n/da.po new file mode 100644 index 0000000..87f61d2 --- /dev/null +++ b/voip/i18n/da.po @@ -0,0 +1,1121 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# lhmflexerp , 2023 +# Mads Søndergaard, 2023 +# Mads Søndergaard, 2023 +# Ejner Sønniksen , 2023 +# Sanne Kristensen , 2024 +# Martin Trigaux, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Martin Trigaux, 2024\n" +"Language-Team: Danish (https://app.transifex.com/odoo/teams/41243/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s sek" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minutter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s sekunder" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 ubesvaret opkald" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 sekund" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minutter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 sekunder" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivitet" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Tilføj opkaldskøen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Spørg" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Ring" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Ringer op" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Annullér" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Annuller aktiviteten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Luk" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurer opsætning" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Bekræft" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Adressebog" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Oprettet af" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Oprettet den" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kunde" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Retning" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Vis navn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Rediger" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Afslut Opkald" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Slut dato" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Angiv nummer eller navn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Læg på men behold opkaldet i kø" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Indkommende" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Er i opkaldskøen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Sidst Sete Telefonopkald" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Sidst opdateret af" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Sidst opdateret den" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Markér som udført" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Glippet" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobiltelefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Slå lyden fra" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Næste aktiviteter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Igangværende" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Udgående" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Server IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" +"PBX eller Websocket adresse mangler. Tjek venligst dine indstillinger." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefonnummer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Accepter venligst brugen af mikrofon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produktion" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Nye" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Afvist" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Fjern fra opkaldskøen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Ansvarlig" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Skemalæg aktivitet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Søg" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Start dato" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "The URL of your WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Personen du prøver at kontakte er i øjeblikket ikke tilgængelig." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Overfør" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Bruger" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Bruger indstillinger" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP Miljø" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/de.po b/voip/i18n/de.po new file mode 100644 index 0000000..73af163 --- /dev/null +++ b/voip/i18n/de.po @@ -0,0 +1,1190 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Leon Grill , 2023 +# Larissa Manderfeld, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s Min. %(seconds)s Sek." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s Minuten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s verpasste Anrufe" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s Sekunden" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 Minute" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 verpasster Anruf" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 Sekunde" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 Minuten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 verpasste Anrufe" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 Sekunden" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Beim Versuch, auf das Audioaufnahmegerät zuzugreifen, ist ein Hardwarefehler" +" aufgetreten. Bitte stellen Sie sicher, dass Ihre Treiber auf dem neuesten " +"Stand sind und versuchen Sie es erneut." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Ein Telefonanruf, der über die VoIP-App abgewickelt wird" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Abgebrochen" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Abgebrochender Anruf an %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivität" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Aktivitätsbezeichnung" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Zur Anruf-Warteschlange hinzufügen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Es ist ein Fehler im Zusammenhang mit dem Audioaufnahmegerät aufgetreten (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Bei der Instanziierung des Benutzeragenten ist ein Fehler aufgetreten:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Beim Versuch, die folgende Nummer einzuladen, ist ein Fehler aufgetreten:%(phoneNumber)s\n" +"\n" +"Fehler:%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Sind Sie sicher, dass Sie diese Aktivität löschen möchten? Sie wird für " +"immer verloren sein, was eine ziemlich lange Zeit ist 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Fragen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Zurück" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Anruf" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Anruf von %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Anruf von %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Anruf von einem anderen Gerät" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Anruf abgelehnt (Begründung: „%(reasonPhrase)s“)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Anruf an %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Anruf an %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Anrufen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "%(phone number)s anrufen" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Anrufe" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Abbrechen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Aktivität abbrechen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Zugriff auf Audioaufnahmegerät nicht möglich. Wenn Sie den Zugriff auf Ihr " +"Mikrofon verweigert haben, gewähren Sie ihn bitte und versuchen Sie es " +"erneut. Andernfalls stellen Sie sicher, dass diese Website über HTTPS läuft " +"und dass Ihr Browser nicht so eingestellt ist, dass er den Zugriff auf " +"Mediengeräte verweigert." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Eingabegeräte wechseln" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Ein Gerät auswählen:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Wählen Sie die Methode, mit der Sie einen Anruf über die mobile Anwendung tätigen möchten:\n" +" • VoIP: Immer das Odoo-Softphone verwenden\n" +" • Telefon des Geräts: Immer das Telefon des Geräts verwenden\n" +" • Fragen: Immer fragen, ob das Softphone oder das Telefon des Geräts verwendet werden soll.\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Schließen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Zahlenblock schließen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Softphone schließen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Details schließen" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Bestätigen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Verbinden ..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakte" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Kontakte mit Telefonnummern werden hier angezeigt." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kunde" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telefon des Geräts" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Leitung" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Bearbeiten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Anruf beenden" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Enddatum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Nummer oder Namen eingeben" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Geben Sie die Nummer ein ..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Externe Gerätenummer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Externe Gerätnummer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Laden der SIP.js-Bibliothek fehlgeschlagen:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Auflegen, aber Anruf in die Warteschlange verschieben" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Bleiben Sie dran!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Wie Anrufe auf Handy tätigen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Wie Anrufe auf Handy tätigen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Wenn diese Option aktiviert ist, werden eingehende Anrufe in Odoo " +"automatisch abgelehnt." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Wenn diese Option aktiviert ist, wird bei einem Anruf in Odoo der Anruf an " +"die „Externe Gerätenummer“ weitergeleitet. Verwenden Sie diese Option, um " +"den Anruf in Odoo zu tätigen, ihn aber von einem anderen Gerät auszuführen -" +" z. B. von Ihrem Tischtelefon aus." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Wenn die Option „Von einem anderen Gerät anrufen“ aktiviert ist, werden in " +"Odoo getätigte Anrufe an diese Rufnummer weitergeleitet." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Im Anruf für: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Eingehend" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Eingehender Anruf von ..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Auswahl des Eingabegeräts" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Ist in der Anruf-Warteschlange" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Zuletzt gesehener Telefonanruf" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Zuletzt aktualisiert von" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Zuletzt aktualisiert am" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Als erledigt markieren" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Verwählt, sorry." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Verpasst" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Verpasster Anruf von %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Stumm" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Nächste Aktivitäten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Kein Audioaufnahmegerät vorhanden. Die Anwendung benötigt ein Mikrofon, um " +"verwendet werden zu können." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Keine Anrufe für heute geplant 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Keine Suchergebnisse 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Laufend" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Zahlenblock öffnen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Softphone öffnen" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Ausgehend" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX-Server-IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" +"PBX- oder Websocket-Adresse fehlt. Bitte prüfen Sie Ihre Einstellungen." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefonnummer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Bitte lassen Sie die Nutzung des Mikrofons zu." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Bitte versuchen Sie es später noch einmal. Wenn das Problem weiterhin " +"besteht, sollten Sie einen Administrator bitten, die Konfiguration zu " +"überprüfen." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produktion" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Neueste" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registrierung abgelehnt: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Eingehende Anrufe ablehnen" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Abgelehnt" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Abgelehnter Anruf von %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Abgelehnter Anruf an %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Erinnern Sie sich?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Aus Warteschlange entfernen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Verantwortlich" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Es klingelt ..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Anrufe aus Ihrer Datenbank planen & tätigen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Aktivität planen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Suchen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Eine Anrufmethode auswählen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "E-Mail versenden" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Sollte eingehende Anrufe automatisch ablehnen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Sollte von einem anderen Gerät anrufen" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Einige Dokumente können nicht in die Warteschlange aufgenommen werden, da " +"für sie keine Telefonnummer festgelegt ist: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Startdatum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Status" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Sagen Sie uns, wie Sie den Anruf tätigen können:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Beendet" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "Die IP-Adresse Ihres PBX-Servers" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Die URL Ihres WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" +"Die WebSocket-Verbindung wurde unterbrochen und konnte nicht " +"wiederhergestellt werden." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Der Fehler kann von der Transportschicht herrühren. Bitte lassen Sie einen " +"Administrator die URL des Websocket-Servers in den Allgemeinen Einstellungen" +" überprüfen. Wenn das Problem weiterhin besteht, handelt es sich " +"wahrscheinlich um ein Problem mit dem Server." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" +"Der Name der Aktivität, die mit diesem Anruf verbunden ist, falls vorhanden." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Die Nummer ist falsch, die Benutzeranmeldeinformationen könnten falsch sein oder die Verbindung kann nicht hergestellt werden. Bitte überprüfen Sie Ihre Konfiguration.\n" +"(ermittelter Grund: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" +"Das Passwort, das für die Registrierung beim PBX-Server verwendet wird." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" +"Die Person, die Sie zu kontaktieren versuchen, ist derzeit nicht verfügbar." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Der Server konnte Sie nicht authentifizieren. Bitte lassen Sie einen " +"Administrator überprüfen, ob Sie den richtigen Server erreichen (PBX-Server-" +"IP in den Allgemeinen Einstellungen) und ob die Anmeldedaten in Ihren " +"Benutzereinstellungen korrekt sind." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Der User Agent konnte nicht gestartet werden. Die URL des Websocket-Servers " +"ist möglicherweise falsch. Bitte lassen Sie einen Administrator die " +"Websocket-Server-URL in den Allgemeinen Einstellungen überprüfen." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Der Benutzername (in der Regel die Nebenstellennummer), der für die " +"Registrierung beim PBX-Server verwendet werden soll." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"Die Websocket-Verbindung mit dem Server ist unterbrochen worden. Es wird " +"versucht, die Verbindung wiederherzustellen ..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Es läuft noch ein Anruf. Sind Sie sicher, dass Sie die Seite verlassen " +"möchten?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Weiterleiten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Weiterleiten an" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Softphone ausklappen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Stummschaltung aufheben" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Benutzer" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Benutzereinstellungen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Mit VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Mit Telefon des Geräts" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP-Warteschlangensupport" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP-Konfiguration" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VOIP-Umgebung" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP-Geheimnis" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP-Benutzername/-Nebenstellennummer" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / Anrufe" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip-Geheimnis" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip-Benutzername" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Ja, los!" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Ihr Browser unterstützt einige der für VoIP erforderlichen Funktionen nicht." +" Bitte versuchen Sie, Ihren Browser zu aktualisieren oder einen anderen " +"Browser zu verwenden." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Ihr Anrufprotokoll ist leer! Tätigen Sie jetzt einen Anruf und lassen Sie " +"ihn hier auflisten 💡." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Ihre Anmeldedaten sind nicht korrekt eingestellt. Bitte wenden Sie sich an " +"Ihren Administrator." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "weniger als einer Sekunde" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "Telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "VoIP" diff --git a/voip/i18n/el.po b/voip/i18n/el.po new file mode 100644 index 0000000..574accd --- /dev/null +++ b/voip/i18n/el.po @@ -0,0 +1,1141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Kostas Goutoudis , 2019 +# George Tarasidis , 2019 +# Martin Trigaux, 2019 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~12.2+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2016-08-05 13:32+0000\n" +"Last-Translator: Martin Trigaux, 2019\n" +"Language-Team: Greek (https://www.transifex.com/odoo/teams/41243/el/)\n" +"Language: el\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "# από Υποθέσεις" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Δραστηριότητα" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "Άβαταρ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "Τηλεφώνημα" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Ακύρωση" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Ακυρώθηκε" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "Κάντε κλικ για να κατάργηση αποκλεισμού" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "Κλείσιμο" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Επαφή" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Δημιουργήθηκε από" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Δημιουργήθηκε στις" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Ημερομηνία Δημιουργίας" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Πελάτης" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Ημερομηνία" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Εμφάνιση Ονόματος" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "Έγγραφο" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Ημερ. Λήξης" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Διάρκεια" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "Διάρκεια σε λεπτά." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Ομαδοποίηση κατά" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "Κρατήθηκε" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "Κωδικός" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "Σε 2 Μήνες" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "Εισερχόμενα" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Τελευταία Ενημέρωση από" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Τελευταία Ενημέρωση στις" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Σήμανση ως Ολοκληρωμένη" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "Κινητό" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "Οι Συνδιαλέξεις μου" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "Δεν πραγματοποιήθηκε" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Σημείωση" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "Εξερχόμενα" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "Εκρεμμής" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "Τηλέφωνο" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "Τηλεφωνήματα" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Παραγωγή" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "Υπεύθυνοι" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Προγραμματισμός Δραστηριότητας" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "Αναζήτηση Τηλεφωνημάτων" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "Αποστολή mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Ακολουθία" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "Συγκεκριμένη Ημερομηνία" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Κατάσταση" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "Περίληψη" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "Προς υλοποίηση" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "Αύριο" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "Μεταφορά" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "Μη Ανατεθειμένη" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "τουλάχιστον" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/es.po b/voip/i18n/es.po new file mode 100644 index 0000000..b7cf5f4 --- /dev/null +++ b/voip/i18n/es.po @@ -0,0 +1,1181 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Patricia Gutiérrez Capetillo , 2023 +# Larissa Manderfeld, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Spanish (https://app.transifex.com/odoo/teams/41243/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s seg" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minutos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s llamadas perdidas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s segundos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minuto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 llamada perdida" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 segundo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minutos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 llamadas perdidas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 segundos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Se ha producido un error de hardware al intentar acceder al dispositivo de " +"grabación de audio. Por favor, asegúrese de que sus controladores están " +"actualizados e inténtelo de nuevo." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Una llamada telefónica mediante la aplicación VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Cancelada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Llamada cancelada a %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Actividad" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nombre de la actividad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Agregar a la cola de llamadas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Ocurrió un error con el dispositivo de grabación de audio (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Ocurrió un error durante la instanciación del agente de usuario:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Ocurrió un error al intentar invitar al siguiente número: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"¿En verdad desea eliminar esta actividad? Se perderá para siempre, que es " +"bastante tiempo 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Preguntar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Retroceso" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Llamada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Llamada de %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Llamada de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Llamada desde otro dispositivo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Llamada rechazada (motivo: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Llamada a %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Llamada a %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Llamando" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Llamando %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Llamadas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Cancelar la actividad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"No se puede acceder al dispositivo de grabación de audio. Si ha denegado el " +"acceso a su micrófono, habilítelo e inténtelo de nuevo. De lo contrario, " +"asegúrese de que este sitio web se ejecuta a través de HTTPS y de que su " +"navegador no está configurado para denegar el acceso a dispositivos " +"multimedia." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Cambiar dispositivo de entrada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Elija un dispositivo:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Elija el método que se usará para realizar una llamada al usar la aplicación móvil:\n" +" • VoIP: siempre se usará el softphone de Odoo\n" +" • Teléfono del dispositivo: siempre se usará el dispositivo del teléfono\n" +" • Preguntar: siempre se preguntará si se debe usar el softphone o el teléfono del dispositivo\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Cerrar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Cerrar teclado numérico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Cerrar softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Cerrar información" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Conectando..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contacto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contactos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Los contactos con un número de teléfono se mostrarán aquí." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demostración" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Teléfono del dispositivo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Dirección" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documentos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Finalizar llamada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Fecha de finalización" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Ingrese el número o el nombre" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Ingrese el número..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Número de dispositivo externo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Número de dispositivo externo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Error al cargar la librería SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Colgar pero mantener la llamada en la cola" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "¡Espere!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Cómo llamar desde un dispositivo móvil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Cómo realizar llamadas desde el móvil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "Si se activa, Odoo rechazará automáticamente las llamadas entrantes." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Si se activa, realizar la llamada en Odoo transferirá la llamada al \"número" +" de dispositivo externo\". Use esta opción para realizar una llamada en Odoo" +" pero tomarla desde otro dispositivo, por ejemplo, el teléfono de su " +"escritorio." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Si la opción de \"llamada desde otro dispositivo\" está activada, las " +"llamadas realizadas en Odoo se transferirán en este número de teléfono." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Duración de la llamada: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Entrante" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Llamada entrante de..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Selección del dispositivo de entrada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Está en la cola de llamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Última llamada que se vio" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marcar como hecho" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Me equivoqué, lo siento." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Perdida" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Llamada perdida de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Móvil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Móvil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Silenciar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Siguientes actividades" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"No hay dispositivo de grabación disponible. La aplicación necesita un " +"micrófono para poder usarse." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "No tiene llamadas programadas para hoy 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "No hay resultados de búsqueda 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "En curso" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Abrir teclado numérico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Abrir Softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Saliente" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "Dirección IP del servidor PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Falta la dirección de PBX o Websocket. Revise su configuración." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Teléfono" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Número de teléfono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Teléfono:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Acepte usar el micrófono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Inténtelo de nuevo más tarde. Si el problema persiste, pídale a un " +"administrador que revise la configuración." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Producción" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Reciente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registro rechazado: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Rechazar llamadas entrantes" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rechazada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Llamada rechazada de %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Llamada rechazada de %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "¿Recuerda? " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Eliminar de la cola de llamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsable" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Llamando..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Programe y realice llamadas desde su base de datos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planificar actividad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Buscar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Seleccionar un método de llamada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Enviar correo electrónico" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Debe rechazar automáticamente las llamadas entrantes" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Debe llamar desde otro dispositivo" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Algunos documentos no se pueden agregar a la cola de llamadas ya que no " +"tienen un número de teléfono configurado: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Estado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Díganos cómo hacer la llamada:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Finalizada" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "La dirección IP de su servidor PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "La URL de su WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "Se perdió la conexión de websocket y no se pudo restablecer." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Es probable que el error venga de la capa de transporte. Pídale a un " +"administrador que verifique la URL del servidor del websocket en ajustes " +"generales. Si el problema persiste, probablemente sea un problema con el " +"servidor." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" +"El nombre de la actividad relacionada con esta llamada telefónica, si " +"existe." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"El número es incorrecto, las credenciales de usuario podrían ser erróneas o no se puede establecer la conexión. Verifique su configuración.\n" +"(Motivo recibido: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "La contraseña que se usará para registrar el servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "La persona que intenta contactar no está disponible en este momento." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"El servidor no pudo autenticarlo. Deje que un administrador verifique que " +"está llegando al servidor correcto (servidor IP del servidor PBX en ajustes " +"generales) y que las credenciales en sus preferencias de usuario sean " +"correctas." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"No se ha podido ejecutar el agente de usuario. La URL del servidor de " +"websocket puede ser incorrecta. Pida a un administrador que compruebe la URL" +" del servidor de websocket en los ajustes generales." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"El nombre de usuario (usualmente el número de extensión) que se usará para " +"registrar el servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"Se perdió la conexión de websocket con el servidor. Intentando restablecer " +"la conexión..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Todavía hay una llamada en curso, ¿está seguro de que desea abandonar la " +"página?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transferir" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transferir a" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Desplegar Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Desactivar silencio" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Ajustes de usuario" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Usando VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Usando el teléfono del dispositivo" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Soporte de cola VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Configuración del VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Entorno VOIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Secreto VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nombre de usuario/número de extensión del VoIP" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip/llamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Secreto de VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Nombre de usuario de VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Sí, hágalo." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Su navegador no es compatible con algunas de las funciones que VoIP necesita" +" para funcionar. Intente actualizar su navegador o use uno diferente. " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Su historial de llamadas está vacío. Si hace una llamada aparecerá aquí 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Sus datos de acceso no están configurados correctamente. Póngase en contacto" +" con su administrador." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "menos que un segundo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "teléfono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "VoIP" diff --git a/voip/i18n/es_419.po b/voip/i18n/es_419.po new file mode 100644 index 0000000..ae436da --- /dev/null +++ b/voip/i18n/es_419.po @@ -0,0 +1,1181 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Lucia Pacheco, 2023 +# Patricia Gutiérrez Capetillo , 2024 +# Fernanda Alvarez, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Spanish (Latin America) (https://app.transifex.com/odoo/teams/41243/es_419/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_419\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s seg" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minutos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s llamadas perdidas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s segundos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minuto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 llamada perdida" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 segundo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minutos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 llamadas perdidas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 segundos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Ocurrió un error de hardware al intentar acceder al dispositivo de grabación" +" de audio. Asegúrese de que sus controladores están actualizados e inténtelo" +" de nuevo." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Una llamada telefónica mediante la aplicación VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Cancelada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Llamada cancelada a %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Actividad" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nombre de la actividad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Agregar a la cola de llamadas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Ocurrió un error con el dispositivo de grabación de audio (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Ocurrió un error durante la creación de instancias del agente de usuario:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Ocurrió un error al intentar invitar al siguiente número: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "¿En verdad desea eliminar esta actividad?" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Pregunta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Retroceso" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Llamar" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Llamada de %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Llamada de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Llamada desde otro dispositivo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Llamada rechazada (motivo: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Llamar a %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Llamar a %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Llamando" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Llamando %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Llamadas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Cancelar la actividad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"No se puede acceder al dispositivo de grabación de audio. Si ha denegado el " +"acceso a su micrófono, habilítelo e inténtelo de nuevo. De lo contrario, " +"asegúrese de que este sitio web se ejecuta a través de HTTPS y de que su " +"navegador no está configurado para denegar el acceso a dispositivos " +"multimedia." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Cambiar dispositivo de entrada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Elegir dispositivo:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Elija el método que se usará para realizar una llamada al usar la aplicación móvil:\n" +" • VoIP: siempre se usará el softphone de Odoo\n" +" • Teléfono del dispositivo: siempre se usará el dispositivo del teléfono\n" +" • Preguntar: siempre se preguntará si se debe usar el softphone o el teléfono del dispositivo\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Cerrar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Cerrar teclado numérico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Cerrar softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Cerrar detalles" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Conectando..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contacto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contactos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Los contactos con un número de teléfono aparecerán aquí." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demostración" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Teléfono del dispositivo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Dirección" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nombre en pantalla" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documentos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Finalizar llamada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Fecha de finalización" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Escriba el número o el nombre" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Escriba el número..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Número de dispositivo externo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Número de dispositivo externo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Ocurrió un error al cargar la biblioteca SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Colgar pero mantener la llamada en la cola" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "¡Espere!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Cómo llamar desde un dispositivo móvil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "¿Cómo realizar llamadas desde el móvil?" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Si se activa, Odoo rechazará de manera automática las llamadas entrantes." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Si se activa, realizar la llamada en Odoo transferirá la llamada al \"número" +" de dispositivo externo\". Use esta opción para realizar una llamada en Odoo" +" pero tomarla desde otro dispositivo, por ejemplo, el teléfono de su " +"escritorio." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Si la opción de \"llamada desde otro dispositivo\" está habilitada, las " +"llamadas realizadas en Odoo se transferirán a este número de teléfono." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Duración de la llamada: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Entrante" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Llamada entrante de..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Selección del dispositivo de entrada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Está en la cola de llamada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Última vez visto en llamada telefónica" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marcar como hecho" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "¡Ups!" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Perdida" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Llamada perdida de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Celular" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Celular:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Silenciar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Siguientes actividades" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"No hay ningún dispositivo de grabación de voz disponible. Necesita un " +"micrófono para poder usar la aplicación." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "No tiene llamadas programadas para hoy 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Sin resultados de búsqueda" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "En curso" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Abrir teclado numérico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Abrir softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Saliente" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "Dirección IP del servidor PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Falta la dirección de PBX o websocket. Revise sus ajustes." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Teléfono" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Número de teléfono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Teléfono:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Acepte el uso del micrófono." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Inténtelo de nuevo más tarde. Si el problema continúa, pídale a un " +"administrador que revise la configuración." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Producción" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Reciente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registro rechazado: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Rechazar llamadas entrantes" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rechazado" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Llamada rechazada de %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Llamada rechazada de %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Recordar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Quitar de la cola de llamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsable" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Llamando..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Programe y realice llamadas desde su base de datos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Programar actividad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Buscar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Seleccione un método de llamada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Enviar correo electrónico" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Se deben rechazar las llamadas entrantes de forma automática" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Se debe llamar desde otro dispositivo" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Algunos documentos no se pueden agregar a las llamadas en espera. No tienen " +"un número de teléfono configurado: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Fecha de inicio" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Estado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Díganos cómo hacer la llamada:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Finalizada" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "La dirección IP de su servidor PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "La dirección URL de su websocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "La conexión de websocket se perdió y no se pudo restablecer." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Es probable que el error venga de la capa de transporte. Pídale a un " +"administrador que verifique la URL del servidor del websocket en ajustes " +"generales. Si el problema continua, es probable que haya un error con el " +"servidor." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" +"El nombre de la actividad relacionada con esta llamada telefónica, si " +"existe." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"El número es incorrecto, las credenciales de usuario podrían ser erróneas o no se puede establecer la conexión. Verifique su configuración.\n" +"(Motivo recibido: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "La contraseña que se usará para registrar el servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "La persona que intenta contactar no está disponible en este momento." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"El servidor no pudo autenticarle. Solicite a un administrador que verifique " +"que se está conectando al servidor correcto (servidor IP del servidor PBX en" +" ajustes generales) y que las credenciales en sus preferencias de usuario " +"sean correctas." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"No se ha podido ejecutar el agente de usuario. La URL del servidor de " +"websocket puede ser incorrecta. Solicite a un administrador que compruebe la" +" URL del servidor de websocket en ajustes generales." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"El nombre de usuario (con frecuencia el número de extensión) que se usará " +"para registrar el servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"La conexión de websocket con el servidor se perdió. Intentando restablecer " +"la conexión..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Todavía hay una llamada en curso, ¿está seguro de que desea abandonar la " +"página?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transferir " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transferir a" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Desplegar softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Desactivar silencio" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Ajustes de usuario" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Con VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Con el teléfono del dispositivo" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Soporte para la cola de VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Configuración VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Entorno VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Secreto de VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nombre de usuario VoIP/número de extensión" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "VoIP/llamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Secreto de VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Nombre de usuario de VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Sí." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Su navegador no es compatible con algunas de las funciones que VoIP necesita" +" para funcionar. Intente actualizar su navegador o use otro." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Su historial de llamadas está vacío. Si hace una llamada aparecerá aquí. 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Sus datos de acceso no están configurados correctamente. Póngase en contacto" +" con su administrador." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "menos de un segundo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "teléfono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "VoIP" diff --git a/voip/i18n/es_CL.po b/voip/i18n/es_CL.po new file mode 100644 index 0000000..a235789 --- /dev/null +++ b/voip/i18n/es_CL.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Spanish (Chile) (https://www.transifex.com/odoo/teams/41243/es_CL/)\n" +"Language: es_CL\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Cancelado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Fecha creación" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Agrupar por" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Estado" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/et.po b/voip/i18n/et.po new file mode 100644 index 0000000..f2a78e6 --- /dev/null +++ b/voip/i18n/et.po @@ -0,0 +1,1170 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Algo Kärp , 2023 +# Eneli Õigus , 2023 +# Martin Aavastik , 2023 +# Piia Paurson , 2023 +# Rivo Zängov , 2023 +# Martin Trigaux, 2023 +# Patrick-Jordan Kiudorv, 2023 +# JanaAvalah, 2023 +# Arma Gedonsky , 2023 +# Leaanika Randmets, 2023 +# Birgit Vijar, 2024 +# Tairi Tiimann, 2024 +# Anna, 2024 +# Triine Aavik , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Triine Aavik , 2024\n" +"Language-Team: Estonian (https://app.transifex.com/odoo/teams/41243/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s minutit %(seconds)s sekundit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minutit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s vastamata kõnet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s sekundit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 vastamata kõne" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 sekund" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minutit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 vastamata kõne" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 sekundit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Helisalvestusseadmetele ligipääsemisel esines riistvara viga. Palun " +"veenduge, et teie draiverid on ajakohased ja proovige uuesti." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Katkestatud" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Katkestatud kõne numbrile %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Tegevus" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Tegevuse nimetus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Lisa kõne järjekorda" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Helisalvestusseadmega esines viga (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Järgmise numbri kutsumisel ilmnes viga: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Kas olete kindel, et soovite selle tegevuse kustutada? See läheb igaveseks " +"kaotsi, mis on üsna pikk aeg 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Küsi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Tagasilükkeklahv" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Helista" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Kõne %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Kõne numbrilt %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Helista teisest seadmest" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Kõne tagasi lükatud (põhjus: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Helista %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Helista numbrile %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Helistamine" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Helistan %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Kõned" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Tühista" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Tühista tegevus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Mikrofonile puudub juurdepääs. Kui olete juurdepääsu mikrofonile keelanud, " +"lubage see ja proovige uuesti. Vastasel juhul veenduge, et see veebisait " +"töötab HTTPS-i kaudu ja et teie brauser ei keela juurdepääsu " +"meediaseadmetele." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Muuda sisendseadet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Vali seade:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Valige mobiilirakenduse kasutamisel helistamiseks kasutatav meetod:\n" +"• VoIP: kasutage alati Odoo tarkvara\n" +"• Seadme telefon: kasutage alati seadme telefoni\n" +"• Küsi: küsige alati, kas kasutada tuleb tarkvara telefoni või seadme telefoni" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Sulge" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Sulge numbriklahvistik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Sulge tarkvara telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Sulge detailid" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Seadistused" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Kinnitage" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Ühendamine..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontaktid" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Kontaktid, kellel on telefoninumber, kuvatakse siin." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Loodud (kelle poolt?)" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Loodud" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klient" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Esitlus" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Seadme telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Suund" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Kuvatav nimi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumendid" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Muuda" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Lõpeta kõne" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Lõppkuupäev" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Sisesta number või nimi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Sisesta number..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Väline seadme number" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Välise seadme number" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"SIP.js library laadimine ebaõnnestus:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Katkesta kõne, kuid hoia kõne järjekorras" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Oota!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Kuidas helistada mobiiltelefonile" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Kuidas mobiiliga helistada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Kui see on lubatud, lükatakse Odoos sissetulevad kõned automaatselt tagasi." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Kui see on lubatud, suunatakse Odoost helistamisel kõne \"Välise seadme " +"numbrile\". Kasutage seda valikut, et helistada Odoost, kuid saate käsitleda" +" seda teisest seadmest – nt. teie lauatelefon." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Kui valik \"Helista teisest seadmest\" on lubatud, suunatakse Odoosse tehtud" +" kõned sellele telefoninumbrile." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Sisenev" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Sissetulev kõne..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Sisendseadme valik" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "On kõne järjekorras" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Viimati nähtud telefonikõne" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Viimati uuendatud" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Viimati uuendatud" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Märgi lõpetatuks" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Vale klikk, vabandust." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Vastamata" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Vastamata kõne numbrilt %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobiil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobiil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Vaigista" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Järgmised tegevused" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Helisalvestusseade pole saadaval. Rakenduse kasutamiseks on vaja mikrofoni." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Täna pole ühtegi kõnet planeeritud 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Otsingutulemusi ei leitud 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Käimasolev" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Ava numbriklahvistik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Ava tarkvara telefon" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Väljuv" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX serveri IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX-i või Websocketi aadress on puudu. Palun kontrollige oma seadeid." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefoninumber" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Nõustuge mikrofoni kasutamisega." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Palun proovige hiljem uuesti. Kui probleem püsib, paluge administraatoril " +"seadistusi kontrollida." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Tootmine" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Hiljutine" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registreerimine tagasi lükatud: %(statusCode)s%(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Keeldu sissetulevatest kõnedest" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Tagasi lükatud" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Tagasi lükatud kõne numbrilt %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Tagasi lükatud kõne numbrile %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Kas mäletad?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Eemalda kõne järjekorrast" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Vastutaja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Helistan.." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Planeerige ja tehke kõnesid oma andmebaasist" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planeeri tegevus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Otsi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Valige kõne meetod" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Saada e-mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Mõnda dokumenti ei saa kõnejärjekorda lisada, kuna neile pole määratud telefoninumbrit:\n" +"%(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Alguskuupäev" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Staatus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Lõpetatud" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "PBX Serveri IP aadress" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Teie WebSocket'i URL" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "WebSocket'i ühendus katkes ja seda ei õnnestunud uuesti luua." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Viga võib olla tingitud transpordikihist. Paluge administraatoril " +"kontrollida üldseadetes WebSocket-serveri URL-i. Kui probleem püsib, on see " +"tõenäoliselt serveriga seotud." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Selle telefonikõnega seotud tegevuse nimi (kui on olemas)" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Parool, mida kasutatakse PBX serveriga registreerumiseks." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Isik, kellega proovite ühendust võtta, pole praegu saadaval." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Kasutajanimi (tavaliselt laiendusnumber), mida kasutatakse PBX serveriga " +"registreerumiseks." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"WebSocket-ühendus serveriga on katkenud. Proovin ühendust uuesti luua…" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "Kõne on pooleli, kas olete kindel, et soovite lehelt lahkuda?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Siirded" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transfer to" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Tühista vaigistamine" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Kasutaja" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Kasutaja seaded" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "VoIP-i kasutamine" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Seadme telefoni kasutamine" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP järjekorra tugi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP seadistused" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP keskkond" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP secret" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP kasutajanimi / laienduse number" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / Kõned" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip parool" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip kasutajanimi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Jah" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Teie brauser ei toeta mõningaid VoIP-i toimimiseks vajalikke funktsioone. " +"Palun proovige oma brauserit uuendada või kasutada teist brauserit." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Teie kõnede ajalugu on tühi! Tehke kõne ja see kantakse siia loendisse. 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Teie sisselogimisandmed ei ole õigesti määratud. Palun võtke ühendust oma " +"administraatoriga." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "vähem kui sekund" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/eu.po b/voip/i18n/eu.po new file mode 100644 index 0000000..5d38708 --- /dev/null +++ b/voip/i18n/eu.po @@ -0,0 +1,1140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +# Eneko , 2018 +# Mikel Lizarralde , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Mikel Lizarralde , 2018\n" +"Language-Team: Basque (https://www.transifex.com/odoo/teams/41243/eu/)\n" +"Language: eu\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Ezeztatu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Ezeztatua" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Nork sortua" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Created on" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Sortze data" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kidea" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Izena erakutsi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Group By" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Last Updated on" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "Posta bidali" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Sekuentzia" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Egoera" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/fa.po b/voip/i18n/fa.po new file mode 100644 index 0000000..10ffe73 --- /dev/null +++ b/voip/i18n/fa.po @@ -0,0 +1,1122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# سید محمد آذربرا , 2023 +# Yousef Shadmanesh , 2023 +# Hamid Ahmadimoghaddam, 2023 +# Hamid Darabi, 2023 +# Hamed Mohammadi , 2023 +# Martin Trigaux, 2023 +# Hanna Kheradroosta, 2023 +# Mostafa Barmshory , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Mostafa Barmshory , 2024\n" +"Language-Team: Persian (https://app.transifex.com/odoo/teams/41243/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "فعالیت" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "تماس" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "لغو" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "بستن" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "تنظیمات پیکربندی" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "تایید کردن" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "مخاطب" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "مخاطبان" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "ایجاد شده توسط" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "ایجادشده در" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "مشتری" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "آزمایشی" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "جهت" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "نام نمایش داده شده" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "اسناد" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "ویرایش" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "تاریخ پایان" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "شناسه" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "پیش رو" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "آخرین بروز رسانی توسط" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "آخرین بروز رسانی در" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "علامت به عنوان انجام شده" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "از دست رفته" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "موبایل" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "تلفن همراه:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "فعایتهای بعدی" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "در دست اقدام" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "خروجی" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "تلفن" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "شماره تلفن" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "تلفن:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "تولید" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "اخیر" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "رد شده" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "پاسخگو" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "برنامه ریزی فعالیت" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "جستجو" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "تاریخ آغاز" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "استان" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "انتقال" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "انتقال به" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "کاربر" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "تنظیمات کاربر" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "گوشی" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/fi.po b/voip/i18n/fi.po new file mode 100644 index 0000000..8dabb72 --- /dev/null +++ b/voip/i18n/fi.po @@ -0,0 +1,1180 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Veikko Väätäjä , 2023 +# Kari Lindgren , 2023 +# Tuomas Lyyra , 2023 +# Teija Hölttä , 2023 +# Svante Suominen , 2023 +# Martin Trigaux, 2023 +# Tuomo Aura , 2023 +# Jarmo Kortetjärvi , 2023 +# Miika Nissi , 2024 +# Ossi Mantylahti , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Ossi Mantylahti , 2024\n" +"Language-Team: Finnish (https://app.transifex.com/odoo/teams/41243/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s minuuttia %(seconds)s sekuntia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minuuttia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s vastaamattomat puhelut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s sekuntia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minuutti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 vastaamaton puhelu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 sekunti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minuuttia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 vastaamatonta puhelua" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 sekuntia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Äänitallennuslaitetta käytettäessä on tapahtunut laitteistovirhe. Varmista, " +"että ajurit ovat ajan tasalla ja yritä uudelleen." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "VoIP-sovelluksella soitettu puhelu" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Keskeytetty" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Keskeytetty kutsu osoitteeseen %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Toimenpide" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Toiminnan nimi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Lisää puhelujonoon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Äänitallennuslaitteessa (%(errorName)s) tapahtui virhe:\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Käyttäjäagentin instanssin käynnistyksessä tapahtui virhe:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Tapahtui virhe, kun yritettiin kutsua seuraavaa numeroa: %(phoneNumber)s\n" +"\n" +"Virhe: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "Haluatko varmasti poistaa tämän aktiviteetin? Se katoaa pysyvästi" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Kysy" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Askelpalautin" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Soitto" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Soita lähteestä %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Soitto lähteestä %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Puhelu toisesta laitteesta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Puhelu hylätty (syy: \"%(reasonPhrase)s\")" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Soita kohteeseen %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Soita kohteeseen %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Soitetaan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Soitetaan %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Puhelut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Peruuta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Peruuta toiminto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Äänitallennuslaitetta ei voida käyttää. Jos mikrofonin käyttöoikeus on " +"estetty, salli se ja yritä uudelleen. Muussa tapauksessa varmista, että tämä" +" verkkosivusto toimii HTTPS:n kautta ja että selaimesi ei ole asetettu " +"estämään pääsyä medialaitteisiin." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Vaihda syöttölaite" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Valitse laite:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Valitse menetelmä, jota käytetään puhelun soittamiseen mobiilisovellusta käytettäessä:\n" +" - VoIP: Käytä aina Odoo-softapuhelinta\n" +" - Laitteen puhelin: Käytä aina laitteen puhelinta\n" +" - Kysy: Kysy aina, onko käytettävä softapuhelinta vai laitteen puhelinta\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Sulje" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Sulje numeronäppäimistö" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Sulje Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Sulje tiedot" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Asetukset" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Vahvista" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Yhdistetään…" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Yhteystiedot" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Yhteystiedot, joilla on puhelinnumero, näkyvät tässä." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Luonut" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Luotu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Asiakas" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Laitteen puhelin" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Suunta" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Näyttönimi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumentit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Muokkaa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Lopeta puhelu" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Päättymispäivä" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Anna numero tai nimi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Syötä numero…" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Ulkoisen laitteen numero" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Ulkoisen laitteen numero" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"SIP.js-kirjaston lataaminen epäonnistui:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Lopeta puhelu, mutta pidä puhelu jonossa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Odotahan!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Kuinka soittaa matkapuhelimeen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Kuinka soittaa puheluita matkapuhelimella" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Jos tämä on käytössä, saapuvat puhelut hylätään Odoossa automaattisesti." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Jos tämä on käytössä, puhelun soittaminen Odoossa siirtää puhelun \"Ulkoisen" +" laitteen numeroon\". Käytä tätä vaihtoehtoa, jos haluat soittaa puhelun " +"Odoossa, mutta käsitellä sen jostain muusta laitteesta - esim. " +"pöytäpuhelimesta." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Jos \"Soita toisesta laitteesta\" -vaihtoehto on käytössä, Odoossa soitetut " +"puhelut siirretään tähän puhelinnumeroon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Puhelu käynnissä: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Saapuva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Saapuva puhelu…" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Syöttölaitteen valinta" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "On puhelujonossa" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Viimeksi nähty puhelinsoitto" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Viimeksi päivittänyt" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Viimeksi päivitetty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Merkitse tehdyksi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Väärä klikkaus, pahoittelut." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Ei vastattu puhelu" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Vastaamaton puhelu %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Matkapuhelin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Matkapuhelin:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Mykkä" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Seuraavat toimenpiteet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Äänitallennuslaitetta ei ole käytettävissä. Sovelluksen käyttäminen " +"edellyttää mikrofonia." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Tänään ei ole puheluita" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Ei hakutuloksia" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Jatkuva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Avaa numeronäppäimistö" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Avaa softapuhelin" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Lähtevä" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX-palvelin IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX- tai Websocket-osoite puuttuu. Tarkista asetukset." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Puhelin" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Puhelinnumero" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Phone:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Hyväksykää mikrofonin käyttö." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Yritä myöhemmin uudelleen. Jos ongelma ei poistu, pyydä järjestelmänvalvojaa" +" tarkistamaan asetukset." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Valmistus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Viimeisin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Rekisteröinti hylätty: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Hylkää saapuvat puhelut" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rechazado" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Hylätty puhelu %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Hylätty puhelu osoitteeseen %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Muista minut?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Poista puhelujonosta" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Vastuuhenkilö" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Soittaa…" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Ajoita ja soita puheluita tietokannastasi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Aikatauluta toimenpide" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Hae" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Valitse soittomenetelmä" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Lähetä sähköpostia" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Pitäisikö automaattisen hylkäämisen hylätä saapuvat puhelut" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Pitäisi soittaa toisesta laitteesta" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Joitakin asiakirjoja ei voi lisätä puhelujonoon, koska niille ei ole " +"asetettu puhelinnumeroa: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Alkupäivä" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Alue" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Kerro meille, miten soitamme puhelun:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Päättynyt" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "PBX-palvelimen IP-osoite" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "WebSocketin URL-osoite" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "WebSocket-yhteys katosi eikä sitä saatu muodostettua uudelleen." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Virhe voi tulla siirtokerroksesta. Pyydä järjestelmänvalvojaa tarkistamaan " +"websocket-palvelimen URL-osoite yleisissä asetuksissa. Jos ongelma jatkuu, " +"kyse on todennäköisesti palvelimesta." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Tähän puheluun liittyvän toiminnan nimi, jos sellainen on." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Numero on väärä, käyttäjätunnukset voivat olla väärät tai yhteyttä ei voida muodostaa. Tarkista asetukset.\n" +"(Saatu syy: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Salasana, jota käytetään rekisteröitymiseen PBX-palvelimelle." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" +"Henkilö, johon yrität ottaa yhteyttä, ei ole tällä hetkellä tavoitettavissa." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Palvelin ei onnistunut todentamaan sinua. Pyydä järjestelmänvalvojaa " +"tarkistamaan, että tavoitat oikean palvelimen (PBX-palvelimen IP-osoite " +"yleisissä asetuksissa) ja että käyttäjäasetuksissasi olevat tunnistetiedot " +"ovat oikein." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Käyttäjäagenttia ei voitu käynnistää. Websocket-palvelimen URL-osoite voi " +"olla virheellinen. Pyydä järjestelmänvalvojaa tarkistamaan websocket-" +"palvelimen URL-osoite yleisissä asetuksissa." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Käyttäjänimi (yleensä liittymänumero), jota käytetään PBX-palvelimelle " +"rekisteröitymiseen." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"Websocket-yhteys palvelimeen on katkennut. Yritetään muodostaa yhteys " +"uudelleen..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "Puhelu on edelleen käynnissä, haluatko varmasti poistua sivulta?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Siirto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Siirto kohteeseen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Sulje softapuhelimen laskostus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Poista mykistys" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Käyttäjä" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Käyttäjäasetukset" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "VoIP:n käyttö" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Laitteen puhelimen käyttäminen" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP-jonon tuki" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP-asetukset" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP-ympäristö" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP-salaisuus" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP-käyttäjätunnus / Alanumero" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / Puhelut" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip Secret" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip-käyttäjätunnus" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Kyllä, tee näin." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Selaimesi ei tue joitakin VoIP:n toimintaan tarvittavia ominaisuuksia. Yritä" +" päivittää selaimesi tai käytä toista selainta." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "Puheluhistoriasi on tyhjä! Soita nyt ja saat sen kirjattua" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Kirjautumistietojasi ei ole asetettu oikein. Ota yhteyttä " +"järjestelmänvalvojaan." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "alle sekunti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "puhelin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/fo.po b/voip/i18n/fo.po new file mode 100644 index 0000000..4372799 --- /dev/null +++ b/voip/i18n/fo.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Faroese (https://www.transifex.com/odoo/teams/41243/fo/)\n" +"Language: fo\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Strika" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Byrjað av" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Byrjað tann" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kundi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Vís navn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Bólka eftir" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Seinast dagført av" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Seinast dagført tann" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/fr.po b/voip/i18n/fr.po new file mode 100644 index 0000000..85e3ef3 --- /dev/null +++ b/voip/i18n/fr.po @@ -0,0 +1,1181 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Jolien De Paepe, 2024 +# Manon Rondou, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s sec" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minutes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s appels manqués" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s secondes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minute" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 appel manqué" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 seconde" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minutes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 appels manqués" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 secondes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Une erreur matérielle est survenue lors de l'accès à votre périphérique " +"d'enregistrement audio. Vérifiez que vos pilotes sont à jour et réessayez." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Un appel téléphonique pris en charge avec VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Annulé" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Appel annulé vers %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Activité" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nom de l'activité" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Ajouter à la file d'attente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Une erreur impliquant le périphérique d'enregistrement audio est survenue (%(errorName)s) :\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Une erreur est survenue lors de l'instanciation de l'User Agent :\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Une erreur s'est produite lors de l'invitation du numéro suivant : %(phoneNumber)s\n" +"\n" +"Erreur : %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Êtes-vous sûr de vouloir supprimer cette activité ? Elle ne pourra pas être " +"restaurée par la suite 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Me demander" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Effacer" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Appeler" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Appel entrant de %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Appel entrant de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Appeler à partir d'un autre périphérique" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Appel rejeté (motif : “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Appeler %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Appeler %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "En cours d'appel" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "En train d'appeler %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Appels" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Annuler" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Annuler l'activité" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Impossible d'accéder au dispositif d'enregistrement audio. Si vous avez " +"refusé l'accès à votre microphone, veuillez l'accorde et réessayer. Sinon, " +"assurez-vous que ce site web fonctionne sur HTTPS et que votre navigateur " +"n'est pas configuré pour refuser l'accès aux périphériques multimédias." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Modifier le périphérique d'entrée" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Choisissez un périphérique :" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Choisir la méthode à utiliser pour passer un appel lors de l'utilisation de l'application mobile :\n" +"• VoIP : utilisez toujours le softphone Odoo\n" +"• Téléphone du périphérique : utilisez toujours le téléphone du périphérique\n" +"• Demander : demandez toujours si le softphone ou le téléphone du périphérique doit être utilisé" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Fermer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Fermer le pavé numérique" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Fermer le softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Fermer les détails" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de config" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Connexion..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contact" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contacts" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Les contacts avec un numéro de téléphone seront affichés ici." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Client" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Démo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Téléphone du périphérique" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Direction" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documents" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Modifier" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Raccrocher" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Date de fin" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Saisir un numéro ou un nom" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Saisissez le numéro..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Numéro de périphérique externe" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Numéro de périphérique externe" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Échec du chargement de la bibliothèque SIP.js :\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Raccrocher mais garder l'appel en file d'attente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Attends !" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Comment passer des appels sur mobile" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Comment passer des appels sur mobile" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Si activé, les appels entrants seront automatiquement refusés dans Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Si activé, passer un appel dans Odoo transférera l'appel vers le \"Numéro de" +" périphérique externe\". Utilisez cette option pour passer l'appel dans Odoo" +" mais le gérer à partir d'un autre périphérique - par ex. votre téléphone de" +" bureau." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Si l'option \"Appeler depuis un autre périphérique\" est activée, les appels" +" passés dans Odoo seront transférés vers ce numéro de téléphone." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "L'appel dure depuis %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Entrant" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Appel entrant de..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Sélection du périphérique d'entrée" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Est dans la file d'attente des appels" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Dernier appel téléphonique vu" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Mis à jour par" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Mis à jour le" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marquer comme fait" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "J'ai mal cliqué, désolé." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Manqué" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Appel manqué de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobile" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobile :" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Muet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Activités suivantes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Aucun dispositif d'enregistrement audio disponible. L'application nécessite " +"un microphone pour être utilisée." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Pas d'appels prévus aujourd'hui 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Pas de résultats de recherche 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "En cours" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Ouvrir le pavé numérique" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Ouvrir le softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Sortant" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP du serveur PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" +"L'adresse PBX ou Websocket est manquante. Veuillez vérifier vos paramètres." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Téléphone" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Numéro de téléphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Téléphone :" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Veuillez accepter l'utilisation du microphone." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Veuillez réessayer plus tard. Si le problème persiste, vous pouvez demander " +"à un administrateur de vérifier la configuration." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Production" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Récent" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Enregistrement impossible : %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Rejeter les appels entrants" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Refusé" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Appel rejeté de %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Appel rejeté de %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Vous vous souvenez ?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Retirer de la liste d'appel" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsable" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Ça sonne..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Planifier & passer des appels depuis votre base de données" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planifier une activité" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Rechercher" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Sélectionnez une méthode d'appel" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Envoyer un email" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Rejet automatique des appels entrants" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Appeler à partir d'un autre appareil" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Certains documents ne peuvent pas être ajoutés à la file d'attente des " +"appels car ils n'ont pas de numéro de téléphone défini : %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Date de début" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Statut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Dites-nous comment passer l'appel :" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Terminé" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "L'adresse IP de votre serveur PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "L'URL de votre WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "La connexion WebSocket a été perdue et n'a pas pu être rétablie." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"L'erreur peut provenir de la couche transport. Veuillez demander à un " +"administrateur de vérifier l'URL du serveur Websocket dans les paramètres " +"généraux. Si le problème persiste, il s'agit probablement d'un problème lié " +"au serveur." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Le nom de l'activité liée à cet appel téléphonique, le cas échéant." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Le numéro est incorrect, les identifiants de l'utilisateur peuvent être erronés ou la connexion ne peut pas être établie. Veuillez vérifier votre configuration.\n" +"(Motif reçu : %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" +"Le mot de passe qui sera utilisé pour s'enregistrer auprès du serveur PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" +"La personne que vous essayez de contacter est actuellement indisponible." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Le serveur n'a pas réussi à vous authentifier. Veuillez demander à un " +"administrateur de vérifier que vous atteignez le bon serveur (IP du serveur " +"PBX dans les paramètres généraux) et que les informations d'identification " +"dans vos préférences d'utilisateur sont correctes." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Impossible de démarrer l'agent utilisateur. L'URL du serveur websocket est " +"peut-être incorrecte. Demandez à un administrateur de vérifier l'URL du " +"serveur websocket dans les Paramètres généraux." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Le nom d'utilisateur (généralement le numéro de poste) qui sera utilisé pour" +" s'enregistrer auprès du serveur PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"La connexion websocket avec le serveur a été perdue. Tentative de " +"rétablissement de la connexion en cours..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Un appel est toujours en cours. Êtes-vous sûr de vouloir quitter la page ?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transférer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transférer vers" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Déplier le softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Réactiver le son" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Utilisateur" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Paramètres utilisateur" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Utiliser VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Utilise le téléphone du périphérique" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Prise en charge de la file d'attente VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Configuration du VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Environnement VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Secret VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nom d'utilisateur VoIP / Numéro d'extension" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "VoIP / Appels" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Secret VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Nom d'utilisateur VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Oui, faites-le." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Votre navigateur ne prend pas en charge certaines des fonctionnalités " +"requises pour que VoIP fonctionne. Veuillez essayer de mettre à jour votre " +"navigateur ou d'en essayer un autre." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Votre historique des appels est vide ! Passez un appel maintenant et faites-" +"le figurer ici 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Vos données de connexion ne sont pas correctes. Veuillez contacter votre " +"administrateur." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "moins d'une seconde" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "téléphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "Voip" diff --git a/voip/i18n/fr_BE.po b/voip/i18n/fr_BE.po new file mode 100644 index 0000000..12b6192 --- /dev/null +++ b/voip/i18n/fr_BE.po @@ -0,0 +1,1137 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Odoo 9.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2015-09-15 14:03+0000\n" +"Last-Translator: Martin Trigaux\n" +"Language-Team: French (Belgium) (http://www.transifex.com/odoo/odoo-9/language/fr_BE/)\n" +"Language: fr_BE\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Derniere fois mis à jour par" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Dernière mis à jour le" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/fr_CA.po b/voip/i18n/fr_CA.po new file mode 100644 index 0000000..0106bba --- /dev/null +++ b/voip/i18n/fr_CA.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: French (Canada) (https://www.transifex.com/odoo/teams/41243/fr_CA/)\n" +"Language: fr_CA\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Grouper par" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "Identifiant" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Statut" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/gl.po b/voip/i18n/gl.po new file mode 100644 index 0000000..98f37c1 --- /dev/null +++ b/voip/i18n/gl.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Galician (https://www.transifex.com/odoo/teams/41243/gl/)\n" +"Language: gl\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Cancelado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Creado o" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Data de creación" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Agrupar por" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Estado" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/gu.po b/voip/i18n/gu.po new file mode 100644 index 0000000..f2b9ee1 --- /dev/null +++ b/voip/i18n/gu.po @@ -0,0 +1,1139 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Qaidjohar Barbhaya, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Qaidjohar Barbhaya, 2023\n" +"Language-Team: Gujarati (https://app.transifex.com/odoo/teams/41243/gu/)\n" +"Language: gu\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "પ્રવૃત્તિ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancel" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Cancelled" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "Close" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Config Settings" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Contact" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Created by" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Created on" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "સર્જન તારીખ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Customer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Date" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Display Name" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Due Date" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "સમયગાળો" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Edit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Group By" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Last Updated by" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Last Updated on" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "મોબાઇલ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Note" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "અધુરુ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "ફોન" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Schedule Activity" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Sequence" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Status" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "સાર" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "કરવાનું" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transfer" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "User" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/he.po b/voip/i18n/he.po new file mode 100644 index 0000000..0e84289 --- /dev/null +++ b/voip/i18n/he.po @@ -0,0 +1,1130 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Ofir Blum , 2023 +# Lilach Gilliam , 2023 +# דודי מלכה , 2023 +# Fishfur A Banter , 2023 +# Martin Trigaux, 2023 +# ZVI BLONDER , 2023 +# MichaelHadar, 2023 +# ExcaliberX , 2023 +# Sagi Ahiel, 2023 +# Roy Sayag, 2023 +# Yihya Hugirat , 2023 +# NoaFarkash, 2023 +# yael terner, 2024 +# Netta Waizer, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Netta Waizer, 2024\n" +"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "פעילות" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "לשאול משתמש האם ליצור" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "שיחה" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "מתקשר" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "בטל" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "סגור" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "הגדר הגדרות" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "אשר" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "איש קשר" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "אנשי קשר" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "נוצר על-ידי" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "נוצר ב-" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "לקוח" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "הדגמה" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "כיוון" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "שם לתצוגה" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "מסמכים" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "ערוך" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "תאריך סיום" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "מספר מכשיר חיצוני" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "דרך התקשרות בטלפון" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "מזהה" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "נכנס" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "עודכן לאחרונה על-ידי" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "עדכון אחרון ב" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "סמן כבוצע" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "נייד" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "נייד:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "השתק" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "הפעילויות הבאות" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "מתמשך" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr " יוצא" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "טלפון" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "מספר טלפון" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "טלפון:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "ייצור" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "נדחה" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "אחראי" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "תזמן פעילות" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "חיפוש" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"מסמכים מסוימים לא יכולים להצטרף לתור שיחות מכיוון שאין במסמכים מספר טלפון " +"רשום: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "תאריך תחילה" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "מדינה" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "העברה" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "הועבר ל" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "בטל השתקה" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "משתמש" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "הגדרות משתמש" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP סודי" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "טלפון" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/hr.po b/voip/i18n/hr.po new file mode 100644 index 0000000..90ba99d --- /dev/null +++ b/voip/i18n/hr.po @@ -0,0 +1,1147 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Stjepan Lovasić , 2022 +# Ivan Marijanović , 2022 +# Vladimir Olujić , 2022 +# Đurđica Žarković , 2022 +# Karolina Tonković , 2022 +# Marko Carević , 2022 +# Martin Trigaux, 2022 +# Tina Milas, 2022 +# Bole , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Bole , 2022\n" +"Language-Team: Croatian (https://app.transifex.com/odoo/teams/41243/hr/)\n" +"Language: hr\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "# Slučaja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "Prihvati" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivnost" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Dodaj u red čekanja poziva" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "Avatar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "Natrag" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "Poziv" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Odustani" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Otkazano" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "Kliknite za odblokiranje" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "Zatvori" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Postavke" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "Kontakti" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Datum kreiranja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kupac" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Datum" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "Smjer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Naziv" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "Dokument" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "Nemoj napraviti novi raspored" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Datum dospijeća" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Trajanje" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Uredi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "Unesi broj..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "Daje redoslijed kada se prikazuje lista poziva." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Grupiraj po" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "Održan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "Za 1 tjedan" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "Za 15 dana" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "Za 2 mjeseca" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "U redu čekanja poziva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "Ulazna" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Je u redu čekanja poziva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Promijenio" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Vrijeme promjene" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Označi kao izvršeno" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "Mobitel" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobitel:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "Moji pozivi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "Nije održano" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Bilješka" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "Odlazno" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Server IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "Na čekanju" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "Tel. pozivi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Proizvodnja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "Osvježi ploču" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "Odbijeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "Odbijeno" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Ukloni iz reda čekanja poziva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "Ukloni s čekanja" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "Odgovoran" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Zakaži aktivnost" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "Traži" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "Traži telefonske pozive" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "Pošalji mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Sekvenca" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "Poseban datum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "Započni vrijeve" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Status" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "Sažetak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL Vašeg WebSocketa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "Poziv nema broja." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "Za napraviti" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "Sutra" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "Prijenos" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "Nedodjeljen" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Korisnik" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "Vaš pretraživač ne podržava WebRTC. Molimo provjerite postavke." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "min" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/hu.po b/voip/i18n/hu.po new file mode 100644 index 0000000..9634ea4 --- /dev/null +++ b/voip/i18n/hu.po @@ -0,0 +1,1122 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Gergő Kertész , 2023 +# Zsolt Godó , 2023 +# Ákos Nagy , 2023 +# gezza , 2023 +# Martin Trigaux, 2023 +# Tamás Németh , 2023 +# krnkris, 2023 +# Tamás Dombos, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Tamás Dombos, 2024\n" +"Language-Team: Hungarian (https://app.transifex.com/odoo/teams/41243/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Tevékenység" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Adja hozzá a hívási sorhoz" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Visszalépés" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Hívás" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Töröl" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Bezárás" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Beállítások módosítása" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Megerősítés" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kapcsolat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kapcsolatok" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Létrehozta" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Létrehozva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Vevő" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Minta" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Irány" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Megjelenített név" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumentumok" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Szerkesztés" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Hívás vége" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Befejező dátum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "Azonosító" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Beérkező" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Benne van a Hívási sorban" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Frissítette" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Frissítve" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Késznek jelöl" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Elmulasztott" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobilszám:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Némít" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Következő tevékenységek" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Folyamatban lévő" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Kimenő" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX szerver IP cím" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefonszám" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Gyártás" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Elutasított" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Eltávolítás a hívási sorból" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Felelős" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Tevékenység ütemezése" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Keresés" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Kezdődátum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Állapot" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "A WebSoccet URL webcíme" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Átmozgatás" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Átmozgatás ide" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Felhasználó" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP környezet" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/hy.po b/voip/i18n/hy.po new file mode 100644 index 0000000..7f714c0 --- /dev/null +++ b/voip/i18n/hy.po @@ -0,0 +1,1111 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Language-Team: Armenian (https://app.transifex.com/odoo/teams/41243/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/id.po b/voip/i18n/id.po new file mode 100644 index 0000000..50b3481 --- /dev/null +++ b/voip/i18n/id.po @@ -0,0 +1,1173 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# fajar regi, 2023 +# Abe Manyo, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Indonesian (https://app.transifex.com/odoo/teams/41243/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s detik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s menit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s panggilan yang tidak dijawab" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s detik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 menit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 panggilan yang tidak dijawab" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 detik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 menit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 panggilan yang tidak dijawab" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 detik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Error hardware terjadi selagi mencoba mengakses perangkat perekam audio. " +"Mohon pastikan driver Anda sudah diupdate dan coba lagi." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Panggilan telepon yang ditangani menggunakan aplikasi VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Dibatalkan" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Panggilan ke %(phone_number)s dibatalkan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivitas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nama Kegiatan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Tambahkan ke Antrian Panggilan Telepon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Terjadi error yang melibatkan perangkat perekam audio (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Terjadi error pada instantiation Agen User:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Terjadi eror saat mencoba mengundang nomor berikut: %(phoneNumber)s\n" +"\n" +"Eror: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Apakah Anda yakin ingin menghapus kegiatan ini? Akan hilang selamanya 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Tanya" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Panggilan" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Panggilan dari %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Panggilan dari %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Panggilan dari perangkat lain" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Panggilan ditolak (alasan: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Panggilan ke %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Panggilan ke %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Menelepon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Menelepon %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Panggilan-Panggilan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Batal" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Batalkan kegiatan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Tidak dapat mengakses perangkat perekam audio. Bila Anda menolak akses ke " +"microfon Anda, mohon izinkan dan coba lagi. Jika tidak, psatikan website ini" +" menjalankan HTTPS dan bahwa browser Anda tidak disetel untuk menolak akses " +"ke perangkat media." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Ubah perangkat input" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Pilih perangkat:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Pilih metode untuk digunakan untuk memanggil nomor saat menggunakan aplikasi mobile:\n" +" • VoIP: Selalu gunakan Odoo softphone\n" +" • Telepon perangkat: Selalu gunakan telepon perangkat\n" +" • Tanya: Selalu tanya apakah softphone atau telepon perangkat yang akan digunakan\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Tutup" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Tutup Numpad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Tutup Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Tutup detail" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Pengaturan Konfigurasi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Konfirmasi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Menghubungi..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Kontak dengan nomor telepon akan ditunjukkan di sini." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Dibuat oleh" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Dibuat pada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Pelanggan" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telepon perangkat" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Arahan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nama Tampilan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Edit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Tutup Panggilan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Tanggal Berakhir" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Masukkan angka atau nama" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Masukkan angka..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Nomor Perangkat Eksterna" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Angka perangkat eksternal" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Gagal untuk memuat pustaka SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Tutup panggilan tapi tetap simpan dalam antrian" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Sabar!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Bagaimana Cara Menelepon Di Mobile" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Cara memulai panggilan telepon pada mobile" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Bila diaktifkan, panggilan masuk akan secara otomatis ditolak di Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Bila diaktifkan, memulai panggilan di Odoo akan mentransfer call ke \"Nomor " +"perangkat eksternal\". Gunakan opsi ini untuk memulai panggilan di Odoo tapi" +" menanganinya dari perangkat lain - contoh telepon meja Anda." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Bila opsi \"Panggil dari perangkat lain\" diaktifkan, panggilan yang " +"dipasang di Odoo akan ditransfer ke nomor telepon ini." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Dalam panggilan telepon selama: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Barang Masuk" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Panggilan masuk dari..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Pilihan perangkat input" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Apakah dalam Antrian Panggilan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Panggilan Telepon Terakhir Terlihat" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Terakhir Diperbarui oleh" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Terakhir Diperbarui pada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Tandai sebagai selesai" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Misklik, maaf." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Tidak dijawab" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Panggilan tidak dijawab dari %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Telepon Mobile" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Ponsel:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Mute" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Aktivitas Berikutnya" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Tidak ada perangkat perekam audio yang tersedia. Aplikasi membutuhkan " +"mikrofon agar dapat digunakan." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Tidak ada jadwal panggilan untuk hari ini 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Tidak ada hasil pencarian 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Sedang Berlangsung" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Buka Numpad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Buka Softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Keluar" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Server IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Kurang alamat PBX atau Websocket. Mohon periksa pengaturan Anda." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telepon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Nomor Telepon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telepon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Silakan terima penggunaan mikrofon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Silakan coba lagi nanti. Bila masalah berlanjut, Anda mungkin ingin meminta " +"administrator untuk memeriksa konfigurasi." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produksi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Terkini" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Pendaftaran ditolak: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Tolak panggilan masuk" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Ditolak" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Panggilan dari %(phone_number)s ditolak" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Panggilan ke %(phone_number)s ditolak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Ingat?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Hapus dari Antrian Panggilan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Penanggung Jawab" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Menelepon..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Jadwalkan & buat panggilan dari database Anda" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Jadwalkan Aktivitas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Pencarian" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Pilih metode panggilan telepon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Kirim e-mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Sebaiknya Tolak Otomatis Panggilan Masu" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Sebaiknya Panggil Dari Perangkat Lain" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Beberapa dokumen tidak dapat ditambahkan ke antrian telepon karena mereka " +"tidak memiliki nomor telepon: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Tanggal Mulai" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Status" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Beritahu kami bagaimana cara melakukan panggilan telepon:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Dihentikan" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "Alamat IP dari Server PBX Anda" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL dari WebSocket Anda" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "Hubungan WebSocket terputus dan tidak dapat dihubungkan kembali." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Error mungkin datang dari transport layer. Administrator harus memverifikasi" +" URL server websocket di Pengaturan Umum. Bila masalah berlanjut, ini " +"kemungkinan masalah dengan server." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Nama kegiatan yang terkait panggilan telepon ini, bila ada." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Nomor tidak benar, kredensial user bisa jadi salah atau hubungan tidak dapat dilakukan. Mohon periksa konfigurasi Anda.\n" +"(Alasan yang diterima: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Password yang akan digunakan untuk mendaftar dengan server PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Orang yang Anda ingin hubungi saat ini tidak tersedia." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Server gagal mengautentikasi Anda. Administrator harus memverifikasi bahwa " +"Anda sedang mencoba mencapai server yang tepat (Server IP PBX di Pengaturan " +"Umum) dan bahwa kredensial di preferensi user Anda benar." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Agen user tidak dapat dimulai. URL server websocket mungkin tidak tepat. " +"Administrator harus memeriksa URL server websocket di Pengaturan General." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Username (biasanya nomor ekstensi) akan digunakan untuk mendaftar dengan " +"server PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"Hubungan websocket dengan server hilang. Mencoba membuat kembali hubungan..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Masih ada panggilan yang berlangsung, apakah Anda yakin ingin meninggalkan " +"halaman?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transfer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transfer ke" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Buka lipatan Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Batalkan mute" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Pengguna" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Pengaturan User" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Menggunakan VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Menggunakan telepon perangkat" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Bantuan antrian QOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Konfigurasi VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Environment VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Secret VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Username VoIP / nomor ekstensi" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "VoIP / Panggilan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip Secret" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip Username" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Ya, lakukan." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Browser Anda tidak mendukung beberapa fitur yang dibutuhkan agar VoIP dapat " +"bekerja. Mohon update browser Anda atau gunakan browser lain." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Sejarah panggilan Anda kosong! Lakukan panggilan sekarang agar muncul di " +"sini 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Detail login Anda tidak ditetapkan dengan benar. Silakan hubungi " +"administrator Anda." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "kurang dari sedeti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telepon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/is.po b/voip/i18n/is.po new file mode 100644 index 0000000..b1bda64 --- /dev/null +++ b/voip/i18n/is.po @@ -0,0 +1,1116 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# jonasyngvi, 2024 +# Kristófer Arnþórsson, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Kristófer Arnþórsson, 2024\n" +"Language-Team: Icelandic (https://app.transifex.com/odoo/teams/41243/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Eyða" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Loka" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Stillingarvalkostir" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Staðfesta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Hafa samband" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Búið til af" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Búið til þann" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Viðskiptavinur" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Prufa" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Birtingarnafn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Breyta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "Auðkenni (ID)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Síðast uppfært af" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Síðast uppfært þann" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Símanúmer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Símanúmer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Hafnað" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Fylki" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Notandi" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/it.po b/voip/i18n/it.po new file mode 100644 index 0000000..0e99df5 --- /dev/null +++ b/voip/i18n/it.po @@ -0,0 +1,1183 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Sergio Zanchetta , 2023 +# Marianna Ciofani, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s sec" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minuti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s chiamate perse" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s secondi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minuto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 chiamata persa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 secondo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minuti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 chiamate perse" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 secondi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Si è verificato un errore di hardware durante il tentativo di accesso al " +"dispositivo di registrazione audio. Assicurati che i driver siano aggiornati" +" e riprova." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Una chiamata telefonica gestita con l'applicazione VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Interrotta" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Chiamata interrotta per %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Attività" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nome attività" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Aggiungi alla lista di chiamate da fare" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Si è verificato un errore che coinvolge il dispositivo di registrazione audio (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Si è verificato un errore durante la creazione di un'istanza dell'agente utente:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Si è verificato un errore durante la chiamata con il seguente numero: %(phoneNumber)s\n" +"\n" +"Errore: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Sei sicuro di voler eliminare quest'attività? Andrà persa per sempre e non " +"per pochi giorni 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Chiedi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Chiamata" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Chiamata in arrivo da %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Chiamata in arrivo da %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Chiama da un altro dispositivo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Chiamata rifiutata (motivo: \"%(reasonPhrase)s\")" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Chiama %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Chiama %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Chiamata in corso" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Chiamando %(numero di telefono)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Chiamate" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Annulla" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Annullare l'attività " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Impossibile accedere al dispositivo di registrazione audio. Se hai negato " +"l'accesso al microfono, concedi l'autorizzazione e prova di nuovo. " +"Assicurati che il sito web funzioni su HTTPS e che il tuo browser conceda " +"l'accesso ai dispositivi multimediali." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Modifica dispositivo di input" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Scegli un dispositivo:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Scegli il metodo da utilizzare per effettuare una chiamata quando usi l'app mobile:\n" +" •VoIP: utilizza sempre il softphone Odoo\n" +" •Telefono della periferica: utilizza sempre il telefono della periferica\n" +" •Chiedi: chiedi sempre se deve essere utilizzato il softphone o il telefono della periferica\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Chiudi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Chiudi tastierino numerico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Chiudi softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Chiudi dettagli" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Conferma" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Collegamento in corso..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contatto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contatti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Contatti con un numero di telefono che verrà mostrato qui." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Data creazione" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telefono della periferica" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Direzione" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documenti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Modifica" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Fine della chiamata" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Data fine" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Inserisci il numero o il nome" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Inserisci il numero..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Numero dispositivo esterno" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Numero dispositivo esterno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Caricamento dell'archivio SIP.js non riuscito:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Riagganciare ma mantenere la chiamata in coda" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Aspetta!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Come effettuare chiamate sul cellulare" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Come effettuare chiamate sul cellulare" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Se selezionato, le chiamate in arrivo verranno rifiutato automaticamente in " +"Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Se selezionato, la chiamata effettuata in Odoo verrà trasferita al \"Numero " +"del dispositivo esterno\". Utilizza questa opzione per effettura una " +"chiamata in Odoo ma gestirla da un altro dispositivo, ad es. il telefono " +"fisso." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Se l'opzione \"Chiama da un altro dispositivo\" è attiva, le chiamate in " +"Odoo verranno trasferite al numero di telefono indicato." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "In chiamata per: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "In entrata" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Chiamata in arrivo da..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Scelta dispositivo di input" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "È nella coda delle chiamate da fare" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Ultima chiamata vista" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Imposta a completata" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Ho cliccato male, scusa." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Fallito" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Chiamata persa da %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Dispositivo mobile" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Cellulare:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Silenzia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Prossime attività" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Nessun dispositivo di registrazione audio disponibile. L'applicazione " +"richiede un microfono per essere utilizzata." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Nessuna chiamata programmata per oggi 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Nessun risultato di ricerca 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "In corso" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Apri tastierino numerico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Apri softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "In uscita" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP Server PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Indirizzo PBX o websocket mancante, controllare le impostazioni." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefono" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Numero di telefono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefono:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Accettare l'utilizzo del microfono." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Per favore, riprova più tardi. Se il problema persiste, puoi chiedere ad un " +"amministratore di controllare la configurazione." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produzione" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Recente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registrazione rifiutata: %(statusCode)s %(reasonPhrase)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Rifiuta chiamate in entrata" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rifiutato" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Chiamata rifiutata da %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Chiamata rifiutata da %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Ricordi?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Rimuovi dalla coda delle chiamate da fare" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsabile" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Sta squillando..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Programma ed effettua chiamate dal tuo database" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Pianifica Attività" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Ricerca" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Seleziona un metodo per effettuare la chiamata" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Invia e-mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Dovrebbe rifiutare automaticamente chiamate in entrata" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Dovrebbe chiamare da un altro dispositivo" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Alcuni documenti non possono essere aggiunti alla coda delle chiamate perché" +" non hanno un numero di telefono configurato: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Data inizio" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stato" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Spiegaci come effetuare la chiamata:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Terminata" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "Indirizzo IP del server PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "L'URL del tuo WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" +"La connessione WebSocket è stata persa e non è stato possibile ristabilirla." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"L'errore potrebbe provenire dal livello di trasporto. Chiedi " +"all'amministratore di verificare l'URL del server websocket dalle " +"Impostazioni. Se il problema persiste si tratta probabilmente di un problema" +" del server." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" +"Il nome dell'attività collegata a questa chiamata telefonica, se presente." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Il numero non è corretto, le credenziali dell'utente potrebbero essere errate o non è possibile stabilire una connessione. Controlla la configurazione.\n" +"(Motivo ricezione: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" +"La password che verrà utilizzata per la registrazione con il server PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "La persona che cerchi di contattare non disponibile al momento." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Il server non è riuscito ad autenticarti. Chiedi ad un amministratore di " +"verificare che stai cercando di raggiungere il server giusto (IP server PBX " +"nelle Impostazioni) e che le credenziali nelle preferenze utente siano " +"corrette." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Non è stato possibile avviare l'agente utente. L'URL del server websocket è " +"sbagliato. Chiedi ad un amministratore di verificare l'URL del server " +"websocket nelle Impostazioni." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Il nome utente (tipicamente il numero di estensione) che verrà utilizzato " +"per la registrazione con il server PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"La connessione websocket al server è stata persa. Tentativo di ristabilire " +"la connessione..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Sei sicuro di voler lasciare la pagina con una chiamata ancora in corso?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Trasferisci" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Trasferire" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Espandi softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Riattiva audio" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Utente" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Impostazioni utente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Utilizzano VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Utilizzando telefono dispositivo" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Assistenza coda VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VOIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Configurazione VOIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Ambiente VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Chiave privata VOIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nome utente/numero di estensione VOIP " + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip/chiamate" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Secret Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Nome utente Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Sì, fallo." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Il tuo browser non supporta alcune delle funzionalità necessarie per il " +"VoIP. Prova ad aggiornare il browser o utilizzane uno diverso." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"La cronologia delle chiamate è vuota! Effettua una chiamata ora e conservala" +" nell'elenco qui 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Le credenziali non sono state impostate correttamente, contatta " +"l'amministratore." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "meno di un secondo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefono" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/ja.po b/voip/i18n/ja.po new file mode 100644 index 0000000..fe52b15 --- /dev/null +++ b/voip/i18n/ja.po @@ -0,0 +1,1136 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Junko Augias, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Japanese (https://app.transifex.com/odoo/teams/41243/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s 分 %(seconds)s 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s分" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s 不在着信" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s秒 " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1分" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "不在着信1" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2分" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "不在着信2" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "オーディオ録音デバイスへのアクセス中にハードウェアエラーが発生しました。ドライバが最新であることを確認し、再度お試し下さい。" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "VoIPアプリケーションを使用して処理される電話" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "中断済" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "%(phone_number)sへの中断された通話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "活動" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "活動名称" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "コールキューに追加" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"音声録画デバイス利用中にエラーが発生しました(%(errorName)s): \n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"ユーザエージェントのインスタンス生成中にエラーが発生しました:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"次の番号を招待しようとしてエラーが発生しました: %(phoneNumber)s\n" +"\n" +"エラー: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr " この活動を本当に削除しますか? 削除後は復元できません😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "確認" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "バックスペース" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "通話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr " %(correspondent)sからの通話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr " %(phone_number)sからの通話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "他のデバイスから電話する" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "着信拒否 (理由: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr " %(correspondent)sへの通話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr " %(phone_number)sへの通話" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "呼出中" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr " 発信中 %(電話番号)" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "通話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "取消" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "活動を取消する" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"音声録音デバイスにアクセスできません。マイクへのアクセスを拒否している場合は、許可してからもう一度お試し下さい。そうでない場合は、このウェブサイトがHTTPSで実行され、ブラウザがメディアデバイスへのアクセスを拒否するよう設定されていないことを確認して下さい。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "インプットデバイスを変える" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "デバイスを選択:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"モバイルアプリケーションを使用する際に電話をかける方法を選択して下さい:\n" +"- VoIP: 常にOdooソフトフォンを使用\n" +"- デバイス電話:常にデバイス電話を使用\n" +"- 確認:ソフトフォンかデバイス電話のどちらを使用するか常に確認" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "閉じる" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "テンキーを閉じる" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "ソフトフォンを閉じる" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "詳細を閉じる" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "コンフィグ設定" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "確認" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "接続しています..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "連絡先" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "連絡先" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "電話番号のある連絡先はここに表示されます" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "作成者" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "作成日" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "顧客" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "デモ" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "デバイスの電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "方向" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "表示名" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "書類" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "編集" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "通話終了" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "終了日" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "番号または名前を入力してください" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "番号を入力して下さい..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "外部デバイス番号" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "外部デバイス番号" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"SIP.jsライブラリのロードに失敗しました:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "電話を切りますが、通話をキューに入れます" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "お待ち下さい!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "携帯電話での通話方法" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "携帯電話での通話方法" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "有効にすると、Odooで着信が自動的に拒否されます。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"有効にすると、Odooで電話をかける場合に「外部デバイス番号」に電話が転送されます。このオプションを使用すると、Odooで電話をかけても、他のデバイス(例:デスクホンなど)から対応することができます。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "\"別のデバイスから電話をかける\" オプションが有効な場合、Odooでかけた電話はこの電話番号に転送されます。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "通話時間: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "入荷" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "以下からの着信..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "インプットデバイス選択" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "コールキューの有無" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "最後に見た電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "最終更新者" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "最終更新日" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "完了とする" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "誤ってクリックしました。申し訳ありません。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "不在" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "%(phone_number)sからの不在着信" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "モバイル" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "携帯電話:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "ミュート" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "次の活動" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "音声録音デバイスがありません。このアプリケーションを使用するにはマイクが必要です。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "今日は予定されている通話はありません 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "検索結果がありません💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "処理中" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "テンキーを開く" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "ソフトフォンを開く" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "出庫" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBXサーバIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBXまたはWebsocketアドレスがありません。設定を確認してください。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "電話番号" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "電話:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "マイクの使用を承諾してください。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "後でもう一度試してください。問題が解決しない場合は、管理者に設定を確認してもらいましょう。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "製造" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "最近の" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "登録が拒否されました: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "着信を拒否" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "拒否済" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr " %(phone_number)sを着信拒否" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr " %(phone_number)sを着信拒否" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "覚えていますか?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "コールキューから削除" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "担当者" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "呼出中..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "データベースから電話をスケジュールして発信する" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "活動をスケジュール" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "検索" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "電話方法を選択" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Eメールを送信" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "着信を自動拒否する必要があります" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "他のデバイスから電話する必要があります" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "電話番号が設定されていないため、コールキューに追加できないドキュメントがあります: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "開始日" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "都道府県・州" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "どのように電話するかをご説明下さい:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "終了済" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "PBXサーバのIPアドレス" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "ウェブソケットのURL" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "WebSocket 接続が失われ、再確立できませんでした。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"このエラーはトランスポート層から発生している可能性があります。管理者は一般設定でウェブソケットサーバのURLを確認して下さい。問題が解決しない場合は、サーバの問題である可能性があります。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "もしあれば、この通話に関連する活動の名前。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "番号が正しくないか、ユーザー認証が間違っているか、接続できない可能性があります。(設定を確認して下さい%(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "PBXサーバーでの登録に使用するパスワードです。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "連絡しようとした相手は現在不在です。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"サーバの認証に失敗しました。正しいサーバ(一般設定のPBXサーバーIP)に到達していること、およびユーザ設定の認証情報が正しいことを管理者に確認してもらって下さい。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"ユーザエージェントが起動できませんでした。ウェブソケットサーバーのURLが正しくない可能性があります。管理者に一般設定でウェブソケットサーバーのURLを確認してもらって下さい。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "PBXサーバーへの登録に使用するユーザー名(通常は内線番号)です。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "サーバへのウェブソケット接続が切断されました。接続を再確立を試みています..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "まだ通話中ですが、本当にページを離れてもよろしいですか?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "移動" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "以下へ転送:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "ソフトフォンを開く" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "ミュート解除" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "ユーザ" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "ユーザ設定" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "VoIPを使用" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "デバイス電話を使用" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIPキューサポート" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP設定" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP環境" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP secret" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP ユーザー名 / 内線番号" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / 通話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voipシークレット" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voipユーザ名" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "ウェブソケット" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "はい、行って下さい。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "お使いのブラウザは、VoIPの動作に必要な機能の一部をサポートしていません。ブラウザを更新するか、別のブラウザを使用して下さい。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr " 通話履歴がありません!今すぐ電話をかけて、ここに表示させましょう💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "資格情報が正しく設定されていません。管理者に連絡して下さい。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "1秒以下" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "電話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/ka.po b/voip/i18n/ka.po new file mode 100644 index 0000000..679b18b --- /dev/null +++ b/voip/i18n/ka.po @@ -0,0 +1,1140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +# Saba Khmaladze , 2018 +# Giorgi Melitauri , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Giorgi Melitauri , 2018\n" +"Language-Team: Georgian (https://www.transifex.com/odoo/teams/41243/ka/)\n" +"Language: ka\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "შეწყვეტა" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "გაუქმებულია" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "კონტაქტი" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "შემქმნელი" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "შექმნის თარიღი" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "შექმნის თარიღი" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "კლიენტი" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "თარიღ" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "სახელი" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "დაჯგუფება" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "იდენტიფიკატორი" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "ბოლოს განაახლა" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "ბოლოს განახლებულია" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "მიმდევრობა" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "სტატუსი" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/kab.po b/voip/i18n/kab.po new file mode 100644 index 0000000..339d791 --- /dev/null +++ b/voip/i18n/kab.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Kabyle (https://www.transifex.com/odoo/teams/41243/kab/)\n" +"Language: kab\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Sefsex" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Ifsax" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Yerna-t" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Yerna di" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Azemz n tmerna" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Amsaɣ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Sdukel s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "Asulay" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Aleqqem aneggaru sɣuṛ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Aleqqem aneggaru di" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Agzum" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Addad" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/km.po b/voip/i18n/km.po new file mode 100644 index 0000000..60d8fae --- /dev/null +++ b/voip/i18n/km.po @@ -0,0 +1,1141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Sengtha Chay , 2018 +# Chan Nath , 2018 +# Samkhann Seang , 2018 +# AN Souphorn , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2018-09-21 14:06+0000\n" +"Last-Translator: AN Souphorn , 2018\n" +"Language-Team: Khmer (https://www.transifex.com/odoo/teams/41243/km/)\n" +"Language: km\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "សកម្មភាព" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "លុបចោល" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "បានលុបចោល" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "បិទ" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "ទំនាក់ទំនង" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "បង្កើតដោយ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "បង្កើតនៅ" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "ថ្ងៃបង្កើត" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "អតិថិជន" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "កាលបរិច្ឆេត" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "ឈ្មោះសំរាប់បង្ហាញ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "ជា​ក្រុម​តាម" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "ផ្លាស់ប្តូរចុងក្រោយ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "ផ្លាស់ប្តូរចុងក្រោយ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "កំណត់សំគាល់" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "ទូរស័ព្ទ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "លំដាប់" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/ko.po b/voip/i18n/ko.po new file mode 100644 index 0000000..9850640 --- /dev/null +++ b/voip/i18n/ko.po @@ -0,0 +1,1148 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# JH CHOI , 2023 +# Sarah Park, 2023 +# Daye Jeong, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s분 %(seconds)s초" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s 분" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "부재중 전화 %(number)s통" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s초" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 분" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "부재중 전화 1" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 초" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 분" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "부재중 전화 2" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 초" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "오디오 녹음 장치에 액세스하는 동안 하드웨어 오류가 발생했습니다. 드라이버가 최신 버전인지 확인한 후 다시 시도하세요." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "VoIP 애플리케이션을 사용한 전화 통화" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "중단됨" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "%(phone_number)s로의 통화 중단됨" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "활동" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "활동명" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "통화 대기열에 추가" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"오디오 녹음 장치와 관련된 오류가 발생했습니다 (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"사용자 에이전트를 인스턴스화하는 중에 오류가 발생했습니다.:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"다음 전화번호의 사용자를 초대하는 동안 오류가 발생했습니다: %(phoneNumber)s\n" +"\n" +"오류: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "이 활동을 삭제하시겠습니까? 삭제 후에는 복구할 수 없습니다.😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "물어보기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "백스페이스" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "전화" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "%(correspondent)s으로부터의 전화" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "%(phone_number)s으로부터의 전화" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "다른 기기에서 통화" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "수신 거부됨 (사유: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "%(correspondent)s으로 전화" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "%(phone_number)s으로 전화" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "전화 중" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "%(phone number)s로 전화" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "전화" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "취소" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "활동 취소" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"오디오 녹음 장치에 액세스할 수 없습니다. 마이크에 대한 권한 설정이 거부된 경우 마이크 권한을 허용하고 다시 시도해 주세요. 그렇지 " +"않은 경우 이 웹사이트가 HTTPS를 통해 실행되고, 브라우저에서 미디어 디바이스에 대한 액세스를 거부하도록 설정되어 있지 않은지 확인해" +" 주세요." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "입력 장치 변경하기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "디바이스 선택:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"모바일 앱에서 전화를 걸 때 사용하는 방법을 선택합니다:\n" +" • VoIP: 항상 Odoo 소프트폰을 사용\n" +" • 전화: 항상 기기의 기본 전화 기능 사용\n" +" • 물어보기: 소프트폰 또는 기본 전화 중 어떤 방법을 사용할 지 항상 확인\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "닫기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "숫자패드 닫기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "소프트폰 닫기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "세부사항 닫기" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "환경 설정" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "승인" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "연결 중 ..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "연락처" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "연락처" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "전화번호가 포함된 연락처가 여기에 표시됩니다." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "작성자" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "작성일자" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "고객" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "데모" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "기본 전화" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "방향" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "표시명" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "문서" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "편집" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "통화 종료" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "종료일" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "번호 또는 이름을 입력하세요" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "번호를 입력하세요..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "외부 장치 번호" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "외부 전화번호" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"SIP.js 라이브러리를 불러오지 못했습니다:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "전화를 끊고 통화를 계속 유지" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "잠시만요!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "모바일로 전화하는 방법" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "모바일에서 전화를 거는 방법" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "활성화하면 Odoo에서 수신 전화를 자동으로 거절합니다." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"활성화 시 Odoo에서 전화를 걸 때 통화가 '외부 전화번호'로 전송됩니다. 이 옵션을 사용하면 Odoo에서 전화를 걸어도 다른 기기 " +"(예: 사무실 전화)로 연결됩니다." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "\"다른 장치에서 전화\" 옵션을 활성화하면 Odoo로 걸려온 전화가 이 전화 번호로 전송됩니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "전화 중: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "수신" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "수신 전화..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "입력 장치 선택" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "통화 대기열에 넣을 지 여부" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "마지막으로 확인한 전화" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "최근 갱신한 사람" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "최근 갱신 일자" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "완료" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "잘못 눌렀습니다, 죄송합니다." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "놓침" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "%(phone_number)s의 부재중 전화" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "휴대폰 번호" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "휴대전화 :" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "소리 끄기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "다음 활동" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "오디오 녹음 장치를 사용할 수 없습니다. 앱을 사용하려면 마이크가 필요합니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "오늘 예정된 통화가 없습니다. 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "검색 결과가 없습니다. 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "진행중" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "넘버패드 열기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "소프트폰 열기" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "출고" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBS 서버 IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX 또는 웹 소켓 주소가 없습니다. 설정을 확인하십시오." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "전화번호" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "전화번호" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "전화 :" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "마이크 사용을 수락하십시오." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "나중에 다시 시도해 주세요. 문제가 지속되면 관리자에게 설정 사항을 확인해 달라고 요청할 수 있습니다." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "생산" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "최근" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "등록 거부됨: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "수신 전화 거부" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "거부됨" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "%(phone_number)s의 전화가 거부됨" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "%(phone_number)s의 통화가 거부됨" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "기억할까요?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "통화 대기열에서 제거" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "담당자" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "전화 거는 중..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "데이터베이스에서 일정 예약 및 전화 걸기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "활동 계획표" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "검색" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "통화 수단 선택" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "이메일 전송" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "수신 전화 자동 거부" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "다른 디바이스에서 통화해야 하는 경우" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "일부 문서에는 전화 번호가 설정되어 있지 않아 통화 대기열에 추가할 수 없습니다: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "시작일" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "시/도" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "전화거는 방법을 알려주세요:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "종료됨" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "PBX 서버의 IP 주소" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "웹소켓 URL" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "WebSocket 연결이 끊어져 다시 설정할 수 없습니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"전송 계층에서 오류가 발생했을 수 있습니다. 관리자에게 일반 설정에서 웹소켓 서버 URL을 확인하도록 요청하세요. 문제가 지속되면 서버에" +" 문제가 있는 것일 수 있습니다." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "이 전화 통화와 관련된 활동의 이름이 있는 경우, 이를 입력합니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"번호 또는 사용자 자격 증명이 잘못되었거나 연결할 수 없습니다 .설정을 다시 확인해 주세요.\n" +"(사유: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "PBX 서버에 등록하는 데 사용되는 비밀번호입니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "수신자가 현재 전화를 받으실 수 없습니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"서버가 사용자를 인증하지 못했습니다. 관리자에게 올바른 서버(일반 설정의 PBX 서버 IP)에 연결되었는지, 사용자 자격 증명이 올바르게" +" 설정되었는지 확인하도록 요청하세요." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"사용자 에이전트를 시작하지 못했습니다. 웹소켓 서버의 URL이 잘못되었을 수 있습니다. 관리자 계정으로 일반 설정에서 웹소켓 서버 " +"URL을 확인하세요." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "PBX 서버에 등록하는 데 사용되는 사용자 이름 (일반적으로 내선 번호)입니다." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "서버에 대한 웹소켓 연결이 끊어졌습니다. 연결을 다시 설정하려고 시도 중입니다..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "아직 통화가 진행 중입니다. 페이지에서 나가시겠습니까?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "전송" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "다음으로 이동" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "소프트폰 펼치기" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "소리 켜기" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "사용자" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "사용자 설정" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "VoIP 사용" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "장치의 휴대폰 사용" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP 대기열 지원" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP 설정" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP 환경" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP 암호" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP 사용자 이름 / 내선 번호" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / 통화" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "VoIP 암호" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "VoIP 사용자 이름" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "웹소켓" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "네, 그렇게 하세요." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"사용 중인 브라우저가 VoIP 작동에 필요한 일부 기능을 지원하지 않습니다. 브라우저를 업데이트하거나 다른 브라우저를 이용해 주세요." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "통화 내역이 없습니다! 지금 전화를 걸어 통화 목록을 만드세요. 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "로그인 정보가 올바르게 설정되지 않았습니다. 관리자에게 문의하십시오." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "1초 미만" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "전화" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/lb.po b/voip/i18n/lb.po new file mode 100644 index 0000000..2a07196 --- /dev/null +++ b/voip/i18n/lb.po @@ -0,0 +1,1135 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~12.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2019-08-26 09:38+0000\n" +"Language-Team: Luxembourgish (https://www.transifex.com/odoo/teams/41243/lb/)\n" +"Language: lb\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/lo.po b/voip/i18n/lo.po new file mode 100644 index 0000000..c8acb7c --- /dev/null +++ b/voip/i18n/lo.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Lao (https://www.transifex.com/odoo/teams/41243/lo/)\n" +"Language: lo\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "ຍົກເລີອກ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "ຍົກເລີກ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "ຄຸ່ຄ້າ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "ສະພາບ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/lt.po b/voip/i18n/lt.po new file mode 100644 index 0000000..3748752 --- /dev/null +++ b/voip/i18n/lt.po @@ -0,0 +1,1128 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Ramunė ViaLaurea , 2023 +# Arminas Grigonis , 2023 +# grupoda2 , 2023 +# Arunas V. , 2023 +# digitouch UAB , 2023 +# UAB "Draugiški sprendimai" , 2023 +# Anatolij, 2023 +# Antanas Muliuolis , 2023 +# Audrius Palenskis , 2023 +# Martin Trigaux, 2023 +# Donatas , 2023 +# Linas Versada , 2023 +# Monika Raciunaite , 2023 +# Jonas Zinkevicius , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Jonas Zinkevicius , 2024\n" +"Language-Team: Lithuanian (https://app.transifex.com/odoo/teams/41243/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Veikla" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Grįžimo klavišas" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Skambutis" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Paskambinti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Atšaukti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Atšaukti veiklą" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Uždaryti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigūracijos nustatymai" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Patvirtinti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontaktas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontaktai" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Sukūrė" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Sukurta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klientas" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Kryptis" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Rodomas pavadinimas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumentai" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Redaguoti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Pabaigos data" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Atvykstanys" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Paskutinį kartą atnaujino" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Paskutinį kartą atnaujinta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Pažymėti kaip atliktą" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobilus" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobilus tel.:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Kitos veiklos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Vykstantis" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Išeinantys" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefonas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefono numeris" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefonas:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Gamyba" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Atmesta" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Atsakingas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Suplanuoti veiklą" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Paieška" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Darbo pradžios data" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Būsena" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Perkelti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Vartotojas" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "Telefono numeris" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/lv.po b/voip/i18n/lv.po new file mode 100644 index 0000000..64d27d1 --- /dev/null +++ b/voip/i18n/lv.po @@ -0,0 +1,1120 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Armīns Jeltajevs , 2023 +# Anzelika Adejanova, 2023 +# Arnis Putniņš , 2023 +# Martin Trigaux, 2023 +# JanisJanis , 2023 +# ievaputnina , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: ievaputnina , 2023\n" +"Language-Team: Latvian (https://app.transifex.com/odoo/teams/41243/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivitāte" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Zvans" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Atcelt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Aizvērt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurācijas uzstādījumi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Apstiprināt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontaktpersona" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Izveidoja" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Izveidots" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klients" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Virziens" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Attēlotais nosaukums" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Labot" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Beigu datums" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Ienākoša" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Pēdējoreiz atjaunināja" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Pēdējoreiz atjaunināts" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Atzīmēt kā pabreigtu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Nokavēts" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobilais tālr." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobilais tālr.:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Izslēgt skaņu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Nākamās darbības" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Ongoing" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Izejoša" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefons" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefons:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Ražošana" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Noraidīts" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Atbildīgais" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Ieplānot aktivitāti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Meklēt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Sākuma datums" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stadija" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transfer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Ieslēgt skaņu" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Lietotājs" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Lietotāja iestatījumi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/mk.po b/voip/i18n/mk.po new file mode 100644 index 0000000..e15cdc2 --- /dev/null +++ b/voip/i18n/mk.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Macedonian (https://www.transifex.com/odoo/teams/41243/mk/)\n" +"Language: mk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Откажи" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Откажано" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Креирано од" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Креирано на" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Датум на креирање" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Купувач" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Прикажи име" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Групирај по" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Последно ажурирање од" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Последно ажурирање на" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Секвенца" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Статус" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/ml_IN.po b/voip/i18n/ml_IN.po new file mode 100644 index 0000000..d367e74 --- /dev/null +++ b/voip/i18n/ml_IN.po @@ -0,0 +1,1137 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Odoo 9.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2015-09-07 15:13+0000\n" +"Last-Translator: <>\n" +"Language-Team: Malayalam (India) (http://www.transifex.com/odoo/odoo-9/language/ml_IN/)\n" +"Language: ml_IN\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "രൂപപ്പെടുത്തിയത്" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "നിർമിച്ച ദിവസം" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "അവസാനം അപ്ഡേറ്റ് ചെയ്തത്" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "അവസാനം അപ്ഡേറ്റ് ചെയ്ത ദിവസം" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/mn.po b/voip/i18n/mn.po new file mode 100644 index 0000000..3471fa7 --- /dev/null +++ b/voip/i18n/mn.po @@ -0,0 +1,1150 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Batmunkh Ganbat , 2022 +# Khoschuluu Khuderchuluu , 2022 +# hish, 2022 +# Bayarkhuu Bataa, 2022 +# Батмөнх Ганбат , 2022 +# Minj P , 2022 +# Uuganbayar Batbaatar , 2022 +# Martin Trigaux, 2022 +# Baskhuu Lodoikhuu , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Baskhuu Lodoikhuu , 2022\n" +"Language-Team: Mongolian (https://app.transifex.com/odoo/teams/41243/mn/)\n" +"Language: mn\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "Хэргийн #" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "Зөвшөөрөх" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Ажилбар" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Дуудлагын хүлээлгэ рүү нэмэх" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Дуудлагын цуваа үүсгэх" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Асуух" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "Зураг" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "Арилгах" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "Дуудлага" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "Дуудлагын огноо" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "Дуудлагын нэр" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "Дуудлага хийх %s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "Дуудлагын огноо" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Цуцлах" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Ажилбарыг цуцлах" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Цуцлагдсан" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "Түгжээг тайлахын тулд дар" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "Хаах" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Тохиргооны тохируулга" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Харилцах хаяг" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "Харилцах хаяг" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Үүсгэсэн этгээд" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Үүсгэсэн огноо" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Үүсгэсэн огноо" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Үйлчлүүлэгч" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Огноо" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Туршилтын хувилбар" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "Чиглэл" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Дэлгэрэнгүй нэр" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "Баримт" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "Дахин товлохгүй" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Эцсийн огноо" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Үргэлжлэх хугацаа" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "Үргэлжлэх хугацаа минутаар." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Засах" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "Дугаараа оруулна уу..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "Утасны дуудлагын жагсаалтанд байрлах эрэмбийг тогтооно." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Бүлэглэлт" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "Ярьсан" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "1 долоо хоногийн дотор" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "15 өдрийн дотор" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "2 сарын дотор" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "Дуудлага хүлээлгэнд байна" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "Уг дуудлагын дараа дахин үргэлжлүүлэх шаардлагатай бол шинэ дуудлага, уулзалт төлөвлөх хэрэгтэй." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "Ирж буй" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "Дуудлага ирсэн %s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "Дуудлага ирсэн %s (%s)" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Дуудлага хүлээлгэнд байна" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "Товчлуур" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Сүүлд зассан этгээд" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Сүүлд зассан огноо" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "Холбоотой ажилбар" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "Холбоотой ЧАТ-ын зурвасууд" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "Холбоотой Voip дуудлагууд" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "Дуудлагын хураангуй агуулгыг тэмдэглэх" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "Лог хөтөлж буй дуудлага" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Дууссанд тооцох" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "Аваагүй" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "Аваагүй дуудлага %s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "Гар утас" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "Гар утасны дугаар (улсын кодтой)" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Гар утас:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "Дуу хаах" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "Миний дуудлагууд" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "Яриагүй" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Тэмдэглэл" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "Odoo систем танд үйлчлүүлэгчтэй хийсэн харилцаа холбооны түүх хөтлөх, багийн өөр гишүүдэд мэдээллэх зорилгоор ирж буй дуудлагын лог үүсгэх боломжыг олгоно." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "Гарч буй" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX серверийн IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX эсвэл Websocket хаяг гэмтсэн байна.Өөрийн тохиргоог шалгана уу" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "Хүлээгдэж буй" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "Утас" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "Утасны дугаар (улсын кодтой)" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Утас:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "Дуудлагын дэлгэрэнгүй" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "Утасны дуудлага" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Микрофон ашиглахыг хүлээн авна үү " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Үйлдвэрлэл" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "Самбарыг дахин шинэчлэх" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "Татгалзах" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "Дуудлагаас татгалзах" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "Түтгэлзүүлсэн" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "Ирсэн дуудлагаас татгалзсан %s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Дуудлагын хүлээлгээс хасах" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "Хүлээлгээс хасах" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "Хариуцагч" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "Дуудаж байна..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "Шинэ ажилбар товлох" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Ажилбар товлох" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "Товлолт дараах" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "Хайх" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "Утасны дуудлага хайх" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "Шуудан илгээх" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Дугаарлалт" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "Тусгай огноо" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "Эхэлсэн цаг" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Төлөв" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "Хураангуй" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "Дуудлага авах" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Таны WebSocket - н URL " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "Энэ дуудлага ямар нэг дугааргүй байна" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" +"Утасны дуудлага шинээр үүсгэхэд Товлогдсон төлөвтэй болно.\n" +"Дуудлага хийж дуусахад төлөв нь Ярьсан болно.\n" +"Хэрэв дуудлага нь холбогдох боломжгүй байвал Цуцлагдсан төлөвтэй болно." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "Товлогдсон" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "Маргааш" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "Шилжүүлэг" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "Хуваарилаагүй" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Хэрэглэгч" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "VOIP дуудлага" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "VOIP дуудлагын лог хөтлөх цонх" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "VOIP дуудлагын тайлан хэрэглэгчээр" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP орчин" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "Та аль хэдийнээ дуудлага хийж байна" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "Таны интернет хөтөч WebRTC -г дэмжихгүй байна. Тохиргоогоо шалгана уу." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "Таны итгэмжлэх буруу тохируулагдсан байна .Та өөрийн администратортой холбогдоно уу" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "мин" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "сек" diff --git a/voip/i18n/my.po b/voip/i18n/my.po new file mode 100644 index 0000000..2290aa3 --- /dev/null +++ b/voip/i18n/my.po @@ -0,0 +1,1140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Myat Thu , 2016 +# Chester Denn , 2016 +# Hein Myat Phone , 2016 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.0e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2016-09-07 09:57+0000\n" +"Last-Translator: Hein Myat Phone , 2016\n" +"Language-Team: Burmese (https://www.transifex.com/odoo/teams/41243/my/)\n" +"Language: my\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "တည်ဆောက်သူ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "တည်ဆောက်သည့်အချိန်" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "ပြချင်သော အမည်" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "နံပါတ်" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "နောက်ဆုံးပြင်ဆင်သူ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "နောက်ဆုံးပြင်ဆင်ချိန်" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/nb.po b/voip/i18n/nb.po new file mode 100644 index 0000000..6e7d859 --- /dev/null +++ b/voip/i18n/nb.po @@ -0,0 +1,1120 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Thor Arne Hvidsten , 2024 +# Jan Pedro Tumusok , 2024 +# Jorunn D. Newth, 2024 +# Henning Fyllingsnes, 2024 +# Marius Stedjan , 2024 +# Martin Trigaux, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Martin Trigaux, 2024\n" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/odoo/teams/41243/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivitet" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Ring" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Avbryt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Kanseller aktiviteten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Lukk" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Innstillinger" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Bekreft" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Opprettet av" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Opprettet den" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kunde" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Retning" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Visningsnavn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Rediger" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Avslutningsdato" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Innkommende" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Sist oppdatert av" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Sist oppdatert" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marker som fullført" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Neste aktiviteter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Pågående" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Utgående" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX server-IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefonnummer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produksjon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "vvist" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Ansvarlig" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planlegg aktivitet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Søk" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Startdato" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Fylke" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Overføring" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Bruker" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/ne.po b/voip/i18n/ne.po new file mode 100644 index 0000000..deb55d4 --- /dev/null +++ b/voip/i18n/ne.po @@ -0,0 +1,1140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Bishisht Bhatta , 2017 +# Amit Kumar , 2018 +# Laxman Bhatt , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Laxman Bhatt , 2018\n" +"Language-Team: Nepali (https://www.transifex.com/odoo/teams/41243/ne/)\n" +"Language: ne\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "गतिविधि" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "रद्द गर्नुहोस्" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "सम्पर्क" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "द्वारा सिर्जना गरियो" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "मा सिर्जना गरियो" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "ग्राहक" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "मिति" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "नाम प्रदर्शन " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "उत्पादन" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "अनुक्रम" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "स्थिति" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/nl.po b/voip/i18n/nl.po new file mode 100644 index 0000000..3ecdd69 --- /dev/null +++ b/voip/i18n/nl.po @@ -0,0 +1,1187 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Yenthe Van Ginneken , 2023 +# Erwin van der Ploeg , 2023 +# Jolien De Paepe, 2024 +# Manon Rondou, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s sec" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minuten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s gemiste oproepen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s seconden" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minuut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 gemiste oproep" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 seconde" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minuten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 gemiste oproepen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 seconden" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Er is een hardwarefout opgetreden bij het proberen toegang te krijgen tot " +"het audio-opnameapparaat. Zorg ervoor dat je stuurprogramma's up-to-date " +"zijn en probeer het opnieuw." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" +"Een telefoongesprek dat wordt afgehandeld met behulp van de VoIP-toepassing" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Rudimentair" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Afgebroken gesprek naar %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Activiteit" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Naam activiteit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Aan de wachtrij toevoegen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Er is een fout opgetreden met betrekking tot het audio-opnameapparaat (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Er is een fout opgetreden tijdens het starten van de User Agent:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Er is een fout opgetreden bij het uitnodigen van het volgende telefoonnummer: %(phoneNumber)s\n" +"\n" +"Fout: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Weet je zeker dat je deze activiteit wilt verwijderen? Het zal voor altijd " +"verloren gaan, wat best lang 😔 is" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Vraag" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Bellen" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Telefoontje van %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Telefoontje van %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Bellen vanaf een ander apparaat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Oproep geweigerd (reden: \"%(reasonPhrase)s\")" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Bel naar %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Bel naar %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Wordt gebeld" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "%(phone number)s opbellen" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Bellen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Annuleren" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Annuleer de activiteit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Geen toegang tot audio-opnameapparaat. Als je de toegang tot je microfoon " +"hebt geweigerd, geef dit dan toe en probeer het opnieuw. Zorg er anders voor" +" dat deze website via HTTPS draait en dat je browser niet is ingesteld om de" +" toegang tot media-apparaten te weigeren." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Invoerapparaat wijzigen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Kies een apparaat:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Kies de methode die moet worden gebruikt om te bellen bij gebruik van de mobiele applicatie:\n" +" • VoIP: gebruik altijd de Odoo-softphone\n" +" • Telefoon van apparaat: gebruik altijd de telefoon van het apparaat\n" +" • Vragen: altijd vragen of de softphone of de telefoon van het apparaat moet worden gebruikt\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Afsluiten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Numpad sluiten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Softphone sluiten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Sluit details" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Configuratie instellingen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Bevestigen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Verbinden…" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contact" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contacten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Contacten met een telefoonnummer worden hier weergegeven." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klant" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telefoon van apparaat" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Richting" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Schermnaam" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documenten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Bewerken" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Einde gesprek" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Einddatum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Voer nummer of naam in" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Voer het nummer in..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Nummer extern apparaat" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Nummer extern apparaat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Het laden van de SIP-.js-bibliotheek is mislukt:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Hang op maar hou gesprek in wachtrij" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Wachten!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Hoe op mobiel bellen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Hoe te bellen op mobiel" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Indien ingeschakeld, worden inkomende oproepen automatisch geweigerd in " +"Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Indien ingeschakeld, zal het plaatsen van een oproep in Odoo de oproep " +"doorverbinden naar het \"Externe apparaatnummer\". Gebruik deze optie om de " +"oproep in Odoo te plaatsen maar af te handelen vanaf een ander apparaat - " +"b.v. je bureautelefoon." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Als de optie \"Bellen vanaf een ander apparaat\" is ingeschakeld, worden " +"oproepen die in Odoo zijn geplaatst, doorgeschakeld naar dit telefoonnummer." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "In oproep voor: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Inkomend" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Inkomende oproep van..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Selectie invoerapparaat" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Staat in de wachtrij" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Laatst geziene telefoontje" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Markeren als gereed" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Gemist, sorry." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Gemist" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Gemiste oproep van %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobiel" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobiel:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Dempen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Volgende activiteiten" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Geen audio-opnameapparaat beschikbaar. De applicatie vereist een microfoon " +"om te kunnen worden gebruikt." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Geen oproepen gepland voor vandaag 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Geen zoekresultaten 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Lopend" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Numpad openen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Softphone openen" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Uitgaand" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP-adres telefooncentrale" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX of Webstocket adres ontbreekt. Controleer je instellingen." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefoon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefoonnummer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefoon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Accepteer het gebruik van de microfoon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Probeer het later opnieuw. Als het probleem zich blijft voordoen, kun je een" +" beheerder vragen om de configuratie te controleren." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Productie" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Recent" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registratie afgewezen: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Inkomende oproepen weigeren" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Afgewezen" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Geweigerde oproep van %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Afgewezen oproep naar %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Weet je nog?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Uit de wachtij verwijderen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Verantwoordelijke" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Beltoon..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Plannen & bellen vanuit je database" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Activiteit inplannen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Zoeken" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Selecteer een oproepmethode" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Stuur e-mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Moeten inkomende oproepen automatisch weigeren" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Moet vanaf een ander apparaat bellen" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Sommige documenten kunnen niet worden toegevoegd aan de wachtrij omdat er " +"geen telefoonnummer is ingesteld: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Begindatum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Status" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Vertel ons hoe je kunt bellen:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Beeindigd" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "Het IP-adres van je PBX-server" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "De URL van je websocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" +"De WebSocket-verbinding is verbroken en kon niet opnieuw tot stand worden " +"gebracht." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"De fout kan afkomstig zijn van de transportlaag. Laat een beheerder de " +"websocket-server-URL verifiëren in de Algemene instellingen. Als het " +"probleem aanhoudt, is dit waarschijnlijk een probleem met de server." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" +"De naam van de activiteit met betrekking tot dit telefoongesprek, indien van" +" toepassing." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Het nummer is onjuist, de gebruikersgegevens kunnen onjuist zijn of de verbinding kan niet tot stand worden gebracht. Controleer je configuratie.\n" +"(Reden ontvangen: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" +"Het wachtwoord dat zal worden gebruikt om te registreren bij de PBX-server." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" +"De persoon die je probeert te bereiken, is momenteel niet beschikbaar." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"De server heeft je niet kunnen verifiëren. Laat een beheerder controleren of" +" je de juiste server bereikt (PBX-server-IP in de algemene instellingen) en " +"dat de inloggegevens in je gebruikersvoorkeuren correct zijn." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"De user-agent kan niet worden gestart. De URL van de websocket-server is " +"mogelijk onjuist. Laat een beheerder de URL van de websocket-server " +"controleren in de algemene instellingen." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"De gebruikersnaam (meestal het toestelnummer) die zal worden gebruikt om te " +"registreren bij de PBX-server." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"De WebSocket-verbinding met de server is verbroken. Poging om de verbinding " +"te herstellen ..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Er is nog een gesprek aan de gang, weet je zeker dat je de pagina wilt " +"verlaten?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Verplaatsing" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Overbrengen naar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Softphone uitvouwen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Dempen opheffen" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Gebruikersinstellingen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "VoIP gebruiken" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "De telefoon van het apparaat gebruiken" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Ondersteuning voor VoIP-wachtrij" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP-configuratie" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP omgeving" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP-geheim" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP-gebruikersnaam / Toestelnummer" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "VoIP / Oproepen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Geheim Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Gebruikersnaam Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Ja, doe het." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Je browser ondersteunt sommige van de functies die nodig zijn om VoIP te " +"laten werken niet. Probeer je browser bij te werken of een andere te " +"gebruiken." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "Je belgeschiedenis is leeg! Bel nu en laat het hier 💡 vermelden" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Je inloggegevens zijn niet correct ingesteld. Neem contact op met je " +"beheerder." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "minder dan een seconde" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefoon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/nl_BE.po b/voip/i18n/nl_BE.po new file mode 100644 index 0000000..9bbf78f --- /dev/null +++ b/voip/i18n/nl_BE.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Dutch (Belgium) (https://www.transifex.com/odoo/teams/41243/nl_BE/)\n" +"Language: nl_BE\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Annuleren" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Geannuleerd" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Aangemaakt door" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Aangemaakt op" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Aanmaakdatum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klant" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Schermnaam" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Groeperen op" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Reeks" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Status" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/pl.po b/voip/i18n/pl.po new file mode 100644 index 0000000..aae11ef --- /dev/null +++ b/voip/i18n/pl.po @@ -0,0 +1,1142 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pl\n" +"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" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 nieodebrane połączenie" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 nieodebrane połączenia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Czynność" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nazwa aktywności" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Dodaj do kolejki połączeń" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Zapytaj" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Rozmowa" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Połączenie z innego urządzenia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Anuluj" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Anulowanie aktywności" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Wybierz metodę nawiązywania połączeń podczas korzystania z aplikacji mobilnej:\n" +"- VoIP: Zawsze używaj telefonu programowego Odoo\n" +"- Telefon urządzenia: Zawsze używaj telefonu urządzenia\n" +"- Zapytaj: Zawsze pytaj, czy ma być używany telefon programowy czy telefon urządzenia." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Zamknij" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Ustawienia konfiguracji" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Potwierdź" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Utworzył(a)" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Data utworzenia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klient" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telefon urządzenia" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Kierunek" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nazwa wyświetlana" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Edytuj" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Zakończ połączenie" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Data końcowa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Wprowadź numer lub nazwę" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Numer urządzenia zewnętrznego" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Rozłącz się, ale zachowaj połączenie w kolejce" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Jak wykonywać połączenia na telefonie komórkowym" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Jeśli opcja ta jest włączona, połączenia przychodzące będą automatycznie " +"odrzucane w Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Jeśli ta opcja jest włączona, nawiązanie połączenia w Odoo spowoduje " +"przeniesienie połączenia na \"Numer urządzenia zewnętrznego\". Użyj tej " +"opcji, aby nawiązać połączenie w Odoo, ale obsłużyć je z innego urządzenia -" +" np. telefonu stacjonarnego." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Jeśli opcja \"Zadzwoń z innego urządzenia\" jest włączona, połączenia " +"wykonywane w Odoo będą przekazywane na ten numer telefonu." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Przychodzące" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Jest w kolejce połączeń" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Ostatnio widziane połączenie telefoniczne" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Ostatnio aktualizowane przez" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Data ostatniej aktualizacji" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Oznacz jako wykonane" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Pominięte" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Tel. komórkowy" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Tel. komórkowy:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Wyłącz mikrofon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Następne czynności" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Brak dostępnego urządzenia do nagrywania dźwięku. Do korzystania z aplikacji" +" wymagany jest mikrofon." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Na bieżąco" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Wychodząca" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP serwera PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Brak adresu PBX lub Websocket. Sprawdź ustawienia." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Numer Telefonu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Prosimy o zgodę na korzystanie z mikrofonu." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Spróbuj ponownie później. Jeśli problem nadal występuje, warto poprosić " +"administratora o sprawdzenie konfiguracji." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produkcja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Najnowsze" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Rejestracja odrzucona: %(statusCode)s%(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Odrzucaj połączenia przychodzące" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Odrzucone" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Usuń z kolejki połączeń" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Odpowiedzialny" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planowane akywności" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Szukaj" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Niektóre dokumenty nie mogą zostać dodane do kolejki połączeń, ponieważ nie " +"mają ustawionego numeru telefonu: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Data początkowa" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stan" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "Adres IP serwera PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Błąd może pochodzić z warstwy transportowej. Administrator powinien " +"zweryfikować adres URL serwera websocket w ustawieniach ogólnych. Jeśli " +"problem nadal występuje, prawdopodobnie jest to problem z serwerem." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Hasło, które będzie używane do rejestracji na serwerze PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Osoba, z którą próbujesz się skontaktować, jest obecnie niedostępna." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Uwierzytelnienie na serwerze nie powiodło się. Poproś administratora o " +"sprawdzenie, czy łączysz się z właściwym serwerem (adres IP serwera PBX w " +"Ustawieniach ogólnych) i czy dane uwierzytelniające w preferencjach " +"użytkownika są prawidłowe." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Nazwa użytkownika (zazwyczaj numer wewnętrzny), która będzie używana do " +"rejestracji na serwerze PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Przekaz" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transfer do" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Włącz mikrofon" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Użytkownik" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Ustawienia użytkownika" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Obsługa kolejek VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Konfiguracja VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Środowisko VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Tajemnica VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nazwa użytkownika VoIP / numer wewnętrzny" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/pt.po b/voip/i18n/pt.po new file mode 100644 index 0000000..3fe2443 --- /dev/null +++ b/voip/i18n/pt.po @@ -0,0 +1,1117 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Wil Odoo, 2023 +# Rita Bastos, 2024 +# Marta Marouço, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Marta Marouço, 2024\n" +"Language-Team: Portuguese (https://app.transifex.com/odoo/teams/41243/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Atividade" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Ligar" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Fechar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contacto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contactos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demonstraçãol" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Direção" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nome" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documentos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Data Final" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "A Chegar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Última Atualização por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marcar como feito" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Telemóvel" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Telemóvel:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Próximas Atividades" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Em curso" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Entrega" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefone" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Número de Telefone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefone:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produção" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rejeitado" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsável" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Agendar Atividade" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Procurar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Data Inicial" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Estado" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transferência" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Utilizador" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Configurações do Utilizador" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/pt_BR.po b/voip/i18n/pt_BR.po new file mode 100644 index 0000000..618851f --- /dev/null +++ b/voip/i18n/pt_BR.po @@ -0,0 +1,1179 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Éder Brito , 2023 +# a75f12d3d37ea5bf159c4b3e85eb30e7_0fa6927, 2023 +# Maitê Dietze, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s min %(seconds)s s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s minutos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s chamadas perdidas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s segundos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 minuto" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 ligação não atendida" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 segundo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 minutos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 ligações não atendidas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 segundos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Ocorreu um erro de hardware ao tentar acessar seu dispositivo de gravação de" +" áudio. Certifique-se de que os drivers estão atualizados e tente novamente." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Uma ligação realizada pelo aplicativo VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Cancelado" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Chamada para %(phone_number)s cancelada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Atividade" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Nome da atividade" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Adicionar à fila de chamadas" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Ocorreu um erro com o dispositivo de gravação de áudio (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Ocorreu um erro na instanciação do Agente do usuário:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Ocorreu um erro ao tentar enviar o convite para o seguinte número: %(phoneNumber)s\n" +"\n" +"Erro: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Tem certeza de que quer excluir essa atividade? Ela será excluída para " +"sempre 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Perguntar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Ligação" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Ligação de %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Ligação de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Ligar de outro dispositivo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Ligação recusada (motivo \"%(reasonPhrase)s\")" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Ligar para %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Ligar para %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Chamando" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Ligando para %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Ligações" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Cancelar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Cancelar a atividade" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Não foi possível acessar o dispositivo de gravação de áudio. Se você houver " +"negado o acesso ao microfone, permita-o e tente novamente. Se não, " +"certifique-se de que este site é executado em HTTPS e de que não há " +"configuração de negação de acesso a dispositivos de mídia em seu navegador." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Alterar dispositivo de entrada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Escolha um dispositivo:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Selecione o método utilizado para realizar ligações pelo aplicativo móvel:\n" +" • VoIP: Sempre usar o Softphone do Odoo\n" +" • Telefone do dispositivo: Sempre usar o telefone do dispositivo\n" +" • Perguntar: Sempre perguntar se deve usar o Softphone ou o telefone do dispositivo\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Fechar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Fechar teclado numérico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Fechar Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Fechar detalhes" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Conectando…" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contato" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contatos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Contatos com um número de telefone serão exibidos aqui." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Cliente" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demonstração" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Telefone do dispositivo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Direção" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nome exibido" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documentos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Editar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Encerrar ligação" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Data de término" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Digitar número ou nome" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Digite o número…" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Número do dispositivo externo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Número do dispositivo externo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Falha ao carregar a biblioteca SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Desligar mas manter chamada na fila" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Espere!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Como fazer chamadas no celular" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Como fazer ligações pelo celular" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Se habilitado, ligações recebidas serão automaticamente rejeitadas no Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Se habilitado, realizar uma ligação no Odoo fará com que ela seja " +"transferida para o \"Número do dispositivo externo\". Use essa opção para " +"realizar a ligação pelo Odoo mas tratá-la em outro dispositivo (ex: seu " +"telefone de mesa)." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Se a opção \"Ligar de outro dispositivo\" estiver habilitada, as ligações " +"feitas pelo Odoo serão transferidas para esse número de telefone." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Em ligação por: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Recebida" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Ligação recebida de…" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Seleção de dispositivo de entrada" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Está na fila de chamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Último telefonema visto" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Última atualização por" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Última atualização em" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marcar como concluída" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Clique errado." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Não atendida" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Ligação perdida de %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Celular" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Celular:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Mutar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Próximas atividades" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Nnehum dispositivo de gravação de áudio disponível. Para usar o aplicativo, " +"um microfone é necessário." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Nenhuma ligação agendada para hoje 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Sem resultados de busca 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Em andamento" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Abrir teclado numérico" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Abrir Softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Saída" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP do servidor PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" +"Endereço de PBX ou WebSocket não encontrado. Verifique suas definições." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefone" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Número de telefone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefone:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Aceite o uso do microfone." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Tente novamente mais tarde. Se o problema persistir, você pode solicitar que" +" um administrador verifique as configurações." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produção" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Recentes" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registro rejeitado: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Rejeitar ligações recebidas" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Rejeitado" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Ligação de %(phone_number)s recusada" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Ligação para %(phone_number)s recusada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Você se lembra?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Remover da fila de chamadas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsável" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Chamando…" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Agendar e fazer ligações da sua base de dados" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Agendar atividade" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Pesquisar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Selecione um método de chamada" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Enviar e-mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Rejeitar automaticamente as chamadas recebidas" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Ligar de outro dispositivo" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Alguns documentos não podem ser adicionados a fila de chamadas pois não têm " +"um número de telefone definido:%(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Data de início" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Status" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Como fazer a ligação:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Encerrado" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "O endereço de IP do seu servidor PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "O URL do seu WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "A conexão do WebSocket foi perdida e não pôde ser restabelecida." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"O erro pode ser proveniente da camada de transporte. Peça que um " +"administrador verifique o URL do servidor WebSocket nas Configurações " +"gerais. Se o problema persistir, provavelmente se trata de um problema do " +"servidor." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Nome da atividade relacionada a este telefonema, se houver." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"O número está incorreto, as credenciais do usuário estão erradas ou a conexão não pode ser realizada. Verifique suas configurações.\n" +"(Motivo recebido: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "A senha que será usada para registrar o servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "A pessoa que você tentou contatar está indisponível no momento." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"O servidor falhou ao autenticá-lo. Peça que um administrador verifique se " +"você está chamando o servidor correto (IP do servidor PBX nas Configurações " +"gerais) e se as credenciais nas suas preferências de usuário estão corretas." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"O agente do usuário não pode ser iniciado. O URL do servidor Websocket pode " +"estar incorreto. Solicite que um administrador verifique esse URL nas " +"Configurações gerais." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"O nome de usuário (normalmente o número de extensão) que será usado para " +"registrar o servidor PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"A conexão do websocket com o servidor foi perdida. Tentando restabelecer a " +"conexão…" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Ainda há chamadas em andamento. Tem certeza de que quer sair desta página?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transferência" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transferir para" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Desdobrar Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Desmutar" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Usuário" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Configurações do usuário" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "PeloVoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Pelo telefone do dispositivo" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Suporte da fila do VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Configuração" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Ambiente" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Segredo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Nome de usuário/número de extensão" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip/Ligações" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Segredo do Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Nome de usuário do Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Sim." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Seu navegador não suporta alguns dos recursos necessários para o " +"funcionamento do VoIP. Tente atualizá-lo ou usar outro navegador." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Seu histórico de ligações está vazio. Faça uma ligação agora e ela será " +"listada aqui 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Suas informações de login não estão definidas corretamente. Entre em contato" +" com o administrador." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "menos de um segundo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "VoIP" diff --git a/voip/i18n/ro.po b/voip/i18n/ro.po new file mode 100644 index 0000000..a297f6b --- /dev/null +++ b/voip/i18n/ro.po @@ -0,0 +1,1126 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Hongu Cosmin , 2024 +# Cozmin Candea , 2024 +# Martin Trigaux, 2024 +# Dorin Hongu , 2024 +# Foldi Robert , 2024 +# Betty Keresztesi, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Romanian (https://app.transifex.com/odoo/teams/41243/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Activitate" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Adăugare la Coada de Apeluri" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Întreabă" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Apeluri" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Anulează" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Anulare activitate" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Închide" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Setări de configurare" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Confirmă" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Contact" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Contacte" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Creat de" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Creat în" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Client" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Direcție" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Nume afișat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Documente" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Editare" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Închidere Apel" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Dată sfârșit" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Introduceți un număr sau un nume" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Închideți, dar țineți apelul la coadă" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Dacă este activată, plasarea unui apel în Odoo va transfera apelul către " +"\"Numărul dispozitivului extern\". Utilizați această opțiune pentru a plasa " +"apelul în Odoo, dar pentru a-l gestiona de pe un alt dispozitiv - de " +"exemplu, telefonul de pe biroul dumneavoastră." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Intrări" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Se află în coada de apeluri" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Apel telefonic ultima oară văzut" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Ultima actualizare făcută de" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Ultima actualizare pe" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Marchează ca efectuat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Apel Ratat" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Mut" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Următoarele activități" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "În curs de desfășurare" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Ieșiri" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP Server PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Adresa PBX sau Websocket lipsește. Verificați setările." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Număr telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Vă rugăm să acceptați utilizarea microfonului." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Producție" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Recent" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Respins" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Eliminare din coada apelurilor" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Responsabil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planifică activitate" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Căutare" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Dată început" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stare" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL-ul WebSocket-ului dvs." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" +"Persoana pe care încercați să o contactați este momentan indisponibilă." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Transfer" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transferă la" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Dezactivați" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Utilizator" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Setări utilizator" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Mediul VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/ru.po b/voip/i18n/ru.po new file mode 100644 index 0000000..9bb96a7 --- /dev/null +++ b/voip/i18n/ru.po @@ -0,0 +1,1184 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# alenafairy, 2023 +# ILMIR , 2023 +# Alena Vlasova, 2023 +# Sergey Vilizhanin, 2023 +# Сергей Шебанин , 2023 +# Gennady Marchenko , 2023 +# Collex100, 2023 +# Martin Trigaux, 2023 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Russian (https://app.transifex.com/odoo/teams/41243/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ru\n" +"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" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s мин %(seconds)s сек" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s минут" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s пропущенные звонки" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s секунд" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 минута" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 пропущенный звонок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 секунда" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 минуты" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 пропущенных звонка" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 секунды" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"При попытке получить доступ к устройству записи звука произошла аппаратная " +"ошибка. Пожалуйста, убедитесь, что ваши драйверы обновлены, и повторите " +"попытку." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Телефонный звонок, обработанный с помощью приложения VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Отменено" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Прерванный вызов на %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Активность" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Название мероприятия" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Добавить в очередь вызовов" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Произошла ошибка, связанная с устройством записи звука (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Во время создания агента пользователя произошла ошибка:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"При попытке пригласить следующий номер произошла ошибка: %(phoneNumber)s\n" +"\n" +"Ошибка: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Вы уверены, что хотите удалить эту активность? Она будет потеряна навсегда, " +"а это довольно долгий срок 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Спросить" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Возврат" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Позвонить" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Звонок с %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Звонок с %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Вызов с другого устройства" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Вызов отклонен (причина: \"%(reasonPhrase)s\")" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Звонок на %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Звонок на %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Вызов" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Звоню %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Звонки" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Отменить" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Отменить мероприятие" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Невозможно получить доступ к устройству записи звука. Если вам запрещен " +"доступ к микрофону, разрешите его и повторите попытку. В противном случае " +"убедитесь, что этот сайт работает по протоколу HTTPS и что в вашем браузере " +"не установлен запрет на доступ к медиаустройствам." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Изменение устройства ввода" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Выберите устройство:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Выберите метод, который будет использоваться для совершения звонка при использовании мобильного приложения:\n" +" - VoIP: Всегда используйте софтфон Odoo\n" +" - Телефон устройства: Всегда использовать телефон устройства\n" +" - Спрашивать: Всегда спрашивать, следует ли использовать софтфон или телефон устройства\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Закрыть" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Закрыть Numpad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Закрыть софтфон" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Закрыть детали" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Параметры конфигурации" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Подтвердить" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Соединение…" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Контакты" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Контакты" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Контакты с номером телефона будут показаны здесь." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Создано" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Создано" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Клиент" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Демо" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Телефон устройства" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Направление" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Отображаемое имя" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Документы" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Редактировать" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Конец разговора" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Дата окончания" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Введите номер или имя" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Введите номер.." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Номер внешнего устройства" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Не удалось загрузить библиотеку SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Положите трубку, но сохраните звонок в очереди" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Стойте!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Как совершать звонки на мобильный" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" +"Если эта функция включена, входящие звонки будут автоматически отклоняться в" +" Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Если эта опция включена, при размещении звонка в Odoo он будет переведен на " +"\"Номер внешнего устройства\". Используйте эту опцию, чтобы разместить " +"звонок в Odoo, но обработать его с другого устройства - например, с вашего " +"настольного телефона." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Если опция \"Звонить с другого устройства\" включена, звонки, сделанные в " +"Odoo, будут переводиться на этот номер телефона." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Призыв: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Входящий" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Входящий звонок от.." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Выбор устройства ввода" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Находится в очереди вызовов" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Последний телефонный звонок" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Последнее обновление" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Последнее обновление" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Отмечено как завершенное" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Промахнулся, извините." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Пропущенный" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Пропущенный звонок от %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Мобильный" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Мобильный:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Без звука" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Следующие мероприятия" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Отсутствует устройство для записи звука. Для использования приложения " +"требуется микрофон." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "На сегодня звонков не запланировано 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Нет результатов поиска 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Текущие" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Открыть Numpad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Открытый софтфон" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Исходящие" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX сервер IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Отсутствует адрес АТС или Websocket. Пожалуйста, проверьте настройки." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Телефон" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Номер телефона" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Телефон:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Пожалуйста, разрешите воспользоваться микрофоном." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Пожалуйста, повторите попытку позже. Если проблема сохраняется, попросите " +"администратора проверить конфигурацию." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Производство" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Последние" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Регистрация отклонена: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Отклонять входящие вызовы" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Отклонено" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Отклоненный вызов с %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Отклоненный вызов на %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Помните?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Удалить из очереди вызовов" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Ответственный" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Звонок.." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Планируйте и совершайте звонки из своей базы данных" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Деятельность по расписанию" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Поиск" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Выберите метод вызова" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Отправить электронное письмо" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Некоторые документы нельзя добавить в очередь вызовов, поскольку для них не " +"задан номер телефона: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Дата начала" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Область" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Расскажите нам, как сделать звонок:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Остановлено" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "IP-адрес вашего сервера АТС" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL вашего WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Ошибка может возникнуть на транспортном уровне. Попросите администратора " +"проверить URL-адрес сервера websocket в общих настройках. Если проблема не " +"исчезла, вероятно, дело в сервере." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" +"Название мероприятия, связанного с этим телефонным звонком, если таковое " +"имеется." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Номер неверен, возможно, неверно указаны учетные данные пользователя или не удается установить соединение. Пожалуйста, проверьте конфигурацию.\n" +"(Причина получена: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Пароль, который будет использоваться для регистрации на сервере АТС." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Человек, с которым вы пытаетесь связаться, сейчас недоступен." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Серверу не удалось подтвердить вашу подлинность. Пожалуйста, попросите " +"администратора проверить, что вы обращаетесь к нужному серверу (IP-адрес " +"сервера АТС в общих настройках) и что учетные данные в настройках " +"пользователя верны." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Не удалось запустить агент пользователя. URL-адрес сервера сокетов может " +"быть неверным. Попросите администратора проверить URL-адрес сервера сокетов " +"в общих настройках." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Имя пользователя (обычно внутренний номер), которое будет использоваться для" +" регистрации на сервере АТС." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "Вызов все еще продолжается, вы уверены, что хотите покинуть страницу?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Перевод" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Перевести в" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Развернутый софтфон" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Вкл. звук" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Пользователь" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Настройки пользователя" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Использование VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Использование телефона устройства" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Поддержка очередей VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Конфигурация VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Среда VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Секрет VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Имя пользователя VoIP / Добавочный номер" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / Звонки" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Да, сделайте это." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Ваш браузер не поддерживает некоторые функции, необходимые для работы VoIP. " +"Пожалуйста, попробуйте обновить браузер или использовать другой." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Ваша история звонков пуста! Сделайте звонок прямо сейчас, чтобы он был " +"указан здесь 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Ваши данные для входа в систему заданы неверно. Пожалуйста, свяжитесь с " +"вашим администратором." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "менее секунды" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "телефон" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/sk.po b/voip/i18n/sk.po new file mode 100644 index 0000000..024722e --- /dev/null +++ b/voip/i18n/sk.po @@ -0,0 +1,1116 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# karolína schusterová , 2023 +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Slovak (https://app.transifex.com/odoo/teams/41243/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivita" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Pridať do poradia telefonátu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Telefonát" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Telefonovanie" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Zrušené" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Zatvoriť" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Nastavenia konfigurácie" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Potvrdiť" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Vytvoril" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Vytvorené" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Zákazník" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Smer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Zobrazovaný názov" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenty" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Upraviť" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Dátum ukončenia" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Prichádzajúci" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Je v poradí telefonátu" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Naposledy upravoval" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Naposledy upravované" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Označiť ako hotovo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobilný telefón" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Ďalšie aktivity" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Prebiehajúci" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Odchádzajúce" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Server IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefón" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefónne číslo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefón:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Výroba" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Nedávny" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Zamietnuté" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Odstrániť z poradia telefonátov" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Zodpovedný" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Naplánuj aktivity" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Vyhľadávanie" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Dátum začiatku" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Štát" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL vášho WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Prevod" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Užívateľ" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/sl.po b/voip/i18n/sl.po new file mode 100644 index 0000000..38e8d6e --- /dev/null +++ b/voip/i18n/sl.po @@ -0,0 +1,1125 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Vida Potočnik , 2023 +# Grega Vavtar , 2023 +# matjaz k , 2023 +# laznikd , 2023 +# Jasmina Macur , 2023 +# Martin Trigaux, 2023 +# Matjaz Mozetic , 2023 +# Tomaž Jug , 2023 +# Tadej Lupšina , 2023 +# Katja Deržič, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Slovenian (https://app.transifex.com/odoo/teams/41243/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivnost" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Klic" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Prekliči" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Zaključi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Uredi nastavitve" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Potrdi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Stik" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Stiki" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Ustvaril" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Ustvarjeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Stranka" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Smer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Uredi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Končni datum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Naročeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Zadnji posodobil" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Zadnjič posodobljeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Označi kot opravljeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobilni telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mob:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Izklop zvoka" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Naslednje aktivnosti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "V teku" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Odhajajoča količina" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefonska številka" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Proizvodnja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Zavrnjeno" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Odgovoren" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Načrt aktivnosti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Iskanje" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Začetni datum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Stanje" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Prenos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Uporabnik" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "Voip" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP okolje" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "phone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/sq.po b/voip/i18n/sq.po new file mode 100644 index 0000000..d848e09 --- /dev/null +++ b/voip/i18n/sq.po @@ -0,0 +1,1138 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Albanian (https://www.transifex.com/odoo/teams/41243/sq/)\n" +"Language: sq\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Anullo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "E Anulluar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Krijuar nga" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Krijuar me" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Partner" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Emri i paraqitur" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Grupo Nga" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Modifikuar per here te fundit nga" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Modifikuar per here te fundit me" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Sekuencë" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Statusi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/sr.po b/voip/i18n/sr.po new file mode 100644 index 0000000..9e19b05 --- /dev/null +++ b/voip/i18n/sr.po @@ -0,0 +1,1143 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Martin Trigaux, 2023 +# Dragan Vukosavljevic , 2023 +# Milan Bojovic , 2023 +# Jelena Stamatović, 2024 +# コフスタジオ, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: コフスタジオ, 2024\n" +"Language-Team: Serbian (https://app.transifex.com/odoo/teams/41243/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sr\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" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 propušten poziv" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 propuštena poziva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivnost" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Naziv aktivnosti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Add to Call Queue" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Pitaj" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Poziv" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Poziv sa drugog uređaja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Otkaži" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Cancel the activity" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Zatvori" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Podešavanje konfiguracije" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Potvrdi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Klijent" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Device's phone" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Smer" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Naziv za prikaz" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokumenti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Uredi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Zavši poziv" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Završni Datum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Enter number or name" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Broj spoljnog uređaja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Hang up but keep call in queue" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "How to place calls on mobile" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "If enabled, incoming calls will be automatically declined in Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Ako je omogućena opcija \"Poziv sa drugog uređaja\", pozivi koji se obave u " +"Odoo-u će biti preusmereni na ovaj broj telefona." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Dolazni" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Is in the Call Queue" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Last Seen Phone Call" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Poslednji put ažurirao" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Poslednji put ažurirano" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Označi kao završeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Propustio" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobilni" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobilni:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Isključi zvuk" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Naredne aktivnosti" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"No audio recording device available. The application requires a microphone " +"in order to be used." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "U toku" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Izlazno" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Server IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX or Websocket address is missing. Please check your settings." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Phone Number" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Please accept the use of the microphone." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Molimo pokušajte ponovo kasnije. Ako problem i dalje postoji, možda biste " +"želeli da zatražite od administratora da proveri konfiguraciju." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Proizvodnja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Nedavno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Registracija odbijena: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Reject incoming calls" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Odbijeno" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Remove from Call Queue" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Odgovorno lice" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Rasporedi aktivnost" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Pronađi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Neki dokumenti ne mogu biti dodati u red čekanja poziva jer nemaju " +"postavljen broj telefona: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Početni datum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Država" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "IP adresa vašeg PBX servera" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "The URL of your WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Lozinka koja će se koristiti prilikom registracije na PBX serveru." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "The person you try to contact is currently unavailable." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Prenos" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transfer to" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Unmute" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Korisnik" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Podešavanja korisnika" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP Queue support" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP Configuration" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP Environment" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP secret" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP username / Extension number" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "phone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/sr@latin.po b/voip/i18n/sr@latin.po new file mode 100644 index 0000000..2ccaf28 --- /dev/null +++ b/voip/i18n/sr@latin.po @@ -0,0 +1,1141 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Nemanja Dragovic , 2017 +# Djordje Marjanovic , 2017 +# Martin Trigaux , 2017 +# Ljubisa Jovev , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2017-11-21 17:08+0000\n" +"Last-Translator: Ljubisa Jovev , 2017\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/odoo/teams/41243/sr%40latin/)\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "# Slucajeva" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivnost" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Odustani" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "Poništeno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "Datum kreiranja" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "Kreiran dana" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kupac" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "Datum" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "Naziv za prikaz" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "Datum dospijeća" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "Trajanje" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "Grupiši po" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "Odrzan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "Dolazni" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "Promenio" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "Vreme promene" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "Mobilni" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "Ne Odrzivo" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "Zabilješka" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "Izlazno" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "Telefon:" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "TelPozivi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Proizvodnja" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "Odgovoran" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "Pretrazi Telefonske pozive" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "Prioritet" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "Status" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "Sumarno" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "Za Uraditi" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "Sutra" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "min" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/sv.po b/voip/i18n/sv.po new file mode 100644 index 0000000..40deb30 --- /dev/null +++ b/voip/i18n/sv.po @@ -0,0 +1,1127 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Haojun Zou , 2023 +# Chrille Hedberg , 2023 +# Jakob Krabbe , 2023 +# Mikael Åkerberg , 2023 +# Stephen Schmidt , 2023 +# Leif Persson , 2023 +# Martin Trigaux, 2023 +# Robin Calvin, 2023 +# Mikael Carlsson , 2023 +# Kim Asplund , 2023 +# Lasse L, 2023 +# Anders Wallenquist , 2024 +# Simon S, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Simon S, 2024\n" +"Language-Team: Swedish (https://app.transifex.com/odoo/teams/41243/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivitet" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Fråga" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Samtal" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Avbryt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Stäng" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Inställningar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Bekräfta" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontakt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontakter" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Skapad den" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Kund" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Riktning" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Dokument" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Redigera" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Slutdatum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Inkommande" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Är i ring-kö" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad den" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Markera som färdig" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Missat" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Stäng av mikrofon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Nästa aktivitet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Pågående" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Utgående" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Produktion" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Senaste" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Avvisad" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Ansvarig" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Planera aktivitet" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Sök" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Startdatum" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Etapp" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Flytt" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Överföra till" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Aktivera mikrofon" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Användare" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Användarinställningar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/ta.po b/voip/i18n/ta.po new file mode 100644 index 0000000..2f79784 --- /dev/null +++ b/voip/i18n/ta.po @@ -0,0 +1,1139 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Odoo 9.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-16 16:01+0000\n" +"PO-Revision-Date: 2016-02-05 10:10+0000\n" +"Last-Translator: Martin Trigaux\n" +"Language-Team: Tamil (http://www.transifex.com/odoo/odoo-9/language/ta/)\n" +"Language: ta\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" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__nbr +msgid "# of Cases" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "%(number of missed calls)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "A hardware error occured while trying to access audio recording device. Please make sure your drivers are up to date and try again." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Accept" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#: model:ir.actions.server,name:voip.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "An error occured involving the audio recording device (%(errorName)s):
%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "An error occurred during the instantiation of the User Agent:

%(error message)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Are you sure that you want to close this website? There's a call ongoing." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Avatar" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__call_date +msgid "Call Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__name +msgid "Call Name" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call duration: %(min)smin %(sec)ssec" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Call rejected (reason: \"%(reasonPhrase)s\")" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Call to %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/voip_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Calls Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__cancel +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__cancel +msgid "Cancelled" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Cannot access audio recording device. If you have denied access to your microphone, please grant it and try again. Otherwise, make sure this website runs over HTTPS and that your browser is not set to deny access to media devices." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Click to unblock" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__partner_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_uid +msgid "Created by" +msgstr "உருவாக்கியவர்" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__create_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__create_date +msgid "Created on" +msgstr "" +"உருவாக்கப்பட்ட \n" +"தேதி" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Creation Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__call_date +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__display_name +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__display_name +msgid "Display Name" +msgstr "காட்சி பெயர்" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Document" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__no_reschedule +msgid "Don't Reschedule" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__date_deadline +msgid "Due Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__duration +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__duration +msgid "Duration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__duration +msgid "Duration in minutes." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Enter the number..." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Failed to start the user agent. The URL of the websocket server may be wrong. Please have an administrator verify the websocket server URL in the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__sequence +msgid "Gives the sequence order when displaying a list of Phonecalls." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Group By" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Headphones" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__done +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__done +msgid "Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__should_call_from_another_device +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "If enabled, placing a call in Odoo will transfer the call to the \"External device number\". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__external_device_number +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "If the \"Call from another device\" option is enabled, calls placed in Odoo will be transfered to this phone number." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__7d +msgid "In 1 Week" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__15d +msgid "In 15 Day" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__2m +msgid "In 2 Months" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__in_queue +msgid "In Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "In call for:" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"In order to follow up on the call, you can trigger a request for\n" +" another call, a meeting." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-python +#. odoo-javascript +#: code:addons/voip/models/voip_phonecall.py:0 +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Incoming call from %s (%s)" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Incoming call from..." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/audio_input_device.js:0 +#, python-format +msgid "Input/output audio settings" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Keypad" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_uid +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_uid +msgid "Last Updated by" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__write_date +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__write_date +msgid "Last Updated on" +msgstr "கடைசியாக புதுப்பிக்கப்பட்டது" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__activity_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__activity_id +msgid "Linked Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mail_message_id +msgid "Linked Chatter Message" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__voip_phonecall_id +msgid "Linked Voip Phonecall" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "Log the summary of a phonecall" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__phonecall_id +msgid "Logged Phonecall" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Make a call using:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Missed Call from %s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_mobile +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_mobile +msgid "Mobile number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "My Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Next activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "No audio recording device available. The application requires a microphone in order to be used." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__pending +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__pending +msgid "Not Held" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__note +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__note +msgid "Note" +msgstr "" + +#. module: voip +#: model_terms:ir.actions.act_window,help:voip.voip_phonecall_view +msgid "" +"Odoo allows you to log inbound calls on the fly to track the\n" +" history of the communication with a customer or to inform another\n" +" team member." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Pending" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__phone +#, python-format +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__sanitized_phone +#: model:ir.model.fields,field_description:voip.field_res_users__sanitized_phone +msgid "Phone number sanitized" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Phonecall details" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_phonecall_view +#: model:ir.ui.menu,name:voip.menu_voip_phonecall_view +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +#: model_terms:ir.ui.view,arch_db:voip.voip_phonecall_tree_view +msgid "Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Refresh the Panel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Reject call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_phonecall.py:0 +#, python-format +msgid "Rejected Incoming Call from %s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/components/call_queue_switch/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#, python-format +msgid "Remove from the queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__user_id +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__user_id +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Ringing..." +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_option +msgid "Schedule A New Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Schedule Next" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/dialing_panel.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Search Phonecalls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Send mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__sequence +msgid "Sequence" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__reschedule_date +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__custom +msgid "Specific Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__start_time +msgid "Start time" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall__state +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_report__state +msgid "Status" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_phonecall_log_wizard__summary +msgid "Summary" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Take call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The connection cannot be made.
Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.
(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_secret +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/user_agent.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "The phonecall has no number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/js/registerer.js:0 +#, python-format +msgid "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_phonecall__state +msgid "" +"The status is set to To Do, when a call is created.\n" +"When the call is over, the status is set to Held.\n" +"If the call is not applicable anymore, the status can be set to Cancelled." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users__voip_username +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "The username (typically the extension number) that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "The websocket connection with the server has been lost. Please try to refresh the page." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall__state__open +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_report__state__open +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "To Do" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_phonecall_log_wizard__reschedule_option__1d +msgid "Tomorrow" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.view_voip_case_phonecalls_filter +msgid "Unassigned" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall +msgid "VOIP Phonecall" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_log_wizard +msgid "VOIP Phonecall log Wizard" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_phonecall_report +msgid "VOIP Phonecalls by user report" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Voip" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "You are already in a call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/legacy/dialing_panel.js:0 +#, python-format +msgid "Your browser could not support WebRTC. Please check your configuration." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your browser does not support some of the features needed for VoIP to work. Please try to update your browser or use a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/user_agent_service.js:0 +#, python-format +msgid "Your credentials are not correctly set. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "min" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/xml/phone_call.xml:0 +#: code:addons/voip/static/src/xml/phone_call_details.xml:0 +#, python-format +msgid "sec" +msgstr "" diff --git a/voip/i18n/th.po b/voip/i18n/th.po new file mode 100644 index 0000000..4ea6d5e --- /dev/null +++ b/voip/i18n/th.po @@ -0,0 +1,1165 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Rasareeyar Lappiam, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Thai (https://app.transifex.com/odoo/teams/41243/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s นาที %(seconds)s วินาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s นาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s สายที่ไม่ได้รับ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s วินาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 นาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 สายที่ไม่ได้รับ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 วินาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 นาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 สายที่ไม่ได้รับ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 วินาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"เกิดข้อผิดพลาดด้านฮาร์ดแวร์ขณะพยายามเข้าถึงอุปกรณ์บันทึกเสียง " +"โปรดตรวจสอบให้แน่ใจว่าไดรเวอร์ของคุณเป็นเวอร์ชันล่าสุดแล้วลองอีกครั้ง" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "การโทรที่จัดการโดยใช้แอปพลิเคชัน VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "ถูกยกเลิก" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "ยกเลิกการโทรที่ %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "กิจกรรม" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "ชื่อกิจกรรม" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "เพิ่มในคิวการโทร" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"เกิดข้อผิดพลาดเกี่ยวกับอุปกรณ์บันทึกเสียง (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"เกิดข้อผิดพลาดระหว่างการสร้างอินสแตนซ์ของ ตัวแทนผู้ใช้:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"เกิดข้อผิดพลาดขณะพยายามเชิญหมายเลขต่อไปนี้:%(phoneNumber)s\n" +"\n" +"ข้อผิดพลาด: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "คุณแน่ใจหรือไม่ว่าต้องการลบกิจกรรมนี้ มันคงจะหายไปตลอดกาล 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "ถาม" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "ย้อนถอยหลัง" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "โทร" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "โทรจาก %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "โทรจาก %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "โทรจากอุปกรณ์อื่น" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "การโทรถูกปฏิเสธ (เหตุผล: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "โทรถึง %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "โทรถึง %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "กำลังโทร" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "กำลังโทร %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "โทร" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "ยกเลิก" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "ยกเลิกกิจกรรม" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"ไม่สามารถเข้าถึงอุปกรณ์บันทึกเสียงได้ หากคุณปฏิเสธการเข้าถึงไมโครโฟนของคุณ " +"โปรดอนุญาตและลองอีกครั้ง ไม่เช่นนั้น ตรวจสอบให้แน่ใจว่าเว็บไซต์นี้ทำงานบน " +"HTTPS และเบราว์เซอร์ของคุณไม่ได้ตั้งค่าให้ปฏิเสธการเข้าถึงอุปกรณ์สื่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "เปลี่ยนอุปกรณ์การป้อนข้อมูล" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "เลือกอุปกรณ์:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"เลือกวิธีที่จะใช้โทรออกเมื่อใช้แอปพลิเคชันมือถือ:\n" +" • VoIP: ใช้ซอฟต์โฟน Odoo เสมอ\n" +" • โทรศัพท์ของอุปกรณ์: ใช้โทรศัพท์ของอุปกรณ์เสมอ\n" +" • ถาม: ถามเสมอว่าต้องใช้ซอฟต์โฟนหรือโทรศัพท์ของอุปกรณ์\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "ปิด" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "ปิดแป้นตัวเลข" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "ปิดซอฟต์โฟน" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "ปิดรายละเอียด" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "ตั้งค่าการกำหนดค่า" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "ยืนยัน" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "กำลังเชื่อมต่อ..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "ติดต่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "การติดต่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "ผู้ติดต่อพร้อมหมายเลขโทรศัพท์จะแสดงที่นี่" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "สร้างโดย" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "สร้างเมื่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "ลูกค้า" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "สาธิต" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "อุปกรณ์โทรศัพท์" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "ทิศทาง" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "แสดงชื่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "เอกสาร" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "แก้ไข" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "วางสาย" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "วันที่สิ้นสุด" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "ใส่หมายเลขหรือชื่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "ใส่หมายเลข..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "หมายเลขอุปกรณ์ภายนอก" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "หมายเลขอุปกรณ์ภายนอก" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"ไม่สามารถโหลดไลบรารี SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "วางสายแต่ให้การโทรอยู่ในคิว" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "รอก่อน!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "วิธีโทรผ่านมือถือ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "วิธีโทรออกบน" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ไอดี" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "หากเปิดใช้งาน สายเรียกเข้าจะถูกปฏิเสธโดยอัตโนมัติใน Odoo" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"หากเปิดใช้งาน การโทรออกใน Odoo จะถูกโอนสายไปยัง \"หมายเลขอุปกรณ์ภายนอก\" " +"ใช้ตัวเลือกนี้เพื่อโทรออกใน Odoo แต่จัดการจากอุปกรณ์อื่น - เช่น " +"โทรศัพท์ตั้งโต๊ะของคุณ" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"หากเปิดใช้งานตัวเลือก \"โทรจากอุปกรณ์อื่น\" สายที่โทรออกใน Odoo " +"จะถูกโอนไปยังหมายเลขโทรศัพท์นี้" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "อยู่ระหว่างการโทร: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "ขาเข้า" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "สายเรียกเข้าจาก..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "การเลือกอุปกรณ์การป้อนข้อมูล" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "อยู่ในคิวการโทร" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "การโทรที่เห็นล่าสุด" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "อัปเดตครั้งล่าสุดโดย" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "อัปเดตครั้งล่าสุดเมื่อ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "ทำเครื่องหมายว่าเสร็จสิ้น" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "คลิกผิด ขออภัย" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "หายไป" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "สายที่ไม่ได้รับจาก %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "มือถือ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "มือถือ:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "ปิดเสียง" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "กิจกรรมถัดไป" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"ไม่มีอุปกรณ์บันทึกเสียงที่พร้อมใช้งาน " +"แอปพลิเคชันจำเป็นต้องใช้ไมโครโฟนจึงจะใช้งานได้" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "ไม่มีกำหนดการโทรสำหรับวันนี้ 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "ไม่มีผลการค้นหา 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "กำลังดำเนินการ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "เปิดแป้นตัวเลข" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "เปิดซอฟต์โฟน" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "ขาออก" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP เซิร์ฟเวอร์ PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "ไม่มีที่อยู่ PBX หรือ Websocket โปรดตรวจสอบการตั้งค่าของคุณ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "โทรศัพท์" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "หมายเลขโทรศัพท์" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "โทรศัพท์:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "โปรดยอมรับการใช้ไมโครโฟน" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"กรุณาลองใหม่อีกครั้งในภายหลัง หากปัญหายังคงอยู่ " +"คุณอาจต้องขอให้ผู้ดูแลระบบตรวจสอบการกำหนดค่า" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "การผลิต" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "ล่าสุด" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "การลงทะเบียนถูกปฏิเสธ: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "ปฏิเสธสายเรียกเข้า" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "ปฏิเสธแล้ว" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "สายที่ถูกปฏิเสธจาก %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "สายที่ถูกปฏิเสธ %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "จำได้ไหม?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "นำออกจากคิวการโทร" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "รับผิดชอบ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "กำลังดัง…" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "กำหนดเวลาและโทรจากฐานข้อมูลของคุณ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "กำหนดการกิจกรรม" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "ค้นหา" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "เลือกวิธีการโทร" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "ส่งอีเมล" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "ควรปฏิเสธสายเรียกเข้าอัตโนมัติ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "ควรโทรจากอุปกรณ์อื่น" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"ไม่สามารถเพิ่มเอกสารบางฉบับลงในคิวการโทรได้เนื่องจากไม่ได้ตั้งค่าหมายเลขโทรศัพท์ไว้:" +" %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "วันที่เริ่ม" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "สถานะ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "บอกเราถึงวิธีการโทร:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "ยุติแล้ว" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "ที่อยู่ IP ของเซิร์ฟเวอร์ PBX ของคุณ" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL ของ WebSocket ของคุณ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "การเชื่อมต่อ WebSocket ขาดหายไปและไม่สามารถสร้างใหม่ได้" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"ข้อผิดพลาดอาจมาจากขั้นตอนการขนส่ง โปรดให้ผู้ดูแลระบบตรวจสอบ URL เซิร์ฟเวอร์ " +"websocket ในการตั้งค่าทั่วไป หากปัญหายังคงอยู่ อาจเป็นปัญหากับเซิร์ฟเวอร์" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "ชื่อของกิจกรรมที่เกี่ยวข้องกับการโทรนี้ ถ้ามี" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"หมายเลขไม่ถูกต้อง ข้อมูลรับรองผู้ใช้อาจผิดหรือไม่สามารถทำการเชื่อมต่อได้ กรุณาตรวจสอบการกำหนดค่าของคุณ\n" +"(เหตุผลที่ได้รับ: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "รหัสผ่านที่จะใช้ในการลงทะเบียนกับเซิร์ฟเวอร์ PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "คนที่คุณพยายามติดต่อไม่ว่างในขณะนี้" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"เซิร์ฟเวอร์ล้มเหลวในการรับรองความถูกต้องของคุณ " +"โปรดให้ผู้ดูแลระบบตรวจสอบว่าคุณเข้าถึงเซิร์ฟเวอร์ที่ถูกต้อง (IP เซิร์ฟเวอร์ " +"PBX ในการตั้งค่าทั่วไป) และข้อมูลรับรองในการตั้งค่าผู้ใช้ของคุณนั้นถูกต้อง" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"ไม่สามารถเริ่มตัวแทนผู้ใช้ได้ URL เซิร์ฟเวอร์ websocket อาจไม่ถูกต้อง " +"โปรดให้ผู้ดูแลระบบตรวจสอบ URL เซิร์ฟเวอร์ websocket ในการตั้งค่าทั่วไป" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"ชื่อผู้ใช้ (โดยทั่วไปคือหมายเลขต่อภายใน) " +"ที่จะใช้ในการลงทะเบียนกับเซิร์ฟเวอร์ PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"การเชื่อมต่อ websocket ไปยังเซิร์ฟเวอร์สูญหาย " +"กำลังพยายามสร้างการเชื่อมต่ออีกครั้ง..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "ยังคงมีการโทรอยู่ คุณแน่ใจหรือไม่ว่าต้องการออกจากเพจ?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "โอน" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "โอนย้ายไปยัง" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "เปิดเผยซอฟต์โฟน" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "ยกเลิกการปิดเสียง" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "ผู้ใช้" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "การตั้งค่าผู้ใช้" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "กำลังใช้ VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "การใช้โทรศัพท์ของอุปกรณ์" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "รองรับคิว VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "การกำหนดค่า VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP สภาพแวดล้อม" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP ลับ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "ชื่อผู้ใช้ VoIP / หมายเลขส่วนขยาย" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / การโทร" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "รหัสลับ Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "ชื่อผู้ใช้ Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "ใช่ ทำเลย" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"เบราว์เซอร์ของคุณไม่รองรับฟีเจอร์บางอย่างที่จำเป็นในการทำงานสำหรับ VoIP " +"โปรดลองอัปเดตเบราว์เซอร์ของคุณหรือใช้เบราว์เซอร์อื่น" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "ประวัติการโทรของคุณว่างเปล่า! โทรตอนนี้และแสดงรายการไว้ที่นี่💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"รายละเอียดการเข้าสู่ระบบของคุณไม่ได้ตั้งค่าอย่างถูกต้อง " +"โปรดติดต่อผู้ดูแลระบบของคุณ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "น้อยกว่าหนึ่งวินาที" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "โทรศัพท์" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/tr.po b/voip/i18n/tr.po new file mode 100644 index 0000000..d1077f8 --- /dev/null +++ b/voip/i18n/tr.po @@ -0,0 +1,1129 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Tugay Hatıl , 2023 +# Gökhan Erdoğdu , 2023 +# Umur Akın , 2023 +# abc Def , 2023 +# Emre Akayoğlu , 2023 +# Levent Karakaş , 2023 +# Martin Trigaux, 2023 +# Murat Durmuş , 2023 +# Ediz Duman , 2023 +# Ozlem Cikrikci , 2023 +# Murat Kaplan , 2023 +# Ertuğrul Güreş , 2023 +# Fırat Kaya , 2023 +# Ömer ABA , 2024 +# Halil, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Halil, 2024\n" +"Language-Team: Turkish (https://app.transifex.com/odoo/teams/41243/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Aktivite" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Aktivite Adı" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Arama Kuyruğuna Ekle" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Sor" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Geri" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Ara" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Çağrı" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "İptal" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Etkinliği iptal et" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Kapat" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Yapılandırma Ayarları" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Onayla" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Kontak" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Kontaklar" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Oluşturan" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Oluşturulma" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Müşteri" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Yön" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Görünüm Adı" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Belgeler" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Düzenle" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Bitiş Tarihi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Gelen" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Arama Sırasında mı" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Son Güncelleyen" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Son Güncelleme" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Yapıldı olarak işaretle" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Eksik" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Mobil" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Mobil:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Sessiz" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Sonraki Aktiviteler" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Devam eden" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Giden" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX Sunucu IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Telefon" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Telefon Numarası" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Telefon:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Üretim" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Son" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Reddedildi" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Arama Kuyruğundan kaldır" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Sorumlu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Aktivite Planla" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Arama" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Başlama Tarihi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Durum" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "WebSocket URL Adresiniz" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Aktarım" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Transfer et" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Sesi aç" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Kullanıcı" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Kullanıcı ayarları" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "telefon" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/uk.po b/voip/i18n/uk.po new file mode 100644 index 0000000..b22a363 --- /dev/null +++ b/voip/i18n/uk.po @@ -0,0 +1,1172 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Alina Lisnenko , 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Ukrainian (https://app.transifex.com/odoo/teams/41243/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s хв. %(seconds)s сек." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s хвилин" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s пропущений дзвінок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s секунд" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 хвилина" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 пропущений дзвінок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 секунда" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 хвилини" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 пропущених дзвінки" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 секунди" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Сталася апаратна помилка під час спроби отримати доступ до пристрою для " +"запису звуку. Переконайтеся, що ваші драйвери оновлені, і повторіть спробу." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Телефонний дзвінок, оброблений за допомогою модуля VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Перервано" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Скинуто дзвінок до %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Дія" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Назва діїі" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Додати до черги дзінків" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Сталася помилка з пристроєм для запису звуку (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Під час створення агента користувача сталася помилка:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Під час спроби запросити цей номер сталася помилка: %(phoneNumber)s\n" +"\n" +"Помилка: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Ви впевнені, що бажаєте видалити цю дію? Це буде втрачено назавжди, а це " +"досить довго 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Запитати" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Дзвінок" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Дзвінок від %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Дзвінок від %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Дзвінок з іншого пристрою" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Дзвінок відхилено (причина: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Дзвінок до %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Дзвінок до %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Дзвінок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Дзвінок до %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Дзвінок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Скасувати" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Завершити дію" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Неможливо отримати доступ до пристрою для запису звуку. Якщо ви заборонили " +"доступ до мікрофона, дозвольте його та повторіть спробу. В іншому випадку " +"переконайтеся, що цей веб-сайт працює через HTTPS і що ваш браузер не " +"налаштовано на заборону доступу до мультимедійних пристроїв." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Змінити пристрій введення" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Оберіть пристрій:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Виберіть спосіб здійснення виклику під час використання мобільного додатку:\n" +" • VoIP: Завжди використовуйте програмний телефон Odoo\n" +" • Телефон пристрою: завжди використовуйте телефон пристрою\n" +" • Запитати: Завжди запитуйте, чи потрібно використовувати програмний телефон чи телефон пристрою\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Закрити" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Закрити цифровий блок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Закрити Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Закрити деталі" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Налаштування" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Підтвердити" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Зʼєднання…" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Контакт" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Контакти" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Тут будуть показані контакти з номером телефону." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Створив" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Створено" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Клієнт" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Демо" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Телефон пристрою" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Напрямок" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Назва для відображення" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Документи" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Редагувати" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Завершити дзвінок" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Кінцева дата" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Введіть номер або ім'я" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Введіть номер…" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Номер зовнішнього пристрою" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Номер зовнішнього пристрою" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Помилка при завантаженні бібліотеки SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Покладіть трубку, але тримайте виклик у черзі" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Зачекайте на лінії!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Як дзвонити на мобільний" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Як телефонувати на мобільний" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "Якщо ввімкнено, вхідні виклики автоматично відхилятимуться в Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Якщо ввімкнено, здійснення виклику в Odoo призведе до переадресації виклику " +"на «Номер зовнішнього пристрою». Використовуйте цю опцію, щоб здійснити " +"дзвінок в Odoo, але обробляти його з іншого пристрою, напр. ваш настільний " +"телефон." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Якщо ввімкнуто опцію «Дзвінок з іншого пристрою», дзвінки, здійснені в Odoo," +" будуть переведені на цей номер телефону." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "На дзвінку: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Вхідні" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Вхідний дзвінок від…" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Вибір вхідного пристрою" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "У черзі дзвінка" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Останній переглянутий виклик" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Востаннє оновив" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Останнє оновлення" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Позначте як готово" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Випадково натиснув, вибачте." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Пропущено" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Пропущений дзвінок від %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Мобільний" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Мобільний:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Вимкнути звук" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Наступні дії" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" +"Немає доступного пристрою для запису звуку. Для використання програми " +"потрібен мікрофон." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "На сьогодні немає запланованих дзвінків 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Немає пошукових результатів 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "У процесі" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Відкрити цифровий блок" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Відкрити Softphone" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "На відправку" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX сервер IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "Відсутня адреса PBX або Websocket. Перевірте ваші налаштування." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Телефон" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Номер телефону" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Телефон:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Підтвердіть використання мікрофона." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Будь-ласка спробуйте пізніше. Якщо проблема не зникає, ви можете попросити " +"адміністратора перевірити конфігурацію." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Виробництво" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Останній" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Реєстрацію відхилено: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Відхилити вхідні дзвінки" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Відхилено" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Відхилений дзвінок від %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Відхилений дзвінок до %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Памʼятаєте?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Видалити з черги дзвінків" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Відповідальний" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Дзвонить…" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Плануйте та здійснюйте дзвінки зі своєї бази даних" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Запланувати дію" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Пошук" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Оберіть спосіб набору" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Надіслати e-mail" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Має автоматично відхиляти вхідні виклики" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Слід дзвонити з іншого пристрою" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Деякі документи не можна додати до черги викликів, оскільки для них не " +"встановлено номер телефону: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Початкова дата" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Статус" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Скажіть нам, як зробити виклик:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Припинено" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "IP-адреси вашого серверу PBX" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL вашого WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "З’єднання WebSocket було втрачено, і його не вдалося відновити." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Помилка може походити від транспортного рівня. Попросіть адміністратора " +"перевірити URL-адресу сервера websocket у загальних налаштуваннях. Якщо " +"проблема не зникає, ймовірно, проблема із сервером." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Назва дії, пов’язаної з цим телефонним дзвінком, якщо така є." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Номер неправильний, облікові дані користувача можуть бути неправильними або неможливо встановити з’єднання. Перевірте налаштування.\n" +"(Отримана причина: %(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Пароль, який буде використовуватися для реєстрації на сервері АТС." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Особа, з якою ви намагаєтеся зв'язатися, наразі недоступна." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Серверу не вдалося автентифікувати вас. Будь ласка, попросіть адміністратора" +" перевірити, чи ви підключаєтеся до потрібного сервера (IP-адреса сервера " +"PBX у загальних налаштуваннях) і чи правильні облікові дані у ваших " +"налаштуваннях користувача." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Не вдалося запустити агент користувача. URL-адреса сервера websocket може " +"бути неправильною. Попросіть адміністратора перевірити URL-адресу сервера " +"websocket у загальних налаштуваннях." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Ім’я користувача (зазвичай це внутрішній номер), яке використовуватиметься " +"для реєстрації на сервері PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" +"Веб-сокет-з’єднання з сервером було втрачено. Спроба відновити з’єднання…" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "Дзвінок ще триває, ви впевнені, що бажаєте залишити сторінку?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Переміщення" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Перемістити на" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Розгорніть Softphone" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Увімкнути звук" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Користувач" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Налаштування користувача" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Виокристовуючи VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Використовуючи телефон пристрою" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Підтримка VOIP Queue" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "IP-телефонія" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Налаштування VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Середовище ІР-телефонії" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Секретний ключ VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP ім'я користувача / додатковий номер" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / Дзвінки" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip Ключ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip Імʼя користувача" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Так, зробити це." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Ваш браузер не підтримує деякі функції, необхідні для роботи VoIP. Будь " +"ласка, спробуйте оновити свій браузер або використати інший." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Ваша історія викликів порожня! Зробіть дзвінок зараз і отримайте його тут 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Ваші дані для входу введено неправильно. Будь ласка, зверніться до свого " +"адміністратора." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "менше секунди" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "телефон" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/vi.po b/voip/i18n/vi.po new file mode 100644 index 0000000..d8d2f70 --- /dev/null +++ b/voip/i18n/vi.po @@ -0,0 +1,1170 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Trần Hà , 2023 +# Thi Huong Nguyen, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s phút %(seconds)s giây" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s phút" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s cuộc gọi nhỡ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s giây" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 phút" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 cuộc gọi nhỡ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 giây" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 phút" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 cuộc gọi nhỡ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 giây" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" +"Đã xảy ra lỗi phần cứng khi cố gắng truy cập thiết bị ghi âm. Hãy đảm bảo " +"cập nhật trình điều khiển của bạn và thử lại." + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "Một cuộc gọi điện thoại được xử lý bằng ứng dụng VoIP" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "Đã huỷ" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "Đã huỷ cuộc gọi tới %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "Hoạt động" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "Tên hoạt động" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "Thêm vào dòng đợi gọi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"Đã xảy ra lỗi liên quan đến thiết bị ghi âm (%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"Đã xảy ra lỗi trong quá trình khởi tạo user agent:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"Đã xảy ra lỗi khi cố gắng mời số sau: %(phoneNumber)s\n" +"\n" +"Lỗi: %(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" +"Bạn có chắc chắn muốn xóa hoạt động này không? Nó sẽ biến mất mãi mãi. 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "Hỏi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "Khoảng trắng" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "Gọi" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "Cuộc gọi từ %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "Cuộc gọi từ %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "Cuộc gọi từ một thiết bị khác" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "Cuộc gọi bị từ chối (lý do: “%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "Cuộc gọi tới %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "Cuộc gọi tới %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "Calling" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "Đang gọi %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "Cuộc gọi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "Hủy" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "Hủy hoạt động" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"Không thể truy cập thiết bị ghi âm. Nếu bạn đã từ chối quyền truy cập vào " +"micrô của mình, vui lòng cho phép truy cập và thử lại. Nếu không, hãy đảm " +"bảo rằng trang web này đang chạy trên HTTPS và bạn không cài đặt cho trình " +"duyệt từ chối quyền truy cập vào các thiết bị đa phương tiện." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "Thay đổi thiết bị đầu vào" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "Chọn một thiết bị:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"Chọn phương thức sẽ sử dụng để thực hiện cuộc gọi khi sử dụng ứng dụng di động:\n" +" • VoIP: Luôn sử dụng ứng dụng điện thoại Odoo\n" +" • Tính năng điện thoại của thiết bị: Luôn sử dụng tính năng điện thoại của thiết bị\n" +" • Hỏi: Luôn hỏi xem có phải sử dụng ứng dụng điện thoại hay tính năng điện thoại của thiết bị không" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "Đóng" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "Đóng bàn phím số" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "Đóng ứng dụng điện thoại" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "Thông tin đóng" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "Cài đặt cấu hình" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "Xác nhận" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "Đang kết nối…" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "Liên hệ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "Liên hệ" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "Liên hệ có số điện thoại sẽ được hiển thị ở đây." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "Được tạo bởi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "Được tạo vào" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "Khách hàng" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "Demo" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "Tính năng điện thoại của thiết bị" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "Hướng" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "Tên hiển thị" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "Tài liệu" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "Chỉnh sửa" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "Kết thúc cuộc gọi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "Ngày kết thúc" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "Nhập số hoặc tên" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "Nhập số..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "Số thiết bị bên ngoài" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "Số thiết bị bên ngoài" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"Không tải được thư viện SIP.js:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "Cúp máy nhưng vẫn tiếp tục cuộc gọi trong hàng đợi" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "Chờ chút nhé!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "Cách thực hiện cuộc gọi trên thiết bị di động" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "Cách thực hiện cuộc gọi trên thiết bị di động" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "Nếu bật, các cuộc gọi đến sẽ tự động bị từ chối trong Odoo." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"Nếu bật, việc thực hiện cuộc gọi trong Odoo sẽ chuyển cuộc gọi đến \"Số " +"thiết bị bên ngoài\". Sử dụng tùy chọn này để thực hiện cuộc gọi trong Odoo " +"và xử lý cuộc gọi đó từ một thiết bị khác - ví dụ: điện thoại bàn của bạn." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" +"Nếu tùy chọn \"Gọi từ thiết bị khác\" được bật, các cuộc gọi thực hiện trong" +" Odoo sẽ được chuyển đến số điện thoại này." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "Đang gọi điện trong: %(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "Nhập về" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "Cuộc gọi đến từ..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "Lựa chọn thiết bị đầu vào" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Có trong danh sách cuộc gọi chờ" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "Cuộc gọi nhìn thấy lần cuối" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "Cập nhật lần cuối bởi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "Cập nhật lần cuối vào" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "Đánh dấu xong" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "Bấm nhầm, rất xin lỗi." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "Bỏ lỡ" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "Cuộc gọi nhỡ từ %(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "Di động" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "Di động:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "Tắt tiếng" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "Hoạt động tiếp theo" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "Không có thiết bị ghi âm nào. Cần có micrô để sử dụng ứng dụng này." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "Không có cuộc gọi nào được lên lịch cho hôm nay 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "Không tìm thấy kết quả nào 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "Đang diễn ra" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "Mở bàn phím số" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "Mở ứng dụng điện thoại" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "Xuất đi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "IP máy chủ PBX" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" +"Địa chỉ PBX hoặc Websocket bị thiếu. Vui lòng kiểm tra cài đặt của bạn." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "Điện thoại" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "Số điện thoại" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "Điện thoại:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "Vui lòng chấp nhận việc sử dụng micrô." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" +"Vui lòng thử lại sau. Nếu sự cố vẫn tiếp diễn, bạn có thể yêu cầu quản trị " +"viên kiểm tra cấu hình." + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "Sản xuất" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "Gần đây" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "Đăng ký bị từ chối: %(statusCode)s %(reasonPhrase)s." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "Từ chối cuộc gọi đến" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "Bị từ chối" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "Đã từ chối cuộc gọi từ %(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "Đã từ chối cuộc gọi tới %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "Bạn có nhớ không?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "Bỏ khỏi danh sách cuộc gọi đợi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "Người phụ trách" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "Đang đổ chuông..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "Lên lịch & thực hiện cuộc gọi từ cơ sở dữ liệu của bạn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "Lịch làm việc" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "Tìm kiếm" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "Chọn phương thức gọi điện" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "Gửi email" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "Nên tự động từ chối cuộc gọi đến" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "Nên gọi từ một thiết bị khác" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" +"Không thể thêm một số tập dữ liệu vào danh sách cuộc gọi chờ vì chúng chưa " +"có số điện thoại: %(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "Ngày bắt đầu" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "Trạng thái" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "Hãy cho chúng tôi biết cách thực hiện cuộc gọi:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "Đã chấm dứt" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "Địa chỉ IP của Máy chủ PBX của bạn" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL của WebSocket của bạn" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "Đã mất kết nối WebSocket và không thể thiết lập lại." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" +"Lỗi có thể xuất phát từ tầng giao vận. Vui lòng yêu cầu quản trị viên xác " +"minh URL máy chủ websocket trong Cài đặt chung. Nếu sự cố vẫn tiếp diễn, thì" +" có thể máy chủ đã gặp vấn đề." + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "Tên của hoạt động liên quan đến cuộc gọi điện thoại này, nếu có." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"Số không chính xác, thông tin đăng nhập của người dùng có thể bị sai hoặc không thể thực hiện kết nối. Vui lòng kiểm tra cấu hình của bạn.\n" +"(Lý do nhận được:%(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "Mật khẩu sẽ được sử dụng để đăng ký với máy chủ PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "Người bạn cố gắng liên hệ hiện không có mặt." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"Máy chủ không thể xác minh bạn. Vui lòng yêu cầu quản trị viên xác thực rằng" +" bạn đang truy cập đúng máy chủ (IP máy chủ PBX trong Cài đặt chung) và " +"thông tin đăng nhập trong tùy chọn người dùng của bạn là chính xác." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" +"Không thể khởi động user agent. URL máy chủ websocket có thể không chính " +"xác. Vui lòng yêu cầu quản trị viên kiểm tra URL máy chủ websocket trong Cài" +" đặt chung." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" +"Tên người dùng (thường là số máy lẻ) sẽ được sử dụng để đăng ký với máy chủ " +"PBX." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "Đã mất kết nối websocket với máy chủ. Hãy thử kết nối lại..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" +"Vẫn còn một cuộc gọi đang diễn ra, bạn có chắc chắn muốn rời khỏi trang này " +"không?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "Điều chuyển" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "Điều chuyển tới" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "Mở ứng dụng điện thoại" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "Bỏ tắt tiếng" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "Người dùng" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "Cài đặt người dùng" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "Sử dụng VoIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "Sử dụng tính năng điện thoại của thiết bị" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "Hỗ trợ danh sách chờ VOIP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "Cấu hình VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "Môi trưởng VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "Mã bí mật VoIP" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "Tên người dùng/số máy lẻ VoIP" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip/Cuộc gọi" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Mã bí mật Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Tên người dùng Voip" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "Tôi đồng ý." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" +"Trình duyệt của bạn không hỗ trợ một số tính năng cần thiết để VoIP có thể " +"hoạt động. Vui lòng thử cập nhật trình duyệt hoặc sử dụng một trình duyệt " +"khác." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" +"Không có lịch sử cuộc gọi! Hãy gọi ngay để lịch sử hiển thị tại đây. 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" +"Thông tin đăng nhập của bạn được cài đặt chưa chính xác. Vui lòng liên hệ " +"với quản trị viên." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "dưới một giây" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "điện thoại" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip" diff --git a/voip/i18n/voip.pot b/voip/i18n/voip.pot new file mode 100644 index 0000000..4ebe53e --- /dev/null +++ b/voip/i18n/voip.pot @@ -0,0 +1,1111 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2024-08-13 10:41+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "" diff --git a/voip/i18n/zh_CN.po b/voip/i18n/zh_CN.po new file mode 100644 index 0000000..07077c8 --- /dev/null +++ b/voip/i18n/zh_CN.po @@ -0,0 +1,1137 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# 山西清水欧度(QQ:54773801) <54773801@qq.com>, 2023 +# 湘子 南 <1360857908@qq.com>, 2024 +# Chloe Wang, 2024 +# Wil Odoo, 2024 +# Jeffery CHEN , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Jeffery CHEN , 2024\n" +"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s 分 %(seconds)s 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s 分钟" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s 未接来电" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1分钟" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1个未接电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2分钟" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2个未接电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "在尝试访问录音设备时发生了硬件错误。请确保您的驱动程序是最新的,然后再试一次。" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "使用网络电话应用程序处理的电话呼叫" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "中止" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "呼叫 %(phone_number)s 中止" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "活动" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "活动名称" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "添加到呼叫队列" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"录音设备(%(errorName)s)发生错误:\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"用户代理实例化过程中发生错误:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"尝试邀请以下号码时发生错误:%(phoneNumber)s\n" +"\n" +"错误:%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "您确定要删除此活动吗?它将永远丢失,而丢失的时间是相当长的😔。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "提问" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "退格键" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "电话" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "来自 %(correspondent)s 的呼叫" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "来自 %(phone_number)s 的呼叫" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "来自其他设备的呼叫" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "呼叫被拒绝 (原因:“%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "呼叫 %(correspondent)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "呼叫 %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "连接中" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "拨打 %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "取消" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "取消活动" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "无法访问录音设备。如果您拒绝访问麦克风,请允许后再试一次。否则,请确保本网站通过 HTTPS 运行,且您的浏览器未设置为拒绝访问媒体设备。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "更改输入设备" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "选择设备:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"在使用移动端应用程序时,选择用于拨打电话的方法。\n" +" • VoIP:始终使用 ERP 软电话\n" +" • 设备的电话:总是使用设备的电话\n" +" • 询问:总是询问是否必须使用软电话或设备的电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "关闭" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "关闭 Numpad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "关闭软电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "关闭细节" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "配置设置" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "确认" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "正在连接..." + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "联系人" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "联系人" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "带有电话号码的联系人将显示在此处。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "创建人" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "创建日期" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "客户" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "演示" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "设备的电话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "方向" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "显示名称" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "文档" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "编辑" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "结束通话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "结束日期" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "输入号码或名称" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "输入数字..." + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "外部设备号码" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "外部设备号码" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"加载 SIP.js 库失败:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "挂断电话,但将电话留在队列中" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "稍等!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "如何在移动端拨打电话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "如何在移动端拨打电话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "ID" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "如果启用,来电将在Odoo中被自动拒绝。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"如果启用,在 ERP 中调拨打电话将把电话转到 \"外部设备号码\"。使用该选项在 ERP 中拨打电话,但从另一个设备--例如你的桌面电话--处理它." + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "如果 “从另一设备拨打电话 ”选项被启用,在 ERP 中拨打的电话将被转接到这个电话号码." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "正在呼叫:%(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "进货" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "来自..." + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "输入设备选择" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "在呼叫队列" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "最后出现的电话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "最后更新人" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "上次更新日期" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "完成" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "没打中,抱歉。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "错过了" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "来自 %(phone_number)s 的未接来电" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "手机" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "手机:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "静音" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "下一活动" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "没有可用的录音设备。该应用程序需要一个麦克风才能使用。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "今天没有安排通话 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "没有搜索结果 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "持续" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "打开 Numpad" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "开放式软电话" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "发信" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX服务器IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX或Websocket地址丢失。请检查您的设置。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "电话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "电话号码" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "电话:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "请同意使用麦克风。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "请稍后再试。如果问题仍然存在,您可能要请管理员检查一下配置。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "生产" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "最近" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "注册被拒绝:%(statusCode)s%(reasonPhrase)s。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "拒绝来电" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "已拒绝" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "拒接来自 %(phone_number)s 的呼叫" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "拒绝调用 %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "记得吗?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "从呼叫队列中移除" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "负责人" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "铃声..." + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "计划并从数据库中拨打电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "安排活动" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "搜索" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "选择呼叫方法" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "发送电子邮件" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "应自动拒绝来电" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "应从其他设备拨打电话" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "某些文档无法添加到呼叫队列,因为它们没有设置电话号码:%(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "开始日期" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "状态" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "告诉我们如何拨打电话:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "终止" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "您的PBX服务器的IP地址" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "你的WebSocket的网址" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "WebSocket 连接丢失,无法重新建立。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "该错误可能来自传输层。请让管理员验证 \"常规设置 \"中的websocket服务器URL。如果问题持续存在,这可能是服务器的问题。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "与此电话有关的活动名称(如果有)。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"号码不正确、用户凭证可能有误或无法连接。请检查您的配置。\n" +"(收到的原因:%(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "用于向 PBX 服务器注册的密码。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "你试图联系的人目前不在。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "服务器无法对您进行身份验证。 请让管理员验证您正在访问正确的服务器(常规设置中的PBX服务器IP)以及您的用户偏好中的凭据是否正确。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "用户代理无法启动。websocket 服务器 URL 可能不正确。请让管理员检查常规设置中的 websocket 服务器 URL。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "将用于向PBX服务器注册的用户名 (通常是分机号)。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "与服务器的 websocket 连接已丢失。尝试重新建立连接⋯" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "仍在通话中,您确定要离开页面吗?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "转账" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "转移至" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "展开软电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "频道" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "用户" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "用户设置" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "使用网络电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "使用设备的电话" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VOIP队列支持" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP配置" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP 环境" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP密钥" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP用户名 / 分机号" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "网络电话/通话" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip 密钥" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip 用户名" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "是的,就这么做。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "您的浏览器不支持网络电话运行所需的某些功能。请尝试更新浏览器或使用其他浏览器。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "您的通话记录是空的!现在拨打电话,并在此列出 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "您的登录信息设置不正确。请联系您的管理员。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "不到一秒钟" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "电话" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "语音电话" diff --git a/voip/i18n/zh_TW.po b/voip/i18n/zh_TW.po new file mode 100644 index 0000000..2b97003 --- /dev/null +++ b/voip/i18n/zh_TW.po @@ -0,0 +1,1137 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip +# +# Translators: +# Tony Ng, 2024 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-13 10:41+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/odoo/teams/41243/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s min %(seconds)s sec" +msgstr "%(minutes)s 分 %(seconds)s 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(minutes)s minutes" +msgstr "%(minutes)s 分鐘" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "%(number)s missed calls" +msgstr "%(number)s 個未接來電" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "%(seconds)s seconds" +msgstr "%(seconds)s 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 minute" +msgstr "1 分鐘" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "1 missed call" +msgstr "1 個未接來電" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "1 second" +msgstr "1 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 minutes" +msgstr "2 分鐘" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "2 missed calls" +msgstr "2 個未接來電" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "2 seconds" +msgstr "2 秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"A hardware error has occurred while trying to access the audio recording " +"device. Please ensure that your drivers are up to date and try again." +msgstr "嘗試存取錄音裝置時,發生硬件錯誤。請確保驅動程式是最新的,然後再試。" + +#. module: voip +#: model:ir.model,name:voip.model_voip_call +msgid "A phone call handled using the VoIP application" +msgstr "使用 VoIP 網絡通話應用程式處理的電話通話" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__aborted +msgid "Aborted" +msgstr "已中止" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Aborted call to %(phone_number)s" +msgstr "已中止撥號至 %(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: model:ir.model,name:voip.model_mail_activity +#, python-format +msgid "Activity" +msgstr "活動" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__activity_name +msgid "Activity Name" +msgstr "活動名稱" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Add to Call Queue" +msgstr "加入至通話列隊" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occured involving the audio recording device (%(errorName)s):\n" +"%(errorMessage)s" +msgstr "" +"發生涉及錄音設備的錯誤(%(errorName)s):\n" +"%(errorMessage)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred during the instantiation of the User Agent:\n" +"\n" +"%(error)s" +msgstr "" +"使用者代理實例化期間,發生錯誤:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"An error occurred trying to invite the following number: %(phoneNumber)s\n" +"\n" +"Error: %(error)s" +msgstr "" +"嘗試邀請以下號碼時出錯:%(phoneNumber)s\n" +"\n" +"錯誤:%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "" +"Are you sure you want to delete this activity? It will be lost forever, " +"which is quite a long time 😔" +msgstr "確定要刪除此活動?它將會永遠消失⋯ 😔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__ask +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__ask +msgid "Ask" +msgstr "詢問" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Backspace" +msgstr "倒退鍵 Backspace" + +#. module: voip +#. odoo-javascript +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Call" +msgstr "語音通話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(correspondent)s" +msgstr "%(correspondent)s 撥入通話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call from %(phone_number)s" +msgstr "通話要求,來電者:%(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_call_from_another_device +msgid "Call from another device" +msgstr "來自另一裝置的通話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Call rejected (reason: “%(reasonPhrase)s”)" +msgstr "通話被拒(原因:“%(reasonPhrase)s”)" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(correspondent)s" +msgstr "撥打至 %(correspondent)s 的通話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Call to %(phone_number)s" +msgstr "撥號至 %(phone_number)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__calling +msgid "Calling" +msgstr "正在撥打" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Calling %(phone number)s" +msgstr "正在撥號至 %(phone number)s" + +#. module: voip +#: model:ir.actions.act_window,name:voip.voip_call_view +#: model_terms:ir.ui.view,arch_db:voip.voip_call_tree_view +msgid "Calls" +msgstr "通話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Cancel" +msgstr "取消" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "Cancel the activity" +msgstr "取消活動" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Cannot access audio recording device. If you have denied access to your " +"microphone, please allow it and try again. Otherwise, make sure that this " +"website is running over HTTPS and that your browser is not set to deny " +"access to media devices." +msgstr "" +"未能存取錄音設備。如果你拒絕存取麥克風,請允許存取然後再試。否則,請確保網站透過 HTTPS 運作,以及你的瀏覽器並非設為拒絕存取媒體裝置。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Change input device" +msgstr "更改輸入裝置" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Choose a device:" +msgstr "選擇裝置:" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__how_to_call_on_mobile +msgid "" +"Choose the method to be used to place a call when using the mobile application:\n" +" • VoIP: Always use the Odoo softphone\n" +" • Device's phone: Always use the device's phone\n" +" • Ask: Always ask whether the softphone or the device's phone must be used\n" +" " +msgstr "" +"選擇流動應用程式撥打電話的方法:\n" +" • VoIP:每次都使用 Odoo 的電話軟件(VoIP 網絡通話)\n" +" • 裝置的電話:每次都使用裝置的電話\n" +" • 詢問:每次詢問是使用電話軟件還是裝置電話\n" +" " + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Close" +msgstr "關閉" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Close Numpad" +msgstr "關閉撥號鍵盤" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Close Softphone" +msgstr "關閉軟件電話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Close details" +msgstr "關閉詳情" + +#. module: voip +#: model:ir.model,name:voip.model_res_config_settings +msgid "Config Settings" +msgstr "配置設定" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#: code:addons/voip/static/src/mobile/devise_selection_dialog.xml:0 +#, python-format +msgid "Confirm" +msgstr "確認" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Connecting…" +msgstr "連接中⋯" + +#. module: voip +#: model:ir.model,name:voip.model_res_partner +#: model:ir.model.fields,field_description:voip.field_voip_call__partner_id +msgid "Contact" +msgstr "聯絡人" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Contacts" +msgstr "聯絡人" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#, python-format +msgid "Contacts with a phone number will be shown here." +msgstr "此處將顯示有電話號碼的聯絡人。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_uid +msgid "Created by" +msgstr "建立人員" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__create_date +msgid "Created on" +msgstr "建立於" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Customer" +msgstr "客戶" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__demo +msgid "Demo" +msgstr "範例" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__phone +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__phone +msgid "Device's phone" +msgstr "裝置的電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__direction +msgid "Direction" +msgstr "方向" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__display_name +msgid "Display Name" +msgstr "顯示名稱" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Documents" +msgstr "文件" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Edit" +msgstr "編輯" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "End Call" +msgstr "結束通話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__end_date +msgid "End Date" +msgstr "結束日期" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Enter number or name" +msgstr "輸入號碼或姓名" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/numpad.xml:0 +#, python-format +msgid "Enter the number…" +msgstr "輸入號碼⋯" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__external_device_number +msgid "External Device Number" +msgstr "外部裝置號碼" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__external_device_number +msgid "External device number" +msgstr "外部裝置號碼" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Failed to load the SIP.js library:\n" +"\n" +"%(error)s" +msgstr "" +"載入 SIP.js 程式庫失敗:\n" +"\n" +"%(error)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Hang up but keep call in queue" +msgstr "掛線但保留通話在列隊中" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Hold on!" +msgstr "請稍等,不要掛線!" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__how_to_call_on_mobile +msgid "How To Call On Mobile" +msgstr "如何在流動裝置撥打電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__how_to_call_on_mobile +msgid "How to place calls on mobile" +msgstr "如何在流動裝置撥打電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__id +msgid "ID" +msgstr "識別號" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "If enabled, incoming calls will be automatically declined in Odoo." +msgstr "如果啟用,Odoo 會自動拒絕來電。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__should_call_from_another_device +msgid "" +"If enabled, placing a call in Odoo will transfer the call to the \"External " +"device number\". Use this option to place the call in Odoo but handle it " +"from another device - e.g. your desk phone." +msgstr "" +"如果啟用,在 Odoo 中撥打電話會將通話轉駁至「外部裝置號碼」。使用此選項可在 Odoo 中撥打電話,但從其他裝置處理該次通話,例如你的桌上電話。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__external_device_number +msgid "" +"If the \"Call from another device\" option is enabled, calls placed in Odoo " +"will be transfered to this phone number." +msgstr "若已啟用「從其他裝置撥打」選項,在 Odoo 中撥打的電話將會轉駁至此電話號碼。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "In call for: %(minutes)s:%(seconds)s" +msgstr "通話持續時間:%(minutes)s:%(seconds)s" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__incoming +msgid "Incoming" +msgstr "入庫" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/call_invitation.xml:0 +#, python-format +msgid "Incoming call from…" +msgstr "撥入通話來自⋯" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/device_selection_dialog.js:0 +#, python-format +msgid "Input device selection" +msgstr "輸入裝置選擇" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_partner__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_res_users__has_call_in_queue +#: model:ir.model.fields,field_description:voip.field_voip_queue_mixin__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "是在通話列隊內" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__last_seen_phone_call +msgid "Last Seen Phone Call" +msgstr "上次電話通話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_uid +msgid "Last Updated by" +msgstr "最後更新者" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__write_date +msgid "Last Updated on" +msgstr "最後更新於" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Mark as done" +msgstr "標記為完成" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Missclicked, sorry." +msgstr "按錯了,抱歉。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__missed +msgid "Missed" +msgstr "缺席" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Missed call from %(phone_number)s" +msgstr "未接來電,來電者:%(phone_number)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__mobile +msgid "Mobile" +msgstr "行動電話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Mobile:" +msgstr "手提:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Mute" +msgstr "靜音" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Next Activities" +msgstr "下一步活動" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"No audio recording device available. The application requires a microphone " +"in order to be used." +msgstr "沒有可用的錄音設備。應用程式需要有麥克風才可使用。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#, python-format +msgid "No calls scheduled for today 😎" +msgstr "今天沒有安排通話 😎" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.xml:0 +#: code:addons/voip/static/src/softphone/contacts_tab.xml:0 +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "No search results 💔" +msgstr "沒有搜尋結果 💔" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__ongoing +msgid "Ongoing" +msgstr "進行中" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Open Numpad" +msgstr "開啟撥號鍵盤" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Open Softphone" +msgstr "開啟軟件電話" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__direction__outgoing +msgid "Outgoing" +msgstr "出向" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__pbx_ip +msgid "PBX Server IP" +msgstr "PBX 伺服器 IP" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "PBX or Websocket address is missing. Please check your settings." +msgstr "PBX 或 Websocket 位址缺漏。請檢查設定。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_mail_activity__phone +msgid "Phone" +msgstr "電話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__phone_number +msgid "Phone Number" +msgstr "電話號碼" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/activity/activity_patch.xml:0 +#, python-format +msgid "Phone:" +msgstr "電話:" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "Please accept the use of the microphone." +msgstr "請同意使用麥克風。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"Please try again later. If the problem persists, you may want to ask an " +"administrator to check the configuration." +msgstr "請稍後再試。如果問題持續,你可能需要請管理員檢查配置。" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__res_config_settings__mode__prod +msgid "Production" +msgstr "生產" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#, python-format +msgid "Recent" +msgstr "最近" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "Registration rejected: %(statusCode)s %(reasonPhrase)s." +msgstr "登記被拒:%(statusCode)s %(reasonPhrase)s。" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__should_auto_reject_incoming_calls +msgid "Reject incoming calls" +msgstr "拒絕來電" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__rejected +msgid "Rejected" +msgstr "已拒絕" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call from %(phone_number)s" +msgstr "已拒絕通話請求,來電者:%(phone_number)s" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_call.py:0 +#, python-format +msgid "Rejected call to %(phone_number)s" +msgstr "已拒絕撥號至%(phone_number)s" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Remember?" +msgstr "記得嗎?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/call_queue_switch.js:0 +#, python-format +msgid "Remove from Call Queue" +msgstr "從通話列隊中移除" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__user_id +msgid "Responsible" +msgstr "負責人" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Ringing…" +msgstr "響鈴中⋯" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.res_config_settings_view_form +msgid "Schedule & make calls from your database" +msgstr "在資料庫中安排及撥打電話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Schedule Activity" +msgstr "安排活動" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.xml:0 +#, python-format +msgid "Search" +msgstr "搜尋" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.js:0 +#, python-format +msgid "Select a call method" +msgstr "選擇通話方法" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#, python-format +msgid "Send e-mail" +msgstr "傳送電郵" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_auto_reject_incoming_calls +msgid "Should Auto Reject Incoming Calls" +msgstr "應自動拒絕來電" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__should_call_from_another_device +msgid "Should Call From Another Device" +msgstr "應從其他裝置撥出電話" + +#. module: voip +#. odoo-python +#: code:addons/voip/models/voip_queue_mixin.py:0 +#, python-format +msgid "" +"Some documents cannot be added to the call queue as they do not have a phone" +" number set: %(record_names)s" +msgstr "部份文件未能加入至通話列隊,因為它們未有設定電話號碼:%(record_names)s" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__start_date +msgid "Start Date" +msgstr "開始日期" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_voip_call__state +msgid "State" +msgstr "狀態" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Tell us how to make the call:" +msgstr "告訴我們如何撥打電話:" + +#. module: voip +#: model:ir.model.fields.selection,name:voip.selection__voip_call__state__terminated +msgid "Terminated" +msgstr "已被終止" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__pbx_ip +msgid "The IP address of your PBX Server" +msgstr "你的 PBX 伺服器的 IP 位址" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "你的 WebSocket 的網址" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The WebSocket connection was lost and couldn't be reestablished." +msgstr "WebSocket 連線已斷線,而且無法重新建立。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The error may come from the transport layer. Please have an administrator " +"verify the websocket server URL in the General Settings. If the problem " +"persists, this is probably an issue with the server." +msgstr "此錯誤可能來自傳輸層。請要求管理員在一般設定中,驗證 websocket 伺服器網址。如果問題持續,可能是伺服器有問題。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_voip_call__activity_name +msgid "The name of the activity related to this phone call, if any." +msgstr "關聯至此電話通話的活動名稱(如果有)。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n" +"(Reason received: %(reasonPhrase)s)" +msgstr "" +"號碼不正確、使用者登入憑證可能有錯誤,或無法建立連線。請檢查配置。\n" +"(收到的原因:%(reasonPhrase)s)" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_secret +msgid "The password that will be used to register with the PBX server." +msgstr "將用於在 PBX 伺服器註冊的密碼。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "The person you try to contact is currently unavailable." +msgstr "你嘗試聯絡的人目前未可聯絡上。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/registerer.js:0 +#, python-format +msgid "" +"The server failed to authenticate you. Please have an administrator verify " +"that you are reaching the right server (PBX server IP in the General " +"Settings) and that the credentials in your user preferences are correct." +msgstr "" +"伺服器未能驗證你的身份。請要求管理員驗證你正嘗試存取的伺服器正確(一般設定中的 PBX 伺服器 IP 位址),以及你的使用者偏好設定中的登入資訊正確。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The user agent could not be started. The websocket server URL may be " +"incorrect. Please have an administrator check the websocket server URL in " +"the General Settings." +msgstr "未能啟動使用者代理。可能是 websocket 伺服器網址不正確。請要求管理員在一般設定中,檢查 websocket 伺服器網址。" + +#. module: voip +#: model:ir.model.fields,help:voip.field_res_users_settings__voip_username +msgid "" +"The username (typically the extension number) that will be used to register " +"with the PBX server." +msgstr "將用作向 PBX 伺服器註冊的使用者名稱(通常是分機號碼)。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"The websocket connection to the server has been lost. Attempting to " +"reestablish the connection…" +msgstr "與伺服器的 websocket 連線已斷線。正在嘗試重新建立連線⋯" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/voip_service.js:0 +#, python-format +msgid "" +"There is still a call in progress, are you sure you want to leave the page?" +msgstr "仍有通話正在進行,確定要離開頁面?" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.xml:0 +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer" +msgstr "轉移" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/transfer_popover.xml:0 +#, python-format +msgid "Transfer to" +msgstr "調撥至" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/web/voip_systray_item.js:0 +#, python-format +msgid "Unfold Softphone" +msgstr "展開軟件電話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/correspondence_details.js:0 +#, python-format +msgid "Unmute" +msgstr "解除靜音" + +#. module: voip +#: model:ir.model,name:voip.model_res_users +msgid "User" +msgstr "使用者" + +#. module: voip +#: model:ir.model,name:voip.model_res_users_settings +msgid "User Settings" +msgstr "使用者設定" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using VoIP" +msgstr "使用 VoIP 網絡通話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "Using device's phone" +msgstr "使用裝置的電話" + +#. module: voip +#: model:ir.model,name:voip.model_voip_queue_mixin +msgid "VOIP Queue support" +msgstr "VoIP 列隊支援" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/softphone.js:0 +#: model:ir.model.fields.selection,name:voip.selection__res_users__how_to_call_on_mobile__voip +#: model:ir.model.fields.selection,name:voip.selection__res_users_settings__how_to_call_on_mobile__voip +#: model_terms:ir.ui.view,arch_db:voip.res_user_form +#: model_terms:ir.ui.view,arch_db:voip.res_users_view_form_preferences +#, python-format +msgid "VoIP" +msgstr "VoIP 網絡電話" + +#. module: voip +#: model_terms:ir.ui.view,arch_db:voip.voip_res_users_settings_view_form +msgid "VoIP Configuration" +msgstr "VoIP 配置" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__mode +msgid "VoIP Environment" +msgstr "VoIP 環境" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_secret +msgid "VoIP secret" +msgstr "VoIP 秘密" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users_settings__voip_username +msgid "VoIP username / Extension number" +msgstr "VoIP 使用者名稱 / 分機號碼" + +#. module: voip +#: model:ir.ui.menu,name:voip.menu_voip_call_view +msgid "Voip / Calls" +msgstr "Voip / 通話" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_secret +msgid "Voip Secret" +msgstr "Voip 秘密" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_users__voip_username +msgid "Voip Username" +msgstr "Voip 使用者名稱" + +#. module: voip +#: model:ir.model.fields,field_description:voip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/activities_tab.js:0 +#, python-format +msgid "Yes, do it." +msgstr "好,就這樣做。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your browser does not support some of the features required for VoIP to " +"work. Please try updating your browser or using a different one." +msgstr "你的瀏覽器不支援 VoIP 網絡通話運作所需的部份功能。請嘗試更新你的瀏覽器,或使用其他瀏覽器。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/softphone/recent_tab.xml:0 +#, python-format +msgid "Your call history is empty! Make a call now and have it listed here 💡" +msgstr "通話記錄仍是空白。立即撥打電話吧,資料將在此處列出 💡" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/user_agent_service.js:0 +#, python-format +msgid "" +"Your login details are not set correctly. Please contact your administrator." +msgstr "你的登入詳情未正確設定。請聯絡你的管理員。" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/core/call_model.js:0 +#, python-format +msgid "less than a second" +msgstr "少於一秒" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "phone" +msgstr "行動電話" + +#. module: voip +#. odoo-javascript +#: code:addons/voip/static/src/mobile/call_method_selection_dialog.xml:0 +#, python-format +msgid "voip" +msgstr "voip 網絡通話" diff --git a/voip/models/__init__.py b/voip/models/__init__.py new file mode 100644 index 0000000..3101033 --- /dev/null +++ b/voip/models/__init__.py @@ -0,0 +1,9 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import voip_queue_mixin # keep this before res_partner import +from . import mail_activity +from . import res_config_settings +from . import res_partner +from . import res_users +from . import res_users_settings +from . import voip_call diff --git a/voip/models/mail_activity.py b/voip/models/mail_activity.py new file mode 100644 index 0000000..0b907a2 --- /dev/null +++ b/voip/models/mail_activity.py @@ -0,0 +1,134 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from collections import defaultdict +from odoo import api, fields, models, tools + + +class MailActivity(models.Model): + _inherit = "mail.activity" + + phone = fields.Char("Phone", compute="_compute_phone_numbers", readonly=False, store=True) + mobile = fields.Char("Mobile", compute="_compute_phone_numbers", readonly=False, store=True) + + @api.depends("res_model", "res_id", "activity_type_id") + def _compute_phone_numbers(self): + call_activities = self.filtered( + lambda activity: activity.id + and activity.res_model + and activity.res_id + and activity.activity_category == "phonecall" + ) + (self - call_activities).phone = False + (self - call_activities).mobile = False + phone_numbers_by_activity = call_activities._get_phone_numbers_by_activity() + for activity in call_activities: + activity.mobile = phone_numbers_by_activity[activity]["mobile"] + activity.phone = phone_numbers_by_activity[activity]["phone"] + + @api.model_create_multi + def create(self, vals_list): + activities = super().create(vals_list) + call_activities = activities.filtered( + lambda activity: (activity.phone or activity.mobile) and activity.activity_category == "phonecall" + ) + notifications = [[user.partner_id, "refresh_call_activities", {}] for user in call_activities.user_id] + self.env["bus.bus"]._sendmany(notifications) + return activities + + def write(self, values): + if "date_deadline" in values and self.user_id: + self.env["bus.bus"]._sendmany( + [[partner, "refresh_call_activities", {}] for partner in self.user_id.partner_id] + ) + return super().write(values) + + @api.model + def get_today_call_activities(self): + """Retrieve the list of activities that: + * have the type “phonecall” + * have a phone number + * are overdue + * are assigned to the current user + * are in the current company + + The resulting list is intended for display in the “Next Activities” tab. + """ + overdue_call_activities_of_current_user = self.search( + [ + ("activity_type_id.category", "=", "phonecall"), + ("user_id", "=", self.env.uid), + ("date_deadline", "<=", fields.Date.today()), + "|", + ("mobile", "!=", False), + ("phone", "!=", False), + ] + ) + # ----- Tackling multi-company shenanigans 👺 ----- + record_ids_by_model_name = defaultdict(set) + for activity in overdue_call_activities_of_current_user: + record_ids_by_model_name[activity.res_model].add(activity.res_id) + allowed_record_ids_by_model_name = defaultdict(list) + for model_name, ids in record_ids_by_model_name.items(): + # calling search will filter out records that are irrelevant to the current company + allowed_record_ids_by_model_name[model_name] = self.env[model_name].search([("id", "in", list(ids))]).ids + return overdue_call_activities_of_current_user.filtered( + lambda activity: activity.res_id in allowed_record_ids_by_model_name[activity.res_model] + )._format_call_activities() + + def _action_done(self, feedback=False, attachment_ids=None): + """Extends _action_done to notify the user assigned to a phonecall + activity that it has been marked as done. This is useful to trigger the + refresh of the “Next Activities” tab. + """ + to_notify = self.filtered( + lambda activity: activity.activity_type_id.category == "phonecall" + ).user_id.partner_id + self.env["bus.bus"]._sendmany([[partner, "refresh_call_activities", {}] for partner in to_notify]) + return super()._action_done(feedback=feedback, attachment_ids=attachment_ids) + + def _format_call_activities(self): + """Serializes call activities for transmission to/use by the client side.""" + formatted_activities = [] + call_activities = self.filtered(lambda activity: activity.activity_type_id.category == "phonecall") + for model_name, activities in call_activities.grouped("res_model").items(): + model = self.env[model_name] + records = model.browse(activities.mapped("res_id")) + partners_by_records = records._mail_get_partners(introspect_fields=True) + partners = self.env["res.partner"].browse([p[:1].id for p in partners_by_records.values() if p]) + formatted_partners_by_record = partners.mail_partner_format() + for activity in activities: + activity_data = { + **activity.read(["id", "res_name", "phone", "mobile", "res_id", "res_model", "state", "date_deadline", "mail_template_ids"])[0], + "activity_category": activity.activity_type_id.category, + "modelName": activity.sudo().res_model_id.display_name, + "user_id": activity._read_format(["user_id"])[0]["user_id"], + } + partner = partners_by_records.get(activity.res_id)[:1] + if partner: + activity_data["partner"] = formatted_partners_by_record[partner] + formatted_activities.append(activity_data) + return formatted_activities + + def _get_phone_numbers_by_activity(self): + """Batch compute the phone numbers associated with the activities. + + :return dict: for each activity, a sub-dict containing: + * phone: phone number (obtained from the activity itself or from the related partner); + * mobile: mobile number (obtained from the activity itself or from the related partner). + """ + phone_numbers_by_activity = {} + data_by_model = self._classify_by_model() + for model, data in data_by_model.items(): + records = self.env[model].browse(data["record_ids"]) + for record, activity in zip(records, data["activities"]): + mobile = record.mobile if "mobile" in record else False + phone = record.phone if "phone" in record else False + if not mobile and not phone: + recipient = next( + iter(record._mail_get_partners(introspect_fields=True)[record.id]), + self.env["res.partner"], + ) + mobile = recipient.mobile + phone = recipient.phone + phone_numbers_by_activity[activity] = {"mobile": mobile, "phone": phone} + return phone_numbers_by_activity diff --git a/voip/models/res_config_settings.py b/voip/models/res_config_settings.py new file mode 100644 index 0000000..4716b21 --- /dev/null +++ b/voip/models/res_config_settings.py @@ -0,0 +1,23 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + wsServer = fields.Char( + "WebSocket", help="The URL of your WebSocket", default="ws://localhost", config_parameter="voip.wsServer" + ) + pbx_ip = fields.Char( + "PBX Server IP", help="The IP address of your PBX Server", default="localhost", config_parameter="voip.pbx_ip" + ) + mode = fields.Selection( + [ + ("demo", "Demo"), + ("prod", "Production"), + ], + string="VoIP Environment", + default="demo", + config_parameter="voip.mode", + required=True, + ) diff --git a/voip/models/res_partner.py b/voip/models/res_partner.py new file mode 100644 index 0000000..5a62448 --- /dev/null +++ b/voip/models/res_partner.py @@ -0,0 +1,31 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models +from odoo.osv import expression + + +class Contact(models.Model): + _name = "res.partner" + _inherit = ["res.partner", "voip.queue.mixin"] + + @api.model + def get_contacts(self, offset, limit, search_terms): + domain = ["|", ("phone", "!=", False), ("mobile", "!=", False)] + if search_terms: + search_fields = ["complete_name", "phone", "mobile", "email"] + search_domain = expression.OR([[(field, "ilike", search_terms)] for field in search_fields]) + domain = expression.AND([domain, search_domain]) + return self.search(domain, offset=offset, limit=limit)._format_contacts() + + def _format_contacts(self): + return [ + { + "id": contact.id, + "displayName": contact.display_name, + "email": contact.email, + "landlineNumber": contact.phone, + "mobileNumber": contact.mobile, + "name": contact.name, + } + for contact in self + ] diff --git a/voip/models/res_users.py b/voip/models/res_users.py new file mode 100644 index 0000000..b935205 --- /dev/null +++ b/voip/models/res_users.py @@ -0,0 +1,134 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models, fields + + +# List of the VoIP-related fields that are configurable by the user using the +# `res.users` form view. Useful to override SELF_READABLE/WRITABLE_FIELDS. +VOIP_USER_CONFIGURATION_FIELDS = [ + "external_device_number", + "how_to_call_on_mobile", + "should_auto_reject_incoming_calls", + "should_call_from_another_device", + "voip_secret", + "voip_username", +] + + +class ResUsers(models.Model): + _inherit = "res.users" + + last_seen_phone_call = fields.Many2one("voip.call") + # -------------------------------------------------------------------------- + # VoIP User Configuration Fields + # -------------------------------------------------------------------------- + # These fields mirror those defined in `res.users.settings`. The reason they + # are not directly defined in here is that we want these fields to have + # different access rights than the rest of the fields of `res.users`. See + # their definition in `res.users.settings` for comprehensive documentation. + # -------------------------------------------------------------------------- + external_device_number = fields.Char( + compute="_compute_external_device_number", + inverse="_reflect_change_in_res_users_settings", + ) + how_to_call_on_mobile = fields.Selection( + [("ask", "Ask"), ("voip", "VoIP"), ("phone", "Device's phone")], + compute="_compute_how_to_call_on_mobile", + inverse="_reflect_change_in_res_users_settings", + ) + should_auto_reject_incoming_calls = fields.Boolean( + compute="_compute_should_auto_reject_incoming_calls", + inverse="_reflect_change_in_res_users_settings", + ) + should_call_from_another_device = fields.Boolean( + compute="_compute_should_call_from_another_device", + inverse="_reflect_change_in_res_users_settings", + ) + voip_secret = fields.Char( + compute="_compute_voip_secret", + inverse="_reflect_change_in_res_users_settings", + ) + voip_username = fields.Char( + compute="_compute_voip_username", + inverse="_reflect_change_in_res_users_settings", + ) + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + VOIP_USER_CONFIGURATION_FIELDS + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + VOIP_USER_CONFIGURATION_FIELDS + + @api.depends("res_users_settings_id.external_device_number") + def _compute_external_device_number(self): + for user in self: + user.external_device_number = user.res_users_settings_id.external_device_number + + @api.depends("res_users_settings_id.how_to_call_on_mobile") + def _compute_how_to_call_on_mobile(self): + for user in self: + user.how_to_call_on_mobile = user.res_users_settings_id.how_to_call_on_mobile + + @api.depends("res_users_settings_id.should_auto_reject_incoming_calls") + def _compute_should_auto_reject_incoming_calls(self): + for user in self: + user.should_auto_reject_incoming_calls = user.res_users_settings_id.should_auto_reject_incoming_calls + + @api.depends("res_users_settings_id.should_call_from_another_device") + def _compute_should_call_from_another_device(self): + for user in self: + user.should_call_from_another_device = user.res_users_settings_id.should_call_from_another_device + + @api.depends("res_users_settings_id.voip_secret") + def _compute_voip_secret(self): + for user in self: + user.voip_secret = user.res_users_settings_id.voip_secret + + @api.depends("res_users_settings_id.voip_username") + def _compute_voip_username(self): + for user in self: + user.voip_username = user.res_users_settings_id.voip_username + + @api.model + def reset_last_seen_phone_call(self): + domain = [("user_id", "=", self.env.user.id)] + last_call = self.env["voip.call"].search(domain, order="id desc", limit=1) + self.env.user.last_seen_phone_call = last_call.id + + def _init_messaging(self): + res = super()._init_messaging() + if not self.env.user._is_internal(): + return res + get_param = self.env["ir.config_parameter"].sudo().get_param + return { + **res, + "voipConfig": { + "mode": get_param("voip.mode", default="demo"), + "missedCalls": self.env["voip.call"]._get_number_of_missed_calls(), + "pbxAddress": get_param("voip.pbx_ip", default="localhost"), + "webSocketUrl": get_param("voip.wsServer", default="ws://localhost"), + }, + } + + def _reflect_change_in_res_users_settings(self): + """ + Updates the values of the VoIP User Configuration Fields in `res_users_settings_ids` to have the same values as + their related fields in `res.users`. If there is no `res.users.settings` record for the user, then the record is + created. + + This method is intended to be used as an inverse for VoIP Configuration Fields. + """ + for user in self: + settings = self.env["res.users.settings"]._find_or_create_for_user(user) + settings.update( + { + "external_device_number": user.external_device_number, + "how_to_call_on_mobile": user.how_to_call_on_mobile or settings.how_to_call_on_mobile, + "should_auto_reject_incoming_calls": user.should_auto_reject_incoming_calls, + "should_call_from_another_device": user.should_call_from_another_device, + "voip_secret": user.voip_secret, + "voip_username": user.voip_username, + } + ) diff --git a/voip/models/res_users_settings.py b/voip/models/res_users_settings.py new file mode 100644 index 0000000..5c4fad6 --- /dev/null +++ b/voip/models/res_users_settings.py @@ -0,0 +1,41 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResUsersSettings(models.Model): + _inherit = "res.users.settings" + + # Credentials for authentication to the PBX server + voip_username = fields.Char( + "VoIP username / Extension number", + help="The username (typically the extension number) that will be used to register with the PBX server.", + ) + voip_secret = fields.Char("VoIP secret", help="The password that will be used to register with the PBX server.") + + should_call_from_another_device = fields.Boolean( + "Call from another device", + help="""If enabled, placing a call in Odoo will transfer the call to the "External device number". Use this option to place the call in Odoo but handle it from another device - e.g. your desk phone.""", + ) + external_device_number = fields.Char( + "External device number", + help="""If the "Call from another device" option is enabled, calls placed in Odoo will be transfered to this phone number.""", + ) + + should_auto_reject_incoming_calls = fields.Boolean( + "Reject incoming calls", + help="If enabled, incoming calls will be automatically declined in Odoo.", + ) + + # Mobile stuff + how_to_call_on_mobile = fields.Selection( + [("ask", "Ask"), ("voip", "VoIP"), ("phone", "Device's phone")], + default="ask", + string="How to place calls on mobile", + help="""Choose the method to be used to place a call when using the mobile application: + • VoIP: Always use the Odoo softphone + • Device's phone: Always use the device's phone + • Ask: Always ask whether the softphone or the device's phone must be used + """, + required=True, + ) diff --git a/voip/models/voip_call.py b/voip/models/voip_call.py new file mode 100644 index 0000000..e61dd8e --- /dev/null +++ b/voip/models/voip_call.py @@ -0,0 +1,168 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ +from odoo.osv import expression + + +class VoipCall(models.Model): + _name = "voip.call" + _description = """A phone call handled using the VoIP application""" + + phone_number = fields.Char(required=True, readonly=True) + direction = fields.Selection( + [ + ("incoming", "Incoming"), + ("outgoing", "Outgoing"), + ], + default="outgoing", + readonly=True, + ) + state = fields.Selection( + [ + ("aborted", "Aborted"), + ("calling", "Calling"), + ("missed", "Missed"), + ("ongoing", "Ongoing"), + ("rejected", "Rejected"), + ("terminated", "Terminated"), + ], + default="calling", + index=True, + ) + end_date = fields.Datetime() + start_date = fields.Datetime() + # Since activities are deleted from the database once marked as done, the + # activity name is saved here in order to be preserved. + activity_name = fields.Char(help="The name of the activity related to this phone call, if any.") + partner_id = fields.Many2one("res.partner", "Contact", index=True) + user_id = fields.Many2one("res.users", "Responsible", default=lambda self: self.env.uid, index=True) + + @api.depends("state", "partner_id.name") + def _compute_display_name(self): + def get_name(call): + if call.activity_name: + return call.activity_name + if call.state == "aborted": + return _("Aborted call to %(phone_number)s", phone_number=call.phone_number) + if call.state == "missed": + return _("Missed call from %(phone_number)s", phone_number=call.phone_number) + if call.state == "rejected": + if call.direction == "incoming": + return _("Rejected call from %(phone_number)s", phone_number=call.phone_number) + return _("Rejected call to %(phone_number)s", phone_number=call.phone_number) + if call.partner_id: + if call.direction == "incoming": + return _("Call from %(correspondent)s", correspondent=call.partner_id.name) + return _("Call to %(correspondent)s", correspondent=call.partner_id.name) + if call.direction == "incoming": + return _("Call from %(phone_number)s", phone_number=call.phone_number) + return _("Call to %(phone_number)s", phone_number=call.phone_number) + + for call in self: + call.display_name = get_name(call) + + @api.model + def create_and_format(self, res_id: int = None, res_model: str = None, **kwargs) -> list: + """Creates a call from the provided values and returns it formatted for + use in JavaScript. If a record is provided via its id and model, + introspects it for a recipient. + """ + if res_id and res_model: + related_record = self.env[res_model].browse(res_id) + kwargs["partner_id"] = next( + iter(related_record._mail_get_partners(introspect_fields=True)[related_record.id]), + self.env["res.partner"], + ).id + return self.create(kwargs)._format_calls() + + @api.model + def get_recent_phone_calls(self, search_terms: str = None, offset: int = 0, limit: int = None) -> list: + domain = [("user_id", "=", self.env.uid)] + if search_terms: + search_fields = ["phone_number", "partner_id.name", "activity_name"] + search_domain = expression.OR([[(field, "ilike", search_terms)] for field in search_fields]) + domain += search_domain + return self.search(domain, offset=offset, limit=limit, order="create_date DESC")._format_calls() + + @api.model + def _get_number_of_missed_calls(self) -> int: + domain = [("user_id", "=", self.env.uid), ("state", "=", "missed")] + last_seen_phone_call = self.env.user.last_seen_phone_call + if last_seen_phone_call: + domain += [("id", ">", last_seen_phone_call.id)] + return self.search_count(domain) + + def abort_call(self) -> list: + self.state = "aborted" + return self._format_calls() + + def start_call(self) -> list: + self.start_date = fields.Datetime.now() + self.state = "ongoing" + return self._format_calls() + + def end_call(self, activity_name: str = None) -> list: + self.end_date = fields.Datetime.now() + self.state = "terminated" + if activity_name: + self.activity_name = activity_name + return self._format_calls() + + def reject_call(self) -> list: + self.state = "rejected" + return self._format_calls() + + def miss_call(self) -> list: + self.state = "missed" + return self._format_calls() + + def get_contact_info(self): + self.ensure_one() + number = self.phone_number + # Internal extensions could theoretically be one or two digits long. + # phone_mobile_search doesn't handle numbers that short: do a regular + # search for the exact match: + if len(number) < 3: + domain = ["|", ("phone", "=", number), ("mobile", "=", number)] + # 00 and + both denote an international prefix. phone_mobile_search will + # match both indifferently. + elif number.startswith(("+", "00")): + domain = [("phone_mobile_search", "=", number)] + # USA: Calls between different area codes are usually prefixed with 1. + # Conveniently, the country code for the USA also happens to be 1, so we + # just need to add the + symbol to format it like an international call + # and match what's supposed to be stored in the database. + elif number.startswith("1"): + domain = [("phone_mobile_search", "=", f"+{number}")] + # 0 is the national prefix recommended by the ITU-T. This means that a + # number starting with 0 will identify a national call in most + # countries. We don't know the country code, so we can't convert the + # number to the international format: Replace the prefix with a + # wildcard. + elif number.startswith("0"): + domain = [("phone_mobile_search", "=like", f"%{number[1:]}")] + # The phone number doesn't match any expected format. Could it be some + # kind of internal extension? Try looking for an exact match: + else: + domain = [("phone_mobile_search", "=", number)] + partner = self.env["res.partner"].search(domain, limit=1) + if not partner: + return False + self.partner_id = partner + return self.partner_id._format_contacts()[0] + + def _format_calls(self) -> list: + return [ + { + "id": call.id, + "creationDate": call.create_date, + "direction": call.direction, + "displayName": call.display_name, + "endDate": call.end_date, + "partner": call.partner_id._format_contacts()[0] if call.partner_id else False, + "phoneNumber": call.phone_number, + "startDate": call.start_date, + "state": call.state, + } + for call in self + ] diff --git a/voip/models/voip_queue_mixin.py b/voip/models/voip_queue_mixin.py new file mode 100644 index 0000000..ff9e43b --- /dev/null +++ b/voip/models/voip_queue_mixin.py @@ -0,0 +1,121 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging + +from odoo import api, fields, models +from odoo.exceptions import UserError +from odoo.tools.translate import _ + +_logger = logging.getLogger(__name__) + + +class VoipQueueMixin(models.AbstractModel): + _name = "voip.queue.mixin" + _description = "VOIP Queue support" + + has_call_in_queue = fields.Boolean("Is in the Call Queue", compute="_compute_has_call_in_queue") + + def _compute_has_call_in_queue(self): + activity_count_by_res_id = dict( + self.env["mail.activity"]._read_group( + [ + ("res_id", "in", self.ids), + ("res_model", "=", self._name), + ("user_id", "=", self.env.uid), + ("activity_type_id.category", "=", "phonecall"), + ("date_deadline", "<=", fields.Date.today()), + "|", + ("phone", "!=", False), + ("mobile", "!=", False), + ], + ["res_id"], + ["__count"], + ) + ) + for record in self: + record.has_call_in_queue = activity_count_by_res_id.get(record.id, 0) > 0 + + def create_call_activity(self): + if not self: + return self.env["mail.activity"] + # Ensure that a phonecall activity type exists beforehand, otherwise + # create one. This is important because we rely on this type to retrieve + # the activities to be displayed in the Next Activities tab. + phonecall_activity_type_id = self.env["ir.model.data"]._xmlid_to_res_id( + "mail.mail_activity_data_call", raise_if_not_found=False + ) + if not phonecall_activity_type_id: + phonecall_activity_type_id = ( + self.env["mail.activity.type"] + .search( + [ + "|", + ("res_model", "=", False), + ("res_model", "=", self._name), + ("category", "=", "phonecall"), + ], + limit=1, + ) + .id + ) + if not phonecall_activity_type_id: + phonecall_activity_type_id = ( + self.env["mail.activity.type"] + .sudo() + .create( + { + "category": "phonecall", + "delay_count": 2, + "icon": "fa-phone", + "name": _("Call"), + "sequence": 999, + } + ) + .id + ) + date_deadline = fields.Date.today(self) + res_model_id = self.env["ir.model"]._get_id(self._name) + activities = self.env["mail.activity"].create( + [ + { + "activity_type_id": phonecall_activity_type_id, + "date_deadline": date_deadline, + "res_id": record.id, + "res_model_id": res_model_id, + "user_id": self.env.uid, + } + for record in self + ] + ) + failed_activities = activities.filtered(lambda activity: not activity.mobile and not activity.phone) + if failed_activities: + failed_records = self.browse(failed_activities.mapped("res_id")) + raise UserError( + _( + "Some documents cannot be added to the call queue as they do not have a phone number set: %(record_names)s", + record_names=_(", ").join(failed_records.mapped("display_name")), + ) + ) + return activities + + @api.model + def delete_call_activity(self, res_id): + related_activities = self.env["mail.activity"].search( + [ + ("res_id", "=", res_id), + ("res_model", "=", self._name), + ("user_id", "=", self.env.uid), + ("activity_type_id.category", "=", "phonecall"), + ("date_deadline", "<=", fields.Date.today()), + "|", + ("phone", "!=", False), + ("mobile", "!=", False), + ] + ) + self.env["bus.bus"]._sendmany( + [ + [self.env.user.partner_id, "delete_call_activity", {"id": activity.id}] + for activity in related_activities + ] + ) + related_activities.unlink() diff --git a/voip/security/ir.model.access.csv b/voip/security/ir.model.access.csv new file mode 100644 index 0000000..97de973 --- /dev/null +++ b/voip/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_voip_call_admin,voip_call_manager,model_voip_call,base.group_system,1,1,1,1 +access_voip_call_user,voip_call_user,model_voip_call,base.group_user,1,1,1,0 diff --git a/voip/security/voip_security.xml b/voip/security/voip_security.xml new file mode 100644 index 0000000..4cd83b7 --- /dev/null +++ b/voip/security/voip_security.xml @@ -0,0 +1,15 @@ + + + + + voip.call: users can access their own entries + + + [("user_id", "=", user.id)] + + + + + + + diff --git a/voip/static/description/icon.png b/voip/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39185ab7681d8f67c60303f3632eccb66cdefd38 GIT binary patch literal 1288 zcmV+j1^4=iP)h7Rdi=0jg;CjB&$y($1sp8qJMy`xJqZsMS?Vult!s+rArz~Ngq&ZgCJD? zfG8xr#U=p$7~T2mC(4V;uKk_7A013Y5O@6D7RS8Z z?Vb>C$K@|~C}Y$IJ8i2UTU~C8`mvLTAMcX8AcbFcH^{kzel|?;TC@E131#PlojzAT z_WPKL`f)Q$Kf2*4ZyetnWFkoylBo}@$K3%|tbTk$Ia8$E;nl%5vP7AZbPTJ5?Xvdc zGWoZVq2LmELH>StD#+{tK|EsuW5{?Y)vBfWV)KFMSirBw1Ew=3-uwI7t%=Mb#zBxR zZHX@7j?*E4r7{Li5jvowf>pr5u2(Qc1abj3g9%}OE7btr@1A=(QNb?XYExFh{ z;MdO*NMqO>~>nz`1d>FuW0;_Mu|Ul3o$WVF{-utX=#_2yzYw4TBvh? zVR*bd>m03*w3|p1g77ElSpEXo}I;S&zp(;=f|8hEg&@m&NNn@6hm- zP?#jk_nE|>)u0~S40+6?jvrN)XCz(L)rVg!utW!~rj|UEIf~hBHuip~6BsL+YdbA! zzV|!wUD13$vV1!e!--W(_GtC>6S8$Dan0@#7#l4ybm3F1I(sYMWzF|#qJ_SA(&JHO ziAAQmTFM*EH9L{VJ@S1;^Sy6lNS|sU|A+iDK;L{18q{aKTFRResw~fdAf5q1JOhGw z1_bd82;vzK#4}V7c}^fFga+l?3AtMD_wx~fv7x!PXq+jmTzZEzA+bW=#@(QJr_b!wQE>@A1{sXf3ysrxASeiPiMYYEZ@oVkaptl z5XhWF6r#EwYTRZs$H{tG{tCqb~R10#J@61{3HFgxBbC0S)H{-sZ)Y>TR&4^1Sd#+dF{DG(ap9f(#1q?$y2rYgaRbULEXyj zf3DyDFc#6J>}16tSph-XYd5cXi% zo;~s7G7}Ia9%iz3LYWeK;>Trj7lcU$?}h8K9jH0^t-(M)Bx^sqk-H$a4=z(|$>=(V z;Fxxz&$8WBT79t7Fn;7dv7Fde9_XVJU1>bw6+@GP#^B; y@$sbm000000000000000000000002MU|s@L|H5BrVYmAL0000|C_ literal 0 HcmV?d00001 diff --git a/voip/static/description/icon.svg b/voip/static/description/icon.svg new file mode 100644 index 0000000..980eeed --- /dev/null +++ b/voip/static/description/icon.svg @@ -0,0 +1 @@ + diff --git a/voip/static/lib/sip.js b/voip/static/lib/sip.js new file mode 100644 index 0000000..5ea05b6 --- /dev/null +++ b/voip/static/lib/sip.js @@ -0,0 +1,20562 @@ +/*! + * + * SIP version 0.20.0 + * Copyright (c) 2014-2021 Junction Networks, Inc + * Homepage: https://sipjs.com + * License: https://sipjs.com/license/ + * + * + * ~~~SIP.js contains substantial portions of JsSIP under the following license~~~ + * Homepage: http://jssip.net + * Copyright (c) 2012-2013 José Luis Millán - Versatica + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * ~~~ end JsSIP license ~~~ + * + * + * + * + */ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else if(typeof exports === 'object') + exports["SIP"] = factory(); + else + root["SIP"] = factory(); +})(this, function() { +return /******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "LIBRARY_VERSION": () => (/* binding */ LIBRARY_VERSION) +/* harmony export */ }); +const LIBRARY_VERSION = "0.20.0"; + + +/***/ }), +/* 2 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ContentTypeUnsupportedError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_0__.ContentTypeUnsupportedError), +/* harmony export */ "RequestPendingError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_0__.RequestPendingError), +/* harmony export */ "SessionDescriptionHandlerError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_0__.SessionDescriptionHandlerError), +/* harmony export */ "SessionTerminatedError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_0__.SessionTerminatedError), +/* harmony export */ "StateTransitionError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_0__.StateTransitionError), +/* harmony export */ "Ack": () => (/* reexport safe */ _ack__WEBPACK_IMPORTED_MODULE_1__.Ack), +/* harmony export */ "Bye": () => (/* reexport safe */ _bye__WEBPACK_IMPORTED_MODULE_2__.Bye), +/* harmony export */ "EmitterImpl": () => (/* reexport safe */ _emitter__WEBPACK_IMPORTED_MODULE_3__.EmitterImpl), +/* harmony export */ "Info": () => (/* reexport safe */ _info__WEBPACK_IMPORTED_MODULE_4__.Info), +/* harmony export */ "Invitation": () => (/* reexport safe */ _invitation__WEBPACK_IMPORTED_MODULE_5__.Invitation), +/* harmony export */ "Inviter": () => (/* reexport safe */ _inviter__WEBPACK_IMPORTED_MODULE_6__.Inviter), +/* harmony export */ "Message": () => (/* reexport safe */ _message__WEBPACK_IMPORTED_MODULE_7__.Message), +/* harmony export */ "Messager": () => (/* reexport safe */ _messager__WEBPACK_IMPORTED_MODULE_8__.Messager), +/* harmony export */ "Notification": () => (/* reexport safe */ _notification__WEBPACK_IMPORTED_MODULE_9__.Notification), +/* harmony export */ "PublisherState": () => (/* reexport safe */ _publisher_state__WEBPACK_IMPORTED_MODULE_10__.PublisherState), +/* harmony export */ "Publisher": () => (/* reexport safe */ _publisher__WEBPACK_IMPORTED_MODULE_11__.Publisher), +/* harmony export */ "Referral": () => (/* reexport safe */ _referral__WEBPACK_IMPORTED_MODULE_12__.Referral), +/* harmony export */ "RegistererState": () => (/* reexport safe */ _registerer_state__WEBPACK_IMPORTED_MODULE_13__.RegistererState), +/* harmony export */ "Registerer": () => (/* reexport safe */ _registerer__WEBPACK_IMPORTED_MODULE_14__.Registerer), +/* harmony export */ "SessionState": () => (/* reexport safe */ _session_state__WEBPACK_IMPORTED_MODULE_15__.SessionState), +/* harmony export */ "Session": () => (/* reexport safe */ _session__WEBPACK_IMPORTED_MODULE_16__.Session), +/* harmony export */ "Subscriber": () => (/* reexport safe */ _subscriber__WEBPACK_IMPORTED_MODULE_17__.Subscriber), +/* harmony export */ "SubscriptionState": () => (/* reexport safe */ _subscription_state__WEBPACK_IMPORTED_MODULE_18__.SubscriptionState), +/* harmony export */ "Subscription": () => (/* reexport safe */ _subscription__WEBPACK_IMPORTED_MODULE_19__.Subscription), +/* harmony export */ "TransportState": () => (/* reexport safe */ _transport_state__WEBPACK_IMPORTED_MODULE_20__.TransportState), +/* harmony export */ "SIPExtension": () => (/* reexport safe */ _user_agent_options__WEBPACK_IMPORTED_MODULE_21__.SIPExtension), +/* harmony export */ "UserAgentRegisteredOptionTags": () => (/* reexport safe */ _user_agent_options__WEBPACK_IMPORTED_MODULE_21__.UserAgentRegisteredOptionTags), +/* harmony export */ "UserAgentState": () => (/* reexport safe */ _user_agent_state__WEBPACK_IMPORTED_MODULE_22__.UserAgentState), +/* harmony export */ "UserAgent": () => (/* reexport safe */ _user_agent__WEBPACK_IMPORTED_MODULE_23__.UserAgent) +/* harmony export */ }); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3); +/* harmony import */ var _ack__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10); +/* harmony import */ var _bye__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11); +/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12); +/* harmony import */ var _info__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(13); +/* harmony import */ var _invitation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(14); +/* harmony import */ var _inviter__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(37); +/* harmony import */ var _message__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(31); +/* harmony import */ var _messager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(38); +/* harmony import */ var _notification__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(32); +/* harmony import */ var _publisher_state__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(39); +/* harmony import */ var _publisher__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(40); +/* harmony import */ var _referral__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(33); +/* harmony import */ var _registerer_state__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(41); +/* harmony import */ var _registerer__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(42); +/* harmony import */ var _session_state__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(16); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(15); +/* harmony import */ var _subscriber__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(43); +/* harmony import */ var _subscription_state__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(45); +/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(44); +/* harmony import */ var _transport_state__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(47); +/* harmony import */ var _user_agent_options__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(34); +/* harmony import */ var _user_agent_state__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(48); +/* harmony import */ var _user_agent__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(49); +/** + * A simple yet powerful API which takes care of SIP signaling and WebRTC media sessions for you. + * @packageDocumentation + */ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/***/ }), +/* 3 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ContentTypeUnsupportedError": () => (/* reexport safe */ _content_type_unsupported__WEBPACK_IMPORTED_MODULE_0__.ContentTypeUnsupportedError), +/* harmony export */ "RequestPendingError": () => (/* reexport safe */ _request_pending__WEBPACK_IMPORTED_MODULE_1__.RequestPendingError), +/* harmony export */ "SessionDescriptionHandlerError": () => (/* reexport safe */ _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandlerError), +/* harmony export */ "SessionTerminatedError": () => (/* reexport safe */ _session_terminated__WEBPACK_IMPORTED_MODULE_3__.SessionTerminatedError), +/* harmony export */ "StateTransitionError": () => (/* reexport safe */ _state_transition__WEBPACK_IMPORTED_MODULE_4__.StateTransitionError) +/* harmony export */ }); +/* harmony import */ var _content_type_unsupported__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4); +/* harmony import */ var _request_pending__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6); +/* harmony import */ var _session_description_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7); +/* harmony import */ var _session_terminated__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8); +/* harmony import */ var _state_transition__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9); + + + + + + + +/***/ }), +/* 4 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ContentTypeUnsupportedError": () => (/* binding */ ContentTypeUnsupportedError) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * An exception indicating an unsupported content type prevented execution. + * @public + */ +class ContentTypeUnsupportedError extends _core__WEBPACK_IMPORTED_MODULE_0__.Exception { + constructor(message) { + super(message ? message : "Unsupported content type."); + } +} + + +/***/ }), +/* 5 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Exception": () => (/* binding */ Exception) +/* harmony export */ }); +/** + * An Exception is considered a condition that a reasonable application may wish to catch. + * An Error indicates serious problems that a reasonable application should not try to catch. + * @public + */ +class Exception extends Error { + constructor(message) { + super(message); // 'Error' breaks prototype chain here + Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain + } +} + + +/***/ }), +/* 6 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RequestPendingError": () => (/* binding */ RequestPendingError) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * An exception indicating an outstanding prior request prevented execution. + * @public + */ +class RequestPendingError extends _core__WEBPACK_IMPORTED_MODULE_0__.Exception { + /** @internal */ + constructor(message) { + super(message ? message : "Request pending."); + } +} + + +/***/ }), +/* 7 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionDescriptionHandlerError": () => (/* binding */ SessionDescriptionHandlerError) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * An exception indicating a session description handler error occured. + * @public + */ +class SessionDescriptionHandlerError extends _core__WEBPACK_IMPORTED_MODULE_0__.Exception { + constructor(message) { + super(message ? message : "Unspecified session description handler error."); + } +} + + +/***/ }), +/* 8 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionTerminatedError": () => (/* binding */ SessionTerminatedError) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * An exception indicating the session terminated before the action completed. + * @public + */ +class SessionTerminatedError extends _core__WEBPACK_IMPORTED_MODULE_0__.Exception { + constructor() { + super("The session has terminated."); + } +} + + +/***/ }), +/* 9 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "StateTransitionError": () => (/* binding */ StateTransitionError) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * An exception indicating an invalid state transition error occured. + * @public + */ +class StateTransitionError extends _core__WEBPACK_IMPORTED_MODULE_0__.Exception { + constructor(message) { + super(message ? message : "An error occurred during state transition."); + } +} + + +/***/ }), +/* 10 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Ack": () => (/* binding */ Ack) +/* harmony export */ }); +/** + * A request to confirm a {@link Session} (incoming ACK). + * @public + */ +class Ack { + /** @internal */ + constructor(incomingAckRequest) { + this.incomingAckRequest = incomingAckRequest; + } + /** Incoming ACK request message. */ + get request() { + return this.incomingAckRequest.message; + } +} + + +/***/ }), +/* 11 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Bye": () => (/* binding */ Bye) +/* harmony export */ }); +/** + * A request to end a {@link Session} (incoming BYE). + * @public + */ +class Bye { + /** @internal */ + constructor(incomingByeRequest) { + this.incomingByeRequest = incomingByeRequest; + } + /** Incoming BYE request message. */ + get request() { + return this.incomingByeRequest.message; + } + /** Accept the request. */ + accept(options) { + this.incomingByeRequest.accept(options); + return Promise.resolve(); + } + /** Reject the request. */ + reject(options) { + this.incomingByeRequest.reject(options); + return Promise.resolve(); + } +} + + +/***/ }), +/* 12 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "EmitterImpl": () => (/* binding */ EmitterImpl) +/* harmony export */ }); +/** + * An {@link Emitter} implementation. + * @internal + */ +class EmitterImpl { + constructor() { + this.listeners = new Array(); + } + /** + * Sets up a function that will be called whenever the target changes. + * @param listener - Callback function. + * @param options - An options object that specifies characteristics about the listener. + * If once true, indicates that the listener should be invoked at most once after being added. + * If once true, the listener would be automatically removed when invoked. + */ + addListener(listener, options) { + const onceWrapper = (data) => { + this.removeListener(onceWrapper); + listener(data); + }; + (options === null || options === void 0 ? void 0 : options.once) === true ? this.listeners.push(onceWrapper) : this.listeners.push(listener); + } + /** + * Emit change. + * @param data - Data to emit. + */ + emit(data) { + this.listeners.slice().forEach((listener) => listener(data)); + } + /** + * Removes all listeners previously registered with addListener. + */ + removeAllListeners() { + this.listeners = []; + } + /** + * Removes a listener previously registered with addListener. + * @param listener - Callback function. + */ + removeListener(listener) { + this.listeners = this.listeners.filter((l) => l !== listener); + } + /** + * Registers a listener. + * @param listener - Callback function. + * @deprecated Use addListener. + */ + on(listener) { + return this.addListener(listener); + } + /** + * Unregisters a listener. + * @param listener - Callback function. + * @deprecated Use removeListener. + */ + off(listener) { + return this.removeListener(listener); + } + /** + * Registers a listener then unregisters the listener after one event emission. + * @param listener - Callback function. + * @deprecated Use addListener. + */ + once(listener) { + return this.addListener(listener, { once: true }); + } +} + + +/***/ }), +/* 13 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Info": () => (/* binding */ Info) +/* harmony export */ }); +/** + * An exchange of information (incoming INFO). + * @public + */ +class Info { + /** @internal */ + constructor(incomingInfoRequest) { + this.incomingInfoRequest = incomingInfoRequest; + } + /** Incoming MESSAGE request message. */ + get request() { + return this.incomingInfoRequest.message; + } + /** Accept the request. */ + accept(options) { + this.incomingInfoRequest.accept(options); + return Promise.resolve(); + } + /** Reject the request. */ + reject(options) { + this.incomingInfoRequest.reject(options); + return Promise.resolve(); + } +} + + +/***/ }), +/* 14 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Invitation": () => (/* binding */ Invitation) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(21); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(17); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(30); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(35); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(36); +/* harmony import */ var _core_messages_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(4); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(7); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(8); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15); +/* harmony import */ var _session_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16); +/* harmony import */ var _user_agent_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34); + + + + + + +/** + * An invitation is an offer to establish a {@link Session} (incoming INVITE). + * @public + */ +class Invitation extends _session__WEBPACK_IMPORTED_MODULE_0__.Session { + /** @internal */ + constructor(userAgent, incomingInviteRequest) { + super(userAgent); + this.incomingInviteRequest = incomingInviteRequest; + /** True if dispose() has been called. */ + this.disposed = false; + /** INVITE will be rejected if not accepted within a certain period time. */ + this.expiresTimer = undefined; + /** True if this Session has been Terminated due to a CANCEL request. */ + this.isCanceled = false; + /** Are reliable provisional responses required or supported. */ + this.rel100 = "none"; + /** The current RSeq header value. */ + this.rseq = Math.floor(Math.random() * 10000); + /** INVITE will be rejected if final response not sent in a certain period time. */ + this.userNoAnswerTimer = undefined; + /** True if waiting for a PRACK before sending a 200 Ok. */ + this.waitingForPrack = false; + this.logger = userAgent.getLogger("sip.Invitation"); + const incomingRequestMessage = this.incomingInviteRequest.message; + // Set 100rel if necessary + const requireHeader = incomingRequestMessage.getHeader("require"); + if (requireHeader && requireHeader.toLowerCase().includes("100rel")) { + this.rel100 = "required"; + } + const supportedHeader = incomingRequestMessage.getHeader("supported"); + if (supportedHeader && supportedHeader.toLowerCase().includes("100rel")) { + this.rel100 = "supported"; + } + // FIXME: HACK: This is a hack to port an existing behavior. + // Set the toTag on the incoming request message to the toTag which + // will be used in the response to the incoming request!!! + // The behavior being ported appears to be a hack itself, + // so this is a hack to port a hack. At least one test spec + // relies on it (which is yet another hack). + // eslint-disable-next-line @typescript-eslint/no-explicit-any + incomingRequestMessage.toTag = incomingInviteRequest.toTag; + if (typeof incomingRequestMessage.toTag !== "string") { + throw new TypeError("toTag should have been a string."); + } + // The following mapping values are RECOMMENDED: + // ... + // 19 no answer from the user 480 Temporarily unavailable + // https://tools.ietf.org/html/rfc3398#section-7.2.4.1 + this.userNoAnswerTimer = setTimeout(() => { + incomingInviteRequest.reject({ statusCode: 480 }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated); + }, this.userAgent.configuration.noAnswerTimeout ? this.userAgent.configuration.noAnswerTimeout * 1000 : 60000); + // 1. If the request is an INVITE that contains an Expires header + // field, the UAS core sets a timer for the number of seconds + // indicated in the header field value. When the timer fires, the + // invitation is considered to be expired. If the invitation + // expires before the UAS has generated a final response, a 487 + // (Request Terminated) response SHOULD be generated. + // https://tools.ietf.org/html/rfc3261#section-13.3.1 + if (incomingRequestMessage.hasHeader("expires")) { + const expires = Number(incomingRequestMessage.getHeader("expires") || 0) * 1000; + this.expiresTimer = setTimeout(() => { + if (this.state === _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial) { + incomingInviteRequest.reject({ statusCode: 487 }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated); + } + }, expires); + } + // Session parent properties + const assertedIdentity = this.request.getHeader("P-Asserted-Identity"); + if (assertedIdentity) { + this._assertedIdentity = _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.nameAddrHeaderParse(assertedIdentity); + } + this._contact = this.userAgent.contact.toString(); + const contentDisposition = incomingRequestMessage.parseHeader("Content-Disposition"); + if (contentDisposition && contentDisposition.type === "render") { + this._renderbody = incomingRequestMessage.body; + this._rendertype = incomingRequestMessage.getHeader("Content-Type"); + } + // Identifier + this._id = incomingRequestMessage.callId + incomingRequestMessage.fromTag; + // Add to the user agent's session collection. + this.userAgent._sessions[this._id] = this; + } + /** + * Destructor. + */ + dispose() { + // Only run through this once. It can and does get called multiple times + // depending on the what the sessions state is when first called. + // For example, if called when "establishing" it will be called again + // at least once when the session transitions to "terminated". + // Regardless, running through this more than once is pointless. + if (this.disposed) { + return Promise.resolve(); + } + this.disposed = true; + // Clear timers + if (this.expiresTimer) { + clearTimeout(this.expiresTimer); + this.expiresTimer = undefined; + } + if (this.userNoAnswerTimer) { + clearTimeout(this.userNoAnswerTimer); + this.userNoAnswerTimer = undefined; + } + // If accept() is still waiting for a PRACK, make sure it rejects + this.prackNeverArrived(); + // If the final response for the initial INVITE not yet been sent, reject it + switch (this.state) { + case _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial: + return this.reject().then(() => super.dispose()); + case _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Establishing: + return this.reject().then(() => super.dispose()); + case _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Established: + return super.dispose(); + case _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminating: + return super.dispose(); + case _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated: + return super.dispose(); + default: + throw new Error("Unknown state."); + } + } + /** + * If true, a first provisional response after the 100 Trying + * will be sent automatically. This is false it the UAC required + * reliable provisional responses (100rel in Require header) or + * the user agent configuration has specified to not send an + * initial response, otherwise it is true. The provisional is sent by + * calling `progress()` without any options. + */ + get autoSendAnInitialProvisionalResponse() { + return this.rel100 !== "required" && this.userAgent.configuration.sendInitialProvisionalResponse; + } + /** + * Initial incoming INVITE request message body. + */ + get body() { + return this.incomingInviteRequest.message.body; + } + /** + * The identity of the local user. + */ + get localIdentity() { + return this.request.to; + } + /** + * The identity of the remote user. + */ + get remoteIdentity() { + return this.request.from; + } + /** + * Initial incoming INVITE request message. + */ + get request() { + return this.incomingInviteRequest.message; + } + /** + * Accept the invitation. + * + * @remarks + * Accept the incoming INVITE request to start a Session. + * Replies to the INVITE request with a 200 Ok response. + * Resolves once the response sent, otherwise rejects. + * + * This method may reject for a variety of reasons including + * the receipt of a CANCEL request before `accept` is able + * to construct a response. + * @param options - Options bucket. + */ + accept(options = {}) { + this.logger.log("Invitation.accept"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial) { + const error = new Error(`Invalid session state ${this.state}`); + this.logger.error(error.message); + return Promise.reject(error); + } + // Modifiers and options for initial INVITE transaction + if (options.sessionDescriptionHandlerModifiers) { + this.sessionDescriptionHandlerModifiers = options.sessionDescriptionHandlerModifiers; + } + if (options.sessionDescriptionHandlerOptions) { + this.sessionDescriptionHandlerOptions = options.sessionDescriptionHandlerOptions; + } + // transition state + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Establishing); + return (this.sendAccept(options) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + .then(({ message, session }) => { + session.delegate = { + onAck: (ackRequest) => this.onAckRequest(ackRequest), + onAckTimeout: () => this.onAckTimeout(), + onBye: (byeRequest) => this.onByeRequest(byeRequest), + onInfo: (infoRequest) => this.onInfoRequest(infoRequest), + onInvite: (inviteRequest) => this.onInviteRequest(inviteRequest), + onMessage: (messageRequest) => this.onMessageRequest(messageRequest), + onNotify: (notifyRequest) => this.onNotifyRequest(notifyRequest), + onPrack: (prackRequest) => this.onPrackRequest(prackRequest), + onRefer: (referRequest) => this.onReferRequest(referRequest) + }; + this._dialog = session; + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Established); + // TODO: Reconsider this "automagic" send of a BYE to replacee behavior. + // This behavior has been ported forward from legacy versions. + if (this._replacee) { + this._replacee._bye(); + } + }) + .catch((error) => this.handleResponseError(error))); + } + /** + * Indicate progress processing the invitation. + * + * @remarks + * Report progress to the the caller. + * Replies to the INVITE request with a 1xx provisional response. + * Resolves once the response sent, otherwise rejects. + * @param options - Options bucket. + */ + progress(options = {}) { + this.logger.log("Invitation.progress"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial) { + const error = new Error(`Invalid session state ${this.state}`); + this.logger.error(error.message); + return Promise.reject(error); + } + // Ported + const statusCode = options.statusCode || 180; + if (statusCode < 100 || statusCode > 199) { + throw new TypeError("Invalid statusCode: " + statusCode); + } + // Modifiers and options for initial INVITE transaction + if (options.sessionDescriptionHandlerModifiers) { + this.sessionDescriptionHandlerModifiers = options.sessionDescriptionHandlerModifiers; + } + if (options.sessionDescriptionHandlerOptions) { + this.sessionDescriptionHandlerOptions = options.sessionDescriptionHandlerOptions; + } + // After the first reliable provisional response for a request has been + // acknowledged, the UAS MAY send additional reliable provisional + // responses. The UAS MUST NOT send a second reliable provisional + // response until the first is acknowledged. After the first, it is + // RECOMMENDED that the UAS not send an additional reliable provisional + // response until the previous is acknowledged. The first reliable + // provisional response receives special treatment because it conveys + // the initial sequence number. If additional reliable provisional + // responses were sent before the first was acknowledged, the UAS could + // not be certain these were received in order. + // https://tools.ietf.org/html/rfc3262#section-3 + if (this.waitingForPrack) { + this.logger.warn("Unexpected call for progress while waiting for prack, ignoring"); + return Promise.resolve(); + } + // Trying provisional response + if (options.statusCode === 100) { + return this.sendProgressTrying() + .then(() => { + return; + }) + .catch((error) => this.handleResponseError(error)); + } + // Standard provisional response + if (!(this.rel100 === "required") && + !(this.rel100 === "supported" && options.rel100) && + !(this.rel100 === "supported" && this.userAgent.configuration.sipExtension100rel === _user_agent_options__WEBPACK_IMPORTED_MODULE_3__.SIPExtension.Required)) { + return this.sendProgress(options) + .then(() => { + return; + }) + .catch((error) => this.handleResponseError(error)); + } + // Reliable provisional response + return this.sendProgressReliableWaitForPrack(options) + .then(() => { + return; + }) + .catch((error) => this.handleResponseError(error)); + } + /** + * Reject the invitation. + * + * @remarks + * Replies to the INVITE request with a 4xx, 5xx, or 6xx final response. + * Resolves once the response sent, otherwise rejects. + * + * The expectation is that this method is used to reject an INVITE request. + * That is indeed the case - a call to `progress` followed by `reject` is + * a typical way to "decline" an incoming INVITE request. However it may + * also be called after calling `accept` (but only before it completes) + * which will reject the call and cause `accept` to reject. + * @param options - Options bucket. + */ + reject(options = {}) { + this.logger.log("Invitation.reject"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial && this.state !== _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Establishing) { + const error = new Error(`Invalid session state ${this.state}`); + this.logger.error(error.message); + return Promise.reject(error); + } + const statusCode = options.statusCode || 480; + const reasonPhrase = options.reasonPhrase ? options.reasonPhrase : (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_4__.getReasonPhrase)(statusCode); + const extraHeaders = options.extraHeaders || []; + if (statusCode < 300 || statusCode > 699) { + throw new TypeError("Invalid statusCode: " + statusCode); + } + const body = options.body ? (0,_core__WEBPACK_IMPORTED_MODULE_5__.fromBodyLegacy)(options.body) : undefined; + // FIXME: Need to redirect to someplace + statusCode < 400 + ? this.incomingInviteRequest.redirect([], { statusCode, reasonPhrase, extraHeaders, body }) + : this.incomingInviteRequest.reject({ statusCode, reasonPhrase, extraHeaders, body }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated); + return Promise.resolve(); + } + /** + * Handle CANCEL request. + * + * @param message - CANCEL message. + * @internal + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + _onCancel(message) { + this.logger.log("Invitation._onCancel"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial && this.state !== _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Establishing) { + this.logger.error(`CANCEL received while in state ${this.state}, dropping request`); + return; + } + // flag canceled + this.isCanceled = true; + // reject INVITE with 487 status code + this.incomingInviteRequest.reject({ statusCode: 487 }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated); + } + /** + * Helper function to handle offer/answer in a PRACK. + */ + handlePrackOfferAnswer(request) { + if (!this.dialog) { + throw new Error("Dialog undefined."); + } + // If the PRACK doesn't have an offer/answer, nothing to be done. + const body = (0,_core__WEBPACK_IMPORTED_MODULE_5__.getBody)(request.message); + if (!body || body.contentDisposition !== "session") { + return Promise.resolve(undefined); + } + const options = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers + }; + // If the UAC receives a reliable provisional response with an offer + // (this would occur if the UAC sent an INVITE without an offer, in + // which case the first reliable provisional response will contain the + // offer), it MUST generate an answer in the PRACK. If the UAC receives + // a reliable provisional response with an answer, it MAY generate an + // additional offer in the PRACK. If the UAS receives a PRACK with an + // offer, it MUST place the answer in the 2xx to the PRACK. + // https://tools.ietf.org/html/rfc3262#section-5 + switch (this.dialog.signalingState) { + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Initial: + // State should never be reached as first reliable provisional response must have answer/offer. + throw new Error(`Invalid signaling state ${this.dialog.signalingState}.`); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Stable: + // Receved answer. + return this.setAnswer(body, options).then(() => undefined); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveLocalOffer: + // State should never be reached as local offer would be answered by this PRACK + throw new Error(`Invalid signaling state ${this.dialog.signalingState}.`); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveRemoteOffer: + // Received offer, generate answer. + return this.setOfferAndGetAnswer(body, options); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Closed: + throw new Error(`Invalid signaling state ${this.dialog.signalingState}.`); + default: + throw new Error(`Invalid signaling state ${this.dialog.signalingState}.`); + } + } + /** + * A handler for errors which occur while attempting to send 1xx and 2xx responses. + * In all cases, an attempt is made to reject the request if it is still outstanding. + * And while there are a variety of things which can go wrong and we log something here + * for all errors, there are a handful of common exceptions we pay some extra attention to. + * @param error - The error which occurred. + */ + handleResponseError(error) { + let statusCode = 480; // "Temporarily Unavailable" + // Log Error message + if (error instanceof Error) { + this.logger.error(error.message); + } + else { + // We don't actually know what a session description handler implementation might throw our way, + // and more generally as a last resort catch all, just assume we are getting an "unknown" and log it. + this.logger.error(error); + } + // Log Exception message + if (error instanceof _exceptions__WEBPACK_IMPORTED_MODULE_7__.ContentTypeUnsupportedError) { + this.logger.error("A session description handler occurred while sending response (content type unsupported"); + statusCode = 415; // "Unsupported Media Type" + } + else if (error instanceof _exceptions__WEBPACK_IMPORTED_MODULE_8__.SessionDescriptionHandlerError) { + this.logger.error("A session description handler occurred while sending response"); + } + else if (error instanceof _exceptions__WEBPACK_IMPORTED_MODULE_9__.SessionTerminatedError) { + this.logger.error("Session ended before response could be formulated and sent (while waiting for PRACK)"); + } + else if (error instanceof _core__WEBPACK_IMPORTED_MODULE_10__.TransactionStateError) { + this.logger.error("Session changed state before response could be formulated and sent"); + } + // Reject if still in "initial" or "establishing" state. + if (this.state === _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Initial || this.state === _session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Establishing) { + try { + this.incomingInviteRequest.reject({ statusCode }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated); + } + catch (e) { + this.logger.error("An error occurred attempting to reject the request while handling another error"); + throw e; // This is not a good place to be... + } + } + // FIXME: TODO: + // Here we are squelching the throwing of errors due to an race condition. + // We have an internal race between calling `accept()` and handling an incoming + // CANCEL request. As there is no good way currently to delegate the handling of + // these race errors to the caller of `accept()`, we are squelching the throwing + // of ALL errors when/if they occur after receiving a CANCEL to catch the ONE we know + // is a "normal" exceptional condition. While this is a completely reasonable approach, + // the decision should be left up to the library user. Furthermore, as we are eating + // ALL errors in this case, we are potentially (likely) hiding "real" errors which occur. + // + // Only rethrow error if the session has not been canceled. + if (this.isCanceled) { + this.logger.warn("An error occurred while attempting to formulate and send a response to an incoming INVITE." + + " However a CANCEL was received and processed while doing so which can (and often does) result" + + " in errors occurring as the session terminates in the meantime. Said error is being ignored."); + return; + } + throw error; + } + /** + * Callback for when ACK for a 2xx response is never received. + * @param session - Session the ACK never arrived for. + */ + onAckTimeout() { + this.logger.log("Invitation.onAckTimeout"); + if (!this.dialog) { + throw new Error("Dialog undefined."); + } + this.logger.log("No ACK received for an extended period of time, terminating session"); + this.dialog.bye(); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated); + } + /** + * A version of `accept` which resolves a session when the 200 Ok response is sent. + * @param options - Options bucket. + */ + sendAccept(options = {}) { + const responseOptions = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers + }; + const extraHeaders = options.extraHeaders || []; + // The UAS MAY send a final response to the initial request before + // having received PRACKs for all unacknowledged reliable provisional + // responses, unless the final response is 2xx and any of the + // unacknowledged reliable provisional responses contained a session + // description. In that case, it MUST NOT send a final response until + // those provisional responses are acknowledged. If the UAS does send a + // final response when reliable responses are still unacknowledged, it + // SHOULD NOT continue to retransmit the unacknowledged reliable + // provisional responses, but it MUST be prepared to process PRACK + // requests for those outstanding responses. A UAS MUST NOT send new + // reliable provisional responses (as opposed to retransmissions of + // unacknowledged ones) after sending a final response to a request. + // https://tools.ietf.org/html/rfc3262#section-3 + if (this.waitingForPrack) { + return this.waitForArrivalOfPrack() + .then(() => clearTimeout(this.userNoAnswerTimer)) // Ported + .then(() => this.generateResponseOfferAnswer(this.incomingInviteRequest, responseOptions)) + .then((body) => this.incomingInviteRequest.accept({ statusCode: 200, body, extraHeaders })); + } + clearTimeout(this.userNoAnswerTimer); // Ported + return this.generateResponseOfferAnswer(this.incomingInviteRequest, responseOptions).then((body) => this.incomingInviteRequest.accept({ statusCode: 200, body, extraHeaders })); + } + /** + * A version of `progress` which resolves when the provisional response is sent. + * @param options - Options bucket. + */ + sendProgress(options = {}) { + const statusCode = options.statusCode || 180; + const reasonPhrase = options.reasonPhrase; + const extraHeaders = (options.extraHeaders || []).slice(); + const body = options.body ? (0,_core__WEBPACK_IMPORTED_MODULE_5__.fromBodyLegacy)(options.body) : undefined; + // The 183 (Session Progress) response is used to convey information + // about the progress of the call that is not otherwise classified. The + // Reason-Phrase, header fields, or message body MAY be used to convey + // more details about the call progress. + // https://tools.ietf.org/html/rfc3261#section-21.1.5 + // It is the de facto industry standard to utilize 183 with SDP to provide "early media". + // While it is unlikely someone would want to send a 183 without SDP, so it should be an option. + if (statusCode === 183 && !body) { + return this.sendProgressWithSDP(options); + } + try { + const progressResponse = this.incomingInviteRequest.progress({ statusCode, reasonPhrase, extraHeaders, body }); + this._dialog = progressResponse.session; + return Promise.resolve(progressResponse); + } + catch (error) { + return Promise.reject(error); + } + } + /** + * A version of `progress` which resolves when the provisional response with sdp is sent. + * @param options - Options bucket. + */ + sendProgressWithSDP(options = {}) { + const responseOptions = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers + }; + const statusCode = options.statusCode || 183; + const reasonPhrase = options.reasonPhrase; + const extraHeaders = (options.extraHeaders || []).slice(); + // Get an offer/answer and send a reply. + return this.generateResponseOfferAnswer(this.incomingInviteRequest, responseOptions) + .then((body) => this.incomingInviteRequest.progress({ statusCode, reasonPhrase, extraHeaders, body })) + .then((progressResponse) => { + this._dialog = progressResponse.session; + return progressResponse; + }); + } + /** + * A version of `progress` which resolves when the reliable provisional response is sent. + * @param options - Options bucket. + */ + sendProgressReliable(options = {}) { + options.extraHeaders = (options.extraHeaders || []).slice(); + options.extraHeaders.push("Require: 100rel"); + options.extraHeaders.push("RSeq: " + Math.floor(Math.random() * 10000)); + return this.sendProgressWithSDP(options); + } + /** + * A version of `progress` which resolves when the reliable provisional response is acknowledged. + * @param options - Options bucket. + */ + sendProgressReliableWaitForPrack(options = {}) { + const responseOptions = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers + }; + const statusCode = options.statusCode || 183; + const reasonPhrase = options.reasonPhrase; + const extraHeaders = (options.extraHeaders || []).slice(); + extraHeaders.push("Require: 100rel"); + extraHeaders.push("RSeq: " + this.rseq++); + let body; + return new Promise((resolve, reject) => { + this.waitingForPrack = true; + this.generateResponseOfferAnswer(this.incomingInviteRequest, responseOptions) + .then((offerAnswer) => { + body = offerAnswer; + return this.incomingInviteRequest.progress({ statusCode, reasonPhrase, extraHeaders, body }); + }) + .then((progressResponse) => { + this._dialog = progressResponse.session; + let prackRequest; + let prackResponse; + progressResponse.session.delegate = { + onPrack: (request) => { + prackRequest = request; + // eslint-disable-next-line @typescript-eslint/no-use-before-define + clearTimeout(prackWaitTimeoutTimer); + // eslint-disable-next-line @typescript-eslint/no-use-before-define + clearTimeout(rel1xxRetransmissionTimer); + if (!this.waitingForPrack) { + return; + } + this.waitingForPrack = false; + this.handlePrackOfferAnswer(prackRequest) + .then((prackResponseBody) => { + try { + prackResponse = prackRequest.accept({ statusCode: 200, body: prackResponseBody }); + this.prackArrived(); + resolve({ prackRequest, prackResponse, progressResponse }); + } + catch (error) { + reject(error); + } + }) + .catch((error) => reject(error)); + } + }; + // https://tools.ietf.org/html/rfc3262#section-3 + const prackWaitTimeout = () => { + if (!this.waitingForPrack) { + return; + } + this.waitingForPrack = false; + this.logger.warn("No PRACK received, rejecting INVITE."); + // eslint-disable-next-line @typescript-eslint/no-use-before-define + clearTimeout(rel1xxRetransmissionTimer); + this.reject({ statusCode: 504 }) + .then(() => reject(new _exceptions__WEBPACK_IMPORTED_MODULE_9__.SessionTerminatedError())) + .catch((error) => reject(error)); + }; + const prackWaitTimeoutTimer = setTimeout(prackWaitTimeout, _core__WEBPACK_IMPORTED_MODULE_11__.Timers.T1 * 64); + // https://tools.ietf.org/html/rfc3262#section-3 + const rel1xxRetransmission = () => { + try { + this.incomingInviteRequest.progress({ statusCode, reasonPhrase, extraHeaders, body }); + } + catch (error) { + this.waitingForPrack = false; + reject(error); + return; + } + // eslint-disable-next-line @typescript-eslint/no-use-before-define + rel1xxRetransmissionTimer = setTimeout(rel1xxRetransmission, (timeout *= 2)); + }; + let timeout = _core__WEBPACK_IMPORTED_MODULE_11__.Timers.T1; + let rel1xxRetransmissionTimer = setTimeout(rel1xxRetransmission, timeout); + }) + .catch((error) => { + this.waitingForPrack = false; + reject(error); + }); + }); + } + /** + * A version of `progress` which resolves when a 100 Trying provisional response is sent. + */ + sendProgressTrying() { + try { + const progressResponse = this.incomingInviteRequest.trying(); + return Promise.resolve(progressResponse); + } + catch (error) { + return Promise.reject(error); + } + } + /** + * When attempting to accept the INVITE, an invitation waits + * for any outstanding PRACK to arrive before sending the 200 Ok. + * It will be waiting on this Promise to resolve which lets it know + * the PRACK has arrived and it may proceed to send the 200 Ok. + */ + waitForArrivalOfPrack() { + if (this.waitingForPrackPromise) { + throw new Error("Already waiting for PRACK"); + } + this.waitingForPrackPromise = new Promise((resolve, reject) => { + this.waitingForPrackResolve = resolve; + this.waitingForPrackReject = reject; + }); + return this.waitingForPrackPromise; + } + /** + * Here we are resolving the promise which in turn will cause + * the accept to proceed (it may still fail for other reasons, but...). + */ + prackArrived() { + if (this.waitingForPrackResolve) { + this.waitingForPrackResolve(); + } + this.waitingForPrackPromise = undefined; + this.waitingForPrackResolve = undefined; + this.waitingForPrackReject = undefined; + } + /** + * Here we are rejecting the promise which in turn will cause + * the accept to fail and the session to transition to "terminated". + */ + prackNeverArrived() { + if (this.waitingForPrackReject) { + this.waitingForPrackReject(new _exceptions__WEBPACK_IMPORTED_MODULE_9__.SessionTerminatedError()); + } + this.waitingForPrackPromise = undefined; + this.waitingForPrackResolve = undefined; + this.waitingForPrackReject = undefined; + } +} + + +/***/ }), +/* 15 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Session": () => (/* binding */ Session) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(30); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(21); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(23); +/* harmony import */ var _core_messages_utils__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(20); +/* harmony import */ var _core_user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28); +/* harmony import */ var _ack__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(10); +/* harmony import */ var _bye__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(11); +/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(4); +/* harmony import */ var _info__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(13); +/* harmony import */ var _message__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(31); +/* harmony import */ var _notification__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(32); +/* harmony import */ var _referral__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(33); +/* harmony import */ var _session_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(16); + + + + + + + + + + + + +/** + * A session provides real time communication between one or more participants. + * + * @remarks + * The transport behaves in a deterministic manner according to the + * the state defined in {@link SessionState}. + * @public + */ +class Session { + /** + * Constructor. + * @param userAgent - User agent. See {@link UserAgent} for details. + * @internal + */ + constructor(userAgent, options = {}) { + /** True if there is an outgoing re-INVITE request outstanding. */ + this.pendingReinvite = false; + /** True if there is an incoming re-INVITE ACK request outstanding. */ + this.pendingReinviteAck = false; + /** Session state. */ + this._state = _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Initial; + this.delegate = options.delegate; + this._stateEventEmitter = new _emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + this._userAgent = userAgent; + } + /** + * Destructor. + */ + dispose() { + this.logger.log(`Session ${this.id} in state ${this._state} is being disposed`); + // Remove from the user agent's session collection + delete this.userAgent._sessions[this.id]; + // Dispose of dialog media + if (this._sessionDescriptionHandler) { + this._sessionDescriptionHandler.close(); + // TODO: The SDH needs to remain defined as it will be called after it is closed in cases + // where an answer/offer arrives while the session is being torn down. There are a variety + // of circumstances where this can happen - sending a BYE during a re-INVITE for example. + // The code is currently written such that it lazily makes a new SDH when it needs one + // and one is not yet defined. Thus if we undefined it here, it will currently make a + // new one which is out of sync and then never gets cleaned up. + // + // The downside of leaving it defined are that calls this closed SDH will continue to be + // made (think setDescription) and those should/will fail. These failures are handled, but + // it would be nice to have it all coded up in a way where having an undefined SDH where + // one is expected throws an error. + // + // this._sessionDescriptionHandler = undefined; + } + switch (this.state) { + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Initial: + break; // the Inviter/Invitation sub class dispose method handles this case + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Establishing: + break; // the Inviter/Invitation sub class dispose method handles this case + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established: + return new Promise((resolve) => { + this._bye({ + // wait for the response to the BYE before resolving + onAccept: () => resolve(), + onRedirect: () => resolve(), + onReject: () => resolve() + }); + }); + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating: + break; // nothing to be done + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated: + break; // nothing to be done + default: + throw new Error("Unknown state."); + } + return Promise.resolve(); + } + /** + * The asserted identity of the remote user. + */ + get assertedIdentity() { + return this._assertedIdentity; + } + /** + * The confirmed session dialog. + */ + get dialog() { + return this._dialog; + } + /** + * A unique identifier for this session. + */ + get id() { + return this._id; + } + /** + * The session being replace by this one. + */ + get replacee() { + return this._replacee; + } + /** + * Session description handler. + * @remarks + * If `this` is an instance of `Invitation`, + * `sessionDescriptionHandler` will be defined when the session state changes to "established". + * If `this` is an instance of `Inviter` and an offer was sent in the INVITE, + * `sessionDescriptionHandler` will be defined when the session state changes to "establishing". + * If `this` is an instance of `Inviter` and an offer was not sent in the INVITE, + * `sessionDescriptionHandler` will be defined when the session state changes to "established". + * Otherwise `undefined`. + */ + get sessionDescriptionHandler() { + return this._sessionDescriptionHandler; + } + /** + * Session description handler factory. + */ + get sessionDescriptionHandlerFactory() { + return this.userAgent.configuration.sessionDescriptionHandlerFactory; + } + /** + * SDH modifiers for the initial INVITE transaction. + * @remarks + * Used in all cases when handling the initial INVITE transaction as either UAC or UAS. + * May be set directly at anytime. + * May optionally be set via constructor option. + * May optionally be set via options passed to Inviter.invite() or Invitation.accept(). + */ + get sessionDescriptionHandlerModifiers() { + return this._sessionDescriptionHandlerModifiers || []; + } + set sessionDescriptionHandlerModifiers(modifiers) { + this._sessionDescriptionHandlerModifiers = modifiers.slice(); + } + /** + * SDH options for the initial INVITE transaction. + * @remarks + * Used in all cases when handling the initial INVITE transaction as either UAC or UAS. + * May be set directly at anytime. + * May optionally be set via constructor option. + * May optionally be set via options passed to Inviter.invite() or Invitation.accept(). + */ + get sessionDescriptionHandlerOptions() { + return this._sessionDescriptionHandlerOptions || {}; + } + set sessionDescriptionHandlerOptions(options) { + this._sessionDescriptionHandlerOptions = Object.assign({}, options); + } + /** + * SDH modifiers for re-INVITE transactions. + * @remarks + * Used in all cases when handling a re-INVITE transaction as either UAC or UAS. + * May be set directly at anytime. + * May optionally be set via constructor option. + * May optionally be set via options passed to Session.invite(). + */ + get sessionDescriptionHandlerModifiersReInvite() { + return this._sessionDescriptionHandlerModifiersReInvite || []; + } + set sessionDescriptionHandlerModifiersReInvite(modifiers) { + this._sessionDescriptionHandlerModifiersReInvite = modifiers.slice(); + } + /** + * SDH options for re-INVITE transactions. + * @remarks + * Used in all cases when handling a re-INVITE transaction as either UAC or UAS. + * May be set directly at anytime. + * May optionally be set via constructor option. + * May optionally be set via options passed to Session.invite(). + */ + get sessionDescriptionHandlerOptionsReInvite() { + return this._sessionDescriptionHandlerOptionsReInvite || {}; + } + set sessionDescriptionHandlerOptionsReInvite(options) { + this._sessionDescriptionHandlerOptionsReInvite = Object.assign({}, options); + } + /** + * Session state. + */ + get state() { + return this._state; + } + /** + * Session state change emitter. + */ + get stateChange() { + return this._stateEventEmitter; + } + /** + * The user agent. + */ + get userAgent() { + return this._userAgent; + } + /** + * End the {@link Session}. Sends a BYE. + * @param options - Options bucket. See {@link SessionByeOptions} for details. + */ + bye(options = {}) { + let message = "Session.bye() may only be called if established session."; + switch (this.state) { + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Initial: + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (typeof this.cancel === "function") { + message += " However Inviter.invite() has not yet been called."; + message += " Perhaps you should have called Inviter.cancel()?"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + else if (typeof this.reject === "function") { + message += " However Invitation.accept() has not yet been called."; + message += " Perhaps you should have called Invitation.reject()?"; + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Establishing: + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (typeof this.cancel === "function") { + message += " However a dialog does not yet exist."; + message += " Perhaps you should have called Inviter.cancel()?"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + else if (typeof this.reject === "function") { + message += " However Invitation.accept() has not yet been called (or not yet resolved)."; + message += " Perhaps you should have called Invitation.reject()?"; + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established: { + const requestDelegate = options.requestDelegate; + const requestOptions = this.copyRequestOptions(options.requestOptions); + return this._bye(requestDelegate, requestOptions); + } + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating: + message += " However this session is already terminating."; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (typeof this.cancel === "function") { + message += " Perhaps you have already called Inviter.cancel()?"; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + } + else if (typeof this.reject === "function") { + message += " Perhaps you have already called Session.bye()?"; + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated: + message += " However this session is already terminated."; + break; + default: + throw new Error("Unknown state"); + } + this.logger.error(message); + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + /** + * Share {@link Info} with peer. Sends an INFO. + * @param options - Options bucket. See {@link SessionInfoOptions} for details. + */ + info(options = {}) { + // guard session state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + const message = "Session.info() may only be called if established session."; + this.logger.error(message); + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + const requestDelegate = options.requestDelegate; + const requestOptions = this.copyRequestOptions(options.requestOptions); + return this._info(requestDelegate, requestOptions); + } + /** + * Renegotiate the session. Sends a re-INVITE. + * @param options - Options bucket. See {@link SessionInviteOptions} for details. + */ + invite(options = {}) { + this.logger.log("Session.invite"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + if (this.pendingReinvite) { + return Promise.reject(new _exceptions__WEBPACK_IMPORTED_MODULE_2__.RequestPendingError("Reinvite in progress. Please wait until complete, then try again.")); + } + this.pendingReinvite = true; + // Modifiers and options for initial INVITE transaction + if (options.sessionDescriptionHandlerModifiers) { + this.sessionDescriptionHandlerModifiersReInvite = options.sessionDescriptionHandlerModifiers; + } + if (options.sessionDescriptionHandlerOptions) { + this.sessionDescriptionHandlerOptionsReInvite = options.sessionDescriptionHandlerOptions; + } + const delegate = { + onAccept: (response) => { + // A re-INVITE transaction has an offer/answer [RFC3264] exchange + // associated with it. The UAC (User Agent Client) generating a given + // re-INVITE can act as the offerer or as the answerer. A UAC willing + // to act as the offerer includes an offer in the re-INVITE. The UAS + // (User Agent Server) then provides an answer in a response to the + // re-INVITE. A UAC willing to act as answerer does not include an + // offer in the re-INVITE. The UAS then provides an offer in a response + // to the re-INVITE becoming, thus, the offerer. + // https://tools.ietf.org/html/rfc6141#section-1 + const body = (0,_core__WEBPACK_IMPORTED_MODULE_3__.getBody)(response.message); + if (!body) { + // No way to recover, so terminate session and mark as failed. + this.logger.error("Received 2xx response to re-INVITE without a session description"); + this.ackAndBye(response, 400, "Missing session description"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + this.pendingReinvite = false; + return; + } + if (options.withoutSdp) { + // INVITE without SDP - set remote offer and send an answer in the ACK + const answerOptions = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptionsReInvite, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiersReInvite + }; + this.setOfferAndGetAnswer(body, answerOptions) + .then((answerBody) => { + response.ack({ body: answerBody }); + }) + .catch((error) => { + // No way to recover, so terminate session and mark as failed. + this.logger.error("Failed to handle offer in 2xx response to re-INVITE"); + this.logger.error(error.message); + if (this.state === _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + // A BYE should not be sent if already terminated. + // For example, a BYE may be sent/received while re-INVITE is outstanding. + response.ack(); + } + else { + this.ackAndBye(response, 488, "Bad Media Description"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + } + }) + .then(() => { + this.pendingReinvite = false; + if (options.requestDelegate && options.requestDelegate.onAccept) { + options.requestDelegate.onAccept(response); + } + }); + } + else { + // INVITE with SDP - set remote answer and send an ACK + const answerOptions = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptionsReInvite, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiersReInvite + }; + this.setAnswer(body, answerOptions) + .then(() => { + response.ack(); + }) + .catch((error) => { + // No way to recover, so terminate session and mark as failed. + this.logger.error("Failed to handle answer in 2xx response to re-INVITE"); + this.logger.error(error.message); + // A BYE should only be sent if session is not already terminated. + // For example, a BYE may be sent/received while re-INVITE is outstanding. + // The ACK needs to be sent regardless as it was not handled by the transaction. + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + this.ackAndBye(response, 488, "Bad Media Description"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + } + else { + response.ack(); + } + }) + .then(() => { + this.pendingReinvite = false; + if (options.requestDelegate && options.requestDelegate.onAccept) { + options.requestDelegate.onAccept(response); + } + }); + } + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onProgress: (response) => { + return; + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onRedirect: (response) => { + return; + }, + onReject: (response) => { + this.logger.warn("Received a non-2xx response to re-INVITE"); + this.pendingReinvite = false; + if (options.withoutSdp) { + if (options.requestDelegate && options.requestDelegate.onReject) { + options.requestDelegate.onReject(response); + } + } + else { + this.rollbackOffer() + .catch((error) => { + // No way to recover, so terminate session and mark as failed. + this.logger.error("Failed to rollback offer on non-2xx response to re-INVITE"); + this.logger.error(error.message); + // A BYE should only be sent if session is not already terminated. + // For example, a BYE may be sent/received while re-INVITE is outstanding. + // Note that the ACK was already sent by the transaction, so just need to send BYE. + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + if (!this.dialog) { + throw new Error("Dialog undefined."); + } + const extraHeaders = []; + extraHeaders.push("Reason: " + this.getReasonHeaderValue(500, "Internal Server Error")); + this.dialog.bye(undefined, { extraHeaders }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + } + }) + .then(() => { + if (options.requestDelegate && options.requestDelegate.onReject) { + options.requestDelegate.onReject(response); + } + }); + } + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onTrying: (response) => { + return; + } + }; + const requestOptions = options.requestOptions || {}; + requestOptions.extraHeaders = (requestOptions.extraHeaders || []).slice(); + requestOptions.extraHeaders.push("Allow: " + _core_user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_4__.AllowedMethods.toString()); + requestOptions.extraHeaders.push("Contact: " + this._contact); + // Just send an INVITE with no sdp... + if (options.withoutSdp) { + if (!this.dialog) { + this.pendingReinvite = false; + throw new Error("Dialog undefined."); + } + return Promise.resolve(this.dialog.invite(delegate, requestOptions)); + } + // Get an offer and send it in an INVITE + const offerOptions = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptionsReInvite, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiersReInvite + }; + return this.getOffer(offerOptions) + .then((offerBody) => { + if (!this.dialog) { + this.pendingReinvite = false; + throw new Error("Dialog undefined."); + } + requestOptions.body = offerBody; + return this.dialog.invite(delegate, requestOptions); + }) + .catch((error) => { + this.logger.error(error.message); + this.logger.error("Failed to send re-INVITE"); + this.pendingReinvite = false; + throw error; + }); + } + /** + * Deliver a {@link Message}. Sends a MESSAGE. + * @param options - Options bucket. See {@link SessionMessageOptions} for details. + */ + message(options = {}) { + // guard session state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + const message = "Session.message() may only be called if established session."; + this.logger.error(message); + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + const requestDelegate = options.requestDelegate; + const requestOptions = this.copyRequestOptions(options.requestOptions); + return this._message(requestDelegate, requestOptions); + } + /** + * Proffer a {@link Referral}. Send a REFER. + * @param referTo - The referral target. If a `Session`, a REFER w/Replaces is sent. + * @param options - Options bucket. See {@link SessionReferOptions} for details. + */ + refer(referTo, options = {}) { + // guard session state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + const message = "Session.refer() may only be called if established session."; + this.logger.error(message); + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + const requestDelegate = options.requestDelegate; + const requestOptions = this.copyRequestOptions(options.requestOptions); + requestOptions.extraHeaders = requestOptions.extraHeaders + ? requestOptions.extraHeaders.concat(this.referExtraHeaders(this.referToString(referTo))) + : this.referExtraHeaders(this.referToString(referTo)); + return this._refer(options.onNotify, requestDelegate, requestOptions); + } + /** + * Send BYE. + * @param delegate - Request delegate. + * @param options - Request options bucket. + * @internal + */ + _bye(delegate, options) { + // Using core session dialog + if (!this.dialog) { + return Promise.reject(new Error("Session dialog undefined.")); + } + const dialog = this.dialog; + // The caller's UA MAY send a BYE for either confirmed or early dialogs, + // and the callee's UA MAY send a BYE on confirmed dialogs, but MUST NOT + // send a BYE on early dialogs. However, the callee's UA MUST NOT send a + // BYE on a confirmed dialog until it has received an ACK for its 2xx + // response or until the server transaction times out. + // https://tools.ietf.org/html/rfc3261#section-15 + switch (dialog.sessionState) { + case _core__WEBPACK_IMPORTED_MODULE_5__.SessionState.Initial: + throw new Error(`Invalid dialog state ${dialog.sessionState}`); + case _core__WEBPACK_IMPORTED_MODULE_5__.SessionState.Early: // Implementation choice - not sending BYE for early dialogs. + throw new Error(`Invalid dialog state ${dialog.sessionState}`); + case _core__WEBPACK_IMPORTED_MODULE_5__.SessionState.AckWait: { + // This state only occurs if we are the callee. + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating); // We're terminating + return new Promise((resolve) => { + dialog.delegate = { + // When ACK shows up, say BYE. + onAck: () => { + const request = dialog.bye(delegate, options); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + resolve(request); + return Promise.resolve(); + }, + // Or the server transaction times out before the ACK arrives. + onAckTimeout: () => { + const request = dialog.bye(delegate, options); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + resolve(request); + } + }; + }); + } + case _core__WEBPACK_IMPORTED_MODULE_5__.SessionState.Confirmed: { + const request = dialog.bye(delegate, options); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + return Promise.resolve(request); + } + case _core__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated: + throw new Error(`Invalid dialog state ${dialog.sessionState}`); + default: + throw new Error("Unrecognized state."); + } + } + /** + * Send INFO. + * @param delegate - Request delegate. + * @param options - Request options bucket. + * @internal + */ + _info(delegate, options) { + // Using core session dialog + if (!this.dialog) { + return Promise.reject(new Error("Session dialog undefined.")); + } + return Promise.resolve(this.dialog.info(delegate, options)); + } + /** + * Send MESSAGE. + * @param delegate - Request delegate. + * @param options - Request options bucket. + * @internal + */ + _message(delegate, options) { + // Using core session dialog + if (!this.dialog) { + return Promise.reject(new Error("Session dialog undefined.")); + } + return Promise.resolve(this.dialog.message(delegate, options)); + } + /** + * Send REFER. + * @param onNotify - Notification callback. + * @param delegate - Request delegate. + * @param options - Request options bucket. + * @internal + */ + _refer(onNotify, delegate, options) { + // Using core session dialog + if (!this.dialog) { + return Promise.reject(new Error("Session dialog undefined.")); + } + // If set, deliver any in-dialog NOTIFY requests here... + this.onNotify = onNotify; + return Promise.resolve(this.dialog.refer(delegate, options)); + } + /** + * Send ACK and then BYE. There are unrecoverable errors which can occur + * while handling dialog forming and in-dialog INVITE responses and when + * they occur we ACK the response and send a BYE. + * Note that the BYE is sent in the dialog associated with the response + * which is not necessarily `this.dialog`. And, accordingly, the + * session state is not transitioned to terminated and session is not closed. + * @param inviteResponse - The response causing the error. + * @param statusCode - Status code for he reason phrase. + * @param reasonPhrase - Reason phrase for the BYE. + * @internal + */ + ackAndBye(response, statusCode, reasonPhrase) { + response.ack(); + const extraHeaders = []; + if (statusCode) { + extraHeaders.push("Reason: " + this.getReasonHeaderValue(statusCode, reasonPhrase)); + } + // Using the dialog session associate with the response (which might not be this.dialog) + response.session.bye(undefined, { extraHeaders }); + } + /** + * Handle in dialog ACK request. + * @internal + */ + onAckRequest(request) { + this.logger.log("Session.onAckRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established && this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating) { + this.logger.error(`ACK received while in state ${this.state}, dropping request`); + return Promise.resolve(); + } + const dialog = this.dialog; + if (!dialog) { + throw new Error("Dialog undefined."); + } + // if received answer in ACK. + const answerOptions = { + sessionDescriptionHandlerOptions: this.pendingReinviteAck + ? this.sessionDescriptionHandlerOptionsReInvite + : this.sessionDescriptionHandlerOptions, + sessionDescriptionHandlerModifiers: this.pendingReinviteAck + ? this._sessionDescriptionHandlerModifiersReInvite + : this._sessionDescriptionHandlerModifiers + }; + if (this.delegate && this.delegate.onAck) { + const ack = new _ack__WEBPACK_IMPORTED_MODULE_6__.Ack(request); + this.delegate.onAck(ack); + } + // reset pending ACK flag + this.pendingReinviteAck = false; + switch (dialog.signalingState) { + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Initial: { + // State should never be reached as first reliable response must have answer/offer. + // So we must have never has sent an offer. + this.logger.error(`Invalid signaling state ${dialog.signalingState}.`); + const extraHeaders = ["Reason: " + this.getReasonHeaderValue(488, "Bad Media Description")]; + dialog.bye(undefined, { extraHeaders }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + return Promise.resolve(); + } + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Stable: { + // State we should be in. + // Either the ACK has the answer that got us here, or we were in this state prior to the ACK. + const body = (0,_core__WEBPACK_IMPORTED_MODULE_3__.getBody)(request.message); + // If the ACK doesn't have an answer, nothing to be done. + if (!body) { + return Promise.resolve(); + } + if (body.contentDisposition === "render") { + this._renderbody = body.content; + this._rendertype = body.contentType; + return Promise.resolve(); + } + if (body.contentDisposition !== "session") { + return Promise.resolve(); + } + return this.setAnswer(body, answerOptions).catch((error) => { + this.logger.error(error.message); + const extraHeaders = ["Reason: " + this.getReasonHeaderValue(488, "Bad Media Description")]; + dialog.bye(undefined, { extraHeaders }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + }); + } + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.HaveLocalOffer: { + // State should never be reached as local offer would be answered by this ACK. + // So we must have received an ACK without an answer. + this.logger.error(`Invalid signaling state ${dialog.signalingState}.`); + const extraHeaders = ["Reason: " + this.getReasonHeaderValue(488, "Bad Media Description")]; + dialog.bye(undefined, { extraHeaders }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + return Promise.resolve(); + } + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.HaveRemoteOffer: { + // State should never be reached as remote offer would be answered in first reliable response. + // So we must have never has sent an answer. + this.logger.error(`Invalid signaling state ${dialog.signalingState}.`); + const extraHeaders = ["Reason: " + this.getReasonHeaderValue(488, "Bad Media Description")]; + dialog.bye(undefined, { extraHeaders }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + return Promise.resolve(); + } + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Closed: + throw new Error(`Invalid signaling state ${dialog.signalingState}.`); + default: + throw new Error(`Invalid signaling state ${dialog.signalingState}.`); + } + } + /** + * Handle in dialog BYE request. + * @internal + */ + onByeRequest(request) { + this.logger.log("Session.onByeRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`BYE received while in state ${this.state}, dropping request`); + return; + } + if (this.delegate && this.delegate.onBye) { + const bye = new _bye__WEBPACK_IMPORTED_MODULE_7__.Bye(request); + this.delegate.onBye(bye); + } + else { + request.accept(); + } + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + } + /** + * Handle in dialog INFO request. + * @internal + */ + onInfoRequest(request) { + this.logger.log("Session.onInfoRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`INFO received while in state ${this.state}, dropping request`); + return; + } + if (this.delegate && this.delegate.onInfo) { + const info = new _info__WEBPACK_IMPORTED_MODULE_8__.Info(request); + this.delegate.onInfo(info); + } + else { + // FIXME: TODO: We should reject request... + // + // If a UA receives an INFO request associated with an Info Package that + // the UA has not indicated willingness to receive, the UA MUST send a + // 469 (Bad Info Package) response (see Section 11.6), which contains a + // Recv-Info header field with Info Packages for which the UA is willing + // to receive INFO requests. + // https://tools.ietf.org/html/rfc6086#section-4.2.2 + request.accept(); + } + } + /** + * Handle in dialog INVITE request. + * @internal + */ + onInviteRequest(request) { + this.logger.log("Session.onInviteRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`INVITE received while in state ${this.state}, dropping request`); + return; + } + // set pending ACK flag + this.pendingReinviteAck = true; + // TODO: would be nice to have core track and set the Contact header, + // but currently the session which is setting it is holding onto it. + const extraHeaders = ["Contact: " + this._contact]; + // Handle P-Asserted-Identity + if (request.message.hasHeader("P-Asserted-Identity")) { + const header = request.message.getHeader("P-Asserted-Identity"); + if (!header) { + throw new Error("Header undefined."); + } + this._assertedIdentity = _core__WEBPACK_IMPORTED_MODULE_9__.Grammar.nameAddrHeaderParse(header); + } + const options = { + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptionsReInvite, + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiersReInvite + }; + this.generateResponseOfferAnswerInDialog(options) + .then((body) => { + const outgoingResponse = request.accept({ statusCode: 200, extraHeaders, body }); + if (this.delegate && this.delegate.onInvite) { + this.delegate.onInvite(request.message, outgoingResponse.message, 200); + } + }) + .catch((error) => { + this.logger.error(error.message); + this.logger.error("Failed to handle to re-INVITE request"); + if (!this.dialog) { + throw new Error("Dialog undefined."); + } + this.logger.error(this.dialog.signalingState); + // If we don't have a local/remote offer... + if (this.dialog.signalingState === _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Stable) { + const outgoingResponse = request.reject({ statusCode: 488 }); // Not Acceptable Here + if (this.delegate && this.delegate.onInvite) { + this.delegate.onInvite(request.message, outgoingResponse.message, 488); + } + return; + } + // Otherwise rollback + this.rollbackOffer() + .then(() => { + const outgoingResponse = request.reject({ statusCode: 488 }); // Not Acceptable Here + if (this.delegate && this.delegate.onInvite) { + this.delegate.onInvite(request.message, outgoingResponse.message, 488); + } + }) + .catch((errorRollback) => { + // No way to recover, so terminate session and mark as failed. + this.logger.error(errorRollback.message); + this.logger.error("Failed to rollback offer on re-INVITE request"); + const outgoingResponse = request.reject({ statusCode: 488 }); // Not Acceptable Here + // A BYE should only be sent if session is not already terminated. + // For example, a BYE may be sent/received while re-INVITE is outstanding. + // Note that the ACK was already sent by the transaction, so just need to send BYE. + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + if (!this.dialog) { + throw new Error("Dialog undefined."); + } + const extraHeadersBye = []; + extraHeadersBye.push("Reason: " + this.getReasonHeaderValue(500, "Internal Server Error")); + this.dialog.bye(undefined, { extraHeaders }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated); + } + if (this.delegate && this.delegate.onInvite) { + this.delegate.onInvite(request.message, outgoingResponse.message, 488); + } + }); + }); + } + /** + * Handle in dialog MESSAGE request. + * @internal + */ + onMessageRequest(request) { + this.logger.log("Session.onMessageRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`MESSAGE received while in state ${this.state}, dropping request`); + return; + } + if (this.delegate && this.delegate.onMessage) { + const message = new _message__WEBPACK_IMPORTED_MODULE_10__.Message(request); + this.delegate.onMessage(message); + } + else { + request.accept(); + } + } + /** + * Handle in dialog NOTIFY request. + * @internal + */ + onNotifyRequest(request) { + this.logger.log("Session.onNotifyRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`NOTIFY received while in state ${this.state}, dropping request`); + return; + } + // If this a NOTIFY associated with the progress of a REFER, + // look to delegate handling to the associated callback. + if (this.onNotify) { + const notification = new _notification__WEBPACK_IMPORTED_MODULE_11__.Notification(request); + this.onNotify(notification); + return; + } + // Otherwise accept the NOTIFY. + if (this.delegate && this.delegate.onNotify) { + const notification = new _notification__WEBPACK_IMPORTED_MODULE_11__.Notification(request); + this.delegate.onNotify(notification); + } + else { + request.accept(); + } + } + /** + * Handle in dialog PRACK request. + * @internal + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onPrackRequest(request) { + this.logger.log("Session.onPrackRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`PRACK received while in state ${this.state}, dropping request`); + return; + } + throw new Error("Unimplemented."); + } + /** + * Handle in dialog REFER request. + * @internal + */ + onReferRequest(request) { + this.logger.log("Session.onReferRequest"); + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + this.logger.error(`REFER received while in state ${this.state}, dropping request`); + return; + } + // REFER is a SIP request and is constructed as defined in [1]. A REFER + // request MUST contain exactly one Refer-To header field value. + // https://tools.ietf.org/html/rfc3515#section-2.4.1 + if (!request.message.hasHeader("refer-to")) { + this.logger.warn("Invalid REFER packet. A refer-to header is required. Rejecting."); + request.reject(); + return; + } + const referral = new _referral__WEBPACK_IMPORTED_MODULE_12__.Referral(request, this); + if (this.delegate && this.delegate.onRefer) { + this.delegate.onRefer(referral); + } + else { + this.logger.log("No delegate available to handle REFER, automatically accepting and following."); + referral + .accept() + .then(() => referral.makeInviter(this._referralInviterOptions).invite()) + .catch((error) => { + // FIXME: logging and eating error... + this.logger.error(error.message); + }); + } + } + /** + * Generate an offer or answer for a response to an INVITE request. + * If a remote offer was provided in the request, set the remote + * description and get a local answer. If a remote offer was not + * provided, generates a local offer. + * @internal + */ + generateResponseOfferAnswer(request, options) { + if (this.dialog) { + return this.generateResponseOfferAnswerInDialog(options); + } + const body = (0,_core__WEBPACK_IMPORTED_MODULE_3__.getBody)(request.message); + if (!body || body.contentDisposition !== "session") { + return this.getOffer(options); + } + else { + return this.setOfferAndGetAnswer(body, options); + } + } + /** + * Generate an offer or answer for a response to an INVITE request + * when a dialog (early or otherwise) has already been established. + * This method may NOT be called if a dialog has yet to be established. + * @internal + */ + generateResponseOfferAnswerInDialog(options) { + if (!this.dialog) { + throw new Error("Dialog undefined."); + } + switch (this.dialog.signalingState) { + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Initial: + return this.getOffer(options); + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.HaveLocalOffer: + // o Once the UAS has sent or received an answer to the initial + // offer, it MUST NOT generate subsequent offers in any responses + // to the initial INVITE. This means that a UAS based on this + // specification alone can never generate subsequent offers until + // completion of the initial transaction. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + return Promise.resolve(undefined); + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.HaveRemoteOffer: + if (!this.dialog.offer) { + throw new Error(`Session offer undefined in signaling state ${this.dialog.signalingState}.`); + } + return this.setOfferAndGetAnswer(this.dialog.offer, options); + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Stable: + // o Once the UAS has sent or received an answer to the initial + // offer, it MUST NOT generate subsequent offers in any responses + // to the initial INVITE. This means that a UAS based on this + // specification alone can never generate subsequent offers until + // completion of the initial transaction. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established) { + return Promise.resolve(undefined); + } + // In dialog INVITE without offer, get an offer for the response. + return this.getOffer(options); + case _core__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Closed: + throw new Error(`Invalid signaling state ${this.dialog.signalingState}.`); + default: + throw new Error(`Invalid signaling state ${this.dialog.signalingState}.`); + } + } + /** + * Get local offer. + * @internal + */ + getOffer(options) { + const sdh = this.setupSessionDescriptionHandler(); + const sdhOptions = options.sessionDescriptionHandlerOptions; + const sdhModifiers = options.sessionDescriptionHandlerModifiers; + // This is intentionally written very defensively. Don't trust SDH to behave. + try { + return sdh + .getDescription(sdhOptions, sdhModifiers) + .then((bodyAndContentType) => (0,_core__WEBPACK_IMPORTED_MODULE_3__.fromBodyLegacy)(bodyAndContentType)) + .catch((error) => { + // don't trust SDH to reject with Error + this.logger.error("Session.getOffer: SDH getDescription rejected..."); + const e = error instanceof Error ? error : new Error("Session.getOffer unknown error."); + this.logger.error(e.message); + throw e; + }); + } + catch (error) { + // don't trust SDH to throw an Error + this.logger.error("Session.getOffer: SDH getDescription threw..."); + const e = error instanceof Error ? error : new Error(error); + this.logger.error(e.message); + return Promise.reject(e); + } + } + /** + * Rollback local/remote offer. + * @internal + */ + rollbackOffer() { + const sdh = this.setupSessionDescriptionHandler(); + if (sdh.rollbackDescription === undefined) { + return Promise.resolve(); + } + // This is intentionally written very defensively. Don't trust SDH to behave. + try { + return sdh.rollbackDescription().catch((error) => { + // don't trust SDH to reject with Error + this.logger.error("Session.rollbackOffer: SDH rollbackDescription rejected..."); + const e = error instanceof Error ? error : new Error("Session.rollbackOffer unknown error."); + this.logger.error(e.message); + throw e; + }); + } + catch (error) { + // don't trust SDH to throw an Error + this.logger.error("Session.rollbackOffer: SDH rollbackDescription threw..."); + const e = error instanceof Error ? error : new Error(error); + this.logger.error(e.message); + return Promise.reject(e); + } + } + /** + * Set remote answer. + * @internal + */ + setAnswer(answer, options) { + const sdh = this.setupSessionDescriptionHandler(); + const sdhOptions = options.sessionDescriptionHandlerOptions; + const sdhModifiers = options.sessionDescriptionHandlerModifiers; + // This is intentionally written very defensively. Don't trust SDH to behave. + try { + if (!sdh.hasDescription(answer.contentType)) { + return Promise.reject(new _exceptions__WEBPACK_IMPORTED_MODULE_13__.ContentTypeUnsupportedError()); + } + } + catch (error) { + this.logger.error("Session.setAnswer: SDH hasDescription threw..."); + const e = error instanceof Error ? error : new Error(error); + this.logger.error(e.message); + return Promise.reject(e); + } + try { + return sdh.setDescription(answer.content, sdhOptions, sdhModifiers).catch((error) => { + // don't trust SDH to reject with Error + this.logger.error("Session.setAnswer: SDH setDescription rejected..."); + const e = error instanceof Error ? error : new Error("Session.setAnswer unknown error."); + this.logger.error(e.message); + throw e; + }); + } + catch (error) { + // don't trust SDH to throw an Error + this.logger.error("Session.setAnswer: SDH setDescription threw..."); + const e = error instanceof Error ? error : new Error(error); + this.logger.error(e.message); + return Promise.reject(e); + } + } + /** + * Set remote offer and get local answer. + * @internal + */ + setOfferAndGetAnswer(offer, options) { + const sdh = this.setupSessionDescriptionHandler(); + const sdhOptions = options.sessionDescriptionHandlerOptions; + const sdhModifiers = options.sessionDescriptionHandlerModifiers; + // This is intentionally written very defensively. Don't trust SDH to behave. + try { + if (!sdh.hasDescription(offer.contentType)) { + return Promise.reject(new _exceptions__WEBPACK_IMPORTED_MODULE_13__.ContentTypeUnsupportedError()); + } + } + catch (error) { + this.logger.error("Session.setOfferAndGetAnswer: SDH hasDescription threw..."); + const e = error instanceof Error ? error : new Error(error); + this.logger.error(e.message); + return Promise.reject(e); + } + try { + return sdh + .setDescription(offer.content, sdhOptions, sdhModifiers) + .then(() => sdh.getDescription(sdhOptions, sdhModifiers)) + .then((bodyAndContentType) => (0,_core__WEBPACK_IMPORTED_MODULE_3__.fromBodyLegacy)(bodyAndContentType)) + .catch((error) => { + // don't trust SDH to reject with Error + this.logger.error("Session.setOfferAndGetAnswer: SDH setDescription or getDescription rejected..."); + const e = error instanceof Error ? error : new Error("Session.setOfferAndGetAnswer unknown error."); + this.logger.error(e.message); + throw e; + }); + } + catch (error) { + // don't trust SDH to throw an Error + this.logger.error("Session.setOfferAndGetAnswer: SDH setDescription or getDescription threw..."); + const e = error instanceof Error ? error : new Error(error); + this.logger.error(e.message); + return Promise.reject(e); + } + } + /** + * SDH for confirmed dialog. + * @internal + */ + setSessionDescriptionHandler(sdh) { + if (this._sessionDescriptionHandler) { + throw new Error("Session description handler defined."); + } + this._sessionDescriptionHandler = sdh; + } + /** + * SDH for confirmed dialog. + * @internal + */ + setupSessionDescriptionHandler() { + var _a; + if (this._sessionDescriptionHandler) { + return this._sessionDescriptionHandler; + } + this._sessionDescriptionHandler = this.sessionDescriptionHandlerFactory(this, this.userAgent.configuration.sessionDescriptionHandlerFactoryOptions); + if ((_a = this.delegate) === null || _a === void 0 ? void 0 : _a.onSessionDescriptionHandler) { + this.delegate.onSessionDescriptionHandler(this._sessionDescriptionHandler, false); + } + return this._sessionDescriptionHandler; + } + /** + * Transition session state. + * @internal + */ + stateTransition(newState) { + const invalidTransition = () => { + throw new Error(`Invalid state transition from ${this._state} to ${newState}`); + }; + // Validate transition + switch (this._state) { + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Initial: + if (newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Establishing && + newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established && + newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating && + newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + invalidTransition(); + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Establishing: + if (newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established && + newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating && + newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + invalidTransition(); + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Established: + if (newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating && newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + invalidTransition(); + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminating: + if (newState !== _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + invalidTransition(); + } + break; + case _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated: + invalidTransition(); + break; + default: + throw new Error("Unrecognized state."); + } + // Transition + this._state = newState; + this.logger.log(`Session ${this.id} transitioned to state ${this._state}`); + this._stateEventEmitter.emit(this._state); + // Dispose + if (newState === _session_state__WEBPACK_IMPORTED_MODULE_0__.SessionState.Terminated) { + this.dispose(); + } + } + copyRequestOptions(requestOptions = {}) { + const extraHeaders = requestOptions.extraHeaders ? requestOptions.extraHeaders.slice() : undefined; + const body = requestOptions.body + ? { + contentDisposition: requestOptions.body.contentDisposition || "render", + contentType: requestOptions.body.contentType || "text/plain", + content: requestOptions.body.content || "" + } + : undefined; + return { + extraHeaders, + body + }; + } + getReasonHeaderValue(code, reason) { + const cause = code; + let text = (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_14__.getReasonPhrase)(code); + if (!text && reason) { + text = reason; + } + return "SIP;cause=" + cause + ';text="' + text + '"'; + } + referExtraHeaders(referTo) { + const extraHeaders = []; + extraHeaders.push("Referred-By: <" + this.userAgent.configuration.uri + ">"); + extraHeaders.push("Contact: " + this._contact); + extraHeaders.push("Allow: " + ["ACK", "CANCEL", "INVITE", "MESSAGE", "BYE", "OPTIONS", "INFO", "NOTIFY", "REFER"].toString()); + extraHeaders.push("Refer-To: " + referTo); + return extraHeaders; + } + referToString(target) { + let referTo; + if (target instanceof _core__WEBPACK_IMPORTED_MODULE_15__.URI) { + // REFER without Replaces (Blind Transfer) + referTo = target.toString(); + } + else { + // REFER with Replaces (Attended Transfer) + if (!target.dialog) { + throw new Error("Dialog undefined."); + } + const displayName = target.remoteIdentity.friendlyName; + const remoteTarget = target.dialog.remoteTarget.toString(); + const callId = target.dialog.callId; + const remoteTag = target.dialog.remoteTag; + const localTag = target.dialog.localTag; + const replaces = encodeURIComponent(`${callId};to-tag=${remoteTag};from-tag=${localTag}`); + referTo = `"${displayName}" <${remoteTarget}?Replaces=${replaces}>`; + } + return referTo; + } +} + + +/***/ }), +/* 16 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionState": () => (/* binding */ SessionState) +/* harmony export */ }); +/** + * {@link Session} state. + * + * @remarks + * The {@link Session} behaves in a deterministic manner according to the following + * Finite State Machine (FSM). + * ```txt + * ___________________________________________________________ + * | ____________________________________________ | + * | | ____________________________ | | + * Session | | | v v v + * Constructed -> Initial -> Establishing -> Established -> Terminating -> Terminated + * | |___________________________^ ^ + * |_______________________________________________| + * ``` + * @public + */ +var SessionState; +(function (SessionState) { + /** + * If `Inviter`, INVITE not sent yet. + * If `Invitation`, received INVITE (but no final response sent yet). + */ + SessionState["Initial"] = "Initial"; + /** + * If `Inviter`, sent INVITE and waiting for a final response. + * If `Invitation`, received INVITE and attempting to send 200 final response (but has not sent it yet). + */ + SessionState["Establishing"] = "Establishing"; + /** + * If `Inviter`, sent INVITE and received 200 final response and sent ACK. + * If `Invitation`, received INVITE and sent 200 final response. + */ + SessionState["Established"] = "Established"; + /** + * If `Inviter`, sent INVITE, sent CANCEL and now waiting for 487 final response to ACK (or 200 to ACK & BYE). + * If `Invitation`, received INVITE, sent 200 final response and now waiting on ACK and upon receipt will attempt BYE + * (as the protocol specification requires, before sending a BYE we must receive the ACK - so we are waiting). + */ + SessionState["Terminating"] = "Terminating"; + /** + * If `Inviter`, sent INVITE and received non-200 final response (or sent/received BYE after receiving 200). + * If `Invitation`, received INVITE and sent non-200 final response (or sent/received BYE after sending 200). + */ + SessionState["Terminated"] = "Terminated"; +})(SessionState || (SessionState = {})); + + +/***/ }), +/* 17 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "fromBodyLegacy": () => (/* binding */ fromBodyLegacy), +/* harmony export */ "isBody": () => (/* binding */ isBody), +/* harmony export */ "getBody": () => (/* binding */ getBody) +/* harmony export */ }); +/* harmony import */ var _incoming_request_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18); +/* harmony import */ var _incoming_response_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26); +/* harmony import */ var _outgoing_request_message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(27); + + + +// If the Content-Disposition header field is missing, bodies of +// Content-Type application/sdp imply the disposition "session", while +// other content types imply "render". +// https://tools.ietf.org/html/rfc3261#section-13.2.1 +function contentTypeToContentDisposition(contentType) { + if (contentType === "application/sdp") { + return "session"; + } + else { + return "render"; + } +} +/** + * Create a Body given a legacy body type. + * @param bodyLegacy - Body Object + * @internal + */ +function fromBodyLegacy(bodyLegacy) { + const content = typeof bodyLegacy === "string" ? bodyLegacy : bodyLegacy.body; + const contentType = typeof bodyLegacy === "string" ? "application/sdp" : bodyLegacy.contentType; + const contentDisposition = contentTypeToContentDisposition(contentType); + const body = { contentDisposition, contentType, content }; + return body; +} +/** + * User-Defined Type Guard for Body. + * @param body - Body to check. + * @internal + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function isBody(body) { + return body && + typeof body.content === "string" && + typeof body.contentType === "string" && + body.contentDisposition === undefined + ? true + : typeof body.contentDisposition === "string"; +} +/** + * Given a message, get a normalized body. + * The content disposition is inferred if not set. + * @param message - The message. + * @internal + */ +function getBody(message) { + let contentDisposition; + let contentType; + let content; + // We're in UAS role, receiving incoming request + if (message instanceof _incoming_request_message__WEBPACK_IMPORTED_MODULE_0__.IncomingRequestMessage) { + if (message.body) { + // FIXME: Parsing needs typing + const parse = message.parseHeader("Content-Disposition"); + contentDisposition = parse ? parse.type : undefined; + contentType = message.parseHeader("Content-Type"); + content = message.body; + } + } + // We're in UAC role, receiving incoming response + if (message instanceof _incoming_response_message__WEBPACK_IMPORTED_MODULE_1__.IncomingResponseMessage) { + if (message.body) { + // FIXME: Parsing needs typing + const parse = message.parseHeader("Content-Disposition"); + contentDisposition = parse ? parse.type : undefined; + contentType = message.parseHeader("Content-Type"); + content = message.body; + } + } + // We're in UAC role, sending outgoing request + if (message instanceof _outgoing_request_message__WEBPACK_IMPORTED_MODULE_2__.OutgoingRequestMessage) { + if (message.body) { + contentDisposition = message.getHeader("Content-Disposition"); + contentType = message.getHeader("Content-Type"); + if (typeof message.body === "string") { + // FIXME: OutgoingRequest should not allow a "string" body without a "Content-Type" header. + if (!contentType) { + throw new Error("Header content type header does not equal body content type."); + } + content = message.body; + } + else { + // FIXME: OutgoingRequest should not allow the "Content-Type" header not to match th body content type + if (contentType && contentType !== message.body.contentType) { + throw new Error("Header content type header does not equal body content type."); + } + contentType = message.body.contentType; + content = message.body.body; + } + } + } + // We're in UAS role, sending outgoing response + if (isBody(message)) { + contentDisposition = message.contentDisposition; + contentType = message.contentType; + content = message.content; + } + // No content, no body. + if (!content) { + return undefined; + } + if (contentType && !contentDisposition) { + contentDisposition = contentTypeToContentDisposition(contentType); + } + if (!contentDisposition) { + throw new Error("Content disposition undefined."); + } + if (!contentType) { + throw new Error("Content type undefined."); + } + return { + contentDisposition, + contentType, + content + }; +} + + +/***/ }), +/* 18 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "IncomingRequestMessage": () => (/* binding */ IncomingRequestMessage) +/* harmony export */ }); +/* harmony import */ var _incoming_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(19); + +/** + * Incoming request message. + * @public + */ +class IncomingRequestMessage extends _incoming_message__WEBPACK_IMPORTED_MODULE_0__.IncomingMessage { + constructor() { + super(); + } +} + + +/***/ }), +/* 19 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "IncomingMessage": () => (/* binding */ IncomingMessage) +/* harmony export */ }); +/* harmony import */ var _grammar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(21); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); + + +/** + * Incoming message. + * @public + */ +class IncomingMessage { + constructor() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.headers = {}; + } + /** + * Insert a header of the given name and value into the last position of the + * header array. + * @param name - header name + * @param value - header value + */ + addHeader(name, value) { + const header = { raw: value }; + name = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name); + if (this.headers[name]) { + this.headers[name].push(header); + } + else { + this.headers[name] = [header]; + } + } + /** + * Get the value of the given header name at the given position. + * @param name - header name + * @returns Returns the specified header, undefined if header doesn't exist. + */ + getHeader(name) { + const header = this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)]; + if (header) { + if (header[0]) { + return header[0].raw; + } + } + else { + return; + } + } + /** + * Get the header/s of the given name. + * @param name - header name + * @returns Array - with all the headers of the specified name. + */ + getHeaders(name) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const header = this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)]; + const result = []; + if (!header) { + return []; + } + for (const headerPart of header) { + result.push(headerPart.raw); + } + return result; + } + /** + * Verify the existence of the given header. + * @param name - header name + * @returns true if header with given name exists, false otherwise + */ + hasHeader(name) { + return !!this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)]; + } + /** + * Parse the given header on the given index. + * @param name - header name + * @param idx - header index + * @returns Parsed header object, undefined if the + * header is not present or in case of a parsing error. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + parseHeader(name, idx = 0) { + name = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name); + if (!this.headers[name]) { + // this.logger.log("header '" + name + "' not present"); + return; + } + else if (idx >= this.headers[name].length) { + // this.logger.log("not so many '" + name + "' headers present"); + return; + } + const header = this.headers[name][idx]; + const value = header.raw; + if (header.parsed) { + return header.parsed; + } + // substitute '-' by '_' for grammar rule matching. + const parsed = _grammar__WEBPACK_IMPORTED_MODULE_1__.Grammar.parse(value, name.replace(/-/g, "_")); + if (parsed === -1) { + this.headers[name].splice(idx, 1); // delete from headers + // this.logger.warn('error parsing "' + name + '" header field with value "' + value + '"'); + return; + } + else { + header.parsed = parsed; + return parsed; + } + } + /** + * Message Header attribute selector. Alias of parseHeader. + * @param name - header name + * @param idx - header index + * @returns Parsed header object, undefined if the + * header is not present or in case of a parsing error. + * + * @example + * message.s('via',3).port + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + s(name, idx = 0) { + return this.parseHeader(name, idx); + } + /** + * Replace the value of the given header by the value. + * @param name - header name + * @param value - header value + */ + setHeader(name, value) { + this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)] = [{ raw: value }]; + } + toString() { + return this.data; + } +} + + +/***/ }), +/* 20 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "createRandomToken": () => (/* binding */ createRandomToken), +/* harmony export */ "getReasonPhrase": () => (/* binding */ getReasonPhrase), +/* harmony export */ "newTag": () => (/* binding */ newTag), +/* harmony export */ "headerize": () => (/* binding */ headerize), +/* harmony export */ "utf8Length": () => (/* binding */ utf8Length) +/* harmony export */ }); +/** + * SIP Response Reasons + * DOC: http://www.iana.org/assignments/sip-parameters + * @internal + */ +const REASON_PHRASE = { + 100: "Trying", + 180: "Ringing", + 181: "Call Is Being Forwarded", + 182: "Queued", + 183: "Session Progress", + 199: "Early Dialog Terminated", + 200: "OK", + 202: "Accepted", + 204: "No Notification", + 300: "Multiple Choices", + 301: "Moved Permanently", + 302: "Moved Temporarily", + 305: "Use Proxy", + 380: "Alternative Service", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 410: "Gone", + 412: "Conditional Request Failed", + 413: "Request Entity Too Large", + 414: "Request-URI Too Long", + 415: "Unsupported Media Type", + 416: "Unsupported URI Scheme", + 417: "Unknown Resource-Priority", + 420: "Bad Extension", + 421: "Extension Required", + 422: "Session Interval Too Small", + 423: "Interval Too Brief", + 428: "Use Identity Header", + 429: "Provide Referrer Identity", + 430: "Flow Failed", + 433: "Anonymity Disallowed", + 436: "Bad Identity-Info", + 437: "Unsupported Certificate", + 438: "Invalid Identity Header", + 439: "First Hop Lacks Outbound Support", + 440: "Max-Breadth Exceeded", + 469: "Bad Info Package", + 470: "Consent Needed", + 478: "Unresolvable Destination", + 480: "Temporarily Unavailable", + 481: "Call/Transaction Does Not Exist", + 482: "Loop Detected", + 483: "Too Many Hops", + 484: "Address Incomplete", + 485: "Ambiguous", + 486: "Busy Here", + 487: "Request Terminated", + 488: "Not Acceptable Here", + 489: "Bad Event", + 491: "Request Pending", + 493: "Undecipherable", + 494: "Security Agreement Required", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Server Time-out", + 505: "Version Not Supported", + 513: "Message Too Large", + 580: "Precondition Failure", + 600: "Busy Everywhere", + 603: "Decline", + 604: "Does Not Exist Anywhere", + 606: "Not Acceptable" +}; +/** + * @param size - + * @param base - + * @internal + */ +function createRandomToken(size, base = 32) { + let token = ""; + for (let i = 0; i < size; i++) { + const r = Math.floor(Math.random() * base); + token += r.toString(base); + } + return token; +} +/** + * @internal + */ +function getReasonPhrase(code) { + return REASON_PHRASE[code] || ""; +} +/** + * @internal + */ +function newTag() { + return createRandomToken(10); +} +/** + * @param str - + * @internal + */ +function headerize(str) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const exceptions = { + "Call-Id": "Call-ID", + Cseq: "CSeq", + "Min-Se": "Min-SE", + Rack: "RAck", + Rseq: "RSeq", + "Www-Authenticate": "WWW-Authenticate" + }; + const name = str.toLowerCase().replace(/_/g, "-").split("-"); + const parts = name.length; + let hname = ""; + for (let part = 0; part < parts; part++) { + if (part !== 0) { + hname += "-"; + } + hname += name[part].charAt(0).toUpperCase() + name[part].substring(1); + } + if (exceptions[hname]) { + hname = exceptions[hname]; + } + return hname; +} +/** + * @param str - + * @internal + */ +function utf8Length(str) { + return encodeURIComponent(str).replace(/%[A-F\d]{2}/g, "U").length; +} + + +/***/ }), +/* 21 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Grammar": () => (/* binding */ Grammar) +/* harmony export */ }); +/* harmony import */ var _pegjs_dist_grammar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(22); +/* eslint-disable @typescript-eslint/no-namespace */ +/* eslint-disable no-inner-declarations */ + +/** + * Grammar. + * @internal + */ +var Grammar; +(function (Grammar) { + /** + * Parse. + * @param input - + * @param startRule - + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + function parse(input, startRule) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const options = { startRule }; + try { + _pegjs_dist_grammar__WEBPACK_IMPORTED_MODULE_0__.parse(input, options); + } + catch (e) { + options.data = -1; + } + return options.data; + } + Grammar.parse = parse; + /** + * Parse the given string and returns a SIP.NameAddrHeader instance or undefined if + * it is an invalid NameAddrHeader. + * @param name_addr_header - + */ + function nameAddrHeaderParse(nameAddrHeader) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const parsedNameAddrHeader = Grammar.parse(nameAddrHeader, "Name_Addr_Header"); + return parsedNameAddrHeader !== -1 ? parsedNameAddrHeader : undefined; + } + Grammar.nameAddrHeaderParse = nameAddrHeaderParse; + /** + * Parse the given string and returns a SIP.URI instance or undefined if + * it is an invalid URI. + * @param uri - + */ + function URIParse(uri) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const parsedUri = Grammar.parse(uri, "SIP_URI"); + return parsedUri !== -1 ? parsedUri : undefined; + } + Grammar.URIParse = URIParse; +})(Grammar || (Grammar = {})); + + +/***/ }), +/* 22 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SyntaxError": () => (/* binding */ SyntaxError), +/* harmony export */ "parse": () => (/* binding */ parse) +/* harmony export */ }); +/* harmony import */ var _name_addr_header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); +/* harmony import */ var _uri__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(23); + + +class SyntaxError extends Error { + constructor(message, expected, found, location) { + super(); + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, SyntaxError); + } + } + static buildMessage(expected, found) { + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + function literalEscape(s) { + return s + .replace(/\\/g, "\\\\") + .replace(/"/g, "\\\"") + .replace(/\0/g, "\\0") + .replace(/\t/g, "\\t") + .replace(/\n/g, "\\n") + .replace(/\r/g, "\\r") + .replace(/[\x00-\x0F]/g, (ch) => "\\x0" + hex(ch)) + .replace(/[\x10-\x1F\x7F-\x9F]/g, (ch) => "\\x" + hex(ch)); + } + function classEscape(s) { + return s + .replace(/\\/g, "\\\\") + .replace(/\]/g, "\\]") + .replace(/\^/g, "\\^") + .replace(/-/g, "\\-") + .replace(/\0/g, "\\0") + .replace(/\t/g, "\\t") + .replace(/\n/g, "\\n") + .replace(/\r/g, "\\r") + .replace(/[\x00-\x0F]/g, (ch) => "\\x0" + hex(ch)) + .replace(/[\x10-\x1F\x7F-\x9F]/g, (ch) => "\\x" + hex(ch)); + } + function describeExpectation(expectation) { + switch (expectation.type) { + case "literal": + return "\"" + literalEscape(expectation.text) + "\""; + case "class": + const escapedParts = expectation.parts.map((part) => { + return Array.isArray(part) + ? classEscape(part[0]) + "-" + classEscape(part[1]) + : classEscape(part); + }); + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + case "any": + return "any character"; + case "end": + return "end of input"; + case "other": + return expectation.description; + } + } + function describeExpected(expected1) { + const descriptions = expected1.map(describeExpectation); + let i; + let j; + descriptions.sort(); + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + descriptions.length = j; + } + switch (descriptions.length) { + case 1: + return descriptions[0]; + case 2: + return descriptions[0] + " or " + descriptions[1]; + default: + return descriptions.slice(0, -1).join(", ") + + ", or " + + descriptions[descriptions.length - 1]; + } + } + function describeFound(found1) { + return found1 ? "\"" + literalEscape(found1) + "\"" : "end of input"; + } + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; + } +} +function peg$parse(input, options) { + options = options !== undefined ? options : {}; + const peg$FAILED = {}; + const peg$startRuleIndices = { Contact: 119, Name_Addr_Header: 156, Record_Route: 176, Request_Response: 81, SIP_URI: 45, Subscription_State: 186, Supported: 191, Require: 182, Via: 194, absoluteURI: 84, Call_ID: 118, Content_Disposition: 130, Content_Length: 135, Content_Type: 136, CSeq: 146, displayName: 122, Event: 149, From: 151, host: 52, Max_Forwards: 154, Min_SE: 213, Proxy_Authenticate: 157, quoted_string: 40, Refer_To: 178, Replaces: 179, Session_Expires: 210, stun_URI: 217, To: 192, turn_URI: 223, uuid: 226, WWW_Authenticate: 209, challenge: 158, sipfrag: 230, Referred_By: 231 }; + let peg$startRuleIndex = 119; + const peg$consts = [ + "\r\n", + peg$literalExpectation("\r\n", false), + /^[0-9]/, + peg$classExpectation([["0", "9"]], false, false), + /^[a-zA-Z]/, + peg$classExpectation([["a", "z"], ["A", "Z"]], false, false), + /^[0-9a-fA-F]/, + peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false), + /^[\0-\xFF]/, + peg$classExpectation([["\0", "\xFF"]], false, false), + /^["]/, + peg$classExpectation(["\""], false, false), + " ", + peg$literalExpectation(" ", false), + "\t", + peg$literalExpectation("\t", false), + /^[a-zA-Z0-9]/, + peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false), + ";", + peg$literalExpectation(";", false), + "/", + peg$literalExpectation("/", false), + "?", + peg$literalExpectation("?", false), + ":", + peg$literalExpectation(":", false), + "@", + peg$literalExpectation("@", false), + "&", + peg$literalExpectation("&", false), + "=", + peg$literalExpectation("=", false), + "+", + peg$literalExpectation("+", false), + "$", + peg$literalExpectation("$", false), + ",", + peg$literalExpectation(",", false), + "-", + peg$literalExpectation("-", false), + "_", + peg$literalExpectation("_", false), + ".", + peg$literalExpectation(".", false), + "!", + peg$literalExpectation("!", false), + "~", + peg$literalExpectation("~", false), + "*", + peg$literalExpectation("*", false), + "'", + peg$literalExpectation("'", false), + "(", + peg$literalExpectation("(", false), + ")", + peg$literalExpectation(")", false), + "%", + peg$literalExpectation("%", false), + function () { return " "; }, + function () { return ':'; }, + /^[!-~]/, + peg$classExpectation([["!", "~"]], false, false), + /^[\x80-\uFFFF]/, + peg$classExpectation([["\x80", "\uFFFF"]], false, false), + /^[\x80-\xBF]/, + peg$classExpectation([["\x80", "\xBF"]], false, false), + /^[a-f]/, + peg$classExpectation([["a", "f"]], false, false), + "`", + peg$literalExpectation("`", false), + "<", + peg$literalExpectation("<", false), + ">", + peg$literalExpectation(">", false), + "\\", + peg$literalExpectation("\\", false), + "[", + peg$literalExpectation("[", false), + "]", + peg$literalExpectation("]", false), + "{", + peg$literalExpectation("{", false), + "}", + peg$literalExpectation("}", false), + function () { return "*"; }, + function () { return "/"; }, + function () { return "="; }, + function () { return "("; }, + function () { return ")"; }, + function () { return ">"; }, + function () { return "<"; }, + function () { return ","; }, + function () { return ";"; }, + function () { return ":"; }, + function () { return "\""; }, + /^[!-']/, + peg$classExpectation([["!", "'"]], false, false), + /^[*-[]/, + peg$classExpectation([["*", "["]], false, false), + /^[\]-~]/, + peg$classExpectation([["]", "~"]], false, false), + function (contents) { + return contents; + }, + /^[#-[]/, + peg$classExpectation([["#", "["]], false, false), + /^[\0-\t]/, + peg$classExpectation([["\0", "\t"]], false, false), + /^[\x0B-\f]/, + peg$classExpectation([["\x0B", "\f"]], false, false), + /^[\x0E-\x7F]/, + peg$classExpectation([["\x0E", "\x7F"]], false, false), + function () { + options = options || { data: {} }; + options.data.uri = new _uri__WEBPACK_IMPORTED_MODULE_0__.URI(options.data.scheme, options.data.user, options.data.host, options.data.port); + delete options.data.scheme; + delete options.data.user; + delete options.data.host; + delete options.data.host_type; + delete options.data.port; + }, + function () { + options = options || { data: {} }; + options.data.uri = new _uri__WEBPACK_IMPORTED_MODULE_0__.URI(options.data.scheme, options.data.user, options.data.host, options.data.port, options.data.uri_params, options.data.uri_headers); + delete options.data.scheme; + delete options.data.user; + delete options.data.host; + delete options.data.host_type; + delete options.data.port; + delete options.data.uri_params; + if (options.startRule === 'SIP_URI') { + options.data = options.data.uri; + } + }, + "sips", + peg$literalExpectation("sips", true), + "sip", + peg$literalExpectation("sip", true), + function (uri_scheme) { + options = options || { data: {} }; + options.data.scheme = uri_scheme; + }, + function () { + options = options || { data: {} }; + options.data.user = decodeURIComponent(text().slice(0, -1)); + }, + function () { + options = options || { data: {} }; + options.data.password = text(); + }, + function () { + options = options || { data: {} }; + options.data.host = text(); + return options.data.host; + }, + function () { + options = options || { data: {} }; + options.data.host_type = 'domain'; + return text(); + }, + /^[a-zA-Z0-9_\-]/, + peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "_", "-"], false, false), + /^[a-zA-Z0-9\-]/, + peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "-"], false, false), + function () { + options = options || { data: {} }; + options.data.host_type = 'IPv6'; + return text(); + }, + "::", + peg$literalExpectation("::", false), + function () { + options = options || { data: {} }; + options.data.host_type = 'IPv6'; + return text(); + }, + function () { + options = options || { data: {} }; + options.data.host_type = 'IPv4'; + return text(); + }, + "25", + peg$literalExpectation("25", false), + /^[0-5]/, + peg$classExpectation([["0", "5"]], false, false), + "2", + peg$literalExpectation("2", false), + /^[0-4]/, + peg$classExpectation([["0", "4"]], false, false), + "1", + peg$literalExpectation("1", false), + /^[1-9]/, + peg$classExpectation([["1", "9"]], false, false), + function (port) { + options = options || { data: {} }; + port = parseInt(port.join('')); + options.data.port = port; + return port; + }, + "transport=", + peg$literalExpectation("transport=", true), + "udp", + peg$literalExpectation("udp", true), + "tcp", + peg$literalExpectation("tcp", true), + "sctp", + peg$literalExpectation("sctp", true), + "tls", + peg$literalExpectation("tls", true), + function (transport) { + options = options || { data: {} }; + if (!options.data.uri_params) + options.data.uri_params = {}; + options.data.uri_params['transport'] = transport.toLowerCase(); + }, + "user=", + peg$literalExpectation("user=", true), + "phone", + peg$literalExpectation("phone", true), + "ip", + peg$literalExpectation("ip", true), + function (user) { + options = options || { data: {} }; + if (!options.data.uri_params) + options.data.uri_params = {}; + options.data.uri_params['user'] = user.toLowerCase(); + }, + "method=", + peg$literalExpectation("method=", true), + function (method) { + options = options || { data: {} }; + if (!options.data.uri_params) + options.data.uri_params = {}; + options.data.uri_params['method'] = method; + }, + "ttl=", + peg$literalExpectation("ttl=", true), + function (ttl) { + options = options || { data: {} }; + if (!options.data.params) + options.data.params = {}; + options.data.params['ttl'] = ttl; + }, + "maddr=", + peg$literalExpectation("maddr=", true), + function (maddr) { + options = options || { data: {} }; + if (!options.data.uri_params) + options.data.uri_params = {}; + options.data.uri_params['maddr'] = maddr; + }, + "lr", + peg$literalExpectation("lr", true), + function () { + options = options || { data: {} }; + if (!options.data.uri_params) + options.data.uri_params = {}; + options.data.uri_params['lr'] = undefined; + }, + function (param, value) { + options = options || { data: {} }; + if (!options.data.uri_params) + options.data.uri_params = {}; + if (value === null) { + value = undefined; + } + else { + value = value[1]; + } + options.data.uri_params[param.toLowerCase()] = value; + }, + function (hname, hvalue) { + hname = hname.join('').toLowerCase(); + hvalue = hvalue.join(''); + options = options || { data: {} }; + if (!options.data.uri_headers) + options.data.uri_headers = {}; + if (!options.data.uri_headers[hname]) { + options.data.uri_headers[hname] = [hvalue]; + } + else { + options.data.uri_headers[hname].push(hvalue); + } + }, + function () { + options = options || { data: {} }; + // lots of tests fail if this isn't guarded... + if (options.startRule === 'Refer_To') { + options.data.uri = new _uri__WEBPACK_IMPORTED_MODULE_0__.URI(options.data.scheme, options.data.user, options.data.host, options.data.port, options.data.uri_params, options.data.uri_headers); + delete options.data.scheme; + delete options.data.user; + delete options.data.host; + delete options.data.host_type; + delete options.data.port; + delete options.data.uri_params; + } + }, + "//", + peg$literalExpectation("//", false), + function () { + options = options || { data: {} }; + options.data.scheme = text(); + }, + peg$literalExpectation("SIP", true), + function () { + options = options || { data: {} }; + options.data.sip_version = text(); + }, + "INVITE", + peg$literalExpectation("INVITE", false), + "ACK", + peg$literalExpectation("ACK", false), + "VXACH", + peg$literalExpectation("VXACH", false), + "OPTIONS", + peg$literalExpectation("OPTIONS", false), + "BYE", + peg$literalExpectation("BYE", false), + "CANCEL", + peg$literalExpectation("CANCEL", false), + "REGISTER", + peg$literalExpectation("REGISTER", false), + "SUBSCRIBE", + peg$literalExpectation("SUBSCRIBE", false), + "NOTIFY", + peg$literalExpectation("NOTIFY", false), + "REFER", + peg$literalExpectation("REFER", false), + "PUBLISH", + peg$literalExpectation("PUBLISH", false), + function () { + options = options || { data: {} }; + options.data.method = text(); + return options.data.method; + }, + function (status_code) { + options = options || { data: {} }; + options.data.status_code = parseInt(status_code.join('')); + }, + function () { + options = options || { data: {} }; + options.data.reason_phrase = text(); + }, + function () { + options = options || { data: {} }; + options.data = text(); + }, + function () { + var idx, length; + options = options || { data: {} }; + length = options.data.multi_header.length; + for (idx = 0; idx < length; idx++) { + if (options.data.multi_header[idx].parsed === null) { + options.data = null; + break; + } + } + if (options.data !== null) { + options.data = options.data.multi_header; + } + else { + options.data = -1; + } + }, + function () { + var header; + options = options || { data: {} }; + if (!options.data.multi_header) + options.data.multi_header = []; + try { + header = new _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(options.data.uri, options.data.displayName, options.data.params); + delete options.data.uri; + delete options.data.displayName; + delete options.data.params; + } + catch (e) { + header = null; + } + options.data.multi_header.push({ 'position': peg$currPos, + 'offset': location().start.offset, + 'parsed': header + }); + }, + function (displayName) { + displayName = text().trim(); + if (displayName[0] === '\"') { + displayName = displayName.substring(1, displayName.length - 1); + } + options = options || { data: {} }; + options.data.displayName = displayName; + }, + "q", + peg$literalExpectation("q", true), + function (q) { + options = options || { data: {} }; + if (!options.data.params) + options.data.params = {}; + options.data.params['q'] = q; + }, + "expires", + peg$literalExpectation("expires", true), + function (expires) { + options = options || { data: {} }; + if (!options.data.params) + options.data.params = {}; + options.data.params['expires'] = expires; + }, + function (delta_seconds) { + return parseInt(delta_seconds.join('')); + }, + "0", + peg$literalExpectation("0", false), + function () { + return parseFloat(text()); + }, + function (param, value) { + options = options || { data: {} }; + if (!options.data.params) + options.data.params = {}; + if (value === null) { + value = undefined; + } + else { + value = value[1]; + } + options.data.params[param.toLowerCase()] = value; + }, + "render", + peg$literalExpectation("render", true), + "session", + peg$literalExpectation("session", true), + "icon", + peg$literalExpectation("icon", true), + "alert", + peg$literalExpectation("alert", true), + function () { + options = options || { data: {} }; + if (options.startRule === 'Content_Disposition') { + options.data.type = text().toLowerCase(); + } + }, + "handling", + peg$literalExpectation("handling", true), + "optional", + peg$literalExpectation("optional", true), + "required", + peg$literalExpectation("required", true), + function (length) { + options = options || { data: {} }; + options.data = parseInt(length.join('')); + }, + function () { + options = options || { data: {} }; + options.data = text(); + }, + "text", + peg$literalExpectation("text", true), + "image", + peg$literalExpectation("image", true), + "audio", + peg$literalExpectation("audio", true), + "video", + peg$literalExpectation("video", true), + "application", + peg$literalExpectation("application", true), + "message", + peg$literalExpectation("message", true), + "multipart", + peg$literalExpectation("multipart", true), + "x-", + peg$literalExpectation("x-", true), + function (cseq_value) { + options = options || { data: {} }; + options.data.value = parseInt(cseq_value.join('')); + }, + function (expires) { options = options || { data: {} }; options.data = expires; }, + function (event_type) { + options = options || { data: {} }; + options.data.event = event_type.toLowerCase(); + }, + function () { + options = options || { data: {} }; + var tag = options.data.tag; + options.data = new _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(options.data.uri, options.data.displayName, options.data.params); + if (tag) { + options.data.setParam('tag', tag); + } + }, + "tag", + peg$literalExpectation("tag", true), + function (tag) { options = options || { data: {} }; options.data.tag = tag; }, + function (forwards) { + options = options || { data: {} }; + options.data = parseInt(forwards.join('')); + }, + function (min_expires) { options = options || { data: {} }; options.data = min_expires; }, + function () { + options = options || { data: {} }; + options.data = new _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(options.data.uri, options.data.displayName, options.data.params); + }, + "digest", + peg$literalExpectation("Digest", true), + "realm", + peg$literalExpectation("realm", true), + function (realm) { options = options || { data: {} }; options.data.realm = realm; }, + "domain", + peg$literalExpectation("domain", true), + "nonce", + peg$literalExpectation("nonce", true), + function (nonce) { options = options || { data: {} }; options.data.nonce = nonce; }, + "opaque", + peg$literalExpectation("opaque", true), + function (opaque) { options = options || { data: {} }; options.data.opaque = opaque; }, + "stale", + peg$literalExpectation("stale", true), + "true", + peg$literalExpectation("true", true), + function () { options = options || { data: {} }; options.data.stale = true; }, + "false", + peg$literalExpectation("false", true), + function () { options = options || { data: {} }; options.data.stale = false; }, + "algorithm", + peg$literalExpectation("algorithm", true), + "md5", + peg$literalExpectation("MD5", true), + "md5-sess", + peg$literalExpectation("MD5-sess", true), + function (algorithm) { + options = options || { data: {} }; + options.data.algorithm = algorithm.toUpperCase(); + }, + "qop", + peg$literalExpectation("qop", true), + "auth-int", + peg$literalExpectation("auth-int", true), + "auth", + peg$literalExpectation("auth", true), + function (qop_value) { + options = options || { data: {} }; + options.data.qop || (options.data.qop = []); + options.data.qop.push(qop_value.toLowerCase()); + }, + function (rack_value) { + options = options || { data: {} }; + options.data.value = parseInt(rack_value.join('')); + }, + function () { + var idx, length; + options = options || { data: {} }; + length = options.data.multi_header.length; + for (idx = 0; idx < length; idx++) { + if (options.data.multi_header[idx].parsed === null) { + options.data = null; + break; + } + } + if (options.data !== null) { + options.data = options.data.multi_header; + } + else { + options.data = -1; + } + }, + function () { + var header; + options = options || { data: {} }; + if (!options.data.multi_header) + options.data.multi_header = []; + try { + header = new _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(options.data.uri, options.data.displayName, options.data.params); + delete options.data.uri; + delete options.data.displayName; + delete options.data.params; + } + catch (e) { + header = null; + } + options.data.multi_header.push({ 'position': peg$currPos, + 'offset': location().start.offset, + 'parsed': header + }); + }, + function () { + options = options || { data: {} }; + options.data = new _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(options.data.uri, options.data.displayName, options.data.params); + }, + function () { + options = options || { data: {} }; + if (!(options.data.replaces_from_tag && options.data.replaces_to_tag)) { + options.data = -1; + } + }, + function () { + options = options || { data: {} }; + options.data = { + call_id: options.data + }; + }, + "from-tag", + peg$literalExpectation("from-tag", true), + function (from_tag) { + options = options || { data: {} }; + options.data.replaces_from_tag = from_tag; + }, + "to-tag", + peg$literalExpectation("to-tag", true), + function (to_tag) { + options = options || { data: {} }; + options.data.replaces_to_tag = to_tag; + }, + "early-only", + peg$literalExpectation("early-only", true), + function () { + options = options || { data: {} }; + options.data.early_only = true; + }, + function (head, r) { return r; }, + function (head, tail) { return list(head, tail); }, + function (value) { + options = options || { data: {} }; + if (options.startRule === 'Require') { + options.data = value || []; + } + }, + function (rseq_value) { + options = options || { data: {} }; + options.data.value = parseInt(rseq_value.join('')); + }, + "active", + peg$literalExpectation("active", true), + "pending", + peg$literalExpectation("pending", true), + "terminated", + peg$literalExpectation("terminated", true), + function () { + options = options || { data: {} }; + options.data.state = text(); + }, + "reason", + peg$literalExpectation("reason", true), + function (reason) { + options = options || { data: {} }; + if (typeof reason !== 'undefined') + options.data.reason = reason; + }, + function (expires) { + options = options || { data: {} }; + if (typeof expires !== 'undefined') + options.data.expires = expires; + }, + "retry_after", + peg$literalExpectation("retry_after", true), + function (retry_after) { + options = options || { data: {} }; + if (typeof retry_after !== 'undefined') + options.data.retry_after = retry_after; + }, + "deactivated", + peg$literalExpectation("deactivated", true), + "probation", + peg$literalExpectation("probation", true), + "rejected", + peg$literalExpectation("rejected", true), + "timeout", + peg$literalExpectation("timeout", true), + "giveup", + peg$literalExpectation("giveup", true), + "noresource", + peg$literalExpectation("noresource", true), + "invariant", + peg$literalExpectation("invariant", true), + function (value) { + options = options || { data: {} }; + if (options.startRule === 'Supported') { + options.data = value || []; + } + }, + function () { + options = options || { data: {} }; + var tag = options.data.tag; + options.data = new _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(options.data.uri, options.data.displayName, options.data.params); + if (tag) { + options.data.setParam('tag', tag); + } + }, + "ttl", + peg$literalExpectation("ttl", true), + function (via_ttl_value) { + options = options || { data: {} }; + options.data.ttl = via_ttl_value; + }, + "maddr", + peg$literalExpectation("maddr", true), + function (via_maddr) { + options = options || { data: {} }; + options.data.maddr = via_maddr; + }, + "received", + peg$literalExpectation("received", true), + function (via_received) { + options = options || { data: {} }; + options.data.received = via_received; + }, + "branch", + peg$literalExpectation("branch", true), + function (via_branch) { + options = options || { data: {} }; + options.data.branch = via_branch; + }, + "rport", + peg$literalExpectation("rport", true), + function (response_port) { + options = options || { data: {} }; + if (typeof response_port !== 'undefined') + options.data.rport = response_port.join(''); + }, + function (via_protocol) { + options = options || { data: {} }; + options.data.protocol = via_protocol; + }, + peg$literalExpectation("UDP", true), + peg$literalExpectation("TCP", true), + peg$literalExpectation("TLS", true), + peg$literalExpectation("SCTP", true), + function (via_transport) { + options = options || { data: {} }; + options.data.transport = via_transport; + }, + function () { + options = options || { data: {} }; + options.data.host = text(); + }, + function (via_sent_by_port) { + options = options || { data: {} }; + options.data.port = parseInt(via_sent_by_port.join('')); + }, + function (ttl) { + return parseInt(ttl.join('')); + }, + function (deltaSeconds) { + options = options || { data: {} }; + if (options.startRule === 'Session_Expires') { + options.data.deltaSeconds = deltaSeconds; + } + }, + "refresher", + peg$literalExpectation("refresher", false), + "uas", + peg$literalExpectation("uas", false), + "uac", + peg$literalExpectation("uac", false), + function (endpoint) { + options = options || { data: {} }; + if (options.startRule === 'Session_Expires') { + options.data.refresher = endpoint; + } + }, + function (deltaSeconds) { + options = options || { data: {} }; + if (options.startRule === 'Min_SE') { + options.data = deltaSeconds; + } + }, + "stuns", + peg$literalExpectation("stuns", true), + "stun", + peg$literalExpectation("stun", true), + function (scheme) { + options = options || { data: {} }; + options.data.scheme = scheme; + }, + function (host) { + options = options || { data: {} }; + options.data.host = host; + }, + "?transport=", + peg$literalExpectation("?transport=", false), + "turns", + peg$literalExpectation("turns", true), + "turn", + peg$literalExpectation("turn", true), + function (transport) { + options = options || { data: {} }; + options.data.transport = transport; + }, + function () { + options = options || { data: {} }; + options.data = text(); + }, + "Referred-By", + peg$literalExpectation("Referred-By", false), + "b", + peg$literalExpectation("b", false), + "cid", + peg$literalExpectation("cid", false) + ]; + const peg$bytecode = [ + peg$decode("2 \"\"6 7!"), + peg$decode("4\"\"\"5!7#"), + peg$decode("4$\"\"5!7%"), + peg$decode("4&\"\"5!7'"), + peg$decode(";'.# &;("), + peg$decode("4(\"\"5!7)"), + peg$decode("4*\"\"5!7+"), + peg$decode("2,\"\"6,7-"), + peg$decode("2.\"\"6.7/"), + peg$decode("40\"\"5!71"), + peg$decode("22\"\"6273.\x89 &24\"\"6475.} &26\"\"6677.q &28\"\"6879.e &2:\"\"6:7;.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E"), + peg$decode(";).# &;,"), + peg$decode("2F\"\"6F7G.} &2H\"\"6H7I.q &2J\"\"6J7K.e &2L\"\"6L7M.Y &2N\"\"6N7O.M &2P\"\"6P7Q.A &2R\"\"6R7S.5 &2T\"\"6T7U.) &2V\"\"6V7W"), + peg$decode("%%2X\"\"6X7Y/5#;#/,$;#/#$+#)(#'#(\"'#&'#/\"!&,)"), + peg$decode("%%$;$0#*;$&/,#; /#$+\")(\"'#&'#.\" &\"/=#$;$/�#*;$&&&#/'$8\":Z\" )(\"'#&'#"), + peg$decode(";..\" &\""), + peg$decode("%$;'.# &;(0)*;'.# &;(&/?#28\"\"6879/0$;//'$8#:[# )(#'#(\"'#&'#"), + peg$decode("%%$;2/�#*;2&&&#/g#$%$;.0#*;.&/,#;2/#$+\")(\"'#&'#0=*%$;.0#*;.&/,#;2/#$+\")(\"'#&'#&/#$+\")(\"'#&'#/\"!&,)"), + peg$decode("4\\\"\"5!7].# &;3"), + peg$decode("4^\"\"5!7_"), + peg$decode("4`\"\"5!7a"), + peg$decode(";!.) &4b\"\"5!7c"), + peg$decode("%$;).\x95 &2F\"\"6F7G.\x89 &2J\"\"6J7K.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O/\x9E#0\x9B*;).\x95 &2F\"\"6F7G.\x89 &2J\"\"6J7K.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O&&&#/\"!&,)"), + peg$decode("%$;).\x89 &2F\"\"6F7G.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O/\x92#0\x8F*;).\x89 &2F\"\"6F7G.} &2L\"\"6L7M.q &2X\"\"6X7Y.e &2P\"\"6P7Q.Y &2H\"\"6H7I.M &2@\"\"6@7A.A &2d\"\"6d7e.5 &2R\"\"6R7S.) &2N\"\"6N7O&&&#/\"!&,)"), + peg$decode("2T\"\"6T7U.\xE3 &2V\"\"6V7W.\xD7 &2f\"\"6f7g.\xCB &2h\"\"6h7i.\xBF &2:\"\"6:7;.\xB3 &2D\"\"6D7E.\xA7 &22\"\"6273.\x9B &28\"\"6879.\x8F &2j\"\"6j7k.\x83 &;&.} &24\"\"6475.q &2l\"\"6l7m.e &2n\"\"6n7o.Y &26\"\"6677.M &2>\"\"6>7?.A &2p\"\"6p7q.5 &2r\"\"6r7s.) &;'.# &;("), + peg$decode("%$;).\u012B &2F\"\"6F7G.\u011F &2J\"\"6J7K.\u0113 &2L\"\"6L7M.\u0107 &2X\"\"6X7Y.\xFB &2P\"\"6P7Q.\xEF &2H\"\"6H7I.\xE3 &2@\"\"6@7A.\xD7 &2d\"\"6d7e.\xCB &2R\"\"6R7S.\xBF &2N\"\"6N7O.\xB3 &2T\"\"6T7U.\xA7 &2V\"\"6V7W.\x9B &2f\"\"6f7g.\x8F &2h\"\"6h7i.\x83 &28\"\"6879.w &2j\"\"6j7k.k &;&.e &24\"\"6475.Y &2l\"\"6l7m.M &2n\"\"6n7o.A &26\"\"6677.5 &2p\"\"6p7q.) &2r\"\"6r7s/\u0134#0\u0131*;).\u012B &2F\"\"6F7G.\u011F &2J\"\"6J7K.\u0113 &2L\"\"6L7M.\u0107 &2X\"\"6X7Y.\xFB &2P\"\"6P7Q.\xEF &2H\"\"6H7I.\xE3 &2@\"\"6@7A.\xD7 &2d\"\"6d7e.\xCB &2R\"\"6R7S.\xBF &2N\"\"6N7O.\xB3 &2T\"\"6T7U.\xA7 &2V\"\"6V7W.\x9B &2f\"\"6f7g.\x8F &2h\"\"6h7i.\x83 &28\"\"6879.w &2j\"\"6j7k.k &;&.e &24\"\"6475.Y &2l\"\"6l7m.M &2n\"\"6n7o.A &26\"\"6677.5 &2p\"\"6p7q.) &2r\"\"6r7s&&&#/\"!&,)"), + peg$decode("%;//?#2P\"\"6P7Q/0$;//'$8#:t# )(#'#(\"'#&'#"), + peg$decode("%;//?#24\"\"6475/0$;//'$8#:u# )(#'#(\"'#&'#"), + peg$decode("%;//?#2>\"\"6>7?/0$;//'$8#:v# )(#'#(\"'#&'#"), + peg$decode("%;//?#2T\"\"6T7U/0$;//'$8#:w# )(#'#(\"'#&'#"), + peg$decode("%;//?#2V\"\"6V7W/0$;//'$8#:x# )(#'#(\"'#&'#"), + peg$decode("%2h\"\"6h7i/0#;//'$8\":y\" )(\"'#&'#"), + peg$decode("%;//6#2f\"\"6f7g/'$8\":z\" )(\"'#&'#"), + peg$decode("%;//?#2D\"\"6D7E/0$;//'$8#:{# )(#'#(\"'#&'#"), + peg$decode("%;//?#22\"\"6273/0$;//'$8#:|# )(#'#(\"'#&'#"), + peg$decode("%;//?#28\"\"6879/0$;//'$8#:}# )(#'#(\"'#&'#"), + peg$decode("%;//0#;&/'$8\":~\" )(\"'#&'#"), + peg$decode("%;&/0#;//'$8\":~\" )(\"'#&'#"), + peg$decode("%;=/T#$;G.) &;K.# &;F0/*;G.) &;K.# &;F&/,$;>/#$+#)(#'#(\"'#&'#"), + peg$decode("4\x7F\"\"5!7\x80.A &4\x81\"\"5!7\x82.5 &4\x83\"\"5!7\x84.) &;3.# &;."), + peg$decode("%%;//Q#;&/H$$;J.# &;K0)*;J.# &;K&/,$;&/#$+$)($'#(#'#(\"'#&'#/\"!&,)"), + peg$decode("%;//]#;&/T$%$;J.# &;K0)*;J.# &;K&/\"!&,)/1$;&/($8$:\x85$!!)($'#(#'#(\"'#&'#"), + peg$decode(";..G &2L\"\"6L7M.; &4\x86\"\"5!7\x87./ &4\x83\"\"5!7\x84.# &;3"), + peg$decode("%2j\"\"6j7k/J#4\x88\"\"5!7\x89.5 &4\x8A\"\"5!7\x8B.) &4\x8C\"\"5!7\x8D/#$+\")(\"'#&'#"), + peg$decode("%;N/M#28\"\"6879/>$;O.\" &\"/0$;S/'$8$:\x8E$ )($'#(#'#(\"'#&'#"), + peg$decode("%;N/d#28\"\"6879/U$;O.\" &\"/G$;S/>$;_/5$;l.\" &\"/'$8&:\x8F& )(&'#(%'#($'#(#'#(\"'#&'#"), + peg$decode("%3\x90\"\"5$7\x91.) &3\x92\"\"5#7\x93/' 8!:\x94!! )"), + peg$decode("%;P/]#%28\"\"6879/,#;R/#$+\")(\"'#&'#.\" &\"/6$2:\"\"6:7;/'$8#:\x95# )(#'#(\"'#&'#"), + peg$decode("$;+.) &;-.# &;Q/2#0/*;+.) &;-.# &;Q&&&#"), + peg$decode("2<\"\"6<7=.q &2>\"\"6>7?.e &2@\"\"6@7A.Y &2B\"\"6B7C.M &2D\"\"6D7E.A &22\"\"6273.5 &26\"\"6677.) &24\"\"6475"), + peg$decode("%$;+._ &;-.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E0e*;+._ &;-.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E&/& 8!:\x96! )"), + peg$decode("%;T/J#%28\"\"6879/,#;^/#$+\")(\"'#&'#.\" &\"/#$+\")(\"'#&'#"), + peg$decode("%;U.) &;\\.# &;X/& 8!:\x97! )"), + peg$decode("%$%;V/2#2J\"\"6J7K/#$+\")(\"'#&'#0<*%;V/2#2J\"\"6J7K/#$+\")(\"'#&'#&/D#;W/;$2J\"\"6J7K.\" &\"/'$8#:\x98# )(#'#(\"'#&'#"), + peg$decode("$4\x99\"\"5!7\x9A/,#0)*4\x99\"\"5!7\x9A&&&#"), + peg$decode("%4$\"\"5!7%/?#$4\x9B\"\"5!7\x9C0)*4\x9B\"\"5!7\x9C&/#$+\")(\"'#&'#"), + peg$decode("%2l\"\"6l7m/?#;Y/6$2n\"\"6n7o/'$8#:\x9D# )(#'#(\"'#&'#"), + peg$decode("%%;Z/\xB3#28\"\"6879/\xA4$;Z/\x9B$28\"\"6879/\x8C$;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+-)(-'#(,'#(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0790 &%2\x9E\"\"6\x9E7\x9F/\xA4#;Z/\x9B$28\"\"6879/\x8C$;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+,)(,'#(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u06F9 &%2\x9E\"\"6\x9E7\x9F/\x8C#;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+*)(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u067A &%2\x9E\"\"6\x9E7\x9F/t#;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0613 &%2\x9E\"\"6\x9E7\x9F/\\#;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+&)(&'#(%'#($'#(#'#(\"'#&'#.\u05C4 &%2\x9E\"\"6\x9E7\x9F/D#;Z/;$28\"\"6879/,$;[/#$+$)($'#(#'#(\"'#&'#.\u058D &%2\x9E\"\"6\x9E7\x9F/,#;[/#$+\")(\"'#&'#.\u056E &%2\x9E\"\"6\x9E7\x9F/,#;Z/#$+\")(\"'#&'#.\u054F &%;Z/\x9B#2\x9E\"\"6\x9E7\x9F/\x8C$;Z/\x83$28\"\"6879/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$++)(+'#(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u04C7 &%;Z/\xAA#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x83$2\x9E\"\"6\x9E7\x9F/t$;Z/k$28\"\"6879/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+*)(*'#()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0430 &%;Z/\xB9#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x92$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/k$2\x9E\"\"6\x9E7\x9F/\\$;Z/S$28\"\"6879/D$;Z/;$28\"\"6879/,$;[/#$+))()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u038A &%;Z/\xC8#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xA1$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/z$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/S$2\x9E\"\"6\x9E7\x9F/D$;Z/;$28\"\"6879/,$;[/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u02D5 &%;Z/\xD7#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xB0$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x89$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/b$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/;$2\x9E\"\"6\x9E7\x9F/,$;[/#$+')(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0211 &%;Z/\xFE#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xD7$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xB0$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x89$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/b$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/;$2\x9E\"\"6\x9E7\x9F/,$;Z/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#.\u0126 &%;Z/\u011C#%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xF5$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xCE$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\xA7$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/\x80$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/Y$%28\"\"6879/,#;Z/#$+\")(\"'#&'#.\" &\"/2$2\x9E\"\"6\x9E7\x9F/#$+()(('#(''#(&'#(%'#($'#(#'#(\"'#&'#/& 8!:\xA0! )"), + peg$decode("%;#/M#;#.\" &\"/?$;#.\" &\"/1$;#.\" &\"/#$+$)($'#(#'#(\"'#&'#"), + peg$decode("%;Z/;#28\"\"6879/,$;Z/#$+#)(#'#(\"'#&'#.# &;\\"), + peg$decode("%;]/o#2J\"\"6J7K/`$;]/W$2J\"\"6J7K/H$;]/?$2J\"\"6J7K/0$;]/'$8':\xA1' )(''#(&'#(%'#($'#(#'#(\"'#&'#"), + peg$decode("%2\xA2\"\"6\xA27\xA3/2#4\xA4\"\"5!7\xA5/#$+\")(\"'#&'#.\x98 &%2\xA6\"\"6\xA67\xA7/;#4\xA8\"\"5!7\xA9/,$;!/#$+#)(#'#(\"'#&'#.j &%2\xAA\"\"6\xAA7\xAB/5#;!/,$;!/#$+#)(#'#(\"'#&'#.B &%4\xAC\"\"5!7\xAD/,#;!/#$+\")(\"'#&'#.# &;!"), + peg$decode("%%;!.\" &\"/[#;!.\" &\"/M$;!.\" &\"/?$;!.\" &\"/1$;!.\" &\"/#$+%)(%'#($'#(#'#(\"'#&'#/' 8!:\xAE!! )"), + peg$decode("$%22\"\"6273/,#;`/#$+\")(\"'#&'#0<*%22\"\"6273/,#;`/#$+\")(\"'#&'#&"), + peg$decode(";a.A &;b.; &;c.5 &;d./ &;e.) &;f.# &;g"), + peg$decode("%3\xAF\"\"5*7\xB0/a#3\xB1\"\"5#7\xB2.G &3\xB3\"\"5#7\xB4.; &3\xB5\"\"5$7\xB6./ &3\xB7\"\"5#7\xB8.# &;6/($8\":\xB9\"! )(\"'#&'#"), + peg$decode("%3\xBA\"\"5%7\xBB/I#3\xBC\"\"5%7\xBD./ &3\xBE\"\"5\"7\xBF.# &;6/($8\":\xC0\"! )(\"'#&'#"), + peg$decode("%3\xC1\"\"5'7\xC2/1#;\x90/($8\":\xC3\"! )(\"'#&'#"), + peg$decode("%3\xC4\"\"5$7\xC5/1#;\xF0/($8\":\xC6\"! )(\"'#&'#"), + peg$decode("%3\xC7\"\"5&7\xC8/1#;T/($8\":\xC9\"! )(\"'#&'#"), + peg$decode("%3\xCA\"\"5\"7\xCB/N#%2>\"\"6>7?/,#;6/#$+\")(\"'#&'#.\" &\"/'$8\":\xCC\" )(\"'#&'#"), + peg$decode("%;h/P#%2>\"\"6>7?/,#;i/#$+\")(\"'#&'#.\" &\"/)$8\":\xCD\"\"! )(\"'#&'#"), + peg$decode("%$;j/�#*;j&&&#/\"!&,)"), + peg$decode("%$;j/�#*;j&&&#/\"!&,)"), + peg$decode(";k.) &;+.# &;-"), + peg$decode("2l\"\"6l7m.e &2n\"\"6n7o.Y &24\"\"6475.M &28\"\"6879.A &2<\"\"6<7=.5 &2@\"\"6@7A.) &2B\"\"6B7C"), + peg$decode("%26\"\"6677/n#;m/e$$%2<\"\"6<7=/,#;m/#$+\")(\"'#&'#0<*%2<\"\"6<7=/,#;m/#$+\")(\"'#&'#&/#$+#)(#'#(\"'#&'#"), + peg$decode("%;n/A#2>\"\"6>7?/2$;o/)$8#:\xCE#\"\" )(#'#(\"'#&'#"), + peg$decode("$;p.) &;+.# &;-/2#0/*;p.) &;+.# &;-&&&#"), + peg$decode("$;p.) &;+.# &;-0/*;p.) &;+.# &;-&"), + peg$decode("2l\"\"6l7m.e &2n\"\"6n7o.Y &24\"\"6475.M &26\"\"6677.A &28\"\"6879.5 &2@\"\"6@7A.) &2B\"\"6B7C"), + peg$decode(";\x91.# &;r"), + peg$decode("%;\x90/G#;'/>$;s/5$;'/,$;\x84/#$+%)(%'#($'#(#'#(\"'#&'#"), + peg$decode(";M.# &;t"), + peg$decode("%;\x7F/E#28\"\"6879/6$;u.# &;x/'$8#:\xCF# )(#'#(\"'#&'#"), + peg$decode("%;v.# &;w/J#%26\"\"6677/,#;\x83/#$+\")(\"'#&'#.\" &\"/#$+\")(\"'#&'#"), + peg$decode("%2\xD0\"\"6\xD07\xD1/:#;\x80/1$;w.\" &\"/#$+#)(#'#(\"'#&'#"), + peg$decode("%24\"\"6475/,#;{/#$+\")(\"'#&'#"), + peg$decode("%;z/3#$;y0#*;y&/#$+\")(\"'#&'#"), + peg$decode(";*.) &;+.# &;-"), + peg$decode(";+.\x8F &;-.\x89 &22\"\"6273.} &26\"\"6677.q &28\"\"6879.e &2:\"\"6:7;.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E"), + peg$decode("%;|/e#$%24\"\"6475/,#;|/#$+\")(\"'#&'#0<*%24\"\"6475/,#;|/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"), + peg$decode("%$;~0#*;~&/e#$%22\"\"6273/,#;}/#$+\")(\"'#&'#0<*%22\"\"6273/,#;}/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"), + peg$decode("$;~0#*;~&"), + peg$decode(";+.w &;-.q &28\"\"6879.e &2:\"\"6:7;.Y &2<\"\"6<7=.M &2>\"\"6>7?.A &2@\"\"6@7A.5 &2B\"\"6B7C.) &2D\"\"6D7E"), + peg$decode("%%;\"/\x87#$;\".G &;!.A &2@\"\"6@7A.5 &2F\"\"6F7G.) &2J\"\"6J7K0M*;\".G &;!.A &2@\"\"6@7A.5 &2F\"\"6F7G.) &2J\"\"6J7K&/#$+\")(\"'#&'#/& 8!:\xD2! )"), + peg$decode(";\x81.# &;\x82"), + peg$decode("%%;O/2#2:\"\"6:7;/#$+\")(\"'#&'#.\" &\"/,#;S/#$+\")(\"'#&'#.\" &\""), + peg$decode("$;+.\x83 &;-.} &2B\"\"6B7C.q &2D\"\"6D7E.e &22\"\"6273.Y &28\"\"6879.M &2:\"\"6:7;.A &2<\"\"6<7=.5 &2>\"\"6>7?.) &2@\"\"6@7A/\x8C#0\x89*;+.\x83 &;-.} &2B\"\"6B7C.q &2D\"\"6D7E.e &22\"\"6273.Y &28\"\"6879.M &2:\"\"6:7;.A &2<\"\"6<7=.5 &2>\"\"6>7?.) &2@\"\"6@7A&&&#"), + peg$decode("$;y0#*;y&"), + peg$decode("%3\x92\"\"5#7\xD3/q#24\"\"6475/b$$;!/�#*;!&&&#/L$2J\"\"6J7K/=$$;!/�#*;!&&&#/'$8%:\xD4% )(%'#($'#(#'#(\"'#&'#"), + peg$decode("2\xD5\"\"6\xD57\xD6"), + peg$decode("2\xD7\"\"6\xD77\xD8"), + peg$decode("2\xD9\"\"6\xD97\xDA"), + peg$decode("2\xDB\"\"6\xDB7\xDC"), + peg$decode("2\xDD\"\"6\xDD7\xDE"), + peg$decode("2\xDF\"\"6\xDF7\xE0"), + peg$decode("2\xE1\"\"6\xE17\xE2"), + peg$decode("2\xE3\"\"6\xE37\xE4"), + peg$decode("2\xE5\"\"6\xE57\xE6"), + peg$decode("2\xE7\"\"6\xE77\xE8"), + peg$decode("2\xE9\"\"6\xE97\xEA"), + peg$decode("%;\x85.Y &;\x86.S &;\x88.M &;\x89.G &;\x8A.A &;\x8B.; &;\x8C.5 &;\x8F./ &;\x8D.) &;\x8E.# &;6/& 8!:\xEB! )"), + peg$decode("%;\x84/G#;'/>$;\x92/5$;'/,$;\x94/#$+%)(%'#($'#(#'#(\"'#&'#"), + peg$decode("%;\x93/' 8!:\xEC!! )"), + peg$decode("%;!/5#;!/,$;!/#$+#)(#'#(\"'#&'#"), + peg$decode("%$;*.A &;+.; &;-.5 &;3./ &;4.) &;'.# &;(0G*;*.A &;+.; &;-.5 &;3./ &;4.) &;'.# &;(&/& 8!:\xED! )"), + peg$decode("%;\xB6/Y#$%;A/,#;\xB6/#$+\")(\"'#&'#06*%;A/,#;\xB6/#$+\")(\"'#&'#&/#$+\")(\"'#&'#"), + peg$decode("%;9/N#%2:\"\"6:7;/,#;9/#$+\")(\"'#&'#.\" &\"/'$8\":\xEE\" )(\"'#&'#"), + peg$decode("%;:.c &%;\x98/Y#$%;A/,#;\x98/#$+\")(\"'#&'#06*%;A/,#;\x98/#$+\")(\"'#&'#&/#$+\")(\"'#&'#/& 8!:\xEF! )"), + peg$decode("%;L.# &;\x99/]#$%;B/,#;\x9B/#$+\")(\"'#&'#06*%;B/,#;\x9B/#$+\")(\"'#&'#&/'$8\":\xF0\" )(\"'#&'#"), + peg$decode("%;\x9A.\" &\"/>#;@/5$;M/,$;?/#$+$)($'#(#'#(\"'#&'#"), + peg$decode("%%;6/Y#$%;./,#;6/#$+\")(\"'#&'#06*%;./,#;6/#$+\")(\"'#&'#&/#$+\")(\"'#&'#.# &;H/' 8!:\xF1!! )"), + peg$decode(";\x9C.) &;\x9D.# &;\xA0"), + peg$decode("%3\xF2\"\"5!7\xF3/:#;$;\xCF/5$;./,$;\x90/#$+%)(%'#($'#(#'#(\"'#&'#"), + peg$decode("%$;!/�#*;!&&&#/' 8!:\u014B!! )"), + peg$decode("%;\xD1/]#$%;A/,#;\xD1/#$+\")(\"'#&'#06*%;A/,#;\xD1/#$+\")(\"'#&'#&/'$8\":\u014C\" )(\"'#&'#"), + peg$decode("%;\x99/]#$%;B/,#;\xA0/#$+\")(\"'#&'#06*%;B/,#;\xA0/#$+\")(\"'#&'#&/'$8\":\u014D\" )(\"'#&'#"), + peg$decode("%;L.O &;\x99.I &%;@.\" &\"/:#;t/1$;?.\" &\"/#$+#)(#'#(\"'#&'#/]#$%;B/,#;\xA0/#$+\")(\"'#&'#06*%;B/,#;\xA0/#$+\")(\"'#&'#&/'$8\":\u014E\" )(\"'#&'#"), + peg$decode("%;\xD4/]#$%;B/,#;\xD5/#$+\")(\"'#&'#06*%;B/,#;\xD5/#$+\")(\"'#&'#&/'$8\":\u014F\" )(\"'#&'#"), + peg$decode("%;\x96/& 8!:\u0150! )"), + peg$decode("%3\u0151\"\"5(7\u0152/:#;$;6/5$;;/,$;\xEC/#$+%)(%'#($'#(#'#(\"'#&'#"), + peg$decode("%3\x92\"\"5#7\xD3.# &;6/' 8!:\u018B!! )"), + peg$decode("%3\xB1\"\"5#7\u018C.G &3\xB3\"\"5#7\u018D.; &3\xB7\"\"5#7\u018E./ &3\xB5\"\"5$7\u018F.# &;6/' 8!:\u0190!! )"), + peg$decode("%;\xEE/D#%;C/,#;\xEF/#$+\")(\"'#&'#.\" &\"/#$+\")(\"'#&'#"), + peg$decode("%;U.) &;\\.# &;X/& 8!:\u0191! )"), + peg$decode("%%;!.\" &\"/[#;!.\" &\"/M$;!.\" &\"/?$;!.\" &\"/1$;!.\" &\"/#$+%)(%'#($'#(#'#(\"'#&'#/' 8!:\u0192!! )"), + peg$decode("%%;!/?#;!.\" &\"/1$;!.\" &\"/#$+#)(#'#(\"'#&'#/' 8!:\u0193!! )"), + peg$decode(";\xBE"), + peg$decode("%;\x9E/^#$%;B/,#;\xF3/#$+\")(\"'#&'#06*%;B/,#;\xF3/#$+\")(\"'#&'#&/($8\":\u0194\"!!)(\"'#&'#"), + peg$decode(";\xF4.# &;\xA0"), + peg$decode("%2\u0195\"\"6\u01957\u0196/L#;\"\"6>7?"), + peg$decode("%;\u0100/b#28\"\"6879/S$;\xFB/J$%2\u01A3\"\"6\u01A37\u01A4/,#;\xEC/#$+\")(\"'#&'#.\" &\"/#$+$)($'#(#'#(\"'#&'#"), + peg$decode("%3\u01A5\"\"5%7\u01A6.) &3\u01A7\"\"5$7\u01A8/' 8!:\u01A1!! )"), + peg$decode("%3\xB1\"\"5#7\xB2.6 &3\xB3\"\"5#7\xB4.* &$;+0#*;+&/' 8!:\u01A9!! )"), + peg$decode("%;\u0104/\x87#2F\"\"6F7G/x$;\u0103/o$2F\"\"6F7G/`$;\u0103/W$2F\"\"6F7G/H$;\u0103/?$2F\"\"6F7G/0$;\u0105/'$8):\u01AA) )()'#(('#(''#(&'#(%'#($'#(#'#(\"'#&'#"), + peg$decode("%;#/>#;#/5$;#/,$;#/#$+$)($'#(#'#(\"'#&'#"), + peg$decode("%;\u0103/,#;\u0103/#$+\")(\"'#&'#"), + peg$decode("%;\u0103/5#;\u0103/,$;\u0103/#$+#)(#'#(\"'#&'#"), + peg$decode("%;q/T#$;m0#*;m&/D$%; /,#;\xF8/#$+\")(\"'#&'#.\" &\"/#$+#)(#'#(\"'#&'#"), + peg$decode("%2\u01AB\"\"6\u01AB7\u01AC.) &2\u01AD\"\"6\u01AD7\u01AE/w#;0/n$;\u0108/e$$%;B/2#;\u0109.# &;\xA0/#$+\")(\"'#&'#0<*%;B/2#;\u0109.# &;\xA0/#$+\")(\"'#&'#&/#$+$)($'#(#'#(\"'#&'#"), + peg$decode(";\x99.# &;L"), + peg$decode("%2\u01AF\"\"6\u01AF7\u01B0/5#; peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + peg$maxFailExpected.push(expected1); + } + function peg$buildSimpleError(message, location1) { + return new SyntaxError(message, [], "", location1); + } + function peg$buildStructuredError(expected1, found, location1) { + return new SyntaxError(SyntaxError.buildMessage(expected1, found), expected1, found, location1); + } + function peg$decode(s) { + return s.split("").map((ch) => ch.charCodeAt(0) - 32); + } + function peg$parseRule(index) { + const bc = peg$bytecode[index]; + let ip = 0; + const ips = []; + let end = bc.length; + const ends = []; + const stack = []; + let params; + while (true) { + while (ip < end) { + switch (bc[ip]) { + case 0: + stack.push(peg$consts[bc[ip + 1]]); + ip += 2; + break; + case 1: + stack.push(undefined); + ip++; + break; + case 2: + stack.push(null); + ip++; + break; + case 3: + stack.push(peg$FAILED); + ip++; + break; + case 4: + stack.push([]); + ip++; + break; + case 5: + stack.push(peg$currPos); + ip++; + break; + case 6: + stack.pop(); + ip++; + break; + case 7: + peg$currPos = stack.pop(); + ip++; + break; + case 8: + stack.length -= bc[ip + 1]; + ip += 2; + break; + case 9: + stack.splice(-2, 1); + ip++; + break; + case 10: + stack[stack.length - 2].push(stack.pop()); + ip++; + break; + case 11: + stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1])); + ip += 2; + break; + case 12: + stack.push(input.substring(stack.pop(), peg$currPos)); + ip++; + break; + case 13: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (stack[stack.length - 1]) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 14: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (stack[stack.length - 1] === peg$FAILED) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 15: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (stack[stack.length - 1] !== peg$FAILED) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 16: + if (stack[stack.length - 1] !== peg$FAILED) { + ends.push(end); + ips.push(ip); + end = ip + 2 + bc[ip + 1]; + ip += 2; + } + else { + ip += 2 + bc[ip + 1]; + } + break; + case 17: + ends.push(end); + ips.push(ip + 3 + bc[ip + 1] + bc[ip + 2]); + if (input.length > peg$currPos) { + end = ip + 3 + bc[ip + 1]; + ip += 3; + } + else { + end = ip + 3 + bc[ip + 1] + bc[ip + 2]; + ip += 3 + bc[ip + 1]; + } + break; + case 18: + ends.push(end); + ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); + if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]) { + end = ip + 4 + bc[ip + 2]; + ip += 4; + } + else { + end = ip + 4 + bc[ip + 2] + bc[ip + 3]; + ip += 4 + bc[ip + 2]; + } + break; + case 19: + ends.push(end); + ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); + if (input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]) { + end = ip + 4 + bc[ip + 2]; + ip += 4; + } + else { + end = ip + 4 + bc[ip + 2] + bc[ip + 3]; + ip += 4 + bc[ip + 2]; + } + break; + case 20: + ends.push(end); + ips.push(ip + 4 + bc[ip + 2] + bc[ip + 3]); + if (peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))) { + end = ip + 4 + bc[ip + 2]; + ip += 4; + } + else { + end = ip + 4 + bc[ip + 2] + bc[ip + 3]; + ip += 4 + bc[ip + 2]; + } + break; + case 21: + stack.push(input.substr(peg$currPos, bc[ip + 1])); + peg$currPos += bc[ip + 1]; + ip += 2; + break; + case 22: + stack.push(peg$consts[bc[ip + 1]]); + peg$currPos += peg$consts[bc[ip + 1]].length; + ip += 2; + break; + case 23: + stack.push(peg$FAILED); + if (peg$silentFails === 0) { + peg$fail(peg$consts[bc[ip + 1]]); + } + ip += 2; + break; + case 24: + peg$savedPos = stack[stack.length - 1 - bc[ip + 1]]; + ip += 2; + break; + case 25: + peg$savedPos = peg$currPos; + ip++; + break; + case 26: + params = bc.slice(ip + 4, ip + 4 + bc[ip + 3]) + .map(function (p) { return stack[stack.length - 1 - p]; }); + stack.splice(stack.length - bc[ip + 2], bc[ip + 2], peg$consts[bc[ip + 1]].apply(null, params)); + ip += 4 + bc[ip + 3]; + break; + case 27: + stack.push(peg$parseRule(bc[ip + 1])); + ip += 2; + break; + case 28: + peg$silentFails++; + ip++; + break; + case 29: + peg$silentFails--; + ip++; + break; + default: + throw new Error("Invalid opcode: " + bc[ip] + "."); + } + } + if (ends.length > 0) { + end = ends.pop(); + ip = ips.pop(); + } + else { + break; + } + } + return stack[0]; + } + options.data = {}; // Object to which header attributes will be assigned during parsing + function list(head, tail) { + return [head].concat(tail); + } + peg$result = peg$parseRule(peg$startRuleIndex); + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } + else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } + throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)); + } +} +const parse = peg$parse; + + +/***/ }), +/* 23 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "URI": () => (/* binding */ URI), +/* harmony export */ "equivalentURI": () => (/* binding */ equivalentURI) +/* harmony export */ }); +/* harmony import */ var _parameters__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24); +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/** + * URI. + * @public + */ +class URI extends _parameters__WEBPACK_IMPORTED_MODULE_0__.Parameters { + /** + * Constructor + * @param scheme - + * @param user - + * @param host - + * @param port - + * @param parameters - + * @param headers - + */ + constructor(scheme = "sip", user, host, port, parameters, headers) { + super(parameters || {}); + this.headers = {}; + // Checks + if (!host) { + throw new TypeError('missing or invalid "host" parameter'); + } + for (const header in headers) { + // eslint-disable-next-line no-prototype-builtins + if (headers.hasOwnProperty(header)) { + this.setHeader(header, headers[header]); + } + } + // Raw URI + this.raw = { + scheme, + user, + host, + port + }; + // Normalized URI + this.normal = { + scheme: scheme.toLowerCase(), + user, + host: host.toLowerCase(), + port + }; + } + get scheme() { return this.normal.scheme; } + set scheme(value) { + this.raw.scheme = value; + this.normal.scheme = value.toLowerCase(); + } + get user() { return this.normal.user; } + set user(value) { + this.normal.user = this.raw.user = value; + } + get host() { return this.normal.host; } + set host(value) { + this.raw.host = value; + this.normal.host = value.toLowerCase(); + } + get aor() { return this.normal.user + "@" + this.normal.host; } + get port() { return this.normal.port; } + set port(value) { + this.normal.port = this.raw.port = value === 0 ? value : value; + } + setHeader(name, value) { + this.headers[this.headerize(name)] = (value instanceof Array) ? value : [value]; + } + getHeader(name) { + if (name) { + return this.headers[this.headerize(name)]; + } + } + hasHeader(name) { + // eslint-disable-next-line no-prototype-builtins + return !!name && !!this.headers.hasOwnProperty(this.headerize(name)); + } + deleteHeader(header) { + header = this.headerize(header); + // eslint-disable-next-line no-prototype-builtins + if (this.headers.hasOwnProperty(header)) { + const value = this.headers[header]; + delete this.headers[header]; + return value; + } + } + clearHeaders() { + this.headers = {}; + } + clone() { + return new URI(this._raw.scheme, this._raw.user || "", this._raw.host, this._raw.port, JSON.parse(JSON.stringify(this.parameters)), JSON.parse(JSON.stringify(this.headers))); + } + toRaw() { + return this._toString(this._raw); + } + toString() { + return this._toString(this._normal); + } + get _normal() { return this.normal; } + get _raw() { return this.raw; } + _toString(uri) { + let uriString = uri.scheme + ":"; + // add slashes if it's not a sip(s) URI + if (!uri.scheme.toLowerCase().match("^sips?$")) { + uriString += "//"; + } + if (uri.user) { + uriString += this.escapeUser(uri.user) + "@"; + } + uriString += uri.host; + if (uri.port || uri.port === 0) { + uriString += ":" + uri.port; + } + for (const parameter in this.parameters) { + // eslint-disable-next-line no-prototype-builtins + if (this.parameters.hasOwnProperty(parameter)) { + uriString += ";" + parameter; + if (this.parameters[parameter] !== null) { + uriString += "=" + this.parameters[parameter]; + } + } + } + const headers = []; + for (const header in this.headers) { + // eslint-disable-next-line no-prototype-builtins + if (this.headers.hasOwnProperty(header)) { + // eslint-disable-next-line @typescript-eslint/no-for-in-array + for (const idx in this.headers[header]) { + // eslint-disable-next-line no-prototype-builtins + if (this.headers[header].hasOwnProperty(idx)) { + headers.push(header + "=" + this.headers[header][idx]); + } + } + } + } + if (headers.length > 0) { + uriString += "?" + headers.join("&"); + } + return uriString; + } + /* + * Hex-escape a SIP URI user. + * @private + * @param {String} user + */ + escapeUser(user) { + let decodedUser; + // FIXME: This is called by toString above which should never throw, but + // decodeURIComponent can throw and I've seen one case in production where + // it did throw resulting in a cascading failure. This class should be + // fixed so that decodeURIComponent is not called at this point (in toString). + // The user should be decoded when the URI is constructor or some other + // place where we can catch the error before the URI is created or somesuch. + // eslint-disable-next-line no-useless-catch + try { + decodedUser = decodeURIComponent(user); + } + catch (error) { + throw error; + } + // Don't hex-escape ':' (%3A), '+' (%2B), '?' (%3F"), '/' (%2F). + return encodeURIComponent(decodedUser) + .replace(/%3A/ig, ":") + .replace(/%2B/ig, "+") + .replace(/%3F/ig, "?") + .replace(/%2F/ig, "/"); + } + headerize(str) { + const exceptions = { + "Call-Id": "Call-ID", + "Cseq": "CSeq", + "Min-Se": "Min-SE", + "Rack": "RAck", + "Rseq": "RSeq", + "Www-Authenticate": "WWW-Authenticate", + }; + const name = str.toLowerCase().replace(/_/g, "-").split("-"); + const parts = name.length; + let hname = ""; + for (let part = 0; part < parts; part++) { + if (part !== 0) { + hname += "-"; + } + hname += name[part].charAt(0).toUpperCase() + name[part].substring(1); + } + if (exceptions[hname]) { + hname = exceptions[hname]; + } + return hname; + } +} +/** + * Returns true if URIs are equivalent per RFC 3261 Section 19.1.4. + * @param a URI to compare + * @param b URI to compare + * + * @remarks + * 19.1.4 URI Comparison + * Some operations in this specification require determining whether two + * SIP or SIPS URIs are equivalent. + * + * https://tools.ietf.org/html/rfc3261#section-19.1.4 + * @internal + */ +function equivalentURI(a, b) { + // o A SIP and SIPS URI are never equivalent. + if (a.scheme !== b.scheme) { + return false; + } + // o Comparison of the userinfo of SIP and SIPS URIs is case- + // sensitive. This includes userinfo containing passwords or + // formatted as telephone-subscribers. Comparison of all other + // components of the URI is case-insensitive unless explicitly + // defined otherwise. + // + // o The ordering of parameters and header fields is not significant + // in comparing SIP and SIPS URIs. + // + // o Characters other than those in the "reserved" set (see RFC 2396 + // [5]) are equivalent to their ""%" HEX HEX" encoding. + // + // o An IP address that is the result of a DNS lookup of a host name + // does not match that host name. + // + // o For two URIs to be equal, the user, password, host, and port + // components must match. + // + // A URI omitting the user component will not match a URI that + // includes one. A URI omitting the password component will not + // match a URI that includes one. + // + // A URI omitting any component with a default value will not + // match a URI explicitly containing that component with its + // default value. For instance, a URI omitting the optional port + // component will not match a URI explicitly declaring port 5060. + // The same is true for the transport-parameter, ttl-parameter, + // user-parameter, and method components. + // + // Defining sip:user@host to not be equivalent to + // sip:user@host:5060 is a change from RFC 2543. When deriving + // addresses from URIs, equivalent addresses are expected from + // equivalent URIs. The URI sip:user@host:5060 will always + // resolve to port 5060. The URI sip:user@host may resolve to + // other ports through the DNS SRV mechanisms detailed in [4]. + // FIXME: TODO: + // - character compared to hex encoding is not handled + // - password does not exist on URI currently + if (a.user !== b.user || a.host !== b.host || a.port !== b.port) { + return false; + } + // o URI uri-parameter components are compared as follows: + function compareParameters(a, b) { + // - Any uri-parameter appearing in both URIs must match. + const parameterKeysA = Object.keys(a.parameters); + const parameterKeysB = Object.keys(b.parameters); + const intersection = parameterKeysA.filter(x => parameterKeysB.includes(x)); + if (!intersection.every(key => a.parameters[key] === b.parameters[key])) { + return false; + } + // - A user, ttl, or method uri-parameter appearing in only one + // URI never matches, even if it contains the default value. + if (!["user", "ttl", "method", "transport"].every(key => a.hasParam(key) && b.hasParam(key) || !a.hasParam(key) && !b.hasParam(key))) { + return false; + } + // - A URI that includes an maddr parameter will not match a URI + // that contains no maddr parameter. + if (!["maddr"].every(key => a.hasParam(key) && b.hasParam(key) || !a.hasParam(key) && !b.hasParam(key))) { + return false; + } + // - All other uri-parameters appearing in only one URI are + // ignored when comparing the URIs. + return true; + } + if (!compareParameters(a, b)) { + return false; + } + // o URI header components are never ignored. Any present header + // component MUST be present in both URIs and match for the URIs + // to match. The matching rules are defined for each header field + // in Section 20. + const headerKeysA = Object.keys(a.headers); + const headerKeysB = Object.keys(b.headers); + // No need to check if no headers + if (headerKeysA.length !== 0 || headerKeysB.length !== 0) { + // Must have same number of headers + if (headerKeysA.length !== headerKeysB.length) { + return false; + } + // Must have same headers + const intersection = headerKeysA.filter(x => headerKeysB.includes(x)); + if (intersection.length !== headerKeysB.length) { + return false; + } + // FIXME: Not to spec. But perhaps not worth fixing? + // Must have same header values + // It seems too much to consider multiple headers with same name. + // It seems too much to compare two header params according to the rule of each header. + // We'll assume a single header and compare them string to string... + if (!intersection.every(key => a.headers[key].length && b.headers[key].length && a.headers[key][0] === b.headers[key][0])) { + return false; + } + } + return true; +} + + +/***/ }), +/* 24 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Parameters": () => (/* binding */ Parameters) +/* harmony export */ }); +/** + * @internal + */ +class Parameters { + constructor(parameters) { + this.parameters = {}; + // for in is required here as the Grammar parser is adding to the prototype chain + for (const param in parameters) { + // eslint-disable-next-line no-prototype-builtins + if (parameters.hasOwnProperty(param)) { + this.setParam(param, parameters[param]); + } + } + } + setParam(key, value) { + if (key) { + this.parameters[key.toLowerCase()] = (typeof value === "undefined" || value === null) ? null : value.toString(); + } + } + getParam(key) { + if (key) { + return this.parameters[key.toLowerCase()]; + } + } + hasParam(key) { + return !!(key && this.parameters[key.toLowerCase()] !== undefined); + } + deleteParam(key) { + key = key.toLowerCase(); + if (this.hasParam(key)) { + const value = this.parameters[key]; + delete this.parameters[key]; + return value; + } + } + clearParams() { + this.parameters = {}; + } +} + + +/***/ }), +/* 25 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NameAddrHeader": () => (/* binding */ NameAddrHeader) +/* harmony export */ }); +/* harmony import */ var _parameters__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(24); + +/** + * Name Address SIP header. + * @public + */ +class NameAddrHeader extends _parameters__WEBPACK_IMPORTED_MODULE_0__.Parameters { + /** + * Constructor + * @param uri - + * @param displayName - + * @param parameters - + */ + constructor(uri, displayName, parameters) { + super(parameters); + this.uri = uri; + this._displayName = displayName; + } + get friendlyName() { + return this.displayName || this.uri.aor; + } + get displayName() { return this._displayName; } + set displayName(value) { + this._displayName = value; + } + clone() { + return new NameAddrHeader(this.uri.clone(), this._displayName, JSON.parse(JSON.stringify(this.parameters))); + } + toString() { + let body = (this.displayName || this.displayName === "0") ? '"' + this.displayName + '" ' : ""; + body += "<" + this.uri.toString() + ">"; + for (const parameter in this.parameters) { + // eslint-disable-next-line no-prototype-builtins + if (this.parameters.hasOwnProperty(parameter)) { + body += ";" + parameter; + if (this.parameters[parameter] !== null) { + body += "=" + this.parameters[parameter]; + } + } + } + return body; + } +} + + +/***/ }), +/* 26 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "IncomingResponseMessage": () => (/* binding */ IncomingResponseMessage) +/* harmony export */ }); +/* harmony import */ var _incoming_message__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(19); + +/** + * Incoming response message. + * @public + */ +class IncomingResponseMessage extends _incoming_message__WEBPACK_IMPORTED_MODULE_0__.IncomingMessage { + constructor() { + super(); + } +} + + +/***/ }), +/* 27 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "OutgoingRequestMessage": () => (/* binding */ OutgoingRequestMessage) +/* harmony export */ }); +/* harmony import */ var _grammar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); + + +/** + * Outgoing SIP request message. + * @public + */ +class OutgoingRequestMessage { + constructor(method, ruri, fromURI, toURI, options, extraHeaders, body) { + this.headers = {}; + this.extraHeaders = []; + // Initialize default options + this.options = OutgoingRequestMessage.getDefaultOptions(); + // Options - merge a deep copy + if (options) { + this.options = Object.assign(Object.assign({}, this.options), options); + if (this.options.optionTags && this.options.optionTags.length) { + this.options.optionTags = this.options.optionTags.slice(); + } + if (this.options.routeSet && this.options.routeSet.length) { + this.options.routeSet = this.options.routeSet.slice(); + } + } + // Extra headers - deep copy + if (extraHeaders && extraHeaders.length) { + this.extraHeaders = extraHeaders.slice(); + } + // Body - deep copy + if (body) { + // TODO: internal representation should be Body + // this.body = { ...body }; + this.body = { + body: body.content, + contentType: body.contentType + }; + } + // Method + this.method = method; + // RURI + this.ruri = ruri.clone(); + // From + this.fromURI = fromURI.clone(); + this.fromTag = this.options.fromTag ? this.options.fromTag : (0,_utils__WEBPACK_IMPORTED_MODULE_0__.newTag)(); + this.from = OutgoingRequestMessage.makeNameAddrHeader(this.fromURI, this.options.fromDisplayName, this.fromTag); + // To + this.toURI = toURI.clone(); + this.toTag = this.options.toTag; + this.to = OutgoingRequestMessage.makeNameAddrHeader(this.toURI, this.options.toDisplayName, this.toTag); + // Call-ID + this.callId = this.options.callId ? this.options.callId : this.options.callIdPrefix + (0,_utils__WEBPACK_IMPORTED_MODULE_0__.createRandomToken)(15); + // CSeq + this.cseq = this.options.cseq; + // The relative order of header fields with different field names is not + // significant. However, it is RECOMMENDED that header fields which are + // needed for proxy processing (Via, Route, Record-Route, Proxy-Require, + // Max-Forwards, and Proxy-Authorization, for example) appear towards + // the top of the message to facilitate rapid parsing. + // https://tools.ietf.org/html/rfc3261#section-7.3.1 + this.setHeader("route", this.options.routeSet); + this.setHeader("via", ""); + this.setHeader("to", this.to.toString()); + this.setHeader("from", this.from.toString()); + this.setHeader("cseq", this.cseq + " " + this.method); + this.setHeader("call-id", this.callId); + this.setHeader("max-forwards", "70"); + } + /** Get a copy of the default options. */ + static getDefaultOptions() { + return { + callId: "", + callIdPrefix: "", + cseq: 1, + toDisplayName: "", + toTag: "", + fromDisplayName: "", + fromTag: "", + forceRport: false, + hackViaTcp: false, + optionTags: ["outbound"], + routeSet: [], + userAgentString: "sip.js", + viaHost: "" + }; + } + static makeNameAddrHeader(uri, displayName, tag) { + const parameters = {}; + if (tag) { + parameters.tag = tag; + } + return new _grammar__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader(uri, displayName, parameters); + } + /** + * Get the value of the given header name at the given position. + * @param name - header name + * @returns Returns the specified header, undefined if header doesn't exist. + */ + getHeader(name) { + const header = this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)]; + if (header) { + if (header[0]) { + return header[0]; + } + } + else { + const regexp = new RegExp("^\\s*" + name + "\\s*:", "i"); + for (const exHeader of this.extraHeaders) { + if (regexp.test(exHeader)) { + return exHeader.substring(exHeader.indexOf(":") + 1).trim(); + } + } + } + return; + } + /** + * Get the header/s of the given name. + * @param name - header name + * @returns Array with all the headers of the specified name. + */ + getHeaders(name) { + const result = []; + const headerArray = this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)]; + if (headerArray) { + for (const headerPart of headerArray) { + result.push(headerPart); + } + } + else { + const regexp = new RegExp("^\\s*" + name + "\\s*:", "i"); + for (const exHeader of this.extraHeaders) { + if (regexp.test(exHeader)) { + result.push(exHeader.substring(exHeader.indexOf(":") + 1).trim()); + } + } + } + return result; + } + /** + * Verify the existence of the given header. + * @param name - header name + * @returns true if header with given name exists, false otherwise + */ + hasHeader(name) { + if (this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)]) { + return true; + } + else { + const regexp = new RegExp("^\\s*" + name + "\\s*:", "i"); + for (const extraHeader of this.extraHeaders) { + if (regexp.test(extraHeader)) { + return true; + } + } + } + return false; + } + /** + * Replace the the given header by the given value. + * @param name - header name + * @param value - header value + */ + setHeader(name, value) { + this.headers[(0,_utils__WEBPACK_IMPORTED_MODULE_0__.headerize)(name)] = value instanceof Array ? value : [value]; + } + /** + * The Via header field indicates the transport used for the transaction + * and identifies the location where the response is to be sent. A Via + * header field value is added only after the transport that will be + * used to reach the next hop has been selected (which may involve the + * usage of the procedures in [4]). + * + * When the UAC creates a request, it MUST insert a Via into that + * request. The protocol name and protocol version in the header field + * MUST be SIP and 2.0, respectively. The Via header field value MUST + * contain a branch parameter. This parameter is used to identify the + * transaction created by that request. This parameter is used by both + * the client and the server. + * https://tools.ietf.org/html/rfc3261#section-8.1.1.7 + * @param branchParameter - The branch parameter. + * @param transport - The sent protocol transport. + */ + setViaHeader(branch, transport) { + // FIXME: Hack + if (this.options.hackViaTcp) { + transport = "TCP"; + } + let via = "SIP/2.0/" + transport; + via += " " + this.options.viaHost + ";branch=" + branch; + if (this.options.forceRport) { + via += ";rport"; + } + this.setHeader("via", via); + this.branch = branch; + } + toString() { + let msg = ""; + msg += this.method + " " + this.ruri.toRaw() + " SIP/2.0\r\n"; + for (const header in this.headers) { + if (this.headers[header]) { + for (const headerPart of this.headers[header]) { + msg += header + ": " + headerPart + "\r\n"; + } + } + } + for (const header of this.extraHeaders) { + msg += header.trim() + "\r\n"; + } + msg += "Supported: " + this.options.optionTags.join(", ") + "\r\n"; + msg += "User-Agent: " + this.options.userAgentString + "\r\n"; + if (this.body) { + if (typeof this.body === "string") { + msg += "Content-Length: " + (0,_utils__WEBPACK_IMPORTED_MODULE_0__.utf8Length)(this.body) + "\r\n\r\n"; + msg += this.body; + } + else { + if (this.body.body && this.body.contentType) { + msg += "Content-Type: " + this.body.contentType + "\r\n"; + msg += "Content-Length: " + (0,_utils__WEBPACK_IMPORTED_MODULE_0__.utf8Length)(this.body.body) + "\r\n\r\n"; + msg += this.body.body; + } + else { + msg += "Content-Length: " + 0 + "\r\n\r\n"; + } + } + } + else { + msg += "Content-Length: " + 0 + "\r\n\r\n"; + } + return msg; + } +} + + +/***/ }), +/* 28 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "AllowedMethods": () => (/* binding */ AllowedMethods) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(29); + +/** + * FIXME: TODO: Should be configurable/variable. + */ +const AllowedMethods = [ + _messages__WEBPACK_IMPORTED_MODULE_0__.C.ACK, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.BYE, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.CANCEL, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.INFO, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.INVITE, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.MESSAGE, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.NOTIFY, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.OPTIONS, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.PRACK, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.REFER, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.REGISTER, + _messages__WEBPACK_IMPORTED_MODULE_0__.C.SUBSCRIBE +]; + + +/***/ }), +/* 29 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "C": () => (/* binding */ C) +/* harmony export */ }); +/* eslint-disable @typescript-eslint/no-namespace */ +/** + * SIP Methods + * @internal + */ +var C; +(function (C) { + C.ACK = "ACK"; + C.BYE = "BYE"; + C.CANCEL = "CANCEL"; + C.INFO = "INFO"; + C.INVITE = "INVITE"; + C.MESSAGE = "MESSAGE"; + C.NOTIFY = "NOTIFY"; + C.OPTIONS = "OPTIONS"; + C.REGISTER = "REGISTER"; + C.UPDATE = "UPDATE"; + C.SUBSCRIBE = "SUBSCRIBE"; + C.PUBLISH = "PUBLISH"; + C.REFER = "REFER"; + C.PRACK = "PRACK"; +})(C || (C = {})); + + +/***/ }), +/* 30 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionState": () => (/* binding */ SessionState), +/* harmony export */ "SignalingState": () => (/* binding */ SignalingState) +/* harmony export */ }); +/** + * Session state. + * @remarks + * https://tools.ietf.org/html/rfc3261#section-13 + * @public + */ +var SessionState; +(function (SessionState) { + SessionState["Initial"] = "Initial"; + SessionState["Early"] = "Early"; + SessionState["AckWait"] = "AckWait"; + SessionState["Confirmed"] = "Confirmed"; + SessionState["Terminated"] = "Terminated"; +})(SessionState || (SessionState = {})); +/** + * Offer/Answer state. + * @remarks + * ```txt + * Offer Answer RFC Ini Est Early + * ------------------------------------------------------------------- + * 1. INVITE Req. 2xx INVITE Resp. RFC 3261 Y Y N + * 2. 2xx INVITE Resp. ACK Req. RFC 3261 Y Y N + * 3. INVITE Req. 1xx-rel INVITE Resp. RFC 3262 Y Y N + * 4. 1xx-rel INVITE Resp. PRACK Req. RFC 3262 Y Y N + * 5. PRACK Req. 200 PRACK Resp. RFC 3262 N Y Y + * 6. UPDATE Req. 2xx UPDATE Resp. RFC 3311 N Y Y + * + * Table 1: Summary of SIP Usage of the Offer/Answer Model + * ``` + * https://tools.ietf.org/html/rfc6337#section-2.2 + * @public + */ +var SignalingState; +(function (SignalingState) { + SignalingState["Initial"] = "Initial"; + SignalingState["HaveLocalOffer"] = "HaveLocalOffer"; + SignalingState["HaveRemoteOffer"] = "HaveRemoteOffer"; + SignalingState["Stable"] = "Stable"; + SignalingState["Closed"] = "Closed"; +})(SignalingState || (SignalingState = {})); + + +/***/ }), +/* 31 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Message": () => (/* binding */ Message) +/* harmony export */ }); +/** + * A received message (incoming MESSAGE). + * @public + */ +class Message { + /** @internal */ + constructor(incomingMessageRequest) { + this.incomingMessageRequest = incomingMessageRequest; + } + /** Incoming MESSAGE request message. */ + get request() { + return this.incomingMessageRequest.message; + } + /** Accept the request. */ + accept(options) { + this.incomingMessageRequest.accept(options); + return Promise.resolve(); + } + /** Reject the request. */ + reject(options) { + this.incomingMessageRequest.reject(options); + return Promise.resolve(); + } +} + + +/***/ }), +/* 32 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Notification": () => (/* binding */ Notification) +/* harmony export */ }); +/** + * A notification of an event (incoming NOTIFY). + * @public + */ +class Notification { + /** @internal */ + constructor(incomingNotifyRequest) { + this.incomingNotifyRequest = incomingNotifyRequest; + } + /** Incoming NOTIFY request message. */ + get request() { + return this.incomingNotifyRequest.message; + } + /** Accept the request. */ + accept(options) { + this.incomingNotifyRequest.accept(options); + return Promise.resolve(); + } + /** Reject the request. */ + reject(options) { + this.incomingNotifyRequest.reject(options); + return Promise.resolve(); + } +} + + +/***/ }), +/* 33 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Referral": () => (/* binding */ Referral) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25); + +/** + * A request to establish a {@link Session} elsewhere (incoming REFER). + * @public + */ +class Referral { + /** @internal */ + constructor(incomingReferRequest, session) { + this.incomingReferRequest = incomingReferRequest; + this.session = session; + } + get referTo() { + const referTo = this.incomingReferRequest.message.parseHeader("refer-to"); + if (!(referTo instanceof _core__WEBPACK_IMPORTED_MODULE_0__.NameAddrHeader)) { + throw new Error("Failed to parse Refer-To header."); + } + return referTo; + } + get referredBy() { + return this.incomingReferRequest.message.getHeader("referred-by"); + } + get replaces() { + const value = this.referTo.uri.getHeader("replaces"); + if (value instanceof Array) { + return value[0]; + } + return value; + } + /** Incoming REFER request message. */ + get request() { + return this.incomingReferRequest.message; + } + /** Accept the request. */ + accept(options = { statusCode: 202 }) { + this.incomingReferRequest.accept(options); + return Promise.resolve(); + } + /** Reject the request. */ + reject(options) { + this.incomingReferRequest.reject(options); + return Promise.resolve(); + } + /** + * Creates an inviter which may be used to send an out of dialog INVITE request. + * + * @remarks + * This a helper method to create an Inviter which will execute the referral + * of the `Session` which was referred. The appropriate headers are set and + * the referred `Session` is linked to the new `Session`. Note that only a + * single instance of the `Inviter` will be created and returned (if called + * more than once a reference to the same `Inviter` will be returned every time). + * + * @param options - Options bucket. + * @param modifiers - Session description handler modifiers. + */ + makeInviter(options) { + if (this.inviter) { + return this.inviter; + } + const targetURI = this.referTo.uri.clone(); + targetURI.clearHeaders(); + options = options || {}; + const extraHeaders = (options.extraHeaders || []).slice(); + const replaces = this.replaces; + if (replaces) { + // decodeURIComponent is a holdover from 2c086eb4. Not sure that it is actually necessary + extraHeaders.push("Replaces: " + decodeURIComponent(replaces)); + } + const referredBy = this.referredBy; + if (referredBy) { + extraHeaders.push("Referred-By: " + referredBy); + } + options.extraHeaders = extraHeaders; + this.inviter = this.session.userAgent._makeInviter(targetURI, options); + this.inviter._referred = this.session; + this.session._referral = this.inviter; + return this.inviter; + } +} + + +/***/ }), +/* 34 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SIPExtension": () => (/* binding */ SIPExtension), +/* harmony export */ "UserAgentRegisteredOptionTags": () => (/* binding */ UserAgentRegisteredOptionTags) +/* harmony export */ }); +/** + * SIP extension support level. + * @public + */ +var SIPExtension; +(function (SIPExtension) { + SIPExtension["Required"] = "Required"; + SIPExtension["Supported"] = "Supported"; + SIPExtension["Unsupported"] = "Unsupported"; +})(SIPExtension || (SIPExtension = {})); +/** + * SIP Option Tags + * @remarks + * http://www.iana.org/assignments/sip-parameters/sip-parameters.xhtml#sip-parameters-4 + * @public + */ +const UserAgentRegisteredOptionTags = { + "100rel": true, + "199": true, + answermode: true, + "early-session": true, + eventlist: true, + explicitsub: true, + "from-change": true, + "geolocation-http": true, + "geolocation-sip": true, + gin: true, + gruu: true, + histinfo: true, + ice: true, + join: true, + "multiple-refer": true, + norefersub: true, + nosub: true, + outbound: true, + path: true, + policy: true, + precondition: true, + pref: true, + privacy: true, + "recipient-list-invite": true, + "recipient-list-message": true, + "recipient-list-subscribe": true, + replaces: true, + "resource-priority": true, + "sdp-anat": true, + "sec-agree": true, + tdialog: true, + timer: true, + uui: true // RFC 7433 +}; + + +/***/ }), +/* 35 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TransactionStateError": () => (/* binding */ TransactionStateError) +/* harmony export */ }); +/* harmony import */ var _exception__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * Indicates that the operation could not be completed given the current transaction state. + * @public + */ +class TransactionStateError extends _exception__WEBPACK_IMPORTED_MODULE_0__.Exception { + constructor(message) { + super(message ? message : "Transaction state error."); + } +} + + +/***/ }), +/* 36 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Timers": () => (/* binding */ Timers) +/* harmony export */ }); +const T1 = 500; +const T2 = 4000; +const T4 = 5000; +/** + * Timers. + * @public + */ +const Timers = { + T1, + T2, + T4, + TIMER_B: 64 * T1, + TIMER_D: 0 * T1, + TIMER_F: 64 * T1, + TIMER_H: 64 * T1, + TIMER_I: 0 * T4, + TIMER_J: 0 * T1, + TIMER_K: 0 * T4, + TIMER_L: 64 * T1, + TIMER_M: 64 * T1, + TIMER_N: 64 * T1, + PROVISIONAL_RESPONSE_INTERVAL: 60000 // See RFC 3261 Section 13.3.1.1 +}; + + +/***/ }), +/* 37 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Inviter": () => (/* binding */ Inviter) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(21); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(30); +/* harmony import */ var _core_messages_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15); +/* harmony import */ var _session_state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(16); +/* harmony import */ var _user_agent_options__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(34); + + + + + +/** + * An inviter offers to establish a {@link Session} (outgoing INVITE). + * @public + */ +class Inviter extends _session__WEBPACK_IMPORTED_MODULE_0__.Session { + /** + * Constructs a new instance of the `Inviter` class. + * @param userAgent - User agent. See {@link UserAgent} for details. + * @param targetURI - Request URI identifying the target of the message. + * @param options - Options bucket. See {@link InviterOptions} for details. + */ + constructor(userAgent, targetURI, options = {}) { + super(userAgent, options); + /** True if dispose() has been called. */ + this.disposed = false; + /** True if early media use is enabled. */ + this.earlyMedia = false; + /** The early media session description handlers. */ + this.earlyMediaSessionDescriptionHandlers = new Map(); + /** True if cancel() was called. */ + this.isCanceled = false; + /** True if initial INVITE without SDP. */ + this.inviteWithoutSdp = false; + this.logger = userAgent.getLogger("sip.Inviter"); + // Early media + this.earlyMedia = options.earlyMedia !== undefined ? options.earlyMedia : this.earlyMedia; + // From tag + this.fromTag = (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_1__.newTag)(); + // Invite without SDP + this.inviteWithoutSdp = options.inviteWithoutSdp !== undefined ? options.inviteWithoutSdp : this.inviteWithoutSdp; + // Inviter options (could do better copying these options) + const inviterOptions = Object.assign({}, options); + inviterOptions.params = Object.assign({}, options.params); + // Anonymous call + const anonymous = options.anonymous || false; + // Contact + const contact = userAgent.contact.toString({ + anonymous, + // Do not add ;ob in initial forming dialog requests if the + // registration over the current connection got a GRUU URI. + outbound: anonymous ? !userAgent.contact.tempGruu : !userAgent.contact.pubGruu + }); + // FIXME: TODO: We should not be parsing URIs here as if it fails we have to throw an exception + // which is not something we want our constructor to do. URIs should be passed in as params. + // URIs + if (anonymous && userAgent.configuration.uri) { + inviterOptions.params.fromDisplayName = "Anonymous"; + inviterOptions.params.fromUri = "sip:anonymous@anonymous.invalid"; + } + let fromURI = userAgent.userAgentCore.configuration.aor; + if (inviterOptions.params.fromUri) { + fromURI = + typeof inviterOptions.params.fromUri === "string" + ? _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.URIParse(inviterOptions.params.fromUri) + : inviterOptions.params.fromUri; + } + if (!fromURI) { + throw new TypeError("Invalid from URI: " + inviterOptions.params.fromUri); + } + let toURI = targetURI; + if (inviterOptions.params.toUri) { + toURI = + typeof inviterOptions.params.toUri === "string" + ? _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.URIParse(inviterOptions.params.toUri) + : inviterOptions.params.toUri; + } + if (!toURI) { + throw new TypeError("Invalid to URI: " + inviterOptions.params.toUri); + } + // Params + const messageOptions = Object.assign({}, inviterOptions.params); + messageOptions.fromTag = this.fromTag; + // Extra headers + const extraHeaders = (inviterOptions.extraHeaders || []).slice(); + if (anonymous && userAgent.configuration.uri) { + extraHeaders.push("P-Preferred-Identity: " + userAgent.configuration.uri.toString()); + extraHeaders.push("Privacy: id"); + } + extraHeaders.push("Contact: " + contact); + extraHeaders.push("Allow: " + ["ACK", "CANCEL", "INVITE", "MESSAGE", "BYE", "OPTIONS", "INFO", "NOTIFY", "REFER"].toString()); + if (userAgent.configuration.sipExtension100rel === _user_agent_options__WEBPACK_IMPORTED_MODULE_3__.SIPExtension.Required) { + extraHeaders.push("Require: 100rel"); + } + if (userAgent.configuration.sipExtensionReplaces === _user_agent_options__WEBPACK_IMPORTED_MODULE_3__.SIPExtension.Required) { + extraHeaders.push("Require: replaces"); + } + inviterOptions.extraHeaders = extraHeaders; + // Body + const body = undefined; + // Make initial outgoing request message + this.outgoingRequestMessage = userAgent.userAgentCore.makeOutgoingRequestMessage(_core__WEBPACK_IMPORTED_MODULE_4__.C.INVITE, targetURI, fromURI, toURI, messageOptions, extraHeaders, body); + // Session parent properties + this._contact = contact; + this._referralInviterOptions = inviterOptions; + this._renderbody = options.renderbody; + this._rendertype = options.rendertype; + // Modifiers and options for initial INVITE transaction + if (options.sessionDescriptionHandlerModifiers) { + this.sessionDescriptionHandlerModifiers = options.sessionDescriptionHandlerModifiers; + } + if (options.sessionDescriptionHandlerOptions) { + this.sessionDescriptionHandlerOptions = options.sessionDescriptionHandlerOptions; + } + // Modifiers and options for re-INVITE transactions + if (options.sessionDescriptionHandlerModifiersReInvite) { + this.sessionDescriptionHandlerModifiersReInvite = options.sessionDescriptionHandlerModifiersReInvite; + } + if (options.sessionDescriptionHandlerOptionsReInvite) { + this.sessionDescriptionHandlerOptionsReInvite = options.sessionDescriptionHandlerOptionsReInvite; + } + // Identifier + this._id = this.outgoingRequestMessage.callId + this.fromTag; + // Add to the user agent's session collection. + this.userAgent._sessions[this._id] = this; + } + /** + * Destructor. + */ + dispose() { + // Only run through this once. It can and does get called multiple times + // depending on the what the sessions state is when first called. + // For example, if called when "establishing" it will be called again + // at least once when the session transitions to "terminated". + // Regardless, running through this more than once is pointless. + if (this.disposed) { + return Promise.resolve(); + } + this.disposed = true; + // Dispose of early dialog media + this.disposeEarlyMedia(); + // If the final response for the initial INVITE not yet been received, cancel it + switch (this.state) { + case _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Initial: + return this.cancel().then(() => super.dispose()); + case _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing: + return this.cancel().then(() => super.dispose()); + case _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Established: + return super.dispose(); + case _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminating: + return super.dispose(); + case _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated: + return super.dispose(); + default: + throw new Error("Unknown state."); + } + } + /** + * Initial outgoing INVITE request message body. + */ + get body() { + return this.outgoingRequestMessage.body; + } + /** + * The identity of the local user. + */ + get localIdentity() { + return this.outgoingRequestMessage.from; + } + /** + * The identity of the remote user. + */ + get remoteIdentity() { + return this.outgoingRequestMessage.to; + } + /** + * Initial outgoing INVITE request message. + */ + get request() { + return this.outgoingRequestMessage; + } + /** + * Cancels the INVITE request. + * + * @remarks + * Sends a CANCEL request. + * Resolves once the response sent, otherwise rejects. + * + * After sending a CANCEL request the expectation is that a 487 final response + * will be received for the INVITE. However a 200 final response to the INVITE + * may nonetheless arrive (it's a race between the CANCEL reaching the UAS before + * the UAS sends a 200) in which case an ACK & BYE will be sent. The net effect + * is that this method will terminate the session regardless of the race. + * @param options - Options bucket. + */ + cancel(options = {}) { + this.logger.log("Inviter.cancel"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Initial && this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing) { + const error = new Error(`Invalid session state ${this.state}`); + this.logger.error(error.message); + return Promise.reject(error); + } + // flag canceled + this.isCanceled = true; + // transition state + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminating); + // helper function + function getCancelReason(code, reason) { + if ((code && code < 200) || code > 699) { + throw new TypeError("Invalid statusCode: " + code); + } + else if (code) { + const cause = code; + const text = (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_1__.getReasonPhrase)(code) || reason; + return "SIP;cause=" + cause + ';text="' + text + '"'; + } + } + if (this.outgoingInviteRequest) { + // the CANCEL may not be respected by peer(s), so don't transition to terminated + let cancelReason; + if (options.statusCode && options.reasonPhrase) { + cancelReason = getCancelReason(options.statusCode, options.reasonPhrase); + } + this.outgoingInviteRequest.cancel(cancelReason, options); + } + else { + this.logger.warn("Canceled session before INVITE was sent"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + } + return Promise.resolve(); + } + /** + * Sends the INVITE request. + * + * @remarks + * TLDR... + * 1) Only one offer/answer exchange permitted during initial INVITE. + * 2) No "early media" if the initial offer is in an INVITE (default behavior). + * 3) If "early media" and the initial offer is in an INVITE, no INVITE forking. + * + * 1) Only one offer/answer exchange permitted during initial INVITE. + * + * Our implementation replaces the following bullet point... + * + * o After having sent or received an answer to the first offer, the + * UAC MAY generate subsequent offers in requests based on rules + * specified for that method, but only if it has received answers + * to any previous offers, and has not sent any offers to which it + * hasn't gotten an answer. + * https://tools.ietf.org/html/rfc3261#section-13.2.1 + * + * ...with... + * + * o After having sent or received an answer to the first offer, the + * UAC MUST NOT generate subsequent offers in requests based on rules + * specified for that method. + * + * ...which in combination with this bullet point... + * + * o Once the UAS has sent or received an answer to the initial + * offer, it MUST NOT generate subsequent offers in any responses + * to the initial INVITE. This means that a UAS based on this + * specification alone can never generate subsequent offers until + * completion of the initial transaction. + * https://tools.ietf.org/html/rfc3261#section-13.2.1 + * + * ...ensures that EXACTLY ONE offer/answer exchange will occur + * during an initial out of dialog INVITE request made by our UAC. + * + * + * 2) No "early media" if the initial offer is in an INVITE (default behavior). + * + * While our implementation adheres to the following bullet point... + * + * o If the initial offer is in an INVITE, the answer MUST be in a + * reliable non-failure message from UAS back to UAC which is + * correlated to that INVITE. For this specification, that is + * only the final 2xx response to that INVITE. That same exact + * answer MAY also be placed in any provisional responses sent + * prior to the answer. The UAC MUST treat the first session + * description it receives as the answer, and MUST ignore any + * session descriptions in subsequent responses to the initial + * INVITE. + * https://tools.ietf.org/html/rfc3261#section-13.2.1 + * + * We have made the following implementation decision with regard to early media... + * + * o If the initial offer is in the INVITE, the answer from the + * UAS back to the UAC will establish a media session only + * only after the final 2xx response to that INVITE is received. + * + * The reason for this decision is rooted in a restriction currently + * inherent in WebRTC. Specifically, while a SIP INVITE request with an + * initial offer may fork resulting in more than one provisional answer, + * there is currently no easy/good way to to "fork" an offer generated + * by a peer connection. In particular, a WebRTC offer currently may only + * be matched with one answer and we have no good way to know which + * "provisional answer" is going to be the "final answer". So we have + * decided to punt and not create any "early media" sessions in this case. + * + * The upshot is that if you want "early media", you must not put the + * initial offer in the INVITE. Instead, force the UAS to provide the + * initial offer by sending an INVITE without an offer. In the WebRTC + * case this allows us to create a unique peer connection with a unique + * answer for every provisional offer with "early media" on all of them. + * + * + * 3) If "early media" and the initial offer is in an INVITE, no INVITE forking. + * + * The default behavior may be altered and "early media" utilized if the + * initial offer is in the an INVITE by setting the `earlyMedia` options. + * However in that case the INVITE request MUST NOT fork. This allows for + * "early media" in environments where the forking behavior of the SIP + * servers being utilized is configured to disallow forking. + */ + invite(options = {}) { + this.logger.log("Inviter.invite"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Initial) { + // re-invite + return super.invite(options); + } + // Modifiers and options for initial INVITE transaction + if (options.sessionDescriptionHandlerModifiers) { + this.sessionDescriptionHandlerModifiers = options.sessionDescriptionHandlerModifiers; + } + if (options.sessionDescriptionHandlerOptions) { + this.sessionDescriptionHandlerOptions = options.sessionDescriptionHandlerOptions; + } + // just send an INVITE with no sdp... + if (options.withoutSdp || this.inviteWithoutSdp) { + if (this._renderbody && this._rendertype) { + this.outgoingRequestMessage.body = { contentType: this._rendertype, body: this._renderbody }; + } + // transition state + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing); + return Promise.resolve(this.sendInvite(options)); + } + // get an offer and send it in an INVITE + const offerOptions = { + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers, + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions + }; + return this.getOffer(offerOptions) + .then((body) => { + this.outgoingRequestMessage.body = { body: body.content, contentType: body.contentType }; + // transition state + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing); + return this.sendInvite(options); + }) + .catch((error) => { + this.logger.log(error.message); + // apply fix from https://github.com/onsip/SIP.js/commit/f06939c119149a3e00ad8acf69f37360d3331a62 + // It's possible we are already terminated, + // so don't throw trying to transition again. + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated) { + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + } + throw error; + }); + } + /** + * 13.2.1 Creating the Initial INVITE + * + * Since the initial INVITE represents a request outside of a dialog, + * its construction follows the procedures of Section 8.1.1. Additional + * processing is required for the specific case of INVITE. + * + * An Allow header field (Section 20.5) SHOULD be present in the INVITE. + * It indicates what methods can be invoked within a dialog, on the UA + * sending the INVITE, for the duration of the dialog. For example, a + * UA capable of receiving INFO requests within a dialog [34] SHOULD + * include an Allow header field listing the INFO method. + * + * A Supported header field (Section 20.37) SHOULD be present in the + * INVITE. It enumerates all the extensions understood by the UAC. + * + * An Accept (Section 20.1) header field MAY be present in the INVITE. + * It indicates which Content-Types are acceptable to the UA, in both + * the response received by it, and in any subsequent requests sent to + * it within dialogs established by the INVITE. The Accept header field + * is especially useful for indicating support of various session + * description formats. + * + * The UAC MAY add an Expires header field (Section 20.19) to limit the + * validity of the invitation. If the time indicated in the Expires + * header field is reached and no final answer for the INVITE has been + * received, the UAC core SHOULD generate a CANCEL request for the + * INVITE, as per Section 9. + * + * A UAC MAY also find it useful to add, among others, Subject (Section + * 20.36), Organization (Section 20.25) and User-Agent (Section 20.41) + * header fields. They all contain information related to the INVITE. + * + * The UAC MAY choose to add a message body to the INVITE. Section + * 8.1.1.10 deals with how to construct the header fields -- Content- + * Type among others -- needed to describe the message body. + * + * https://tools.ietf.org/html/rfc3261#section-13.2.1 + */ + sendInvite(options = {}) { + // There are special rules for message bodies that contain a session + // description - their corresponding Content-Disposition is "session". + // SIP uses an offer/answer model where one UA sends a session + // description, called the offer, which contains a proposed description + // of the session. The offer indicates the desired communications means + // (audio, video, games), parameters of those means (such as codec + // types) and addresses for receiving media from the answerer. The + // other UA responds with another session description, called the + // answer, which indicates which communications means are accepted, the + // parameters that apply to those means, and addresses for receiving + // media from the offerer. An offer/answer exchange is within the + // context of a dialog, so that if a SIP INVITE results in multiple + // dialogs, each is a separate offer/answer exchange. The offer/answer + // model defines restrictions on when offers and answers can be made + // (for example, you cannot make a new offer while one is in progress). + // This results in restrictions on where the offers and answers can + // appear in SIP messages. In this specification, offers and answers + // can only appear in INVITE requests and responses, and ACK. The usage + // of offers and answers is further restricted. For the initial INVITE + // transaction, the rules are: + // + // o The initial offer MUST be in either an INVITE or, if not there, + // in the first reliable non-failure message from the UAS back to + // the UAC. In this specification, that is the final 2xx + // response. + // + // o If the initial offer is in an INVITE, the answer MUST be in a + // reliable non-failure message from UAS back to UAC which is + // correlated to that INVITE. For this specification, that is + // only the final 2xx response to that INVITE. That same exact + // answer MAY also be placed in any provisional responses sent + // prior to the answer. The UAC MUST treat the first session + // description it receives as the answer, and MUST ignore any + // session descriptions in subsequent responses to the initial + // INVITE. + // + // o If the initial offer is in the first reliable non-failure + // message from the UAS back to UAC, the answer MUST be in the + // acknowledgement for that message (in this specification, ACK + // for a 2xx response). + // + // o After having sent or received an answer to the first offer, the + // UAC MAY generate subsequent offers in requests based on rules + // specified for that method, but only if it has received answers + // to any previous offers, and has not sent any offers to which it + // hasn't gotten an answer. + // + // o Once the UAS has sent or received an answer to the initial + // offer, it MUST NOT generate subsequent offers in any responses + // to the initial INVITE. This means that a UAS based on this + // specification alone can never generate subsequent offers until + // completion of the initial transaction. + // + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // 5 The Offer/Answer Model and PRACK + // + // RFC 3261 describes guidelines for the sets of messages in which + // offers and answers [3] can appear. Based on those guidelines, this + // extension provides additional opportunities for offer/answer + // exchanges. + // If the INVITE contained an offer, the UAS MAY generate an answer in a + // reliable provisional response (assuming these are supported by the + // UAC). That results in the establishment of the session before + // completion of the call. Similarly, if a reliable provisional + // response is the first reliable message sent back to the UAC, and the + // INVITE did not contain an offer, one MUST appear in that reliable + // provisional response. + // If the UAC receives a reliable provisional response with an offer + // (this would occur if the UAC sent an INVITE without an offer, in + // which case the first reliable provisional response will contain the + // offer), it MUST generate an answer in the PRACK. If the UAC receives + // a reliable provisional response with an answer, it MAY generate an + // additional offer in the PRACK. If the UAS receives a PRACK with an + // offer, it MUST place the answer in the 2xx to the PRACK. + // Once an answer has been sent or received, the UA SHOULD establish the + // session based on the parameters of the offer and answer, even if the + // original INVITE itself has not been responded to. + // If the UAS had placed a session description in any reliable + // provisional response that is unacknowledged when the INVITE is + // accepted, the UAS MUST delay sending the 2xx until the provisional + // response is acknowledged. Otherwise, the reliability of the 1xx + // cannot be guaranteed, and reliability is needed for proper operation + // of the offer/answer exchange. + // All user agents that support this extension MUST support all + // offer/answer exchanges that are possible based on the rules in + // Section 13.2 of RFC 3261, based on the existence of INVITE and PRACK + // as requests, and 2xx and reliable 1xx as non-failure reliable + // responses. + // + // https://tools.ietf.org/html/rfc3262#section-5 + //// + // The Offer/Answer Model Implementation + // + // The offer/answer model is straight forward, but one MUST READ the specifications... + // + // 13.2.1 Creating the Initial INVITE (paragraph 8 in particular) + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // + // 5 The Offer/Answer Model and PRACK + // https://tools.ietf.org/html/rfc3262#section-5 + // + // Session Initiation Protocol (SIP) Usage of the Offer/Answer Model + // https://tools.ietf.org/html/rfc6337 + //// + //// + // TODO: The Offer/Answer Model Implementation + // + // Currently if `earlyMedia` is enabled and the INVITE request forks, + // the session is terminated if the early dialog does not match the + // confirmed dialog. This restriction make sense in a WebRTC environment, + // but there are other environments where this restriction does not hold. + // + // So while we currently cannot make the offer in INVITE+forking+webrtc + // case work, we propose doing the following... + // + // OPTION 1 + // - add a `earlyMediaForking` option and + // - require SDH.setDescription() to be callable multiple times. + // + // OPTION 2 + // 1) modify SDH Factory to provide an initial offer without giving us the SDH, and then... + // 2) stick that offer in the initial INVITE, and when 183 with initial answer is received... + // 3) ask SDH Factory if it supports "earlyRemoteAnswer" + // a) if true, ask SDH Factory to createSDH(localOffer).then((sdh) => sdh.setDescription(remoteAnswer) + // b) if false, defer getting a SDH until 2xx response is received + // + // Our supplied WebRTC SDH will default to behavior 3b which works in forking environment (without) + // early media if initial offer is in the INVITE). We will, however, provide an "inviteWillNotFork" + // option which if set to "true" will have our supplied WebRTC SDH behave in the 3a manner. + // That will result in + // - early media working with initial offer in the INVITE, and... + // - if the INVITE forks, the session terminating with an ERROR that reads like + // "You set 'inviteWillNotFork' to true but the INVITE forked. You can't eat your cake, and have it too." + // - furthermore, we accept that users will report that error to us as "bug" regardless + // + // So, SDH Factory is going to end up with a new interface along the lines of... + // + // interface SessionDescriptionHandlerFactory { + // makeLocalOffer(): Promise; + // makeSessionDescriptionHandler( + // initialOffer: ContentTypeAndBody, offerType: "local" | "remote" + // ): Promise; + // supportsEarlyRemoteAnswer: boolean; + // supportsContentType(contentType: string): boolean; + // getDescription(description: ContentTypeAndBody): Promise + // setDescription(description: ContentTypeAndBody): Promise + // } + //// + // Send the INVITE request. + this.outgoingInviteRequest = this.userAgent.userAgentCore.invite(this.outgoingRequestMessage, { + onAccept: (inviteResponse) => { + // Our transaction layer is "non-standard" in that it will only + // pass us a 2xx response once per branch, so there is no need to + // worry about dealing with 2xx retransmissions. However, we can + // and do still get 2xx responses for multiple branches (when an + // INVITE is forked) which may create multiple confirmed dialogs. + // Herein we are acking and sending a bye to any confirmed dialogs + // which arrive beyond the first one. This is the desired behavior + // for most applications (but certainly not all). + // If we already received a confirmed dialog, ack & bye this additional confirmed session. + if (this.dialog) { + this.logger.log("Additional confirmed dialog, sending ACK and BYE"); + this.ackAndBye(inviteResponse); + // We do NOT transition state in this case (this is an "extra" dialog) + return; + } + // If the user requested cancellation, ack & bye this session. + if (this.isCanceled) { + this.logger.log("Canceled session accepted, sending ACK and BYE"); + this.ackAndBye(inviteResponse); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + return; + } + this.notifyReferer(inviteResponse); + this.onAccept(inviteResponse) + .then(() => { + this.disposeEarlyMedia(); + }) + .catch(() => { + this.disposeEarlyMedia(); + }) + .then(() => { + if (options.requestDelegate && options.requestDelegate.onAccept) { + options.requestDelegate.onAccept(inviteResponse); + } + }); + }, + onProgress: (inviteResponse) => { + // If the user requested cancellation, ignore response. + if (this.isCanceled) { + return; + } + this.notifyReferer(inviteResponse); + this.onProgress(inviteResponse) + .catch(() => { + this.disposeEarlyMedia(); + }) + .then(() => { + if (options.requestDelegate && options.requestDelegate.onProgress) { + options.requestDelegate.onProgress(inviteResponse); + } + }); + }, + onRedirect: (inviteResponse) => { + this.notifyReferer(inviteResponse); + this.onRedirect(inviteResponse); + if (options.requestDelegate && options.requestDelegate.onRedirect) { + options.requestDelegate.onRedirect(inviteResponse); + } + }, + onReject: (inviteResponse) => { + this.notifyReferer(inviteResponse); + this.onReject(inviteResponse); + if (options.requestDelegate && options.requestDelegate.onReject) { + options.requestDelegate.onReject(inviteResponse); + } + }, + onTrying: (inviteResponse) => { + this.notifyReferer(inviteResponse); + this.onTrying(inviteResponse); + if (options.requestDelegate && options.requestDelegate.onTrying) { + options.requestDelegate.onTrying(inviteResponse); + } + } + }); + return this.outgoingInviteRequest; + } + disposeEarlyMedia() { + this.earlyMediaSessionDescriptionHandlers.forEach((sessionDescriptionHandler) => { + sessionDescriptionHandler.close(); + }); + this.earlyMediaSessionDescriptionHandlers.clear(); + } + notifyReferer(response) { + if (!this._referred) { + return; + } + if (!(this._referred instanceof _session__WEBPACK_IMPORTED_MODULE_0__.Session)) { + throw new Error("Referred session not instance of session"); + } + if (!this._referred.dialog) { + return; + } + if (!response.message.statusCode) { + throw new Error("Status code undefined."); + } + if (!response.message.reasonPhrase) { + throw new Error("Reason phrase undefined."); + } + const statusCode = response.message.statusCode; + const reasonPhrase = response.message.reasonPhrase; + const body = `SIP/2.0 ${statusCode} ${reasonPhrase}`.trim(); + const outgoingNotifyRequest = this._referred.dialog.notify(undefined, { + extraHeaders: ["Event: refer", "Subscription-State: terminated"], + body: { + contentDisposition: "render", + contentType: "message/sipfrag", + content: body + } + }); + // The implicit subscription created by a REFER is the same as a + // subscription created with a SUBSCRIBE request. The agent issuing the + // REFER can terminate this subscription prematurely by unsubscribing + // using the mechanisms described in [2]. Terminating a subscription, + // either by explicitly unsubscribing or rejecting NOTIFY, is not an + // indication that the referenced request should be withdrawn or + // abandoned. + // https://tools.ietf.org/html/rfc3515#section-2.4.4 + // FIXME: TODO: This should be done in a subscribe dialog to satisfy the above. + // If the notify is rejected, stop sending NOTIFY requests. + outgoingNotifyRequest.delegate = { + onReject: () => { + this._referred = undefined; + } + }; + } + /** + * Handle final response to initial INVITE. + * @param inviteResponse - 2xx response. + */ + onAccept(inviteResponse) { + this.logger.log("Inviter.onAccept"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing) { + this.logger.error(`Accept received while in state ${this.state}, dropping response`); + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + const response = inviteResponse.message; + const session = inviteResponse.session; + // Ported behavior. + if (response.hasHeader("P-Asserted-Identity")) { + this._assertedIdentity = _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.nameAddrHeaderParse(response.getHeader("P-Asserted-Identity")); + } + // We have a confirmed dialog. + session.delegate = { + onAck: (ackRequest) => this.onAckRequest(ackRequest), + onBye: (byeRequest) => this.onByeRequest(byeRequest), + onInfo: (infoRequest) => this.onInfoRequest(infoRequest), + onInvite: (inviteRequest) => this.onInviteRequest(inviteRequest), + onMessage: (messageRequest) => this.onMessageRequest(messageRequest), + onNotify: (notifyRequest) => this.onNotifyRequest(notifyRequest), + onPrack: (prackRequest) => this.onPrackRequest(prackRequest), + onRefer: (referRequest) => this.onReferRequest(referRequest) + }; + this._dialog = session; + switch (session.signalingState) { + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Initial: + // INVITE without offer, so MUST have offer at this point, so invalid state. + this.logger.error("Received 2xx response to INVITE without a session description"); + this.ackAndBye(inviteResponse, 400, "Missing session description"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + return Promise.reject(new Error("Bad Media Description")); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveLocalOffer: + // INVITE with offer, so MUST have answer at this point, so invalid state. + this.logger.error("Received 2xx response to INVITE without a session description"); + this.ackAndBye(inviteResponse, 400, "Missing session description"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + return Promise.reject(new Error("Bad Media Description")); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveRemoteOffer: { + // INVITE without offer, received offer in 2xx, so MUST send answer in ACK. + if (!this._dialog.offer) { + throw new Error(`Session offer undefined in signaling state ${this._dialog.signalingState}.`); + } + const options = { + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers, + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions + }; + return this.setOfferAndGetAnswer(this._dialog.offer, options) + .then((body) => { + inviteResponse.ack({ body }); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Established); + }) + .catch((error) => { + this.ackAndBye(inviteResponse, 488, "Invalid session description"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + throw error; + }); + } + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Stable: { + // If INVITE without offer and we have already completed the initial exchange. + if (this.earlyMediaSessionDescriptionHandlers.size > 0) { + const sdh = this.earlyMediaSessionDescriptionHandlers.get(session.id); + if (!sdh) { + throw new Error("Session description handler undefined."); + } + this.setSessionDescriptionHandler(sdh); + this.earlyMediaSessionDescriptionHandlers.delete(session.id); + inviteResponse.ack(); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Established); + return Promise.resolve(); + } + // If INVITE with offer and we used an "early" answer in a provisional response for media + if (this.earlyMediaDialog) { + // If early media dialog doesn't match confirmed dialog, we must unfortunately fail. + // This limitation stems from how WebRTC currently implements its offer/answer model. + // There are details elsewhere, but in short a WebRTC offer cannot be forked. + if (this.earlyMediaDialog !== session) { + if (this.earlyMedia) { + const message = "You have set the 'earlyMedia' option to 'true' which requires that your INVITE requests " + + "do not fork and yet this INVITE request did in fact fork. Consequentially and not surprisingly " + + "the end point which accepted the INVITE (confirmed dialog) does not match the end point with " + + "which early media has been setup (early dialog) and thus this session is unable to proceed. " + + "In accordance with the SIP specifications, the SIP servers your end point is connected to " + + "determine if an INVITE forks and the forking behavior of those servers cannot be controlled " + + "by this library. If you wish to use early media with this library you must configure those " + + "servers accordingly. Alternatively you may set the 'earlyMedia' to 'false' which will allow " + + "this library to function with any INVITE requests which do fork."; + this.logger.error(message); + } + const error = new Error("Early media dialog does not equal confirmed dialog, terminating session"); + this.logger.error(error.message); + this.ackAndBye(inviteResponse, 488, "Not Acceptable Here"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + return Promise.reject(error); + } + // Otherwise we are good to go. + inviteResponse.ack(); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Established); + return Promise.resolve(); + } + // If INVITE with offer and we have been waiting till now to apply the answer. + const answer = session.answer; + if (!answer) { + throw new Error("Answer is undefined."); + } + const options = { + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers, + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions + }; + return this.setAnswer(answer, options) + .then(() => { + // This session has completed an initial offer/answer exchange... + let ackOptions; + if (this._renderbody && this._rendertype) { + ackOptions = { + body: { contentDisposition: "render", contentType: this._rendertype, content: this._renderbody } + }; + } + inviteResponse.ack(ackOptions); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Established); + }) + .catch((error) => { + this.logger.error(error.message); + this.ackAndBye(inviteResponse, 488, "Not Acceptable Here"); + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + throw error; + }); + } + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Closed: + // Dialog has terminated. + return Promise.reject(new Error("Terminated.")); + default: + throw new Error("Unknown session signaling state."); + } + } + /** + * Handle provisional response to initial INVITE. + * @param inviteResponse - 1xx response. + */ + onProgress(inviteResponse) { + var _a; + this.logger.log("Inviter.onProgress"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing) { + this.logger.error(`Progress received while in state ${this.state}, dropping response`); + return Promise.reject(new Error(`Invalid session state ${this.state}`)); + } + if (!this.outgoingInviteRequest) { + throw new Error("Outgoing INVITE request undefined."); + } + const response = inviteResponse.message; + const session = inviteResponse.session; + // Ported - Set assertedIdentity. + if (response.hasHeader("P-Asserted-Identity")) { + this._assertedIdentity = _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.nameAddrHeaderParse(response.getHeader("P-Asserted-Identity")); + } + // If a provisional response is received for an initial request, and + // that response contains a Require header field containing the option + // tag 100rel, the response is to be sent reliably. If the response is + // a 100 (Trying) (as opposed to 101 to 199), this option tag MUST be + // ignored, and the procedures below MUST NOT be used. + // https://tools.ietf.org/html/rfc3262#section-4 + const requireHeader = response.getHeader("require"); + const rseqHeader = response.getHeader("rseq"); + const rseq = requireHeader && requireHeader.includes("100rel") && rseqHeader ? Number(rseqHeader) : undefined; + const responseReliable = !!rseq; + const extraHeaders = []; + if (responseReliable) { + extraHeaders.push("RAck: " + response.getHeader("rseq") + " " + response.getHeader("cseq")); + } + switch (session.signalingState) { + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Initial: + // INVITE without offer and session still has no offer (and no answer). + if (responseReliable) { + // Similarly, if a reliable provisional + // response is the first reliable message sent back to the UAC, and the + // INVITE did not contain an offer, one MUST appear in that reliable + // provisional response. + // https://tools.ietf.org/html/rfc3262#section-5 + this.logger.warn("First reliable provisional response received MUST contain an offer when INVITE does not contain an offer."); + // FIXME: Known popular UA's currently end up here... + inviteResponse.prack({ extraHeaders }); + } + return Promise.resolve(); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveLocalOffer: + // INVITE with offer and session only has that initial local offer. + if (responseReliable) { + inviteResponse.prack({ extraHeaders }); + } + return Promise.resolve(); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveRemoteOffer: + if (!responseReliable) { + // The initial offer MUST be in either an INVITE or, if not there, + // in the first reliable non-failure message from the UAS back to + // the UAC. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // According to Section 13.2.1 of [RFC3261], 'The first reliable + // non-failure message' must have an offer if there is no offer in the + // INVITE request. This means that the User Agent (UA) that receives + // the INVITE request without an offer must include an offer in the + // first reliable response with 100rel extension. If no reliable + // provisional response has been sent, the User Agent Server (UAS) must + // include an offer when sending 2xx response. + // https://tools.ietf.org/html/rfc6337#section-2.2 + this.logger.warn("Non-reliable provisional response MUST NOT contain an initial offer, discarding response."); + return Promise.resolve(); + } + { + // If the initial offer is in the first reliable non-failure + // message from the UAS back to UAC, the answer MUST be in the + // acknowledgement for that message + const sdh = this.sessionDescriptionHandlerFactory(this, this.userAgent.configuration.sessionDescriptionHandlerFactoryOptions || {}); + if ((_a = this.delegate) === null || _a === void 0 ? void 0 : _a.onSessionDescriptionHandler) { + this.delegate.onSessionDescriptionHandler(sdh, true); + } + this.earlyMediaSessionDescriptionHandlers.set(session.id, sdh); + return sdh + .setDescription(response.body, this.sessionDescriptionHandlerOptions, this.sessionDescriptionHandlerModifiers) + .then(() => sdh.getDescription(this.sessionDescriptionHandlerOptions, this.sessionDescriptionHandlerModifiers)) + .then((description) => { + const body = { + contentDisposition: "session", + contentType: description.contentType, + content: description.body + }; + inviteResponse.prack({ extraHeaders, body }); + }) + .catch((error) => { + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + throw error; + }); + } + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Stable: + // This session has completed an initial offer/answer exchange, so... + // - INVITE with SDP and this provisional response MAY be reliable + // - INVITE without SDP and this provisional response MAY be reliable + if (responseReliable) { + inviteResponse.prack({ extraHeaders }); + } + if (this.earlyMedia && !this.earlyMediaDialog) { + this.earlyMediaDialog = session; + const answer = session.answer; + if (!answer) { + throw new Error("Answer is undefined."); + } + const options = { + sessionDescriptionHandlerModifiers: this.sessionDescriptionHandlerModifiers, + sessionDescriptionHandlerOptions: this.sessionDescriptionHandlerOptions + }; + return this.setAnswer(answer, options).catch((error) => { + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + throw error; + }); + } + return Promise.resolve(); + case _core__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Closed: + // Dialog has terminated. + return Promise.reject(new Error("Terminated.")); + default: + throw new Error("Unknown session signaling state."); + } + } + /** + * Handle final response to initial INVITE. + * @param inviteResponse - 3xx response. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onRedirect(inviteResponse) { + this.logger.log("Inviter.onRedirect"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing && this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminating) { + this.logger.error(`Redirect received while in state ${this.state}, dropping response`); + return; + } + // transition state + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + } + /** + * Handle final response to initial INVITE. + * @param inviteResponse - 4xx, 5xx, or 6xx response. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onReject(inviteResponse) { + this.logger.log("Inviter.onReject"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing && this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminating) { + this.logger.error(`Reject received while in state ${this.state}, dropping response`); + return; + } + // transition state + this.stateTransition(_session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Terminated); + } + /** + * Handle final response to initial INVITE. + * @param inviteResponse - 100 response. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onTrying(inviteResponse) { + this.logger.log("Inviter.onTrying"); + // validate state + if (this.state !== _session_state__WEBPACK_IMPORTED_MODULE_5__.SessionState.Establishing) { + this.logger.error(`Trying received while in state ${this.state}, dropping response`); + return; + } + } +} + + +/***/ }), +/* 38 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Messager": () => (/* binding */ Messager) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); + +/** + * A messager sends a {@link Message} (outgoing MESSAGE). + * @public + */ +class Messager { + /** + * Constructs a new instance of the `Messager` class. + * @param userAgent - User agent. See {@link UserAgent} for details. + * @param targetURI - Request URI identifying the target of the message. + * @param content - Content for the body of the message. + * @param contentType - Content type of the body of the message. + * @param options - Options bucket. See {@link MessagerOptions} for details. + */ + constructor(userAgent, targetURI, content, contentType = "text/plain", options = {}) { + // Logger + this.logger = userAgent.getLogger("sip.Messager"); + // Default options params + options.params = options.params || {}; + // URIs + let fromURI = userAgent.userAgentCore.configuration.aor; + if (options.params.fromUri) { + fromURI = + typeof options.params.fromUri === "string" ? _core__WEBPACK_IMPORTED_MODULE_0__.Grammar.URIParse(options.params.fromUri) : options.params.fromUri; + } + if (!fromURI) { + throw new TypeError("Invalid from URI: " + options.params.fromUri); + } + let toURI = targetURI; + if (options.params.toUri) { + toURI = typeof options.params.toUri === "string" ? _core__WEBPACK_IMPORTED_MODULE_0__.Grammar.URIParse(options.params.toUri) : options.params.toUri; + } + if (!toURI) { + throw new TypeError("Invalid to URI: " + options.params.toUri); + } + // Message params + const params = options.params ? Object.assign({}, options.params) : {}; + // Extra headers + const extraHeaders = (options.extraHeaders || []).slice(); + // Body + const contentDisposition = "render"; + const body = { + contentDisposition, + contentType, + content + }; + // Build the request + this.request = userAgent.userAgentCore.makeOutgoingRequestMessage(_core__WEBPACK_IMPORTED_MODULE_1__.C.MESSAGE, targetURI, fromURI, toURI, params, extraHeaders, body); + // User agent + this.userAgent = userAgent; + } + /** + * Send the message. + */ + message(options = {}) { + this.userAgent.userAgentCore.request(this.request, options.requestDelegate); + return Promise.resolve(); + } +} + + +/***/ }), +/* 39 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PublisherState": () => (/* binding */ PublisherState) +/* harmony export */ }); +/** + * {@link Publisher} state. + * @remarks + * The {@link Publisher} behaves in a deterministic manner according to the following + * Finite State Machine (FSM). + * ```txt + * __________________________________________ + * | __________________________ | + * Publisher | | v v + * Constructed -> Initial -> Published -> Unpublished -> Terminated + * | ^____________| ^ + * |______________________________| + * ``` + * @public + */ +var PublisherState; +(function (PublisherState) { + PublisherState["Initial"] = "Initial"; + PublisherState["Published"] = "Published"; + PublisherState["Unpublished"] = "Unpublished"; + PublisherState["Terminated"] = "Terminated"; +})(PublisherState || (PublisherState = {})); + + +/***/ }), +/* 40 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Publisher": () => (/* binding */ Publisher) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17); +/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); +/* harmony import */ var _publisher_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(39); + + + +/** + * A publisher publishes a publication (outgoing PUBLISH). + * @public + */ +class Publisher { + /** + * Constructs a new instance of the `Publisher` class. + * + * @param userAgent - User agent. See {@link UserAgent} for details. + * @param targetURI - Request URI identifying the target of the message. + * @param eventType - The event type identifying the published document. + * @param options - Options bucket. See {@link PublisherOptions} for details. + */ + constructor(userAgent, targetURI, eventType, options = {}) { + this.disposed = false; + /** The publication state. */ + this._state = _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Initial; + // state emitter + this._stateEventEmitter = new _emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + this.userAgent = userAgent; + options.extraHeaders = (options.extraHeaders || []).slice(); + options.contentType = options.contentType || "text/plain"; + if (typeof options.expires !== "number" || options.expires % 1 !== 0) { + options.expires = 3600; + } + else { + options.expires = Number(options.expires); + } + if (typeof options.unpublishOnClose !== "boolean") { + options.unpublishOnClose = true; + } + this.target = targetURI; + this.event = eventType; + this.options = options; + this.pubRequestExpires = options.expires; + this.logger = userAgent.getLogger("sip.Publisher"); + const params = options.params || {}; + const fromURI = params.fromUri ? params.fromUri : userAgent.userAgentCore.configuration.aor; + const toURI = params.toUri ? params.toUri : targetURI; + let body; + if (options.body && options.contentType) { + const contentDisposition = "render"; + const contentType = options.contentType; + const content = options.body; + body = { + contentDisposition, + contentType, + content + }; + } + const extraHeaders = (options.extraHeaders || []).slice(); + // Build the request + this.request = userAgent.userAgentCore.makeOutgoingRequestMessage(_core__WEBPACK_IMPORTED_MODULE_2__.C.PUBLISH, targetURI, fromURI, toURI, params, extraHeaders, body); + // Identifier + this.id = this.target.toString() + ":" + this.event; + // Add to the user agent's publisher collection. + this.userAgent._publishers[this.id] = this; + } + /** + * Destructor. + */ + dispose() { + if (this.disposed) { + return Promise.resolve(); + } + this.disposed = true; + this.logger.log(`Publisher ${this.id} in state ${this.state} is being disposed`); + // Remove from the user agent's publisher collection + delete this.userAgent._publishers[this.id]; + // Send unpublish, if requested + if (this.options.unpublishOnClose && this.state === _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Published) { + return this.unpublish(); + } + if (this.publishRefreshTimer) { + clearTimeout(this.publishRefreshTimer); + this.publishRefreshTimer = undefined; + } + this.pubRequestBody = undefined; + this.pubRequestExpires = 0; + this.pubRequestEtag = undefined; + return Promise.resolve(); + } + /** The publication state. */ + get state() { + return this._state; + } + /** Emits when the publisher state changes. */ + get stateChange() { + return this._stateEventEmitter; + } + /** + * Publish. + * @param content - Body to publish + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + publish(content, options = {}) { + // Clean up before the run + if (this.publishRefreshTimer) { + clearTimeout(this.publishRefreshTimer); + this.publishRefreshTimer = undefined; + } + // is Initial or Modify request + this.options.body = content; + this.pubRequestBody = this.options.body; + if (this.pubRequestExpires === 0) { + // This is Initial request after unpublish + if (this.options.expires === undefined) { + throw new Error("Expires undefined."); + } + this.pubRequestExpires = this.options.expires; + this.pubRequestEtag = undefined; + } + this.sendPublishRequest(); + return Promise.resolve(); + } + /** + * Unpublish. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + unpublish(options = {}) { + // Clean up before the run + if (this.publishRefreshTimer) { + clearTimeout(this.publishRefreshTimer); + this.publishRefreshTimer = undefined; + } + this.pubRequestBody = undefined; + this.pubRequestExpires = 0; + if (this.pubRequestEtag !== undefined) { + this.sendPublishRequest(); + } + return Promise.resolve(); + } + /** @internal */ + receiveResponse(response) { + const statusCode = response.statusCode || 0; + switch (true) { + case /^1[0-9]{2}$/.test(statusCode.toString()): + break; + case /^2[0-9]{2}$/.test(statusCode.toString()): + // Set SIP-Etag + if (response.hasHeader("SIP-ETag")) { + this.pubRequestEtag = response.getHeader("SIP-ETag"); + } + else { + this.logger.warn("SIP-ETag header missing in a 200-class response to PUBLISH"); + } + // Update Expire + if (response.hasHeader("Expires")) { + const expires = Number(response.getHeader("Expires")); + if (typeof expires === "number" && expires >= 0 && expires <= this.pubRequestExpires) { + this.pubRequestExpires = expires; + } + else { + this.logger.warn("Bad Expires header in a 200-class response to PUBLISH"); + } + } + else { + this.logger.warn("Expires header missing in a 200-class response to PUBLISH"); + } + if (this.pubRequestExpires !== 0) { + // Schedule refresh + this.publishRefreshTimer = setTimeout(() => this.refreshRequest(), this.pubRequestExpires * 900); + if (this._state !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Published) { + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Published); + } + } + else { + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished); + } + break; + case /^412$/.test(statusCode.toString()): + // 412 code means no matching ETag - possibly the PUBLISH expired + // Resubmit as new request, if the current request is not a "remove" + if (this.pubRequestEtag !== undefined && this.pubRequestExpires !== 0) { + this.logger.warn("412 response to PUBLISH, recovering"); + this.pubRequestEtag = undefined; + if (this.options.body === undefined) { + throw new Error("Body undefined."); + } + this.publish(this.options.body); + } + else { + this.logger.warn("412 response to PUBLISH, recovery failed"); + this.pubRequestExpires = 0; + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished); + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated); + } + break; + case /^423$/.test(statusCode.toString()): + // 423 code means we need to adjust the Expires interval up + if (this.pubRequestExpires !== 0 && response.hasHeader("Min-Expires")) { + const minExpires = Number(response.getHeader("Min-Expires")); + if (typeof minExpires === "number" || minExpires > this.pubRequestExpires) { + this.logger.warn("423 code in response to PUBLISH, adjusting the Expires value and trying to recover"); + this.pubRequestExpires = minExpires; + if (this.options.body === undefined) { + throw new Error("Body undefined."); + } + this.publish(this.options.body); + } + else { + this.logger.warn("Bad 423 response Min-Expires header received for PUBLISH"); + this.pubRequestExpires = 0; + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished); + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated); + } + } + else { + this.logger.warn("423 response to PUBLISH, recovery failed"); + this.pubRequestExpires = 0; + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished); + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated); + } + break; + default: + this.pubRequestExpires = 0; + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished); + this.stateTransition(_publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated); + break; + } + // Do the cleanup + if (this.pubRequestExpires === 0) { + if (this.publishRefreshTimer) { + clearTimeout(this.publishRefreshTimer); + this.publishRefreshTimer = undefined; + } + this.pubRequestBody = undefined; + this.pubRequestEtag = undefined; + } + } + /** @internal */ + send() { + return this.userAgent.userAgentCore.publish(this.request, { + onAccept: (response) => this.receiveResponse(response.message), + onProgress: (response) => this.receiveResponse(response.message), + onRedirect: (response) => this.receiveResponse(response.message), + onReject: (response) => this.receiveResponse(response.message), + onTrying: (response) => this.receiveResponse(response.message) + }); + } + refreshRequest() { + // Clean up before the run + if (this.publishRefreshTimer) { + clearTimeout(this.publishRefreshTimer); + this.publishRefreshTimer = undefined; + } + // This is Refresh request + this.pubRequestBody = undefined; + if (this.pubRequestEtag === undefined) { + throw new Error("Etag undefined"); + } + if (this.pubRequestExpires === 0) { + throw new Error("Expires zero"); + } + this.sendPublishRequest(); + } + sendPublishRequest() { + const reqOptions = Object.assign({}, this.options); + reqOptions.extraHeaders = (this.options.extraHeaders || []).slice(); + reqOptions.extraHeaders.push("Event: " + this.event); + reqOptions.extraHeaders.push("Expires: " + this.pubRequestExpires); + if (this.pubRequestEtag !== undefined) { + reqOptions.extraHeaders.push("SIP-If-Match: " + this.pubRequestEtag); + } + const ruri = this.target; + const params = this.options.params || {}; + let bodyAndContentType; + if (this.pubRequestBody !== undefined) { + if (this.options.contentType === undefined) { + throw new Error("Content type undefined."); + } + bodyAndContentType = { + body: this.pubRequestBody, + contentType: this.options.contentType + }; + } + let body; + if (bodyAndContentType) { + body = (0,_core__WEBPACK_IMPORTED_MODULE_3__.fromBodyLegacy)(bodyAndContentType); + } + this.request = this.userAgent.userAgentCore.makeOutgoingRequestMessage(_core__WEBPACK_IMPORTED_MODULE_2__.C.PUBLISH, ruri, params.fromUri ? params.fromUri : this.userAgent.userAgentCore.configuration.aor, params.toUri ? params.toUri : this.target, params, reqOptions.extraHeaders, body); + return this.send(); + } + /** + * Transition publication state. + */ + stateTransition(newState) { + const invalidTransition = () => { + throw new Error(`Invalid state transition from ${this._state} to ${newState}`); + }; + // Validate transition + switch (this._state) { + case _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Initial: + if (newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Published && + newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished && + newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated) { + invalidTransition(); + } + break; + case _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Published: + if (newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished && newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated) { + invalidTransition(); + } + break; + case _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Unpublished: + if (newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Published && newState !== _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated) { + invalidTransition(); + } + break; + case _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated: + invalidTransition(); + break; + default: + throw new Error("Unrecognized state."); + } + // Transition + this._state = newState; + this.logger.log(`Publication transitioned to state ${this._state}`); + this._stateEventEmitter.emit(this._state); + // Dispose + if (newState === _publisher_state__WEBPACK_IMPORTED_MODULE_0__.PublisherState.Terminated) { + this.dispose(); + } + } +} + + +/***/ }), +/* 41 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RegistererState": () => (/* binding */ RegistererState) +/* harmony export */ }); +/** + * {@link Registerer} state. + * @remarks + * The {@link Registerer} behaves in a deterministic manner according to the following + * Finite State Machine (FSM). + * ```txt + * __________________________________________ + * | __________________________ | + * Registerer | | v v + * Constructed -> Initial -> Registered -> Unregistered -> Terminated + * | ^____________| ^ + * |______________________________| + * ``` + * @public + */ +var RegistererState; +(function (RegistererState) { + RegistererState["Initial"] = "Initial"; + RegistererState["Registered"] = "Registered"; + RegistererState["Unregistered"] = "Unregistered"; + RegistererState["Terminated"] = "Terminated"; +})(RegistererState || (RegistererState = {})); + + +/***/ }), +/* 42 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Registerer": () => (/* binding */ Registerer) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(21); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(29); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(23); +/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6); +/* harmony import */ var _registerer_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(41); + + + + +/** + * A registerer registers a contact for an address of record (outgoing REGISTER). + * @public + */ +class Registerer { + /** + * Constructs a new instance of the `Registerer` class. + * @param userAgent - User agent. See {@link UserAgent} for details. + * @param options - Options bucket. See {@link RegistererOptions} for details. + */ + constructor(userAgent, options = {}) { + this.disposed = false; + /** The contacts returned from the most recent accepted REGISTER request. */ + this._contacts = []; + /** The number of seconds to wait before retrying to register. */ + this._retryAfter = undefined; + /** The registration state. */ + this._state = _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Initial; + /** True is waiting for final response to outstanding REGISTER request. */ + this._waiting = false; + // state emitter + this._stateEventEmitter = new _emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + // waiting emitter + this._waitingEventEmitter = new _emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + // Set user agent + this.userAgent = userAgent; + // Default registrar is domain portion of user agent uri + const defaultUserAgentRegistrar = userAgent.configuration.uri.clone(); + defaultUserAgentRegistrar.user = undefined; + // Initialize configuration + this.options = Object.assign(Object.assign(Object.assign({}, Registerer.defaultOptions()), { registrar: defaultUserAgentRegistrar }), Registerer.stripUndefinedProperties(options)); + // Make sure we are not using references to array options + this.options.extraContactHeaderParams = (this.options.extraContactHeaderParams || []).slice(); + this.options.extraHeaders = (this.options.extraHeaders || []).slice(); + // Make sure we are not using references to registrar uri + if (!this.options.registrar) { + throw new Error("Registrar undefined."); + } + this.options.registrar = this.options.registrar.clone(); + // Set instanceId and regId conditional defaults and validate + if (this.options.regId && !this.options.instanceId) { + this.options.instanceId = Registerer.newUUID(); + } + else if (!this.options.regId && this.options.instanceId) { + this.options.regId = 1; + } + if (this.options.instanceId && _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.parse(this.options.instanceId, "uuid") === -1) { + throw new Error("Invalid instanceId."); + } + if (this.options.regId && this.options.regId < 0) { + throw new Error("Invalid regId."); + } + const registrar = this.options.registrar; + const fromURI = (this.options.params && this.options.params.fromUri) || userAgent.userAgentCore.configuration.aor; + const toURI = (this.options.params && this.options.params.toUri) || userAgent.configuration.uri; + const params = this.options.params || {}; + const extraHeaders = (options.extraHeaders || []).slice(); + // Build the request + this.request = userAgent.userAgentCore.makeOutgoingRequestMessage(_core__WEBPACK_IMPORTED_MODULE_3__.C.REGISTER, registrar, fromURI, toURI, params, extraHeaders, undefined); + // Registration expires + this.expires = this.options.expires || Registerer.defaultExpires; + if (this.expires < 0) { + throw new Error("Invalid expires."); + } + // Interval at which re-REGISTER requests are sent + this.refreshFrequency = this.options.refreshFrequency || Registerer.defaultRefreshFrequency; + if (this.refreshFrequency < 50 || this.refreshFrequency > 99) { + throw new Error("Invalid refresh frequency. The value represents a percentage of the expiration time and should be between 50 and 99."); + } + // initialize logger + this.logger = userAgent.getLogger("sip.Registerer"); + if (this.options.logConfiguration) { + this.logger.log("Configuration:"); + Object.keys(this.options).forEach((key) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const value = this.options[key]; + switch (key) { + case "registrar": + this.logger.log("· " + key + ": " + value); + break; + default: + this.logger.log("· " + key + ": " + JSON.stringify(value)); + } + }); + } + // Identifier + this.id = this.request.callId + this.request.from.parameters.tag; + // Add to the user agent's session collection. + this.userAgent._registerers[this.id] = this; + } + /** Default registerer options. */ + static defaultOptions() { + return { + expires: Registerer.defaultExpires, + extraContactHeaderParams: [], + extraHeaders: [], + logConfiguration: true, + instanceId: "", + params: {}, + regId: 0, + registrar: new _core__WEBPACK_IMPORTED_MODULE_4__.URI("sip", "anonymous", "anonymous.invalid"), + refreshFrequency: Registerer.defaultRefreshFrequency + }; + } + // http://stackoverflow.com/users/109538/broofa + static newUUID() { + const UUID = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => { + const r = Math.floor(Math.random() * 16); + const v = c === "x" ? r : (r % 4) + 8; + return v.toString(16); + }); + return UUID; + } + /** + * Strip properties with undefined values from options. + * This is a work around while waiting for missing vs undefined to be addressed (or not)... + * https://github.com/Microsoft/TypeScript/issues/13195 + * @param options - Options to reduce + */ + static stripUndefinedProperties(options) { + return Object.keys(options).reduce((object, key) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (options[key] !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + object[key] = options[key]; + } + return object; + }, {}); + } + /** The registered contacts. */ + get contacts() { + return this._contacts.slice(); + } + /** + * The number of seconds to wait before retrying to register. + * @defaultValue `undefined` + * @remarks + * When the server rejects a registration request, if it provides a suggested + * duration to wait before retrying, that value is available here when and if + * the state transitions to `Unsubscribed`. It is also available during the + * callback to `onReject` after a call to `register`. (Note that if the state + * if already `Unsubscribed`, a rejected request created by `register` will + * not cause the state to transition to `Unsubscribed`. One way to avoid this + * case is to dispose of `Registerer` when unregistered and create a new + * `Registerer` for any attempts to retry registering.) + * @example + * ```ts + * // Checking for retry after on state change + * registerer.stateChange.addListener((newState) => { + * switch (newState) { + * case RegistererState.Unregistered: + * const retryAfter = registerer.retryAfter; + * break; + * } + * }); + * + * // Checking for retry after on request rejection + * registerer.register({ + * requestDelegate: { + * onReject: () => { + * const retryAfter = registerer.retryAfter; + * } + * } + * }); + * ``` + */ + get retryAfter() { + return this._retryAfter; + } + /** The registration state. */ + get state() { + return this._state; + } + /** Emits when the registerer state changes. */ + get stateChange() { + return this._stateEventEmitter; + } + /** Destructor. */ + dispose() { + if (this.disposed) { + return Promise.resolve(); + } + this.disposed = true; + this.logger.log(`Registerer ${this.id} in state ${this.state} is being disposed`); + // Remove from the user agent's registerer collection + delete this.userAgent._registerers[this.id]; + // If registered, unregisters and resolves after final response received. + return new Promise((resolve) => { + const doClose = () => { + // If we are registered, unregister and resolve after our state changes + if (!this.waiting && this._state === _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered) { + this.stateChange.addListener(() => { + this.terminated(); + resolve(); + }, { once: true }); + this.unregister(); + return; + } + // Otherwise just resolve + this.terminated(); + resolve(); + }; + // If we are waiting for an outstanding request, wait for it to finish and then try closing. + // Otherwise just try closing. + if (this.waiting) { + this.waitingChange.addListener(() => { + doClose(); + }, { once: true }); + } + else { + doClose(); + } + }); + } + /** + * Sends the REGISTER request. + * @remarks + * If successful, sends re-REGISTER requests prior to registration expiration until `unsubscribe()` is called. + * Rejects with `RequestPendingError` if a REGISTER request is already in progress. + */ + register(options = {}) { + if (this.state === _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + this.stateError(); + throw new Error("Registerer terminated. Unable to register."); + } + if (this.disposed) { + this.stateError(); + throw new Error("Registerer disposed. Unable to register."); + } + // UAs MUST NOT send a new registration (that is, containing new Contact + // header field values, as opposed to a retransmission) until they have + // received a final response from the registrar for the previous one or + // the previous REGISTER request has timed out. + // https://tools.ietf.org/html/rfc3261#section-10.2 + if (this.waiting) { + this.waitingWarning(); + const error = new _exceptions__WEBPACK_IMPORTED_MODULE_5__.RequestPendingError("REGISTER request already in progress, waiting for final response"); + return Promise.reject(error); + } + // Options + if (options.requestOptions) { + this.options = Object.assign(Object.assign({}, this.options), options.requestOptions); + } + // Extra headers + const extraHeaders = (this.options.extraHeaders || []).slice(); + extraHeaders.push("Contact: " + this.generateContactHeader(this.expires)); + // this is UA.C.ALLOWED_METHODS, removed to get around circular dependency + extraHeaders.push("Allow: " + ["ACK", "CANCEL", "INVITE", "MESSAGE", "BYE", "OPTIONS", "INFO", "NOTIFY", "REFER"].toString()); + // Call-ID: All registrations from a UAC SHOULD use the same Call-ID + // header field value for registrations sent to a particular + // registrar. + // + // CSeq: The CSeq value guarantees proper ordering of REGISTER + // requests. A UA MUST increment the CSeq value by one for each + // REGISTER request with the same Call-ID. + // https://tools.ietf.org/html/rfc3261#section-10.2 + this.request.cseq++; + this.request.setHeader("cseq", this.request.cseq + " REGISTER"); + this.request.extraHeaders = extraHeaders; + this.waitingToggle(true); + const outgoingRegisterRequest = this.userAgent.userAgentCore.register(this.request, { + onAccept: (response) => { + let expires; + // FIXME: This does NOT appear to be to spec and should be removed. + // I haven't found anywhere that an Expires header may be used in a response. + if (response.message.hasHeader("expires")) { + expires = Number(response.message.getHeader("expires")); + } + // 8. The registrar returns a 200 (OK) response. The response MUST + // contain Contact header field values enumerating all current + // bindings. Each Contact value MUST feature an "expires" + // parameter indicating its expiration interval chosen by the + // registrar. The response SHOULD include a Date header field. + // https://tools.ietf.org/html/rfc3261#section-10.3 + this._contacts = response.message.getHeaders("contact"); + let contacts = this._contacts.length; + if (!contacts) { + this.logger.error("No Contact header in response to REGISTER, dropping response."); + this.unregistered(); + return; + } + // The 200 (OK) response from the registrar contains a list of Contact + // fields enumerating all current bindings. The UA compares each + // contact address to see if it created the contact address, using + // comparison rules in Section 19.1.4. If so, it updates the expiration + // time interval according to the expires parameter or, if absent, the + // Expires field value. The UA then issues a REGISTER request for each + // of its bindings before the expiration interval has elapsed. + // https://tools.ietf.org/html/rfc3261#section-10.2.4 + let contact; + while (contacts--) { + contact = response.message.parseHeader("contact", contacts); + if (!contact) { + throw new Error("Contact undefined"); + } + if (this.userAgent.contact.pubGruu && (0,_core__WEBPACK_IMPORTED_MODULE_4__.equivalentURI)(contact.uri, this.userAgent.contact.pubGruu)) { + expires = Number(contact.getParam("expires")); + break; + } + // If we are using a randomly generated user name (which is the default behavior) + if (this.userAgent.configuration.contactName === "") { + // compare the user portion of the URI under the assumption that it will be unique + if (contact.uri.user === this.userAgent.contact.uri.user) { + expires = Number(contact.getParam("expires")); + break; + } + } + else { + // otherwise use comparision rules in Section 19.1.4 + if ((0,_core__WEBPACK_IMPORTED_MODULE_4__.equivalentURI)(contact.uri, this.userAgent.contact.uri)) { + expires = Number(contact.getParam("expires")); + break; + } + } + contact = undefined; + } + // There must be a matching contact. + if (contact === undefined) { + this.logger.error("No Contact header pointing to us, dropping response"); + this.unregistered(); + this.waitingToggle(false); + return; + } + // The contact must have an expires. + if (expires === undefined) { + this.logger.error("Contact pointing to us is missing expires parameter, dropping response"); + this.unregistered(); + this.waitingToggle(false); + return; + } + // Save gruu values + if (contact.hasParam("temp-gruu")) { + const gruu = contact.getParam("temp-gruu"); + if (gruu) { + this.userAgent.contact.tempGruu = _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.URIParse(gruu.replace(/"/g, "")); + } + } + if (contact.hasParam("pub-gruu")) { + const gruu = contact.getParam("pub-gruu"); + if (gruu) { + this.userAgent.contact.pubGruu = _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.URIParse(gruu.replace(/"/g, "")); + } + } + this.registered(expires); + if (options.requestDelegate && options.requestDelegate.onAccept) { + options.requestDelegate.onAccept(response); + } + this.waitingToggle(false); + }, + onProgress: (response) => { + if (options.requestDelegate && options.requestDelegate.onProgress) { + options.requestDelegate.onProgress(response); + } + }, + onRedirect: (response) => { + this.logger.error("Redirect received. Not supported."); + this.unregistered(); + if (options.requestDelegate && options.requestDelegate.onRedirect) { + options.requestDelegate.onRedirect(response); + } + this.waitingToggle(false); + }, + onReject: (response) => { + if (response.message.statusCode === 423) { + // If a UA receives a 423 (Interval Too Brief) response, it MAY retry + // the registration after making the expiration interval of all contact + // addresses in the REGISTER request equal to or greater than the + // expiration interval within the Min-Expires header field of the 423 + // (Interval Too Brief) response. + // https://tools.ietf.org/html/rfc3261#section-10.2.8 + // + // The registrar MAY choose an expiration less than the requested + // expiration interval. If and only if the requested expiration + // interval is greater than zero AND smaller than one hour AND + // less than a registrar-configured minimum, the registrar MAY + // reject the registration with a response of 423 (Interval Too + // Brief). This response MUST contain a Min-Expires header field + // that states the minimum expiration interval the registrar is + // willing to honor. It then skips the remaining steps. + // https://tools.ietf.org/html/rfc3261#section-10.3 + if (!response.message.hasHeader("min-expires")) { + // This response MUST contain a Min-Expires header field + this.logger.error("423 response received for REGISTER without Min-Expires, dropping response"); + this.unregistered(); + this.waitingToggle(false); + return; + } + // Increase our registration interval to the suggested minimum + this.expires = Number(response.message.getHeader("min-expires")); + // Attempt the registration again immediately + this.waitingToggle(false); + this.register(); + return; + } + this.logger.warn(`Failed to register, status code ${response.message.statusCode}`); + // The Retry-After header field can be used with a 500 (Server Internal + // Error) or 503 (Service Unavailable) response to indicate how long the + // service is expected to be unavailable to the requesting client... + // https://tools.ietf.org/html/rfc3261#section-20.33 + let retryAfterDuration = NaN; + if (response.message.statusCode === 500 || response.message.statusCode === 503) { + const header = response.message.getHeader("retry-after"); + if (header) { + retryAfterDuration = Number.parseInt(header, undefined); + } + } + // Set for the state change (if any) and the delegate callback (if any) + this._retryAfter = isNaN(retryAfterDuration) ? undefined : retryAfterDuration; + this.unregistered(); + if (options.requestDelegate && options.requestDelegate.onReject) { + options.requestDelegate.onReject(response); + } + this._retryAfter = undefined; + this.waitingToggle(false); + }, + onTrying: (response) => { + if (options.requestDelegate && options.requestDelegate.onTrying) { + options.requestDelegate.onTrying(response); + } + } + }); + return Promise.resolve(outgoingRegisterRequest); + } + /** + * Sends the REGISTER request with expires equal to zero. + * @remarks + * Rejects with `RequestPendingError` if a REGISTER request is already in progress. + */ + unregister(options = {}) { + if (this.state === _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + this.stateError(); + throw new Error("Registerer terminated. Unable to register."); + } + if (this.disposed) { + if (this.state !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered) { + // allows unregister while disposing and registered + this.stateError(); + throw new Error("Registerer disposed. Unable to register."); + } + } + // UAs MUST NOT send a new registration (that is, containing new Contact + // header field values, as opposed to a retransmission) until they have + // received a final response from the registrar for the previous one or + // the previous REGISTER request has timed out. + // https://tools.ietf.org/html/rfc3261#section-10.2 + if (this.waiting) { + this.waitingWarning(); + const error = new _exceptions__WEBPACK_IMPORTED_MODULE_5__.RequestPendingError("REGISTER request already in progress, waiting for final response"); + return Promise.reject(error); + } + if (this._state !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered && !options.all) { + this.logger.warn("Not currently registered, but sending an unregister anyway."); + } + // Extra headers + const extraHeaders = ((options.requestOptions && options.requestOptions.extraHeaders) || []).slice(); + this.request.extraHeaders = extraHeaders; + // Registrations are soft state and expire unless refreshed, but can + // also be explicitly removed. A client can attempt to influence the + // expiration interval selected by the registrar as described in Section + // 10.2.1. A UA requests the immediate removal of a binding by + // specifying an expiration interval of "0" for that contact address in + // a REGISTER request. UAs SHOULD support this mechanism so that + // bindings can be removed before their expiration interval has passed. + // + // The REGISTER-specific Contact header field value of "*" applies to + // all registrations, but it MUST NOT be used unless the Expires header + // field is present with a value of "0". + // https://tools.ietf.org/html/rfc3261#section-10.2.2 + if (options.all) { + extraHeaders.push("Contact: *"); + extraHeaders.push("Expires: 0"); + } + else { + extraHeaders.push("Contact: " + this.generateContactHeader(0)); + } + // Call-ID: All registrations from a UAC SHOULD use the same Call-ID + // header field value for registrations sent to a particular + // registrar. + // + // CSeq: The CSeq value guarantees proper ordering of REGISTER + // requests. A UA MUST increment the CSeq value by one for each + // REGISTER request with the same Call-ID. + // https://tools.ietf.org/html/rfc3261#section-10.2 + this.request.cseq++; + this.request.setHeader("cseq", this.request.cseq + " REGISTER"); + // Pre-emptive clear the registration timer to avoid a race condition where + // this timer fires while waiting for a final response to the unsubscribe. + if (this.registrationTimer !== undefined) { + clearTimeout(this.registrationTimer); + this.registrationTimer = undefined; + } + this.waitingToggle(true); + const outgoingRegisterRequest = this.userAgent.userAgentCore.register(this.request, { + onAccept: (response) => { + this._contacts = response.message.getHeaders("contact"); // Update contacts + this.unregistered(); + if (options.requestDelegate && options.requestDelegate.onAccept) { + options.requestDelegate.onAccept(response); + } + this.waitingToggle(false); + }, + onProgress: (response) => { + if (options.requestDelegate && options.requestDelegate.onProgress) { + options.requestDelegate.onProgress(response); + } + }, + onRedirect: (response) => { + this.logger.error("Unregister redirected. Not currently supported."); + this.unregistered(); + if (options.requestDelegate && options.requestDelegate.onRedirect) { + options.requestDelegate.onRedirect(response); + } + this.waitingToggle(false); + }, + onReject: (response) => { + this.logger.error(`Unregister rejected with status code ${response.message.statusCode}`); + this.unregistered(); + if (options.requestDelegate && options.requestDelegate.onReject) { + options.requestDelegate.onReject(response); + } + this.waitingToggle(false); + }, + onTrying: (response) => { + if (options.requestDelegate && options.requestDelegate.onTrying) { + options.requestDelegate.onTrying(response); + } + } + }); + return Promise.resolve(outgoingRegisterRequest); + } + /** + * Clear registration timers. + */ + clearTimers() { + if (this.registrationTimer !== undefined) { + clearTimeout(this.registrationTimer); + this.registrationTimer = undefined; + } + if (this.registrationExpiredTimer !== undefined) { + clearTimeout(this.registrationExpiredTimer); + this.registrationExpiredTimer = undefined; + } + } + /** + * Generate Contact Header + */ + generateContactHeader(expires) { + let contact = this.userAgent.contact.toString(); + if (this.options.regId && this.options.instanceId) { + contact += ";reg-id=" + this.options.regId; + contact += ';+sip.instance=""'; + } + if (this.options.extraContactHeaderParams) { + this.options.extraContactHeaderParams.forEach((header) => { + contact += ";" + header; + }); + } + contact += ";expires=" + expires; + return contact; + } + /** + * Helper function, called when registered. + */ + registered(expires) { + this.clearTimers(); + // Re-Register before the expiration interval has elapsed. + // For that, calculate the delay as a percentage of the expiration time + this.registrationTimer = setTimeout(() => { + this.registrationTimer = undefined; + this.register(); + }, (this.refreshFrequency / 100) * expires * 1000); + // We are unregistered if the registration expires. + this.registrationExpiredTimer = setTimeout(() => { + this.logger.warn("Registration expired"); + this.unregistered(); + }, expires * 1000); + if (this._state !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered) { + this.stateTransition(_registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered); + } + } + /** + * Helper function, called when unregistered. + */ + unregistered() { + this.clearTimers(); + if (this._state !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Unregistered) { + this.stateTransition(_registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Unregistered); + } + } + /** + * Helper function, called when terminated. + */ + terminated() { + this.clearTimers(); + if (this._state !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + this.stateTransition(_registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated); + } + } + /** + * Transition registration state. + */ + stateTransition(newState) { + const invalidTransition = () => { + throw new Error(`Invalid state transition from ${this._state} to ${newState}`); + }; + // Validate transition + switch (this._state) { + case _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Initial: + if (newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered && + newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Unregistered && + newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + invalidTransition(); + } + break; + case _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered: + if (newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Unregistered && newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + invalidTransition(); + } + break; + case _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Unregistered: + if (newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Registered && newState !== _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + invalidTransition(); + } + break; + case _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated: + invalidTransition(); + break; + default: + throw new Error("Unrecognized state."); + } + // Transition + this._state = newState; + this.logger.log(`Registration transitioned to state ${this._state}`); + this._stateEventEmitter.emit(this._state); + // Dispose + if (newState === _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated) { + this.dispose(); + } + } + /** True if the registerer is currently waiting for final response to a REGISTER request. */ + get waiting() { + return this._waiting; + } + /** Emits when the registerer waiting state changes. */ + get waitingChange() { + return this._waitingEventEmitter; + } + /** + * Toggle waiting. + */ + waitingToggle(waiting) { + if (this._waiting === waiting) { + throw new Error(`Invalid waiting transition from ${this._waiting} to ${waiting}`); + } + this._waiting = waiting; + this.logger.log(`Waiting toggled to ${this._waiting}`); + this._waitingEventEmitter.emit(this._waiting); + } + /** Hopefully helpful as the standard behavior has been found to be unexpected. */ + waitingWarning() { + let message = "An attempt was made to send a REGISTER request while a prior one was still in progress."; + message += " RFC 3261 requires UAs MUST NOT send a new registration until they have received a final response"; + message += " from the registrar for the previous one or the previous REGISTER request has timed out."; + message += " Note that if the transport disconnects, you still must wait for the prior request to time out before"; + message += + " sending a new REGISTER request or alternatively dispose of the current Registerer and create a new Registerer."; + this.logger.warn(message); + } + /** Hopefully helpful as the standard behavior has been found to be unexpected. */ + stateError() { + const reason = this.state === _registerer_state__WEBPACK_IMPORTED_MODULE_0__.RegistererState.Terminated ? "is in 'Terminated' state" : "has been disposed"; + let message = `An attempt was made to send a REGISTER request when the Registerer ${reason}.`; + message += " The Registerer transitions to 'Terminated' when Registerer.dispose() is called."; + message += " Perhaps you called UserAgent.stop() which dipsoses of all Registerers?"; + this.logger.error(message); + } +} +Registerer.defaultExpires = 600; +Registerer.defaultRefreshFrequency = 99; + + +/***/ }), +/* 43 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Subscriber": () => (/* binding */ Subscriber) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(17); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29); +/* harmony import */ var _core_user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(28); +/* harmony import */ var _notification__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(32); +/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44); +/* harmony import */ var _subscription_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(45); + + + + + +/** + * A subscriber establishes a {@link Subscription} (outgoing SUBSCRIBE). + * + * @remarks + * This is (more or less) an implementation of a "subscriber" as + * defined in RFC 6665 "SIP-Specific Event Notifications". + * https://tools.ietf.org/html/rfc6665 + * + * @example + * ```ts + * // Create a new subscriber. + * const targetURI = new URI("sip", "alice", "example.com"); + * const eventType = "example-name"; // https://www.iana.org/assignments/sip-events/sip-events.xhtml + * const subscriber = new Subscriber(userAgent, targetURI, eventType); + * + * // Add delegate to handle event notifications. + * subscriber.delegate = { + * onNotify: (notification: Notification) => { + * // handle notification here + * } + * }; + * + * // Monitor subscription state changes. + * subscriber.stateChange.addListener((newState: SubscriptionState) => { + * if (newState === SubscriptionState.Terminated) { + * // handle state change here + * } + * }); + * + * // Attempt to establish the subscription + * subscriber.subscribe(); + * + * // Sometime later when done with subscription + * subscriber.unsubscribe(); + * ``` + * + * @public + */ +class Subscriber extends _subscription__WEBPACK_IMPORTED_MODULE_0__.Subscription { + /** + * Constructor. + * @param userAgent - User agent. See {@link UserAgent} for details. + * @param targetURI - The request URI identifying the subscribed event. + * @param eventType - The event type identifying the subscribed event. + * @param options - Options bucket. See {@link SubscriberOptions} for details. + */ + constructor(userAgent, targetURI, eventType, options = {}) { + super(userAgent, options); + this.body = undefined; + this.logger = userAgent.getLogger("sip.Subscriber"); + if (options.body) { + this.body = { + body: options.body, + contentType: options.contentType ? options.contentType : "application/sdp" + }; + } + this.targetURI = targetURI; + // Subscription event + this.event = eventType; + // Subscription expires + if (options.expires === undefined) { + this.expires = 3600; + } + else if (typeof options.expires !== "number") { + // pre-typescript type guard + this.logger.warn(`Option "expires" must be a number. Using default of 3600.`); + this.expires = 3600; + } + else { + this.expires = options.expires; + } + // Subscription extra headers + this.extraHeaders = (options.extraHeaders || []).slice(); + // Subscription context. + this.subscriberRequest = this.initSubscriberRequest(); + this.outgoingRequestMessage = this.subscriberRequest.message; + // Add to UserAgent's collection + this.id = this.outgoingRequestMessage.callId + this.outgoingRequestMessage.from.parameters.tag + this.event; + this._userAgent._subscriptions[this.id] = this; + } + /** + * Destructor. + * @internal + */ + dispose() { + if (this.disposed) { + return Promise.resolve(); + } + this.logger.log(`Subscription ${this.id} in state ${this.state} is being disposed`); + // Remove from the user agent's subscription collection + delete this._userAgent._subscriptions[this.id]; + // Clear timers + if (this.retryAfterTimer) { + clearTimeout(this.retryAfterTimer); + this.retryAfterTimer = undefined; + } + // Dispose subscriber request + this.subscriberRequest.dispose(); + // Make sure to dispose of our parent, then unsubscribe the + // subscription dialog (if need be) and resolve when it has terminated. + return super.dispose().then(() => { + // If we have never subscribed there is nothing to wait on. + // If we are already transitioned to terminated there is no need to unsubscribe again. + if (this.state !== _subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Subscribed) { + return; + } + if (!this._dialog) { + throw new Error("Dialog undefined."); + } + if (this._dialog.subscriptionState === _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Pending || + this._dialog.subscriptionState === _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Active) { + const dialog = this._dialog; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + return new Promise((resolve, reject) => { + dialog.delegate = { + onTerminated: () => resolve() + }; + dialog.unsubscribe(); + }); + } + }); + } + /** + * Subscribe to event notifications. + * + * @remarks + * Send an initial SUBSCRIBE request if no subscription as been established. + * Sends a re-SUBSCRIBE request if the subscription is "active". + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + subscribe(options = {}) { + switch (this.subscriberRequest.state) { + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Initial: + // we can end up here when retrying so only state transition if in SubscriptionState.Initial state + if (this.state === _subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Initial) { + this.stateTransition(_subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.NotifyWait); + } + this.subscriberRequest.subscribe().then((result) => { + if (result.success) { + if (result.success.subscription) { + this._dialog = result.success.subscription; + this._dialog.delegate = { + onNotify: (request) => this.onNotify(request), + onRefresh: (request) => this.onRefresh(request), + onTerminated: () => { + // If a call to unsubscribe will state transition to SubscriptionState.Terminated, + // but we can end up here after that if the NOTIFY never arrives and timer N fires. + if (this.state !== _subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Terminated) { + this.stateTransition(_subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Terminated); + } + } + }; + } + this.onNotify(result.success.request); + } + else if (result.failure) { + this.unsubscribe(); + } + }); + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.NotifyWait: + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Pending: + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Active: + if (this._dialog) { + const request = this._dialog.refresh(); + request.delegate = { + onAccept: (response) => this.onAccepted(response), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onRedirect: (response) => this.unsubscribe(), + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onReject: (response) => this.unsubscribe() + }; + } + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Terminated: + break; + default: + break; + } + return Promise.resolve(); + } + /** + * {@inheritDoc Subscription.unsubscribe} + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + unsubscribe(options = {}) { + if (this.disposed) { + return Promise.resolve(); + } + switch (this.subscriberRequest.state) { + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Initial: + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.NotifyWait: + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Pending: + if (this._dialog) { + this._dialog.unsubscribe(); + // responses intentionally ignored + } + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Active: + if (this._dialog) { + this._dialog.unsubscribe(); + // responses intentionally ignored + } + break; + case _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Terminated: + break; + default: + throw new Error("Unknown state."); + } + this.stateTransition(_subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Terminated); + return Promise.resolve(); + } + /** + * Sends a re-SUBSCRIBE request if the subscription is "active". + * @deprecated Use `subscribe` instead. + * @internal + */ + _refresh() { + if (this.subscriberRequest.state === _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Active) { + return this.subscribe(); + } + return Promise.resolve(); + } + /** @internal */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onAccepted(response) { + // NOTE: If you think you should do something with this response, + // please make sure you understand what it is you are doing and why. + // Per the RFC, the first NOTIFY is all that actually matters. + } + /** @internal */ + onNotify(request) { + // If we've set state to done, no further processing should take place + // and we are only interested in cleaning up after the appropriate NOTIFY. + if (this.disposed) { + request.accept(); + return; + } + // State transition if needed. + if (this.state !== _subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Subscribed) { + this.stateTransition(_subscription_state__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState.Subscribed); + } + // Delegate notification. + if (this.delegate && this.delegate.onNotify) { + const notification = new _notification__WEBPACK_IMPORTED_MODULE_3__.Notification(request); + this.delegate.onNotify(notification); + } + else { + request.accept(); + } + // If the "Subscription-State" value is SubscriptionState.Terminated, the subscriber + // MUST consider the subscription terminated. The "expires" parameter + // has no semantics for SubscriptionState.Terminated -- notifiers SHOULD NOT include an + // "expires" parameter on a "Subscription-State" header field with a + // value of SubscriptionState.Terminated, and subscribers MUST ignore any such + // parameter, if present. If a reason code is present, the client + // should behave as described below. If no reason code or an unknown + // reason code is present, the client MAY attempt to re-subscribe at any + // time (unless a "retry-after" parameter is present, in which case the + // client SHOULD NOT attempt re-subscription until after the number of + // seconds specified by the "retry-after" parameter). The reason codes + // defined by this document are: + // https://tools.ietf.org/html/rfc6665#section-4.1.3 + const subscriptionState = request.message.parseHeader("Subscription-State"); + if (subscriptionState && subscriptionState.state) { + switch (subscriptionState.state) { + case "terminated": + if (subscriptionState.reason) { + this.logger.log(`Terminated subscription with reason ${subscriptionState.reason}`); + switch (subscriptionState.reason) { + case "deactivated": + case "timeout": + this.initSubscriberRequest(); + this.subscribe(); + return; + case "probation": + case "giveup": + this.initSubscriberRequest(); + if (subscriptionState.params && subscriptionState.params["retry-after"]) { + this.retryAfterTimer = setTimeout(() => { + this.subscribe(); + }, subscriptionState.params["retry-after"]); + } + else { + this.subscribe(); + } + return; + case "rejected": + case "noresource": + case "invariant": + break; + } + } + this.unsubscribe(); + break; + default: + break; + } + } + } + /** @internal */ + onRefresh(request) { + request.delegate = { + onAccept: (response) => this.onAccepted(response) + }; + } + initSubscriberRequest() { + const options = { + extraHeaders: this.extraHeaders, + body: this.body ? (0,_core__WEBPACK_IMPORTED_MODULE_4__.fromBodyLegacy)(this.body) : undefined + }; + // eslint-disable-next-line @typescript-eslint/no-use-before-define + this.subscriberRequest = new SubscriberRequest(this._userAgent.userAgentCore, this.targetURI, this.event, this.expires, options); + this.subscriberRequest.delegate = { + onAccept: (response) => this.onAccepted(response) + }; + return this.subscriberRequest; + } +} +class SubscriberRequest { + constructor(core, target, event, expires, options, delegate) { + this.core = core; + this.target = target; + this.event = event; + this.expires = expires; + this.subscribed = false; + this.logger = core.loggerFactory.getLogger("sip.Subscriber"); + this.delegate = delegate; + const allowHeader = "Allow: " + _core_user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_5__.AllowedMethods.toString(); + const extraHeaders = ((options && options.extraHeaders) || []).slice(); + extraHeaders.push(allowHeader); + extraHeaders.push("Event: " + this.event); + extraHeaders.push("Expires: " + this.expires); + extraHeaders.push("Contact: " + this.core.configuration.contact.toString()); + const body = options && options.body; + this.message = core.makeOutgoingRequestMessage(_core__WEBPACK_IMPORTED_MODULE_6__.C.SUBSCRIBE, this.target, this.core.configuration.aor, this.target, {}, extraHeaders, body); + } + /** Destructor. */ + dispose() { + if (this.request) { + this.request.waitNotifyStop(); + this.request.dispose(); + this.request = undefined; + } + } + /** Subscription state. */ + get state() { + if (this.subscription) { + return this.subscription.subscriptionState; + } + else if (this.subscribed) { + return _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.NotifyWait; + } + else { + return _core__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Initial; + } + } + /** + * Establish subscription. + * @param options Options bucket. + */ + subscribe() { + if (this.subscribed) { + return Promise.reject(new Error("Not in initial state. Did you call subscribe more than once?")); + } + this.subscribed = true; + return new Promise((resolve) => { + if (!this.message) { + throw new Error("Message undefined."); + } + this.request = this.core.subscribe(this.message, { + // This SUBSCRIBE request will be confirmed with a final response. + // 200-class responses indicate that the subscription has been accepted + // and that a NOTIFY request will be sent immediately. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.1 + onAccept: (response) => { + if (this.delegate && this.delegate.onAccept) { + this.delegate.onAccept(response); + } + }, + // Due to the potential for out-of-order messages, packet loss, and + // forking, the subscriber MUST be prepared to receive NOTIFY requests + // before the SUBSCRIBE transaction has completed. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.4 + onNotify: (requestWithSubscription) => { + this.subscription = requestWithSubscription.subscription; + if (this.subscription) { + this.subscription.autoRefresh = true; + } + resolve({ success: requestWithSubscription }); + }, + // If this Timer N expires prior to the receipt of a NOTIFY request, + // the subscriber considers the subscription failed, and cleans up + // any state associated with the subscription attempt. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.4 + onNotifyTimeout: () => { + resolve({ failure: {} }); + }, + // This SUBSCRIBE request will be confirmed with a final response. + // Non-200-class final responses indicate that no subscription or new + // dialog usage has been created, and no subsequent NOTIFY request will + // be sent. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.1 + onRedirect: (response) => { + resolve({ failure: { response } }); + }, + // This SUBSCRIBE request will be confirmed with a final response. + // Non-200-class final responses indicate that no subscription or new + // dialog usage has been created, and no subsequent NOTIFY request will + // be sent. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.1 + onReject: (response) => { + resolve({ failure: { response } }); + } + }); + }); + } +} + + +/***/ }), +/* 44 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Subscription": () => (/* binding */ Subscription) +/* harmony export */ }); +/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); +/* harmony import */ var _subscription_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(45); + + +/** + * A subscription provides {@link Notification} of events. + * + * @remarks + * See {@link Subscriber} for details on establishing a subscription. + * + * @public + */ +class Subscription { + /** + * Constructor. + * @param userAgent - User agent. See {@link UserAgent} for details. + * @internal + */ + constructor(userAgent, options = {}) { + this._disposed = false; + this._state = _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Initial; + this._logger = userAgent.getLogger("sip.Subscription"); + this._stateEventEmitter = new _emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + this._userAgent = userAgent; + this.delegate = options.delegate; + } + /** + * Destructor. + */ + dispose() { + if (this._disposed) { + return Promise.resolve(); + } + this._disposed = true; + this._stateEventEmitter.removeAllListeners(); + return Promise.resolve(); + } + /** + * The subscribed subscription dialog. + */ + get dialog() { + return this._dialog; + } + /** + * True if disposed. + * @internal + */ + get disposed() { + return this._disposed; + } + /** + * Subscription state. See {@link SubscriptionState} for details. + */ + get state() { + return this._state; + } + /** + * Emits when the subscription `state` property changes. + */ + get stateChange() { + return this._stateEventEmitter; + } + /** @internal */ + stateTransition(newState) { + const invalidTransition = () => { + throw new Error(`Invalid state transition from ${this._state} to ${newState}`); + }; + // Validate transition + switch (this._state) { + case _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Initial: + if (newState !== _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.NotifyWait && newState !== _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Terminated) { + invalidTransition(); + } + break; + case _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.NotifyWait: + if (newState !== _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Subscribed && newState !== _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Terminated) { + invalidTransition(); + } + break; + case _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Subscribed: + if (newState !== _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Terminated) { + invalidTransition(); + } + break; + case _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Terminated: + invalidTransition(); + break; + default: + throw new Error("Unrecognized state."); + } + // Guard against duplicate transition + if (this._state === newState) { + return; + } + // Transition + this._state = newState; + this._logger.log(`Subscription ${this._dialog ? this._dialog.id : undefined} transitioned to ${this._state}`); + this._stateEventEmitter.emit(this._state); + // Dispose + if (newState === _subscription_state__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState.Terminated) { + this.dispose(); + } + } +} + + +/***/ }), +/* 45 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SubscriptionState": () => (/* binding */ SubscriptionState) +/* harmony export */ }); +/** + * {@link Subscription} state. + * @remarks + * The {@link Subscription} behaves in a deterministic manner according to the following + * Finite State Machine (FSM). + * ```txt + * _______________________________________ + * Subscription | v + * Constructed -> Initial -> NotifyWait -> Subscribed -> Terminated + * |____________________________^ + * ``` + * @public + */ +var SubscriptionState; +(function (SubscriptionState) { + SubscriptionState["Initial"] = "Initial"; + SubscriptionState["NotifyWait"] = "NotifyWait"; + SubscriptionState["Subscribed"] = "Subscribed"; + SubscriptionState["Terminated"] = "Terminated"; +})(SubscriptionState || (SubscriptionState = {})); + + +/***/ }), +/* 46 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SubscriptionState": () => (/* binding */ SubscriptionState) +/* harmony export */ }); +/** + * Subscription state. + * @remarks + * https://tools.ietf.org/html/rfc6665#section-4.1.2 + * @public + */ +var SubscriptionState; +(function (SubscriptionState) { + SubscriptionState["Initial"] = "Initial"; + SubscriptionState["NotifyWait"] = "NotifyWait"; + SubscriptionState["Pending"] = "Pending"; + SubscriptionState["Active"] = "Active"; + SubscriptionState["Terminated"] = "Terminated"; +})(SubscriptionState || (SubscriptionState = {})); + + +/***/ }), +/* 47 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TransportState": () => (/* binding */ TransportState) +/* harmony export */ }); +/** + * {@link Transport} state. + * + * @remarks + * The {@link Transport} behaves in a deterministic manner according to the following + * Finite State Machine (FSM). + * ```txt + * ______________________________ + * | ____________ | + * Transport v v | | + * Constructed -> Disconnected -> Connecting -> Connected -> Disconnecting + * ^ ^ |_____________________^ | | + * | |_____________________________| | + * |_____________________________________________| + * ``` + * @public + */ +var TransportState; +(function (TransportState) { + /** + * The `connect()` method was called. + */ + TransportState["Connecting"] = "Connecting"; + /** + * The `connect()` method resolved. + */ + TransportState["Connected"] = "Connected"; + /** + * The `disconnect()` method was called. + */ + TransportState["Disconnecting"] = "Disconnecting"; + /** + * The `connect()` method was rejected, or + * the `disconnect()` method completed, or + * network connectivity was lost. + */ + TransportState["Disconnected"] = "Disconnected"; +})(TransportState || (TransportState = {})); + + +/***/ }), +/* 48 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "UserAgentState": () => (/* binding */ UserAgentState) +/* harmony export */ }); +/** + * {@link UserAgent} state. + * @remarks + * Valid state transitions: + * ``` + * 1. "Started" --> "Stopped" + * 2. "Stopped" --> "Started" + * ``` + * @public + */ +var UserAgentState; +(function (UserAgentState) { + UserAgentState["Started"] = "Started"; + UserAgentState["Stopped"] = "Stopped"; +})(UserAgentState || (UserAgentState = {})); + + +/***/ }), +/* 49 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "UserAgent": () => (/* binding */ UserAgent) +/* harmony export */ }); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(23); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(50); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(51); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(21); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(58); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(60); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(98); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(18); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(26); +/* harmony import */ var _core_messages_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(20); +/* harmony import */ var _platform_web_session_description_handler__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(53); +/* harmony import */ var _platform_web_transport__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(57); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(1); +/* harmony import */ var _emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); +/* harmony import */ var _invitation__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(14); +/* harmony import */ var _inviter__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(37); +/* harmony import */ var _message__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(31); +/* harmony import */ var _notification__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(32); +/* harmony import */ var _user_agent_options__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(34); +/* harmony import */ var _user_agent_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(48); + + + + + + + + + + + + +/** + * A user agent sends and receives requests using a `Transport`. + * + * @remarks + * A user agent (UA) is associated with a user via the user's SIP address of record (AOR) + * and acts on behalf of that user to send and receive SIP requests. The user agent can + * register to receive incoming requests, as well as create and send outbound messages. + * The user agent also maintains the Transport over which its signaling travels. + * + * @public + */ +class UserAgent { + /** + * Constructs a new instance of the `UserAgent` class. + * @param options - Options bucket. See {@link UserAgentOptions} for details. + */ + constructor(options = {}) { + /** @internal */ + this._publishers = {}; + /** @internal */ + this._registerers = {}; + /** @internal */ + this._sessions = {}; + /** @internal */ + this._subscriptions = {}; + this._state = _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped; + /** Unload listener. */ + this.unloadListener = () => { + this.stop(); + }; + // state emitter + this._stateEventEmitter = new _emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + // initialize delegate + this.delegate = options.delegate; + // initialize configuration + this.options = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, UserAgent.defaultOptions()), { sipjsId: (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_2__.createRandomToken)(5) }), { uri: new _core__WEBPACK_IMPORTED_MODULE_3__.URI("sip", "anonymous." + (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_2__.createRandomToken)(6), "anonymous.invalid") }), { viaHost: (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_2__.createRandomToken)(12) + ".invalid" }), UserAgent.stripUndefinedProperties(options)); + // viaHost is hack + if (this.options.hackIpInContact) { + if (typeof this.options.hackIpInContact === "boolean" && this.options.hackIpInContact) { + const from = 1; + const to = 254; + const octet = Math.floor(Math.random() * (to - from + 1) + from); + // random Test-Net IP (http://tools.ietf.org/html/rfc5735) + this.options.viaHost = "192.0.2." + octet; + } + else if (this.options.hackIpInContact) { + this.options.viaHost = this.options.hackIpInContact; + } + } + // initialize logger & logger factory + this.loggerFactory = new _core__WEBPACK_IMPORTED_MODULE_4__.LoggerFactory(); + this.logger = this.loggerFactory.getLogger("sip.UserAgent"); + this.loggerFactory.builtinEnabled = this.options.logBuiltinEnabled; + this.loggerFactory.connector = this.options.logConnector; + switch (this.options.logLevel) { + case "error": + this.loggerFactory.level = _core__WEBPACK_IMPORTED_MODULE_5__.Levels.error; + break; + case "warn": + this.loggerFactory.level = _core__WEBPACK_IMPORTED_MODULE_5__.Levels.warn; + break; + case "log": + this.loggerFactory.level = _core__WEBPACK_IMPORTED_MODULE_5__.Levels.log; + break; + case "debug": + this.loggerFactory.level = _core__WEBPACK_IMPORTED_MODULE_5__.Levels.debug; + break; + default: + break; + } + if (this.options.logConfiguration) { + this.logger.log("Configuration:"); + Object.keys(this.options).forEach((key) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const value = this.options[key]; + switch (key) { + case "uri": + case "sessionDescriptionHandlerFactory": + this.logger.log("· " + key + ": " + value); + break; + case "authorizationPassword": + this.logger.log("· " + key + ": " + "NOT SHOWN"); + break; + case "transportConstructor": + this.logger.log("· " + key + ": " + value.name); + break; + default: + this.logger.log("· " + key + ": " + JSON.stringify(value)); + } + }); + } + // guard deprecated transport options (remove this in version 16.x) + if (this.options.transportOptions) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const optionsDeprecated = this.options.transportOptions; + const maxReconnectionAttemptsDeprecated = optionsDeprecated.maxReconnectionAttempts; + const reconnectionTimeoutDeprecated = optionsDeprecated.reconnectionTimeout; + if (maxReconnectionAttemptsDeprecated !== undefined) { + const deprecatedMessage = `The transport option "maxReconnectionAttempts" as has apparently been specified and has been deprecated. ` + + "It will no longer be available starting with SIP.js release 0.16.0. Please update accordingly."; + this.logger.warn(deprecatedMessage); + } + if (reconnectionTimeoutDeprecated !== undefined) { + const deprecatedMessage = `The transport option "reconnectionTimeout" as has apparently been specified and has been deprecated. ` + + "It will no longer be available starting with SIP.js release 0.16.0. Please update accordingly."; + this.logger.warn(deprecatedMessage); + } + // hack + if (options.reconnectionDelay === undefined && reconnectionTimeoutDeprecated !== undefined) { + this.options.reconnectionDelay = reconnectionTimeoutDeprecated; + } + if (options.reconnectionAttempts === undefined && maxReconnectionAttemptsDeprecated !== undefined) { + this.options.reconnectionAttempts = maxReconnectionAttemptsDeprecated; + } + } + // guard deprecated user agent options (remove this in version 16.x) + if (options.reconnectionDelay !== undefined) { + const deprecatedMessage = `The user agent option "reconnectionDelay" as has apparently been specified and has been deprecated. ` + + "It will no longer be available starting with SIP.js release 0.16.0. Please update accordingly."; + this.logger.warn(deprecatedMessage); + } + if (options.reconnectionAttempts !== undefined) { + const deprecatedMessage = `The user agent option "reconnectionAttempts" as has apparently been specified and has been deprecated. ` + + "It will no longer be available starting with SIP.js release 0.16.0. Please update accordingly."; + this.logger.warn(deprecatedMessage); + } + // Initialize Transport + this._transport = new this.options.transportConstructor(this.getLogger("sip.Transport"), this.options.transportOptions); + this.initTransportCallbacks(); + // Initialize Contact + this._contact = this.initContact(); + // Initialize UserAgentCore + this._userAgentCore = this.initCore(); + if (this.options.autoStart) { + this.start(); + } + } + /** + * Create a URI instance from a string. + * @param uri - The string to parse. + * + * @example + * ```ts + * const uri = UserAgent.makeURI("sip:edgar@example.com"); + * ``` + */ + static makeURI(uri) { + return _core__WEBPACK_IMPORTED_MODULE_6__.Grammar.URIParse(uri); + } + /** Default user agent options. */ + static defaultOptions() { + return { + allowLegacyNotifications: false, + authorizationHa1: "", + authorizationPassword: "", + authorizationUsername: "", + autoStart: false, + autoStop: true, + delegate: {}, + contactName: "", + contactParams: { transport: "ws" }, + displayName: "", + forceRport: false, + hackAllowUnregisteredOptionTags: false, + hackIpInContact: false, + hackViaTcp: false, + logBuiltinEnabled: true, + logConfiguration: true, + logConnector: () => { + /* noop */ + }, + logLevel: "log", + noAnswerTimeout: 60, + preloadedRouteSet: [], + reconnectionAttempts: 0, + reconnectionDelay: 4, + sendInitialProvisionalResponse: true, + sessionDescriptionHandlerFactory: (0,_platform_web_session_description_handler__WEBPACK_IMPORTED_MODULE_7__.defaultSessionDescriptionHandlerFactory)(), + sessionDescriptionHandlerFactoryOptions: {}, + sipExtension100rel: _user_agent_options__WEBPACK_IMPORTED_MODULE_8__.SIPExtension.Unsupported, + sipExtensionReplaces: _user_agent_options__WEBPACK_IMPORTED_MODULE_8__.SIPExtension.Unsupported, + sipExtensionExtraSupported: [], + sipjsId: "", + transportConstructor: _platform_web_transport__WEBPACK_IMPORTED_MODULE_9__.Transport, + transportOptions: {}, + uri: new _core__WEBPACK_IMPORTED_MODULE_3__.URI("sip", "anonymous", "anonymous.invalid"), + userAgentString: "SIP.js/" + _version__WEBPACK_IMPORTED_MODULE_10__.LIBRARY_VERSION, + viaHost: "" + }; + } + /** + * Strip properties with undefined values from options. + * This is a work around while waiting for missing vs undefined to be addressed (or not)... + * https://github.com/Microsoft/TypeScript/issues/13195 + * @param options - Options to reduce + */ + static stripUndefinedProperties(options) { + return Object.keys(options).reduce((object, key) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (options[key] !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + object[key] = options[key]; + } + return object; + }, {}); + } + /** + * User agent configuration. + */ + get configuration() { + return this.options; + } + /** + * User agent contact. + */ + get contact() { + return this._contact; + } + /** + * User agent state. + */ + get state() { + return this._state; + } + /** + * User agent state change emitter. + */ + get stateChange() { + return this._stateEventEmitter; + } + /** + * User agent transport. + */ + get transport() { + return this._transport; + } + /** + * User agent core. + */ + get userAgentCore() { + return this._userAgentCore; + } + /** + * The logger. + */ + getLogger(category, label) { + return this.loggerFactory.getLogger(category, label); + } + /** + * The logger factory. + */ + getLoggerFactory() { + return this.loggerFactory; + } + /** + * True if transport is connected. + */ + isConnected() { + return this.transport.isConnected(); + } + /** + * Reconnect the transport. + */ + reconnect() { + if (this.state === _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped) { + return Promise.reject(new Error("User agent stopped.")); + } + // Make sure we don't call synchronously + return Promise.resolve().then(() => this.transport.connect()); + } + /** + * Start the user agent. + * + * @remarks + * Resolves if transport connects, otherwise rejects. + * + * @example + * ```ts + * userAgent.start() + * .then(() => { + * // userAgent.isConnected() === true + * }) + * .catch((error: Error) => { + * // userAgent.isConnected() === false + * }); + * ``` + */ + start() { + if (this.state === _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Started) { + this.logger.warn(`User agent already started`); + return Promise.resolve(); + } + this.logger.log(`Starting ${this.configuration.uri}`); + // Transition state + this.transitionState(_user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Started); + // TODO: Review this as it is not clear it has any benefit and at worst causes additional load the server. + // On unload it may be best to simply in most scenarios to do nothing. Furthermore and regardless, this + // kind of behavior seems more appropriate to be managed by the consumer of the API than the API itself. + // Should this perhaps be deprecated? + // + // Add window unload event listener + if (this.options.autoStop) { + // Google Chrome Packaged Apps don't allow 'unload' listeners: unload is not available in packaged apps + const googleChromePackagedApp = typeof chrome !== "undefined" && chrome.app && chrome.app.runtime ? true : false; + if (typeof window !== "undefined" && typeof window.addEventListener === "function" && !googleChromePackagedApp) { + window.addEventListener("unload", this.unloadListener); + } + } + return this.transport.connect(); + } + /** + * Stop the user agent. + * + * @remarks + * Resolves when the user agent has completed a graceful shutdown. + * ```txt + * 1) Sessions terminate. + * 2) Registerers unregister. + * 3) Subscribers unsubscribe. + * 4) Publishers unpublish. + * 5) Transport disconnects. + * 6) User Agent Core resets. + * ``` + * NOTE: While this is a "graceful shutdown", it can also be very slow one if you + * are waiting for the returned Promise to resolve. The disposal of the clients and + * dialogs is done serially - waiting on one to finish before moving on to the next. + * This can be slow if there are lot of subscriptions to unsubscribe for example. + * + * THE SLOW PACE IS INTENTIONAL! + * While one could spin them all down in parallel, this could slam the remote server. + * It is bad practice to denial of service attack (DoS attack) servers!!! + * Moreover, production servers will automatically blacklist clients which send too + * many requests in too short a period of time - dropping any additional requests. + * + * If a different approach to disposing is needed, one can implement whatever is + * needed and execute that prior to calling `stop()`. Alternatively one may simply + * not wait for the Promise returned by `stop()` to complete. + */ + async stop() { + if (this.state === _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped) { + this.logger.warn(`User agent already stopped`); + return Promise.resolve(); + } + this.logger.log(`Stopping ${this.configuration.uri}`); + // Transition state + this.transitionState(_user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped); + // TODO: See comments with associated complimentary code in start(). Should this perhaps be deprecated? + // Remove window unload event listener + if (this.options.autoStop) { + // Google Chrome Packaged Apps don't allow 'unload' listeners: unload is not available in packaged apps + const googleChromePackagedApp = typeof chrome !== "undefined" && chrome.app && chrome.app.runtime ? true : false; + if (typeof window !== "undefined" && window.removeEventListener && !googleChromePackagedApp) { + window.removeEventListener("unload", this.unloadListener); + } + } + // Be careful here to use a local references as start() can be called + // again before we complete and we don't want to touch new clients + // and we don't want to step on the new instances (or vice versa). + const publishers = Object.assign({}, this._publishers); + const registerers = Object.assign({}, this._registerers); + const sessions = Object.assign({}, this._sessions); + const subscriptions = Object.assign({}, this._subscriptions); + const transport = this.transport; + const userAgentCore = this.userAgentCore; + // + // At this point we have completed the state transition and everything + // following will effectively run async and MUST NOT cause any issues + // if UserAgent.start() is called while the following code continues. + // + // TODO: Minor optimization. + // The disposal in all cases involves, in part, sending messages which + // is not worth doing if the transport is not connected as we know attempting + // to send messages will be futile. But none of these disposal methods check + // if that's is the case and it would be easy for them to do so at this point. + // Dispose of Registerers + this.logger.log(`Dispose of registerers`); + for (const id in registerers) { + if (registerers[id]) { + await registerers[id].dispose().catch((error) => { + this.logger.error(error.message); + delete this._registerers[id]; + throw error; + }); + } + } + // Dispose of Sessions + this.logger.log(`Dispose of sessions`); + for (const id in sessions) { + if (sessions[id]) { + await sessions[id].dispose().catch((error) => { + this.logger.error(error.message); + delete this._sessions[id]; + throw error; + }); + } + } + // Dispose of Subscriptions + this.logger.log(`Dispose of subscriptions`); + for (const id in subscriptions) { + if (subscriptions[id]) { + await subscriptions[id].dispose().catch((error) => { + this.logger.error(error.message); + delete this._subscriptions[id]; + throw error; + }); + } + } + // Dispose of Publishers + this.logger.log(`Dispose of publishers`); + for (const id in publishers) { + if (publishers[id]) { + await publishers[id].dispose().catch((error) => { + this.logger.error(error.message); + delete this._publishers[id]; + throw error; + }); + } + } + // Dispose of the transport (disconnecting) + this.logger.log(`Dispose of transport`); + await transport.dispose().catch((error) => { + this.logger.error(error.message); + throw error; + }); + // Dispose of the user agent core (resetting) + this.logger.log(`Dispose of core`); + userAgentCore.dispose(); + } + /** + * Used to avoid circular references. + * @internal + */ + _makeInviter(targetURI, options) { + return new _inviter__WEBPACK_IMPORTED_MODULE_11__.Inviter(this, targetURI, options); + } + /** + * Attempt reconnection up to `maxReconnectionAttempts` times. + * @param reconnectionAttempt - Current attempt number. + */ + attemptReconnection(reconnectionAttempt = 1) { + const reconnectionAttempts = this.options.reconnectionAttempts; + const reconnectionDelay = this.options.reconnectionDelay; + if (reconnectionAttempt > reconnectionAttempts) { + this.logger.log(`Maximum reconnection attempts reached`); + return; + } + this.logger.log(`Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - trying`); + setTimeout(() => { + this.reconnect() + .then(() => { + this.logger.log(`Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - succeeded`); + }) + .catch((error) => { + this.logger.error(error.message); + this.logger.log(`Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - failed`); + this.attemptReconnection(++reconnectionAttempt); + }); + }, reconnectionAttempt === 1 ? 0 : reconnectionDelay * 1000); + } + /** + * Initialize contact. + */ + initContact() { + const contactName = this.options.contactName !== "" ? this.options.contactName : (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_2__.createRandomToken)(8); + const contactParams = this.options.contactParams; + const contact = { + pubGruu: undefined, + tempGruu: undefined, + uri: new _core__WEBPACK_IMPORTED_MODULE_3__.URI("sip", contactName, this.options.viaHost, undefined, contactParams), + toString: (contactToStringOptions = {}) => { + const anonymous = contactToStringOptions.anonymous || false; + const outbound = contactToStringOptions.outbound || false; + let contactString = "<"; + if (anonymous) { + contactString += + this.contact.tempGruu || + `sip:anonymous@anonymous.invalid;transport=${contactParams.transport ? contactParams.transport : "ws"}`; + } + else { + contactString += this.contact.pubGruu || this.contact.uri; + } + if (outbound) { + contactString += ";ob"; + } + contactString += ">"; + return contactString; + } + }; + return contact; + } + /** + * Initialize user agent core. + */ + initCore() { + // supported options + let supportedOptionTags = []; + supportedOptionTags.push("outbound"); // TODO: is this really supported? + if (this.options.sipExtension100rel === _user_agent_options__WEBPACK_IMPORTED_MODULE_8__.SIPExtension.Supported) { + supportedOptionTags.push("100rel"); + } + if (this.options.sipExtensionReplaces === _user_agent_options__WEBPACK_IMPORTED_MODULE_8__.SIPExtension.Supported) { + supportedOptionTags.push("replaces"); + } + if (this.options.sipExtensionExtraSupported) { + supportedOptionTags.push(...this.options.sipExtensionExtraSupported); + } + if (!this.options.hackAllowUnregisteredOptionTags) { + supportedOptionTags = supportedOptionTags.filter((optionTag) => _user_agent_options__WEBPACK_IMPORTED_MODULE_8__.UserAgentRegisteredOptionTags[optionTag]); + } + supportedOptionTags = Array.from(new Set(supportedOptionTags)); // array of unique values + // FIXME: TODO: This was ported, but this is and was just plain broken. + const supportedOptionTagsResponse = supportedOptionTags.slice(); + if (this.contact.pubGruu || this.contact.tempGruu) { + supportedOptionTagsResponse.push("gruu"); + } + // core configuration + const userAgentCoreConfiguration = { + aor: this.options.uri, + contact: this.contact, + displayName: this.options.displayName, + loggerFactory: this.loggerFactory, + hackViaTcp: this.options.hackViaTcp, + routeSet: this.options.preloadedRouteSet, + supportedOptionTags, + supportedOptionTagsResponse, + sipjsId: this.options.sipjsId, + userAgentHeaderFieldValue: this.options.userAgentString, + viaForceRport: this.options.forceRport, + viaHost: this.options.viaHost, + authenticationFactory: () => { + const username = this.options.authorizationUsername + ? this.options.authorizationUsername + : this.options.uri.user; // if authorization username not provided, use uri user as username + const password = this.options.authorizationPassword ? this.options.authorizationPassword : undefined; + const ha1 = this.options.authorizationHa1 ? this.options.authorizationHa1 : undefined; + return new _core__WEBPACK_IMPORTED_MODULE_12__.DigestAuthentication(this.getLoggerFactory(), ha1, username, password); + }, + transportAccessor: () => this.transport + }; + const userAgentCoreDelegate = { + onInvite: (incomingInviteRequest) => { + var _a; + const invitation = new _invitation__WEBPACK_IMPORTED_MODULE_13__.Invitation(this, incomingInviteRequest); + incomingInviteRequest.delegate = { + onCancel: (cancel) => { + invitation._onCancel(cancel); + }, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + onTransportError: (error) => { + // A server transaction MUST NOT discard transaction state based only on + // encountering a non-recoverable transport error when sending a + // response. Instead, the associated INVITE server transaction state + // machine MUST remain in its current state. (Timers will eventually + // cause it to transition to the "Terminated" state). + // https://tools.ietf.org/html/rfc6026#section-7.1 + // As noted in the comment above, we are to leaving it to the transaction + // timers to eventually cause the transaction to sort itself out in the case + // of a transport failure in an invite server transaction. This delegate method + // is here simply here for completeness and to make it clear that it provides + // nothing more than informational hook into the core. That is, if you think + // you should be trying to deal with a transport error here, you are likely wrong. + this.logger.error("A transport error has occurred while handling an incoming INVITE request."); + } + }; + // FIXME: Ported - 100 Trying send should be configurable. + // Only required if TU will not respond in 200ms. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + incomingInviteRequest.trying(); + // The Replaces header contains information used to match an existing + // SIP dialog (call-id, to-tag, and from-tag). Upon receiving an INVITE + // with a Replaces header, the User Agent (UA) attempts to match this + // information with a confirmed or early dialog. + // https://tools.ietf.org/html/rfc3891#section-3 + if (this.options.sipExtensionReplaces !== _user_agent_options__WEBPACK_IMPORTED_MODULE_8__.SIPExtension.Unsupported) { + const message = incomingInviteRequest.message; + const replaces = message.parseHeader("replaces"); + if (replaces) { + const callId = replaces.call_id; + if (typeof callId !== "string") { + throw new Error("Type of call id is not string"); + } + const toTag = replaces.replaces_to_tag; + if (typeof toTag !== "string") { + throw new Error("Type of to tag is not string"); + } + const fromTag = replaces.replaces_from_tag; + if (typeof fromTag !== "string") { + throw new Error("type of from tag is not string"); + } + const targetDialogId = callId + toTag + fromTag; + const targetDialog = this.userAgentCore.dialogs.get(targetDialogId); + // If no match is found, the UAS rejects the INVITE and returns a 481 + // Call/Transaction Does Not Exist response. Likewise, if the Replaces + // header field matches a dialog which was not created with an INVITE, + // the UAS MUST reject the request with a 481 response. + // https://tools.ietf.org/html/rfc3891#section-3 + if (!targetDialog) { + invitation.reject({ statusCode: 481 }); + return; + } + // If the Replaces header field matches a confirmed dialog, it checks + // for the presence of the "early-only" flag in the Replaces header + // field. (This flag allows the UAC to prevent a potentially + // undesirable race condition described in Section 7.1.) If the flag is + // present, the UA rejects the request with a 486 Busy response. + // https://tools.ietf.org/html/rfc3891#section-3 + if (!targetDialog.early && replaces.early_only === true) { + invitation.reject({ statusCode: 486 }); + return; + } + // Provide a handle on the session being replaced. + const targetSession = this._sessions[callId + fromTag] || this._sessions[callId + toTag] || undefined; + if (!targetSession) { + throw new Error("Session does not exist."); + } + invitation._replacee = targetSession; + } + } + // Delegate invitation handling. + if ((_a = this.delegate) === null || _a === void 0 ? void 0 : _a.onInvite) { + if (invitation.autoSendAnInitialProvisionalResponse) { + invitation.progress().then(() => { + var _a; + if (((_a = this.delegate) === null || _a === void 0 ? void 0 : _a.onInvite) === undefined) { + throw new Error("onInvite undefined."); + } + this.delegate.onInvite(invitation); + }); + return; + } + this.delegate.onInvite(invitation); + return; + } + // A common scenario occurs when the callee is currently not willing or + // able to take additional calls at this end system. A 486 (Busy Here) + // SHOULD be returned in such a scenario. + // https://tools.ietf.org/html/rfc3261#section-13.3.1.3 + invitation.reject({ statusCode: 486 }); + }, + onMessage: (incomingMessageRequest) => { + if (this.delegate && this.delegate.onMessage) { + const message = new _message__WEBPACK_IMPORTED_MODULE_14__.Message(incomingMessageRequest); + this.delegate.onMessage(message); + } + else { + // Accept the MESSAGE request, but do nothing with it. + incomingMessageRequest.accept(); + } + }, + onNotify: (incomingNotifyRequest) => { + // NOTIFY requests are sent to inform subscribers of changes in state to + // which the subscriber has a subscription. Subscriptions are created + // using the SUBSCRIBE method. In legacy implementations, it is + // possible that other means of subscription creation have been used. + // However, this specification does not allow the creation of + // subscriptions except through SUBSCRIBE requests and (for backwards- + // compatibility) REFER requests [RFC3515]. + // https://tools.ietf.org/html/rfc6665#section-3.2 + if (this.delegate && this.delegate.onNotify) { + const notification = new _notification__WEBPACK_IMPORTED_MODULE_15__.Notification(incomingNotifyRequest); + this.delegate.onNotify(notification); + } + else { + // Per the above which obsoletes https://tools.ietf.org/html/rfc3265, + // the use of out of dialog NOTIFY is obsolete, but... + if (this.options.allowLegacyNotifications) { + incomingNotifyRequest.accept(); // Accept the NOTIFY request, but do nothing with it. + } + else { + incomingNotifyRequest.reject({ statusCode: 481 }); + } + } + }, + onRefer: (incomingReferRequest) => { + this.logger.warn("Received an out of dialog REFER request"); + // TOOD: this.delegate.onRefer(...) + if (this.delegate && this.delegate.onReferRequest) { + this.delegate.onReferRequest(incomingReferRequest); + } + else { + incomingReferRequest.reject({ statusCode: 405 }); + } + }, + onRegister: (incomingRegisterRequest) => { + this.logger.warn("Received an out of dialog REGISTER request"); + // TOOD: this.delegate.onRegister(...) + if (this.delegate && this.delegate.onRegisterRequest) { + this.delegate.onRegisterRequest(incomingRegisterRequest); + } + else { + incomingRegisterRequest.reject({ statusCode: 405 }); + } + }, + onSubscribe: (incomingSubscribeRequest) => { + this.logger.warn("Received an out of dialog SUBSCRIBE request"); + // TOOD: this.delegate.onSubscribe(...) + if (this.delegate && this.delegate.onSubscribeRequest) { + this.delegate.onSubscribeRequest(incomingSubscribeRequest); + } + else { + incomingSubscribeRequest.reject({ statusCode: 405 }); + } + } + }; + return new _core__WEBPACK_IMPORTED_MODULE_16__.UserAgentCore(userAgentCoreConfiguration, userAgentCoreDelegate); + } + initTransportCallbacks() { + this.transport.onConnect = () => this.onTransportConnect(); + this.transport.onDisconnect = (error) => this.onTransportDisconnect(error); + this.transport.onMessage = (message) => this.onTransportMessage(message); + } + onTransportConnect() { + if (this.state === _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped) { + return; + } + if (this.delegate && this.delegate.onConnect) { + this.delegate.onConnect(); + } + } + onTransportDisconnect(error) { + if (this.state === _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped) { + return; + } + if (this.delegate && this.delegate.onDisconnect) { + this.delegate.onDisconnect(error); + } + // Only attempt to reconnect if network/server dropped the connection. + if (error && this.options.reconnectionAttempts > 0) { + this.attemptReconnection(); + } + } + onTransportMessage(messageString) { + const message = _core__WEBPACK_IMPORTED_MODULE_17__.Parser.parseMessage(messageString, this.getLogger("sip.Parser")); + if (!message) { + this.logger.warn("Failed to parse incoming message. Dropping."); + return; + } + if (this.state === _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped && message instanceof _core__WEBPACK_IMPORTED_MODULE_18__.IncomingRequestMessage) { + this.logger.warn(`Received ${message.method} request while stopped. Dropping.`); + return; + } + // A valid SIP request formulated by a UAC MUST, at a minimum, contain + // the following header fields: To, From, CSeq, Call-ID, Max-Forwards, + // and Via; all of these header fields are mandatory in all SIP + // requests. + // https://tools.ietf.org/html/rfc3261#section-8.1.1 + const hasMinimumHeaders = () => { + const mandatoryHeaders = ["from", "to", "call_id", "cseq", "via"]; + for (const header of mandatoryHeaders) { + if (!message.hasHeader(header)) { + this.logger.warn(`Missing mandatory header field : ${header}.`); + return false; + } + } + return true; + }; + // Request Checks + if (message instanceof _core__WEBPACK_IMPORTED_MODULE_18__.IncomingRequestMessage) { + // This is port of SanityCheck.minimumHeaders(). + if (!hasMinimumHeaders()) { + this.logger.warn(`Request missing mandatory header field. Dropping.`); + return; + } + // FIXME: This is non-standard and should be a configurable behavior (desirable regardless). + // Custom SIP.js check to reject request from ourself (this instance of SIP.js). + // This is port of SanityCheck.rfc3261_16_3_4(). + if (!message.toTag && message.callId.substr(0, 5) === this.options.sipjsId) { + this.userAgentCore.replyStateless(message, { statusCode: 482 }); + return; + } + // FIXME: This should be Transport check before we get here (Section 18). + // Custom SIP.js check to reject requests if body length wrong. + // This is port of SanityCheck.rfc3261_18_3_request(). + const len = (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_2__.utf8Length)(message.body); + const contentLength = message.getHeader("content-length"); + if (contentLength && len < Number(contentLength)) { + this.userAgentCore.replyStateless(message, { statusCode: 400 }); + return; + } + } + // Response Checks + if (message instanceof _core__WEBPACK_IMPORTED_MODULE_19__.IncomingResponseMessage) { + // This is port of SanityCheck.minimumHeaders(). + if (!hasMinimumHeaders()) { + this.logger.warn(`Response missing mandatory header field. Dropping.`); + return; + } + // Custom SIP.js check to drop responses if multiple Via headers. + // This is port of SanityCheck.rfc3261_8_1_3_3(). + if (message.getHeaders("via").length > 1) { + this.logger.warn("More than one Via header field present in the response. Dropping."); + return; + } + // FIXME: This should be Transport check before we get here (Section 18). + // Custom SIP.js check to drop responses if bad Via header. + // This is port of SanityCheck.rfc3261_18_1_2(). + if (message.via.host !== this.options.viaHost || message.via.port !== undefined) { + this.logger.warn("Via sent-by in the response does not match UA Via host value. Dropping."); + return; + } + // FIXME: This should be Transport check before we get here (Section 18). + // Custom SIP.js check to reject requests if body length wrong. + // This is port of SanityCheck.rfc3261_18_3_response(). + const len = (0,_core_messages_utils__WEBPACK_IMPORTED_MODULE_2__.utf8Length)(message.body); + const contentLength = message.getHeader("content-length"); + if (contentLength && len < Number(contentLength)) { + this.logger.warn("Message body length is lower than the value in Content-Length header field. Dropping."); + return; + } + } + // Handle Request + if (message instanceof _core__WEBPACK_IMPORTED_MODULE_18__.IncomingRequestMessage) { + this.userAgentCore.receiveIncomingRequestFromTransport(message); + return; + } + // Handle Response + if (message instanceof _core__WEBPACK_IMPORTED_MODULE_19__.IncomingResponseMessage) { + this.userAgentCore.receiveIncomingResponseFromTransport(message); + return; + } + throw new Error("Invalid message type."); + } + /** + * Transition state. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + transitionState(newState, error) { + const invalidTransition = () => { + throw new Error(`Invalid state transition from ${this._state} to ${newState}`); + }; + // Validate state transition + switch (this._state) { + case _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Started: + if (newState !== _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped) { + invalidTransition(); + } + break; + case _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Stopped: + if (newState !== _user_agent_state__WEBPACK_IMPORTED_MODULE_0__.UserAgentState.Started) { + invalidTransition(); + } + break; + default: + throw new Error("Unknown state."); + } + // Update state + this.logger.log(`Transitioned from ${this._state} to ${newState}`); + this._state = newState; + this._stateEventEmitter.emit(this._state); + } +} + + +/***/ }), +/* 50 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "LoggerFactory": () => (/* binding */ LoggerFactory) +/* harmony export */ }); +/* harmony import */ var _levels__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51); +/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(52); + + +/** + * Logger. + * @public + */ +class LoggerFactory { + constructor() { + this.builtinEnabled = true; + this._level = _levels__WEBPACK_IMPORTED_MODULE_0__.Levels.log; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + this.loggers = {}; + this.logger = this.getLogger("sip:loggerfactory"); + } + get level() { + return this._level; + } + set level(newLevel) { + if (newLevel >= 0 && newLevel <= 3) { + this._level = newLevel; + } + else if (newLevel > 3) { + this._level = 3; + // eslint-disable-next-line no-prototype-builtins + } + else if (_levels__WEBPACK_IMPORTED_MODULE_0__.Levels.hasOwnProperty(newLevel)) { + this._level = newLevel; + } + else { + this.logger.error("invalid 'level' parameter value: " + JSON.stringify(newLevel)); + } + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + get connector() { + return this._connector; + } + set connector(value) { + if (!value) { + this._connector = undefined; + } + else if (typeof value === "function") { + this._connector = value; + } + else { + this.logger.error("invalid 'connector' parameter value: " + JSON.stringify(value)); + } + } + getLogger(category, label) { + if (label && this.level === 3) { + return new _logger__WEBPACK_IMPORTED_MODULE_1__.Logger(this, category, label); + } + else if (this.loggers[category]) { + return this.loggers[category]; + } + else { + const logger = new _logger__WEBPACK_IMPORTED_MODULE_1__.Logger(this, category); + this.loggers[category] = logger; + return logger; + } + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + genericLog(levelToLog, category, label, content) { + if (this.level >= levelToLog) { + if (this.builtinEnabled) { + this.print(levelToLog, category, label, content); + } + } + if (this.connector) { + this.connector(_levels__WEBPACK_IMPORTED_MODULE_0__.Levels[levelToLog], category, label, content); + } + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + print(levelToLog, category, label, content) { + if (typeof content === "string") { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const prefix = [new Date(), category]; + if (label) { + prefix.push(label); + } + content = prefix.concat(content).join(" | "); + } + switch (levelToLog) { + case _levels__WEBPACK_IMPORTED_MODULE_0__.Levels.error: + // eslint-disable-next-line no-console + console.error(content); + break; + case _levels__WEBPACK_IMPORTED_MODULE_0__.Levels.warn: + // eslint-disable-next-line no-console + console.warn(content); + break; + case _levels__WEBPACK_IMPORTED_MODULE_0__.Levels.log: + // eslint-disable-next-line no-console + console.log(content); + break; + case _levels__WEBPACK_IMPORTED_MODULE_0__.Levels.debug: + // eslint-disable-next-line no-console + console.debug(content); + break; + default: + break; + } + } +} + + +/***/ }), +/* 51 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Levels": () => (/* binding */ Levels) +/* harmony export */ }); +/** + * Log levels. + * @public + */ +var Levels; +(function (Levels) { + Levels[Levels["error"] = 0] = "error"; + Levels[Levels["warn"] = 1] = "warn"; + Levels[Levels["log"] = 2] = "log"; + Levels[Levels["debug"] = 3] = "debug"; +})(Levels || (Levels = {})); + + +/***/ }), +/* 52 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Logger": () => (/* binding */ Logger) +/* harmony export */ }); +/* harmony import */ var _levels__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51); + +/** + * Logger. + * @public + */ +class Logger { + constructor(logger, category, label) { + this.logger = logger; + this.category = category; + this.label = label; + } + error(content) { + this.genericLog(_levels__WEBPACK_IMPORTED_MODULE_0__.Levels.error, content); + } + warn(content) { + this.genericLog(_levels__WEBPACK_IMPORTED_MODULE_0__.Levels.warn, content); + } + log(content) { + this.genericLog(_levels__WEBPACK_IMPORTED_MODULE_0__.Levels.log, content); + } + debug(content) { + this.genericLog(_levels__WEBPACK_IMPORTED_MODULE_0__.Levels.debug, content); + } + genericLog(level, content) { + this.logger.genericLog(level, this.category, this.label, content); + } + get level() { + return this.logger.level; + } + set level(newLevel) { + this.logger.level = newLevel; + } +} + + +/***/ }), +/* 53 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "defaultSessionDescriptionHandlerFactory": () => (/* binding */ defaultSessionDescriptionHandlerFactory) +/* harmony export */ }); +/* harmony import */ var _media_stream_factory_default__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(54); +/* harmony import */ var _peer_connection_configuration_default__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); +/* harmony import */ var _session_description_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56); + + + +/** + * Function which returns a SessionDescriptionHandlerFactory. + * @remarks + * See {@link defaultPeerConnectionConfiguration} for the default peer connection configuration. + * The ICE gathering timeout defaults to 5000ms. + * @param mediaStreamFactory - MediaStream factory. + * @public + */ +function defaultSessionDescriptionHandlerFactory(mediaStreamFactory) { + return (session, options) => { + // provide a default media stream factory if need be + if (mediaStreamFactory === undefined) { + mediaStreamFactory = (0,_media_stream_factory_default__WEBPACK_IMPORTED_MODULE_0__.defaultMediaStreamFactory)(); + } + // make sure we allow `0` to be passed in so timeout can be disabled + const iceGatheringTimeout = (options === null || options === void 0 ? void 0 : options.iceGatheringTimeout) !== undefined ? options === null || options === void 0 ? void 0 : options.iceGatheringTimeout : 5000; + // merge passed factory options into default session description configuration + const sessionDescriptionHandlerConfiguration = { + iceGatheringTimeout, + peerConnectionConfiguration: Object.assign(Object.assign({}, (0,_peer_connection_configuration_default__WEBPACK_IMPORTED_MODULE_1__.defaultPeerConnectionConfiguration)()), options === null || options === void 0 ? void 0 : options.peerConnectionConfiguration) + }; + const logger = session.userAgent.getLogger("sip.SessionDescriptionHandler"); + return new _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandler(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration); + }; +} + + +/***/ }), +/* 54 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "defaultMediaStreamFactory": () => (/* binding */ defaultMediaStreamFactory) +/* harmony export */ }); +/** + * Function which returns a MediaStreamFactory. + * @public + */ +function defaultMediaStreamFactory() { + return (constraints) => { + // if no audio or video, return a media stream without tracks + if (!constraints.audio && !constraints.video) { + return Promise.resolve(new MediaStream()); + } + // getUserMedia() is a powerful feature which can only be used in secure contexts; in insecure contexts, + // navigator.mediaDevices is undefined, preventing access to getUserMedia(). A secure context is, in short, + // a page loaded using HTTPS or the file:/// URL scheme, or a page loaded from localhost. + // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#Privacy_and_security + if (navigator.mediaDevices === undefined) { + return Promise.reject(new Error("Media devices not available in insecure contexts.")); + } + return navigator.mediaDevices.getUserMedia.call(navigator.mediaDevices, constraints); + }; +} + + +/***/ }), +/* 55 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "defaultPeerConnectionConfiguration": () => (/* binding */ defaultPeerConnectionConfiguration) +/* harmony export */ }); +/** + * Function which returns an RTCConfiguration. + * @public + */ +function defaultPeerConnectionConfiguration() { + const configuration = { + bundlePolicy: "balanced", + certificates: undefined, + iceCandidatePoolSize: 0, + iceServers: [{ urls: "stun:stun.l.google.com:19302" }], + iceTransportPolicy: "all", + peerIdentity: undefined, + rtcpMuxPolicy: "require" + }; + return configuration; +} + + +/***/ }), +/* 56 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionDescriptionHandler": () => (/* binding */ SessionDescriptionHandler) +/* harmony export */ }); +/** + * A base class implementing a WebRTC session description handler for sip.js. + * @remarks + * It is expected/intended to be extended by specific WebRTC based applications. + * @privateRemarks + * So do not put application specific implementation in here. + * @public + */ +class SessionDescriptionHandler { + /** + * Constructor + * @param logger - A logger + * @param mediaStreamFactory - A factory to provide a MediaStream + * @param options - Options passed from the SessionDescriptionHandleFactory + */ + constructor(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration) { + logger.debug("SessionDescriptionHandler.constructor"); + this.logger = logger; + this.mediaStreamFactory = mediaStreamFactory; + this.sessionDescriptionHandlerConfiguration = sessionDescriptionHandlerConfiguration; + this._localMediaStream = new MediaStream(); + this._remoteMediaStream = new MediaStream(); + this._peerConnection = new RTCPeerConnection(sessionDescriptionHandlerConfiguration === null || sessionDescriptionHandlerConfiguration === void 0 ? void 0 : sessionDescriptionHandlerConfiguration.peerConnectionConfiguration); + this.initPeerConnectionEventHandlers(); + } + /** + * The local media stream currently being sent. + * + * @remarks + * The local media stream initially has no tracks, so the presence of tracks + * should not be assumed. Furthermore, tracks may be added or removed if the + * local media changes - for example, on upgrade from audio only to a video session. + * At any given time there will be at most one audio track and one video track + * (it's possible that this restriction may not apply to sub-classes). + * Use `MediaStream.onaddtrack` or add a listener for the `addtrack` event + * to detect when a new track becomes available: + * https://developer.mozilla.org/en-US/docs/Web/API/MediaStream/onaddtrack + */ + get localMediaStream() { + return this._localMediaStream; + } + /** + * The remote media stream currently being received. + * + * @remarks + * The remote media stream initially has no tracks, so the presence of tracks + * should not be assumed. Furthermore, tracks may be added or removed if the + * remote media changes - for example, on upgrade from audio only to a video session. + * At any given time there will be at most one audio track and one video track + * (it's possible that this restriction may not apply to sub-classes). + * Use `MediaStream.onaddtrack` or add a listener for the `addtrack` event + * to detect when a new track becomes available: + * https://developer.mozilla.org/en-US/docs/Web/API/MediaStream/onaddtrack + */ + get remoteMediaStream() { + return this._remoteMediaStream; + } + /** + * The data channel. Undefined before it is created. + */ + get dataChannel() { + return this._dataChannel; + } + /** + * The peer connection. Undefined if peer connection has closed. + * + * @remarks + * While access to the underlying `RTCPeerConnection` is provided, note that + * using methods with modify it may break the operation of this class. + * In particular, this class depends on exclusive access to the + * event handler properties. If you need access to the peer connection + * events, either register for events using `addEventListener()` on + * the `RTCPeerConnection` or set the `peerConnectionDelegate` on + * this `SessionDescriptionHandler`. + */ + get peerConnection() { + return this._peerConnection; + } + /** + * A delegate which provides access to the peer connection event handlers. + * + * @remarks + * Setting the peer connection event handlers directly is not supported + * and may break this class. As this class depends on exclusive access + * to them, a delegate may be set which provides alternative access to + * the event handlers in a fashion which is supported. + */ + get peerConnectionDelegate() { + return this._peerConnectionDelegate; + } + set peerConnectionDelegate(delegate) { + this._peerConnectionDelegate = delegate; + } + // The addtrack event does not get fired when JavaScript code explicitly adds tracks to the stream (by calling addTrack()). + // https://developer.mozilla.org/en-US/docs/Web/API/MediaStream/onaddtrack + static dispatchAddTrackEvent(stream, track) { + stream.dispatchEvent(new MediaStreamTrackEvent("addtrack", { track })); + } + // The removetrack event does not get fired when JavaScript code explicitly removes tracks from the stream (by calling removeTrack()). + // https://developer.mozilla.org/en-US/docs/Web/API/MediaStream/onremovetrack + static dispatchRemoveTrackEvent(stream, track) { + stream.dispatchEvent(new MediaStreamTrackEvent("removetrack", { track })); + } + /** + * Stop tracks and close peer connection. + */ + close() { + this.logger.debug("SessionDescriptionHandler.close"); + if (this._peerConnection === undefined) { + return; + } + this._peerConnection.getReceivers().forEach((receiver) => { + receiver.track && receiver.track.stop(); + }); + this._peerConnection.getSenders().forEach((sender) => { + sender.track && sender.track.stop(); + }); + if (this._dataChannel) { + this._dataChannel.close(); + } + this._peerConnection.close(); + this._peerConnection = undefined; + } + /** + * Creates an offer or answer. + * @param options - Options bucket. + * @param modifiers - Modifiers. + */ + getDescription(options, modifiers) { + var _a, _b; + this.logger.debug("SessionDescriptionHandler.getDescription"); + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + // Callback on data channel creation + this.onDataChannel = options === null || options === void 0 ? void 0 : options.onDataChannel; + // ICE will restart upon applying an offer created with the iceRestart option + const iceRestart = (_a = options === null || options === void 0 ? void 0 : options.offerOptions) === null || _a === void 0 ? void 0 : _a.iceRestart; + // ICE gathering timeout may be set on a per call basis, otherwise the configured default is used + const iceTimeout = (options === null || options === void 0 ? void 0 : options.iceGatheringTimeout) === undefined + ? (_b = this.sessionDescriptionHandlerConfiguration) === null || _b === void 0 ? void 0 : _b.iceGatheringTimeout + : options === null || options === void 0 ? void 0 : options.iceGatheringTimeout; + return this.getLocalMediaStream(options) + .then(() => this.updateDirection(options)) + .then(() => this.createDataChannel(options)) + .then(() => this.createLocalOfferOrAnswer(options)) + .then((sessionDescription) => this.applyModifiers(sessionDescription, modifiers)) + .then((sessionDescription) => this.setLocalSessionDescription(sessionDescription)) + .then(() => this.waitForIceGatheringComplete(iceRestart, iceTimeout)) + .then(() => this.getLocalSessionDescription()) + .then((sessionDescription) => { + return { + body: sessionDescription.sdp, + contentType: "application/sdp" + }; + }) + .catch((error) => { + this.logger.error("SessionDescriptionHandler.getDescription failed - " + error); + throw error; + }); + } + /** + * Returns true if the SessionDescriptionHandler can handle the Content-Type described by a SIP message. + * @param contentType - The content type that is in the SIP Message. + */ + hasDescription(contentType) { + this.logger.debug("SessionDescriptionHandler.hasDescription"); + return contentType === "application/sdp"; + } + /** + * Send DTMF via RTP (RFC 4733). + * Returns true if DTMF send is successful, false otherwise. + * @param tones - A string containing DTMF digits. + * @param options - Options object to be used by sendDtmf. + */ + sendDtmf(tones, options) { + this.logger.debug("SessionDescriptionHandler.sendDtmf"); + if (this._peerConnection === undefined) { + this.logger.error("SessionDescriptionHandler.sendDtmf failed - peer connection closed"); + return false; + } + const senders = this._peerConnection.getSenders(); + if (senders.length === 0) { + this.logger.error("SessionDescriptionHandler.sendDtmf failed - no senders"); + return false; + } + const dtmfSender = senders[0].dtmf; + if (!dtmfSender) { + this.logger.error("SessionDescriptionHandler.sendDtmf failed - no DTMF sender"); + return false; + } + const duration = options === null || options === void 0 ? void 0 : options.duration; + const interToneGap = options === null || options === void 0 ? void 0 : options.interToneGap; + try { + dtmfSender.insertDTMF(tones, duration, interToneGap); + } + catch (e) { + this.logger.error(e); + return false; + } + this.logger.log("SessionDescriptionHandler.sendDtmf sent via RTP: " + tones.toString()); + return true; + } + /** + * Sets an offer or answer. + * @param sdp - The session description. + * @param options - Options bucket. + * @param modifiers - Modifiers. + */ + setDescription(sdp, options, modifiers) { + this.logger.debug("SessionDescriptionHandler.setDescription"); + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + // Callback on data channel creation + this.onDataChannel = options === null || options === void 0 ? void 0 : options.onDataChannel; + // SDP type + const type = this._peerConnection.signalingState === "have-local-offer" ? "answer" : "offer"; + return this.getLocalMediaStream(options) + .then(() => this.applyModifiers({ sdp, type }, modifiers)) + .then((sessionDescription) => this.setRemoteSessionDescription(sessionDescription)) + .catch((error) => { + this.logger.error("SessionDescriptionHandler.setDescription failed - " + error); + throw error; + }); + } + /** + * Applies modifiers to SDP prior to setting the local or remote description. + * @param sdp - SDP to modify. + * @param modifiers - Modifiers to apply. + */ + applyModifiers(sdp, modifiers) { + this.logger.debug("SessionDescriptionHandler.applyModifiers"); + if (!modifiers || modifiers.length === 0) { + return Promise.resolve(sdp); + } + return modifiers + .reduce((cur, next) => cur.then(next), Promise.resolve(sdp)) + .then((modified) => { + this.logger.debug("SessionDescriptionHandler.applyModifiers - modified sdp"); + if (!modified.sdp || !modified.type) { + throw new Error("Invalid SDP."); + } + return { sdp: modified.sdp, type: modified.type }; + }); + } + /** + * Create a data channel. + * @remarks + * Only creates a data channel if SessionDescriptionHandlerOptions.dataChannel is true. + * Only creates a data channel if creating a local offer. + * Only if one does not already exist. + * @param options - Session description handler options. + */ + createDataChannel(options) { + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + // only create a data channel if requested + if ((options === null || options === void 0 ? void 0 : options.dataChannel) !== true) { + return Promise.resolve(); + } + // do not create a data channel if we already have one + if (this._dataChannel) { + return Promise.resolve(); + } + switch (this._peerConnection.signalingState) { + case "stable": + // if we are stable, assume we are creating a local offer so create a data channel + this.logger.debug("SessionDescriptionHandler.createDataChannel - creating data channel"); + try { + this._dataChannel = this._peerConnection.createDataChannel((options === null || options === void 0 ? void 0 : options.dataChannelLabel) || "", options === null || options === void 0 ? void 0 : options.dataChannelOptions); + if (this.onDataChannel) { + this.onDataChannel(this._dataChannel); + } + return Promise.resolve(); + } + catch (error) { + return Promise.reject(error); + } + case "have-remote-offer": + return Promise.resolve(); + case "have-local-offer": + case "have-local-pranswer": + case "have-remote-pranswer": + case "closed": + default: + return Promise.reject(new Error("Invalid signaling state " + this._peerConnection.signalingState)); + } + } + /** + * Depending on current signaling state, create a local offer or answer. + * @param options - Session description handler options. + */ + createLocalOfferOrAnswer(options) { + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + switch (this._peerConnection.signalingState) { + case "stable": + // if we are stable, assume we are creating a local offer + this.logger.debug("SessionDescriptionHandler.createLocalOfferOrAnswer - creating SDP offer"); + return this._peerConnection.createOffer(options === null || options === void 0 ? void 0 : options.offerOptions); + case "have-remote-offer": + // if we have a remote offer, assume we are creating a local answer + this.logger.debug("SessionDescriptionHandler.createLocalOfferOrAnswer - creating SDP answer"); + return this._peerConnection.createAnswer(options === null || options === void 0 ? void 0 : options.answerOptions); + case "have-local-offer": + case "have-local-pranswer": + case "have-remote-pranswer": + case "closed": + default: + return Promise.reject(new Error("Invalid signaling state " + this._peerConnection.signalingState)); + } + } + /** + * Get a media stream from the media stream factory and set the local media stream. + * @param options - Session description handler options. + */ + getLocalMediaStream(options) { + this.logger.debug("SessionDescriptionHandler.getLocalMediaStream"); + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + let constraints = Object.assign({}, options === null || options === void 0 ? void 0 : options.constraints); + // if we already have a local media stream... + if (this.localMediaStreamConstraints) { + // ignore constraint "downgrades" + constraints.audio = constraints.audio || this.localMediaStreamConstraints.audio; + constraints.video = constraints.video || this.localMediaStreamConstraints.video; + // if constraints have not changed, do not get a new media stream + if (JSON.stringify(this.localMediaStreamConstraints.audio) === JSON.stringify(constraints.audio) && + JSON.stringify(this.localMediaStreamConstraints.video) === JSON.stringify(constraints.video)) { + return Promise.resolve(); + } + } + else { + // if no constraints have been specified, default to audio for initial media stream + if (constraints.audio === undefined && constraints.video === undefined) { + constraints = { audio: true }; + } + } + this.localMediaStreamConstraints = constraints; + return this.mediaStreamFactory(constraints, this).then((mediaStream) => this.setLocalMediaStream(mediaStream)); + } + /** + * Sets the peer connection's sender tracks and local media stream tracks. + * + * @remarks + * Only the first audio and video tracks of the provided MediaStream are utilized. + * Adds tracks if audio and/or video tracks are not already present, otherwise replaces tracks. + * + * @param stream - Media stream containing tracks to be utilized. + */ + setLocalMediaStream(stream) { + this.logger.debug("SessionDescriptionHandler.setLocalMediaStream"); + if (!this._peerConnection) { + throw new Error("Peer connection undefined."); + } + const pc = this._peerConnection; + const localStream = this._localMediaStream; + const trackUpdates = []; + const updateTrack = (newTrack) => { + const kind = newTrack.kind; + if (kind !== "audio" && kind !== "video") { + throw new Error(`Unknown new track kind ${kind}.`); + } + const sender = pc.getSenders().find((sender) => sender.track && sender.track.kind === kind); + if (sender) { + trackUpdates.push(new Promise((resolve) => { + this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - replacing sender ${kind} track`); + resolve(); + }).then(() => sender + .replaceTrack(newTrack) + .then(() => { + const oldTrack = localStream.getTracks().find((localTrack) => localTrack.kind === kind); + if (oldTrack) { + oldTrack.stop(); + localStream.removeTrack(oldTrack); + SessionDescriptionHandler.dispatchRemoveTrackEvent(localStream, oldTrack); + } + localStream.addTrack(newTrack); + SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack); + }) + .catch((error) => { + this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to replace sender ${kind} track`); + throw error; + }))); + } + else { + trackUpdates.push(new Promise((resolve) => { + this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - adding sender ${kind} track`); + resolve(); + }).then(() => { + // Review: could make streamless tracks a configurable option? + // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addTrack#Usage_notes + try { + pc.addTrack(newTrack, localStream); + } + catch (error) { + this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to add sender ${kind} track`); + throw error; + } + localStream.addTrack(newTrack); + SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack); + })); + } + }; + // update peer connection audio tracks + const audioTracks = stream.getAudioTracks(); + if (audioTracks.length) { + updateTrack(audioTracks[0]); + } + // update peer connection video tracks + const videoTracks = stream.getVideoTracks(); + if (videoTracks.length) { + updateTrack(videoTracks[0]); + } + return trackUpdates.reduce((p, x) => p.then(() => x), Promise.resolve()); + } + /** + * Gets the peer connection's local session description. + */ + getLocalSessionDescription() { + this.logger.debug("SessionDescriptionHandler.getLocalSessionDescription"); + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + const sdp = this._peerConnection.localDescription; + if (!sdp) { + return Promise.reject(new Error("Failed to get local session description")); + } + return Promise.resolve(sdp); + } + /** + * Sets the peer connection's local session description. + * @param sessionDescription - sessionDescription The session description. + */ + setLocalSessionDescription(sessionDescription) { + this.logger.debug("SessionDescriptionHandler.setLocalSessionDescription"); + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + return this._peerConnection.setLocalDescription(sessionDescription); + } + /** + * Sets the peer connection's remote session description. + * @param sessionDescription - The session description. + */ + setRemoteSessionDescription(sessionDescription) { + this.logger.debug("SessionDescriptionHandler.setRemoteSessionDescription"); + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + const sdp = sessionDescription.sdp; + let type; + switch (this._peerConnection.signalingState) { + case "stable": + // if we are stable assume this is a remote offer + type = "offer"; + break; + case "have-local-offer": + // if we made an offer, assume this is a remote answer + type = "answer"; + break; + case "have-local-pranswer": + case "have-remote-offer": + case "have-remote-pranswer": + case "closed": + default: + return Promise.reject(new Error("Invalid signaling state " + this._peerConnection.signalingState)); + } + if (!sdp) { + this.logger.error("SessionDescriptionHandler.setRemoteSessionDescription failed - cannot set null sdp"); + return Promise.reject(new Error("SDP is undefined")); + } + return this._peerConnection.setRemoteDescription({ sdp, type }); + } + /** + * Sets a remote media stream track. + * + * @remarks + * Adds tracks if audio and/or video tracks are not already present, otherwise replaces tracks. + * + * @param track - Media stream track to be utilized. + */ + setRemoteTrack(track) { + this.logger.debug("SessionDescriptionHandler.setRemoteTrack"); + const remoteStream = this._remoteMediaStream; + if (remoteStream.getTrackById(track.id)) { + this.logger.debug(`SessionDescriptionHandler.setRemoteTrack - have remote ${track.kind} track`); + } + else if (track.kind === "audio") { + this.logger.debug(`SessionDescriptionHandler.setRemoteTrack - adding remote ${track.kind} track`); + remoteStream.getAudioTracks().forEach((track) => { + track.stop(); + remoteStream.removeTrack(track); + SessionDescriptionHandler.dispatchRemoveTrackEvent(remoteStream, track); + }); + remoteStream.addTrack(track); + SessionDescriptionHandler.dispatchAddTrackEvent(remoteStream, track); + } + else if (track.kind === "video") { + this.logger.debug(`SessionDescriptionHandler.setRemoteTrack - adding remote ${track.kind} track`); + remoteStream.getVideoTracks().forEach((track) => { + track.stop(); + remoteStream.removeTrack(track); + SessionDescriptionHandler.dispatchRemoveTrackEvent(remoteStream, track); + }); + remoteStream.addTrack(track); + SessionDescriptionHandler.dispatchAddTrackEvent(remoteStream, track); + } + } + /** + * Depending on the current signaling state and the session hold state, update transceiver direction. + * @param options - Session description handler options. + */ + updateDirection(options) { + if (this._peerConnection === undefined) { + return Promise.reject(new Error("Peer connection closed.")); + } + // 4.2.3. setDirection + // + // The setDirection method sets the direction of a transceiver, which + // affects the direction property of the associated "m=" section on + // future calls to createOffer and createAnswer. The permitted values + // for direction are "recvonly", "sendrecv", "sendonly", and "inactive", + // mirroring the identically named direction attributes defined in + // [RFC4566], Section 6. + // + // When creating offers, the transceiver direction is directly reflected + // in the output, even for re-offers. When creating answers, the + // transceiver direction is intersected with the offered direction, as + // explained in Section 5.3 below. + // + // Note that while setDirection sets the direction property of the + // transceiver immediately (Section 4.2.4), this property does not + // immediately affect whether the transceiver's RtpSender will send or + // its RtpReceiver will receive. The direction in effect is represented + // by the currentDirection property, which is only updated when an + // answer is applied. + // + // 4.2.4. direction + // + // The direction property indicates the last value passed into + // setDirection. If setDirection has never been called, it is set to + // the direction the transceiver was initialized with. + // + // 4.2.5. currentDirection + // + // The currentDirection property indicates the last negotiated direction + // for the transceiver's associated "m=" section. More specifically, it + // indicates the direction attribute [RFC3264] of the associated "m=" + // section in the last applied answer (including provisional answers), + // with "send" and "recv" directions reversed if it was a remote answer. + // For example, if the direction attribute for the associated "m=" + // section in a remote answer is "recvonly", currentDirection is set to + // "sendonly". + // + // If an answer that references this transceiver has not yet been + // applied or if the transceiver is stopped, currentDirection is set to + // "null". + // https://tools.ietf.org/html/rfc8829#section-4.2.3 + // + // * A direction attribute, determined by applying the rules regarding + // the offered direction specified in [RFC3264], Section 6.1, and + // then intersecting with the direction of the associated + // RtpTransceiver. For example, in the case where an "m=" section is + // offered as "sendonly" and the local transceiver is set to + // "sendrecv", the result in the answer is a "recvonly" direction. + // https://tools.ietf.org/html/rfc8829#section-5.3.1 + // + // If a stream is offered as sendonly, the corresponding stream MUST be + // marked as recvonly or inactive in the answer. If a media stream is + // listed as recvonly in the offer, the answer MUST be marked as + // sendonly or inactive in the answer. If an offered media stream is + // listed as sendrecv (or if there is no direction attribute at the + // media or session level, in which case the stream is sendrecv by + // default), the corresponding stream in the answer MAY be marked as + // sendonly, recvonly, sendrecv, or inactive. If an offered media + // stream is listed as inactive, it MUST be marked as inactive in the + // answer. + // https://tools.ietf.org/html/rfc3264#section-6.1 + switch (this._peerConnection.signalingState) { + case "stable": + // if we are stable, assume we are creating a local offer + this.logger.debug("SessionDescriptionHandler.updateDirection - setting offer direction"); + { + // determine the direction to offer given the current direction and hold state + const directionToOffer = (currentDirection) => { + switch (currentDirection) { + case "inactive": + return (options === null || options === void 0 ? void 0 : options.hold) ? "inactive" : "recvonly"; + case "recvonly": + return (options === null || options === void 0 ? void 0 : options.hold) ? "inactive" : "recvonly"; + case "sendonly": + return (options === null || options === void 0 ? void 0 : options.hold) ? "sendonly" : "sendrecv"; + case "sendrecv": + return (options === null || options === void 0 ? void 0 : options.hold) ? "sendonly" : "sendrecv"; + case "stopped": + return "stopped"; + default: + throw new Error("Should never happen"); + } + }; + // set the transceiver direction to the offer direction + this._peerConnection.getTransceivers().forEach((transceiver) => { + if (transceiver.direction /* guarding, but should always be true */) { + const offerDirection = directionToOffer(transceiver.direction); + if (transceiver.direction !== offerDirection) { + transceiver.direction = offerDirection; + } + } + }); + } + break; + case "have-remote-offer": + // if we have a remote offer, assume we are creating a local answer + this.logger.debug("SessionDescriptionHandler.updateDirection - setting answer direction"); + // FIXME: This is not the correct way to determine the answer direction as it is only + // considering first match in the offered SDP and using that to determine the answer direction. + // While that may be fine for our current use cases, it is not a generally correct approach. + { + // determine the offered direction + const offeredDirection = (() => { + const description = this._peerConnection.remoteDescription; + if (!description) { + throw new Error("Failed to read remote offer"); + } + const searchResult = /a=sendrecv\r\n|a=sendonly\r\n|a=recvonly\r\n|a=inactive\r\n/.exec(description.sdp); + if (searchResult) { + switch (searchResult[0]) { + case "a=inactive\r\n": + return "inactive"; + case "a=recvonly\r\n": + return "recvonly"; + case "a=sendonly\r\n": + return "sendonly"; + case "a=sendrecv\r\n": + return "sendrecv"; + default: + throw new Error("Should never happen"); + } + } + return "sendrecv"; + })(); + // determine the answer direction based on the offered direction and our hold state + const answerDirection = (() => { + switch (offeredDirection) { + case "inactive": + return "inactive"; + case "recvonly": + return "sendonly"; + case "sendonly": + return (options === null || options === void 0 ? void 0 : options.hold) ? "inactive" : "recvonly"; + case "sendrecv": + return (options === null || options === void 0 ? void 0 : options.hold) ? "sendonly" : "sendrecv"; + default: + throw new Error("Should never happen"); + } + })(); + // set the transceiver direction to the answer direction + this._peerConnection.getTransceivers().forEach((transceiver) => { + if (transceiver.direction /* guarding, but should always be true */) { + if (transceiver.direction !== "stopped" && transceiver.direction !== answerDirection) { + transceiver.direction = answerDirection; + } + } + }); + } + break; + case "have-local-offer": + case "have-local-pranswer": + case "have-remote-pranswer": + case "closed": + default: + return Promise.reject(new Error("Invalid signaling state " + this._peerConnection.signalingState)); + } + return Promise.resolve(); + } + /** + * Called when ICE gathering completes and resolves any waiting promise. + */ + iceGatheringComplete() { + this.logger.debug("SessionDescriptionHandler.iceGatheringComplete"); + // clear timer if need be + if (this.iceGatheringCompleteTimeoutId !== undefined) { + this.logger.debug("SessionDescriptionHandler.iceGatheringComplete - clearing timeout"); + clearTimeout(this.iceGatheringCompleteTimeoutId); + this.iceGatheringCompleteTimeoutId = undefined; + } + // resolve and cleanup promise if need be + if (this.iceGatheringCompletePromise !== undefined) { + this.logger.debug("SessionDescriptionHandler.iceGatheringComplete - resolving promise"); + this.iceGatheringCompleteResolve && this.iceGatheringCompleteResolve(); + this.iceGatheringCompletePromise = undefined; + this.iceGatheringCompleteResolve = undefined; + this.iceGatheringCompleteReject = undefined; + } + } + /** + * Wait for ICE gathering to complete. + * @param restart - If true, waits if current state is "complete" (waits for transition to "complete"). + * @param timeout - Milliseconds after which waiting times out. No timeout if 0. + */ + waitForIceGatheringComplete(restart = false, timeout = 0) { + this.logger.debug("SessionDescriptionHandler.waitForIceGatheringToComplete"); + if (this._peerConnection === undefined) { + return Promise.reject("Peer connection closed."); + } + // guard already complete + if (!restart && this._peerConnection.iceGatheringState === "complete") { + this.logger.debug("SessionDescriptionHandler.waitForIceGatheringToComplete - already complete"); + return Promise.resolve(); + } + // only one may be waiting, reject any prior + if (this.iceGatheringCompletePromise !== undefined) { + this.logger.debug("SessionDescriptionHandler.waitForIceGatheringToComplete - rejecting prior waiting promise"); + this.iceGatheringCompleteReject && this.iceGatheringCompleteReject(new Error("Promise superseded.")); + this.iceGatheringCompletePromise = undefined; + this.iceGatheringCompleteResolve = undefined; + this.iceGatheringCompleteReject = undefined; + } + this.iceGatheringCompletePromise = new Promise((resolve, reject) => { + this.iceGatheringCompleteResolve = resolve; + this.iceGatheringCompleteReject = reject; + if (timeout > 0) { + this.logger.debug("SessionDescriptionHandler.waitForIceGatheringToComplete - timeout in " + timeout); + this.iceGatheringCompleteTimeoutId = setTimeout(() => { + this.logger.debug("SessionDescriptionHandler.waitForIceGatheringToComplete - timeout"); + this.iceGatheringComplete(); + }, timeout); + } + }); + return this.iceGatheringCompletePromise; + } + /** + * Initializes the peer connection event handlers + */ + initPeerConnectionEventHandlers() { + this.logger.debug("SessionDescriptionHandler.initPeerConnectionEventHandlers"); + if (!this._peerConnection) + throw new Error("Peer connection undefined."); + const peerConnection = this._peerConnection; + peerConnection.onconnectionstatechange = (event) => { + var _a; + const newState = peerConnection.connectionState; + this.logger.debug(`SessionDescriptionHandler.onconnectionstatechange ${newState}`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onconnectionstatechange) { + this._peerConnectionDelegate.onconnectionstatechange(event); + } + }; + peerConnection.ondatachannel = (event) => { + var _a; + this.logger.debug(`SessionDescriptionHandler.ondatachannel`); + this._dataChannel = event.channel; + if (this.onDataChannel) { + this.onDataChannel(this._dataChannel); + } + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.ondatachannel) { + this._peerConnectionDelegate.ondatachannel(event); + } + }; + peerConnection.onicecandidate = (event) => { + var _a; + this.logger.debug(`SessionDescriptionHandler.onicecandidate`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onicecandidate) { + this._peerConnectionDelegate.onicecandidate(event); + } + }; + peerConnection.onicecandidateerror = (event) => { + var _a; + this.logger.debug(`SessionDescriptionHandler.onicecandidateerror`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onicecandidateerror) { + this._peerConnectionDelegate.onicecandidateerror(event); + } + }; + peerConnection.oniceconnectionstatechange = (event) => { + var _a; + const newState = peerConnection.iceConnectionState; + this.logger.debug(`SessionDescriptionHandler.oniceconnectionstatechange ${newState}`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.oniceconnectionstatechange) { + this._peerConnectionDelegate.oniceconnectionstatechange(event); + } + }; + peerConnection.onicegatheringstatechange = (event) => { + var _a; + const newState = peerConnection.iceGatheringState; + this.logger.debug(`SessionDescriptionHandler.onicegatheringstatechange ${newState}`); + if (newState === "complete") { + this.iceGatheringComplete(); // complete waiting for ICE gathering to complete + } + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onicegatheringstatechange) { + this._peerConnectionDelegate.onicegatheringstatechange(event); + } + }; + peerConnection.onnegotiationneeded = (event) => { + var _a; + this.logger.debug(`SessionDescriptionHandler.onnegotiationneeded`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onnegotiationneeded) { + this._peerConnectionDelegate.onnegotiationneeded(event); + } + }; + peerConnection.onsignalingstatechange = (event) => { + var _a; + const newState = peerConnection.signalingState; + this.logger.debug(`SessionDescriptionHandler.onsignalingstatechange ${newState}`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onsignalingstatechange) { + this._peerConnectionDelegate.onsignalingstatechange(event); + } + }; + peerConnection.onstatsended = (event) => { + var _a; + this.logger.debug(`SessionDescriptionHandler.onstatsended`); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.onstatsended) { + this._peerConnectionDelegate.onstatsended(event); + } + }; + peerConnection.ontrack = (event) => { + var _a; + const kind = event.track.kind; + const enabled = event.track.enabled ? "enabled" : "disabled"; + this.logger.debug(`SessionDescriptionHandler.ontrack ${kind} ${enabled}`); + this.setRemoteTrack(event.track); + if ((_a = this._peerConnectionDelegate) === null || _a === void 0 ? void 0 : _a.ontrack) { + this._peerConnectionDelegate.ontrack(event); + } + }; + } +} + + +/***/ }), +/* 57 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Transport": () => (/* binding */ Transport) +/* harmony export */ }); +/* harmony import */ var _api_emitter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); +/* harmony import */ var _api_exceptions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9); +/* harmony import */ var _api_transport_state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(47); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(21); + + + + +/** + * Transport for SIP over secure WebSocket (WSS). + * @public + */ +class Transport { + constructor(logger, options) { + this._state = _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected; + this.transitioningState = false; + // state emitter + this._stateEventEmitter = new _api_emitter__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl(); + // logger + this.logger = logger; + // guard deprecated options (remove this in version 16.x) + if (options) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const optionsDeprecated = options; + const wsServersDeprecated = optionsDeprecated === null || optionsDeprecated === void 0 ? void 0 : optionsDeprecated.wsServers; + const maxReconnectionAttemptsDeprecated = optionsDeprecated === null || optionsDeprecated === void 0 ? void 0 : optionsDeprecated.maxReconnectionAttempts; + if (wsServersDeprecated !== undefined) { + const deprecatedMessage = `The transport option "wsServers" as has apparently been specified and has been deprecated. ` + + "It will no longer be available starting with SIP.js release 0.16.0. Please update accordingly."; + this.logger.warn(deprecatedMessage); + } + if (maxReconnectionAttemptsDeprecated !== undefined) { + const deprecatedMessage = `The transport option "maxReconnectionAttempts" as has apparently been specified and has been deprecated. ` + + "It will no longer be available starting with SIP.js release 0.16.0. Please update accordingly."; + this.logger.warn(deprecatedMessage); + } + // hack + if (wsServersDeprecated && !options.server) { + if (typeof wsServersDeprecated === "string") { + options.server = wsServersDeprecated; + } + if (wsServersDeprecated instanceof Array) { + options.server = wsServersDeprecated[0]; + } + } + } + // initialize configuration + this.configuration = Object.assign(Object.assign({}, Transport.defaultOptions), options); + // validate server URL + const url = this.configuration.server; + const parsed = _core__WEBPACK_IMPORTED_MODULE_2__.Grammar.parse(url, "absoluteURI"); + if (parsed === -1) { + this.logger.error(`Invalid WebSocket Server URL "${url}"`); + throw new Error("Invalid WebSocket Server URL"); + } + if (!["wss", "ws", "udp"].includes(parsed.scheme)) { + this.logger.error(`Invalid scheme in WebSocket Server URL "${url}"`); + throw new Error("Invalid scheme in WebSocket Server URL"); + } + this._protocol = parsed.scheme.toUpperCase(); + } + dispose() { + return this.disconnect(); + } + /** + * The protocol. + * + * @remarks + * Formatted as defined for the Via header sent-protocol transport. + * https://tools.ietf.org/html/rfc3261#section-20.42 + */ + get protocol() { + return this._protocol; + } + /** + * The URL of the WebSocket Server. + */ + get server() { + return this.configuration.server; + } + /** + * Transport state. + */ + get state() { + return this._state; + } + /** + * Transport state change emitter. + */ + get stateChange() { + return this._stateEventEmitter; + } + /** + * The WebSocket. + */ + get ws() { + return this._ws; + } + /** + * Connect to network. + * Resolves once connected. Otherwise rejects with an Error. + */ + connect() { + return this._connect(); + } + /** + * Disconnect from network. + * Resolves once disconnected. Otherwise rejects with an Error. + */ + disconnect() { + return this._disconnect(); + } + /** + * Returns true if the `state` equals "Connected". + * @remarks + * This is equivalent to `state === TransportState.Connected`. + */ + isConnected() { + return this.state === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected; + } + /** + * Sends a message. + * Resolves once message is sent. Otherwise rejects with an Error. + * @param message - Message to send. + */ + send(message) { + // Error handling is independent of whether the message was a request or + // response. + // + // If the transport user asks for a message to be sent over an + // unreliable transport, and the result is an ICMP error, the behavior + // depends on the type of ICMP error. Host, network, port or protocol + // unreachable errors, or parameter problem errors SHOULD cause the + // transport layer to inform the transport user of a failure in sending. + // Source quench and TTL exceeded ICMP errors SHOULD be ignored. + // + // If the transport user asks for a request to be sent over a reliable + // transport, and the result is a connection failure, the transport + // layer SHOULD inform the transport user of a failure in sending. + // https://tools.ietf.org/html/rfc3261#section-18.4 + return this._send(message); + } + _connect() { + this.logger.log(`Connecting ${this.server}`); + switch (this.state) { + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting: + // If `state` is "Connecting", `state` MUST NOT transition before returning. + if (this.transitioningState) { + return Promise.reject(this.transitionLoopDetectedError(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting)); + } + if (!this.connectPromise) { + throw new Error("Connect promise must be defined."); + } + return this.connectPromise; // Already connecting + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected: + // If `state` is "Connected", `state` MUST NOT transition before returning. + if (this.transitioningState) { + return Promise.reject(this.transitionLoopDetectedError(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting)); + } + if (this.connectPromise) { + throw new Error("Connect promise must not be defined."); + } + return Promise.resolve(); // Already connected + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting: + // If `state` is "Disconnecting", `state` MUST transition to "Connecting" before returning + if (this.connectPromise) { + throw new Error("Connect promise must not be defined."); + } + try { + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting); + } + catch (e) { + if (e instanceof _api_exceptions__WEBPACK_IMPORTED_MODULE_3__.StateTransitionError) { + return Promise.reject(e); // Loop detected + } + throw e; + } + break; + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected: + // If `state` is "Disconnected" `state` MUST transition to "Connecting" before returning + if (this.connectPromise) { + throw new Error("Connect promise must not be defined."); + } + try { + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting); + } + catch (e) { + if (e instanceof _api_exceptions__WEBPACK_IMPORTED_MODULE_3__.StateTransitionError) { + return Promise.reject(e); // Loop detected + } + throw e; + } + break; + default: + throw new Error("Unknown state"); + } + let ws; + try { + // WebSocket() + // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/WebSocket + ws = new WebSocket(this.server, "sip"); + ws.binaryType = "arraybuffer"; // set data type of received binary messages + ws.addEventListener("close", (ev) => this.onWebSocketClose(ev, ws)); + ws.addEventListener("error", (ev) => this.onWebSocketError(ev, ws)); + ws.addEventListener("open", (ev) => this.onWebSocketOpen(ev, ws)); + ws.addEventListener("message", (ev) => this.onWebSocketMessage(ev, ws)); + this._ws = ws; + } + catch (error) { + this._ws = undefined; + this.logger.error("WebSocket construction failed."); + this.logger.error(error); + return new Promise((resolve, reject) => { + this.connectResolve = resolve; + this.connectReject = reject; + // The `state` MUST transition to "Disconnecting" or "Disconnected" before rejecting + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected, error); + }); + } + this.connectPromise = new Promise((resolve, reject) => { + this.connectResolve = resolve; + this.connectReject = reject; + this.connectTimeout = setTimeout(() => { + this.logger.warn("Connect timed out. " + + "Exceeded time set in configuration.connectionTimeout: " + + this.configuration.connectionTimeout + + "s."); + ws.close(1000); // careful here to use a local reference instead of this._ws + }, this.configuration.connectionTimeout * 1000); + }); + return this.connectPromise; + } + _disconnect() { + this.logger.log(`Disconnecting ${this.server}`); + switch (this.state) { + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting: + // If `state` is "Connecting", `state` MUST transition to "Disconnecting" before returning. + if (this.disconnectPromise) { + throw new Error("Disconnect promise must not be defined."); + } + try { + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting); + } + catch (e) { + if (e instanceof _api_exceptions__WEBPACK_IMPORTED_MODULE_3__.StateTransitionError) { + return Promise.reject(e); // Loop detected + } + throw e; + } + break; + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected: + // If `state` is "Connected", `state` MUST transition to "Disconnecting" before returning. + if (this.disconnectPromise) { + throw new Error("Disconnect promise must not be defined."); + } + try { + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting); + } + catch (e) { + if (e instanceof _api_exceptions__WEBPACK_IMPORTED_MODULE_3__.StateTransitionError) { + return Promise.reject(e); // Loop detected + } + throw e; + } + break; + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting: + // If `state` is "Disconnecting", `state` MUST NOT transition before returning. + if (this.transitioningState) { + return Promise.reject(this.transitionLoopDetectedError(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting)); + } + if (!this.disconnectPromise) { + throw new Error("Disconnect promise must be defined."); + } + return this.disconnectPromise; // Already disconnecting + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected: + // If `state` is "Disconnected", `state` MUST NOT transition before returning. + if (this.transitioningState) { + return Promise.reject(this.transitionLoopDetectedError(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting)); + } + if (this.disconnectPromise) { + throw new Error("Disconnect promise must not be defined."); + } + return Promise.resolve(); // Already disconnected + default: + throw new Error("Unknown state"); + } + if (!this._ws) { + throw new Error("WebSocket must be defined."); + } + const ws = this._ws; + this.disconnectPromise = new Promise((resolve, reject) => { + this.disconnectResolve = resolve; + this.disconnectReject = reject; + try { + // WebSocket.close() + // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close + ws.close(1000); // careful here to use a local reference instead of this._ws + } + catch (error) { + // Treating this as a coding error as it apparently can only happen + // if you pass close() invalid parameters (so it should never happen) + this.logger.error("WebSocket close failed."); + this.logger.error(error); + throw error; + } + }); + return this.disconnectPromise; + } + _send(message) { + if (this.configuration.traceSip === true) { + this.logger.log("Sending WebSocket message:\n\n" + message + "\n"); + } + if (this._state !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected) { + return Promise.reject(new Error("Not connected.")); + } + if (!this._ws) { + throw new Error("WebSocket undefined."); + } + try { + // WebSocket.send() + // https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send + this._ws.send(message); + } + catch (error) { + if (error instanceof Error) { + return Promise.reject(error); + } + return Promise.reject(new Error("WebSocket send failed.")); + } + return Promise.resolve(); + } + /** + * WebSocket "onclose" event handler. + * @param ev - Event. + */ + onWebSocketClose(ev, ws) { + if (ws !== this._ws) { + return; + } + const message = `WebSocket closed ${this.server} (code: ${ev.code})`; + const error = !this.disconnectPromise ? new Error(message) : undefined; + if (error) { + this.logger.warn("WebSocket closed unexpectedly"); + } + this.logger.log(message); + // We are about to transition to disconnected, so clear our web socket + this._ws = undefined; + // The `state` MUST transition to "Disconnected" before resolving (assuming `state` is not already "Disconnected"). + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected, error); + } + /** + * WebSocket "onerror" event handler. + * @param ev - Event. + */ + onWebSocketError(ev, ws) { + if (ws !== this._ws) { + return; + } + this.logger.error("WebSocket error occurred."); + } + /** + * WebSocket "onmessage" event handler. + * @param ev - Event. + */ + onWebSocketMessage(ev, ws) { + if (ws !== this._ws) { + return; + } + const data = ev.data; + let finishedData; + // CRLF Keep Alive response from server. Clear our keep alive timeout. + if (/^(\r\n)+$/.test(data)) { + this.clearKeepAliveTimeout(); + if (this.configuration.traceSip === true) { + this.logger.log("Received WebSocket message with CRLF Keep Alive response"); + } + return; + } + if (!data) { + this.logger.warn("Received empty message, discarding..."); + return; + } + if (typeof data !== "string") { + // WebSocket binary message. + try { + finishedData = new TextDecoder().decode(new Uint8Array(data)); + // TextDecoder (above) is not supported by old browsers, but it correctly decodes UTF-8. + // The line below is an ISO 8859-1 (Latin 1) decoder, so just UTF-8 code points that are 1 byte. + // It's old code and works in old browsers (IE), so leaving it here in a comment in case someone needs it. + // finishedData = String.fromCharCode.apply(null, (new Uint8Array(data) as unknown as Array)); + } + catch (err) { + this.logger.error(err); + this.logger.error("Received WebSocket binary message failed to be converted into string, message discarded"); + return; + } + if (this.configuration.traceSip === true) { + this.logger.log("Received WebSocket binary message:\n\n" + finishedData + "\n"); + } + } + else { + // WebSocket text message. + finishedData = data; + if (this.configuration.traceSip === true) { + this.logger.log("Received WebSocket text message:\n\n" + finishedData + "\n"); + } + } + if (this.state !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected) { + this.logger.warn("Received message while not connected, discarding..."); + return; + } + if (this.onMessage) { + try { + this.onMessage(finishedData); + } + catch (e) { + this.logger.error(e); + this.logger.error("Exception thrown by onMessage callback"); + throw e; // rethrow unhandled exception + } + } + } + /** + * WebSocket "onopen" event handler. + * @param ev - Event. + */ + onWebSocketOpen(ev, ws) { + if (ws !== this._ws) { + return; + } + if (this._state === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting) { + this.logger.log(`WebSocket opened ${this.server}`); + this.transitionState(_api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected); + } + } + /** + * Helper function to generate an Error. + * @param state - State transitioning to. + */ + transitionLoopDetectedError(state) { + let message = `A state transition loop has been detected.`; + message += ` An attempt to transition from ${this._state} to ${state} before the prior transition completed.`; + message += ` Perhaps you are synchronously calling connect() or disconnect() from a callback or state change handler?`; + this.logger.error(message); + return new _api_exceptions__WEBPACK_IMPORTED_MODULE_3__.StateTransitionError("Loop detected."); + } + /** + * Transition transport state. + * @internal + */ + transitionState(newState, error) { + const invalidTransition = () => { + throw new Error(`Invalid state transition from ${this._state} to ${newState}`); + }; + if (this.transitioningState) { + throw this.transitionLoopDetectedError(newState); + } + this.transitioningState = true; + // Validate state transition + switch (this._state) { + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting: + if (newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected && + newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting && + newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected) { + invalidTransition(); + } + break; + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected: + if (newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting && newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected) { + invalidTransition(); + } + break; + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting: + if (newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting && newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected) { + invalidTransition(); + } + break; + case _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected: + if (newState !== _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting) { + invalidTransition(); + } + break; + default: + throw new Error("Unknown state."); + } + // Update state + const oldState = this._state; + this._state = newState; + // Local copies of connect promises (guarding against callbacks changing them indirectly) + // const connectPromise = this.connectPromise; + const connectResolve = this.connectResolve; + const connectReject = this.connectReject; + // Reset connect promises if no longer connecting + if (oldState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting) { + this.connectPromise = undefined; + this.connectResolve = undefined; + this.connectReject = undefined; + } + // Local copies of disconnect promises (guarding against callbacks changing them indirectly) + // const disconnectPromise = this.disconnectPromise; + const disconnectResolve = this.disconnectResolve; + const disconnectReject = this.disconnectReject; + // Reset disconnect promises if no longer disconnecting + if (oldState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting) { + this.disconnectPromise = undefined; + this.disconnectResolve = undefined; + this.disconnectReject = undefined; + } + // Clear any outstanding connect timeout + if (this.connectTimeout) { + clearTimeout(this.connectTimeout); + this.connectTimeout = undefined; + } + this.logger.log(`Transitioned from ${oldState} to ${this._state}`); + this._stateEventEmitter.emit(this._state); + // Transition to Connected + if (newState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected) { + this.startSendingKeepAlives(); + if (this.onConnect) { + try { + this.onConnect(); + } + catch (e) { + this.logger.error(e); + this.logger.error("Exception thrown by onConnect callback"); + throw e; // rethrow unhandled exception + } + } + } + // Transition from Connected + if (oldState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected) { + this.stopSendingKeepAlives(); + if (this.onDisconnect) { + try { + if (error) { + this.onDisconnect(error); + } + else { + this.onDisconnect(); + } + } + catch (e) { + this.logger.error(e); + this.logger.error("Exception thrown by onDisconnect callback"); + throw e; // rethrow unhandled exception + } + } + } + // Complete connect promise + if (oldState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connecting) { + if (!connectResolve) { + throw new Error("Connect resolve undefined."); + } + if (!connectReject) { + throw new Error("Connect reject undefined."); + } + newState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Connected ? connectResolve() : connectReject(error || new Error("Connect aborted.")); + } + // Complete disconnect promise + if (oldState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnecting) { + if (!disconnectResolve) { + throw new Error("Disconnect resolve undefined."); + } + if (!disconnectReject) { + throw new Error("Disconnect reject undefined."); + } + newState === _api_transport_state__WEBPACK_IMPORTED_MODULE_0__.TransportState.Disconnected + ? disconnectResolve() + : disconnectReject(error || new Error("Disconnect aborted.")); + } + this.transitioningState = false; + } + // TODO: Review "KeepAlive Stuff". + // It is not clear if it works and there are no tests for it. + // It was blindly lifted the keep alive code unchanged from earlier transport code. + // + // From the RFC... + // + // SIP WebSocket Clients and Servers may keep their WebSocket + // connections open by sending periodic WebSocket "Ping" frames as + // described in [RFC6455], Section 5.5.2. + // ... + // The indication and use of the CRLF NAT keep-alive mechanism defined + // for SIP connection-oriented transports in [RFC5626], Section 3.5.1 or + // [RFC6223] are, of course, usable over the transport defined in this + // specification. + // https://tools.ietf.org/html/rfc7118#section-6 + // + // and... + // + // The Ping frame contains an opcode of 0x9. + // https://tools.ietf.org/html/rfc6455#section-5.5.2 + // + // ============================== + // KeepAlive Stuff + // ============================== + clearKeepAliveTimeout() { + if (this.keepAliveDebounceTimeout) { + clearTimeout(this.keepAliveDebounceTimeout); + } + this.keepAliveDebounceTimeout = undefined; + } + /** + * Send a keep-alive (a double-CRLF sequence). + */ + sendKeepAlive() { + if (this.keepAliveDebounceTimeout) { + // We already have an outstanding keep alive, do not send another. + return Promise.resolve(); + } + this.keepAliveDebounceTimeout = setTimeout(() => { + this.clearKeepAliveTimeout(); + }, this.configuration.keepAliveDebounce * 1000); + return this.send("\r\n\r\n"); + } + /** + * Start sending keep-alives. + */ + startSendingKeepAlives() { + // Compute an amount of time in seconds to wait before sending another keep-alive. + const computeKeepAliveTimeout = (upperBound) => { + const lowerBound = upperBound * 0.8; + return 1000 * (Math.random() * (upperBound - lowerBound) + lowerBound); + }; + if (this.configuration.keepAliveInterval && !this.keepAliveInterval) { + this.keepAliveInterval = setInterval(() => { + this.sendKeepAlive(); + this.startSendingKeepAlives(); + }, computeKeepAliveTimeout(this.configuration.keepAliveInterval)); + } + } + /** + * Stop sending keep-alives. + */ + stopSendingKeepAlives() { + if (this.keepAliveInterval) { + clearInterval(this.keepAliveInterval); + } + if (this.keepAliveDebounceTimeout) { + clearTimeout(this.keepAliveDebounceTimeout); + } + this.keepAliveInterval = undefined; + this.keepAliveDebounceTimeout = undefined; + } +} +Transport.defaultOptions = { + server: "", + connectionTimeout: 5, + keepAliveInterval: 0, + keepAliveDebounce: 10, + traceSip: true +}; + + +/***/ }), +/* 58 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "DigestAuthentication": () => (/* binding */ DigestAuthentication) +/* harmony export */ }); +/* harmony import */ var _md5__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(59); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(20); + + +function MD5(s) { + return _md5__WEBPACK_IMPORTED_MODULE_0__.Md5.hashStr(s); +} +/** + * Digest Authentication. + * @internal + */ +class DigestAuthentication { + /** + * Constructor. + * @param loggerFactory - LoggerFactory. + * @param username - Username. + * @param password - Password. + */ + constructor(loggerFactory, ha1, username, password) { + this.logger = loggerFactory.getLogger("sipjs.digestauthentication"); + this.username = username; + this.password = password; + this.ha1 = ha1; + this.nc = 0; + this.ncHex = "00000000"; + } + /** + * Performs Digest authentication given a SIP request and the challenge + * received in a response to that request. + * @param request - + * @param challenge - + * @returns true if credentials were successfully generated, false otherwise. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + authenticate(request, challenge, body) { + // Inspect and validate the challenge. + this.algorithm = challenge.algorithm; + this.realm = challenge.realm; + this.nonce = challenge.nonce; + this.opaque = challenge.opaque; + this.stale = challenge.stale; + if (this.algorithm) { + if (this.algorithm !== "MD5") { + this.logger.warn("challenge with Digest algorithm different than 'MD5', authentication aborted"); + return false; + } + } + else { + this.algorithm = "MD5"; + } + if (!this.realm) { + this.logger.warn("challenge without Digest realm, authentication aborted"); + return false; + } + if (!this.nonce) { + this.logger.warn("challenge without Digest nonce, authentication aborted"); + return false; + } + // 'qop' can contain a list of values (Array). Let's choose just one. + if (challenge.qop) { + if (challenge.qop.indexOf("auth") > -1) { + this.qop = "auth"; + } + else if (challenge.qop.indexOf("auth-int") > -1) { + this.qop = "auth-int"; + } + else { + // Otherwise 'qop' is present but does not contain 'auth' or 'auth-int', so abort here. + this.logger.warn("challenge without Digest qop different than 'auth' or 'auth-int', authentication aborted"); + return false; + } + } + else { + this.qop = undefined; + } + // Fill other attributes. + this.method = request.method; + this.uri = request.ruri; + this.cnonce = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.createRandomToken)(12); + this.nc += 1; + this.updateNcHex(); + // nc-value = 8LHEX. Max value = 'FFFFFFFF'. + if (this.nc === 4294967296) { + this.nc = 1; + this.ncHex = "00000001"; + } + // Calculate the Digest "response" value. + this.calculateResponse(body); + return true; + } + /** + * Return the Proxy-Authorization or WWW-Authorization header value. + */ + toString() { + const authParams = []; + if (!this.response) { + throw new Error("response field does not exist, cannot generate Authorization header"); + } + authParams.push("algorithm=" + this.algorithm); + authParams.push('username="' + this.username + '"'); + authParams.push('realm="' + this.realm + '"'); + authParams.push('nonce="' + this.nonce + '"'); + authParams.push('uri="' + this.uri + '"'); + authParams.push('response="' + this.response + '"'); + if (this.opaque) { + authParams.push('opaque="' + this.opaque + '"'); + } + if (this.qop) { + authParams.push("qop=" + this.qop); + authParams.push('cnonce="' + this.cnonce + '"'); + authParams.push("nc=" + this.ncHex); + } + return "Digest " + authParams.join(", "); + } + /** + * Generate the 'nc' value as required by Digest in this.ncHex by reading this.nc. + */ + updateNcHex() { + const hex = Number(this.nc).toString(16); + this.ncHex = "00000000".substr(0, 8 - hex.length) + hex; + } + /** + * Generate Digest 'response' value. + */ + calculateResponse(body) { + let ha1, ha2; + // HA1 = MD5(A1) = MD5(username:realm:password) + ha1 = this.ha1; + if (ha1 === "" || ha1 === undefined) { + ha1 = MD5(this.username + ":" + this.realm + ":" + this.password); + } + if (this.qop === "auth") { + // HA2 = MD5(A2) = MD5(method:digestURI) + ha2 = MD5(this.method + ":" + this.uri); + // response = MD5(HA1:nonce:nonceCount:credentialsNonce:qop:HA2)` + this.response = MD5(ha1 + ":" + this.nonce + ":" + this.ncHex + ":" + this.cnonce + ":auth:" + ha2); + } + else if (this.qop === "auth-int") { + // HA2 = MD5(A2) = MD5(method:digestURI:MD5(entityBody)) + ha2 = MD5(this.method + ":" + this.uri + ":" + MD5(body ? body : "")); + // response = MD5(HA1:nonce:nonceCount:credentialsNonce:qop:HA2) + this.response = MD5(ha1 + ":" + this.nonce + ":" + this.ncHex + ":" + this.cnonce + ":auth-int:" + ha2); + } + else if (this.qop === undefined) { + // HA2 = MD5(A2) = MD5(method:digestURI) + ha2 = MD5(this.method + ":" + this.uri); + // response = MD5(HA1:nonce:HA2) + this.response = MD5(ha1 + ":" + this.nonce + ":" + ha2); + } + } +} + + +/***/ }), +/* 59 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Md5": () => (/* binding */ Md5) +/* harmony export */ }); +/* eslint-disable */ +// +// Scoped from: https://github.com/cotag/ts-md5 +// +/* + +TypeScript Md5 +============== + +Based on work by +* Joseph Myers: http://www.myersdaily.org/joseph/javascript/md5-text.html +* André Cruz: https://github.com/satazor/SparkMD5 +* Raymond Hill: https://github.com/gorhill/yamd5.js + +Effectively a TypeScrypt re-write of Raymond Hill JS Library + +The MIT License (MIT) + +Copyright (C) 2014 Raymond Hill + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2015 André Cruz + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + + +*/ +class Md5 { + constructor() { + this._dataLength = 0; + this._bufferLength = 0; + this._state = new Int32Array(4); + this._buffer = new ArrayBuffer(68); + this._buffer8 = new Uint8Array(this._buffer, 0, 68); + this._buffer32 = new Uint32Array(this._buffer, 0, 17); + this.start(); + } + static hashStr(str, raw = false) { + return this.onePassHasher + .start() + .appendStr(str) + .end(raw); + } + static hashAsciiStr(str, raw = false) { + return this.onePassHasher + .start() + .appendAsciiStr(str) + .end(raw); + } + static _hex(x) { + const hc = Md5.hexChars; + const ho = Md5.hexOut; + let n; + let offset; + let j; + let i; + for (i = 0; i < 4; i += 1) { + offset = i * 8; + n = x[i]; + for (j = 0; j < 8; j += 2) { + ho[offset + 1 + j] = hc.charAt(n & 0x0F); + n >>>= 4; + ho[offset + 0 + j] = hc.charAt(n & 0x0F); + n >>>= 4; + } + } + return ho.join(''); + } + static _md5cycle(x, k) { + let a = x[0]; + let b = x[1]; + let c = x[2]; + let d = x[3]; + // ff() + a += (b & c | ~b & d) + k[0] - 680876936 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[1] - 389564586 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[2] + 606105819 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[3] - 1044525330 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[4] - 176418897 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[5] + 1200080426 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[6] - 1473231341 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[7] - 45705983 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[8] + 1770035416 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[9] - 1958414417 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[10] - 42063 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[11] - 1990404162 | 0; + b = (b << 22 | b >>> 10) + c | 0; + a += (b & c | ~b & d) + k[12] + 1804603682 | 0; + a = (a << 7 | a >>> 25) + b | 0; + d += (a & b | ~a & c) + k[13] - 40341101 | 0; + d = (d << 12 | d >>> 20) + a | 0; + c += (d & a | ~d & b) + k[14] - 1502002290 | 0; + c = (c << 17 | c >>> 15) + d | 0; + b += (c & d | ~c & a) + k[15] + 1236535329 | 0; + b = (b << 22 | b >>> 10) + c | 0; + // gg() + a += (b & d | c & ~d) + k[1] - 165796510 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[6] - 1069501632 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[11] + 643717713 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[0] - 373897302 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[5] - 701558691 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[10] + 38016083 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[15] - 660478335 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[4] - 405537848 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[9] + 568446438 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[14] - 1019803690 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[3] - 187363961 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[8] + 1163531501 | 0; + b = (b << 20 | b >>> 12) + c | 0; + a += (b & d | c & ~d) + k[13] - 1444681467 | 0; + a = (a << 5 | a >>> 27) + b | 0; + d += (a & c | b & ~c) + k[2] - 51403784 | 0; + d = (d << 9 | d >>> 23) + a | 0; + c += (d & b | a & ~b) + k[7] + 1735328473 | 0; + c = (c << 14 | c >>> 18) + d | 0; + b += (c & a | d & ~a) + k[12] - 1926607734 | 0; + b = (b << 20 | b >>> 12) + c | 0; + // hh() + a += (b ^ c ^ d) + k[5] - 378558 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[8] - 2022574463 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[11] + 1839030562 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[14] - 35309556 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[1] - 1530992060 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[4] + 1272893353 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[7] - 155497632 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[10] - 1094730640 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[13] + 681279174 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[0] - 358537222 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[3] - 722521979 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[6] + 76029189 | 0; + b = (b << 23 | b >>> 9) + c | 0; + a += (b ^ c ^ d) + k[9] - 640364487 | 0; + a = (a << 4 | a >>> 28) + b | 0; + d += (a ^ b ^ c) + k[12] - 421815835 | 0; + d = (d << 11 | d >>> 21) + a | 0; + c += (d ^ a ^ b) + k[15] + 530742520 | 0; + c = (c << 16 | c >>> 16) + d | 0; + b += (c ^ d ^ a) + k[2] - 995338651 | 0; + b = (b << 23 | b >>> 9) + c | 0; + // ii() + a += (c ^ (b | ~d)) + k[0] - 198630844 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[5] - 57434055 | 0; + b = (b << 21 | b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[10] - 1051523 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0; + b = (b << 21 | b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[15] - 30611744 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0; + b = (b << 21 | b >>> 11) + c | 0; + a += (c ^ (b | ~d)) + k[4] - 145523070 | 0; + a = (a << 6 | a >>> 26) + b | 0; + d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0; + d = (d << 10 | d >>> 22) + a | 0; + c += (a ^ (d | ~b)) + k[2] + 718787259 | 0; + c = (c << 15 | c >>> 17) + d | 0; + b += (d ^ (c | ~a)) + k[9] - 343485551 | 0; + b = (b << 21 | b >>> 11) + c | 0; + x[0] = a + x[0] | 0; + x[1] = b + x[1] | 0; + x[2] = c + x[2] | 0; + x[3] = d + x[3] | 0; + } + start() { + this._dataLength = 0; + this._bufferLength = 0; + this._state.set(Md5.stateIdentity); + return this; + } + // Char to code point to to array conversion: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charCodeAt + // #Example.3A_Fixing_charCodeAt_to_handle_non-Basic-Multilingual-Plane_characters_if_their_presence_earlier_in_the_string_is_unknown + appendStr(str) { + const buf8 = this._buffer8; + const buf32 = this._buffer32; + let bufLen = this._bufferLength; + let code; + let i; + for (i = 0; i < str.length; i += 1) { + code = str.charCodeAt(i); + if (code < 128) { + buf8[bufLen++] = code; + } + else if (code < 0x800) { + buf8[bufLen++] = (code >>> 6) + 0xC0; + buf8[bufLen++] = code & 0x3F | 0x80; + } + else if (code < 0xD800 || code > 0xDBFF) { + buf8[bufLen++] = (code >>> 12) + 0xE0; + buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80; + buf8[bufLen++] = (code & 0x3F) | 0x80; + } + else { + code = ((code - 0xD800) * 0x400) + (str.charCodeAt(++i) - 0xDC00) + 0x10000; + if (code > 0x10FFFF) { + throw new Error('Unicode standard supports code points up to U+10FFFF'); + } + buf8[bufLen++] = (code >>> 18) + 0xF0; + buf8[bufLen++] = (code >>> 12 & 0x3F) | 0x80; + buf8[bufLen++] = (code >>> 6 & 0x3F) | 0x80; + buf8[bufLen++] = (code & 0x3F) | 0x80; + } + if (bufLen >= 64) { + this._dataLength += 64; + Md5._md5cycle(this._state, buf32); + bufLen -= 64; + buf32[0] = buf32[16]; + } + } + this._bufferLength = bufLen; + return this; + } + appendAsciiStr(str) { + const buf8 = this._buffer8; + const buf32 = this._buffer32; + let bufLen = this._bufferLength; + let i; + let j = 0; + for (;;) { + i = Math.min(str.length - j, 64 - bufLen); + while (i--) { + buf8[bufLen++] = str.charCodeAt(j++); + } + if (bufLen < 64) { + break; + } + this._dataLength += 64; + Md5._md5cycle(this._state, buf32); + bufLen = 0; + } + this._bufferLength = bufLen; + return this; + } + appendByteArray(input) { + const buf8 = this._buffer8; + const buf32 = this._buffer32; + let bufLen = this._bufferLength; + let i; + let j = 0; + for (;;) { + i = Math.min(input.length - j, 64 - bufLen); + while (i--) { + buf8[bufLen++] = input[j++]; + } + if (bufLen < 64) { + break; + } + this._dataLength += 64; + Md5._md5cycle(this._state, buf32); + bufLen = 0; + } + this._bufferLength = bufLen; + return this; + } + getState() { + const self = this; + const s = self._state; + return { + buffer: String.fromCharCode.apply(null, self._buffer8), + buflen: self._bufferLength, + length: self._dataLength, + state: [s[0], s[1], s[2], s[3]] + }; + } + setState(state) { + const buf = state.buffer; + const x = state.state; + const s = this._state; + let i; + this._dataLength = state.length; + this._bufferLength = state.buflen; + s[0] = x[0]; + s[1] = x[1]; + s[2] = x[2]; + s[3] = x[3]; + for (i = 0; i < buf.length; i += 1) { + this._buffer8[i] = buf.charCodeAt(i); + } + } + end(raw = false) { + const bufLen = this._bufferLength; + const buf8 = this._buffer8; + const buf32 = this._buffer32; + const i = (bufLen >> 2) + 1; + let dataBitsLen; + this._dataLength += bufLen; + buf8[bufLen] = 0x80; + buf8[bufLen + 1] = buf8[bufLen + 2] = buf8[bufLen + 3] = 0; + buf32.set(Md5.buffer32Identity.subarray(i), i); + if (bufLen > 55) { + Md5._md5cycle(this._state, buf32); + buf32.set(Md5.buffer32Identity); + } + // Do the final computation based on the tail and length + // Beware that the final length may not fit in 32 bits so we take care of that + dataBitsLen = this._dataLength * 8; + if (dataBitsLen <= 0xFFFFFFFF) { + buf32[14] = dataBitsLen; + } + else { + const matches = dataBitsLen.toString(16).match(/(.*?)(.{0,8})$/); + if (matches === null) { + return; + } + const lo = parseInt(matches[2], 16); + const hi = parseInt(matches[1], 16) || 0; + buf32[14] = lo; + buf32[15] = hi; + } + Md5._md5cycle(this._state, buf32); + return raw ? this._state : Md5._hex(this._state); + } +} +// Private Static Variables +Md5.stateIdentity = new Int32Array([1732584193, -271733879, -1732584194, 271733878]); +Md5.buffer32Identity = new Int32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); +Md5.hexChars = '0123456789abcdef'; +Md5.hexOut = []; +// Permanent instance is to use for one-call hashing +Md5.onePassHasher = new Md5(); +if (Md5.hashStr('hello') !== '5d41402abc4b2a76b9719d911017c592') { + console.error('Md5 self test failed.'); +} + + +/***/ }), +/* 60 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "UserAgentCore": () => (/* binding */ UserAgentCore) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(29); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(27); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(83); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(64); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(63); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(71); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(61); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(76); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(90); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(91); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(92); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(62); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(95); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(87); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(86); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(89); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(96); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(97); +/* harmony import */ var _allowed_methods__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(28); + + + + +/** + * This is ported from UA.C.ACCEPTED_BODY_TYPES. + * FIXME: TODO: Should be configurable/variable. + */ +const acceptedBodyTypes = ["application/sdp", "application/dtmf-relay"]; +/** + * User Agent Core. + * @remarks + * Core designates the functions specific to a particular type + * of SIP entity, i.e., specific to either a stateful or stateless + * proxy, a user agent or registrar. All cores, except those for + * the stateless proxy, are transaction users. + * https://tools.ietf.org/html/rfc3261#section-6 + * + * UAC Core: The set of processing functions required of a UAC that + * reside above the transaction and transport layers. + * https://tools.ietf.org/html/rfc3261#section-6 + * + * UAS Core: The set of processing functions required at a UAS that + * resides above the transaction and transport layers. + * https://tools.ietf.org/html/rfc3261#section-6 + * @public + */ +class UserAgentCore { + /** + * Constructor. + * @param configuration - Configuration. + * @param delegate - Delegate. + */ + constructor(configuration, delegate = {}) { + /** UACs. */ + this.userAgentClients = new Map(); + /** UASs. */ + this.userAgentServers = new Map(); + this.configuration = configuration; + this.delegate = delegate; + this.dialogs = new Map(); + this.subscribers = new Map(); + this.logger = configuration.loggerFactory.getLogger("sip.user-agent-core"); + } + /** Destructor. */ + dispose() { + this.reset(); + } + /** Reset. */ + reset() { + this.dialogs.forEach((dialog) => dialog.dispose()); + this.dialogs.clear(); + this.subscribers.forEach((subscriber) => subscriber.dispose()); + this.subscribers.clear(); + this.userAgentClients.forEach((uac) => uac.dispose()); + this.userAgentClients.clear(); + this.userAgentServers.forEach((uac) => uac.dispose()); + this.userAgentServers.clear(); + } + /** Logger factory. */ + get loggerFactory() { + return this.configuration.loggerFactory; + } + /** Transport. */ + get transport() { + const transport = this.configuration.transportAccessor(); + if (!transport) { + throw new Error("Transport undefined."); + } + return transport; + } + /** + * Send INVITE. + * @param request - Outgoing request. + * @param delegate - Request delegate. + */ + invite(request, delegate) { + return new _user_agents__WEBPACK_IMPORTED_MODULE_0__.InviteUserAgentClient(this, request, delegate); + } + /** + * Send MESSAGE. + * @param request - Outgoing request. + * @param delegate - Request delegate. + */ + message(request, delegate) { + return new _user_agents__WEBPACK_IMPORTED_MODULE_1__.MessageUserAgentClient(this, request, delegate); + } + /** + * Send PUBLISH. + * @param request - Outgoing request. + * @param delegate - Request delegate. + */ + publish(request, delegate) { + return new _user_agents__WEBPACK_IMPORTED_MODULE_2__.PublishUserAgentClient(this, request, delegate); + } + /** + * Send REGISTER. + * @param request - Outgoing request. + * @param delegate - Request delegate. + */ + register(request, delegate) { + return new _user_agents__WEBPACK_IMPORTED_MODULE_3__.RegisterUserAgentClient(this, request, delegate); + } + /** + * Send SUBSCRIBE. + * @param request - Outgoing request. + * @param delegate - Request delegate. + */ + subscribe(request, delegate) { + return new _user_agents__WEBPACK_IMPORTED_MODULE_4__.SubscribeUserAgentClient(this, request, delegate); + } + /** + * Send a request. + * @param request - Outgoing request. + * @param delegate - Request delegate. + */ + request(request, delegate) { + return new _user_agents__WEBPACK_IMPORTED_MODULE_5__.UserAgentClient(_transactions__WEBPACK_IMPORTED_MODULE_6__.NonInviteClientTransaction, this, request, delegate); + } + /** + * Outgoing request message factory function. + * @param method - Method. + * @param requestURI - Request-URI. + * @param fromURI - From URI. + * @param toURI - To URI. + * @param options - Request options. + * @param extraHeaders - Extra headers to add. + * @param body - Message body. + */ + makeOutgoingRequestMessage(method, requestURI, fromURI, toURI, options, extraHeaders, body) { + // default values from user agent configuration + const callIdPrefix = this.configuration.sipjsId; + const fromDisplayName = this.configuration.displayName; + const forceRport = this.configuration.viaForceRport; + const hackViaTcp = this.configuration.hackViaTcp; + const optionTags = this.configuration.supportedOptionTags.slice(); + if (method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.REGISTER) { + optionTags.push("path", "gruu"); + } + if (method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.INVITE && (this.configuration.contact.pubGruu || this.configuration.contact.tempGruu)) { + optionTags.push("gruu"); + } + const routeSet = this.configuration.routeSet; + const userAgentString = this.configuration.userAgentHeaderFieldValue; + const viaHost = this.configuration.viaHost; + const defaultOptions = { + callIdPrefix, + forceRport, + fromDisplayName, + hackViaTcp, + optionTags, + routeSet, + userAgentString, + viaHost + }; + // merge provided options with default options + const requestOptions = Object.assign(Object.assign({}, defaultOptions), options); + return new _messages__WEBPACK_IMPORTED_MODULE_8__.OutgoingRequestMessage(method, requestURI, fromURI, toURI, requestOptions, extraHeaders, body); + } + /** + * Handle an incoming request message from the transport. + * @param message - Incoming request message from transport layer. + */ + receiveIncomingRequestFromTransport(message) { + this.receiveRequestFromTransport(message); + } + /** + * Handle an incoming response message from the transport. + * @param message - Incoming response message from transport layer. + */ + receiveIncomingResponseFromTransport(message) { + this.receiveResponseFromTransport(message); + } + /** + * A stateless UAS is a UAS that does not maintain transaction state. + * It replies to requests normally, but discards any state that would + * ordinarily be retained by a UAS after a response has been sent. If a + * stateless UAS receives a retransmission of a request, it regenerates + * the response and re-sends it, just as if it were replying to the first + * instance of the request. A UAS cannot be stateless unless the request + * processing for that method would always result in the same response + * if the requests are identical. This rules out stateless registrars, + * for example. Stateless UASs do not use a transaction layer; they + * receive requests directly from the transport layer and send responses + * directly to the transport layer. + * https://tools.ietf.org/html/rfc3261#section-8.2.7 + * @param message - Incoming request message to reply to. + * @param statusCode - Status code to reply with. + */ + replyStateless(message, options) { + const userAgent = this.configuration.userAgentHeaderFieldValue; + const supported = this.configuration.supportedOptionTagsResponse; + options = Object.assign(Object.assign({}, options), { userAgent, supported }); + const response = (0,_messages__WEBPACK_IMPORTED_MODULE_9__.constructOutgoingResponse)(message, options); + this.transport.send(response.message).catch((error) => { + // If the transport rejects, it SHOULD reject with a TransportError. + // But the transport may be external code, so we are careful... + if (error instanceof Error) { + this.logger.error(error.message); + } + this.logger.error(`Transport error occurred sending stateless reply to ${message.method} request.`); + // TODO: Currently there is no hook to provide notification that a transport error occurred + // and throwing would result in an uncaught error (in promise), so we silently eat the error. + // Furthermore, silently eating stateless reply transport errors is arguably what we want to do here. + }); + return response; + } + /** + * In Section 18.2.1, replace the last paragraph with: + * + * Next, the server transport attempts to match the request to a + * server transaction. It does so using the matching rules described + * in Section 17.2.3. If a matching server transaction is found, the + * request is passed to that transaction for processing. If no match + * is found, the request is passed to the core, which may decide to + * construct a new server transaction for that request. + * https://tools.ietf.org/html/rfc6026#section-8.10 + * @param message - Incoming request message from transport layer. + */ + receiveRequestFromTransport(message) { + // When a request is received from the network by the server, it has to + // be matched to an existing transaction. This is accomplished in the + // following manner. + // + // The branch parameter in the topmost Via header field of the request + // is examined. If it is present and begins with the magic cookie + // "z9hG4bK", the request was generated by a client transaction + // compliant to this specification. Therefore, the branch parameter + // will be unique across all transactions sent by that client. The + // request matches a transaction if: + // + // 1. the branch parameter in the request is equal to the one in the + // top Via header field of the request that created the + // transaction, and + // + // 2. the sent-by value in the top Via of the request is equal to the + // one in the request that created the transaction, and + // + // 3. the method of the request matches the one that created the + // transaction, except for ACK, where the method of the request + // that created the transaction is INVITE. + // + // This matching rule applies to both INVITE and non-INVITE transactions + // alike. + // + // The sent-by value is used as part of the matching process because + // there could be accidental or malicious duplication of branch + // parameters from different clients. + // https://tools.ietf.org/html/rfc3261#section-17.2.3 + const transactionId = message.viaBranch; // FIXME: Currently only using rule 1... + const uas = this.userAgentServers.get(transactionId); + // When receiving an ACK that matches an existing INVITE server + // transaction and that does not contain a branch parameter containing + // the magic cookie defined in RFC 3261, the matching transaction MUST + // be checked to see if it is in the "Accepted" state. If it is, then + // the ACK must be passed directly to the transaction user instead of + // being absorbed by the transaction state machine. This is necessary + // as requests from RFC 2543 clients will not include a unique branch + // parameter, and the mechanisms for calculating the transaction ID from + // such a request will be the same for both INVITE and ACKs. + // https://tools.ietf.org/html/rfc6026#section-6 + // Any ACKs received from the network while in the "Accepted" state MUST be + // passed directly to the TU and not absorbed. + // https://tools.ietf.org/html/rfc6026#section-7.1 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.ACK) { + if (uas && uas.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_10__.TransactionState.Accepted) { + if (uas instanceof _user_agents__WEBPACK_IMPORTED_MODULE_11__.InviteUserAgentServer) { + // These are ACKs matching an INVITE server transaction. + // These should never happen with RFC 3261 compliant user agents + // (would be a broken ACK to negative final response or something) + // but is apparently how RFC 2543 user agents do things. + // We are not currently supporting this case. + // NOTE: Not backwards compatible with RFC 2543 (no support for strict-routing). + this.logger.warn(`Discarding out of dialog ACK after 2xx response sent on transaction ${transactionId}.`); + return; + } + } + } + // The CANCEL method requests that the TU at the server side cancel a + // pending transaction. The TU determines the transaction to be + // cancelled by taking the CANCEL request, and then assuming that the + // request method is anything but CANCEL or ACK and applying the + // transaction matching procedures of Section 17.2.3. The matching + // transaction is the one to be cancelled. + // https://tools.ietf.org/html/rfc3261#section-9.2 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.CANCEL) { + if (uas) { + // Regardless of the method of the original request, as long as the + // CANCEL matched an existing transaction, the UAS answers the CANCEL + // request itself with a 200 (OK) response. + // https://tools.ietf.org/html/rfc3261#section-9.2 + this.replyStateless(message, { statusCode: 200 }); + // If the transaction for the original request still exists, the behavior + // of the UAS on receiving a CANCEL request depends on whether it has already + // sent a final response for the original request. If it has, the CANCEL + // request has no effect on the processing of the original request, no + // effect on any session state, and no effect on the responses generated + // for the original request. If the UAS has not issued a final response + // for the original request, its behavior depends on the method of the + // original request. If the original request was an INVITE, the UAS + // SHOULD immediately respond to the INVITE with a 487 (Request + // Terminated). + // https://tools.ietf.org/html/rfc3261#section-9.2 + if (uas.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_12__.InviteServerTransaction && + uas.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_10__.TransactionState.Proceeding) { + if (uas instanceof _user_agents__WEBPACK_IMPORTED_MODULE_11__.InviteUserAgentServer) { + uas.receiveCancel(message); + } + // A CANCEL request has no impact on the processing of + // transactions with any other method defined in this specification. + // https://tools.ietf.org/html/rfc3261#section-9.2 + } + } + else { + // If the UAS did not find a matching transaction for the CANCEL + // according to the procedure above, it SHOULD respond to the CANCEL + // with a 481 (Call Leg/Transaction Does Not Exist). + // https://tools.ietf.org/html/rfc3261#section-9.2 + this.replyStateless(message, { statusCode: 481 }); + } + return; + } + // If a matching server transaction is found, the request is passed to that + // transaction for processing. + // https://tools.ietf.org/html/rfc6026#section-8.10 + if (uas) { + uas.transaction.receiveRequest(message); + return; + } + // If no match is found, the request is passed to the core, which may decide to + // construct a new server transaction for that request. + // https://tools.ietf.org/html/rfc6026#section-8.10 + this.receiveRequest(message); + return; + } + /** + * UAC and UAS procedures depend strongly on two factors. First, based + * on whether the request or response is inside or outside of a dialog, + * and second, based on the method of a request. Dialogs are discussed + * thoroughly in Section 12; they represent a peer-to-peer relationship + * between user agents and are established by specific SIP methods, such + * as INVITE. + * @param message - Incoming request message. + */ + receiveRequest(message) { + // 8.2 UAS Behavior + // UASs SHOULD process the requests in the order of the steps that + // follow in this section (that is, starting with authentication, then + // inspecting the method, the header fields, and so on throughout the + // remainder of this section). + // https://tools.ietf.org/html/rfc3261#section-8.2 + // 8.2.1 Method Inspection + // Once a request is authenticated (or authentication is skipped), the + // UAS MUST inspect the method of the request. If the UAS recognizes + // but does not support the method of a request, it MUST generate a 405 + // (Method Not Allowed) response. Procedures for generating responses + // are described in Section 8.2.6. The UAS MUST also add an Allow + // header field to the 405 (Method Not Allowed) response. The Allow + // header field MUST list the set of methods supported by the UAS + // generating the message. + // https://tools.ietf.org/html/rfc3261#section-8.2.1 + if (!_allowed_methods__WEBPACK_IMPORTED_MODULE_13__.AllowedMethods.includes(message.method)) { + const allowHeader = "Allow: " + _allowed_methods__WEBPACK_IMPORTED_MODULE_13__.AllowedMethods.toString(); + this.replyStateless(message, { + statusCode: 405, + extraHeaders: [allowHeader] + }); + return; + } + // 8.2.2 Header Inspection + // https://tools.ietf.org/html/rfc3261#section-8.2.2 + if (!message.ruri) { + // FIXME: A request message should always have an ruri + throw new Error("Request-URI undefined."); + } + // 8.2.2.1 To and Request-URI + // If the Request-URI uses a scheme not supported by the UAS, it SHOULD + // reject the request with a 416 (Unsupported URI Scheme) response. + // https://tools.ietf.org/html/rfc3261#section-8.2.2.1 + if (message.ruri.scheme !== "sip") { + this.replyStateless(message, { statusCode: 416 }); + return; + } + // 8.2.2.1 To and Request-URI + // If the Request-URI does not identify an address that the + // UAS is willing to accept requests for, it SHOULD reject + // the request with a 404 (Not Found) response. + // https://tools.ietf.org/html/rfc3261#section-8.2.2.1 + const ruri = message.ruri; + const ruriMatches = (uri) => { + return !!uri && uri.user === ruri.user; + }; + if (!ruriMatches(this.configuration.aor) && + !(ruriMatches(this.configuration.contact.uri) || + ruriMatches(this.configuration.contact.pubGruu) || + ruriMatches(this.configuration.contact.tempGruu))) { + this.logger.warn("Request-URI does not point to us."); + if (message.method !== _messages__WEBPACK_IMPORTED_MODULE_7__.C.ACK) { + this.replyStateless(message, { statusCode: 404 }); + } + return; + } + // 8.2.2.1 To and Request-URI + // Other potential sources of received Request-URIs include + // the Contact header fields of requests and responses sent by the UA + // that establish or refresh dialogs. + // https://tools.ietf.org/html/rfc3261#section-8.2.2.1 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.INVITE) { + if (!message.hasHeader("Contact")) { + this.replyStateless(message, { + statusCode: 400, + reasonPhrase: "Missing Contact Header" + }); + return; + } + } + // 8.2.2.2 Merged Requests + // If the request has no tag in the To header field, the UAS core MUST + // check the request against ongoing transactions. If the From tag, + // Call-ID, and CSeq exactly match those associated with an ongoing + // transaction, but the request does not match that transaction (based + // on the matching rules in Section 17.2.3), the UAS core SHOULD + // generate a 482 (Loop Detected) response and pass it to the server + // transaction. + // + // The same request has arrived at the UAS more than once, following + // different paths, most likely due to forking. The UAS processes + // the first such request received and responds with a 482 (Loop + // Detected) to the rest of them. + // https://tools.ietf.org/html/rfc3261#section-8.2.2.2 + if (!message.toTag) { + const transactionId = message.viaBranch; + if (!this.userAgentServers.has(transactionId)) { + const mergedRequest = Array.from(this.userAgentServers.values()).some((uas) => uas.transaction.request.fromTag === message.fromTag && + uas.transaction.request.callId === message.callId && + uas.transaction.request.cseq === message.cseq); + if (mergedRequest) { + this.replyStateless(message, { statusCode: 482 }); + return; + } + } + } + // 8.2.2.3 Require + // https://tools.ietf.org/html/rfc3261#section-8.2.2.3 + // TODO + // 8.2.3 Content Processing + // https://tools.ietf.org/html/rfc3261#section-8.2.3 + // TODO + // 8.2.4 Applying Extensions + // https://tools.ietf.org/html/rfc3261#section-8.2.4 + // TODO + // 8.2.5 Processing the Request + // Assuming all of the checks in the previous subsections are passed, + // the UAS processing becomes method-specific. + // https://tools.ietf.org/html/rfc3261#section-8.2.5 + // The UAS will receive the request from the transaction layer. If the + // request has a tag in the To header field, the UAS core computes the + // dialog identifier corresponding to the request and compares it with + // existing dialogs. If there is a match, this is a mid-dialog request. + // In that case, the UAS first applies the same processing rules for + // requests outside of a dialog, discussed in Section 8.2. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + if (message.toTag) { + this.receiveInsideDialogRequest(message); + } + else { + this.receiveOutsideDialogRequest(message); + } + return; + } + /** + * Once a dialog has been established between two UAs, either of them + * MAY initiate new transactions as needed within the dialog. The UA + * sending the request will take the UAC role for the transaction. The + * UA receiving the request will take the UAS role. Note that these may + * be different roles than the UAs held during the transaction that + * established the dialog. + * https://tools.ietf.org/html/rfc3261#section-12.2 + * @param message - Incoming request message. + */ + receiveInsideDialogRequest(message) { + // NOTIFY requests are matched to such SUBSCRIBE requests if they + // contain the same "Call-ID", a "To" header field "tag" parameter that + // matches the "From" header field "tag" parameter of the SUBSCRIBE + // request, and the same "Event" header field. Rules for comparisons of + // the "Event" header fields are described in Section 8.2.1. + // https://tools.ietf.org/html/rfc6665#section-4.4.1 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.NOTIFY) { + const event = message.parseHeader("Event"); + if (!event || !event.event) { + this.replyStateless(message, { statusCode: 489 }); + return; + } + // FIXME: Subscriber id should also matching on event id. + const subscriberId = message.callId + message.toTag + event.event; + const subscriber = this.subscribers.get(subscriberId); + if (subscriber) { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_14__.NotifyUserAgentServer(this, message); + subscriber.onNotify(uas); + return; + } + } + // Requests sent within a dialog, as any other requests, are atomic. If + // a particular request is accepted by the UAS, all the state changes + // associated with it are performed. If the request is rejected, none + // of the state changes are performed. + // + // Note that some requests, such as INVITEs, affect several pieces of + // state. + // + // The UAS will receive the request from the transaction layer. If the + // request has a tag in the To header field, the UAS core computes the + // dialog identifier corresponding to the request and compares it with + // existing dialogs. If there is a match, this is a mid-dialog request. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + const dialogId = message.callId + message.toTag + message.fromTag; + const dialog = this.dialogs.get(dialogId); + if (dialog) { + // [Sip-implementors] Reg. SIP reinvite, UPDATE and OPTIONS + // You got the question right. + // + // And you got the right answer too. :-) + // + // Thanks, + // Paul + // + // Robert Sparks wrote: + // > So I've lost track of the question during the musing. + // > + // > I _think_ the fundamental question being asked is this: + // > + // > Is an endpoint required to reject (with a 481) an OPTIONS request that + // > arrives with at to-tag but does not match any existing dialog state. + // > (Assuming some earlier requirement hasn't forced another error code). Or + // > is it OK if it just sends + // > a 200 OK anyhow. + // > + // > My take on the collection of specs is that its _not_ ok for it to send + // > the 200 OK anyhow and that it is required to send + // > the 481. I base this primarily on these sentences from 11.2 in 3261: + // > + // > The response to an OPTIONS is constructed using the standard rules + // > for a SIP response as discussed in Section 8.2.6. The response code + // > chosen MUST be the same that would have been chosen had the request + // > been an INVITE. + // > + // > Did I miss the point of the question? + // > + // > On May 15, 2008, at 12:48 PM, Paul Kyzivat wrote: + // > + // >> [Including Robert in hopes of getting his insight on this.] + // https://lists.cs.columbia.edu/pipermail/sip-implementors/2008-May/019178.html + // + // Requests that do not change in any way the state of a dialog may be + // received within a dialog (for example, an OPTIONS request). They are + // processed as if they had been received outside the dialog. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.OPTIONS) { + const allowHeader = "Allow: " + _allowed_methods__WEBPACK_IMPORTED_MODULE_13__.AllowedMethods.toString(); + const acceptHeader = "Accept: " + acceptedBodyTypes.toString(); + this.replyStateless(message, { + statusCode: 200, + extraHeaders: [allowHeader, acceptHeader] + }); + return; + } + // Pass the incoming request to the dialog for further handling. + dialog.receiveRequest(message); + return; + } + // The most important behaviors of a stateless UAS are the following: + // ... + // o A stateless UAS MUST ignore ACK requests. + // ... + // https://tools.ietf.org/html/rfc3261#section-8.2.7 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_7__.C.ACK) { + // If a final response to an INVITE was sent statelessly, + // the corresponding ACK: + // - will not match an existing transaction + // - may have tag in the To header field + // - not not match any existing dialogs + // Absorb unmatched ACKs. + return; + } + // If the request has a tag in the To header field, but the dialog + // identifier does not match any existing dialogs, the UAS may have + // crashed and restarted, or it may have received a request for a + // different (possibly failed) UAS (the UASs can construct the To tags + // so that a UAS can identify that the tag was for a UAS for which it is + // providing recovery). Another possibility is that the incoming + // request has been simply mis-routed. Based on the To tag, the UAS MAY + // either accept or reject the request. Accepting the request for + // acceptable To tags provides robustness, so that dialogs can persist + // even through crashes. UAs wishing to support this capability must + // take into consideration some issues such as choosing monotonically + // increasing CSeq sequence numbers even across reboots, reconstructing + // the route set, and accepting out-of-range RTP timestamps and sequence + // numbers. + // + // If the UAS wishes to reject the request because it does not wish to + // recreate the dialog, it MUST respond to the request with a 481 + // (Call/Transaction Does Not Exist) status code and pass that to the + // server transaction. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + this.replyStateless(message, { statusCode: 481 }); + return; + } + /** + * Assuming all of the checks in the previous subsections are passed, + * the UAS processing becomes method-specific. + * https://tools.ietf.org/html/rfc3261#section-8.2.5 + * @param message - Incoming request message. + */ + receiveOutsideDialogRequest(message) { + switch (message.method) { + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.ACK: + // Absorb stray out of dialog ACKs + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.BYE: + // If the BYE does not match an existing dialog, the UAS core SHOULD + // generate a 481 (Call/Transaction Does Not Exist) response and pass + // that to the server transaction. This rule means that a BYE sent + // without tags by a UAC will be rejected. + // https://tools.ietf.org/html/rfc3261#section-15.1.2 + this.replyStateless(message, { statusCode: 481 }); + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.CANCEL: + throw new Error(`Unexpected out of dialog request method ${message.method}.`); + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.INFO: + // Use of the INFO method does not constitute a separate dialog usage. + // INFO messages are always part of, and share the fate of, an invite + // dialog usage [RFC5057]. INFO messages cannot be sent as part of + // other dialog usages, or outside an existing dialog. + // https://tools.ietf.org/html/rfc6086#section-1 + this.replyStateless(message, { statusCode: 405 }); // Should never happen + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.INVITE: + // https://tools.ietf.org/html/rfc3261#section-13.3.1 + { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_11__.InviteUserAgentServer(this, message); + this.delegate.onInvite ? this.delegate.onInvite(uas) : uas.reject(); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.MESSAGE: + // MESSAGE requests are discouraged inside a dialog. Implementations + // are restricted from creating a usage for the purpose of carrying a + // sequence of MESSAGE requests (though some implementations use it that + // way, against the standard recommendation). + // https://tools.ietf.org/html/rfc5057#section-5.3 + { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_15__.MessageUserAgentServer(this, message); + this.delegate.onMessage ? this.delegate.onMessage(uas) : uas.accept(); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.NOTIFY: + // Obsoleted by: RFC 6665 + // If any non-SUBSCRIBE mechanisms are defined to create subscriptions, + // it is the responsibility of the parties defining those mechanisms to + // ensure that correlation of a NOTIFY message to the corresponding + // subscription is possible. Designers of such mechanisms are also + // warned to make a distinction between sending a NOTIFY message to a + // subscriber who is aware of the subscription, and sending a NOTIFY + // message to an unsuspecting node. The latter behavior is invalid, and + // MUST receive a "481 Subscription does not exist" response (unless + // some other 400- or 500-class error code is more applicable), as + // described in section 3.2.4. In other words, knowledge of a + // subscription must exist in both the subscriber and the notifier to be + // valid, even if installed via a non-SUBSCRIBE mechanism. + // https://tools.ietf.org/html/rfc3265#section-3.2 + // + // NOTIFY requests are sent to inform subscribers of changes in state to + // which the subscriber has a subscription. Subscriptions are created + // using the SUBSCRIBE method. In legacy implementations, it is + // possible that other means of subscription creation have been used. + // However, this specification does not allow the creation of + // subscriptions except through SUBSCRIBE requests and (for backwards- + // compatibility) REFER requests [RFC3515]. + // https://tools.ietf.org/html/rfc6665#section-3.2 + { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_14__.NotifyUserAgentServer(this, message); + this.delegate.onNotify ? this.delegate.onNotify(uas) : uas.reject({ statusCode: 405 }); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.OPTIONS: + // https://tools.ietf.org/html/rfc3261#section-11.2 + { + const allowHeader = "Allow: " + _allowed_methods__WEBPACK_IMPORTED_MODULE_13__.AllowedMethods.toString(); + const acceptHeader = "Accept: " + acceptedBodyTypes.toString(); + this.replyStateless(message, { + statusCode: 200, + extraHeaders: [allowHeader, acceptHeader] + }); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.REFER: + // https://tools.ietf.org/html/rfc3515#section-2.4.2 + { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_16__.ReferUserAgentServer(this, message); + this.delegate.onRefer ? this.delegate.onRefer(uas) : uas.reject({ statusCode: 405 }); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.REGISTER: + // https://tools.ietf.org/html/rfc3261#section-10.3 + { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_17__.RegisterUserAgentServer(this, message); + this.delegate.onRegister ? this.delegate.onRegister(uas) : uas.reject({ statusCode: 405 }); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_7__.C.SUBSCRIBE: + // https://tools.ietf.org/html/rfc6665#section-4.2 + { + const uas = new _user_agents__WEBPACK_IMPORTED_MODULE_18__.SubscribeUserAgentServer(this, message); + this.delegate.onSubscribe ? this.delegate.onSubscribe(uas) : uas.reject({ statusCode: 480 }); + } + break; + default: + throw new Error(`Unexpected out of dialog request method ${message.method}.`); + } + return; + } + /** + * Responses are first processed by the transport layer and then passed + * up to the transaction layer. The transaction layer performs its + * processing and then passes the response up to the TU. The majority + * of response processing in the TU is method specific. However, there + * are some general behaviors independent of the method. + * https://tools.ietf.org/html/rfc3261#section-8.1.3 + * @param message - Incoming response message from transport layer. + */ + receiveResponseFromTransport(message) { + // 8.1.3.1 Transaction Layer Errors + // https://tools.ietf.org/html/rfc3261#section-8.1.3.1 + // Handled by transaction layer callbacks. + // 8.1.3.2 Unrecognized Responses + // https://tools.ietf.org/html/rfc3261#section-8.1.3.1 + // TODO + // 8.1.3.3 Vias + // https://tools.ietf.org/html/rfc3261#section-8.1.3.3 + if (message.getHeaders("via").length > 1) { + this.logger.warn("More than one Via header field present in the response, dropping"); + return; + } + // 8.1.3.4 Processing 3xx Responses + // https://tools.ietf.org/html/rfc3261#section-8.1.3.4 + // TODO + // 8.1.3.5 Processing 4xx Responses + // https://tools.ietf.org/html/rfc3261#section-8.1.3.5 + // TODO + // When the transport layer in the client receives a response, it has to + // determine which client transaction will handle the response, so that + // the processing of Sections 17.1.1 and 17.1.2 can take place. The + // branch parameter in the top Via header field is used for this + // purpose. A response matches a client transaction under two + // conditions: + // + // 1. If the response has the same value of the branch parameter in + // the top Via header field as the branch parameter in the top + // Via header field of the request that created the transaction. + // + // 2. If the method parameter in the CSeq header field matches the + // method of the request that created the transaction. The + // method is needed since a CANCEL request constitutes a + // different transaction, but shares the same value of the branch + // parameter. + // https://tools.ietf.org/html/rfc3261#section-17.1.3 + const userAgentClientId = message.viaBranch + message.method; + const userAgentClient = this.userAgentClients.get(userAgentClientId); + // The client transport uses the matching procedures of Section + // 17.1.3 to attempt to match the response to an existing + // transaction. If there is a match, the response MUST be passed to + // that transaction. Otherwise, any element other than a stateless + // proxy MUST silently discard the response. + // https://tools.ietf.org/html/rfc6026#section-8.9 + if (userAgentClient) { + userAgentClient.transaction.receiveResponse(message); + } + else { + this.logger.warn(`Discarding unmatched ${message.statusCode} response to ${message.method} ${userAgentClientId}.`); + } + } +} + + +/***/ }), +/* 61 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "InviteUserAgentClient": () => (/* binding */ InviteUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _dialogs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); +/* harmony import */ var _dialogs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(30); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(63); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + + +/** + * INVITE UAC. + * @remarks + * 13 Initiating a Session + * https://tools.ietf.org/html/rfc3261#section-13 + * 13.1 Overview + * https://tools.ietf.org/html/rfc3261#section-13.1 + * 13.2 UAC Processing + * https://tools.ietf.org/html/rfc3261#section-13.2 + * @public + */ +class InviteUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.InviteClientTransaction, core, message, delegate); + this.confirmedDialogAcks = new Map(); + this.confirmedDialogs = new Map(); + this.earlyDialogs = new Map(); + this.delegate = delegate; + } + dispose() { + // The UAC core considers the INVITE transaction completed 64*T1 seconds + // after the reception of the first 2xx response. At this point all the + // early dialogs that have not transitioned to established dialogs are + // terminated. Once the INVITE transaction is considered completed by + // the UAC core, no more new 2xx responses are expected to arrive. + // + // If, after acknowledging any 2xx response to an INVITE, the UAC does + // not want to continue with that dialog, then the UAC MUST terminate + // the dialog by sending a BYE request as described in Section 15. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + this.earlyDialogs.forEach((earlyDialog) => earlyDialog.dispose()); + this.earlyDialogs.clear(); + super.dispose(); + } + /** + * Special case for transport error while sending ACK. + * @param error - Transport error + */ + onTransportError(error) { + if (this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_2__.TransactionState.Calling) { + return super.onTransportError(error); + } + // If not in 'calling' state, the transport error occurred while sending an ACK. + this.logger.error(error.message); + this.logger.error("User agent client request transport error while sending ACK."); + } + /** + * Once the INVITE has been passed to the INVITE client transaction, the + * UAC waits for responses for the INVITE. + * https://tools.ietf.org/html/rfc3261#section-13.2.2 + * @param incomingResponse - Incoming response to INVITE request. + */ + receiveResponse(message) { + if (!this.authenticationGuard(message)) { + return; + } + const statusCode = message.statusCode ? message.statusCode.toString() : ""; + if (!statusCode) { + throw new Error("Response status code undefined."); + } + switch (true) { + case /^100$/.test(statusCode): + if (this.delegate && this.delegate.onTrying) { + this.delegate.onTrying({ message }); + } + return; + case /^1[0-9]{2}$/.test(statusCode): + // Zero, one or multiple provisional responses may arrive before one or + // more final responses are received. Provisional responses for an + // INVITE request can create "early dialogs". If a provisional response + // has a tag in the To field, and if the dialog ID of the response does + // not match an existing dialog, one is constructed using the procedures + // defined in Section 12.1.2. + // + // The early dialog will only be needed if the UAC needs to send a + // request to its peer within the dialog before the initial INVITE + // transaction completes. Header fields present in a provisional + // response are applicable as long as the dialog is in the early state + // (for example, an Allow header field in a provisional response + // contains the methods that can be used in the dialog while this is in + // the early state). + // https://tools.ietf.org/html/rfc3261#section-13.2.2.1 + { + // Dialogs are created through the generation of non-failure responses + // to requests with specific methods. Within this specification, only + // 2xx and 101-199 responses with a To tag, where the request was + // INVITE, will establish a dialog. A dialog established by a non-final + // response to a request is in the "early" state and it is called an + // early dialog. + // https://tools.ietf.org/html/rfc3261#section-12.1 + // Provisional without to tag, no dialog to create. + if (!message.toTag) { + this.logger.warn("Non-100 1xx INVITE response received without a to tag, dropping."); + return; + } + // When a UAS responds to a request with a response that establishes a + // dialog (such as a 2xx to INVITE), the UAS MUST copy all Record-Route + // header field values from the request into the response (including the + // URIs, URI parameters, and any Record-Route header field parameters, + // whether they are known or unknown to the UAS) and MUST maintain the + // order of those values. The UAS MUST add a Contact header field to + // the response. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + // Provisional without Contact header field, malformed response. + const contact = message.parseHeader("contact"); + if (!contact) { + this.logger.error("Non-100 1xx INVITE response received without a Contact header field, dropping."); + return; + } + // Compute dialog state. + const dialogState = _dialogs__WEBPACK_IMPORTED_MODULE_3__.Dialog.initialDialogStateForUserAgentClient(this.message, message); + // Have existing early dialog or create a new one. + let earlyDialog = this.earlyDialogs.get(dialogState.id); + if (!earlyDialog) { + const transaction = this.transaction; + if (!(transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_1__.InviteClientTransaction)) { + throw new Error("Transaction not instance of InviteClientTransaction."); + } + earlyDialog = new _dialogs__WEBPACK_IMPORTED_MODULE_4__.SessionDialog(transaction, this.core, dialogState); + this.earlyDialogs.set(earlyDialog.id, earlyDialog); + } + // Guard against out of order reliable provisional responses. + // Note that this is where the rseq tracking is done. + if (!earlyDialog.reliableSequenceGuard(message)) { + this.logger.warn("1xx INVITE reliable response received out of order or is a retransmission, dropping."); + return; + } + // If the initial offer is in an INVITE, the answer MUST be in a + // reliable non-failure message from UAS back to UAC which is + // correlated to that INVITE. For this specification, that is + // only the final 2xx response to that INVITE. That same exact + // answer MAY also be placed in any provisional responses sent + // prior to the answer. The UAC MUST treat the first session + // description it receives as the answer, and MUST ignore any + // session descriptions in subsequent responses to the initial + // INVITE. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + if (earlyDialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Initial || + earlyDialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_5__.SignalingState.HaveLocalOffer) { + earlyDialog.signalingStateTransition(message); + } + // Pass response to delegate. + const session = earlyDialog; + if (this.delegate && this.delegate.onProgress) { + this.delegate.onProgress({ + message, + session, + prack: (options) => { + const outgoingPrackRequest = session.prack(undefined, options); + return outgoingPrackRequest; + } + }); + } + } + return; + case /^2[0-9]{2}$/.test(statusCode): + // Multiple 2xx responses may arrive at the UAC for a single INVITE + // request due to a forking proxy. Each response is distinguished by + // the tag parameter in the To header field, and each represents a + // distinct dialog, with a distinct dialog identifier. + // + // If the dialog identifier in the 2xx response matches the dialog + // identifier of an existing dialog, the dialog MUST be transitioned to + // the "confirmed" state, and the route set for the dialog MUST be + // recomputed based on the 2xx response using the procedures of Section + // 12.2.1.2. Otherwise, a new dialog in the "confirmed" state MUST be + // constructed using the procedures of Section 12.1.2. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + { + // Dialogs are created through the generation of non-failure responses + // to requests with specific methods. Within this specification, only + // 2xx and 101-199 responses with a To tag, where the request was + // INVITE, will establish a dialog. A dialog established by a non-final + // response to a request is in the "early" state and it is called an + // early dialog. + // https://tools.ietf.org/html/rfc3261#section-12.1 + // Final without to tag, malformed response. + if (!message.toTag) { + this.logger.error("2xx INVITE response received without a to tag, dropping."); + return; + } + // When a UAS responds to a request with a response that establishes a + // dialog (such as a 2xx to INVITE), the UAS MUST copy all Record-Route + // header field values from the request into the response (including the + // URIs, URI parameters, and any Record-Route header field parameters, + // whether they are known or unknown to the UAS) and MUST maintain the + // order of those values. The UAS MUST add a Contact header field to + // the response. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + // Final without Contact header field, malformed response. + const contact = message.parseHeader("contact"); + if (!contact) { + this.logger.error("2xx INVITE response received without a Contact header field, dropping."); + return; + } + // Compute dialog state. + const dialogState = _dialogs__WEBPACK_IMPORTED_MODULE_3__.Dialog.initialDialogStateForUserAgentClient(this.message, message); + // NOTE: Currently our transaction layer is caching the 2xx ACKs and + // handling retransmissions of the ACK which is an approach which is + // not to spec. In any event, this block is intended to provide a to + // spec implementation of ACK retransmissions, but it should not be + // hit currently. + let dialog = this.confirmedDialogs.get(dialogState.id); + if (dialog) { + // Once the ACK has been constructed, the procedures of [4] are used to + // determine the destination address, port and transport. However, the + // request is passed to the transport layer directly for transmission, + // rather than a client transaction. This is because the UAC core + // handles retransmissions of the ACK, not the transaction layer. The + // ACK MUST be passed to the client transport every time a + // retransmission of the 2xx final response that triggered the ACK + // arrives. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + const outgoingAckRequest = this.confirmedDialogAcks.get(dialogState.id); + if (outgoingAckRequest) { + const transaction = this.transaction; + if (!(transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_1__.InviteClientTransaction)) { + throw new Error("Client transaction not instance of InviteClientTransaction."); + } + transaction.ackResponse(outgoingAckRequest.message); + } + else { + // If still waiting for an ACK, drop the retransmission of the 2xx final response. + } + return; + } + // If the dialog identifier in the 2xx response matches the dialog + // identifier of an existing dialog, the dialog MUST be transitioned to + // the "confirmed" state, and the route set for the dialog MUST be + // recomputed based on the 2xx response using the procedures of Section + // 12.2.1.2. Otherwise, a new dialog in the "confirmed" state MUST be + // constructed using the procedures of Section 12.1.2. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + dialog = this.earlyDialogs.get(dialogState.id); + if (dialog) { + dialog.confirm(); + dialog.recomputeRouteSet(message); + this.earlyDialogs.delete(dialog.id); + this.confirmedDialogs.set(dialog.id, dialog); + } + else { + const transaction = this.transaction; + if (!(transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_1__.InviteClientTransaction)) { + throw new Error("Transaction not instance of InviteClientTransaction."); + } + dialog = new _dialogs__WEBPACK_IMPORTED_MODULE_4__.SessionDialog(transaction, this.core, dialogState); + this.confirmedDialogs.set(dialog.id, dialog); + } + // If the initial offer is in an INVITE, the answer MUST be in a + // reliable non-failure message from UAS back to UAC which is + // correlated to that INVITE. For this specification, that is + // only the final 2xx response to that INVITE. That same exact + // answer MAY also be placed in any provisional responses sent + // prior to the answer. The UAC MUST treat the first session + // description it receives as the answer, and MUST ignore any + // session descriptions in subsequent responses to the initial + // INVITE. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + if (dialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_5__.SignalingState.Initial || + dialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_5__.SignalingState.HaveLocalOffer) { + dialog.signalingStateTransition(message); + } + // Session Initiated! :) + const session = dialog; + // The UAC core MUST generate an ACK request for each 2xx received from + // the transaction layer. The header fields of the ACK are constructed + // in the same way as for any request sent within a dialog (see Section + // 12) with the exception of the CSeq and the header fields related to + // authentication. The sequence number of the CSeq header field MUST be + // the same as the INVITE being acknowledged, but the CSeq method MUST + // be ACK. The ACK MUST contain the same credentials as the INVITE. If + // the 2xx contains an offer (based on the rules above), the ACK MUST + // carry an answer in its body. If the offer in the 2xx response is not + // acceptable, the UAC core MUST generate a valid answer in the ACK and + // then send a BYE immediately. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + if (this.delegate && this.delegate.onAccept) { + this.delegate.onAccept({ + message, + session, + ack: (options) => { + const outgoingAckRequest = session.ack(options); + this.confirmedDialogAcks.set(session.id, outgoingAckRequest); + return outgoingAckRequest; + } + }); + } + else { + const outgoingAckRequest = session.ack(); + this.confirmedDialogAcks.set(session.id, outgoingAckRequest); + } + } + return; + case /^3[0-9]{2}$/.test(statusCode): + // 12.3 Termination of a Dialog + // + // Independent of the method, if a request outside of a dialog generates + // a non-2xx final response, any early dialogs created through + // provisional responses to that request are terminated. The mechanism + // for terminating confirmed dialogs is method specific. In this + // specification, the BYE method terminates a session and the dialog + // associated with it. See Section 15 for details. + // https://tools.ietf.org/html/rfc3261#section-12.3 + // All early dialogs are considered terminated upon reception of the + // non-2xx final response. + // + // After having received the non-2xx final response the UAC core + // considers the INVITE transaction completed. The INVITE client + // transaction handles the generation of ACKs for the response (see + // Section 17). + // https://tools.ietf.org/html/rfc3261#section-13.2.2.3 + this.earlyDialogs.forEach((earlyDialog) => earlyDialog.dispose()); + this.earlyDialogs.clear(); + // A 3xx response may contain one or more Contact header field values + // providing new addresses where the callee might be reachable. + // Depending on the status code of the 3xx response (see Section 21.3), + // the UAC MAY choose to try those new addresses. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.2 + if (this.delegate && this.delegate.onRedirect) { + this.delegate.onRedirect({ message }); + } + return; + case /^[4-6][0-9]{2}$/.test(statusCode): + // 12.3 Termination of a Dialog + // + // Independent of the method, if a request outside of a dialog generates + // a non-2xx final response, any early dialogs created through + // provisional responses to that request are terminated. The mechanism + // for terminating confirmed dialogs is method specific. In this + // specification, the BYE method terminates a session and the dialog + // associated with it. See Section 15 for details. + // https://tools.ietf.org/html/rfc3261#section-12.3 + // All early dialogs are considered terminated upon reception of the + // non-2xx final response. + // + // After having received the non-2xx final response the UAC core + // considers the INVITE transaction completed. The INVITE client + // transaction handles the generation of ACKs for the response (see + // Section 17). + // https://tools.ietf.org/html/rfc3261#section-13.2.2.3 + this.earlyDialogs.forEach((earlyDialog) => earlyDialog.dispose()); + this.earlyDialogs.clear(); + // A single non-2xx final response may be received for the INVITE. 4xx, + // 5xx and 6xx responses may contain a Contact header field value + // indicating the location where additional information about the error + // can be found. Subsequent final responses (which would only arrive + // under error conditions) MUST be ignored. + // https://tools.ietf.org/html/rfc3261#section-13.2.2.3 + if (this.delegate && this.delegate.onReject) { + this.delegate.onReject({ message }); + } + return; + default: + throw new Error(`Invalid status code ${statusCode}`); + } + throw new Error(`Executing what should be an unreachable code path receiving ${statusCode} response.`); + } +} + + +/***/ }), +/* 62 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "UserAgentClient": () => (/* binding */ UserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(29); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(26); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); + + +/** + * User Agent Client (UAC). + * @remarks + * A user agent client is a logical entity + * that creates a new request, and then uses the client + * transaction state machinery to send it. The role of UAC lasts + * only for the duration of that transaction. In other words, if + * a piece of software initiates a request, it acts as a UAC for + * the duration of that transaction. If it receives a request + * later, it assumes the role of a user agent server for the + * processing of that transaction. + * https://tools.ietf.org/html/rfc3261#section-6 + * @public + */ +class UserAgentClient { + constructor(transactionConstructor, core, message, delegate) { + this.transactionConstructor = transactionConstructor; + this.core = core; + this.message = message; + this.delegate = delegate; + this.challenged = false; + this.stale = false; + this.logger = this.loggerFactory.getLogger("sip.user-agent-client"); + this.init(); + } + dispose() { + this.transaction.dispose(); + } + get loggerFactory() { + return this.core.loggerFactory; + } + /** The transaction associated with this request. */ + get transaction() { + if (!this._transaction) { + throw new Error("Transaction undefined."); + } + return this._transaction; + } + /** + * Since requests other than INVITE are responded to immediately, sending a + * CANCEL for a non-INVITE request would always create a race condition. + * A CANCEL request SHOULD NOT be sent to cancel a request other than INVITE. + * https://tools.ietf.org/html/rfc3261#section-9.1 + * @param options - Cancel options bucket. + */ + cancel(reason, options = {}) { + if (!this.transaction) { + throw new Error("Transaction undefined."); + } + if (!this.message.to) { + throw new Error("To undefined."); + } + if (!this.message.from) { + throw new Error("From undefined."); + } + // The following procedures are used to construct a CANCEL request. The + // Request-URI, Call-ID, To, the numeric part of CSeq, and From header + // fields in the CANCEL request MUST be identical to those in the + // request being cancelled, including tags. A CANCEL constructed by a + // client MUST have only a single Via header field value matching the + // top Via value in the request being cancelled. Using the same values + // for these header fields allows the CANCEL to be matched with the + // request it cancels (Section 9.2 indicates how such matching occurs). + // However, the method part of the CSeq header field MUST have a value + // of CANCEL. This allows it to be identified and processed as a + // transaction in its own right (See Section 17). + // https://tools.ietf.org/html/rfc3261#section-9.1 + const message = this.core.makeOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_0__.C.CANCEL, this.message.ruri, this.message.from.uri, this.message.to.uri, { + toTag: this.message.toTag, + fromTag: this.message.fromTag, + callId: this.message.callId, + cseq: this.message.cseq + }, options.extraHeaders); + // TODO: Revisit this. + // The CANCEL needs to use the same branch parameter so that + // it matches the INVITE transaction, but this is a hacky way to do this. + // Or at the very least not well documented. If the the branch parameter + // is set on the outgoing request, the transaction will use it. + // Otherwise the transaction will make a new one. + message.branch = this.message.branch; + if (this.message.headers.Route) { + message.headers.Route = this.message.headers.Route; + } + if (reason) { + message.setHeader("Reason", reason); + } + // If no provisional response has been received, the CANCEL request MUST + // NOT be sent; rather, the client MUST wait for the arrival of a + // provisional response before sending the request. If the original + // request has generated a final response, the CANCEL SHOULD NOT be + // sent, as it is an effective no-op, since CANCEL has no effect on + // requests that have already generated a final response. + // https://tools.ietf.org/html/rfc3261#section-9.1 + if (this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + new UserAgentClient(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, this.core, message); + } + else { + this.transaction.addStateChangeListener(() => { + if (this.transaction && this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + new UserAgentClient(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, this.core, message); + } + }, { once: true }); + } + return message; + } + /** + * If a 401 (Unauthorized) or 407 (Proxy Authentication Required) + * response is received, the UAC SHOULD follow the authorization + * procedures of Section 22.2 and Section 22.3 to retry the request with + * credentials. + * https://tools.ietf.org/html/rfc3261#section-8.1.3.5 + * 22 Usage of HTTP Authentication + * https://tools.ietf.org/html/rfc3261#section-22 + * 22.1 Framework + * https://tools.ietf.org/html/rfc3261#section-22.1 + * 22.2 User-to-User Authentication + * https://tools.ietf.org/html/rfc3261#section-22.2 + * 22.3 Proxy-to-User Authentication + * https://tools.ietf.org/html/rfc3261#section-22.3 + * + * FIXME: This "guard for and retry the request with credentials" + * implementation is not complete and at best minimally passable. + * @param response - The incoming response to guard. + * @param dialog - If defined, the dialog within which the response was received. + * @returns True if the program execution is to continue in the branch in question. + * Otherwise the request is retried with credentials and current request processing must stop. + */ + authenticationGuard(message, dialog) { + const statusCode = message.statusCode; + if (!statusCode) { + throw new Error("Response status code undefined."); + } + // If a 401 (Unauthorized) or 407 (Proxy Authentication Required) + // response is received, the UAC SHOULD follow the authorization + // procedures of Section 22.2 and Section 22.3 to retry the request with + // credentials. + // https://tools.ietf.org/html/rfc3261#section-8.1.3.5 + if (statusCode !== 401 && statusCode !== 407) { + return true; + } + // Get and parse the appropriate WWW-Authenticate or Proxy-Authenticate header. + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let challenge; + let authorizationHeaderName; + if (statusCode === 401) { + challenge = message.parseHeader("www-authenticate"); + authorizationHeaderName = "authorization"; + } + else { + challenge = message.parseHeader("proxy-authenticate"); + authorizationHeaderName = "proxy-authorization"; + } + // Verify it seems a valid challenge. + if (!challenge) { + this.logger.warn(statusCode + " with wrong or missing challenge, cannot authenticate"); + return true; + } + // Avoid infinite authentications. + if (this.challenged && (this.stale || challenge.stale !== true)) { + this.logger.warn(statusCode + " apparently in authentication loop, cannot authenticate"); + return true; + } + // Get credentials. + if (!this.credentials) { + this.credentials = this.core.configuration.authenticationFactory(); + if (!this.credentials) { + this.logger.warn("Unable to obtain credentials, cannot authenticate"); + return true; + } + } + // Verify that the challenge is really valid. + if (!this.credentials.authenticate(this.message, challenge)) { + return true; + } + this.challenged = true; + if (challenge.stale) { + this.stale = true; + } + // If response to out of dialog request, assume incrementing the CSeq will suffice. + let cseq = (this.message.cseq += 1); + // If response to in dialog request, get a valid next CSeq number. + if (dialog && dialog.localSequenceNumber) { + dialog.incrementLocalSequenceNumber(); + cseq = this.message.cseq = dialog.localSequenceNumber; + } + this.message.setHeader("cseq", cseq + " " + this.message.method); + this.message.setHeader(authorizationHeaderName, this.credentials.toString()); + // Calling init (again) will swap out our existing client transaction with a new one. + // FIXME: HACK: An assumption is being made here that there is nothing that needs to + // be cleaned up beyond the client transaction which is being replaced. For example, + // it is assumed that no early dialogs have been created. + this.init(); + return false; + } + /** + * 8.1.3.1 Transaction Layer Errors + * In some cases, the response returned by the transaction layer will + * not be a SIP message, but rather a transaction layer error. When a + * timeout error is received from the transaction layer, it MUST be + * treated as if a 408 (Request Timeout) status code has been received. + * If a fatal transport error is reported by the transport layer + * (generally, due to fatal ICMP errors in UDP or connection failures in + * TCP), the condition MUST be treated as a 503 (Service Unavailable) + * status code. + * https://tools.ietf.org/html/rfc3261#section-8.1.3.1 + */ + onRequestTimeout() { + this.logger.warn("User agent client request timed out. Generating internal 408 Request Timeout."); + const message = new _messages__WEBPACK_IMPORTED_MODULE_3__.IncomingResponseMessage(); + message.statusCode = 408; + message.reasonPhrase = "Request Timeout"; + this.receiveResponse(message); + return; + } + /** + * 8.1.3.1 Transaction Layer Errors + * In some cases, the response returned by the transaction layer will + * not be a SIP message, but rather a transaction layer error. When a + * timeout error is received from the transaction layer, it MUST be + * treated as if a 408 (Request Timeout) status code has been received. + * If a fatal transport error is reported by the transport layer + * (generally, due to fatal ICMP errors in UDP or connection failures in + * TCP), the condition MUST be treated as a 503 (Service Unavailable) + * status code. + * https://tools.ietf.org/html/rfc3261#section-8.1.3.1 + * @param error - Transport error + */ + onTransportError(error) { + this.logger.error(error.message); + this.logger.error("User agent client request transport error. Generating internal 503 Service Unavailable."); + const message = new _messages__WEBPACK_IMPORTED_MODULE_3__.IncomingResponseMessage(); + message.statusCode = 503; + message.reasonPhrase = "Service Unavailable"; + this.receiveResponse(message); + } + /** + * Receive a response from the transaction layer. + * @param message - Incoming response message. + */ + receiveResponse(message) { + if (!this.authenticationGuard(message)) { + return; + } + const statusCode = message.statusCode ? message.statusCode.toString() : ""; + if (!statusCode) { + throw new Error("Response status code undefined."); + } + switch (true) { + case /^100$/.test(statusCode): + if (this.delegate && this.delegate.onTrying) { + this.delegate.onTrying({ message }); + } + break; + case /^1[0-9]{2}$/.test(statusCode): + if (this.delegate && this.delegate.onProgress) { + this.delegate.onProgress({ message }); + } + break; + case /^2[0-9]{2}$/.test(statusCode): + if (this.delegate && this.delegate.onAccept) { + this.delegate.onAccept({ message }); + } + break; + case /^3[0-9]{2}$/.test(statusCode): + if (this.delegate && this.delegate.onRedirect) { + this.delegate.onRedirect({ message }); + } + break; + case /^[4-6][0-9]{2}$/.test(statusCode): + if (this.delegate && this.delegate.onReject) { + this.delegate.onReject({ message }); + } + break; + default: + throw new Error(`Invalid status code ${statusCode}`); + } + } + init() { + // We are the transaction user. + const user = { + loggerFactory: this.loggerFactory, + onRequestTimeout: () => this.onRequestTimeout(), + onStateChange: (newState) => { + if (newState === _transactions__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated) { + // Remove the terminated transaction from the core. + // eslint-disable-next-line @typescript-eslint/no-use-before-define + this.core.userAgentClients.delete(userAgentClientId); + // FIXME: HACK: Our transaction may have been swapped out with a new one + // post authentication (see above), so make sure to only to dispose of + // ourselves if this terminating transaction is our current transaction. + // eslint-disable-next-line @typescript-eslint/no-use-before-define + if (transaction === this._transaction) { + this.dispose(); + } + } + }, + onTransportError: (error) => this.onTransportError(error), + receiveResponse: (message) => this.receiveResponse(message) + }; + // Create a new transaction with us as the user. + const transaction = new this.transactionConstructor(this.message, this.core.transport, user); + this._transaction = transaction; + // Add the new transaction to the core. + const userAgentClientId = transaction.id + transaction.request.method; + this.core.userAgentClients.set(userAgentClientId, this); + } +} + + +/***/ }), +/* 63 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TransactionState": () => (/* binding */ TransactionState) +/* harmony export */ }); +/** + * Transaction state. + * @public + */ +var TransactionState; +(function (TransactionState) { + TransactionState["Accepted"] = "Accepted"; + TransactionState["Calling"] = "Calling"; + TransactionState["Completed"] = "Completed"; + TransactionState["Confirmed"] = "Confirmed"; + TransactionState["Proceeding"] = "Proceeding"; + TransactionState["Terminated"] = "Terminated"; + TransactionState["Trying"] = "Trying"; +})(TransactionState || (TransactionState = {})); + + +/***/ }), +/* 64 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NonInviteClientTransaction": () => (/* binding */ NonInviteClientTransaction) +/* harmony export */ }); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36); +/* harmony import */ var _client_transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65); +/* harmony import */ var _transaction_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); + + + +/** + * Non-INVITE Client Transaction. + * @remarks + * Non-INVITE transactions do not make use of ACK. + * They are simple request-response interactions. + * https://tools.ietf.org/html/rfc3261#section-17.1.2 + * @public + */ +class NonInviteClientTransaction extends _client_transaction__WEBPACK_IMPORTED_MODULE_0__.ClientTransaction { + /** + * Constructor + * Upon construction, the outgoing request's Via header is updated by calling `setViaHeader`. + * Then `toString` is called on the outgoing request and the message is sent via the transport. + * After construction the transaction will be in the "calling" state and the transaction id + * will equal the branch parameter set in the Via header of the outgoing request. + * https://tools.ietf.org/html/rfc3261#section-17.1.2 + * @param request - The outgoing Non-INVITE request. + * @param transport - The transport. + * @param user - The transaction user. + */ + constructor(request, transport, user) { + super(request, transport, user, _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying, "sip.transaction.nict"); + // FIXME: Timer E for unreliable transports not implemented. + // + // The "Trying" state is entered when the TU initiates a new client + // transaction with a request. When entering this state, the client + // transaction SHOULD set timer F to fire in 64*T1 seconds. The request + // MUST be passed to the transport layer for transmission. + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + this.F = setTimeout(() => this.timerF(), _timers__WEBPACK_IMPORTED_MODULE_2__.Timers.TIMER_F); + this.send(request.toString()).catch((error) => { + this.logTransportError(error, "Failed to send initial outgoing request."); + }); + } + /** + * Destructor. + */ + dispose() { + if (this.F) { + clearTimeout(this.F); + this.F = undefined; + } + if (this.K) { + clearTimeout(this.K); + this.K = undefined; + } + super.dispose(); + } + /** Transaction kind. Deprecated. */ + get kind() { + return "nict"; + } + /** + * Handler for incoming responses from the transport which match this transaction. + * @param response - The incoming response. + */ + receiveResponse(response) { + const statusCode = response.statusCode; + if (!statusCode || statusCode < 100 || statusCode > 699) { + throw new Error(`Invalid status code ${statusCode}`); + } + switch (this.state) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying: + // If a provisional response is received while in the "Trying" state, the + // response MUST be passed to the TU, and then the client transaction + // SHOULD move to the "Proceeding" state. + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + if (statusCode >= 100 && statusCode <= 199) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding); + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + // If a final response (status codes 200-699) is received while in the + // "Trying" state, the response MUST be passed to the TU, and the + // client transaction MUST transition to the "Completed" state. + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + if (statusCode >= 200 && statusCode <= 699) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + if (statusCode === 408) { + this.onRequestTimeout(); + return; + } + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + // If a provisional response is received while in the "Proceeding" state, + // the response MUST be passed to the TU. (From Figure 6) + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + if (statusCode >= 100 && statusCode <= 199) { + if (this.user.receiveResponse) { + return this.user.receiveResponse(response); + } + } + // If a final response (status codes 200-699) is received while in the + // "Proceeding" state, the response MUST be passed to the TU, and the + // client transaction MUST transition to the "Completed" state. + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + if (statusCode >= 200 && statusCode <= 699) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + if (statusCode === 408) { + this.onRequestTimeout(); + return; + } + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + // The "Completed" state exists to buffer any additional response + // retransmissions that may be received (which is why the client + // transaction remains there only for unreliable transports). + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + return; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + // For good measure just absorb additional response retransmissions. + return; + default: + throw new Error(`Invalid state ${this.state}`); + } + const message = `Non-INVITE client transaction received unexpected ${statusCode} response while in state ${this.state}.`; + this.logger.warn(message); + return; + } + /** + * The client transaction SHOULD inform the TU that a transport failure has occurred, + * and the client transaction SHOULD transition directly to the "Terminated" state. + * The TU will handle the fail over mechanisms described in [4]. + * https://tools.ietf.org/html/rfc3261#section-17.1.4 + * @param error - Transport error + */ + onTransportError(error) { + if (this.user.onTransportError) { + this.user.onTransportError(error); + } + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated, true); + } + /** For logging. */ + typeToString() { + return "non-INVITE client transaction"; + } + /** + * Execute a state transition. + * @param newState - New state. + */ + stateTransition(newState, dueToTransportError = false) { + // Assert valid state transitions. + const invalidStateTransition = () => { + throw new Error(`Invalid state transition from ${this.state} to ${newState}`); + }; + switch (newState) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying: + invalidStateTransition(); + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying && this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying && + this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding && + this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + if (!dueToTransportError) { + invalidStateTransition(); + } + } + break; + default: + invalidStateTransition(); + } + // Once the client transaction enters the "Completed" state, it MUST set + // Timer K to fire in T4 seconds for unreliable transports, and zero + // seconds for reliable transports The "Completed" state exists to + // buffer any additional response retransmissions that may be received + // (which is why the client transaction remains there only for unreliable transports). + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + if (this.F) { + clearTimeout(this.F); + this.F = undefined; + } + this.K = setTimeout(() => this.timerK(), _timers__WEBPACK_IMPORTED_MODULE_2__.Timers.TIMER_K); + } + // Once the transaction is in the terminated state, it MUST be destroyed immediately. + // https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated) { + this.dispose(); + } + // Update state. + this.setState(newState); + } + /** + * If Timer F fires while the client transaction is still in the + * "Trying" state, the client transaction SHOULD inform the TU about the + * timeout, and then it SHOULD enter the "Terminated" state. + * If timer F fires while in the "Proceeding" state, the TU MUST be informed of + * a timeout, and the client transaction MUST transition to the terminated state. + * https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + */ + timerF() { + this.logger.debug(`Timer F expired for non-INVITE client transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying || this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + this.onRequestTimeout(); + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } + /** + * If Timer K fires while in this (COMPLETED) state, the client transaction + * MUST transition to the "Terminated" state. + * https://tools.ietf.org/html/rfc3261#section-17.1.2.2 + */ + timerK() { + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } +} + + +/***/ }), +/* 65 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ClientTransaction": () => (/* binding */ ClientTransaction) +/* harmony export */ }); +/* harmony import */ var _transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66); + +/** + * Client Transaction. + * @remarks + * The client transaction provides its functionality through the + * maintenance of a state machine. + * + * The TU communicates with the client transaction through a simple + * interface. When the TU wishes to initiate a new transaction, it + * creates a client transaction and passes it the SIP request to send + * and an IP address, port, and transport to which to send it. The + * client transaction begins execution of its state machine. Valid + * responses are passed up to the TU from the client transaction. + * https://tools.ietf.org/html/rfc3261#section-17.1 + * @public + */ +class ClientTransaction extends _transaction__WEBPACK_IMPORTED_MODULE_0__.Transaction { + constructor(_request, transport, user, state, loggerCategory) { + super(transport, user, ClientTransaction.makeId(_request), state, loggerCategory); + this._request = _request; + this.user = user; + // The Via header field indicates the transport used for the transaction + // and identifies the location where the response is to be sent. A Via + // header field value is added only after the transport that will be + // used to reach the next hop has been selected (which may involve the + // usage of the procedures in [4]). + // https://tools.ietf.org/html/rfc3261#section-8.1.1.7 + _request.setViaHeader(this.id, transport.protocol); + } + static makeId(request) { + if (request.method === "CANCEL") { + if (!request.branch) { + throw new Error("Outgoing CANCEL request without a branch."); + } + return request.branch; + } + else { + return "z9hG4bK" + Math.floor(Math.random() * 10000000); + } + } + /** The outgoing request the transaction handling. */ + get request() { + return this._request; + } + /** + * A 408 to non-INVITE will always arrive too late to be useful ([3]), + * The client already has full knowledge of the timeout. The only + * information this message would convey is whether or not the server + * believed the transaction timed out. However, with the current design + * of the NIT, a client cannot do anything with this knowledge. Thus, + * the 408 is simply wasting network resources and contributes to the + * response bombardment illustrated in [3]. + * https://tools.ietf.org/html/rfc4320#section-4.1 + */ + onRequestTimeout() { + if (this.user.onRequestTimeout) { + this.user.onRequestTimeout(); + } + } +} + + +/***/ }), +/* 66 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Transaction": () => (/* binding */ Transaction) +/* harmony export */ }); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(67); + +/** + * Transaction. + * @remarks + * SIP is a transactional protocol: interactions between components take + * place in a series of independent message exchanges. Specifically, a + * SIP transaction consists of a single request and any responses to + * that request, which include zero or more provisional responses and + * one or more final responses. In the case of a transaction where the + * request was an INVITE (known as an INVITE transaction), the + * transaction also includes the ACK only if the final response was not + * a 2xx response. If the response was a 2xx, the ACK is not considered + * part of the transaction. + * https://tools.ietf.org/html/rfc3261#section-17 + * @public + */ +class Transaction { + constructor(_transport, _user, _id, _state, loggerCategory) { + this._transport = _transport; + this._user = _user; + this._id = _id; + this._state = _state; + this.listeners = new Array(); + this.logger = _user.loggerFactory.getLogger(loggerCategory, _id); + this.logger.debug(`Constructing ${this.typeToString()} with id ${this.id}.`); + } + /** + * Destructor. + * Once the transaction is in the "terminated" state, it is destroyed + * immediately and there is no need to call `dispose`. However, if a + * transaction needs to be ended prematurely, the transaction user may + * do so by calling this method (for example, perhaps the UA is shutting down). + * No state transition will occur upon calling this method, all outstanding + * transmission timers will be cancelled, and use of the transaction after + * calling `dispose` is undefined. + */ + dispose() { + this.logger.debug(`Destroyed ${this.typeToString()} with id ${this.id}.`); + } + /** Transaction id. */ + get id() { + return this._id; + } + /** Transaction kind. Deprecated. */ + get kind() { + throw new Error("Invalid kind."); + } + /** Transaction state. */ + get state() { + return this._state; + } + /** Transaction transport. */ + get transport() { + return this._transport; + } + /** + * Sets up a function that will be called whenever the transaction state changes. + * @param listener - Callback function. + * @param options - An options object that specifies characteristics about the listener. + * If once true, indicates that the listener should be invoked at most once after being added. + * If once true, the listener would be automatically removed when invoked. + */ + addStateChangeListener(listener, options) { + const onceWrapper = () => { + this.removeStateChangeListener(onceWrapper); + listener(); + }; + (options === null || options === void 0 ? void 0 : options.once) === true ? this.listeners.push(onceWrapper) : this.listeners.push(listener); + } + /** + * This is currently public so tests may spy on it. + * @internal + */ + notifyStateChangeListeners() { + this.listeners.slice().forEach((listener) => listener()); + } + /** + * Removes a listener previously registered with addStateListener. + * @param listener - Callback function. + */ + removeStateChangeListener(listener) { + this.listeners = this.listeners.filter((l) => l !== listener); + } + logTransportError(error, message) { + this.logger.error(error.message); + this.logger.error(`Transport error occurred in ${this.typeToString()} with id ${this.id}.`); + this.logger.error(message); + } + /** + * Pass message to transport for transmission. If transport fails, + * the transaction user is notified by callback to onTransportError(). + * @returns + * Rejects with `TransportError` if transport fails. + */ + send(message) { + return this.transport.send(message).catch((error) => { + // If the transport rejects, it SHOULD reject with a TransportError. + // But the transport may be external code, so we are careful + // make sure we convert it to a TransportError if need be. + if (error instanceof _exceptions__WEBPACK_IMPORTED_MODULE_0__.TransportError) { + this.onTransportError(error); + throw error; + } + let transportError; + if (error && typeof error.message === "string") { + transportError = new _exceptions__WEBPACK_IMPORTED_MODULE_0__.TransportError(error.message); + } + else { + transportError = new _exceptions__WEBPACK_IMPORTED_MODULE_0__.TransportError(); + } + this.onTransportError(transportError); + throw transportError; + }); + } + setState(state) { + this.logger.debug(`State change to "${state}" on ${this.typeToString()} with id ${this.id}.`); + this._state = state; + if (this._user.onStateChange) { + this._user.onStateChange(state); + } + this.notifyStateChangeListeners(); + } + typeToString() { + return "UnknownType"; + } +} + + +/***/ }), +/* 67 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "TransportError": () => (/* binding */ TransportError) +/* harmony export */ }); +/* harmony import */ var _exception__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); + +/** + * Transport error. + * @public + */ +class TransportError extends _exception__WEBPACK_IMPORTED_MODULE_0__.Exception { + constructor(message) { + super(message ? message : "Unspecified transport error."); + } +} + + +/***/ }), +/* 68 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "InviteClientTransaction": () => (/* binding */ InviteClientTransaction) +/* harmony export */ }); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36); +/* harmony import */ var _client_transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65); +/* harmony import */ var _transaction_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); + + + +/** + * INVITE Client Transaction. + * @remarks + * The INVITE transaction consists of a three-way handshake. The client + * transaction sends an INVITE, the server transaction sends responses, + * and the client transaction sends an ACK. + * https://tools.ietf.org/html/rfc3261#section-17.1.1 + * @public + */ +class InviteClientTransaction extends _client_transaction__WEBPACK_IMPORTED_MODULE_0__.ClientTransaction { + /** + * Constructor. + * Upon construction, the outgoing request's Via header is updated by calling `setViaHeader`. + * Then `toString` is called on the outgoing request and the message is sent via the transport. + * After construction the transaction will be in the "calling" state and the transaction id + * will equal the branch parameter set in the Via header of the outgoing request. + * https://tools.ietf.org/html/rfc3261#section-17.1.1 + * @param request - The outgoing INVITE request. + * @param transport - The transport. + * @param user - The transaction user. + */ + constructor(request, transport, user) { + super(request, transport, user, _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling, "sip.transaction.ict"); + /** + * Map of 2xx to-tag to ACK. + * If value is not undefined, value is the ACK which was sent. + * If key exists but value is undefined, a 2xx was received but the ACK not yet sent. + * Otherwise, a 2xx was not (yet) received for this transaction. + */ + this.ackRetransmissionCache = new Map(); + // FIXME: Timer A for unreliable transport not implemented + // + // If an unreliable transport is being used, the client transaction + // MUST start timer A with a value of T1. If a reliable transport is being used, + // the client transaction SHOULD NOT start timer A (Timer A controls request retransmissions). + // For any transport, the client transaction MUST start timer B with a value + // of 64*T1 seconds (Timer B controls transaction timeouts). + // https://tools.ietf.org/html/rfc3261#section-17.1.1.2 + // + // While not spelled out in the RFC, Timer B is the maximum amount of time that a sender + // will wait for an INVITE message to be acknowledged (a SIP response message is received). + // So Timer B should be cleared when the transaction state proceeds from "Calling". + this.B = setTimeout(() => this.timerB(), _timers__WEBPACK_IMPORTED_MODULE_2__.Timers.TIMER_B); + this.send(request.toString()).catch((error) => { + this.logTransportError(error, "Failed to send initial outgoing request."); + }); + } + /** + * Destructor. + */ + dispose() { + if (this.B) { + clearTimeout(this.B); + this.B = undefined; + } + if (this.D) { + clearTimeout(this.D); + this.D = undefined; + } + if (this.M) { + clearTimeout(this.M); + this.M = undefined; + } + super.dispose(); + } + /** Transaction kind. Deprecated. */ + get kind() { + return "ict"; + } + /** + * ACK a 2xx final response. + * + * The transaction includes the ACK only if the final response was not a 2xx response (the + * transaction will generate and send the ACK to the transport automagically). If the + * final response was a 2xx, the ACK is not considered part of the transaction (the + * transaction user needs to generate and send the ACK). + * + * This library is not strictly RFC compliant with regard to ACK handling for 2xx final + * responses. Specifically, retransmissions of ACKs to a 2xx final responses is handled + * by the transaction layer (instead of the UAC core). The "standard" approach is for + * the UAC core to receive all 2xx responses and manage sending ACK retransmissions to + * the transport directly. Herein the transaction layer manages sending ACKs to 2xx responses + * and any retransmissions of those ACKs as needed. + * + * @param ack - The outgoing ACK request. + */ + ackResponse(ack) { + const toTag = ack.toTag; + if (!toTag) { + throw new Error("To tag undefined."); + } + const id = "z9hG4bK" + Math.floor(Math.random() * 10000000); + ack.setViaHeader(id, this.transport.protocol); + this.ackRetransmissionCache.set(toTag, ack); // Add to ACK retransmission cache + this.send(ack.toString()).catch((error) => { + this.logTransportError(error, "Failed to send ACK to 2xx response."); + }); + } + /** + * Handler for incoming responses from the transport which match this transaction. + * @param response - The incoming response. + */ + receiveResponse(response) { + const statusCode = response.statusCode; + if (!statusCode || statusCode < 100 || statusCode > 699) { + throw new Error(`Invalid status code ${statusCode}`); + } + switch (this.state) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling: + // If the client transaction receives a provisional response while in + // the "Calling" state, it transitions to the "Proceeding" state. In the + // "Proceeding" state, the client transaction SHOULD NOT retransmit the + // request any longer. Furthermore, the provisional response MUST be + // passed to the TU. Any further provisional responses MUST be passed + // up to the TU while in the "Proceeding" state. + // https://tools.ietf.org/html/rfc3261#section-17.1.1.2 + if (statusCode >= 100 && statusCode <= 199) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding); + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + // When a 2xx response is received while in either the "Calling" or + // "Proceeding" states, the client transaction MUST transition to + // the "Accepted" state... The 2xx response MUST be passed up to the TU. + // The client transaction MUST NOT generate an ACK to the 2xx response -- its + // handling is delegated to the TU. A UAC core will send an ACK to + // the 2xx response using a new transaction. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (statusCode >= 200 && statusCode <= 299) { + this.ackRetransmissionCache.set(response.toTag, undefined); // Prime the ACK cache + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted); + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + // When in either the "Calling" or "Proceeding" states, reception of + // a response with status code from 300-699 MUST cause the client + // transaction to transition to "Completed". The client transaction + // MUST pass the received response up to the TU, and the client + // transaction MUST generate an ACK request, even if the transport is + // reliable (guidelines for constructing the ACK from the response + // are given in Section 17.1.1.3), and then pass the ACK to the + // transport layer for transmission. The ACK MUST be sent to the + // same address, port, and transport to which the original request was sent. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (statusCode >= 300 && statusCode <= 699) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + this.ack(response); + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + // In the "Proceeding" state, the client transaction SHOULD NOT retransmit the + // request any longer. Furthermore, the provisional response MUST be + // passed to the TU. Any further provisional responses MUST be passed + // up to the TU while in the "Proceeding" state. + // https://tools.ietf.org/html/rfc3261#section-17.1.1.2 + if (statusCode >= 100 && statusCode <= 199) { + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + // When a 2xx response is received while in either the "Calling" or "Proceeding" states, + // the client transaction MUST transition to the "Accepted" state... + // The 2xx response MUST be passed up to the TU. The client + // transaction MUST NOT generate an ACK to the 2xx response -- its + // handling is delegated to the TU. A UAC core will send an ACK to + // the 2xx response using a new transaction. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (statusCode >= 200 && statusCode <= 299) { + this.ackRetransmissionCache.set(response.toTag, undefined); // Prime the ACK cache + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted); + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + // When in either the "Calling" or "Proceeding" states, reception of + // a response with status code from 300-699 MUST cause the client + // transaction to transition to "Completed". The client transaction + // MUST pass the received response up to the TU, and the client + // transaction MUST generate an ACK request, even if the transport is + // reliable (guidelines for constructing the ACK from the response + // are given in Section 17.1.1.3), and then pass the ACK to the + // transport layer for transmission. The ACK MUST be sent to the + // same address, port, and transport to which the original request was sent. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (statusCode >= 300 && statusCode <= 699) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + this.ack(response); + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted: + // The purpose of the "Accepted" state is to allow the client + // transaction to continue to exist to receive, and pass to the TU, + // any retransmissions of the 2xx response and any additional 2xx + // responses from other branches of the INVITE if it forked + // downstream. Timer M reflects the amount of time that the + // transaction user will wait for such messages. + // + // Any 2xx responses that match this client transaction and that are + // received while in the "Accepted" state MUST be passed up to the + // TU. The client transaction MUST NOT generate an ACK to the 2xx + // response. The client transaction takes no further action. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (statusCode >= 200 && statusCode <= 299) { + // NOTE: This implementation herein is intentionally not RFC compliant. + // While the first 2xx response for a given branch is passed up to the TU, + // retransmissions of 2xx responses are absorbed and the ACK associated + // with the original response is resent. This approach is taken because + // our current transaction users are not currently in a good position to + // deal with 2xx retransmission. This SHOULD NOT cause any compliance issues - ;) + // + // If we don't have a cache hit, pass the response to the TU. + if (!this.ackRetransmissionCache.has(response.toTag)) { + this.ackRetransmissionCache.set(response.toTag, undefined); // Prime the ACK cache + if (this.user.receiveResponse) { + this.user.receiveResponse(response); + } + return; + } + // If we have a cache hit, try pulling the ACK from cache and retransmitting it. + const ack = this.ackRetransmissionCache.get(response.toTag); + if (ack) { + this.send(ack.toString()).catch((error) => { + this.logTransportError(error, "Failed to send retransmission of ACK to 2xx response."); + }); + return; + } + // If an ACK was not found in cache then we have received a retransmitted 2xx + // response before the TU responded to the original response (we don't have an ACK yet). + // So discard this response under the assumption that the TU will eventually + // get us a ACK for the original response. + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + // Any retransmissions of a response with status code 300-699 that + // are received while in the "Completed" state MUST cause the ACK to + // be re-passed to the transport layer for retransmission, but the + // newly received response MUST NOT be passed up to the TU. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (statusCode >= 300 && statusCode <= 699) { + this.ack(response); + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + break; + default: + throw new Error(`Invalid state ${this.state}`); + } + // Any response received that does not match an existing client + // transaction state machine is simply dropped. (Implementations are, + // of course, free to log or do other implementation-specific things + // with such responses, but the implementer should be sure to consider + // the impact of large numbers of malicious stray responses.) + // https://tools.ietf.org/html/rfc6026#section-7.2 + const message = `Received unexpected ${statusCode} response while in state ${this.state}.`; + this.logger.warn(message); + return; + } + /** + * The client transaction SHOULD inform the TU that a transport failure + * has occurred, and the client transaction SHOULD transition directly + * to the "Terminated" state. The TU will handle the failover + * mechanisms described in [4]. + * https://tools.ietf.org/html/rfc3261#section-17.1.4 + * @param error - The error. + */ + onTransportError(error) { + if (this.user.onTransportError) { + this.user.onTransportError(error); + } + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated, true); + } + /** For logging. */ + typeToString() { + return "INVITE client transaction"; + } + ack(response) { + // The ACK request constructed by the client transaction MUST contain + // values for the Call-ID, From, and Request-URI that are equal to the + // values of those header fields in the request passed to the transport + // by the client transaction (call this the "original request"). The To + // header field in the ACK MUST equal the To header field in the + // response being acknowledged, and therefore will usually differ from + // the To header field in the original request by the addition of the + // tag parameter. The ACK MUST contain a single Via header field, and + // this MUST be equal to the top Via header field of the original + // request. The CSeq header field in the ACK MUST contain the same + // value for the sequence number as was present in the original request, + // but the method parameter MUST be equal to "ACK". + // + // If the INVITE request whose response is being acknowledged had Route + // header fields, those header fields MUST appear in the ACK. This is + // to ensure that the ACK can be routed properly through any downstream + // stateless proxies. + // https://tools.ietf.org/html/rfc3261#section-17.1.1.3 + const ruri = this.request.ruri; + const callId = this.request.callId; + const cseq = this.request.cseq; + const from = this.request.getHeader("from"); + const to = response.getHeader("to"); + const via = this.request.getHeader("via"); + const route = this.request.getHeader("route"); + if (!from) { + throw new Error("From undefined."); + } + if (!to) { + throw new Error("To undefined."); + } + if (!via) { + throw new Error("Via undefined."); + } + let ack = `ACK ${ruri} SIP/2.0\r\n`; + if (route) { + ack += `Route: ${route}\r\n`; + } + ack += `Via: ${via}\r\n`; + ack += `To: ${to}\r\n`; + ack += `From: ${from}\r\n`; + ack += `Call-ID: ${callId}\r\n`; + ack += `CSeq: ${cseq} ACK\r\n`; + ack += `Max-Forwards: 70\r\n`; + ack += `Content-Length: 0\r\n\r\n`; + // TOOO: "User-Agent" header + this.send(ack).catch((error) => { + this.logTransportError(error, "Failed to send ACK to non-2xx response."); + }); + return; + } + /** + * Execute a state transition. + * @param newState - New state. + */ + stateTransition(newState, dueToTransportError = false) { + // Assert valid state transitions. + const invalidStateTransition = () => { + throw new Error(`Invalid state transition from ${this.state} to ${newState}`); + }; + switch (newState) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling: + invalidStateTransition(); + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted: + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling && this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling && + this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted && + this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + if (!dueToTransportError) { + invalidStateTransition(); + } + } + break; + default: + invalidStateTransition(); + } + // While not spelled out in the RFC, Timer B is the maximum amount of time that a sender + // will wait for an INVITE message to be acknowledged (a SIP response message is received). + // So Timer B should be cleared when the transaction state proceeds from "Calling". + if (this.B) { + clearTimeout(this.B); + this.B = undefined; + } + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + // Timers have no effect on "Proceeding" state. + // In the "Proceeding" state, the client transaction + // SHOULD NOT retransmit the request any longer. + // https://tools.ietf.org/html/rfc3261#section-17.1.1.2 + } + // The client transaction MUST start Timer D when it enters the "Completed" state + // for any reason, with a value of at least 32 seconds for unreliable transports, + // and a value of zero seconds for reliable transports. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + this.D = setTimeout(() => this.timerD(), _timers__WEBPACK_IMPORTED_MODULE_2__.Timers.TIMER_D); + } + // The client transaction MUST transition to the "Accepted" state, + // and Timer M MUST be started with a value of 64*T1. + // https://tools.ietf.org/html/rfc6026#section-8.4 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted) { + this.M = setTimeout(() => this.timerM(), _timers__WEBPACK_IMPORTED_MODULE_2__.Timers.TIMER_M); + } + // Once the transaction is in the "Terminated" state, it MUST be destroyed immediately. + // https://tools.ietf.org/html/rfc6026#section-8.7 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated) { + this.dispose(); + } + // Update state. + this.setState(newState); + } + /** + * When timer A fires, the client transaction MUST retransmit the + * request by passing it to the transport layer, and MUST reset the + * timer with a value of 2*T1. + * When timer A fires 2*T1 seconds later, the request MUST be + * retransmitted again (assuming the client transaction is still in this + * state). This process MUST continue so that the request is + * retransmitted with intervals that double after each transmission. + * These retransmissions SHOULD only be done while the client + * transaction is in the "Calling" state. + * https://tools.ietf.org/html/rfc3261#section-17.1.1.2 + */ + timerA() { + // TODO + } + /** + * If the client transaction is still in the "Calling" state when timer + * B fires, the client transaction SHOULD inform the TU that a timeout + * has occurred. The client transaction MUST NOT generate an ACK. + * https://tools.ietf.org/html/rfc3261#section-17.1.1.2 + */ + timerB() { + this.logger.debug(`Timer B expired for INVITE client transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Calling) { + this.onRequestTimeout(); + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } + /** + * If Timer D fires while the client transaction is in the "Completed" state, + * the client transaction MUST move to the "Terminated" state. + * https://tools.ietf.org/html/rfc6026#section-8.4 + */ + timerD() { + this.logger.debug(`Timer D expired for INVITE client transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } + /** + * If Timer M fires while the client transaction is in the "Accepted" + * state, the client transaction MUST move to the "Terminated" state. + * https://tools.ietf.org/html/rfc6026#section-8.4 + */ + timerM() { + this.logger.debug(`Timer M expired for INVITE client transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } +} + + +/***/ }), +/* 69 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Dialog": () => (/* binding */ Dialog) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(25); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); + +/** + * Dialog. + * @remarks + * A key concept for a user agent is that of a dialog. A dialog + * represents a peer-to-peer SIP relationship between two user agents + * that persists for some time. The dialog facilitates sequencing of + * messages between the user agents and proper routing of requests + * between both of them. The dialog represents a context in which to + * interpret SIP messages. + * https://tools.ietf.org/html/rfc3261#section-12 + * @public + */ +class Dialog { + /** + * Dialog constructor. + * @param core - User agent core. + * @param dialogState - Initial dialog state. + */ + constructor(core, dialogState) { + this.core = core; + this.dialogState = dialogState; + this.core.dialogs.set(this.id, this); + } + /** + * When a UAC receives a response that establishes a dialog, it + * constructs the state of the dialog. This state MUST be maintained + * for the duration of the dialog. + * https://tools.ietf.org/html/rfc3261#section-12.1.2 + * @param outgoingRequestMessage - Outgoing request message for dialog. + * @param incomingResponseMessage - Incoming response message creating dialog. + */ + static initialDialogStateForUserAgentClient(outgoingRequestMessage, incomingResponseMessage) { + // If the request was sent over TLS, and the Request-URI contained a + // SIPS URI, the "secure" flag is set to TRUE. + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + const secure = false; // FIXME: Currently no support for TLS. + // The route set MUST be set to the list of URIs in the Record-Route + // header field from the response, taken in reverse order and preserving + // all URI parameters. If no Record-Route header field is present in + // the response, the route set MUST be set to the empty set. This route + // set, even if empty, overrides any pre-existing route set for future + // requests in this dialog. The remote target MUST be set to the URI + // from the Contact header field of the response. + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + const routeSet = incomingResponseMessage.getHeaders("record-route").reverse(); + // When a UAS responds to a request with a response that establishes a + // dialog (such as a 2xx to INVITE), the UAS MUST copy all Record-Route + // header field values from the request into the response (including the + // URIs, URI parameters, and any Record-Route header field parameters, + // whether they are known or unknown to the UAS) and MUST maintain the + // order of those values. The UAS MUST add a Contact header field to + // the response. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const contact = incomingResponseMessage.parseHeader("contact"); + if (!contact) { + // TODO: Review to make sure this will never happen + throw new Error("Contact undefined."); + } + if (!(contact instanceof _messages__WEBPACK_IMPORTED_MODULE_0__.NameAddrHeader)) { + throw new Error("Contact not instance of NameAddrHeader."); + } + const remoteTarget = contact.uri; + // The local sequence number MUST be set to the value of the sequence + // number in the CSeq header field of the request. The remote sequence + // number MUST be empty (it is established when the remote UA sends a + // request within the dialog). The call identifier component of the + // dialog ID MUST be set to the value of the Call-ID in the request. + // The local tag component of the dialog ID MUST be set to the tag in + // the From field in the request, and the remote tag component of the + // dialog ID MUST be set to the tag in the To field of the response. A + // UAC MUST be prepared to receive a response without a tag in the To + // field, in which case the tag is considered to have a value of null. + // + // This is to maintain backwards compatibility with RFC 2543, which + // did not mandate To tags. + // + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + const localSequenceNumber = outgoingRequestMessage.cseq; + const remoteSequenceNumber = undefined; + const callId = outgoingRequestMessage.callId; + const localTag = outgoingRequestMessage.fromTag; + const remoteTag = incomingResponseMessage.toTag; + if (!callId) { + // TODO: Review to make sure this will never happen + throw new Error("Call id undefined."); + } + if (!localTag) { + // TODO: Review to make sure this will never happen + throw new Error("From tag undefined."); + } + if (!remoteTag) { + // TODO: Review to make sure this will never happen + throw new Error("To tag undefined."); // FIXME: No backwards compatibility with RFC 2543 + } + // The remote URI MUST be set to the URI in the To field, and the local + // URI MUST be set to the URI in the From field. + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + if (!outgoingRequestMessage.from) { + // TODO: Review to make sure this will never happen + throw new Error("From undefined."); + } + if (!outgoingRequestMessage.to) { + // TODO: Review to make sure this will never happen + throw new Error("To undefined."); + } + const localURI = outgoingRequestMessage.from.uri; + const remoteURI = outgoingRequestMessage.to.uri; + // A dialog can also be in the "early" state, which occurs when it is + // created with a provisional response, and then transition to the + // "confirmed" state when a 2xx final response arrives. + // https://tools.ietf.org/html/rfc3261#section-12 + if (!incomingResponseMessage.statusCode) { + throw new Error("Incoming response status code undefined."); + } + const early = incomingResponseMessage.statusCode < 200 ? true : false; + const dialogState = { + id: callId + localTag + remoteTag, + early, + callId, + localTag, + remoteTag, + localSequenceNumber, + remoteSequenceNumber, + localURI, + remoteURI, + remoteTarget, + routeSet, + secure + }; + return dialogState; + } + /** + * The UAS then constructs the state of the dialog. This state MUST be + * maintained for the duration of the dialog. + * https://tools.ietf.org/html/rfc3261#section-12.1.1 + * @param incomingRequestMessage - Incoming request message creating dialog. + * @param toTag - Tag in the To field in the response to the incoming request. + */ + static initialDialogStateForUserAgentServer(incomingRequestMessage, toTag, early = false) { + // If the request arrived over TLS, and the Request-URI contained a SIPS + // URI, the "secure" flag is set to TRUE. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const secure = false; // FIXME: Currently no support for TLS. + // The route set MUST be set to the list of URIs in the Record-Route + // header field from the request, taken in order and preserving all URI + // parameters. If no Record-Route header field is present in the + // request, the route set MUST be set to the empty set. This route set, + // even if empty, overrides any pre-existing route set for future + // requests in this dialog. The remote target MUST be set to the URI + // from the Contact header field of the request. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const routeSet = incomingRequestMessage.getHeaders("record-route"); + const contact = incomingRequestMessage.parseHeader("contact"); + if (!contact) { + // TODO: Review to make sure this will never happen + throw new Error("Contact undefined."); + } + if (!(contact instanceof _messages__WEBPACK_IMPORTED_MODULE_0__.NameAddrHeader)) { + throw new Error("Contact not instance of NameAddrHeader."); + } + const remoteTarget = contact.uri; + // The remote sequence number MUST be set to the value of the sequence + // number in the CSeq header field of the request. The local sequence + // number MUST be empty. The call identifier component of the dialog ID + // MUST be set to the value of the Call-ID in the request. The local + // tag component of the dialog ID MUST be set to the tag in the To field + // in the response to the request (which always includes a tag), and the + // remote tag component of the dialog ID MUST be set to the tag from the + // From field in the request. A UAS MUST be prepared to receive a + // request without a tag in the From field, in which case the tag is + // considered to have a value of null. + // + // This is to maintain backwards compatibility with RFC 2543, which + // did not mandate From tags. + // + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const remoteSequenceNumber = incomingRequestMessage.cseq; + const localSequenceNumber = undefined; + const callId = incomingRequestMessage.callId; + const localTag = toTag; + const remoteTag = incomingRequestMessage.fromTag; + // The remote URI MUST be set to the URI in the From field, and the + // local URI MUST be set to the URI in the To field. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const remoteURI = incomingRequestMessage.from.uri; + const localURI = incomingRequestMessage.to.uri; + const dialogState = { + id: callId + localTag + remoteTag, + early, + callId, + localTag, + remoteTag, + localSequenceNumber, + remoteSequenceNumber, + localURI, + remoteURI, + remoteTarget, + routeSet, + secure + }; + return dialogState; + } + /** Destructor. */ + dispose() { + this.core.dialogs.delete(this.id); + } + /** + * A dialog is identified at each UA with a dialog ID, which consists of + * a Call-ID value, a local tag and a remote tag. The dialog ID at each + * UA involved in the dialog is not the same. Specifically, the local + * tag at one UA is identical to the remote tag at the peer UA. The + * tags are opaque tokens that facilitate the generation of unique + * dialog IDs. + * https://tools.ietf.org/html/rfc3261#section-12 + */ + get id() { + return this.dialogState.id; + } + /** + * A dialog can also be in the "early" state, which occurs when it is + * created with a provisional response, and then it transition to the + * "confirmed" state when a 2xx final response received or is sent. + * + * Note: RFC 3261 is concise on when a dialog is "confirmed", but it + * can be a point of confusion if an INVITE dialog is "confirmed" after + * a 2xx is sent or after receiving the ACK for the 2xx response. + * With careful reading it can be inferred a dialog is always is + * "confirmed" when the 2xx is sent (regardless of type of dialog). + * However a INVITE dialog does have additional considerations + * when it is confirmed but an ACK has not yet been received (in + * particular with regard to a callee sending BYE requests). + */ + get early() { + return this.dialogState.early; + } + /** Call identifier component of the dialog id. */ + get callId() { + return this.dialogState.callId; + } + /** Local tag component of the dialog id. */ + get localTag() { + return this.dialogState.localTag; + } + /** Remote tag component of the dialog id. */ + get remoteTag() { + return this.dialogState.remoteTag; + } + /** Local sequence number (used to order requests from the UA to its peer). */ + get localSequenceNumber() { + return this.dialogState.localSequenceNumber; + } + /** Remote sequence number (used to order requests from its peer to the UA). */ + get remoteSequenceNumber() { + return this.dialogState.remoteSequenceNumber; + } + /** Local URI. */ + get localURI() { + return this.dialogState.localURI; + } + /** Remote URI. */ + get remoteURI() { + return this.dialogState.remoteURI; + } + /** Remote target. */ + get remoteTarget() { + return this.dialogState.remoteTarget; + } + /** + * Route set, which is an ordered list of URIs. The route set is the + * list of servers that need to be traversed to send a request to the peer. + */ + get routeSet() { + return this.dialogState.routeSet; + } + /** + * If the request was sent over TLS, and the Request-URI contained + * a SIPS URI, the "secure" flag is set to true. *NOT IMPLEMENTED* + */ + get secure() { + return this.dialogState.secure; + } + /** The user agent core servicing this dialog. */ + get userAgentCore() { + return this.core; + } + /** Confirm the dialog. Only matters if dialog is currently early. */ + confirm() { + this.dialogState.early = false; + } + /** + * Requests sent within a dialog, as any other requests, are atomic. If + * a particular request is accepted by the UAS, all the state changes + * associated with it are performed. If the request is rejected, none + * of the state changes are performed. + * + * Note that some requests, such as INVITEs, affect several pieces of + * state. + * + * https://tools.ietf.org/html/rfc3261#section-12.2.2 + * @param message - Incoming request message within this dialog. + */ + receiveRequest(message) { + // ACK guard. + // By convention, the handling of ACKs is the responsibility + // the particular dialog implementation. For example, see SessionDialog. + // Furthermore, ACKs have same sequence number as the associated INVITE. + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_1__.C.ACK) { + return; + } + // If the remote sequence number was not empty, but the sequence number + // of the request is lower than the remote sequence number, the request + // is out of order and MUST be rejected with a 500 (Server Internal + // Error) response. If the remote sequence number was not empty, and + // the sequence number of the request is greater than the remote + // sequence number, the request is in order. It is possible for the + // CSeq sequence number to be higher than the remote sequence number by + // more than one. This is not an error condition, and a UAS SHOULD be + // prepared to receive and process requests with CSeq values more than + // one higher than the previous received request. The UAS MUST then set + // the remote sequence number to the value of the sequence number in the + // CSeq header field value in the request. + // + // If a proxy challenges a request generated by the UAC, the UAC has + // to resubmit the request with credentials. The resubmitted request + // will have a new CSeq number. The UAS will never see the first + // request, and thus, it will notice a gap in the CSeq number space. + // Such a gap does not represent any error condition. + // + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + if (this.remoteSequenceNumber) { + if (message.cseq <= this.remoteSequenceNumber) { + throw new Error("Out of sequence in dialog request. Did you forget to call sequenceGuard()?"); + } + this.dialogState.remoteSequenceNumber = message.cseq; + } + // If the remote sequence number is empty, it MUST be set to the value + // of the sequence number in the CSeq header field value in the request. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + if (!this.remoteSequenceNumber) { + this.dialogState.remoteSequenceNumber = message.cseq; + } + // When a UAS receives a target refresh request, it MUST replace the + // dialog's remote target URI with the URI from the Contact header field + // in that request, if present. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + // Note: "target refresh request" processing delegated to sub-class. + } + /** + * If the dialog identifier in the 2xx response matches the dialog + * identifier of an existing dialog, the dialog MUST be transitioned to + * the "confirmed" state, and the route set for the dialog MUST be + * recomputed based on the 2xx response using the procedures of Section + * 12.2.1.2. Otherwise, a new dialog in the "confirmed" state MUST be + * constructed using the procedures of Section 12.1.2. + * + * Note that the only piece of state that is recomputed is the route + * set. Other pieces of state such as the highest sequence numbers + * (remote and local) sent within the dialog are not recomputed. The + * route set only is recomputed for backwards compatibility. RFC + * 2543 did not mandate mirroring of the Record-Route header field in + * a 1xx, only 2xx. However, we cannot update the entire state of + * the dialog, since mid-dialog requests may have been sent within + * the early dialog, modifying the sequence numbers, for example. + * + * https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + */ + recomputeRouteSet(message) { + this.dialogState.routeSet = message.getHeaders("record-route").reverse(); + } + /** + * A request within a dialog is constructed by using many of the + * components of the state stored as part of the dialog. + * https://tools.ietf.org/html/rfc3261#section-12.2.1.1 + * @param method - Outgoing request method. + */ + createOutgoingRequestMessage(method, options) { + // The URI in the To field of the request MUST be set to the remote URI + // from the dialog state. The tag in the To header field of the request + // MUST be set to the remote tag of the dialog ID. The From URI of the + // request MUST be set to the local URI from the dialog state. The tag + // in the From header field of the request MUST be set to the local tag + // of the dialog ID. If the value of the remote or local tags is null, + // the tag parameter MUST be omitted from the To or From header fields, + // respectively. + // + // Usage of the URI from the To and From fields in the original + // request within subsequent requests is done for backwards + // compatibility with RFC 2543, which used the URI for dialog + // identification. In this specification, only the tags are used for + // dialog identification. It is expected that mandatory reflection + // of the original To and From URI in mid-dialog requests will be + // deprecated in a subsequent revision of this specification. + // https://tools.ietf.org/html/rfc3261#section-12.2.1.1 + const toUri = this.remoteURI; + const toTag = this.remoteTag; + const fromUri = this.localURI; + const fromTag = this.localTag; + // The Call-ID of the request MUST be set to the Call-ID of the dialog. + // Requests within a dialog MUST contain strictly monotonically + // increasing and contiguous CSeq sequence numbers (increasing-by-one) + // in each direction (excepting ACK and CANCEL of course, whose numbers + // equal the requests being acknowledged or cancelled). Therefore, if + // the local sequence number is not empty, the value of the local + // sequence number MUST be incremented by one, and this value MUST be + // placed into the CSeq header field. If the local sequence number is + // empty, an initial value MUST be chosen using the guidelines of + // Section 8.1.1.5. The method field in the CSeq header field value + // MUST match the method of the request. + // https://tools.ietf.org/html/rfc3261#section-12.2.1.1 + const callId = this.callId; + let cseq; + if (options && options.cseq) { + cseq = options.cseq; + } + else if (!this.dialogState.localSequenceNumber) { + cseq = this.dialogState.localSequenceNumber = 1; // https://tools.ietf.org/html/rfc3261#section-8.1.1.5 + } + else { + cseq = this.dialogState.localSequenceNumber += 1; + } + // The UAC uses the remote target and route set to build the Request-URI + // and Route header field of the request. + // + // If the route set is empty, the UAC MUST place the remote target URI + // into the Request-URI. The UAC MUST NOT add a Route header field to + // the request. + // + // If the route set is not empty, and the first URI in the route set + // contains the lr parameter (see Section 19.1.1), the UAC MUST place + // the remote target URI into the Request-URI and MUST include a Route + // header field containing the route set values in order, including all + // parameters. + // + // If the route set is not empty, and its first URI does not contain the + // lr parameter, the UAC MUST place the first URI from the route set + // into the Request-URI, stripping any parameters that are not allowed + // in a Request-URI. The UAC MUST add a Route header field containing + // the remainder of the route set values in order, including all + // parameters. The UAC MUST then place the remote target URI into the + // Route header field as the last value. + // https://tools.ietf.org/html/rfc3261#section-12.2.1.1 + // The lr parameter, when present, indicates that the element + // responsible for this resource implements the routing mechanisms + // specified in this document. This parameter will be used in the + // URIs proxies place into Record-Route header field values, and + // may appear in the URIs in a pre-existing route set. + // + // This parameter is used to achieve backwards compatibility with + // systems implementing the strict-routing mechanisms of RFC 2543 + // and the rfc2543bis drafts up to bis-05. An element preparing + // to send a request based on a URI not containing this parameter + // can assume the receiving element implements strict-routing and + // reformat the message to preserve the information in the + // Request-URI. + // https://tools.ietf.org/html/rfc3261#section-19.1.1 + // NOTE: Not backwards compatible with RFC 2543 (no support for strict-routing). + const ruri = this.remoteTarget; + const routeSet = this.routeSet; + const extraHeaders = options && options.extraHeaders; + const body = options && options.body; + // The relative order of header fields with different field names is not + // significant. However, it is RECOMMENDED that header fields which are + // needed for proxy processing (Via, Route, Record-Route, Proxy-Require, + // Max-Forwards, and Proxy-Authorization, for example) appear towards + // the top of the message to facilitate rapid parsing. + // https://tools.ietf.org/html/rfc3261#section-7.3.1 + const message = this.userAgentCore.makeOutgoingRequestMessage(method, ruri, fromUri, toUri, { + callId, + cseq, + fromTag, + toTag, + routeSet + }, extraHeaders, body); + return message; + } + /** + * Increment the local sequence number by one. + * It feels like this should be protected, but the current authentication handling currently + * needs this to keep the dialog in sync when "auto re-sends" request messages. + * @internal + */ + incrementLocalSequenceNumber() { + if (!this.dialogState.localSequenceNumber) { + throw new Error("Local sequence number undefined."); + } + this.dialogState.localSequenceNumber += 1; + } + /** + * If the remote sequence number was not empty, but the sequence number + * of the request is lower than the remote sequence number, the request + * is out of order and MUST be rejected with a 500 (Server Internal + * Error) response. + * https://tools.ietf.org/html/rfc3261#section-12.2.2 + * @param request - Incoming request to guard. + * @returns True if the program execution is to continue in the branch in question. + * Otherwise a 500 Server Internal Error was stateless sent and request processing must stop. + */ + sequenceGuard(message) { + // ACK guard. + // By convention, handling of unexpected ACKs is responsibility + // the particular dialog implementation. For example, see SessionDialog. + // Furthermore, we cannot reply to an "out of sequence" ACK. + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_1__.C.ACK) { + return true; + } + // Note: We are rejecting on "less than or equal to" the remote + // sequence number (excepting ACK whose numbers equal the requests + // being acknowledged or cancelled), which is the correct thing to + // do in our case. The only time a request with the same sequence number + // will show up here if is a) it is a very late retransmission of a + // request we already handled or b) it is a different request with the + // same sequence number which would be violation of the standard. + // Request retransmissions are absorbed by the transaction layer, + // so any request with a duplicate sequence number getting here + // would have to be a retransmission after the transaction terminated + // or a broken request (with unique via branch value). + // Requests within a dialog MUST contain strictly monotonically + // increasing and contiguous CSeq sequence numbers (increasing-by-one) + // in each direction (excepting ACK and CANCEL of course, whose numbers + // equal the requests being acknowledged or cancelled). Therefore, if + // the local sequence number is not empty, the value of the local + // sequence number MUST be incremented by one, and this value MUST be + // placed into the CSeq header field. + // https://tools.ietf.org/html/rfc3261#section-12.2.1.1 + if (this.remoteSequenceNumber && message.cseq <= this.remoteSequenceNumber) { + this.core.replyStateless(message, { statusCode: 500 }); + return false; + } + return true; + } +} + + +/***/ }), +/* 70 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionDialog": () => (/* binding */ SessionDialog) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(25); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(17); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(18); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(26); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(27); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(30); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(36); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(68); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(63); +/* harmony import */ var _user_agents_bye_user_agent_client__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(73); +/* harmony import */ var _user_agents_bye_user_agent_server__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(80); +/* harmony import */ var _user_agents_info_user_agent_client__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(74); +/* harmony import */ var _user_agents_info_user_agent_server__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(84); +/* harmony import */ var _user_agents_message_user_agent_client__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(76); +/* harmony import */ var _user_agents_message_user_agent_server__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(86); +/* harmony import */ var _user_agents_notify_user_agent_client__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(77); +/* harmony import */ var _user_agents_notify_user_agent_server__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(87); +/* harmony import */ var _user_agents_prack_user_agent_client__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(78); +/* harmony import */ var _user_agents_prack_user_agent_server__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(88); +/* harmony import */ var _user_agents_re_invite_user_agent_client__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(75); +/* harmony import */ var _user_agents_re_invite_user_agent_server__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(85); +/* harmony import */ var _user_agents_refer_user_agent_client__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(79); +/* harmony import */ var _user_agents_refer_user_agent_server__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(89); +/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69); + + + + + + + + + + + + + + + + + + + +/** + * Session Dialog. + * @public + */ +class SessionDialog extends _dialog__WEBPACK_IMPORTED_MODULE_0__.Dialog { + constructor(initialTransaction, core, state, delegate) { + super(core, state); + this.initialTransaction = initialTransaction; + /** The state of the offer/answer exchange. */ + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Initial; + /** True if waiting for an ACK to the initial transaction 2xx (UAS only). */ + this.ackWait = false; + /** True if processing an ACK to the initial transaction 2xx (UAS only). */ + this.ackProcessing = false; + this.delegate = delegate; + if (initialTransaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + // If we're created by an invite server transaction, we're + // going to be waiting for an ACK if are to be confirmed. + this.ackWait = true; + } + // If we're confirmed upon creation start the retransmitting whatever + // the 2xx final response was that confirmed us into existence. + if (!this.early) { + this.start2xxRetransmissionTimer(); + } + this.signalingStateTransition(initialTransaction.request); + this.logger = core.loggerFactory.getLogger("sip.invite-dialog"); + this.logger.log(`INVITE dialog ${this.id} constructed`); + } + dispose() { + super.dispose(); + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Closed; + this._offer = undefined; + this._answer = undefined; + if (this.invite2xxTimer) { + clearTimeout(this.invite2xxTimer); + this.invite2xxTimer = undefined; + } + // The UAS MUST still respond to any pending requests received for that + // dialog. It is RECOMMENDED that a 487 (Request Terminated) response + // be generated to those pending requests. + // https://tools.ietf.org/html/rfc3261#section-15.1.2 + // TODO: + // this.userAgentServers.forEach((uas) => uas.reply(487)); + this.logger.log(`INVITE dialog ${this.id} destroyed`); + } + // FIXME: Need real state machine + get sessionState() { + if (this.early) { + return _session__WEBPACK_IMPORTED_MODULE_1__.SessionState.Early; + } + else if (this.ackWait) { + return _session__WEBPACK_IMPORTED_MODULE_1__.SessionState.AckWait; + } + else if (this._signalingState === _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Closed) { + return _session__WEBPACK_IMPORTED_MODULE_1__.SessionState.Terminated; + } + else { + return _session__WEBPACK_IMPORTED_MODULE_1__.SessionState.Confirmed; + } + } + /** The state of the offer/answer exchange. */ + get signalingState() { + return this._signalingState; + } + /** The current offer. Undefined unless signaling state HaveLocalOffer, HaveRemoteOffer, of Stable. */ + get offer() { + return this._offer; + } + /** The current answer. Undefined unless signaling state Stable. */ + get answer() { + return this._answer; + } + /** Confirm the dialog. Only matters if dialog is currently early. */ + confirm() { + // When we're confirmed start the retransmitting whatever + // the 2xx final response that may have confirmed us. + if (this.early) { + this.start2xxRetransmissionTimer(); + } + super.confirm(); + } + /** Re-confirm the dialog. Only matters if handling re-INVITE request. */ + reConfirm() { + // When we're confirmed start the retransmitting whatever + // the 2xx final response that may have confirmed us. + if (this.reinviteUserAgentServer) { + this.startReInvite2xxRetransmissionTimer(); + } + } + /** + * The UAC core MUST generate an ACK request for each 2xx received from + * the transaction layer. The header fields of the ACK are constructed + * in the same way as for any request sent within a dialog (see Section + * 12) with the exception of the CSeq and the header fields related to + * authentication. The sequence number of the CSeq header field MUST be + * the same as the INVITE being acknowledged, but the CSeq method MUST + * be ACK. The ACK MUST contain the same credentials as the INVITE. If + * the 2xx contains an offer (based on the rules above), the ACK MUST + * carry an answer in its body. If the offer in the 2xx response is not + * acceptable, the UAC core MUST generate a valid answer in the ACK and + * then send a BYE immediately. + * https://tools.ietf.org/html/rfc3261#section-13.2.2.4 + * @param options - ACK options bucket. + */ + ack(options = {}) { + this.logger.log(`INVITE dialog ${this.id} sending ACK request`); + let transaction; + if (this.reinviteUserAgentClient) { + // We're sending ACK for a re-INVITE + if (!(this.reinviteUserAgentClient.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_3__.InviteClientTransaction)) { + throw new Error("Transaction not instance of InviteClientTransaction."); + } + transaction = this.reinviteUserAgentClient.transaction; + this.reinviteUserAgentClient = undefined; + } + else { + // We're sending ACK for the initial INVITE + if (!(this.initialTransaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_3__.InviteClientTransaction)) { + throw new Error("Initial transaction not instance of InviteClientTransaction."); + } + transaction = this.initialTransaction; + } + const message = this.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_4__.C.ACK, { + cseq: transaction.request.cseq, + extraHeaders: options.extraHeaders, + body: options.body + }); + transaction.ackResponse(message); // See InviteClientTransaction for details. + this.signalingStateTransition(message); + return { message }; + } + /** + * Terminating a Session + * + * This section describes the procedures for terminating a session + * established by SIP. The state of the session and the state of the + * dialog are very closely related. When a session is initiated with an + * INVITE, each 1xx or 2xx response from a distinct UAS creates a + * dialog, and if that response completes the offer/answer exchange, it + * also creates a session. As a result, each session is "associated" + * with a single dialog - the one which resulted in its creation. If an + * initial INVITE generates a non-2xx final response, that terminates + * all sessions (if any) and all dialogs (if any) that were created + * through responses to the request. By virtue of completing the + * transaction, a non-2xx final response also prevents further sessions + * from being created as a result of the INVITE. The BYE request is + * used to terminate a specific session or attempted session. In this + * case, the specific session is the one with the peer UA on the other + * side of the dialog. When a BYE is received on a dialog, any session + * associated with that dialog SHOULD terminate. A UA MUST NOT send a + * BYE outside of a dialog. The caller's UA MAY send a BYE for either + * confirmed or early dialogs, and the callee's UA MAY send a BYE on + * confirmed dialogs, but MUST NOT send a BYE on early dialogs. + * + * However, the callee's UA MUST NOT send a BYE on a confirmed dialog + * until it has received an ACK for its 2xx response or until the server + * transaction times out. If no SIP extensions have defined other + * application layer states associated with the dialog, the BYE also + * terminates the dialog. + * + * https://tools.ietf.org/html/rfc3261#section-15 + * FIXME: Make these proper Exceptions... + * @param options - BYE options bucket. + * @returns + * Throws `Error` if callee's UA attempts a BYE on an early dialog. + * Throws `Error` if callee's UA attempts a BYE on a confirmed dialog + * while it's waiting on the ACK for its 2xx response. + */ + bye(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending BYE request`); + // The caller's UA MAY send a BYE for either + // confirmed or early dialogs, and the callee's UA MAY send a BYE on + // confirmed dialogs, but MUST NOT send a BYE on early dialogs. + // + // However, the callee's UA MUST NOT send a BYE on a confirmed dialog + // until it has received an ACK for its 2xx response or until the server + // transaction times out. + // https://tools.ietf.org/html/rfc3261#section-15 + if (this.initialTransaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + if (this.early) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("UAS MUST NOT send a BYE on early dialogs."); + } + if (this.ackWait && this.initialTransaction.state !== _transactions__WEBPACK_IMPORTED_MODULE_5__.TransactionState.Terminated) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("UAS MUST NOT send a BYE on a confirmed dialog " + + "until it has received an ACK for its 2xx response " + + "or until the server transaction times out."); + } + } + // A BYE request is constructed as would any other request within a + // dialog, as described in Section 12. + // + // Once the BYE is constructed, the UAC core creates a new non-INVITE + // client transaction, and passes it the BYE request. The UAC MUST + // consider the session terminated (and therefore stop sending or + // listening for media) as soon as the BYE request is passed to the + // client transaction. If the response for the BYE is a 481 + // (Call/Transaction Does Not Exist) or a 408 (Request Timeout) or no + // response at all is received for the BYE (that is, a timeout is + // returned by the client transaction), the UAC MUST consider the + // session and the dialog terminated. + // https://tools.ietf.org/html/rfc3261#section-15.1.1 + return new _user_agents_bye_user_agent_client__WEBPACK_IMPORTED_MODULE_6__.ByeUserAgentClient(this, delegate, options); + } + /** + * An INFO request can be associated with an Info Package (see + * Section 5), or associated with a legacy INFO usage (see Section 2). + * + * The construction of the INFO request is the same as any other + * non-target refresh request within an existing invite dialog usage as + * described in Section 12.2 of RFC 3261. + * https://tools.ietf.org/html/rfc6086#section-4.2.1 + * @param options - Options bucket. + */ + info(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending INFO request`); + if (this.early) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("Dialog not confirmed."); + } + return new _user_agents_info_user_agent_client__WEBPACK_IMPORTED_MODULE_7__.InfoUserAgentClient(this, delegate, options); + } + /** + * Modifying an Existing Session + * + * A successful INVITE request (see Section 13) establishes both a + * dialog between two user agents and a session using the offer-answer + * model. Section 12 explains how to modify an existing dialog using a + * target refresh request (for example, changing the remote target URI + * of the dialog). This section describes how to modify the actual + * session. This modification can involve changing addresses or ports, + * adding a media stream, deleting a media stream, and so on. This is + * accomplished by sending a new INVITE request within the same dialog + * that established the session. An INVITE request sent within an + * existing dialog is known as a re-INVITE. + * + * Note that a single re-INVITE can modify the dialog and the + * parameters of the session at the same time. + * + * Either the caller or callee can modify an existing session. + * https://tools.ietf.org/html/rfc3261#section-14 + * @param options - Options bucket + */ + invite(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending INVITE request`); + if (this.early) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("Dialog not confirmed."); + } + // Note that a UAC MUST NOT initiate a new INVITE transaction within a + // dialog while another INVITE transaction is in progress in either + // direction. + // + // 1. If there is an ongoing INVITE client transaction, the TU MUST + // wait until the transaction reaches the completed or terminated + // state before initiating the new INVITE. + // + // 2. If there is an ongoing INVITE server transaction, the TU MUST + // wait until the transaction reaches the confirmed or terminated + // state before initiating the new INVITE. + // + // However, a UA MAY initiate a regular transaction while an INVITE + // transaction is in progress. A UA MAY also initiate an INVITE + // transaction while a regular transaction is in progress. + // https://tools.ietf.org/html/rfc3261#section-14.1 + if (this.reinviteUserAgentClient) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("There is an ongoing re-INVITE client transaction."); + } + if (this.reinviteUserAgentServer) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("There is an ongoing re-INVITE server transaction."); + } + return new _user_agents_re_invite_user_agent_client__WEBPACK_IMPORTED_MODULE_8__.ReInviteUserAgentClient(this, delegate, options); + } + /** + * A UAC MAY associate a MESSAGE request with an existing dialog. If a + * MESSAGE request is sent within a dialog, it is "associated" with any + * media session or sessions associated with that dialog. + * https://tools.ietf.org/html/rfc3428#section-4 + * @param options - Options bucket. + */ + message(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending MESSAGE request`); + if (this.early) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("Dialog not confirmed."); + } + const message = this.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_4__.C.MESSAGE, options); + return new _user_agents_message_user_agent_client__WEBPACK_IMPORTED_MODULE_9__.MessageUserAgentClient(this.core, message, delegate); + } + /** + * The NOTIFY mechanism defined in [2] MUST be used to inform the agent + * sending the REFER of the status of the reference. + * https://tools.ietf.org/html/rfc3515#section-2.4.4 + * @param options - Options bucket. + */ + notify(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending NOTIFY request`); + if (this.early) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("Dialog not confirmed."); + } + return new _user_agents_notify_user_agent_client__WEBPACK_IMPORTED_MODULE_10__.NotifyUserAgentClient(this, delegate, options); + } + /** + * Assuming the response is to be transmitted reliably, the UAC MUST + * create a new request with method PRACK. This request is sent within + * the dialog associated with the provisional response (indeed, the + * provisional response may have created the dialog). PRACK requests + * MAY contain bodies, which are interpreted according to their type and + * disposition. + * https://tools.ietf.org/html/rfc3262#section-4 + * @param options - Options bucket. + */ + prack(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending PRACK request`); + return new _user_agents_prack_user_agent_client__WEBPACK_IMPORTED_MODULE_11__.PrackUserAgentClient(this, delegate, options); + } + /** + * REFER is a SIP request and is constructed as defined in [1]. A REFER + * request MUST contain exactly one Refer-To header field value. + * https://tools.ietf.org/html/rfc3515#section-2.4.1 + * @param options - Options bucket. + */ + refer(delegate, options) { + this.logger.log(`INVITE dialog ${this.id} sending REFER request`); + if (this.early) { + // FIXME: TODO: This should throw a proper exception. + throw new Error("Dialog not confirmed."); + } + // FIXME: TODO: Validate Refer-To header field value. + return new _user_agents_refer_user_agent_client__WEBPACK_IMPORTED_MODULE_12__.ReferUserAgentClient(this, delegate, options); + } + /** + * Requests sent within a dialog, as any other requests, are atomic. If + * a particular request is accepted by the UAS, all the state changes + * associated with it are performed. If the request is rejected, none + * of the state changes are performed. + * https://tools.ietf.org/html/rfc3261#section-12.2.2 + * @param message - Incoming request message within this dialog. + */ + receiveRequest(message) { + this.logger.log(`INVITE dialog ${this.id} received ${message.method} request`); + // Response retransmissions cease when an ACK request for the + // response is received. This is independent of whatever transport + // protocols are used to send the response. + // https://tools.ietf.org/html/rfc6026#section-8.1 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_4__.C.ACK) { + // If ackWait is true, then this is the ACK to the initial INVITE, + // otherwise this is an ACK to an in dialog INVITE. In either case, + // guard to make sure the sequence number of the ACK matches the INVITE. + if (this.ackWait) { + if (this.initialTransaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_3__.InviteClientTransaction) { + this.logger.warn(`INVITE dialog ${this.id} received unexpected ${message.method} request, dropping.`); + return; + } + if (this.initialTransaction.request.cseq !== message.cseq) { + this.logger.warn(`INVITE dialog ${this.id} received unexpected ${message.method} request, dropping.`); + return; + } + // Update before the delegate has a chance to handle the + // message as delegate may callback into this dialog. + this.ackWait = false; + } + else { + if (!this.reinviteUserAgentServer) { + this.logger.warn(`INVITE dialog ${this.id} received unexpected ${message.method} request, dropping.`); + return; + } + if (this.reinviteUserAgentServer.transaction.request.cseq !== message.cseq) { + this.logger.warn(`INVITE dialog ${this.id} received unexpected ${message.method} request, dropping.`); + return; + } + this.reinviteUserAgentServer = undefined; + } + this.signalingStateTransition(message); + if (this.delegate && this.delegate.onAck) { + const promiseOrVoid = this.delegate.onAck({ message }); + if (promiseOrVoid instanceof Promise) { + this.ackProcessing = true; // make sure this is always reset to false + promiseOrVoid.then(() => (this.ackProcessing = false)).catch(() => (this.ackProcessing = false)); + } + } + return; + } + // Request within a dialog out of sequence guard. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + if (!this.sequenceGuard(message)) { + this.logger.log(`INVITE dialog ${this.id} rejected out of order ${message.method} request.`); + return; + } + // Request within a dialog common processing. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + super.receiveRequest(message); + // Handle various INVITE related cross-over, glare and race conditions + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_4__.C.INVITE) { + // Hopefully this message is helpful... + const warning = () => { + const reason = this.ackWait ? "waiting for initial ACK" : "processing initial ACK"; + this.logger.warn(`INVITE dialog ${this.id} received re-INVITE while ${reason}`); + let msg = "RFC 5407 suggests the following to avoid this race condition... "; + msg += " Note: Implementation issues are outside the scope of this document,"; + msg += " but the following tip is provided for avoiding race conditions of"; + msg += " this type. The caller can delay sending re-INVITE F6 for some period"; + msg += " of time (2 seconds, perhaps), after which the caller can reasonably"; + msg += " assume that its ACK has been received. Implementors can decouple the"; + msg += " actions of the user (e.g., pressing the hold button) from the actions"; + msg += " of the protocol (the sending of re-INVITE F6), so that the UA can"; + msg += " behave like this. In this case, it is the implementor's choice as to"; + msg += " how long to wait. In most cases, such an implementation may be"; + msg += " useful to prevent the type of race condition shown in this section."; + msg += " This document expresses no preference about whether or not they"; + msg += " should wait for an ACK to be delivered. After considering the impact"; + msg += " on user experience, implementors should decide whether or not to wait"; + msg += " for a while, because the user experience depends on the"; + msg += " implementation and has no direct bearing on protocol behavior."; + this.logger.warn(msg); + return; // drop re-INVITE request message + }; + // A UAS that receives a second INVITE before it sends the final + // response to a first INVITE with a lower CSeq sequence number on the + // same dialog MUST return a 500 (Server Internal Error) response to the + // second INVITE and MUST include a Retry-After header field with a + // randomly chosen value of between 0 and 10 seconds. + // https://tools.ietf.org/html/rfc3261#section-14.2 + const retryAfter = Math.floor(Math.random() * 10) + 1; + const extraHeaders = [`Retry-After: ${retryAfter}`]; + // There may be ONLY ONE offer/answer negotiation in progress for a + // single dialog at any point in time. Section 4 explains how to ensure + // this. + // https://tools.ietf.org/html/rfc6337#section-2.2 + if (this.ackProcessing) { + // UAS-IsI: While an INVITE server transaction is incomplete or ACK + // transaction associated with an offer/answer is incomplete, + // a UA must reject another INVITE request with a 500 + // response. + // https://tools.ietf.org/html/rfc6337#section-4.3 + this.core.replyStateless(message, { statusCode: 500, extraHeaders }); + warning(); + return; + } + // 3.1.4. Callee Receives re-INVITE (Established State) While in the + // Moratorium State (Case 1) + // https://tools.ietf.org/html/rfc5407#section-3.1.4 + // 3.1.5. Callee Receives re-INVITE (Established State) While in the + // Moratorium State (Case 2) + // https://tools.ietf.org/html/rfc5407#section-3.1.5 + if (this.ackWait && this.signalingState !== _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable) { + // This scenario is basically the same as that of Section 3.1.4, but + // differs in sending an offer in the 200 and an answer in the ACK. In + // contrast to the previous case, the offer in the 200 (F3) and the + // offer in the re-INVITE (F6) collide with each other. + // + // Bob sends a 491 to the re-INVITE (F6) since he is not able to + // properly handle a new request until he receives an answer. (Note: + // 500 with a Retry-After header may be returned if the 491 response is + // understood to indicate request collision. However, 491 is + // recommended here because 500 applies to so many cases that it is + // difficult to determine what the real problem was.) + // https://tools.ietf.org/html/rfc5407#section-3.1.5 + // UAS-IsI: While an INVITE server transaction is incomplete or ACK + // transaction associated with an offer/answer is incomplete, + // a UA must reject another INVITE request with a 500 + // response. + // https://tools.ietf.org/html/rfc6337#section-4.3 + this.core.replyStateless(message, { statusCode: 500, extraHeaders }); + warning(); + return; + } + // A UAS that receives a second INVITE before it sends the final + // response to a first INVITE with a lower CSeq sequence number on the + // same dialog MUST return a 500 (Server Internal Error) response to the + // second INVITE and MUST include a Retry-After header field with a + // randomly chosen value of between 0 and 10 seconds. + // https://tools.ietf.org/html/rfc3261#section-14.2 + if (this.reinviteUserAgentServer) { + this.core.replyStateless(message, { statusCode: 500, extraHeaders }); + return; + } + // A UAS that receives an INVITE on a dialog while an INVITE it had sent + // on that dialog is in progress MUST return a 491 (Request Pending) + // response to the received INVITE. + // https://tools.ietf.org/html/rfc3261#section-14.2 + if (this.reinviteUserAgentClient) { + this.core.replyStateless(message, { statusCode: 491 }); + return; + } + } + // Requests within a dialog MAY contain Record-Route and Contact header + // fields. However, these requests do not cause the dialog's route set + // to be modified, although they may modify the remote target URI. + // Specifically, requests that are not target refresh requests do not + // modify the dialog's remote target URI, and requests that are target + // refresh requests do. For dialogs that have been established with an + // INVITE, the only target refresh request defined is re-INVITE (see + // Section 14). Other extensions may define different target refresh + // requests for dialogs established in other ways. + // + // Note that an ACK is NOT a target refresh request. + // + // Target refresh requests only update the dialog's remote target URI, + // and not the route set formed from the Record-Route. Updating the + // latter would introduce severe backwards compatibility problems with + // RFC 2543-compliant systems. + // https://tools.ietf.org/html/rfc3261#section-15 + if (message.method === _messages__WEBPACK_IMPORTED_MODULE_4__.C.INVITE) { + // FIXME: parser needs to be typed... + const contact = message.parseHeader("contact"); + if (!contact) { + // TODO: Review to make sure this will never happen + throw new Error("Contact undefined."); + } + if (!(contact instanceof _messages__WEBPACK_IMPORTED_MODULE_13__.NameAddrHeader)) { + throw new Error("Contact not instance of NameAddrHeader."); + } + this.dialogState.remoteTarget = contact.uri; + } + // Switch on method and then delegate. + switch (message.method) { + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.BYE: + // A UAS core receiving a BYE request for an existing dialog MUST follow + // the procedures of Section 12.2.2 to process the request. Once done, + // the UAS SHOULD terminate the session (and therefore stop sending and + // listening for media). The only case where it can elect not to are + // multicast sessions, where participation is possible even if the other + // participant in the dialog has terminated its involvement in the + // session. Whether or not it ends its participation on the session, + // the UAS core MUST generate a 2xx response to the BYE, and MUST pass + // that to the server transaction for transmission. + // + // The UAS MUST still respond to any pending requests received for that + // dialog. It is RECOMMENDED that a 487 (Request Terminated) response + // be generated to those pending requests. + // https://tools.ietf.org/html/rfc3261#section-15.1.2 + { + const uas = new _user_agents_bye_user_agent_server__WEBPACK_IMPORTED_MODULE_14__.ByeUserAgentServer(this, message); + this.delegate && this.delegate.onBye ? this.delegate.onBye(uas) : uas.accept(); + this.dispose(); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.INFO: + // If a UA receives an INFO request associated with an Info Package that + // the UA has not indicated willingness to receive, the UA MUST send a + // 469 (Bad Info Package) response (see Section 11.6), which contains a + // Recv-Info header field with Info Packages for which the UA is willing + // to receive INFO requests. + { + const uas = new _user_agents_info_user_agent_server__WEBPACK_IMPORTED_MODULE_15__.InfoUserAgentServer(this, message); + this.delegate && this.delegate.onInfo + ? this.delegate.onInfo(uas) + : uas.reject({ + statusCode: 469, + extraHeaders: ["Recv-Info:"] + }); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.INVITE: + // If the new session description is not acceptable, the UAS can reject + // it by returning a 488 (Not Acceptable Here) response for the re- + // INVITE. This response SHOULD include a Warning header field. + // https://tools.ietf.org/html/rfc3261#section-14.2 + { + const uas = new _user_agents_re_invite_user_agent_server__WEBPACK_IMPORTED_MODULE_16__.ReInviteUserAgentServer(this, message); + this.signalingStateTransition(message); + this.delegate && this.delegate.onInvite ? this.delegate.onInvite(uas) : uas.reject({ statusCode: 488 }); // TODO: Warning header field. + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.MESSAGE: + { + const uas = new _user_agents_message_user_agent_server__WEBPACK_IMPORTED_MODULE_17__.MessageUserAgentServer(this.core, message); + this.delegate && this.delegate.onMessage ? this.delegate.onMessage(uas) : uas.accept(); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.NOTIFY: + // https://tools.ietf.org/html/rfc3515#section-2.4.4 + { + const uas = new _user_agents_notify_user_agent_server__WEBPACK_IMPORTED_MODULE_18__.NotifyUserAgentServer(this, message); + this.delegate && this.delegate.onNotify ? this.delegate.onNotify(uas) : uas.accept(); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.PRACK: + // https://tools.ietf.org/html/rfc3262#section-4 + { + const uas = new _user_agents_prack_user_agent_server__WEBPACK_IMPORTED_MODULE_19__.PrackUserAgentServer(this, message); + this.delegate && this.delegate.onPrack ? this.delegate.onPrack(uas) : uas.accept(); + } + break; + case _messages__WEBPACK_IMPORTED_MODULE_4__.C.REFER: + // https://tools.ietf.org/html/rfc3515#section-2.4.2 + { + const uas = new _user_agents_refer_user_agent_server__WEBPACK_IMPORTED_MODULE_20__.ReferUserAgentServer(this, message); + this.delegate && this.delegate.onRefer ? this.delegate.onRefer(uas) : uas.reject(); + } + break; + default: + { + this.logger.log(`INVITE dialog ${this.id} received unimplemented ${message.method} request`); + this.core.replyStateless(message, { statusCode: 501 }); + } + break; + } + } + /** + * Guard against out of order reliable provisional responses and retransmissions. + * Returns false if the response should be discarded, otherwise true. + * @param message - Incoming response message within this dialog. + */ + reliableSequenceGuard(message) { + const statusCode = message.statusCode; + if (!statusCode) { + throw new Error("Status code undefined"); + } + if (statusCode > 100 && statusCode < 200) { + // If a provisional response is received for an initial request, and + // that response contains a Require header field containing the option + // tag 100rel, the response is to be sent reliably. If the response is + // a 100 (Trying) (as opposed to 101 to 199), this option tag MUST be + // ignored, and the procedures below MUST NOT be used. + // https://tools.ietf.org/html/rfc3262#section-4 + const requireHeader = message.getHeader("require"); + const rseqHeader = message.getHeader("rseq"); + const rseq = requireHeader && requireHeader.includes("100rel") && rseqHeader ? Number(rseqHeader) : undefined; + if (rseq) { + // Handling of subsequent reliable provisional responses for the same + // initial request follows the same rules as above, with the following + // difference: reliable provisional responses are guaranteed to be in + // order. As a result, if the UAC receives another reliable provisional + // response to the same request, and its RSeq value is not one higher + // than the value of the sequence number, that response MUST NOT be + // acknowledged with a PRACK, and MUST NOT be processed further by the + // UAC. An implementation MAY discard the response, or MAY cache the + // response in the hopes of receiving the missing responses. + // https://tools.ietf.org/html/rfc3262#section-4 + if (this.rseq && this.rseq + 1 !== rseq) { + return false; + } + // Once a reliable provisional response is received, retransmissions of + // that response MUST be discarded. A response is a retransmission when + // its dialog ID, CSeq, and RSeq match the original response. The UAC + // MUST maintain a sequence number that indicates the most recently + // received in-order reliable provisional response for the initial + // request. This sequence number MUST be maintained until a final + // response is received for the initial request. Its value MUST be + // initialized to the RSeq header field in the first reliable + // provisional response received for the initial request. + // https://tools.ietf.org/html/rfc3262#section-4 + this.rseq = this.rseq ? this.rseq + 1 : rseq; + } + } + return true; + } + /** + * If not in a stable signaling state, rollback to prior stable signaling state. + */ + signalingStateRollback() { + if (this._signalingState === _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer || + this.signalingState === _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer) { + if (this._rollbackOffer && this._rollbackAnswer) { + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable; + this._offer = this._rollbackOffer; + this._answer = this._rollbackAnswer; + } + } + } + /** + * Update the signaling state of the dialog. + * @param message - The message to base the update off of. + */ + signalingStateTransition(message) { + const body = (0,_messages__WEBPACK_IMPORTED_MODULE_21__.getBody)(message); + // No body, no session. No, woman, no cry. + if (!body || body.contentDisposition !== "session") { + return; + } + // We've got an existing offer and answer which we may wish to rollback to + if (this._signalingState === _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable) { + this._rollbackOffer = this._offer; + this._rollbackAnswer = this._answer; + } + // We're in UAS role, receiving incoming request with session description + if (message instanceof _messages__WEBPACK_IMPORTED_MODULE_22__.IncomingRequestMessage) { + switch (this._signalingState) { + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Initial: + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer; + this._offer = body; + this._answer = undefined; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable; + this._answer = body; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer: + // You cannot make a new offer while one is in progress. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // FIXME: What to do here? + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Closed: + break; + default: + throw new Error("Unexpected signaling state."); + } + } + // We're in UAC role, receiving incoming response with session description + if (message instanceof _messages__WEBPACK_IMPORTED_MODULE_23__.IncomingResponseMessage) { + switch (this._signalingState) { + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Initial: + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer; + this._offer = body; + this._answer = undefined; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable; + this._answer = body; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer: + // You cannot make a new offer while one is in progress. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // FIXME: What to do here? + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Closed: + break; + default: + throw new Error("Unexpected signaling state."); + } + } + // We're in UAC role, sending outgoing request with session description + if (message instanceof _messages__WEBPACK_IMPORTED_MODULE_24__.OutgoingRequestMessage) { + switch (this._signalingState) { + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Initial: + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer; + this._offer = body; + this._answer = undefined; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer: + // You cannot make a new offer while one is in progress. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // FIXME: What to do here? + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable; + this._answer = body; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Closed: + break; + default: + throw new Error("Unexpected signaling state."); + } + } + // We're in UAS role, sending outgoing response with session description + if ((0,_messages__WEBPACK_IMPORTED_MODULE_21__.isBody)(message)) { + switch (this._signalingState) { + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Initial: + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer; + this._offer = body; + this._answer = undefined; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveLocalOffer: + // You cannot make a new offer while one is in progress. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + // FIXME: What to do here? + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.HaveRemoteOffer: + this._signalingState = _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Stable; + this._answer = body; + break; + case _session__WEBPACK_IMPORTED_MODULE_1__.SignalingState.Closed: + break; + default: + throw new Error("Unexpected signaling state."); + } + } + } + start2xxRetransmissionTimer() { + if (this.initialTransaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + const transaction = this.initialTransaction; + // Once the response has been constructed, it is passed to the INVITE + // server transaction. In order to ensure reliable end-to-end + // transport of the response, it is necessary to periodically pass + // the response directly to the transport until the ACK arrives. The + // 2xx response is passed to the transport with an interval that + // starts at T1 seconds and doubles for each retransmission until it + // reaches T2 seconds (T1 and T2 are defined in Section 17). + // Response retransmissions cease when an ACK request for the + // response is received. This is independent of whatever transport + // protocols are used to send the response. + // https://tools.ietf.org/html/rfc6026#section-8.1 + let timeout = _timers__WEBPACK_IMPORTED_MODULE_25__.Timers.T1; + const retransmission = () => { + if (!this.ackWait) { + this.invite2xxTimer = undefined; + return; + } + this.logger.log("No ACK for 2xx response received, attempting retransmission"); + transaction.retransmitAcceptedResponse(); + timeout = Math.min(timeout * 2, _timers__WEBPACK_IMPORTED_MODULE_25__.Timers.T2); + this.invite2xxTimer = setTimeout(retransmission, timeout); + }; + this.invite2xxTimer = setTimeout(retransmission, timeout); + // If the server retransmits the 2xx response for 64*T1 seconds without + // receiving an ACK, the dialog is confirmed, but the session SHOULD be + // terminated. This is accomplished with a BYE, as described in Section 15. + // https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + const stateChanged = () => { + if (transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_5__.TransactionState.Terminated) { + transaction.removeStateChangeListener(stateChanged); + if (this.invite2xxTimer) { + clearTimeout(this.invite2xxTimer); + this.invite2xxTimer = undefined; + } + if (this.ackWait) { + if (this.delegate && this.delegate.onAckTimeout) { + this.delegate.onAckTimeout(); + } + else { + this.bye(); + } + } + } + }; + transaction.addStateChangeListener(stateChanged); + } + } + // FIXME: Refactor + startReInvite2xxRetransmissionTimer() { + if (this.reinviteUserAgentServer && this.reinviteUserAgentServer.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + const transaction = this.reinviteUserAgentServer.transaction; + // Once the response has been constructed, it is passed to the INVITE + // server transaction. In order to ensure reliable end-to-end + // transport of the response, it is necessary to periodically pass + // the response directly to the transport until the ACK arrives. The + // 2xx response is passed to the transport with an interval that + // starts at T1 seconds and doubles for each retransmission until it + // reaches T2 seconds (T1 and T2 are defined in Section 17). + // Response retransmissions cease when an ACK request for the + // response is received. This is independent of whatever transport + // protocols are used to send the response. + // https://tools.ietf.org/html/rfc6026#section-8.1 + let timeout = _timers__WEBPACK_IMPORTED_MODULE_25__.Timers.T1; + const retransmission = () => { + if (!this.reinviteUserAgentServer) { + this.invite2xxTimer = undefined; + return; + } + this.logger.log("No ACK for 2xx response received, attempting retransmission"); + transaction.retransmitAcceptedResponse(); + timeout = Math.min(timeout * 2, _timers__WEBPACK_IMPORTED_MODULE_25__.Timers.T2); + this.invite2xxTimer = setTimeout(retransmission, timeout); + }; + this.invite2xxTimer = setTimeout(retransmission, timeout); + // If the server retransmits the 2xx response for 64*T1 seconds without + // receiving an ACK, the dialog is confirmed, but the session SHOULD be + // terminated. This is accomplished with a BYE, as described in Section 15. + // https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + const stateChanged = () => { + if (transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_5__.TransactionState.Terminated) { + transaction.removeStateChangeListener(stateChanged); + if (this.invite2xxTimer) { + clearTimeout(this.invite2xxTimer); + this.invite2xxTimer = undefined; + } + if (this.reinviteUserAgentServer) { + // FIXME: TODO: What to do here + } + } + }; + transaction.addStateChangeListener(stateChanged); + } + } +} + + +/***/ }), +/* 71 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "InviteServerTransaction": () => (/* binding */ InviteServerTransaction) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(36); +/* harmony import */ var _server_transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(72); +/* harmony import */ var _transaction_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); + + + + +/** + * INVITE Server Transaction. + * @remarks + * https://tools.ietf.org/html/rfc3261#section-17.2.1 + * @public + */ +class InviteServerTransaction extends _server_transaction__WEBPACK_IMPORTED_MODULE_0__.ServerTransaction { + /** + * Constructor. + * Upon construction, a "100 Trying" reply will be immediately sent. + * After construction the transaction will be in the "proceeding" state and the transaction + * `id` will equal the branch parameter set in the Via header of the incoming request. + * https://tools.ietf.org/html/rfc3261#section-17.2.1 + * @param request - Incoming INVITE request from the transport. + * @param transport - The transport. + * @param user - The transaction user. + */ + constructor(request, transport, user) { + super(request, transport, user, _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding, "sip.transaction.ist"); + } + /** + * Destructor. + */ + dispose() { + this.stopProgressExtensionTimer(); + if (this.H) { + clearTimeout(this.H); + this.H = undefined; + } + if (this.I) { + clearTimeout(this.I); + this.I = undefined; + } + if (this.L) { + clearTimeout(this.L); + this.L = undefined; + } + super.dispose(); + } + /** Transaction kind. Deprecated. */ + get kind() { + return "ist"; + } + /** + * Receive requests from transport matching this transaction. + * @param request - Request matching this transaction. + */ + receiveRequest(request) { + switch (this.state) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + // If a request retransmission is received while in the "Proceeding" state, the most + // recent provisional response that was received from the TU MUST be passed to the + // transport layer for retransmission. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.INVITE) { + if (this.lastProvisionalResponse) { + this.send(this.lastProvisionalResponse).catch((error) => { + this.logTransportError(error, "Failed to send retransmission of provisional response."); + }); + } + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted: + // While in the "Accepted" state, any retransmissions of the INVITE + // received will match this transaction state machine and will be + // absorbed by the machine without changing its state. These + // retransmissions are not passed onto the TU. + // https://tools.ietf.org/html/rfc6026#section-7.1 + if (request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.INVITE) { + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + // Furthermore, while in the "Completed" state, if a request retransmission is + // received, the server SHOULD pass the response to the transport for retransmission. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.INVITE) { + if (!this.lastFinalResponse) { + throw new Error("Last final response undefined."); + } + this.send(this.lastFinalResponse).catch((error) => { + this.logTransportError(error, "Failed to send retransmission of final response."); + }); + return; + } + // If an ACK is received while the server transaction is in the "Completed" state, + // the server transaction MUST transition to the "Confirmed" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.ACK) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Confirmed); + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Confirmed: + // The purpose of the "Confirmed" state is to absorb any additional ACK messages that arrive, + // triggered from retransmissions of the final response. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.INVITE || request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.ACK) { + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + // For good measure absorb any additional messages that arrive (should not happen). + if (request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.INVITE || request.method === _messages__WEBPACK_IMPORTED_MODULE_2__.C.ACK) { + return; + } + break; + default: + throw new Error(`Invalid state ${this.state}`); + } + const message = `INVITE server transaction received unexpected ${request.method} request while in state ${this.state}.`; + this.logger.warn(message); + return; + } + /** + * Receive responses from TU for this transaction. + * @param statusCode - Status code of response. + * @param response - Response. + */ + receiveResponse(statusCode, response) { + if (statusCode < 100 || statusCode > 699) { + throw new Error(`Invalid status code ${statusCode}`); + } + switch (this.state) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + // The TU passes any number of provisional responses to the server + // transaction. So long as the server transaction is in the + // "Proceeding" state, each of these MUST be passed to the transport + // layer for transmission. They are not sent reliably by the + // transaction layer (they are not retransmitted by it) and do not cause + // a change in the state of the server transaction. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (statusCode >= 100 && statusCode <= 199) { + this.lastProvisionalResponse = response; + // Start the progress extension timer only for a non-100 provisional response. + if (statusCode > 100) { + this.startProgressExtensionTimer(); // FIXME: remove + } + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send 1xx response."); + }); + return; + } + // If, while in the "Proceeding" state, the TU passes a 2xx response + // to the server transaction, the server transaction MUST pass this + // response to the transport layer for transmission. It is not + // retransmitted by the server transaction; retransmissions of 2xx + // responses are handled by the TU. The server transaction MUST then + // transition to the "Accepted" state. + // https://tools.ietf.org/html/rfc6026#section-8.5 + if (statusCode >= 200 && statusCode <= 299) { + this.lastFinalResponse = response; + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted); + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send 2xx response."); + }); + return; + } + // While in the "Proceeding" state, if the TU passes a response with + // status code from 300 to 699 to the server transaction, the response + // MUST be passed to the transport layer for transmission, and the state + // machine MUST enter the "Completed" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (statusCode >= 300 && statusCode <= 699) { + this.lastFinalResponse = response; + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send non-2xx final response."); + }); + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted: + // While in the "Accepted" state, if the TU passes a 2xx response, + // the server transaction MUST pass the response to the transport layer for transmission. + // https://tools.ietf.org/html/rfc6026#section-8.7 + if (statusCode >= 200 && statusCode <= 299) { + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send 2xx response."); + }); + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Confirmed: + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + break; + default: + throw new Error(`Invalid state ${this.state}`); + } + const message = `INVITE server transaction received unexpected ${statusCode} response from TU while in state ${this.state}.`; + this.logger.error(message); + throw new Error(message); + } + /** + * Retransmit the last 2xx response. This is a noop if not in the "accepted" state. + */ + retransmitAcceptedResponse() { + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted && this.lastFinalResponse) { + this.send(this.lastFinalResponse).catch((error) => { + this.logTransportError(error, "Failed to send 2xx response."); + }); + } + } + /** + * First, the procedures in [4] are followed, which attempt to deliver the response to a backup. + * If those should all fail, based on the definition of failure in [4], the server transaction SHOULD + * inform the TU that a failure has occurred, and MUST remain in the current state. + * https://tools.ietf.org/html/rfc6026#section-8.8 + */ + onTransportError(error) { + if (this.user.onTransportError) { + this.user.onTransportError(error); + } + } + /** For logging. */ + typeToString() { + return "INVITE server transaction"; + } + /** + * Execute a state transition. + * @param newState - New state. + */ + stateTransition(newState) { + // Assert valid state transitions. + const invalidStateTransition = () => { + throw new Error(`Invalid state transition from ${this.state} to ${newState}`); + }; + switch (newState) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + invalidStateTransition(); + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted: + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Confirmed: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted && + this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed && + this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Confirmed) { + invalidStateTransition(); + } + break; + default: + invalidStateTransition(); + } + // On any state transition, stop resending provisional responses + this.stopProgressExtensionTimer(); + // The purpose of the "Accepted" state is to absorb retransmissions of an accepted INVITE request. + // Any such retransmissions are absorbed entirely within the server transaction. + // They are not passed up to the TU since any downstream UAS cores that accepted the request have + // taken responsibility for reliability and will already retransmit their 2xx responses if necessary. + // https://tools.ietf.org/html/rfc6026#section-8.7 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted) { + this.L = setTimeout(() => this.timerL(), _timers__WEBPACK_IMPORTED_MODULE_3__.Timers.TIMER_L); + } + // When the "Completed" state is entered, timer H MUST be set to fire in 64*T1 seconds for all transports. + // Timer H determines when the server transaction abandons retransmitting the response. + // If an ACK is received while the server transaction is in the "Completed" state, + // the server transaction MUST transition to the "Confirmed" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + // FIXME: Missing timer G for unreliable transports. + this.H = setTimeout(() => this.timerH(), _timers__WEBPACK_IMPORTED_MODULE_3__.Timers.TIMER_H); + } + // The purpose of the "Confirmed" state is to absorb any additional ACK messages that arrive, + // triggered from retransmissions of the final response. When this state is entered, timer I + // is set to fire in T4 seconds for unreliable transports, and zero seconds for reliable + // transports. Once timer I fires, the server MUST transition to the "Terminated" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.1 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Confirmed) { + // FIXME: This timer is not getting set correctly for unreliable transports. + this.I = setTimeout(() => this.timerI(), _timers__WEBPACK_IMPORTED_MODULE_3__.Timers.TIMER_I); + } + // Once the transaction is in the "Terminated" state, it MUST be destroyed immediately. + // https://tools.ietf.org/html/rfc6026#section-8.7 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated) { + this.dispose(); + } + // Update state. + this.setState(newState); + } + /** + * FIXME: UAS Provisional Retransmission Timer. See RFC 3261 Section 13.3.1.1 + * This is in the wrong place. This is not a transaction level thing. It's a UAS level thing. + */ + startProgressExtensionTimer() { + // Start the progress extension timer only for the first non-100 provisional response. + if (this.progressExtensionTimer === undefined) { + this.progressExtensionTimer = setInterval(() => { + this.logger.debug(`Progress extension timer expired for INVITE server transaction ${this.id}.`); + if (!this.lastProvisionalResponse) { + throw new Error("Last provisional response undefined."); + } + this.send(this.lastProvisionalResponse).catch((error) => { + this.logTransportError(error, "Failed to send retransmission of provisional response."); + }); + }, _timers__WEBPACK_IMPORTED_MODULE_3__.Timers.PROVISIONAL_RESPONSE_INTERVAL); + } + } + /** + * FIXME: UAS Provisional Retransmission Timer id. See RFC 3261 Section 13.3.1.1 + * This is in the wrong place. This is not a transaction level thing. It's a UAS level thing. + */ + stopProgressExtensionTimer() { + if (this.progressExtensionTimer !== undefined) { + clearInterval(this.progressExtensionTimer); + this.progressExtensionTimer = undefined; + } + } + /** + * While in the "Proceeding" state, if the TU passes a response with status code + * from 300 to 699 to the server transaction, the response MUST be passed to the + * transport layer for transmission, and the state machine MUST enter the "Completed" state. + * For unreliable transports, timer G is set to fire in T1 seconds, and is not set to fire for + * reliable transports. If timer G fires, the response is passed to the transport layer once + * more for retransmission, and timer G is set to fire in MIN(2*T1, T2) seconds. From then on, + * when timer G fires, the response is passed to the transport again for transmission, and + * timer G is reset with a value that doubles, unless that value exceeds T2, in which case + * it is reset with the value of T2. + * https://tools.ietf.org/html/rfc3261#section-17.2.1 + */ + timerG() { + // TODO + } + /** + * If timer H fires while in the "Completed" state, it implies that the ACK was never received. + * In this case, the server transaction MUST transition to the "Terminated" state, and MUST + * indicate to the TU that a transaction failure has occurred. + * https://tools.ietf.org/html/rfc3261#section-17.2.1 + */ + timerH() { + this.logger.debug(`Timer H expired for INVITE server transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + this.logger.warn("ACK to negative final response was never received, terminating transaction."); + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } + /** + * Once timer I fires, the server MUST transition to the "Terminated" state. + * https://tools.ietf.org/html/rfc3261#section-17.2.1 + */ + timerI() { + this.logger.debug(`Timer I expired for INVITE server transaction ${this.id}.`); + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + /** + * When Timer L fires and the state machine is in the "Accepted" state, the machine MUST + * transition to the "Terminated" state. Once the transaction is in the "Terminated" state, + * it MUST be destroyed immediately. Timer L reflects the amount of time the server + * transaction could receive 2xx responses for retransmission from the + * TU while it is waiting to receive an ACK. + * https://tools.ietf.org/html/rfc6026#section-7.1 + * https://tools.ietf.org/html/rfc6026#section-8.7 + */ + timerL() { + this.logger.debug(`Timer L expired for INVITE server transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Accepted) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } +} + + +/***/ }), +/* 72 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ServerTransaction": () => (/* binding */ ServerTransaction) +/* harmony export */ }); +/* harmony import */ var _transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(66); + +/** + * Server Transaction. + * @remarks + * The server transaction is responsible for the delivery of requests to + * the TU and the reliable transmission of responses. It accomplishes + * this through a state machine. Server transactions are created by the + * core when a request is received, and transaction handling is desired + * for that request (this is not always the case). + * https://tools.ietf.org/html/rfc3261#section-17.2 + * @public + */ +class ServerTransaction extends _transaction__WEBPACK_IMPORTED_MODULE_0__.Transaction { + constructor(_request, transport, user, state, loggerCategory) { + super(transport, user, _request.viaBranch, state, loggerCategory); + this._request = _request; + this.user = user; + } + /** The incoming request the transaction handling. */ + get request() { + return this._request; + } +} + + +/***/ }), +/* 73 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ByeUserAgentClient": () => (/* binding */ ByeUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * BYE UAC. + * @public + */ +class ByeUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.BYE, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, dialog.userAgentCore, message, delegate); + dialog.dispose(); + } +} + + +/***/ }), +/* 74 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "InfoUserAgentClient": () => (/* binding */ InfoUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * INFO UAC. + * @public + */ +class InfoUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.INFO, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, dialog.userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 75 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ReInviteUserAgentClient": () => (/* binding */ ReInviteUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(68); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * Re-INVITE UAC. + * @remarks + * 14 Modifying an Existing Session + * https://tools.ietf.org/html/rfc3261#section-14 + * 14.1 UAC Behavior + * https://tools.ietf.org/html/rfc3261#section-14.1 + * @public + */ +class ReInviteUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.INVITE, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.InviteClientTransaction, dialog.userAgentCore, message, delegate); + this.delegate = delegate; + dialog.signalingStateTransition(message); + // FIXME: TODO: next line obviously needs to be improved... + dialog.reinviteUserAgentClient = this; // let the dialog know re-invite request sent + this.dialog = dialog; + } + receiveResponse(message) { + if (!this.authenticationGuard(message, this.dialog)) { + return; + } + const statusCode = message.statusCode ? message.statusCode.toString() : ""; + if (!statusCode) { + throw new Error("Response status code undefined."); + } + switch (true) { + case /^100$/.test(statusCode): + if (this.delegate && this.delegate.onTrying) { + this.delegate.onTrying({ message }); + } + break; + case /^1[0-9]{2}$/.test(statusCode): + if (this.delegate && this.delegate.onProgress) { + this.delegate.onProgress({ + message, + session: this.dialog, + // eslint-disable-next-line @typescript-eslint/no-unused-vars + prack: (options) => { + throw new Error("Unimplemented."); + } + }); + } + break; + case /^2[0-9]{2}$/.test(statusCode): + // Update dialog signaling state with offer/answer in body + this.dialog.signalingStateTransition(message); + if (this.delegate && this.delegate.onAccept) { + this.delegate.onAccept({ + message, + session: this.dialog, + ack: (options) => { + const outgoingAckRequest = this.dialog.ack(options); + return outgoingAckRequest; + } + }); + } + break; + case /^3[0-9]{2}$/.test(statusCode): + this.dialog.signalingStateRollback(); + this.dialog.reinviteUserAgentClient = undefined; // ACK was handled by transaction + if (this.delegate && this.delegate.onRedirect) { + this.delegate.onRedirect({ message }); + } + break; + case /^[4-6][0-9]{2}$/.test(statusCode): + this.dialog.signalingStateRollback(); + this.dialog.reinviteUserAgentClient = undefined; // ACK was handled by transaction + if (this.delegate && this.delegate.onReject) { + this.delegate.onReject({ message }); + } + else { + // If a UA receives a non-2xx final response to a re-INVITE, the session + // parameters MUST remain unchanged, as if no re-INVITE had been issued. + // Note that, as stated in Section 12.2.1.2, if the non-2xx final + // response is a 481 (Call/Transaction Does Not Exist), or a 408 + // (Request Timeout), or no response at all is received for the re- + // INVITE (that is, a timeout is returned by the INVITE client + // transaction), the UAC will terminate the dialog. + // + // If a UAC receives a 491 response to a re-INVITE, it SHOULD start a + // timer with a value T chosen as follows: + // + // 1. If the UAC is the owner of the Call-ID of the dialog ID + // (meaning it generated the value), T has a randomly chosen value + // between 2.1 and 4 seconds in units of 10 ms. + // + // 2. If the UAC is not the owner of the Call-ID of the dialog ID, T + // has a randomly chosen value of between 0 and 2 seconds in units + // of 10 ms. + // + // When the timer fires, the UAC SHOULD attempt the re-INVITE once more, + // if it still desires for that session modification to take place. For + // example, if the call was already hung up with a BYE, the re-INVITE + // would not take place. + // https://tools.ietf.org/html/rfc3261#section-14.1 + // FIXME: TODO: The above. + } + break; + default: + throw new Error(`Invalid status code ${statusCode}`); + } + } +} + + +/***/ }), +/* 76 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MessageUserAgentClient": () => (/* binding */ MessageUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + +/** + * MESSAGE UAC. + * @public + */ +class MessageUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteClientTransaction, core, message, delegate); + } +} + + +/***/ }), +/* 77 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NotifyUserAgentClient": () => (/* binding */ NotifyUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * NOTIFY UAS. + * @public + */ +class NotifyUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.NOTIFY, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, dialog.userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 78 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PrackUserAgentClient": () => (/* binding */ PrackUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * PRACK UAC. + * @public + */ +class PrackUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.PRACK, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, dialog.userAgentCore, message, delegate); + dialog.signalingStateTransition(message); + } +} + + +/***/ }), +/* 79 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ReferUserAgentClient": () => (/* binding */ ReferUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * REFER UAC. + * @public + */ +class ReferUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.REFER, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, dialog.userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 80 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ByeUserAgentServer": () => (/* binding */ ByeUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * BYE UAS. + * @public + */ +class ByeUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(dialog, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, dialog.userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 81 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "UserAgentServer": () => (/* binding */ UserAgentServer) +/* harmony export */ }); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(35); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(83); +/* harmony import */ var _messages_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(63); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(82); + + + + +/** + * User Agent Server (UAS). + * @remarks + * A user agent server is a logical entity + * that generates a response to a SIP request. The response + * accepts, rejects, or redirects the request. This role lasts + * only for the duration of that transaction. In other words, if + * a piece of software responds to a request, it acts as a UAS for + * the duration of that transaction. If it generates a request + * later, it assumes the role of a user agent client for the + * processing of that transaction. + * https://tools.ietf.org/html/rfc3261#section-6 + * @public + */ +class UserAgentServer { + constructor(transactionConstructor, core, message, delegate) { + this.transactionConstructor = transactionConstructor; + this.core = core; + this.message = message; + this.delegate = delegate; + this.logger = this.loggerFactory.getLogger("sip.user-agent-server"); + this.toTag = message.toTag ? message.toTag : (0,_messages_utils__WEBPACK_IMPORTED_MODULE_0__.newTag)(); + this.init(); + } + dispose() { + this.transaction.dispose(); + } + get loggerFactory() { + return this.core.loggerFactory; + } + /** The transaction associated with this request. */ + get transaction() { + if (!this._transaction) { + throw new Error("Transaction undefined."); + } + return this._transaction; + } + accept(options = { statusCode: 200 }) { + if (!this.acceptable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError(`${this.message.method} not acceptable in state ${this.transaction.state}.`); + } + const statusCode = options.statusCode; + if (statusCode < 200 || statusCode > 299) { + throw new TypeError(`Invalid statusCode: ${statusCode}`); + } + const response = this.reply(options); + return response; + } + progress(options = { statusCode: 180 }) { + if (!this.progressable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError(`${this.message.method} not progressable in state ${this.transaction.state}.`); + } + const statusCode = options.statusCode; + if (statusCode < 101 || statusCode > 199) { + throw new TypeError(`Invalid statusCode: ${statusCode}`); + } + const response = this.reply(options); + return response; + } + redirect(contacts, options = { statusCode: 302 }) { + if (!this.redirectable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError(`${this.message.method} not redirectable in state ${this.transaction.state}.`); + } + const statusCode = options.statusCode; + if (statusCode < 300 || statusCode > 399) { + throw new TypeError(`Invalid statusCode: ${statusCode}`); + } + const contactHeaders = new Array(); + contacts.forEach((contact) => contactHeaders.push(`Contact: ${contact.toString()}`)); + options.extraHeaders = (options.extraHeaders || []).concat(contactHeaders); + const response = this.reply(options); + return response; + } + reject(options = { statusCode: 480 }) { + if (!this.rejectable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError(`${this.message.method} not rejectable in state ${this.transaction.state}.`); + } + const statusCode = options.statusCode; + if (statusCode < 400 || statusCode > 699) { + throw new TypeError(`Invalid statusCode: ${statusCode}`); + } + const response = this.reply(options); + return response; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + trying(options) { + if (!this.tryingable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError(`${this.message.method} not tryingable in state ${this.transaction.state}.`); + } + const response = this.reply({ statusCode: 100 }); + return response; + } + /** + * If the UAS did not find a matching transaction for the CANCEL + * according to the procedure above, it SHOULD respond to the CANCEL + * with a 481 (Call Leg/Transaction Does Not Exist). If the transaction + * for the original request still exists, the behavior of the UAS on + * receiving a CANCEL request depends on whether it has already sent a + * final response for the original request. If it has, the CANCEL + * request has no effect on the processing of the original request, no + * effect on any session state, and no effect on the responses generated + * for the original request. If the UAS has not issued a final response + * for the original request, its behavior depends on the method of the + * original request. If the original request was an INVITE, the UAS + * SHOULD immediately respond to the INVITE with a 487 (Request + * Terminated). A CANCEL request has no impact on the processing of + * transactions with any other method defined in this specification. + * https://tools.ietf.org/html/rfc3261#section-9.2 + * @param request - Incoming CANCEL request. + */ + receiveCancel(message) { + // Note: Currently CANCEL is being handled as a special case. + // No UAS is created to handle the CANCEL and the response to + // it CANCEL is being handled statelessly by the user agent core. + // As such, there is currently no way to externally impact the + // response to the a CANCEL request. + if (this.delegate && this.delegate.onCancel) { + this.delegate.onCancel(message); + } + } + get acceptable() { + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + return (this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding || this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Accepted); + } + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_4__.NonInviteServerTransaction) { + return (this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Trying || this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding); + } + throw new Error("Unknown transaction type."); + } + get progressable() { + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + return this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding; + } + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_4__.NonInviteServerTransaction) { + return false; // https://tools.ietf.org/html/rfc4320#section-4.1 + } + throw new Error("Unknown transaction type."); + } + get redirectable() { + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + return this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding; + } + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_4__.NonInviteServerTransaction) { + return (this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Trying || this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding); + } + throw new Error("Unknown transaction type."); + } + get rejectable() { + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + return this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding; + } + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_4__.NonInviteServerTransaction) { + return (this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Trying || this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding); + } + throw new Error("Unknown transaction type."); + } + get tryingable() { + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction) { + return this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Proceeding; + } + if (this.transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_4__.NonInviteServerTransaction) { + return this.transaction.state === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Trying; + } + throw new Error("Unknown transaction type."); + } + /** + * When a UAS wishes to construct a response to a request, it follows + * the general procedures detailed in the following subsections. + * Additional behaviors specific to the response code in question, which + * are not detailed in this section, may also be required. + * + * Once all procedures associated with the creation of a response have + * been completed, the UAS hands the response back to the server + * transaction from which it received the request. + * https://tools.ietf.org/html/rfc3261#section-8.2.6 + * @param statusCode - Status code to reply with. + * @param options - Reply options bucket. + */ + reply(options) { + if (!options.toTag && options.statusCode !== 100) { + options.toTag = this.toTag; + } + options.userAgent = options.userAgent || this.core.configuration.userAgentHeaderFieldValue; + options.supported = options.supported || this.core.configuration.supportedOptionTagsResponse; + const response = (0,_messages__WEBPACK_IMPORTED_MODULE_5__.constructOutgoingResponse)(this.message, options); + this.transaction.receiveResponse(options.statusCode, response.message); + return response; + } + init() { + // We are the transaction user. + const user = { + loggerFactory: this.loggerFactory, + onStateChange: (newState) => { + if (newState === _transactions__WEBPACK_IMPORTED_MODULE_3__.TransactionState.Terminated) { + // Remove the terminated transaction from the core. + // eslint-disable-next-line @typescript-eslint/no-use-before-define + this.core.userAgentServers.delete(userAgentServerId); + this.dispose(); + } + }, + onTransportError: (error) => { + this.logger.error(error.message); + if (this.delegate && this.delegate.onTransportError) { + this.delegate.onTransportError(error); + } + else { + this.logger.error("User agent server response transport error."); + } + } + }; + // Create a new transaction with us as the user. + const transaction = new this.transactionConstructor(this.message, this.core.transport, user); + this._transaction = transaction; + // Add the new transaction to the core. + const userAgentServerId = transaction.id; + this.core.userAgentServers.set(transaction.id, this); + } +} + + +/***/ }), +/* 82 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NonInviteServerTransaction": () => (/* binding */ NonInviteServerTransaction) +/* harmony export */ }); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(36); +/* harmony import */ var _server_transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(72); +/* harmony import */ var _transaction_state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(63); + + + +/** + * Non-INVITE Server Transaction. + * @remarks + * https://tools.ietf.org/html/rfc3261#section-17.2.2 + * @public + */ +class NonInviteServerTransaction extends _server_transaction__WEBPACK_IMPORTED_MODULE_0__.ServerTransaction { + /** + * Constructor. + * After construction the transaction will be in the "trying": state and the transaction + * `id` will equal the branch parameter set in the Via header of the incoming request. + * https://tools.ietf.org/html/rfc3261#section-17.2.2 + * @param request - Incoming Non-INVITE request from the transport. + * @param transport - The transport. + * @param user - The transaction user. + */ + constructor(request, transport, user) { + super(request, transport, user, _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying, "sip.transaction.nist"); + } + /** + * Destructor. + */ + dispose() { + if (this.J) { + clearTimeout(this.J); + this.J = undefined; + } + super.dispose(); + } + /** Transaction kind. Deprecated. */ + get kind() { + return "nist"; + } + /** + * Receive requests from transport matching this transaction. + * @param request - Request matching this transaction. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + receiveRequest(request) { + switch (this.state) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying: + // Once in the "Trying" state, any further request retransmissions are discarded. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + // If a retransmission of the request is received while in the "Proceeding" state, + // the most recently sent provisional response MUST be passed to the transport layer for retransmission. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + if (!this.lastResponse) { + throw new Error("Last response undefined."); + } + this.send(this.lastResponse).catch((error) => { + this.logTransportError(error, "Failed to send retransmission of provisional response."); + }); + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + // While in the "Completed" state, the server transaction MUST pass the final response to the transport + // layer for retransmission whenever a retransmission of the request is received. Any other final responses + // passed by the TU to the server transaction MUST be discarded while in the "Completed" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + if (!this.lastResponse) { + throw new Error("Last response undefined."); + } + this.send(this.lastResponse).catch((error) => { + this.logTransportError(error, "Failed to send retransmission of final response."); + }); + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + break; + default: + throw new Error(`Invalid state ${this.state}`); + } + } + /** + * Receive responses from TU for this transaction. + * @param statusCode - Status code of response. 101-199 not allowed per RFC 4320. + * @param response - Response to send. + */ + receiveResponse(statusCode, response) { + if (statusCode < 100 || statusCode > 699) { + throw new Error(`Invalid status code ${statusCode}`); + } + // An SIP element MUST NOT send any provisional response with a + // Status-Code other than 100 to a non-INVITE request. + // An SIP element MUST NOT respond to a non-INVITE request with a + // Status-Code of 100 over any unreliable transport, such as UDP, + // before the amount of time it takes a client transaction's Timer E to be reset to T2. + // An SIP element MAY respond to a non-INVITE request with a + // Status-Code of 100 over a reliable transport at any time. + // https://tools.ietf.org/html/rfc4320#section-4.1 + if (statusCode > 100 && statusCode <= 199) { + throw new Error("Provisional response other than 100 not allowed."); + } + switch (this.state) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying: + // While in the "Trying" state, if the TU passes a provisional response + // to the server transaction, the server transaction MUST enter the "Proceeding" state. + // The response MUST be passed to the transport layer for transmission. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + this.lastResponse = response; + if (statusCode >= 100 && statusCode < 200) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding); + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send provisional response."); + }); + return; + } + if (statusCode >= 200 && statusCode <= 699) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send final response."); + }); + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + // Any further provisional responses that are received from the TU while + // in the "Proceeding" state MUST be passed to the transport layer for transmission. + // If the TU passes a final response (status codes 200-699) to the server while in + // the "Proceeding" state, the transaction MUST enter the "Completed" state, and + // the response MUST be passed to the transport layer for transmission. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + this.lastResponse = response; + if (statusCode >= 200 && statusCode <= 699) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed); + this.send(response).catch((error) => { + this.logTransportError(error, "Failed to send final response."); + }); + return; + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + // Any other final responses passed by the TU to the server + // transaction MUST be discarded while in the "Completed" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + return; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + break; + default: + throw new Error(`Invalid state ${this.state}`); + } + const message = `Non-INVITE server transaction received unexpected ${statusCode} response from TU while in state ${this.state}.`; + this.logger.error(message); + throw new Error(message); + } + /** + * First, the procedures in [4] are followed, which attempt to deliver the response to a backup. + * If those should all fail, based on the definition of failure in [4], the server transaction SHOULD + * inform the TU that a failure has occurred, and SHOULD transition to the terminated state. + * https://tools.ietf.org/html/rfc3261#section-17.2.4 + */ + onTransportError(error) { + if (this.user.onTransportError) { + this.user.onTransportError(error); + } + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated, true); + } + /** For logging. */ + typeToString() { + return "non-INVITE server transaction"; + } + stateTransition(newState, dueToTransportError = false) { + // Assert valid state transitions. + const invalidStateTransition = () => { + throw new Error(`Invalid state transition from ${this.state} to ${newState}`); + }; + switch (newState) { + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying: + invalidStateTransition(); + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Trying && this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding) { + invalidStateTransition(); + } + break; + case _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated: + if (this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Proceeding && this.state !== _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + if (!dueToTransportError) { + invalidStateTransition(); + } + } + break; + default: + invalidStateTransition(); + } + // When the server transaction enters the "Completed" state, it MUST set Timer J to fire + // in 64*T1 seconds for unreliable transports, and zero seconds for reliable transports. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + this.J = setTimeout(() => this.timerJ(), _timers__WEBPACK_IMPORTED_MODULE_2__.Timers.TIMER_J); + } + // The server transaction MUST be destroyed the instant it enters the "Terminated" state. + // https://tools.ietf.org/html/rfc3261#section-17.2.2 + if (newState === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated) { + this.dispose(); + } + this.setState(newState); + } + /** + * The server transaction remains in this state until Timer J fires, + * at which point it MUST transition to the "Terminated" state. + * https://tools.ietf.org/html/rfc3261#section-17.2.2 + */ + timerJ() { + this.logger.debug(`Timer J expired for NON-INVITE server transaction ${this.id}.`); + if (this.state === _transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Completed) { + this.stateTransition(_transaction_state__WEBPACK_IMPORTED_MODULE_1__.TransactionState.Terminated); + } + } +} + + +/***/ }), +/* 83 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "constructOutgoingResponse": () => (/* binding */ constructOutgoingResponse) +/* harmony export */ }); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20); + +/** + * When a UAS wishes to construct a response to a request, it follows + * the general procedures detailed in the following subsections. + * Additional behaviors specific to the response code in question, which + * are not detailed in this section, may also be required. + * https://tools.ietf.org/html/rfc3261#section-8.2.6 + * @internal + */ +function constructOutgoingResponse(message, options) { + const CRLF = "\r\n"; + if (options.statusCode < 100 || options.statusCode > 699) { + throw new TypeError("Invalid statusCode: " + options.statusCode); + } + const reasonPhrase = options.reasonPhrase ? options.reasonPhrase : (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getReasonPhrase)(options.statusCode); + // SIP responses are distinguished from requests by having a Status-Line + // as their start-line. A Status-Line consists of the protocol version + // followed by a numeric Status-Code and its associated textual phrase, + // with each element separated by a single SP character. + // https://tools.ietf.org/html/rfc3261#section-7.2 + let response = "SIP/2.0 " + options.statusCode + " " + reasonPhrase + CRLF; + // One largely non-method-specific guideline for the generation of + // responses is that UASs SHOULD NOT issue a provisional response for a + // non-INVITE request. Rather, UASs SHOULD generate a final response to + // a non-INVITE request as soon as possible. + // https://tools.ietf.org/html/rfc3261#section-8.2.6.1 + if (options.statusCode >= 100 && options.statusCode < 200) { + // TODO + } + // When a 100 (Trying) response is generated, any Timestamp header field + // present in the request MUST be copied into this 100 (Trying) + // response. If there is a delay in generating the response, the UAS + // SHOULD add a delay value into the Timestamp value in the response. + // This value MUST contain the difference between the time of sending of + // the response and receipt of the request, measured in seconds. + // https://tools.ietf.org/html/rfc3261#section-8.2.6.1 + if (options.statusCode === 100) { + // TODO + } + // The From field of the response MUST equal the From header field of + // the request. The Call-ID header field of the response MUST equal the + // Call-ID header field of the request. The CSeq header field of the + // response MUST equal the CSeq field of the request. The Via header + // field values in the response MUST equal the Via header field values + // in the request and MUST maintain the same ordering. + // https://tools.ietf.org/html/rfc3261#section-8.2.6.2 + const fromHeader = "From: " + message.getHeader("From") + CRLF; + const callIdHeader = "Call-ID: " + message.callId + CRLF; + const cSeqHeader = "CSeq: " + message.cseq + " " + message.method + CRLF; + const viaHeaders = message.getHeaders("via").reduce((previous, current) => { + return previous + "Via: " + current + CRLF; + }, ""); + // If a request contained a To tag in the request, the To header field + // in the response MUST equal that of the request. However, if the To + // header field in the request did not contain a tag, the URI in the To + // header field in the response MUST equal the URI in the To header + // field; additionally, the UAS MUST add a tag to the To header field in + // the response (with the exception of the 100 (Trying) response, in + // which a tag MAY be present). This serves to identify the UAS that is + // responding, possibly resulting in a component of a dialog ID. The + // same tag MUST be used for all responses to that request, both final + // and provisional (again excepting the 100 (Trying)). + // https://tools.ietf.org/html/rfc3261#section-8.2.6.2 + let toHeader = "To: " + message.getHeader("to"); + if (options.statusCode > 100 && !message.parseHeader("to").hasParam("tag")) { + let toTag = options.toTag; + if (!toTag) { + // Stateless UAS Behavior... + // o To header tags MUST be generated for responses in a stateless + // manner - in a manner that will generate the same tag for the + // same request consistently. For information on tag construction + // see Section 19.3. + // https://tools.ietf.org/html/rfc3261#section-8.2.7 + toTag = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.newTag)(); // FIXME: newTag() currently generates random tags + } + toHeader += ";tag=" + toTag; + } + toHeader += CRLF; + // FIXME: TODO: needs review... moved to InviteUserAgentServer (as it is specific to that) + // let recordRouteHeaders = ""; + // if (request.method === C.INVITE && statusCode > 100 && statusCode <= 200) { + // recordRouteHeaders = request.getHeaders("record-route").reduce((previous, current) => { + // return previous + "Record-Route: " + current + CRLF; + // }, ""); + // } + // FIXME: TODO: needs review... + let supportedHeader = ""; + if (options.supported) { + supportedHeader = "Supported: " + options.supported.join(", ") + CRLF; + } + // FIXME: TODO: needs review... + let userAgentHeader = ""; + if (options.userAgent) { + userAgentHeader = "User-Agent: " + options.userAgent + CRLF; + } + let extensionHeaders = ""; + if (options.extraHeaders) { + extensionHeaders = options.extraHeaders.reduce((previous, current) => { + return previous + current.trim() + CRLF; + }, ""); + } + // The relative order of header fields with different field names is not + // significant. However, it is RECOMMENDED that header fields which are + // needed for proxy processing (Via, Route, Record-Route, Proxy-Require, + // Max-Forwards, and Proxy-Authorization, for example) appear towards + // the top of the message to facilitate rapid parsing. + // https://tools.ietf.org/html/rfc3261#section-7.3.1 + // response += recordRouteHeaders; + response += viaHeaders; + response += fromHeader; + response += toHeader; + response += cSeqHeader; + response += callIdHeader; + response += supportedHeader; + response += userAgentHeader; + response += extensionHeaders; + if (options.body) { + response += "Content-Type: " + options.body.contentType + CRLF; + response += "Content-Length: " + (0,_utils__WEBPACK_IMPORTED_MODULE_0__.utf8Length)(options.body.content) + CRLF + CRLF; + response += options.body.content; + } + else { + response += "Content-Length: " + 0 + CRLF + CRLF; + } + return { message: response }; +} + + +/***/ }), +/* 84 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "InfoUserAgentServer": () => (/* binding */ InfoUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * INFO UAS. + * @public + */ +class InfoUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(dialog, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, dialog.userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 85 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ReInviteUserAgentServer": () => (/* binding */ ReInviteUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(71); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * Re-INVITE UAS. + * @remarks + * 14 Modifying an Existing Session + * https://tools.ietf.org/html/rfc3261#section-14 + * 14.2 UAS Behavior + * https://tools.ietf.org/html/rfc3261#section-14.2 + * @public + */ +class ReInviteUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(dialog, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.InviteServerTransaction, dialog.userAgentCore, message, delegate); + dialog.reinviteUserAgentServer = this; + this.dialog = dialog; + } + /** + * Update the dialog signaling state on a 2xx response. + * @param options - Options bucket. + */ + accept(options = { statusCode: 200 }) { + // FIXME: The next two lines SHOULD go away, but I suppose it's technically harmless... + // These are here because some versions of SIP.js prior to 0.13.8 set the route set + // of all in dialog ACKs based on the Record-Route headers in the associated 2xx + // response. While this worked for dialog forming 2xx responses, it was technically + // broken for re-INVITE ACKS as it only worked if the UAS populated the Record-Route + // headers in the re-INVITE 2xx response (which is not required and a waste of bandwidth + // as the should be ignored if present in re-INVITE ACKS) and the UAS populated + // the Record-Route headers with the correct values (would be weird not too, but...). + // Anyway, for now the technically useless Record-Route headers are being added + // to maintain "backwards compatibility" with the older broken versions of SIP.js. + options.extraHeaders = options.extraHeaders || []; + options.extraHeaders = options.extraHeaders.concat(this.dialog.routeSet.map((route) => `Record-Route: ${route}`)); + // Send and return the response + const response = super.accept(options); + const session = this.dialog; + const result = Object.assign(Object.assign({}, response), { session }); + if (options.body) { + // Update dialog signaling state with offer/answer in body + this.dialog.signalingStateTransition(options.body); + } + // Update dialog + this.dialog.reConfirm(); + return result; + } + /** + * Update the dialog signaling state on a 1xx response. + * @param options - Progress options bucket. + */ + progress(options = { statusCode: 180 }) { + // Send and return the response + const response = super.progress(options); + const session = this.dialog; + const result = Object.assign(Object.assign({}, response), { session }); + // Update dialog signaling state + if (options.body) { + this.dialog.signalingStateTransition(options.body); + } + return result; + } + /** + * TODO: Not Yet Supported + * @param contacts - Contacts to redirect to. + * @param options - Redirect options bucket. + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + redirect(contacts, options = { statusCode: 302 }) { + this.dialog.signalingStateRollback(); + this.dialog.reinviteUserAgentServer = undefined; // ACK will be handled by transaction + throw new Error("Unimplemented."); + } + /** + * 3.1 Background on Re-INVITE Handling by UASs + * An error response to a re-INVITE has the following semantics. As + * specified in Section 12.2.2 of RFC 3261 [RFC3261], if a re-INVITE is + * rejected, no state changes are performed. + * https://tools.ietf.org/html/rfc6141#section-3.1 + * @param options - Reject options bucket. + */ + reject(options = { statusCode: 488 }) { + this.dialog.signalingStateRollback(); + this.dialog.reinviteUserAgentServer = undefined; // ACK will be handled by transaction + return super.reject(options); + } +} + + +/***/ }), +/* 86 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "MessageUserAgentServer": () => (/* binding */ MessageUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * MESSAGE UAS. + * @public + */ +class MessageUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, core, message, delegate); + } +} + + +/***/ }), +/* 87 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "NotifyUserAgentServer": () => (/* binding */ NotifyUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function instanceOfDialog(object) { + return object.userAgentCore !== undefined; +} +/** + * NOTIFY UAS. + * @public + */ +class NotifyUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + /** + * NOTIFY UAS constructor. + * @param dialogOrCore - Dialog for in dialog NOTIFY, UserAgentCore for out of dialog NOTIFY (deprecated). + * @param message - Incoming NOTIFY request message. + */ + constructor(dialogOrCore, message, delegate) { + const userAgentCore = instanceOfDialog(dialogOrCore) ? dialogOrCore.userAgentCore : dialogOrCore; + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 88 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PrackUserAgentServer": () => (/* binding */ PrackUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * PRACK UAS. + * @public + */ +class PrackUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(dialog, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, dialog.userAgentCore, message, delegate); + // Update dialog signaling state with offer/answer in body + dialog.signalingStateTransition(message); + this.dialog = dialog; + } + /** + * Update the dialog signaling state on a 2xx response. + * @param options - Options bucket. + */ + accept(options = { statusCode: 200 }) { + if (options.body) { + // Update dialog signaling state with offer/answer in body + this.dialog.signalingStateTransition(options.body); + } + return super.accept(options); + } +} + + +/***/ }), +/* 89 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ReferUserAgentServer": () => (/* binding */ ReferUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function instanceOfSessionDialog(object) { + return object.userAgentCore !== undefined; +} +/** + * REFER UAS. + * @public + */ +class ReferUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + /** + * REFER UAS constructor. + * @param dialogOrCore - Dialog for in dialog REFER, UserAgentCore for out of dialog REFER. + * @param message - Incoming REFER request message. + */ + constructor(dialogOrCore, message, delegate) { + const userAgentCore = instanceOfSessionDialog(dialogOrCore) ? dialogOrCore.userAgentCore : dialogOrCore; + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 90 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "PublishUserAgentClient": () => (/* binding */ PublishUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + +/** + * PUBLISH UAC. + * @public + */ +class PublishUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteClientTransaction, core, message, delegate); + } +} + + +/***/ }), +/* 91 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RegisterUserAgentClient": () => (/* binding */ RegisterUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + +/** + * REGISTER UAC. + * @public + */ +class RegisterUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteClientTransaction, core, message, delegate); + } +} + + +/***/ }), +/* 92 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SubscribeUserAgentClient": () => (/* binding */ SubscribeUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _dialogs_subscription_dialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(93); +/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(46); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(36); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + + + +/** + * SUBSCRIBE UAC. + * @remarks + * 4.1. Subscriber Behavior + * https://tools.ietf.org/html/rfc6665#section-4.1 + * + * User agent client for installation of a single subscription per SUBSCRIBE request. + * TODO: Support for installation of multiple subscriptions on forked SUBSCRIBE requests. + * @public + */ +class SubscribeUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(core, message, delegate) { + // Get event from request message. + const event = message.getHeader("Event"); + if (!event) { + throw new Error("Event undefined"); + } + // Get expires from request message. + const expires = message.getHeader("Expires"); + if (!expires) { + throw new Error("Expires undefined"); + } + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteClientTransaction, core, message, delegate); + this.delegate = delegate; + // FIXME: Subscriber id should also be matching on event id. + this.subscriberId = message.callId + message.fromTag + event; + this.subscriptionExpiresRequested = this.subscriptionExpires = Number(expires); + this.subscriptionEvent = event; + this.subscriptionState = _subscription__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.NotifyWait; + // Start waiting for a NOTIFY we can use to create a subscription. + this.waitNotifyStart(); + } + /** + * Destructor. + * Note that Timer N may live on waiting for an initial NOTIFY and + * the delegate may still receive that NOTIFY. If you don't want + * that behavior then either clear the delegate so the delegate + * doesn't get called (a 200 will be sent in response to the NOTIFY) + * or call `waitNotifyStop` which will clear Timer N and remove this + * UAC from the core (a 481 will be sent in response to the NOTIFY). + */ + dispose() { + super.dispose(); + } + /** + * Handle out of dialog NOTIFY associated with SUBSCRIBE request. + * This is the first NOTIFY received after the SUBSCRIBE request. + * @param uas - User agent server handling the subscription creating NOTIFY. + */ + onNotify(uas) { + // NOTIFY requests are matched to such SUBSCRIBE requests if they + // contain the same "Call-ID", a "To" header field "tag" parameter that + // matches the "From" header field "tag" parameter of the SUBSCRIBE + // request, and the same "Event" header field. Rules for comparisons of + // the "Event" header fields are described in Section 8.2.1. + // https://tools.ietf.org/html/rfc6665#section-4.4.1 + const event = uas.message.parseHeader("Event").event; + if (!event || event !== this.subscriptionEvent) { + this.logger.warn(`Failed to parse event.`); + uas.reject({ statusCode: 489 }); + return; + } + // NOTIFY requests MUST contain "Subscription-State" header fields that + // indicate the status of the subscription. + // https://tools.ietf.org/html/rfc6665#section-4.1.3 + const subscriptionState = uas.message.parseHeader("Subscription-State"); + if (!subscriptionState || !subscriptionState.state) { + this.logger.warn("Failed to parse subscription state."); + uas.reject({ statusCode: 489 }); + return; + } + // Validate subscription state. + const state = subscriptionState.state; + switch (state) { + case "pending": + break; + case "active": + break; + case "terminated": + break; + default: + this.logger.warn(`Invalid subscription state ${state}`); + uas.reject({ statusCode: 489 }); + return; + } + // Dialogs usages are created upon completion of a NOTIFY transaction + // for a new subscription, unless the NOTIFY request contains a + // "Subscription-State" of "terminated." + // https://tools.ietf.org/html/rfc6665#section-4.4.1 + if (state !== "terminated") { + // The Contact header field MUST be present and contain exactly one SIP + // or SIPS URI in any request that can result in the establishment of a + // dialog. + // https://tools.ietf.org/html/rfc3261#section-8.1.1.8 + const contact = uas.message.parseHeader("contact"); + if (!contact) { + this.logger.warn("Failed to parse contact."); + uas.reject({ statusCode: 489 }); + return; + } + } + // In accordance with the rules for proxying non-INVITE requests as + // defined in [RFC3261], successful SUBSCRIBE requests will receive only + // one 200-class response; however, due to forking, the subscription may + // have been accepted by multiple nodes. The subscriber MUST therefore + // be prepared to receive NOTIFY requests with "From:" tags that differ + // from the "To:" tag received in the SUBSCRIBE 200-class response. + // + // If multiple NOTIFY requests are received in different dialogs in + // response to a single SUBSCRIBE request, each dialog represents a + // different destination to which the SUBSCRIBE request was forked. + // Subscriber handling in such situations varies by event package; see + // Section 5.4.9 for details. + // https://tools.ietf.org/html/rfc6665#section-4.1.4 + // Each event package MUST specify whether forked SUBSCRIBE requests are + // allowed to install multiple subscriptions. + // + // If such behavior is not allowed, the first potential dialog- + // establishing message will create a dialog. All subsequent NOTIFY + // requests that correspond to the SUBSCRIBE request (i.e., have + // matching "To", "From", "Call-ID", and "Event" header fields, as well + // as "From" header field "tag" parameter and "Event" header field "id" + // parameter) but that do not match the dialog would be rejected with a + // 481 response. Note that the 200-class response to the SUBSCRIBE + // request can arrive after a matching NOTIFY request has been received; + // such responses might not correlate to the same dialog established by + // the NOTIFY request. Except as required to complete the SUBSCRIBE + // transaction, such non-matching 200-class responses are ignored. + // + // If installing of multiple subscriptions by way of a single forked + // SUBSCRIBE request is allowed, the subscriber establishes a new dialog + // towards each notifier by returning a 200-class response to each + // NOTIFY request. Each dialog is then handled as its own entity and is + // refreshed independently of the other dialogs. + // + // In the case that multiple subscriptions are allowed, the event + // package MUST specify whether merging of the notifications to form a + // single state is required, and how such merging is to be performed. + // Note that it is possible that some event packages may be defined in + // such a way that each dialog is tied to a mutually exclusive state + // that is unaffected by the other dialogs; this MUST be clearly stated + // if it is the case. + // https://tools.ietf.org/html/rfc6665#section-5.4.9 + // *** NOTE: This implementation is only for event packages which + // do not allow forked requests to install multiple subscriptions. + // As such and in accordance with the specification, we stop waiting + // and any future NOTIFY requests will be rejected with a 481. + if (this.dialog) { + throw new Error("Dialog already created. This implementation only supports install of single subscriptions."); + } + this.waitNotifyStop(); + // Update expires. + this.subscriptionExpires = subscriptionState.expires + ? Math.min(this.subscriptionExpires, Math.max(subscriptionState.expires, 0)) + : this.subscriptionExpires; + // Update subscription state. + switch (state) { + case "pending": + this.subscriptionState = _subscription__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Pending; + break; + case "active": + this.subscriptionState = _subscription__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Active; + break; + case "terminated": + this.subscriptionState = _subscription__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Terminated; + break; + default: + throw new Error(`Unrecognized state ${state}.`); + } + // Dialogs usages are created upon completion of a NOTIFY transaction + // for a new subscription, unless the NOTIFY request contains a + // "Subscription-State" of "terminated." + // https://tools.ietf.org/html/rfc6665#section-4.4.1 + if (this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_2__.SubscriptionState.Terminated) { + // Because the dialog usage is established by the NOTIFY request, the + // route set at the subscriber is taken from the NOTIFY request itself, + // as opposed to the route set present in the 200-class response to the + // SUBSCRIBE request. + // https://tools.ietf.org/html/rfc6665#section-4.4.1 + const dialogState = _dialogs_subscription_dialog__WEBPACK_IMPORTED_MODULE_3__.SubscriptionDialog.initialDialogStateForSubscription(this.message, uas.message); + // Subscription Initiated! :) + this.dialog = new _dialogs_subscription_dialog__WEBPACK_IMPORTED_MODULE_3__.SubscriptionDialog(this.subscriptionEvent, this.subscriptionExpires, this.subscriptionState, this.core, dialogState); + } + // Delegate. + if (this.delegate && this.delegate.onNotify) { + const request = uas; + const subscription = this.dialog; + this.delegate.onNotify({ request, subscription }); + } + else { + uas.accept(); + } + } + waitNotifyStart() { + if (!this.N) { + // Add ourselves to the core's subscriber map. + // This allows the core to route out of dialog NOTIFY messages to us. + this.core.subscribers.set(this.subscriberId, this); + this.N = setTimeout(() => this.timerN(), _timers__WEBPACK_IMPORTED_MODULE_4__.Timers.TIMER_N); + } + } + waitNotifyStop() { + if (this.N) { + // Remove ourselves to the core's subscriber map. + // Any future out of dialog NOTIFY messages will be rejected with a 481. + this.core.subscribers.delete(this.subscriberId); + clearTimeout(this.N); + this.N = undefined; + } + } + /** + * Receive a response from the transaction layer. + * @param message - Incoming response message. + */ + receiveResponse(message) { + if (!this.authenticationGuard(message)) { + return; + } + if (message.statusCode && message.statusCode >= 200 && message.statusCode < 300) { + // The "Expires" header field in a 200-class response to SUBSCRIBE + // request indicates the actual duration for which the subscription will + // remain active (unless refreshed). The received value might be + // smaller than the value indicated in the SUBSCRIBE request but cannot + // be larger; see Section 4.2.1 for details. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.1 + // The "Expires" values present in SUBSCRIBE 200-class responses behave + // in the same way as they do in REGISTER responses: the server MAY + // shorten the interval but MUST NOT lengthen it. + // + // If the duration specified in a SUBSCRIBE request is unacceptably + // short, the notifier may be able to send a 423 response, as + // described earlier in this section. + // + // 200-class responses to SUBSCRIBE requests will not generally contain + // any useful information beyond subscription duration; their primary + // purpose is to serve as a reliability mechanism. State information + // will be communicated via a subsequent NOTIFY request from the + // notifier. + // https://tools.ietf.org/html/rfc6665#section-4.2.1.1 + const expires = message.getHeader("Expires"); + if (!expires) { + this.logger.warn("Expires header missing in a 200-class response to SUBSCRIBE"); + } + else { + const subscriptionExpiresReceived = Number(expires); + if (subscriptionExpiresReceived > this.subscriptionExpiresRequested) { + this.logger.warn("Expires header in a 200-class response to SUBSCRIBE with a higher value than the one in the request"); + } + if (subscriptionExpiresReceived < this.subscriptionExpires) { + this.subscriptionExpires = subscriptionExpiresReceived; + } + } + // If a NOTIFY arrived before 200-class response a dialog may have been created. + // Updated the dialogs expiration only if this indicates earlier expiration. + if (this.dialog) { + if (this.dialog.subscriptionExpires > this.subscriptionExpires) { + this.dialog.subscriptionExpires = this.subscriptionExpires; + } + } + } + if (message.statusCode && message.statusCode >= 300 && message.statusCode < 700) { + this.waitNotifyStop(); // No NOTIFY will be sent after a negative final response. + } + super.receiveResponse(message); + } + /** + * To ensure that subscribers do not wait indefinitely for a + * subscription to be established, a subscriber starts a Timer N, set to + * 64*T1, when it sends a SUBSCRIBE request. If this Timer N expires + * prior to the receipt of a NOTIFY request, the subscriber considers + * the subscription failed, and cleans up any state associated with the + * subscription attempt. + * https://tools.ietf.org/html/rfc6665#section-4.1.2.4 + */ + timerN() { + this.logger.warn(`Timer N expired for SUBSCRIBE user agent client. Timed out waiting for NOTIFY.`); + this.waitNotifyStop(); + if (this.delegate && this.delegate.onNotifyTimeout) { + this.delegate.onNotifyTimeout(); + } + } +} + + +/***/ }), +/* 93 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SubscriptionDialog": () => (/* binding */ SubscriptionDialog) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); +/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(46); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(36); +/* harmony import */ var _user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28); +/* harmony import */ var _user_agents_notify_user_agent_server__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(87); +/* harmony import */ var _user_agents_re_subscribe_user_agent_client__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(94); +/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69); + + + + + + + +/** + * Subscription Dialog. + * @remarks + * SIP-Specific Event Notification + * + * Abstract + * + * This document describes an extension to the Session Initiation + * Protocol (SIP) defined by RFC 3261. The purpose of this extension is + * to provide an extensible framework by which SIP nodes can request + * notification from remote nodes indicating that certain events have + * occurred. + * + * Note that the event notification mechanisms defined herein are NOT + * intended to be a general-purpose infrastructure for all classes of + * event subscription and notification. + * + * This document represents a backwards-compatible improvement on the + * original mechanism described by RFC 3265, taking into account several + * years of implementation experience. Accordingly, this document + * obsoletes RFC 3265. This document also updates RFC 4660 slightly to + * accommodate some small changes to the mechanism that were discussed + * in that document. + * + * https://tools.ietf.org/html/rfc6665 + * @public + */ +class SubscriptionDialog extends _dialog__WEBPACK_IMPORTED_MODULE_0__.Dialog { + constructor(subscriptionEvent, subscriptionExpires, subscriptionState, core, state, delegate) { + super(core, state); + this.delegate = delegate; + this._autoRefresh = false; + this._subscriptionEvent = subscriptionEvent; + this._subscriptionExpires = subscriptionExpires; + this._subscriptionExpiresInitial = subscriptionExpires; + this._subscriptionExpiresLastSet = Math.floor(Date.now() / 1000); + this._subscriptionRefresh = undefined; + this._subscriptionRefreshLastSet = undefined; + this._subscriptionState = subscriptionState; + this.logger = core.loggerFactory.getLogger("sip.subscribe-dialog"); + this.logger.log(`SUBSCRIBE dialog ${this.id} constructed`); + } + /** + * When a UAC receives a response that establishes a dialog, it + * constructs the state of the dialog. This state MUST be maintained + * for the duration of the dialog. + * https://tools.ietf.org/html/rfc3261#section-12.1.2 + * @param outgoingRequestMessage - Outgoing request message for dialog. + * @param incomingResponseMessage - Incoming response message creating dialog. + */ + static initialDialogStateForSubscription(outgoingSubscribeRequestMessage, incomingNotifyRequestMessage) { + // If the request was sent over TLS, and the Request-URI contained a + // SIPS URI, the "secure" flag is set to TRUE. + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + const secure = false; // FIXME: Currently no support for TLS. + // The route set MUST be set to the list of URIs in the Record-Route + // header field from the response, taken in reverse order and preserving + // all URI parameters. If no Record-Route header field is present in + // the response, the route set MUST be set to the empty set. This route + // set, even if empty, overrides any pre-existing route set for future + // requests in this dialog. The remote target MUST be set to the URI + // from the Contact header field of the response. + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + const routeSet = incomingNotifyRequestMessage.getHeaders("record-route"); + const contact = incomingNotifyRequestMessage.parseHeader("contact"); + if (!contact) { + // TODO: Review to make sure this will never happen + throw new Error("Contact undefined."); + } + if (!(contact instanceof _messages__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader)) { + throw new Error("Contact not instance of NameAddrHeader."); + } + const remoteTarget = contact.uri; + // The local sequence number MUST be set to the value of the sequence + // number in the CSeq header field of the request. The remote sequence + // number MUST be empty (it is established when the remote UA sends a + // request within the dialog). The call identifier component of the + // dialog ID MUST be set to the value of the Call-ID in the request. + // The local tag component of the dialog ID MUST be set to the tag in + // the From field in the request, and the remote tag component of the + // dialog ID MUST be set to the tag in the To field of the response. A + // UAC MUST be prepared to receive a response without a tag in the To + // field, in which case the tag is considered to have a value of null. + // + // This is to maintain backwards compatibility with RFC 2543, which + // did not mandate To tags. + // + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + const localSequenceNumber = outgoingSubscribeRequestMessage.cseq; + const remoteSequenceNumber = undefined; + const callId = outgoingSubscribeRequestMessage.callId; + const localTag = outgoingSubscribeRequestMessage.fromTag; + const remoteTag = incomingNotifyRequestMessage.fromTag; + if (!callId) { + // TODO: Review to make sure this will never happen + throw new Error("Call id undefined."); + } + if (!localTag) { + // TODO: Review to make sure this will never happen + throw new Error("From tag undefined."); + } + if (!remoteTag) { + // TODO: Review to make sure this will never happen + throw new Error("To tag undefined."); // FIXME: No backwards compatibility with RFC 2543 + } + // The remote URI MUST be set to the URI in the To field, and the local + // URI MUST be set to the URI in the From field. + // https://tools.ietf.org/html/rfc3261#section-12.1.2 + if (!outgoingSubscribeRequestMessage.from) { + // TODO: Review to make sure this will never happen + throw new Error("From undefined."); + } + if (!outgoingSubscribeRequestMessage.to) { + // TODO: Review to make sure this will never happen + throw new Error("To undefined."); + } + const localURI = outgoingSubscribeRequestMessage.from.uri; + const remoteURI = outgoingSubscribeRequestMessage.to.uri; + // A dialog can also be in the "early" state, which occurs when it is + // created with a provisional response, and then transition to the + // "confirmed" state when a 2xx final response arrives. + // https://tools.ietf.org/html/rfc3261#section-12 + const early = false; + const dialogState = { + id: callId + localTag + remoteTag, + early, + callId, + localTag, + remoteTag, + localSequenceNumber, + remoteSequenceNumber, + localURI, + remoteURI, + remoteTarget, + routeSet, + secure + }; + return dialogState; + } + dispose() { + super.dispose(); + if (this.N) { + clearTimeout(this.N); + this.N = undefined; + } + this.refreshTimerClear(); + this.logger.log(`SUBSCRIBE dialog ${this.id} destroyed`); + } + get autoRefresh() { + return this._autoRefresh; + } + set autoRefresh(autoRefresh) { + this._autoRefresh = true; + this.refreshTimerSet(); + } + get subscriptionEvent() { + return this._subscriptionEvent; + } + /** Number of seconds until subscription expires. */ + get subscriptionExpires() { + const secondsSinceLastSet = Math.floor(Date.now() / 1000) - this._subscriptionExpiresLastSet; + const secondsUntilExpires = this._subscriptionExpires - secondsSinceLastSet; + return Math.max(secondsUntilExpires, 0); + } + set subscriptionExpires(expires) { + if (expires < 0) { + throw new Error("Expires must be greater than or equal to zero."); + } + this._subscriptionExpires = expires; + this._subscriptionExpiresLastSet = Math.floor(Date.now() / 1000); + if (this.autoRefresh) { + const refresh = this.subscriptionRefresh; + if (refresh === undefined || refresh >= expires) { + this.refreshTimerSet(); + } + } + } + get subscriptionExpiresInitial() { + return this._subscriptionExpiresInitial; + } + /** Number of seconds until subscription auto refresh. */ + get subscriptionRefresh() { + if (this._subscriptionRefresh === undefined || this._subscriptionRefreshLastSet === undefined) { + return undefined; + } + const secondsSinceLastSet = Math.floor(Date.now() / 1000) - this._subscriptionRefreshLastSet; + const secondsUntilExpires = this._subscriptionRefresh - secondsSinceLastSet; + return Math.max(secondsUntilExpires, 0); + } + get subscriptionState() { + return this._subscriptionState; + } + /** + * Receive in dialog request message from transport. + * @param message - The incoming request message. + */ + receiveRequest(message) { + this.logger.log(`SUBSCRIBE dialog ${this.id} received ${message.method} request`); + // Request within a dialog out of sequence guard. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + if (!this.sequenceGuard(message)) { + this.logger.log(`SUBSCRIBE dialog ${this.id} rejected out of order ${message.method} request.`); + return; + } + // Request within a dialog common processing. + // https://tools.ietf.org/html/rfc3261#section-12.2.2 + super.receiveRequest(message); + // Switch on method and then delegate. + switch (message.method) { + case _messages__WEBPACK_IMPORTED_MODULE_2__.C.NOTIFY: + this.onNotify(message); + break; + default: + this.logger.log(`SUBSCRIBE dialog ${this.id} received unimplemented ${message.method} request`); + this.core.replyStateless(message, { statusCode: 501 }); + break; + } + } + /** + * 4.1.2.2. Refreshing of Subscriptions + * https://tools.ietf.org/html/rfc6665#section-4.1.2.2 + */ + refresh() { + const allowHeader = "Allow: " + _user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_3__.AllowedMethods.toString(); + const options = {}; + options.extraHeaders = (options.extraHeaders || []).slice(); + options.extraHeaders.push(allowHeader); + options.extraHeaders.push("Event: " + this.subscriptionEvent); + options.extraHeaders.push("Expires: " + this.subscriptionExpiresInitial); + options.extraHeaders.push("Contact: " + this.core.configuration.contact.toString()); + return this.subscribe(undefined, options); + } + /** + * 4.1.2.2. Refreshing of Subscriptions + * https://tools.ietf.org/html/rfc6665#section-4.1.2.2 + * @param delegate - Delegate to handle responses. + * @param options - Options bucket. + */ + subscribe(delegate, options = {}) { + if (this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending && this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Active) { + // FIXME: This needs to be a proper exception + throw new Error(`Invalid state ${this.subscriptionState}. May only re-subscribe while in state "pending" or "active".`); + } + this.logger.log(`SUBSCRIBE dialog ${this.id} sending SUBSCRIBE request`); + const uac = new _user_agents_re_subscribe_user_agent_client__WEBPACK_IMPORTED_MODULE_5__.ReSubscribeUserAgentClient(this, delegate, options); + // Abort any outstanding timer (as it would otherwise become guaranteed to terminate us). + if (this.N) { + clearTimeout(this.N); + this.N = undefined; + } + // When refreshing a subscription, a subscriber starts Timer N, set to + // 64*T1, when it sends the SUBSCRIBE request. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.2 + this.N = setTimeout(() => this.timerN(), _timers__WEBPACK_IMPORTED_MODULE_6__.Timers.TIMER_N); + return uac; + } + /** + * 4.4.1. Dialog Creation and Termination + * A subscription is destroyed after a notifier sends a NOTIFY request + * with a "Subscription-State" of "terminated", or in certain error + * situations described elsewhere in this document. + * https://tools.ietf.org/html/rfc6665#section-4.4.1 + */ + terminate() { + this.stateTransition(_subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Terminated); + this.onTerminated(); + } + /** + * 4.1.2.3. Unsubscribing + * https://tools.ietf.org/html/rfc6665#section-4.1.2.3 + */ + unsubscribe() { + const allowHeader = "Allow: " + _user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_3__.AllowedMethods.toString(); + const options = {}; + options.extraHeaders = (options.extraHeaders || []).slice(); + options.extraHeaders.push(allowHeader); + options.extraHeaders.push("Event: " + this.subscriptionEvent); + options.extraHeaders.push("Expires: 0"); + options.extraHeaders.push("Contact: " + this.core.configuration.contact.toString()); + return this.subscribe(undefined, options); + } + /** + * Handle in dialog NOTIFY requests. + * This does not include the first NOTIFY which created the dialog. + * @param message - The incoming NOTIFY request message. + */ + onNotify(message) { + // If, for some reason, the event package designated in the "Event" + // header field of the NOTIFY request is not supported, the subscriber + // will respond with a 489 (Bad Event) response. + // https://tools.ietf.org/html/rfc6665#section-4.1.3 + const event = message.parseHeader("Event").event; + if (!event || event !== this.subscriptionEvent) { + this.core.replyStateless(message, { statusCode: 489 }); + return; + } + // In the state diagram, "Re-subscription times out" means that an + // attempt to refresh or update the subscription using a new SUBSCRIBE + // request does not result in a NOTIFY request before the corresponding + // Timer N expires. + // https://tools.ietf.org/html/rfc6665#section-4.1.2 + if (this.N) { + clearTimeout(this.N); + this.N = undefined; + } + // NOTIFY requests MUST contain "Subscription-State" header fields that + // indicate the status of the subscription. + // https://tools.ietf.org/html/rfc6665#section-4.1.3 + const subscriptionState = message.parseHeader("Subscription-State"); + if (!subscriptionState || !subscriptionState.state) { + this.core.replyStateless(message, { statusCode: 489 }); + return; + } + const state = subscriptionState.state; + const expires = subscriptionState.expires ? Math.max(subscriptionState.expires, 0) : undefined; + // Update our state and expiration. + switch (state) { + case "pending": + this.stateTransition(_subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending, expires); + break; + case "active": + this.stateTransition(_subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Active, expires); + break; + case "terminated": + this.stateTransition(_subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Terminated, expires); + break; + default: + this.logger.warn("Unrecognized subscription state."); + break; + } + // Delegate remainder of NOTIFY handling. + const uas = new _user_agents_notify_user_agent_server__WEBPACK_IMPORTED_MODULE_7__.NotifyUserAgentServer(this, message); + if (this.delegate && this.delegate.onNotify) { + this.delegate.onNotify(uas); + } + else { + uas.accept(); + } + } + onRefresh(request) { + if (this.delegate && this.delegate.onRefresh) { + this.delegate.onRefresh(request); + } + } + onTerminated() { + if (this.delegate && this.delegate.onTerminated) { + this.delegate.onTerminated(); + } + } + refreshTimerClear() { + if (this.refreshTimer) { + clearTimeout(this.refreshTimer); + this.refreshTimer = undefined; + } + } + refreshTimerSet() { + this.refreshTimerClear(); + if (this.autoRefresh && this.subscriptionExpires > 0) { + const refresh = this.subscriptionExpires * 900; + this._subscriptionRefresh = Math.floor(refresh / 1000); + this._subscriptionRefreshLastSet = Math.floor(Date.now() / 1000); + this.refreshTimer = setTimeout(() => { + this.refreshTimer = undefined; + this._subscriptionRefresh = undefined; + this._subscriptionRefreshLastSet = undefined; + this.onRefresh(this.refresh()); + }, refresh); + } + } + stateTransition(newState, newExpires) { + // Assert valid state transitions. + const invalidStateTransition = () => { + this.logger.warn(`Invalid subscription state transition from ${this.subscriptionState} to ${newState}`); + }; + switch (newState) { + case _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Initial: + invalidStateTransition(); + return; + case _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.NotifyWait: + invalidStateTransition(); + return; + case _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending: + if (this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.NotifyWait && + this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending) { + invalidStateTransition(); + return; + } + break; + case _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Active: + if (this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.NotifyWait && + this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending && + this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Active) { + invalidStateTransition(); + return; + } + break; + case _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Terminated: + if (this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.NotifyWait && + this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending && + this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Active) { + invalidStateTransition(); + return; + } + break; + default: + invalidStateTransition(); + return; + } + // If the "Subscription-State" value is "pending", the subscription has + // been received by the notifier, but there is insufficient policy + // information to grant or deny the subscription yet. If the header + // field also contains an "expires" parameter, the subscriber SHOULD + // take it as the authoritative subscription duration and adjust + // accordingly. No further action is necessary on the part of the + // subscriber. The "retry-after" and "reason" parameters have no + // semantics for "pending". + // https://tools.ietf.org/html/rfc6665#section-4.1.3 + if (newState === _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Pending) { + if (newExpires) { + this.subscriptionExpires = newExpires; + } + } + // If the "Subscription-State" header field value is "active", it means + // that the subscription has been accepted and (in general) has been + // authorized. If the header field also contains an "expires" + // parameter, the subscriber SHOULD take it as the authoritative + // subscription duration and adjust accordingly. The "retry-after" and + // "reason" parameters have no semantics for "active". + // https://tools.ietf.org/html/rfc6665#section-4.1.3 + if (newState === _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Active) { + if (newExpires) { + this.subscriptionExpires = newExpires; + } + } + // If the "Subscription-State" value is "terminated", the subscriber + // MUST consider the subscription terminated. The "expires" parameter + // has no semantics for "terminated" -- notifiers SHOULD NOT include an + // "expires" parameter on a "Subscription-State" header field with a + // value of "terminated", and subscribers MUST ignore any such + // parameter, if present. + if (newState === _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Terminated) { + this.dispose(); + } + this._subscriptionState = newState; + } + /** + * When refreshing a subscription, a subscriber starts Timer N, set to + * 64*T1, when it sends the SUBSCRIBE request. If this Timer N expires + * prior to the receipt of a NOTIFY request, the subscriber considers + * the subscription terminated. If the subscriber receives a success + * response to the SUBSCRIBE request that indicates that no NOTIFY + * request will be generated -- such as the 204 response defined for use + * with the optional extension described in [RFC5839] -- then it MUST + * cancel Timer N. + * https://tools.ietf.org/html/rfc6665#section-4.1.2.2 + */ + timerN() { + this.logger.warn(`Timer N expired for SUBSCRIBE dialog. Timed out waiting for NOTIFY.`); + if (this.subscriptionState !== _subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Terminated) { + this.stateTransition(_subscription__WEBPACK_IMPORTED_MODULE_4__.SubscriptionState.Terminated); + this.onTerminated(); + } + } +} + + +/***/ }), +/* 94 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ReSubscribeUserAgentClient": () => (/* binding */ ReSubscribeUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(29); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + + +/** + * Re-SUBSCRIBE UAC. + * @public + */ +class ReSubscribeUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(dialog, delegate, options) { + const message = dialog.createOutgoingRequestMessage(_messages__WEBPACK_IMPORTED_MODULE_1__.C.SUBSCRIBE, options); + super(_transactions__WEBPACK_IMPORTED_MODULE_2__.NonInviteClientTransaction, dialog.userAgentCore, message, delegate); + this.dialog = dialog; + } + waitNotifyStop() { + // TODO: Placeholder. Not utilized currently. + return; + } + /** + * Receive a response from the transaction layer. + * @param message - Incoming response message. + */ + receiveResponse(message) { + if (message.statusCode && message.statusCode >= 200 && message.statusCode < 300) { + // The "Expires" header field in a 200-class response to SUBSCRIBE + // request indicates the actual duration for which the subscription will + // remain active (unless refreshed). The received value might be + // smaller than the value indicated in the SUBSCRIBE request but cannot + // be larger; see Section 4.2.1 for details. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.1 + const expires = message.getHeader("Expires"); + if (!expires) { + this.logger.warn("Expires header missing in a 200-class response to SUBSCRIBE"); + } + else { + const subscriptionExpiresReceived = Number(expires); + if (this.dialog.subscriptionExpires > subscriptionExpiresReceived) { + this.dialog.subscriptionExpires = subscriptionExpiresReceived; + } + } + } + if (message.statusCode && message.statusCode >= 400 && message.statusCode < 700) { + // If a SUBSCRIBE request to refresh a subscription receives a 404, 405, + // 410, 416, 480-485, 489, 501, or 604 response, the subscriber MUST + // consider the subscription terminated. (See [RFC5057] for further + // details and notes about the effect of error codes on dialogs and + // usages within dialog, such as subscriptions). If the subscriber + // wishes to re-subscribe to the state, he does so by composing an + // unrelated initial SUBSCRIBE request with a freshly generated Call-ID + // and a new, unique "From" tag (see Section 4.1.2.1). + // https://tools.ietf.org/html/rfc6665#section-4.1.2.2 + const errorCodes = [404, 405, 410, 416, 480, 481, 482, 483, 484, 485, 489, 501, 604]; + if (errorCodes.includes(message.statusCode)) { + this.dialog.terminate(); + } + // If a SUBSCRIBE request to refresh a subscription fails with any error + // code other than those listed above, the original subscription is + // still considered valid for the duration of the most recently known + // "Expires" value as negotiated by the most recent successful SUBSCRIBE + // transaction, or as communicated by a NOTIFY request in its + // "Subscription-State" header field "expires" parameter. + // https://tools.ietf.org/html/rfc6665#section-4.1.2.2 + } + super.receiveResponse(message); + } +} + + +/***/ }), +/* 95 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "InviteUserAgentServer": () => (/* binding */ InviteUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _dialogs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(69); +/* harmony import */ var _dialogs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(70); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(35); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(30); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(71); +/* harmony import */ var _user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(28); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + + + + + +/** + * INVITE UAS. + * @remarks + * 13 Initiating a Session + * https://tools.ietf.org/html/rfc3261#section-13 + * 13.1 Overview + * https://tools.ietf.org/html/rfc3261#section-13.1 + * 13.3 UAS Processing + * https://tools.ietf.org/html/rfc3261#section-13.3 + * @public + */ +class InviteUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.InviteServerTransaction, core, message, delegate); + this.core = core; + } + dispose() { + if (this.earlyDialog) { + this.earlyDialog.dispose(); + } + super.dispose(); + } + /** + * 13.3.1.4 The INVITE is Accepted + * The UAS core generates a 2xx response. This response establishes a + * dialog, and therefore follows the procedures of Section 12.1.1 in + * addition to those of Section 8.2.6. + * https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + * @param options - Accept options bucket. + */ + accept(options = { statusCode: 200 }) { + if (!this.acceptable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_2__.TransactionStateError(`${this.message.method} not acceptable in state ${this.transaction.state}.`); + } + // This response establishes a dialog... + // https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + if (!this.confirmedDialog) { + if (this.earlyDialog) { + this.earlyDialog.confirm(); + this.confirmedDialog = this.earlyDialog; + this.earlyDialog = undefined; + } + else { + const transaction = this.transaction; + if (!(transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_1__.InviteServerTransaction)) { + throw new Error("Transaction not instance of InviteClientTransaction."); + } + const state = _dialogs__WEBPACK_IMPORTED_MODULE_3__.Dialog.initialDialogStateForUserAgentServer(this.message, this.toTag); + this.confirmedDialog = new _dialogs__WEBPACK_IMPORTED_MODULE_4__.SessionDialog(transaction, this.core, state); + } + } + // When a UAS responds to a request with a response that establishes a + // dialog (such as a 2xx to INVITE), the UAS MUST copy all Record-Route + // header field values from the request into the response (including the + // URIs, URI parameters, and any Record-Route header field parameters, + // whether they are known or unknown to the UAS) and MUST maintain the + // order of those values. The UAS MUST add a Contact header field to + // the response. The Contact header field contains an address where the + // UAS would like to be contacted for subsequent requests in the dialog + // (which includes the ACK for a 2xx response in the case of an INVITE). + // Generally, the host portion of this URI is the IP address or FQDN of + // the host. The URI provided in the Contact header field MUST be a SIP + // or SIPS URI. If the request that initiated the dialog contained a + // SIPS URI in the Request-URI or in the top Record-Route header field + // value, if there was any, or the Contact header field if there was no + // Record-Route header field, the Contact header field in the response + // MUST be a SIPS URI. The URI SHOULD have global scope (that is, the + // same URI can be used in messages outside this dialog). The same way, + // the scope of the URI in the Contact header field of the INVITE is not + // limited to this dialog either. It can therefore be used in messages + // to the UAC even outside this dialog. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const recordRouteHeader = this.message.getHeaders("record-route").map((header) => `Record-Route: ${header}`); + const contactHeader = `Contact: ${this.core.configuration.contact.toString()}`; + // A 2xx response to an INVITE SHOULD contain the Allow header field and + // the Supported header field, and MAY contain the Accept header field. + // Including these header fields allows the UAC to determine the + // features and extensions supported by the UAS for the duration of the + // call, without probing. + // https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + // FIXME: TODO: This should not be hard coded. + const allowHeader = "Allow: " + _user_agent_core_allowed_methods__WEBPACK_IMPORTED_MODULE_5__.AllowedMethods.toString(); + // FIXME: TODO: Supported header (see reply()) + // FIXME: TODO: Accept header + // If the INVITE request contained an offer, and the UAS had not yet + // sent an answer, the 2xx MUST contain an answer. If the INVITE did + // not contain an offer, the 2xx MUST contain an offer if the UAS had + // not yet sent an offer. + // https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + if (!options.body) { + if (this.confirmedDialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Stable) { + options.body = this.confirmedDialog.answer; // resend the answer sent in provisional response + } + else if (this.confirmedDialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Initial || + this.confirmedDialog.signalingState === _session__WEBPACK_IMPORTED_MODULE_6__.SignalingState.HaveRemoteOffer) { + throw new Error("Response must have a body."); + } + } + options.statusCode = options.statusCode || 200; + options.extraHeaders = options.extraHeaders || []; + options.extraHeaders = options.extraHeaders.concat(recordRouteHeader); + options.extraHeaders.push(allowHeader); + options.extraHeaders.push(contactHeader); + const response = super.accept(options); + const session = this.confirmedDialog; + const result = Object.assign(Object.assign({}, response), { session }); + // Update dialog signaling state + if (options.body) { + // Once the UAS has sent or received an answer to the initial + // offer, it MUST NOT generate subsequent offers in any responses + // to the initial INVITE. This means that a UAS based on this + // specification alone can never generate subsequent offers until + // completion of the initial transaction. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + if (this.confirmedDialog.signalingState !== _session__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Stable) { + this.confirmedDialog.signalingStateTransition(options.body); + } + } + return result; + } + /** + * 13.3.1.1 Progress + * If the UAS is not able to answer the invitation immediately, it can + * choose to indicate some kind of progress to the UAC (for example, an + * indication that a phone is ringing). This is accomplished with a + * provisional response between 101 and 199. These provisional + * responses establish early dialogs and therefore follow the procedures + * of Section 12.1.1 in addition to those of Section 8.2.6. A UAS MAY + * send as many provisional responses as it likes. Each of these MUST + * indicate the same dialog ID. However, these will not be delivered + * reliably. + * + * If the UAS desires an extended period of time to answer the INVITE, + * it will need to ask for an "extension" in order to prevent proxies + * from canceling the transaction. A proxy has the option of canceling + * a transaction when there is a gap of 3 minutes between responses in a + * transaction. To prevent cancellation, the UAS MUST send a non-100 + * provisional response at every minute, to handle the possibility of + * lost provisional responses. + * https://tools.ietf.org/html/rfc3261#section-13.3.1.1 + * @param options - Progress options bucket. + */ + progress(options = { statusCode: 180 }) { + if (!this.progressable) { + throw new _exceptions__WEBPACK_IMPORTED_MODULE_2__.TransactionStateError(`${this.message.method} not progressable in state ${this.transaction.state}.`); + } + // This response establishes a dialog... + // https://tools.ietf.org/html/rfc3261#section-13.3.1.4 + if (!this.earlyDialog) { + const transaction = this.transaction; + if (!(transaction instanceof _transactions__WEBPACK_IMPORTED_MODULE_1__.InviteServerTransaction)) { + throw new Error("Transaction not instance of InviteClientTransaction."); + } + const state = _dialogs__WEBPACK_IMPORTED_MODULE_3__.Dialog.initialDialogStateForUserAgentServer(this.message, this.toTag, true); + this.earlyDialog = new _dialogs__WEBPACK_IMPORTED_MODULE_4__.SessionDialog(transaction, this.core, state); + } + // When a UAS responds to a request with a response that establishes a + // dialog (such as a 2xx to INVITE), the UAS MUST copy all Record-Route + // header field values from the request into the response (including the + // URIs, URI parameters, and any Record-Route header field parameters, + // whether they are known or unknown to the UAS) and MUST maintain the + // order of those values. The UAS MUST add a Contact header field to + // the response. The Contact header field contains an address where the + // UAS would like to be contacted for subsequent requests in the dialog + // (which includes the ACK for a 2xx response in the case of an INVITE). + // Generally, the host portion of this URI is the IP address or FQDN of + // the host. The URI provided in the Contact header field MUST be a SIP + // or SIPS URI. If the request that initiated the dialog contained a + // SIPS URI in the Request-URI or in the top Record-Route header field + // value, if there was any, or the Contact header field if there was no + // Record-Route header field, the Contact header field in the response + // MUST be a SIPS URI. The URI SHOULD have global scope (that is, the + // same URI can be used in messages outside this dialog). The same way, + // the scope of the URI in the Contact header field of the INVITE is not + // limited to this dialog either. It can therefore be used in messages + // to the UAC even outside this dialog. + // https://tools.ietf.org/html/rfc3261#section-12.1.1 + const recordRouteHeader = this.message.getHeaders("record-route").map((header) => `Record-Route: ${header}`); + const contactHeader = `Contact: ${this.core.configuration.contact}`; + options.extraHeaders = options.extraHeaders || []; + options.extraHeaders = options.extraHeaders.concat(recordRouteHeader); + options.extraHeaders.push(contactHeader); + const response = super.progress(options); + const session = this.earlyDialog; + const result = Object.assign(Object.assign({}, response), { session }); + // Update dialog signaling state + if (options.body) { + // Once the UAS has sent or received an answer to the initial + // offer, it MUST NOT generate subsequent offers in any responses + // to the initial INVITE. This means that a UAS based on this + // specification alone can never generate subsequent offers until + // completion of the initial transaction. + // https://tools.ietf.org/html/rfc3261#section-13.2.1 + if (this.earlyDialog.signalingState !== _session__WEBPACK_IMPORTED_MODULE_6__.SignalingState.Stable) { + this.earlyDialog.signalingStateTransition(options.body); + } + } + return result; + } + /** + * 13.3.1.2 The INVITE is Redirected + * If the UAS decides to redirect the call, a 3xx response is sent. A + * 300 (Multiple Choices), 301 (Moved Permanently) or 302 (Moved + * Temporarily) response SHOULD contain a Contact header field + * containing one or more URIs of new addresses to be tried. The + * response is passed to the INVITE server transaction, which will deal + * with its retransmissions. + * https://tools.ietf.org/html/rfc3261#section-13.3.1.2 + * @param contacts - Contacts to redirect to. + * @param options - Redirect options bucket. + */ + redirect(contacts, options = { statusCode: 302 }) { + return super.redirect(contacts, options); + } + /** + * 13.3.1.3 The INVITE is Rejected + * A common scenario occurs when the callee is currently not willing or + * able to take additional calls at this end system. A 486 (Busy Here) + * SHOULD be returned in such a scenario. + * https://tools.ietf.org/html/rfc3261#section-13.3.1.3 + * @param options - Reject options bucket. + */ + reject(options = { statusCode: 486 }) { + return super.reject(options); + } +} + + +/***/ }), +/* 96 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "RegisterUserAgentServer": () => (/* binding */ RegisterUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * REGISTER UAS. + * @public + */ +class RegisterUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, core, message, delegate); + this.core = core; + } +} + + +/***/ }), +/* 97 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SubscribeUserAgentServer": () => (/* binding */ SubscribeUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * SUBSCRIBE UAS. + * @public + */ +class SubscribeUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, core, message, delegate); + this.core = core; + } +} + + +/***/ }), +/* 98 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Parser": () => (/* binding */ Parser) +/* harmony export */ }); +/* harmony import */ var _grammar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21); +/* harmony import */ var _incoming_request_message__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(18); +/* harmony import */ var _incoming_response_message__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26); +/* eslint-disable no-inner-declarations */ +/* eslint-disable @typescript-eslint/no-namespace */ + + + +/** + * Extract and parse every header of a SIP message. + * @internal + */ +var Parser; +(function (Parser) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + function getHeader(data, headerStart) { + // 'start' position of the header. + let start = headerStart; + // 'end' position of the header. + let end = 0; + // 'partial end' position of the header. + let partialEnd = 0; + // End of message. + if (data.substring(start, start + 2).match(/(^\r\n)/)) { + return -2; + } + while (end === 0) { + // Partial End of Header. + partialEnd = data.indexOf("\r\n", start); + // 'indexOf' returns -1 if the value to be found never occurs. + if (partialEnd === -1) { + return partialEnd; + } + if (!data.substring(partialEnd + 2, partialEnd + 4).match(/(^\r\n)/) && + data.charAt(partialEnd + 2).match(/(^\s+)/)) { + // Not the end of the message. Continue from the next position. + start = partialEnd + 2; + } + else { + end = partialEnd; + } + } + return end; + } + Parser.getHeader = getHeader; + function parseHeader(message, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data, headerStart, headerEnd) { + const hcolonIndex = data.indexOf(":", headerStart); + const headerName = data.substring(headerStart, hcolonIndex).trim(); + const headerValue = data.substring(hcolonIndex + 1, headerEnd).trim(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let parsed; + // If header-field is well-known, parse it. + switch (headerName.toLowerCase()) { + case "via": + case "v": + message.addHeader("via", headerValue); + if (message.getHeaders("via").length === 1) { + parsed = message.parseHeader("Via"); + if (parsed) { + message.via = parsed; + message.viaBranch = parsed.branch; + } + } + else { + parsed = 0; + } + break; + case "from": + case "f": + message.setHeader("from", headerValue); + parsed = message.parseHeader("from"); + if (parsed) { + message.from = parsed; + message.fromTag = parsed.getParam("tag"); + } + break; + case "to": + case "t": + message.setHeader("to", headerValue); + parsed = message.parseHeader("to"); + if (parsed) { + message.to = parsed; + message.toTag = parsed.getParam("tag"); + } + break; + case "record-route": + parsed = _grammar__WEBPACK_IMPORTED_MODULE_0__.Grammar.parse(headerValue, "Record_Route"); + if (parsed === -1) { + parsed = undefined; + break; + } + if (!(parsed instanceof Array)) { + parsed = undefined; + break; + } + parsed.forEach((header) => { + message.addHeader("record-route", headerValue.substring(header.position, header.offset)); + message.headers["Record-Route"][message.getHeaders("record-route").length - 1].parsed = header.parsed; + }); + break; + case "call-id": + case "i": + message.setHeader("call-id", headerValue); + parsed = message.parseHeader("call-id"); + if (parsed) { + message.callId = headerValue; + } + break; + case "contact": + case "m": + parsed = _grammar__WEBPACK_IMPORTED_MODULE_0__.Grammar.parse(headerValue, "Contact"); + if (parsed === -1) { + parsed = undefined; + break; + } + if (!(parsed instanceof Array)) { + parsed = undefined; + break; + } + parsed.forEach((header) => { + message.addHeader("contact", headerValue.substring(header.position, header.offset)); + message.headers.Contact[message.getHeaders("contact").length - 1].parsed = header.parsed; + }); + break; + case "content-length": + case "l": + message.setHeader("content-length", headerValue); + parsed = message.parseHeader("content-length"); + break; + case "content-type": + case "c": + message.setHeader("content-type", headerValue); + parsed = message.parseHeader("content-type"); + break; + case "cseq": + message.setHeader("cseq", headerValue); + parsed = message.parseHeader("cseq"); + if (parsed) { + message.cseq = parsed.value; + } + if (message instanceof _incoming_response_message__WEBPACK_IMPORTED_MODULE_1__.IncomingResponseMessage) { + message.method = parsed.method; + } + break; + case "max-forwards": + message.setHeader("max-forwards", headerValue); + parsed = message.parseHeader("max-forwards"); + break; + case "www-authenticate": + message.setHeader("www-authenticate", headerValue); + parsed = message.parseHeader("www-authenticate"); + break; + case "proxy-authenticate": + message.setHeader("proxy-authenticate", headerValue); + parsed = message.parseHeader("proxy-authenticate"); + break; + case "refer-to": + case "r": + message.setHeader("refer-to", headerValue); + parsed = message.parseHeader("refer-to"); + if (parsed) { + message.referTo = parsed; + } + break; + default: + // Do not parse this header. + message.addHeader(headerName.toLowerCase(), headerValue); + parsed = 0; + } + if (parsed === undefined) { + return { + error: "error parsing header '" + headerName + "'" + }; + } + else { + return true; + } + } + Parser.parseHeader = parseHeader; + function parseMessage(data, logger) { + let headerStart = 0; + let headerEnd = data.indexOf("\r\n"); + if (headerEnd === -1) { + logger.warn("no CRLF found, not a SIP message, discarded"); + return; + } + // Parse first line. Check if it is a Request or a Reply. + const firstLine = data.substring(0, headerEnd); + const parsed = _grammar__WEBPACK_IMPORTED_MODULE_0__.Grammar.parse(firstLine, "Request_Response"); + let message; + if (parsed === -1) { + logger.warn('error parsing first line of SIP message: "' + firstLine + '"'); + return; + } + else if (!parsed.status_code) { + message = new _incoming_request_message__WEBPACK_IMPORTED_MODULE_2__.IncomingRequestMessage(); + message.method = parsed.method; + message.ruri = parsed.uri; + } + else { + message = new _incoming_response_message__WEBPACK_IMPORTED_MODULE_1__.IncomingResponseMessage(); + message.statusCode = parsed.status_code; + message.reasonPhrase = parsed.reason_phrase; + } + message.data = data; + headerStart = headerEnd + 2; + // Loop over every line in data. Detect the end of each header and parse + // it or simply add to the headers collection. + let bodyStart; + // eslint-disable-next-line no-constant-condition + while (true) { + headerEnd = getHeader(data, headerStart); + // The SIP message has normally finished. + if (headerEnd === -2) { + bodyStart = headerStart + 2; + break; + } + else if (headerEnd === -1) { + // data.indexOf returned -1 due to a malformed message. + logger.error("malformed message"); + return; + } + const parsedHeader = parseHeader(message, data, headerStart, headerEnd); + if (parsedHeader && parsedHeader !== true) { + logger.error(parsedHeader.error); + return; + } + headerStart = headerEnd + 2; + } + // RFC3261 18.3. + // If there are additional bytes in the transport packet + // beyond the end of the body, they MUST be discarded. + if (message.hasHeader("content-length")) { + message.body = data.substr(bodyStart, Number(message.getHeader("content-length"))); + } + else { + message.body = data.substring(bodyStart); + } + return message; + } + Parser.parseMessage = parseMessage; +})(Parser || (Parser = {})); + + +/***/ }), +/* 99 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Grammar": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_0__.Grammar), +/* harmony export */ "NameAddrHeader": () => (/* reexport safe */ _name_addr_header__WEBPACK_IMPORTED_MODULE_1__.NameAddrHeader), +/* harmony export */ "Parameters": () => (/* reexport safe */ _parameters__WEBPACK_IMPORTED_MODULE_2__.Parameters), +/* harmony export */ "URI": () => (/* reexport safe */ _uri__WEBPACK_IMPORTED_MODULE_3__.URI), +/* harmony export */ "equivalentURI": () => (/* reexport safe */ _uri__WEBPACK_IMPORTED_MODULE_3__.equivalentURI) +/* harmony export */ }); +/* harmony import */ var _grammar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(21); +/* harmony import */ var _name_addr_header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(25); +/* harmony import */ var _parameters__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(24); +/* harmony import */ var _uri__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(23); + + + + + + +/***/ }), +/* 100 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Dialog": () => (/* reexport safe */ _dialogs__WEBPACK_IMPORTED_MODULE_0__.Dialog), +/* harmony export */ "SessionDialog": () => (/* reexport safe */ _dialogs__WEBPACK_IMPORTED_MODULE_0__.SessionDialog), +/* harmony export */ "SubscriptionDialog": () => (/* reexport safe */ _dialogs__WEBPACK_IMPORTED_MODULE_0__.SubscriptionDialog), +/* harmony export */ "Exception": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_1__.Exception), +/* harmony export */ "TransactionStateError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError), +/* harmony export */ "TransportError": () => (/* reexport safe */ _exceptions__WEBPACK_IMPORTED_MODULE_1__.TransportError), +/* harmony export */ "Levels": () => (/* reexport safe */ _log__WEBPACK_IMPORTED_MODULE_2__.Levels), +/* harmony export */ "Logger": () => (/* reexport safe */ _log__WEBPACK_IMPORTED_MODULE_2__.Logger), +/* harmony export */ "LoggerFactory": () => (/* reexport safe */ _log__WEBPACK_IMPORTED_MODULE_2__.LoggerFactory), +/* harmony export */ "C": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.C), +/* harmony export */ "DigestAuthentication": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.DigestAuthentication), +/* harmony export */ "Grammar": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.Grammar), +/* harmony export */ "IncomingMessage": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.IncomingMessage), +/* harmony export */ "IncomingRequestMessage": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.IncomingRequestMessage), +/* harmony export */ "IncomingResponseMessage": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.IncomingResponseMessage), +/* harmony export */ "NameAddrHeader": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.NameAddrHeader), +/* harmony export */ "OutgoingRequestMessage": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.OutgoingRequestMessage), +/* harmony export */ "Parameters": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.Parameters), +/* harmony export */ "Parser": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.Parser), +/* harmony export */ "URI": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.URI), +/* harmony export */ "constructOutgoingResponse": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.constructOutgoingResponse), +/* harmony export */ "equivalentURI": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.equivalentURI), +/* harmony export */ "fromBodyLegacy": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.fromBodyLegacy), +/* harmony export */ "getBody": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.getBody), +/* harmony export */ "isBody": () => (/* reexport safe */ _messages__WEBPACK_IMPORTED_MODULE_3__.isBody), +/* harmony export */ "SessionState": () => (/* reexport safe */ _session__WEBPACK_IMPORTED_MODULE_4__.SessionState), +/* harmony export */ "SignalingState": () => (/* reexport safe */ _session__WEBPACK_IMPORTED_MODULE_4__.SignalingState), +/* harmony export */ "SubscriptionState": () => (/* reexport safe */ _subscription__WEBPACK_IMPORTED_MODULE_5__.SubscriptionState), +/* harmony export */ "ClientTransaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.ClientTransaction), +/* harmony export */ "InviteClientTransaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.InviteClientTransaction), +/* harmony export */ "InviteServerTransaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.InviteServerTransaction), +/* harmony export */ "NonInviteClientTransaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.NonInviteClientTransaction), +/* harmony export */ "NonInviteServerTransaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.NonInviteServerTransaction), +/* harmony export */ "ServerTransaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.ServerTransaction), +/* harmony export */ "Transaction": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.Transaction), +/* harmony export */ "TransactionState": () => (/* reexport safe */ _transactions__WEBPACK_IMPORTED_MODULE_6__.TransactionState), +/* harmony export */ "UserAgentCore": () => (/* reexport safe */ _user_agent_core__WEBPACK_IMPORTED_MODULE_7__.UserAgentCore), +/* harmony export */ "ByeUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ByeUserAgentClient), +/* harmony export */ "ByeUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ByeUserAgentServer), +/* harmony export */ "CancelUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.CancelUserAgentClient), +/* harmony export */ "InfoUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.InfoUserAgentClient), +/* harmony export */ "InfoUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.InfoUserAgentServer), +/* harmony export */ "InviteUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.InviteUserAgentClient), +/* harmony export */ "InviteUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.InviteUserAgentServer), +/* harmony export */ "MessageUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.MessageUserAgentClient), +/* harmony export */ "MessageUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.MessageUserAgentServer), +/* harmony export */ "NotifyUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.NotifyUserAgentClient), +/* harmony export */ "NotifyUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.NotifyUserAgentServer), +/* harmony export */ "PrackUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.PrackUserAgentClient), +/* harmony export */ "PrackUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.PrackUserAgentServer), +/* harmony export */ "PublishUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.PublishUserAgentClient), +/* harmony export */ "ReInviteUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ReInviteUserAgentClient), +/* harmony export */ "ReInviteUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ReInviteUserAgentServer), +/* harmony export */ "ReSubscribeUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ReSubscribeUserAgentClient), +/* harmony export */ "ReSubscribeUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ReSubscribeUserAgentServer), +/* harmony export */ "ReferUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ReferUserAgentClient), +/* harmony export */ "ReferUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.ReferUserAgentServer), +/* harmony export */ "RegisterUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.RegisterUserAgentClient), +/* harmony export */ "RegisterUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.RegisterUserAgentServer), +/* harmony export */ "SubscribeUserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.SubscribeUserAgentClient), +/* harmony export */ "SubscribeUserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.SubscribeUserAgentServer), +/* harmony export */ "UserAgentClient": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.UserAgentClient), +/* harmony export */ "UserAgentServer": () => (/* reexport safe */ _user_agents__WEBPACK_IMPORTED_MODULE_8__.UserAgentServer), +/* harmony export */ "Timers": () => (/* reexport safe */ _timers__WEBPACK_IMPORTED_MODULE_9__.Timers) +/* harmony export */ }); +/* harmony import */ var _dialogs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(101); +/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(102); +/* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(103); +/* harmony import */ var _messages__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(104); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(106); +/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(107); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(108); +/* harmony import */ var _user_agent_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(109); +/* harmony import */ var _user_agents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(110); +/* harmony import */ var _timers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(36); +/** + * A core library implementing low level SIP protocol elements. + * @packageDocumentation + */ +// Directories + + + + + + + + + +// Files + + + + +/***/ }), +/* 101 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Dialog": () => (/* reexport safe */ _dialog__WEBPACK_IMPORTED_MODULE_0__.Dialog), +/* harmony export */ "SessionDialog": () => (/* reexport safe */ _session_dialog__WEBPACK_IMPORTED_MODULE_1__.SessionDialog), +/* harmony export */ "SubscriptionDialog": () => (/* reexport safe */ _subscription_dialog__WEBPACK_IMPORTED_MODULE_2__.SubscriptionDialog) +/* harmony export */ }); +/* harmony import */ var _dialog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(69); +/* harmony import */ var _session_dialog__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(70); +/* harmony import */ var _subscription_dialog__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(93); + + + + + + +/***/ }), +/* 102 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Exception": () => (/* reexport safe */ _exception__WEBPACK_IMPORTED_MODULE_0__.Exception), +/* harmony export */ "TransactionStateError": () => (/* reexport safe */ _transaction_state_error__WEBPACK_IMPORTED_MODULE_1__.TransactionStateError), +/* harmony export */ "TransportError": () => (/* reexport safe */ _transport_error__WEBPACK_IMPORTED_MODULE_2__.TransportError) +/* harmony export */ }); +/* harmony import */ var _exception__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5); +/* harmony import */ var _transaction_state_error__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(35); +/* harmony import */ var _transport_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(67); + + + + + +/***/ }), +/* 103 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Levels": () => (/* reexport safe */ _levels__WEBPACK_IMPORTED_MODULE_0__.Levels), +/* harmony export */ "LoggerFactory": () => (/* reexport safe */ _logger_factory__WEBPACK_IMPORTED_MODULE_1__.LoggerFactory), +/* harmony export */ "Logger": () => (/* reexport safe */ _logger__WEBPACK_IMPORTED_MODULE_2__.Logger) +/* harmony export */ }); +/* harmony import */ var _levels__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51); +/* harmony import */ var _logger_factory__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(50); +/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(52); + + + + + +/***/ }), +/* 104 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Grammar": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_0__.Grammar), +/* harmony export */ "NameAddrHeader": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_0__.NameAddrHeader), +/* harmony export */ "Parameters": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_0__.Parameters), +/* harmony export */ "URI": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_0__.URI), +/* harmony export */ "equivalentURI": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_0__.equivalentURI), +/* harmony export */ "C": () => (/* reexport safe */ _methods__WEBPACK_IMPORTED_MODULE_1__.C), +/* harmony export */ "fromBodyLegacy": () => (/* reexport safe */ _body__WEBPACK_IMPORTED_MODULE_2__.fromBodyLegacy), +/* harmony export */ "getBody": () => (/* reexport safe */ _body__WEBPACK_IMPORTED_MODULE_2__.getBody), +/* harmony export */ "isBody": () => (/* reexport safe */ _body__WEBPACK_IMPORTED_MODULE_2__.isBody), +/* harmony export */ "DigestAuthentication": () => (/* reexport safe */ _digest_authentication__WEBPACK_IMPORTED_MODULE_3__.DigestAuthentication), +/* harmony export */ "IncomingMessage": () => (/* reexport safe */ _incoming_message__WEBPACK_IMPORTED_MODULE_4__.IncomingMessage), +/* harmony export */ "IncomingRequestMessage": () => (/* reexport safe */ _incoming_request_message__WEBPACK_IMPORTED_MODULE_5__.IncomingRequestMessage), +/* harmony export */ "IncomingResponseMessage": () => (/* reexport safe */ _incoming_response_message__WEBPACK_IMPORTED_MODULE_6__.IncomingResponseMessage), +/* harmony export */ "OutgoingRequestMessage": () => (/* reexport safe */ _outgoing_request_message__WEBPACK_IMPORTED_MODULE_7__.OutgoingRequestMessage), +/* harmony export */ "constructOutgoingResponse": () => (/* reexport safe */ _outgoing_response__WEBPACK_IMPORTED_MODULE_8__.constructOutgoingResponse), +/* harmony export */ "Parser": () => (/* reexport safe */ _parser__WEBPACK_IMPORTED_MODULE_9__.Parser) +/* harmony export */ }); +/* harmony import */ var _grammar__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(99); +/* harmony import */ var _methods__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(105); +/* harmony import */ var _body__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(17); +/* harmony import */ var _digest_authentication__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(58); +/* harmony import */ var _incoming_message__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19); +/* harmony import */ var _incoming_request_message__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(18); +/* harmony import */ var _incoming_response_message__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(26); +/* harmony import */ var _outgoing_request_message__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(27); +/* harmony import */ var _outgoing_response__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(83); +/* harmony import */ var _parser__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(98); +// Grammar + +// Directories + +// Files + + + + + + + + + + + + + +/***/ }), +/* 105 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "C": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_0__.C) +/* harmony export */ }); +/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(29); + + + + + + + + + + + + + + + +/***/ }), +/* 106 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SessionState": () => (/* reexport safe */ _session__WEBPACK_IMPORTED_MODULE_0__.SessionState), +/* harmony export */ "SignalingState": () => (/* reexport safe */ _session__WEBPACK_IMPORTED_MODULE_0__.SignalingState) +/* harmony export */ }); +/* harmony import */ var _session__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(30); + + + + +/***/ }), +/* 107 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SubscriptionState": () => (/* reexport safe */ _subscription__WEBPACK_IMPORTED_MODULE_0__.SubscriptionState) +/* harmony export */ }); +/* harmony import */ var _subscription__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(46); + + + + +/***/ }), +/* 108 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ClientTransaction": () => (/* reexport safe */ _client_transaction__WEBPACK_IMPORTED_MODULE_0__.ClientTransaction), +/* harmony export */ "InviteClientTransaction": () => (/* reexport safe */ _invite_client_transaction__WEBPACK_IMPORTED_MODULE_1__.InviteClientTransaction), +/* harmony export */ "InviteServerTransaction": () => (/* reexport safe */ _invite_server_transaction__WEBPACK_IMPORTED_MODULE_2__.InviteServerTransaction), +/* harmony export */ "NonInviteClientTransaction": () => (/* reexport safe */ _non_invite_client_transaction__WEBPACK_IMPORTED_MODULE_3__.NonInviteClientTransaction), +/* harmony export */ "NonInviteServerTransaction": () => (/* reexport safe */ _non_invite_server_transaction__WEBPACK_IMPORTED_MODULE_4__.NonInviteServerTransaction), +/* harmony export */ "ServerTransaction": () => (/* reexport safe */ _server_transaction__WEBPACK_IMPORTED_MODULE_5__.ServerTransaction), +/* harmony export */ "TransactionState": () => (/* reexport safe */ _transaction_state__WEBPACK_IMPORTED_MODULE_6__.TransactionState), +/* harmony export */ "Transaction": () => (/* reexport safe */ _transaction__WEBPACK_IMPORTED_MODULE_7__.Transaction) +/* harmony export */ }); +/* harmony import */ var _client_transaction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(65); +/* harmony import */ var _invite_client_transaction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(68); +/* harmony import */ var _invite_server_transaction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(71); +/* harmony import */ var _non_invite_client_transaction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(64); +/* harmony import */ var _non_invite_server_transaction__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(82); +/* harmony import */ var _server_transaction__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(72); +/* harmony import */ var _transaction_state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(63); +/* harmony import */ var _transaction__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(66); + + + + + + + + + + + + +/***/ }), +/* 109 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "UserAgentCore": () => (/* reexport safe */ _user_agent_core__WEBPACK_IMPORTED_MODULE_0__.UserAgentCore) +/* harmony export */ }); +/* harmony import */ var _user_agent_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(60); + + + + + +/***/ }), +/* 110 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ByeUserAgentClient": () => (/* reexport safe */ _bye_user_agent_client__WEBPACK_IMPORTED_MODULE_0__.ByeUserAgentClient), +/* harmony export */ "ByeUserAgentServer": () => (/* reexport safe */ _bye_user_agent_server__WEBPACK_IMPORTED_MODULE_1__.ByeUserAgentServer), +/* harmony export */ "CancelUserAgentClient": () => (/* reexport safe */ _cancel_user_agent_client__WEBPACK_IMPORTED_MODULE_2__.CancelUserAgentClient), +/* harmony export */ "InfoUserAgentClient": () => (/* reexport safe */ _info_user_agent_client__WEBPACK_IMPORTED_MODULE_3__.InfoUserAgentClient), +/* harmony export */ "InfoUserAgentServer": () => (/* reexport safe */ _info_user_agent_server__WEBPACK_IMPORTED_MODULE_4__.InfoUserAgentServer), +/* harmony export */ "InviteUserAgentClient": () => (/* reexport safe */ _invite_user_agent_client__WEBPACK_IMPORTED_MODULE_5__.InviteUserAgentClient), +/* harmony export */ "InviteUserAgentServer": () => (/* reexport safe */ _invite_user_agent_server__WEBPACK_IMPORTED_MODULE_6__.InviteUserAgentServer), +/* harmony export */ "MessageUserAgentClient": () => (/* reexport safe */ _message_user_agent_client__WEBPACK_IMPORTED_MODULE_7__.MessageUserAgentClient), +/* harmony export */ "MessageUserAgentServer": () => (/* reexport safe */ _message_user_agent_server__WEBPACK_IMPORTED_MODULE_8__.MessageUserAgentServer), +/* harmony export */ "NotifyUserAgentClient": () => (/* reexport safe */ _notify_user_agent_client__WEBPACK_IMPORTED_MODULE_9__.NotifyUserAgentClient), +/* harmony export */ "NotifyUserAgentServer": () => (/* reexport safe */ _notify_user_agent_server__WEBPACK_IMPORTED_MODULE_10__.NotifyUserAgentServer), +/* harmony export */ "PublishUserAgentClient": () => (/* reexport safe */ _publish_user_agent_client__WEBPACK_IMPORTED_MODULE_11__.PublishUserAgentClient), +/* harmony export */ "PrackUserAgentClient": () => (/* reexport safe */ _prack_user_agent_client__WEBPACK_IMPORTED_MODULE_12__.PrackUserAgentClient), +/* harmony export */ "PrackUserAgentServer": () => (/* reexport safe */ _prack_user_agent_server__WEBPACK_IMPORTED_MODULE_13__.PrackUserAgentServer), +/* harmony export */ "ReInviteUserAgentClient": () => (/* reexport safe */ _re_invite_user_agent_client__WEBPACK_IMPORTED_MODULE_14__.ReInviteUserAgentClient), +/* harmony export */ "ReInviteUserAgentServer": () => (/* reexport safe */ _re_invite_user_agent_server__WEBPACK_IMPORTED_MODULE_15__.ReInviteUserAgentServer), +/* harmony export */ "ReSubscribeUserAgentClient": () => (/* reexport safe */ _re_subscribe_user_agent_client__WEBPACK_IMPORTED_MODULE_16__.ReSubscribeUserAgentClient), +/* harmony export */ "ReSubscribeUserAgentServer": () => (/* reexport safe */ _re_subscribe_user_agent_server__WEBPACK_IMPORTED_MODULE_17__.ReSubscribeUserAgentServer), +/* harmony export */ "ReferUserAgentClient": () => (/* reexport safe */ _refer_user_agent_client__WEBPACK_IMPORTED_MODULE_18__.ReferUserAgentClient), +/* harmony export */ "ReferUserAgentServer": () => (/* reexport safe */ _refer_user_agent_server__WEBPACK_IMPORTED_MODULE_19__.ReferUserAgentServer), +/* harmony export */ "RegisterUserAgentClient": () => (/* reexport safe */ _register_user_agent_client__WEBPACK_IMPORTED_MODULE_20__.RegisterUserAgentClient), +/* harmony export */ "RegisterUserAgentServer": () => (/* reexport safe */ _register_user_agent_server__WEBPACK_IMPORTED_MODULE_21__.RegisterUserAgentServer), +/* harmony export */ "SubscribeUserAgentClient": () => (/* reexport safe */ _subscribe_user_agent_client__WEBPACK_IMPORTED_MODULE_22__.SubscribeUserAgentClient), +/* harmony export */ "SubscribeUserAgentServer": () => (/* reexport safe */ _subscribe_user_agent_server__WEBPACK_IMPORTED_MODULE_23__.SubscribeUserAgentServer), +/* harmony export */ "UserAgentClient": () => (/* reexport safe */ _user_agent_client__WEBPACK_IMPORTED_MODULE_24__.UserAgentClient), +/* harmony export */ "UserAgentServer": () => (/* reexport safe */ _user_agent_server__WEBPACK_IMPORTED_MODULE_25__.UserAgentServer) +/* harmony export */ }); +/* harmony import */ var _bye_user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(73); +/* harmony import */ var _bye_user_agent_server__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80); +/* harmony import */ var _cancel_user_agent_client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(111); +/* harmony import */ var _info_user_agent_client__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(74); +/* harmony import */ var _info_user_agent_server__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(84); +/* harmony import */ var _invite_user_agent_client__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(61); +/* harmony import */ var _invite_user_agent_server__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(95); +/* harmony import */ var _message_user_agent_client__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(76); +/* harmony import */ var _message_user_agent_server__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(86); +/* harmony import */ var _notify_user_agent_client__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(77); +/* harmony import */ var _notify_user_agent_server__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(87); +/* harmony import */ var _publish_user_agent_client__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(90); +/* harmony import */ var _prack_user_agent_client__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(78); +/* harmony import */ var _prack_user_agent_server__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(88); +/* harmony import */ var _re_invite_user_agent_client__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(75); +/* harmony import */ var _re_invite_user_agent_server__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(85); +/* harmony import */ var _re_subscribe_user_agent_client__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(94); +/* harmony import */ var _re_subscribe_user_agent_server__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(112); +/* harmony import */ var _refer_user_agent_client__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(79); +/* harmony import */ var _refer_user_agent_server__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(89); +/* harmony import */ var _register_user_agent_client__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(91); +/* harmony import */ var _register_user_agent_server__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(96); +/* harmony import */ var _subscribe_user_agent_client__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(92); +/* harmony import */ var _subscribe_user_agent_server__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(97); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(62); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(81); + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/***/ }), +/* 111 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "CancelUserAgentClient": () => (/* binding */ CancelUserAgentClient) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(64); +/* harmony import */ var _user_agent_client__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(62); + + +/** + * CANCEL UAC. + * @public + */ +class CancelUserAgentClient extends _user_agent_client__WEBPACK_IMPORTED_MODULE_0__.UserAgentClient { + constructor(core, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteClientTransaction, core, message, delegate); + } +} + + +/***/ }), +/* 112 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "ReSubscribeUserAgentServer": () => (/* binding */ ReSubscribeUserAgentServer) +/* harmony export */ }); +/* harmony import */ var _transactions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82); +/* harmony import */ var _user_agent_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(81); + + +/** + * Re-SUBSCRIBE UAS. + * @public + */ +class ReSubscribeUserAgentServer extends _user_agent_server__WEBPACK_IMPORTED_MODULE_0__.UserAgentServer { + constructor(dialog, message, delegate) { + super(_transactions__WEBPACK_IMPORTED_MODULE_1__.NonInviteServerTransaction, dialog.userAgentCore, message, delegate); + } +} + + +/***/ }), +/* 113 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "addMidLines": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.addMidLines), +/* harmony export */ "cleanJitsiSdpImageattr": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.cleanJitsiSdpImageattr), +/* harmony export */ "holdModifier": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.holdModifier), +/* harmony export */ "stripG722": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripG722), +/* harmony export */ "stripRtpPayload": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripRtpPayload), +/* harmony export */ "stripTcpCandidates": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripTcpCandidates), +/* harmony export */ "stripTelephoneEvent": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripTelephoneEvent), +/* harmony export */ "stripVideo": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripVideo), +/* harmony export */ "SessionDescriptionHandler": () => (/* reexport safe */ _session_description_handler__WEBPACK_IMPORTED_MODULE_1__.SessionDescriptionHandler), +/* harmony export */ "defaultMediaStreamFactory": () => (/* reexport safe */ _session_description_handler__WEBPACK_IMPORTED_MODULE_1__.defaultMediaStreamFactory), +/* harmony export */ "defaultPeerConnectionConfiguration": () => (/* reexport safe */ _session_description_handler__WEBPACK_IMPORTED_MODULE_1__.defaultPeerConnectionConfiguration), +/* harmony export */ "defaultSessionDescriptionHandlerFactory": () => (/* reexport safe */ _session_description_handler__WEBPACK_IMPORTED_MODULE_1__.defaultSessionDescriptionHandlerFactory), +/* harmony export */ "SimpleUser": () => (/* reexport safe */ _simple_user__WEBPACK_IMPORTED_MODULE_2__.SimpleUser), +/* harmony export */ "Transport": () => (/* reexport safe */ _transport__WEBPACK_IMPORTED_MODULE_3__.Transport) +/* harmony export */ }); +/* harmony import */ var _modifiers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(114); +/* harmony import */ var _session_description_handler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(116); +/* harmony import */ var _simple_user__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(117); +/* harmony import */ var _transport__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(119); + + + + + + +/***/ }), +/* 114 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "addMidLines": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.addMidLines), +/* harmony export */ "cleanJitsiSdpImageattr": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.cleanJitsiSdpImageattr), +/* harmony export */ "holdModifier": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.holdModifier), +/* harmony export */ "stripG722": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripG722), +/* harmony export */ "stripRtpPayload": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripRtpPayload), +/* harmony export */ "stripTcpCandidates": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripTcpCandidates), +/* harmony export */ "stripTelephoneEvent": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripTelephoneEvent), +/* harmony export */ "stripVideo": () => (/* reexport safe */ _modifiers__WEBPACK_IMPORTED_MODULE_0__.stripVideo) +/* harmony export */ }); +/* harmony import */ var _modifiers__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(115); +/** + * SessionDescriptionHandlerModifer functions for web browsers. + * @packageDocumentation + */ + + + +/***/ }), +/* 115 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "stripTcpCandidates": () => (/* binding */ stripTcpCandidates), +/* harmony export */ "stripTelephoneEvent": () => (/* binding */ stripTelephoneEvent), +/* harmony export */ "cleanJitsiSdpImageattr": () => (/* binding */ cleanJitsiSdpImageattr), +/* harmony export */ "stripG722": () => (/* binding */ stripG722), +/* harmony export */ "stripRtpPayload": () => (/* binding */ stripRtpPayload), +/* harmony export */ "stripVideo": () => (/* binding */ stripVideo), +/* harmony export */ "addMidLines": () => (/* binding */ addMidLines), +/* harmony export */ "holdModifier": () => (/* binding */ holdModifier) +/* harmony export */ }); +const stripPayload = (sdp, payload) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const mediaDescs = []; + const lines = sdp.split(/\r\n/); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let currentMediaDesc; + for (let i = 0; i < lines.length;) { + const line = lines[i]; + if (/^m=(?:audio|video)/.test(line)) { + currentMediaDesc = { + index: i, + stripped: [] + }; + mediaDescs.push(currentMediaDesc); + } + else if (currentMediaDesc) { + const rtpmap = /^a=rtpmap:(\d+) ([^/]+)\//.exec(line); + if (rtpmap && payload === rtpmap[2]) { + lines.splice(i, 1); + currentMediaDesc.stripped.push(rtpmap[1]); + continue; // Don't increment 'i' + } + } + i++; + } + for (const mediaDesc of mediaDescs) { + const mline = lines[mediaDesc.index].split(" "); + // Ignore the first 3 parameters of the mline. The codec information is after that + for (let j = 3; j < mline.length;) { + if (mediaDesc.stripped.indexOf(mline[j]) !== -1) { + mline.splice(j, 1); + continue; + } + j++; + } + lines[mediaDesc.index] = mline.join(" "); + } + return lines.join("\r\n"); +}; +const stripMediaDescription = (sdp, description) => { + const descriptionRegExp = new RegExp("m=" + description + ".*$", "gm"); + const groupRegExp = new RegExp("^a=group:.*$", "gm"); + if (descriptionRegExp.test(sdp)) { + let midLineToRemove; + sdp = sdp.split(/^m=/gm).filter((section) => { + if (section.substr(0, description.length) === description) { + midLineToRemove = section.match(/^a=mid:.*$/gm); + if (midLineToRemove) { + const step = midLineToRemove[0].match(/:.+$/g); + if (step) { + midLineToRemove = step[0].substr(1); + } + } + return false; + } + return true; + }).join("m="); + const groupLine = sdp.match(groupRegExp); + if (groupLine && groupLine.length === 1) { + let groupLinePortion = groupLine[0]; + // eslint-disable-next-line no-useless-escape + const groupRegExpReplace = new RegExp("\ *" + midLineToRemove + "[^\ ]*", "g"); + groupLinePortion = groupLinePortion.replace(groupRegExpReplace, ""); + sdp = sdp.split(groupRegExp).join(groupLinePortion); + } + } + return sdp; +}; +/** + * Modifier. + * @public + */ +function stripTcpCandidates(description) { + description.sdp = (description.sdp || "").replace(/^a=candidate:\d+ \d+ tcp .*?\r\n/img, ""); + return Promise.resolve(description); +} +/** + * Modifier. + * @public + */ +function stripTelephoneEvent(description) { + description.sdp = stripPayload(description.sdp || "", "telephone-event"); + return Promise.resolve(description); +} +/** + * Modifier. + * @public + */ +function cleanJitsiSdpImageattr(description) { + description.sdp = (description.sdp || "").replace(/^(a=imageattr:.*?)(x|y)=\[0-/gm, "$1$2=[1:"); + return Promise.resolve(description); +} +/** + * Modifier. + * @public + */ +function stripG722(description) { + description.sdp = stripPayload(description.sdp || "", "G722"); + return Promise.resolve(description); +} +/** + * Modifier. + * @public + */ +function stripRtpPayload(payload) { + return (description) => { + description.sdp = stripPayload(description.sdp || "", payload); + return Promise.resolve(description); + }; +} +/** + * Modifier. + * @public + */ +function stripVideo(description) { + description.sdp = stripMediaDescription(description.sdp || "", "video"); + return Promise.resolve(description); +} +/** + * Modifier. + * @public + */ +function addMidLines(description) { + let sdp = description.sdp || ""; + if (sdp.search(/^a=mid.*$/gm) === -1) { + const mlines = sdp.match(/^m=.*$/gm); + const sdpArray = sdp.split(/^m=.*$/gm); + if (mlines) { + mlines.forEach((elem, idx) => { + mlines[idx] = elem + "\na=mid:" + idx; + }); + } + sdpArray.forEach((elem, idx) => { + if (mlines && mlines[idx]) { + sdpArray[idx] = elem + mlines[idx]; + } + }); + sdp = sdpArray.join(""); + description.sdp = sdp; + } + return Promise.resolve(description); +} +/** + * The modifier that should be used when the session would like to place the call on hold. + * @param description - The description that will be modified. + */ +function holdModifier(description) { + if (!description.sdp || !description.type) { + throw new Error("Invalid SDP"); + } + let sdp = description.sdp; + const type = description.type; + if (sdp) { + if (!/a=(sendrecv|sendonly|recvonly|inactive)/.test(sdp)) { + sdp = sdp.replace(/(m=[^\r]*\r\n)/g, "$1a=sendonly\r\n"); + } + else { + sdp = sdp.replace(/a=sendrecv\r\n/g, "a=sendonly\r\n"); + sdp = sdp.replace(/a=recvonly\r\n/g, "a=inactive\r\n"); + } + } + return Promise.resolve({ sdp, type }); +} + + +/***/ }), +/* 116 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "defaultMediaStreamFactory": () => (/* reexport safe */ _media_stream_factory_default__WEBPACK_IMPORTED_MODULE_0__.defaultMediaStreamFactory), +/* harmony export */ "defaultPeerConnectionConfiguration": () => (/* reexport safe */ _peer_connection_configuration_default__WEBPACK_IMPORTED_MODULE_1__.defaultPeerConnectionConfiguration), +/* harmony export */ "defaultSessionDescriptionHandlerFactory": () => (/* reexport safe */ _session_description_handler_factory_default__WEBPACK_IMPORTED_MODULE_2__.defaultSessionDescriptionHandlerFactory), +/* harmony export */ "SessionDescriptionHandler": () => (/* reexport safe */ _session_description_handler__WEBPACK_IMPORTED_MODULE_3__.SessionDescriptionHandler) +/* harmony export */ }); +/* harmony import */ var _media_stream_factory_default__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(54); +/* harmony import */ var _peer_connection_configuration_default__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(55); +/* harmony import */ var _session_description_handler_factory_default__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(53); +/* harmony import */ var _session_description_handler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(56); +/** + * A SessionDescriptionHandler for web browsers. + * @packageDocumentation + */ + + + + + + + + + + + + +/***/ }), +/* 117 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SimpleUser": () => (/* reexport safe */ _simple_user__WEBPACK_IMPORTED_MODULE_0__.SimpleUser) +/* harmony export */ }); +/* harmony import */ var _simple_user__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(118); +/** + * A simple SIP user implementation for web browsers. + * @packageDocumentation + */ + + + + + +/***/ }), +/* 118 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "SimpleUser": () => (/* binding */ SimpleUser) +/* harmony export */ }); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(49); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(48); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(42); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(41); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(37); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(14); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(38); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(16); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(6); +/* harmony import */ var _session_description_handler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56); +/* harmony import */ var _transport__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57); + + + +/** + * A simple SIP user class. + * @remarks + * While this class is completely functional for simple use cases, it is not intended + * to provide an interface which is suitable for most (must less all) applications. + * While this class has many limitations (for example, it only handles a single concurrent session), + * it is, however, intended to serve as a simple example of using the SIP.js API. + * @public + */ +class SimpleUser { + /** + * Constructs a new instance of the `SimpleUser` class. + * @param server - SIP WebSocket Server URL. + * @param options - Options bucket. See {@link SimpleUserOptions} for details. + */ + constructor(server, options = {}) { + this.attemptingReconnection = false; + this.connectRequested = false; + this.held = false; + this.muted = false; + this.registerer = undefined; + this.registerRequested = false; + this.session = undefined; + // Delegate + this.delegate = options.delegate; + // Copy options + this.options = Object.assign({}, options); + // UserAgentOptions + const userAgentOptions = Object.assign({}, options.userAgentOptions); + // Transport + if (!userAgentOptions.transportConstructor) { + userAgentOptions.transportConstructor = _transport__WEBPACK_IMPORTED_MODULE_0__.Transport; + } + // TransportOptions + if (!userAgentOptions.transportOptions) { + userAgentOptions.transportOptions = { + server + }; + } + // URI + if (!userAgentOptions.uri) { + // If an AOR was provided, convert it to a URI + if (options.aor) { + const uri = _api__WEBPACK_IMPORTED_MODULE_1__.UserAgent.makeURI(options.aor); + if (!uri) { + throw new Error(`Failed to create valid URI from ${options.aor}`); + } + userAgentOptions.uri = uri; + } + } + // UserAgent + this.userAgent = new _api__WEBPACK_IMPORTED_MODULE_1__.UserAgent(userAgentOptions); + // UserAgent's delegate + this.userAgent.delegate = { + // Handle connection with server established + onConnect: () => { + this.logger.log(`[${this.id}] Connected`); + if (this.delegate && this.delegate.onServerConnect) { + this.delegate.onServerConnect(); + } + if (this.registerer && this.registerRequested) { + this.logger.log(`[${this.id}] Registering...`); + this.registerer.register().catch((e) => { + this.logger.error(`[${this.id}] Error occurred registering after connection with server was obtained.`); + this.logger.error(e.toString()); + }); + } + }, + // Handle connection with server lost + onDisconnect: (error) => { + this.logger.log(`[${this.id}] Disconnected`); + if (this.delegate && this.delegate.onServerDisconnect) { + this.delegate.onServerDisconnect(error); + } + if (this.session) { + this.logger.log(`[${this.id}] Hanging up...`); + this.hangup() // cleanup hung calls + .catch((e) => { + this.logger.error(`[${this.id}] Error occurred hanging up call after connection with server was lost.`); + this.logger.error(e.toString()); + }); + } + if (this.registerer) { + this.logger.log(`[${this.id}] Unregistering...`); + this.registerer + .unregister() // cleanup invalid registrations + .catch((e) => { + this.logger.error(`[${this.id}] Error occurred unregistering after connection with server was lost.`); + this.logger.error(e.toString()); + }); + } + // Only attempt to reconnect if network/server dropped the connection. + if (error) { + this.attemptReconnection(); + } + }, + // Handle incoming invitations + onInvite: (invitation) => { + this.logger.log(`[${this.id}] Received INVITE`); + // Guard against a pre-existing session. This implementation only supports one session at a time. + // However an incoming INVITE request may be received at any time and/or while in the process + // of sending an outgoing INVITE request. So we reject any incoming INVITE in those cases. + if (this.session) { + this.logger.warn(`[${this.id}] Session already in progress, rejecting INVITE...`); + invitation + .reject() + .then(() => { + this.logger.log(`[${this.id}] Rejected INVITE`); + }) + .catch((error) => { + this.logger.error(`[${this.id}] Failed to reject INVITE`); + this.logger.error(error.toString()); + }); + return; + } + // Use our configured constraints as options for any Inviter created as result of a REFER + const referralInviterOptions = { + sessionDescriptionHandlerOptions: { constraints: this.constraints } + }; + // Initialize our session + this.initSession(invitation, referralInviterOptions); + // Delegate + if (this.delegate && this.delegate.onCallReceived) { + this.delegate.onCallReceived(); + } + else { + this.logger.warn(`[${this.id}] No handler available, rejecting INVITE...`); + invitation + .reject() + .then(() => { + this.logger.log(`[${this.id}] Rejected INVITE`); + }) + .catch((error) => { + this.logger.error(`[${this.id}] Failed to reject INVITE`); + this.logger.error(error.toString()); + }); + } + }, + // Handle incoming messages + onMessage: (message) => { + message.accept().then(() => { + if (this.delegate && this.delegate.onMessageReceived) { + this.delegate.onMessageReceived(message.request.body); + } + }); + } + }; + // Use the SIP.js logger + this.logger = this.userAgent.getLogger("sip.SimpleUser"); + // Monitor network connectivity and attempt reconnection when we come online + window.addEventListener("online", () => { + this.logger.log(`[${this.id}] Online`); + this.attemptReconnection(); + }); + } + /** + * Instance identifier. + * @internal + */ + get id() { + return (this.options.userAgentOptions && this.options.userAgentOptions.displayName) || "Anonymous"; + } + /** The local media stream. Undefined if call not answered. */ + get localMediaStream() { + var _a; + const sdh = (_a = this.session) === null || _a === void 0 ? void 0 : _a.sessionDescriptionHandler; + if (!sdh) { + return undefined; + } + if (!(sdh instanceof _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandler)) { + throw new Error("Session description handler not instance of web SessionDescriptionHandler"); + } + return sdh.localMediaStream; + } + /** The remote media stream. Undefined if call not answered. */ + get remoteMediaStream() { + var _a; + const sdh = (_a = this.session) === null || _a === void 0 ? void 0 : _a.sessionDescriptionHandler; + if (!sdh) { + return undefined; + } + if (!(sdh instanceof _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandler)) { + throw new Error("Session description handler not instance of web SessionDescriptionHandler"); + } + return sdh.remoteMediaStream; + } + /** + * The local audio track, if available. + * @deprecated Use localMediaStream and get track from the stream. + */ + get localAudioTrack() { + var _a; + return (_a = this.localMediaStream) === null || _a === void 0 ? void 0 : _a.getTracks().find((track) => track.kind === "audio"); + } + /** + * The local video track, if available. + * @deprecated Use localMediaStream and get track from the stream. + */ + get localVideoTrack() { + var _a; + return (_a = this.localMediaStream) === null || _a === void 0 ? void 0 : _a.getTracks().find((track) => track.kind === "video"); + } + /** + * The remote audio track, if available. + * @deprecated Use remoteMediaStream and get track from the stream. + */ + get remoteAudioTrack() { + var _a; + return (_a = this.remoteMediaStream) === null || _a === void 0 ? void 0 : _a.getTracks().find((track) => track.kind === "audio"); + } + /** + * The remote video track, if available. + * @deprecated Use remoteMediaStream and get track from the stream. + */ + get remoteVideoTrack() { + var _a; + return (_a = this.remoteMediaStream) === null || _a === void 0 ? void 0 : _a.getTracks().find((track) => track.kind === "video"); + } + /** + * Connect. + * @remarks + * Start the UserAgent's WebSocket Transport. + */ + connect() { + this.logger.log(`[${this.id}] Connecting UserAgent...`); + this.connectRequested = true; + if (this.userAgent.state !== _api__WEBPACK_IMPORTED_MODULE_3__.UserAgentState.Started) { + return this.userAgent.start(); + } + return this.userAgent.reconnect(); + } + /** + * Disconnect. + * @remarks + * Stop the UserAgent's WebSocket Transport. + */ + disconnect() { + this.logger.log(`[${this.id}] Disconnecting UserAgent...`); + this.connectRequested = false; + return this.userAgent.stop(); + } + /** + * Return true if connected. + */ + isConnected() { + return this.userAgent.isConnected(); + } + /** + * Start receiving incoming calls. + * @remarks + * Send a REGISTER request for the UserAgent's AOR. + * Resolves when the REGISTER request is sent, otherwise rejects. + */ + register(registererOptions, registererRegisterOptions) { + this.logger.log(`[${this.id}] Registering UserAgent...`); + this.registerRequested = true; + if (!this.registerer) { + this.registerer = new _api__WEBPACK_IMPORTED_MODULE_4__.Registerer(this.userAgent, registererOptions); + this.registerer.stateChange.addListener((state) => { + switch (state) { + case _api__WEBPACK_IMPORTED_MODULE_5__.RegistererState.Initial: + break; + case _api__WEBPACK_IMPORTED_MODULE_5__.RegistererState.Registered: + if (this.delegate && this.delegate.onRegistered) { + this.delegate.onRegistered(); + } + break; + case _api__WEBPACK_IMPORTED_MODULE_5__.RegistererState.Unregistered: + if (this.delegate && this.delegate.onUnregistered) { + this.delegate.onUnregistered(); + } + break; + case _api__WEBPACK_IMPORTED_MODULE_5__.RegistererState.Terminated: + this.registerer = undefined; + break; + default: + throw new Error("Unknown registerer state."); + } + }); + } + return this.registerer.register(registererRegisterOptions).then(() => { + return; + }); + } + /** + * Stop receiving incoming calls. + * @remarks + * Send an un-REGISTER request for the UserAgent's AOR. + * Resolves when the un-REGISTER request is sent, otherwise rejects. + */ + unregister(registererUnregisterOptions) { + this.logger.log(`[${this.id}] Unregistering UserAgent...`); + this.registerRequested = false; + if (!this.registerer) { + return Promise.resolve(); + } + return this.registerer.unregister(registererUnregisterOptions).then(() => { + return; + }); + } + /** + * Make an outgoing call. + * @remarks + * Send an INVITE request to create a new Session. + * Resolves when the INVITE request is sent, otherwise rejects. + * Use `onCallAnswered` delegate method to determine if Session is established. + * @param destination - The target destination to call. A SIP address to send the INVITE to. + * @param inviterOptions - Optional options for Inviter constructor. + * @param inviterInviteOptions - Optional options for Inviter.invite(). + */ + call(destination, inviterOptions, inviterInviteOptions) { + this.logger.log(`[${this.id}] Beginning Session...`); + if (this.session) { + return Promise.reject(new Error("Session already exists.")); + } + const target = _api__WEBPACK_IMPORTED_MODULE_1__.UserAgent.makeURI(destination); + if (!target) { + return Promise.reject(new Error(`Failed to create a valid URI from "${destination}"`)); + } + // Use our configured constraints as InviterOptions if none provided + if (!inviterOptions) { + inviterOptions = {}; + } + if (!inviterOptions.sessionDescriptionHandlerOptions) { + inviterOptions.sessionDescriptionHandlerOptions = {}; + } + if (!inviterOptions.sessionDescriptionHandlerOptions.constraints) { + inviterOptions.sessionDescriptionHandlerOptions.constraints = this.constraints; + } + // Create a new Inviter for the outgoing Session + const inviter = new _api__WEBPACK_IMPORTED_MODULE_6__.Inviter(this.userAgent, target, inviterOptions); + // Send INVITE + return this.sendInvite(inviter, inviterOptions, inviterInviteOptions).then(() => { + return; + }); + } + /** + * Hangup a call. + * @remarks + * Send a BYE request, CANCEL request or reject response to end the current Session. + * Resolves when the request/response is sent, otherwise rejects. + * Use `onCallTerminated` delegate method to determine if and when call is ended. + */ + hangup() { + this.logger.log(`[${this.id}] Hangup...`); + return this.terminate(); + } + /** + * Answer an incoming call. + * @remarks + * Accept an incoming INVITE request creating a new Session. + * Resolves with the response is sent, otherwise rejects. + * Use `onCallAnswered` delegate method to determine if and when call is established. + * @param invitationAcceptOptions - Optional options for Inviter.accept(). + */ + answer(invitationAcceptOptions) { + this.logger.log(`[${this.id}] Accepting Invitation...`); + if (!this.session) { + return Promise.reject(new Error("Session does not exist.")); + } + if (!(this.session instanceof _api__WEBPACK_IMPORTED_MODULE_7__.Invitation)) { + return Promise.reject(new Error("Session not instance of Invitation.")); + } + // Use our configured constraints as InvitationAcceptOptions if none provided + if (!invitationAcceptOptions) { + invitationAcceptOptions = {}; + } + if (!invitationAcceptOptions.sessionDescriptionHandlerOptions) { + invitationAcceptOptions.sessionDescriptionHandlerOptions = {}; + } + if (!invitationAcceptOptions.sessionDescriptionHandlerOptions.constraints) { + invitationAcceptOptions.sessionDescriptionHandlerOptions.constraints = this.constraints; + } + return this.session.accept(invitationAcceptOptions); + } + /** + * Decline an incoming call. + * @remarks + * Reject an incoming INVITE request. + * Resolves with the response is sent, otherwise rejects. + * Use `onCallTerminated` delegate method to determine if and when call is ended. + */ + decline() { + this.logger.log(`[${this.id}] rejecting Invitation...`); + if (!this.session) { + return Promise.reject(new Error("Session does not exist.")); + } + if (!(this.session instanceof _api__WEBPACK_IMPORTED_MODULE_7__.Invitation)) { + return Promise.reject(new Error("Session not instance of Invitation.")); + } + return this.session.reject(); + } + /** + * Hold call + * @remarks + * Send a re-INVITE with new offer indicating "hold". + * Resolves when the re-INVITE request is sent, otherwise rejects. + * Use `onCallHold` delegate method to determine if request is accepted or rejected. + * See: https://tools.ietf.org/html/rfc6337 + */ + hold() { + this.logger.log(`[${this.id}] holding session...`); + return this.setHold(true); + } + /** + * Unhold call. + * @remarks + * Send a re-INVITE with new offer indicating "unhold". + * Resolves when the re-INVITE request is sent, otherwise rejects. + * Use `onCallHold` delegate method to determine if request is accepted or rejected. + * See: https://tools.ietf.org/html/rfc6337 + */ + unhold() { + this.logger.log(`[${this.id}] unholding session...`); + return this.setHold(false); + } + /** + * Hold state. + * @remarks + * True if session media is on hold. + */ + isHeld() { + return this.held; + } + /** + * Mute call. + * @remarks + * Disable sender's media tracks. + */ + mute() { + this.logger.log(`[${this.id}] disabling media tracks...`); + this.setMute(true); + } + /** + * Unmute call. + * @remarks + * Enable sender's media tracks. + */ + unmute() { + this.logger.log(`[${this.id}] enabling media tracks...`); + this.setMute(false); + } + /** + * Mute state. + * @remarks + * True if sender's media track is disabled. + */ + isMuted() { + return this.muted; + } + /** + * Send DTMF. + * @remarks + * Send an INFO request with content type application/dtmf-relay. + * @param tone - Tone to send. + */ + sendDTMF(tone) { + this.logger.log(`[${this.id}] sending DTMF...`); + // As RFC 6086 states, sending DTMF via INFO is not standardized... + // + // Companies have been using INFO messages in order to transport + // Dual-Tone Multi-Frequency (DTMF) tones. All mechanisms are + // proprietary and have not been standardized. + // https://tools.ietf.org/html/rfc6086#section-2 + // + // It is however widely supported based on this draft: + // https://tools.ietf.org/html/draft-kaplan-dispatch-info-dtmf-package-00 + // Validate tone + if (!/^[0-9A-D#*,]$/.exec(tone)) { + return Promise.reject(new Error("Invalid DTMF tone.")); + } + if (!this.session) { + return Promise.reject(new Error("Session does not exist.")); + } + // The UA MUST populate the "application/dtmf-relay" body, as defined + // earlier, with the button pressed and the duration it was pressed + // for. Technically, this actually requires the INFO to be generated + // when the user *releases* the button, however if the user has still + // not released a button after 5 seconds, which is the maximum duration + // supported by this mechanism, the UA should generate the INFO at that + // time. + // https://tools.ietf.org/html/draft-kaplan-dispatch-info-dtmf-package-00#section-5.3 + this.logger.log(`[${this.id}] Sending DTMF tone: ${tone}`); + const dtmf = tone; + const duration = 2000; + const body = { + contentDisposition: "render", + contentType: "application/dtmf-relay", + content: "Signal=" + dtmf + "\r\nDuration=" + duration + }; + const requestOptions = { body }; + return this.session.info({ requestOptions }).then(() => { + return; + }); + } + /** + * Send a message. + * @remarks + * Send a MESSAGE request. + * @param destination - The target destination for the message. A SIP address to send the MESSAGE to. + */ + message(destination, message) { + this.logger.log(`[${this.id}] sending message...`); + const target = _api__WEBPACK_IMPORTED_MODULE_1__.UserAgent.makeURI(destination); + if (!target) { + return Promise.reject(new Error(`Failed to create a valid URI from "${destination}"`)); + } + return new _api__WEBPACK_IMPORTED_MODULE_8__.Messager(this.userAgent, target, message).message(); + } + /** Media constraints. */ + get constraints() { + var _a; + let constraints = { audio: true, video: false }; // default to audio only calls + if ((_a = this.options.media) === null || _a === void 0 ? void 0 : _a.constraints) { + constraints = Object.assign({}, this.options.media.constraints); + } + return constraints; + } + /** + * Attempt reconnection up to `maxReconnectionAttempts` times. + * @param reconnectionAttempt - Current attempt number. + */ + attemptReconnection(reconnectionAttempt = 1) { + const reconnectionAttempts = this.options.reconnectionAttempts || 3; + const reconnectionDelay = this.options.reconnectionDelay || 4; + if (!this.connectRequested) { + this.logger.log(`[${this.id}] Reconnection not currently desired`); + return; // If intentionally disconnected, don't reconnect. + } + if (this.attemptingReconnection) { + this.logger.log(`[${this.id}] Reconnection attempt already in progress`); + } + if (reconnectionAttempt > reconnectionAttempts) { + this.logger.log(`[${this.id}] Reconnection maximum attempts reached`); + return; + } + if (reconnectionAttempt === 1) { + this.logger.log(`[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - trying`); + } + else { + this.logger.log(`[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - trying in ${reconnectionDelay} seconds`); + } + this.attemptingReconnection = true; + setTimeout(() => { + if (!this.connectRequested) { + this.logger.log(`[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - aborted`); + this.attemptingReconnection = false; + return; // If intentionally disconnected, don't reconnect. + } + this.userAgent + .reconnect() + .then(() => { + this.logger.log(`[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - succeeded`); + this.attemptingReconnection = false; + }) + .catch((error) => { + this.logger.log(`[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - failed`); + this.logger.error(error.message); + this.attemptingReconnection = false; + this.attemptReconnection(++reconnectionAttempt); + }); + }, reconnectionAttempt === 1 ? 0 : reconnectionDelay * 1000); + } + /** Helper function to remove media from html elements. */ + cleanupMedia() { + if (this.options.media) { + if (this.options.media.local) { + if (this.options.media.local.video) { + this.options.media.local.video.srcObject = null; + this.options.media.local.video.pause(); + } + } + if (this.options.media.remote) { + if (this.options.media.remote.audio) { + this.options.media.remote.audio.srcObject = null; + this.options.media.remote.audio.pause(); + } + if (this.options.media.remote.video) { + this.options.media.remote.video.srcObject = null; + this.options.media.remote.video.pause(); + } + } + } + } + /** Helper function to enable/disable media tracks. */ + enableReceiverTracks(enable) { + if (!this.session) { + throw new Error("Session does not exist."); + } + const sessionDescriptionHandler = this.session.sessionDescriptionHandler; + if (!(sessionDescriptionHandler instanceof _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandler)) { + throw new Error("Session's session description handler not instance of SessionDescriptionHandler."); + } + const peerConnection = sessionDescriptionHandler.peerConnection; + if (!peerConnection) { + throw new Error("Peer connection closed."); + } + peerConnection.getReceivers().forEach((receiver) => { + if (receiver.track) { + receiver.track.enabled = enable; + } + }); + } + /** Helper function to enable/disable media tracks. */ + enableSenderTracks(enable) { + if (!this.session) { + throw new Error("Session does not exist."); + } + const sessionDescriptionHandler = this.session.sessionDescriptionHandler; + if (!(sessionDescriptionHandler instanceof _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandler)) { + throw new Error("Session's session description handler not instance of SessionDescriptionHandler."); + } + const peerConnection = sessionDescriptionHandler.peerConnection; + if (!peerConnection) { + throw new Error("Peer connection closed."); + } + peerConnection.getSenders().forEach((sender) => { + if (sender.track) { + sender.track.enabled = enable; + } + }); + } + /** + * Setup session delegate and state change handler. + * @param session - Session to setup + * @param referralInviterOptions - Options for any Inviter created as result of a REFER. + */ + initSession(session, referralInviterOptions) { + // Set session + this.session = session; + // Call session created callback + if (this.delegate && this.delegate.onCallCreated) { + this.delegate.onCallCreated(); + } + // Setup session state change handler + this.session.stateChange.addListener((state) => { + if (this.session !== session) { + return; // if our session has changed, just return + } + this.logger.log(`[${this.id}] session state changed to ${state}`); + switch (state) { + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Initial: + break; + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Establishing: + break; + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Established: + this.setupLocalMedia(); + this.setupRemoteMedia(); + if (this.delegate && this.delegate.onCallAnswered) { + this.delegate.onCallAnswered(); + } + break; + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Terminating: + // fall through + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Terminated: + this.session = undefined; + this.cleanupMedia(); + if (this.delegate && this.delegate.onCallHangup) { + this.delegate.onCallHangup(); + } + break; + default: + throw new Error("Unknown session state."); + } + }); + // Setup delegate + this.session.delegate = { + onInfo: (info) => { + // As RFC 6086 states, sending DTMF via INFO is not standardized... + // + // Companies have been using INFO messages in order to transport + // Dual-Tone Multi-Frequency (DTMF) tones. All mechanisms are + // proprietary and have not been standardized. + // https://tools.ietf.org/html/rfc6086#section-2 + // + // It is however widely supported based on this draft: + // https://tools.ietf.org/html/draft-kaplan-dispatch-info-dtmf-package-00 + var _a; + // FIXME: TODO: We should reject correctly... + // + // If a UA receives an INFO request associated with an Info Package that + // the UA has not indicated willingness to receive, the UA MUST send a + // 469 (Bad Info Package) response (see Section 11.6), which contains a + // Recv-Info header field with Info Packages for which the UA is willing + // to receive INFO requests. + // https://tools.ietf.org/html/rfc6086#section-4.2.2 + // No delegate + if (((_a = this.delegate) === null || _a === void 0 ? void 0 : _a.onCallDTMFReceived) === undefined) { + info.reject(); + return; + } + // Invalid content type + const contentType = info.request.getHeader("content-type"); + if (!contentType || !/^application\/dtmf-relay/i.exec(contentType)) { + info.reject(); + return; + } + // Invalid body + const body = info.request.body.split("\r\n", 2); + if (body.length !== 2) { + info.reject(); + return; + } + // Invalid tone + let tone; + const toneRegExp = /^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/; + if (toneRegExp.test(body[0])) { + tone = body[0].replace(toneRegExp, "$2"); + } + if (!tone) { + info.reject(); + return; + } + // Invalid duration + let duration; + const durationRegExp = /^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/; + if (durationRegExp.test(body[1])) { + duration = parseInt(body[1].replace(durationRegExp, "$2"), 10); + } + if (!duration) { + info.reject(); + return; + } + info + .accept() + .then(() => { + if (this.delegate && this.delegate.onCallDTMFReceived) { + if (!tone || !duration) { + throw new Error("Tone or duration undefined."); + } + this.delegate.onCallDTMFReceived(tone, duration); + } + }) + .catch((error) => { + this.logger.error(error.message); + }); + }, + onRefer: (referral) => { + referral + .accept() + .then(() => this.sendInvite(referral.makeInviter(referralInviterOptions), referralInviterOptions)) + .catch((error) => { + this.logger.error(error.message); + }); + } + }; + } + /** Helper function to init send then send invite. */ + sendInvite(inviter, inviterOptions, inviterInviteOptions) { + // Initialize our session + this.initSession(inviter, inviterOptions); + // Send the INVITE + return inviter.invite(inviterInviteOptions).then(() => { + this.logger.log(`[${this.id}] sent INVITE`); + }); + } + /** + * Puts Session on hold. + * @param hold - Hold on if true, off if false. + */ + setHold(hold) { + if (!this.session) { + return Promise.reject(new Error("Session does not exist.")); + } + const session = this.session; + // Just resolve if we are already in correct state + if (this.held === hold) { + return Promise.resolve(); + } + const sessionDescriptionHandler = this.session.sessionDescriptionHandler; + if (!(sessionDescriptionHandler instanceof _session_description_handler__WEBPACK_IMPORTED_MODULE_2__.SessionDescriptionHandler)) { + throw new Error("Session's session description handler not instance of SessionDescriptionHandler."); + } + const options = { + requestDelegate: { + onAccept: () => { + this.held = hold; + this.enableReceiverTracks(!this.held); + this.enableSenderTracks(!this.held && !this.muted); + if (this.delegate && this.delegate.onCallHold) { + this.delegate.onCallHold(this.held); + } + }, + onReject: () => { + this.logger.warn(`[${this.id}] re-invite request was rejected`); + this.enableReceiverTracks(!this.held); + this.enableSenderTracks(!this.held && !this.muted); + if (this.delegate && this.delegate.onCallHold) { + this.delegate.onCallHold(this.held); + } + } + } + }; + // Session properties used to pass options to the SessionDescriptionHandler: + // + // 1) Session.sessionDescriptionHandlerOptions + // SDH options for the initial INVITE transaction. + // - Used in all cases when handling the initial INVITE transaction as either UAC or UAS. + // - May be set directly at anytime. + // - May optionally be set via constructor option. + // - May optionally be set via options passed to Inviter.invite() or Invitation.accept(). + // + // 2) Session.sessionDescriptionHandlerOptionsReInvite + // SDH options for re-INVITE transactions. + // - Used in all cases when handling a re-INVITE transaction as either UAC or UAS. + // - May be set directly at anytime. + // - May optionally be set via constructor option. + // - May optionally be set via options passed to Session.invite(). + const sessionDescriptionHandlerOptions = session.sessionDescriptionHandlerOptionsReInvite; + sessionDescriptionHandlerOptions.hold = hold; + session.sessionDescriptionHandlerOptionsReInvite = sessionDescriptionHandlerOptions; + // Send re-INVITE + return this.session + .invite(options) + .then(() => { + // preemptively enable/disable tracks + this.enableReceiverTracks(!hold); + this.enableSenderTracks(!hold && !this.muted); + }) + .catch((error) => { + if (error instanceof _api__WEBPACK_IMPORTED_MODULE_10__.RequestPendingError) { + this.logger.error(`[${this.id}] A hold request is already in progress.`); + } + throw error; + }); + } + /** + * Puts Session on mute. + * @param mute - Mute on if true, off if false. + */ + setMute(mute) { + if (!this.session) { + this.logger.warn(`[${this.id}] A session is required to enabled/disable media tracks`); + return; + } + if (this.session.state !== _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Established) { + this.logger.warn(`[${this.id}] An established session is required to enable/disable media tracks`); + return; + } + this.muted = mute; + this.enableSenderTracks(!this.held && !this.muted); + } + /** Helper function to attach local media to html elements. */ + setupLocalMedia() { + var _a, _b; + if (!this.session) { + throw new Error("Session does not exist."); + } + const mediaElement = (_b = (_a = this.options.media) === null || _a === void 0 ? void 0 : _a.local) === null || _b === void 0 ? void 0 : _b.video; + if (mediaElement) { + const localStream = this.localMediaStream; + if (!localStream) { + throw new Error("Local media stream undefiend."); + } + mediaElement.srcObject = localStream; + mediaElement.volume = 0; + mediaElement.play().catch((error) => { + this.logger.error(`[${this.id}] Failed to play local media`); + this.logger.error(error.message); + }); + } + } + /** Helper function to attach remote media to html elements. */ + setupRemoteMedia() { + var _a, _b, _c, _d; + if (!this.session) { + throw new Error("Session does not exist."); + } + const mediaElement = ((_b = (_a = this.options.media) === null || _a === void 0 ? void 0 : _a.remote) === null || _b === void 0 ? void 0 : _b.video) || ((_d = (_c = this.options.media) === null || _c === void 0 ? void 0 : _c.remote) === null || _d === void 0 ? void 0 : _d.audio); + if (mediaElement) { + const remoteStream = this.remoteMediaStream; + if (!remoteStream) { + throw new Error("Remote media stream undefiend."); + } + mediaElement.autoplay = true; // Safari hack, because you cannot call .play() from a non user action + mediaElement.srcObject = remoteStream; + mediaElement.play().catch((error) => { + this.logger.error(`[${this.id}] Failed to play remote media`); + this.logger.error(error.message); + }); + remoteStream.onaddtrack = () => { + this.logger.log(`[${this.id}] Remote media onaddtrack`); + mediaElement.load(); // Safari hack, as it doesn't work otheriwse + mediaElement.play().catch((error) => { + this.logger.error(`[${this.id}] Failed to play remote media`); + this.logger.error(error.message); + }); + }; + } + } + /** + * End a session. + * @remarks + * Send a BYE request, CANCEL request or reject response to end the current Session. + * Resolves when the request/response is sent, otherwise rejects. + * Use `onCallTerminated` delegate method to determine if and when Session is terminated. + */ + terminate() { + this.logger.log(`[${this.id}] Terminating...`); + if (!this.session) { + return Promise.reject(new Error("Session does not exist.")); + } + switch (this.session.state) { + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Initial: + if (this.session instanceof _api__WEBPACK_IMPORTED_MODULE_6__.Inviter) { + return this.session.cancel().then(() => { + this.logger.log(`[${this.id}] Inviter never sent INVITE (canceled)`); + }); + } + else if (this.session instanceof _api__WEBPACK_IMPORTED_MODULE_7__.Invitation) { + return this.session.reject().then(() => { + this.logger.log(`[${this.id}] Invitation rejected (sent 480)`); + }); + } + else { + throw new Error("Unknown session type."); + } + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Establishing: + if (this.session instanceof _api__WEBPACK_IMPORTED_MODULE_6__.Inviter) { + return this.session.cancel().then(() => { + this.logger.log(`[${this.id}] Inviter canceled (sent CANCEL)`); + }); + } + else if (this.session instanceof _api__WEBPACK_IMPORTED_MODULE_7__.Invitation) { + return this.session.reject().then(() => { + this.logger.log(`[${this.id}] Invitation rejected (sent 480)`); + }); + } + else { + throw new Error("Unknown session type."); + } + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Established: + return this.session.bye().then(() => { + this.logger.log(`[${this.id}] Session ended (sent BYE)`); + }); + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Terminating: + break; + case _api__WEBPACK_IMPORTED_MODULE_9__.SessionState.Terminated: + break; + default: + throw new Error("Unknown state"); + } + this.logger.log(`[${this.id}] Terminating in state ${this.session.state}, no action taken`); + return Promise.resolve(); + } +} + + +/***/ }), +/* 119 */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "Transport": () => (/* reexport safe */ _transport__WEBPACK_IMPORTED_MODULE_0__.Transport) +/* harmony export */ }); +/* harmony import */ var _transport__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57); +/** + * A Transport implementation for web browsers. + * @packageDocumentation + */ + + + + +/***/ }) +/******/ ]); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "name": () => (/* binding */ name), +/* harmony export */ "version": () => (/* binding */ version), +/* harmony export */ "Ack": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Ack), +/* harmony export */ "Bye": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Bye), +/* harmony export */ "ContentTypeUnsupportedError": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.ContentTypeUnsupportedError), +/* harmony export */ "EmitterImpl": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.EmitterImpl), +/* harmony export */ "Info": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Info), +/* harmony export */ "Invitation": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Invitation), +/* harmony export */ "Inviter": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Inviter), +/* harmony export */ "Message": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Message), +/* harmony export */ "Messager": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Messager), +/* harmony export */ "Notification": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Notification), +/* harmony export */ "Publisher": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Publisher), +/* harmony export */ "PublisherState": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.PublisherState), +/* harmony export */ "Referral": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Referral), +/* harmony export */ "Registerer": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Registerer), +/* harmony export */ "RegistererState": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.RegistererState), +/* harmony export */ "RequestPendingError": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.RequestPendingError), +/* harmony export */ "SIPExtension": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.SIPExtension), +/* harmony export */ "Session": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Session), +/* harmony export */ "SessionDescriptionHandlerError": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.SessionDescriptionHandlerError), +/* harmony export */ "SessionState": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.SessionState), +/* harmony export */ "SessionTerminatedError": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.SessionTerminatedError), +/* harmony export */ "StateTransitionError": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.StateTransitionError), +/* harmony export */ "Subscriber": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Subscriber), +/* harmony export */ "Subscription": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.Subscription), +/* harmony export */ "SubscriptionState": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.SubscriptionState), +/* harmony export */ "TransportState": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.TransportState), +/* harmony export */ "UserAgent": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.UserAgent), +/* harmony export */ "UserAgentRegisteredOptionTags": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.UserAgentRegisteredOptionTags), +/* harmony export */ "UserAgentState": () => (/* reexport safe */ _api__WEBPACK_IMPORTED_MODULE_1__.UserAgentState), +/* harmony export */ "Grammar": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_2__.Grammar), +/* harmony export */ "NameAddrHeader": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_2__.NameAddrHeader), +/* harmony export */ "Parameters": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_2__.Parameters), +/* harmony export */ "URI": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_2__.URI), +/* harmony export */ "equivalentURI": () => (/* reexport safe */ _grammar__WEBPACK_IMPORTED_MODULE_2__.equivalentURI), +/* harmony export */ "Core": () => (/* reexport module object */ _core__WEBPACK_IMPORTED_MODULE_3__), +/* harmony export */ "Web": () => (/* reexport module object */ _platform_web__WEBPACK_IMPORTED_MODULE_4__) +/* harmony export */ }); +/* harmony import */ var _version__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); +/* harmony import */ var _api__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); +/* harmony import */ var _grammar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(99); +/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(100); +/* harmony import */ var _platform_web__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(113); +// Helpful name and version exports + +const version = _version__WEBPACK_IMPORTED_MODULE_0__.LIBRARY_VERSION; +const name = "sip.js"; + +// Export api + +// Export grammar + +// Export namespaced core + + +// Export namespaced web + + + +})(); + +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/voip/static/src/activity/@types/models.d.ts b/voip/static/src/activity/@types/models.d.ts new file mode 100644 index 0000000..1791247 --- /dev/null +++ b/voip/static/src/activity/@types/models.d.ts @@ -0,0 +1,5 @@ +declare module "models" { + interface Activity { + partner: Persona, + } +} diff --git a/voip/static/src/activity/activity_model_patch.js b/voip/static/src/activity/activity_model_patch.js new file mode 100644 index 0000000..e89c08e --- /dev/null +++ b/voip/static/src/activity/activity_model_patch.js @@ -0,0 +1,25 @@ +/* @odoo-module */ + +import { Record } from "@mail/core/common/record"; +import { Activity } from "@mail/core/web/activity_model"; + +import { patch } from "@web/core/utils/patch"; + +patch(Activity, { + /** @override */ + _insert(data) { + const activity = super._insert(...arguments); + if (Object.hasOwn(data, "partner")) { + activity.partner = data.partner; + } + return activity; + }, +}); + +patch(Activity.prototype, { + /** @override */ + setup() { + super.setup(); + this.partner = Record.one("Persona"); + }, +}); diff --git a/voip/static/src/activity/activity_patch.js b/voip/static/src/activity/activity_patch.js new file mode 100644 index 0000000..c598bb3 --- /dev/null +++ b/voip/static/src/activity/activity_patch.js @@ -0,0 +1,21 @@ +/* @odoo-module */ + +import { Activity } from "@mail/core/web/activity"; + +import { patch } from "@web/core/utils/patch"; + +patch(Activity.prototype, { + /** + * @param {MouseEvent} ev + * @param {string} phoneNumber + */ + onClickPhoneNumber(ev, phoneNumber) { + ev.preventDefault(); + this.env.services["voip.user_agent"].makeCall({ + activity: this.env.services["mail.store"].Activity.get(this.props.data.id), + phone_number: phoneNumber, + res_id: this.props.data.res_id, + res_model: this.props.data.res_model, + }); + }, +}); diff --git a/voip/static/src/activity/activity_patch.xml b/voip/static/src/activity/activity_patch.xml new file mode 100644 index 0000000..581e79c --- /dev/null +++ b/voip/static/src/activity/activity_patch.xml @@ -0,0 +1,29 @@ + + + + + + +
+ + Phone: + + + + +
+
+ +
+ + Mobile: + + + + +
+
+
+
+ +
diff --git a/voip/static/src/core/call_model.js b/voip/static/src/core/call_model.js new file mode 100644 index 0000000..a964513 --- /dev/null +++ b/voip/static/src/core/call_model.js @@ -0,0 +1,120 @@ +/* @odoo-module */ + +import { Record } from "@mail/core/common/record"; +import { assignDefined } from "@mail/utils/common/misc"; + +import { deserializeDateTime } from "@web/core/l10n/dates"; +import { _t } from "@web/core/l10n/translation"; + +export class Call extends Record { + static id = "id"; + /** @type {Object.} */ + static records = {}; + + /** + * @param {Object} data + * @returns {Call} + */ + static insert(data) { + const call = this.get(data) ?? this.new(data); + if (data.partner) { + data.partner = this.store.Persona.insert({ ...data.partner, type: "partner" }); + } + if (data.creationDate) { + data.creationDate = deserializeDateTime(data.creationDate); + } + if (data.startDate) { + data.startDate = deserializeDateTime(data.startDate); + } + if (data.endDate) { + data.endDate = deserializeDateTime(data.endDate); + } + assignDefined(call, data); + return call; + } + + activity; + /** @type {luxon.DateTime} */ + creationDate; + /** @type {"incoming"|"outgoing"} */ + direction; + /** @type {string} */ + displayName; + /** @type {luxon.DateTime} */ + endDate; + /** @type {import("@mail/core/persona_model").Persona | undefined} */ + partner; + /** @type {string} */ + phoneNumber; + /** @type {luxon.DateTime} */ + startDate; + /** @type {"aborted"|"calling"|"missed"|"ongoing"|"rejected"|"terminated"} */ + state; + /** @type {{ interval: number, time: number }} */ + timer; + + /** @returns {string} */ + get callDate() { + if (this.state === "terminated") { + return this.startDate.toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + return this.creationDate.toLocaleString(luxon.DateTime.DATETIME_SHORT); + } + + /** @returns {number} */ + get duration() { + if (!this.startDate || !this.endDate) { + return 0; + } + return (this.endDate - this.startDate) / 1000; + } + + /** @returns {string} */ + get durationString() { + if (!this.duration) { + return ""; + } + const minutes = Math.floor(this.duration / 60); + const seconds = this.duration % 60; + if (minutes === 0) { + switch (seconds) { + case 0: + return _t("less than a second"); + case 1: + return _t("1 second"); + case 2: + return _t("2 seconds"); + default: + return _t("%(seconds)s seconds", { seconds }); + } + } + if (seconds === 0) { + switch (minutes) { + case 1: + return _t("1 minute"); + case 2: + return _t("2 minutes"); + default: + return _t("%(minutes)s minutes", { minutes }); + } + } + return _t("%(minutes)s min %(seconds)s sec", { minutes, seconds }); + } + + /** @returns {boolean} */ + get isInProgress() { + switch (this.state) { + case "calling": + case "ongoing": + // In case the power goes out in the middle of a call (for + // example), the call may be stuck in the “calling” or “ongoing” + // state, meaning we can't rely on the state alone, hence the + // need to also check for the session. + return Boolean(this._store.env.services["voip.user_agent"].session); + default: + return false; + } + } +} + +Call.register(); diff --git a/voip/static/src/core/call_service.js b/voip/static/src/core/call_service.js new file mode 100644 index 0000000..1a8fb34 --- /dev/null +++ b/voip/static/src/core/call_service.js @@ -0,0 +1,90 @@ +/* @odoo-module */ + +import { browser } from "@web/core/browser/browser"; +import { registry } from "@web/core/registry"; + +export class CallService { + missedCalls = 0; + + constructor(env, services) { + this.env = env; + this.orm = services.orm; + this.store = services["mail.store"]; + this.activityService = services["mail.activity"]; + } + + async abort(call) { + const [data] = await this.orm.call("voip.call", "abort_call", [[call.id]]); + this.store.Call.insert(data); + } + + async create(data) { + const { activity, partner } = data; + delete data.activity; + delete data.partner; + data.partner_id = partner?.id; + const [res] = await this.orm.call("voip.call", "create_and_format", [], data); + const call = this.store.Call.insert(res); + if (activity) { + call.activity = activity; + } + if (!call.partner) { + this.orm.call("voip.call", "get_contact_info", [[call.id]]).then((partnerData) => { + if (partnerData) { + call.partner = partnerData; + } + }); + } + return call; + } + + async end(call, { activityDone = true } = {}) { + let data; + if (call.activity && activityDone) { + [data] = await this.orm.call("voip.call", "end_call", [[call.id]], { + activity_name: call.activity.res_name, + }); + await this.activityService.markAsDone(call.activity); + this.activityService.delete(call.activity); + call.activity = null; + } else { + [data] = await this.orm.call("voip.call", "end_call", [[call.id]]); + } + this.store.Call.insert(data); + if (call.timer) { + clearInterval(call.timer.interval); + call.timer = null; + } + } + + async miss(call) { + const [data] = await this.orm.call("voip.call", "miss_call", [[call.id]]); + this.store.Call.insert(data); + this.missedCalls++; + } + + async reject(call) { + const [data] = await this.orm.call("voip.call", "reject_call", [[call.id]]); + this.store.Call.insert(data); + } + + async start(call) { + const [data] = await this.orm.call("voip.call", "start_call", [[call.id]]); + this.store.Call.insert(data); + call.timer = {}; + const computeDuration = () => { + call.timer.time = Math.floor((luxon.DateTime.now() - call.startDate) / 1000); + }; + computeDuration(); + call.timer.interval = browser.setInterval(computeDuration, 1000); + } +} + +export const callService = { + dependencies: ["mail.activity", "mail.persona", "mail.store", "orm"], + start(env, services) { + return new CallService(env, services); + }, +}; + +registry.category("services").add("voip.call", callService); diff --git a/voip/static/src/core/correspondence_model.js b/voip/static/src/core/correspondence_model.js new file mode 100644 index 0000000..0cd4a5e --- /dev/null +++ b/voip/static/src/core/correspondence_model.js @@ -0,0 +1,51 @@ +/* @odoo-module */ + +import { url } from "@web/core/utils/urls"; + +export class Correspondence { + activity; + call; + _partner; + + constructor({ activity, partner, call }) { + if (!activity && !partner && !call) { + throw TypeError( + "Cannot create correspondence: missing required data. A correspondence must refer to an activity, a partner or a phone call." + ); + } + this.activity = activity; + this._partner = partner; + this.call = call; + } + + /** @returns {string} */ + get avatarUrl() { + if (this.partner) { + return url("/web/image", { + model: "res.partner", + id: this.partner.id, + field: "avatar_128", + }); + } + return "/base/static/img/avatar_grey.png"; + } + + /** @returns {import("@mail/core/common/persona_model").Persona | undefined} */ + get partner() { + return this.call?.partner ?? this.activity?.partner ?? this._partner; + } + + /** @returns {string} */ + get phoneNumber() { + if (this.call) { + return this.call.phoneNumber; + } + if (this.activity) { + return this.activity.mobile || this.activity.phone; + } + if (this.partner) { + return this.partner.mobileNumber || this.partner.landlineNumber; + } + return ""; + } +} diff --git a/voip/static/src/core/messaging_service_patch.js b/voip/static/src/core/messaging_service_patch.js new file mode 100644 index 0000000..0ed38aa --- /dev/null +++ b/voip/static/src/core/messaging_service_patch.js @@ -0,0 +1,12 @@ +/* @odoo-module */ + +import { Messaging } from "@mail/core/common/messaging_service"; + +import { patch } from "@web/core/utils/patch"; + +patch(Messaging.prototype, { + initMessagingCallback({ voipConfig }) { + super.initMessagingCallback(...arguments); + this.store.voipConfig = voipConfig; + }, +}); diff --git a/voip/static/src/core/registerer.js b/voip/static/src/core/registerer.js new file mode 100644 index 0000000..39c3df8 --- /dev/null +++ b/voip/static/src/core/registerer.js @@ -0,0 +1,91 @@ +/* @odoo-module */ +/* global SIP */ + +import { _t } from "@web/core/l10n/translation"; + +export class Registerer { + /** + * When sending a REGISTER request, an “expires” parameter with the value of + * this field is added to the Contact header. It is used to indicate how + * long we would like the registration to remain valid. + * Note however that the definitive value is decided by the server based on + * its own policy and may therefore differ. + * + * The library automatically renews the registration for the same duration + * shortly before it expires. + * + * The value is expressed in seconds. + */ + static EXPIRATION_INTERVAL = 3600; + /** + * Possible values: + * - SIP.RegistererState.Initial + * - SIP.RegistererState.Registered + * - SIP.RegistererState.Unregistered + * - SIP.RegistererState.Terminated + */ + state; + /** + * An instance of the Registerer class from the SIP.js library. It shouldn't + * be used outside of this class; only this class is responsible for + * interfacing with this object. + */ + __sipJsRegisterer; + + constructor(voip, sipJsUserAgent) { + this.voip = voip; + this.__sipJsRegisterer = new SIP.Registerer(sipJsUserAgent, { + expires: Registerer.EXPIRATION_INTERVAL, + }); + this.__sipJsRegisterer.stateChange.addListener((state) => this._onStateChanged(state)); + } + + /** + * Sends the REGISTER request to the Registrar. + */ + register() { + this.__sipJsRegisterer.register({ + requestDelegate: { + onReject: (response) => this._onRegistrationRejected(response), + }, + }); + } + + /** + * Triggered when receiving a response with status code 4xx, 5xx, or 6xx to + * the REGISTER request. + * + * @param {SIP.IncomingResponse} response The server final response to the + * REGISTER request. + */ + _onRegistrationRejected(response) { + const errorMessage = _t("Registration rejected: %(statusCode)s %(reasonPhrase)s.", { + statusCode: response.message.statusCode, + reasonPhrase: response.message.reasonPhrase, + }); + const help = (() => { + switch (response.message.statusCode) { + case 401: // Unauthorized + return _t( + "The server failed to authenticate you. Please have an administrator verify that you are reaching the right server (PBX server IP in the General Settings) and that the credentials in your user preferences are correct." + ); + case 503: // Service Unavailable + return _t( + "The error may come from the transport layer. Please have an administrator verify the websocket server URL in the General Settings. If the problem persists, this is probably an issue with the server." + ); + default: + return _t( + "Please try again later. If the problem persists, you may want to ask an administrator to check the configuration." + ); + } + })(); + this.voip.triggerError(`${errorMessage}\n\n${help}`); + } + + _onStateChanged(newState) { + this.state = newState; + if (newState === SIP.RegistererState.Registered) { + this.voip.resolveError(); + } + } +} diff --git a/voip/static/src/core/user_agent_service.js b/voip/static/src/core/user_agent_service.js new file mode 100644 index 0000000..5c11d8a --- /dev/null +++ b/voip/static/src/core/user_agent_service.js @@ -0,0 +1,642 @@ +/* @odoo-module */ +/* global SIP */ + +import { reactive } from "@odoo/owl"; + +import { Registerer } from "@voip/core/registerer"; +import { cleanPhoneNumber } from "@voip/utils/utils"; + +import { getBundle, loadBundle } from "@web/core/assets"; +import { browser } from "@web/core/browser/browser"; +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; + +/** + * @typedef Session + * @property {"trying"|"ringing"|"ok"} [inviteState] + * @property {boolean} isMute + * @property {import("@voip/core/call_model").Call} call + * @property {window.sip.Session} [sipSession] + * @property {string} [transferTarget] + */ + +export class UserAgent { + attemptingToReconnect = false; + /** + * The id of the setTimeout used in demo mode to simulate the waiting time + * before the call is picked up. + * + * @type {number} + */ + demoTimeout; + preferredInputDevice; + registerer; + /** + * The Audio element used to play the audio stream received from the remote + * call party. + * + * @type {HTMLAudioElement} + */ + remoteAudio = new window.Audio(); + /** + * @type {Session} + */ + session; + transferTarget; + voip; + __sipJsUserAgent; + + constructor(env, services) { + this.env = env; + this.callService = services["voip.call"]; + this.notificationService = services.notification; + this.ringtoneService = services["voip.ringtone"]; + this.voip = services.voip; + this.softphone = this.voip.softphone; + this.voip.isReady.then(() => this.init()); + return reactive(this); + } + + /** @returns {Object} */ + get mediaConstraints() { + const constraints = { audio: true, video: false }; + if (this.preferredInputDevice) { + constraints.audio = { deviceId: { exact: this.preferredInputDevice } }; + } + return constraints; + } + + /** + * Provides the function that will be used by the SIP.js library to create + * the media source that will serve as the local media stream (i.e. the + * recording of the user's microphone). + * + * @returns {SIP.MediaStreamFactory} + */ + get mediaStreamFactory() { + return (constraints, sessionDescriptionHandler) => { + const mediaRequest = browser.navigator.mediaDevices.getUserMedia(constraints); + mediaRequest.then( + (stream) => this._onGetUserMediaSuccess(stream), + (error) => this._onGetUserMediaFailure(error) + ); + return mediaRequest; + }; + } + + /** + * Provides the handlers to be called by the SIP.js library when receiving + * SIP requests (BYE, INFO, ACK, REFER…). + * + * @returns {SIP.SessionDelegate} + */ + get sessionDelegate() { + return { onBye: (bye) => this._onBye(bye) }; + } + + /** @returns {Object} */ + get sipJsUserAgentConfig() { + const isDebug = odoo.debug !== ""; + return { + authorizationPassword: this.voip.settings.voip_secret, + authorizationUsername: this.voip.authorizationUsername, + delegate: { + onDisconnect: (error) => this._onTransportDisconnected(error), + onInvite: (inviteSession) => this._onIncomingInvitation(inviteSession), + }, + hackIpInContact: true, + logBuiltinEnabled: isDebug, + logLevel: isDebug ? "debug" : "error", + sessionDescriptionHandlerFactory: SIP.Web.defaultSessionDescriptionHandlerFactory( + this.mediaStreamFactory + ), + sessionDescriptionHandlerFactoryOptions: { iceGatheringTimeout: 1000 }, + transportOptions: { + server: this.voip.webSocketUrl, + traceSip: isDebug, + }, + uri: SIP.UserAgent.makeURI( + `sip:${this.voip.settings.voip_username}@${this.voip.pbxAddress}` + ), + userAgentString: `Odoo ${odoo.info.server_version} SIP.js/${window.SIP.version}`, + }; + } + + async acceptIncomingCall() { + this.ringtoneService.stopPlaying(); + this.session.sipSession.accept({ + sessionDescriptionHandlerOptions: { + constraints: this.mediaConstraints, + }, + }); + this.voip.triggerError(_t("Please accept the use of the microphone.")); + } + + async attemptReconnection(attemptCount = 0) { + if (attemptCount > 5) { + this.voip.triggerError( + _t("The WebSocket connection was lost and couldn't be reestablished.") + ); + return; + } + if (this.attemptingToReconnect) { + return; + } + this.attemptingToReconnect = true; + try { + await this.__sipJsUserAgent.reconnect(); + this.registerer.register(); + this.voip.resolveError(); + } catch { + setTimeout( + () => this.attemptReconnection(attemptCount + 1), + 2 ** attemptCount * 1000 + Math.random() * 500 + ); + } finally { + this.attemptingToReconnect = false; + } + } + + /** + * @param {string} phoneNumber + * @returns {SIP.URI} + */ + getUri(phoneNumber) { + const sanitizedNumber = cleanPhoneNumber(phoneNumber); + return SIP.UserAgent.makeURI(`sip:${sanitizedNumber}@${this.voip.pbxAddress}`); + } + + async hangup({ activityDone = true } = {}) { + this.ringtoneService.stopPlaying(); + browser.clearTimeout(this.demoTimeout); + if (this.session.sipSession) { + this._cleanUpRemoteAudio(); + switch (this.session.sipSession.state) { + case SIP.SessionState.Establishing: + this.session.sipSession.cancel(); + break; + case SIP.SessionState.Established: + this.session.sipSession.bye(); + break; + } + } + switch (this.session.call.state) { + case "calling": + await this.callService.abort(this.session.call); + break; + case "ongoing": + await this.callService.end(this.session.call, { activityDone }); + break; + } + this.session = null; + if (this.softphone.isInAutoCallMode) { + this.softphone.selectNextActivity(); + } + } + + async init() { + if (this.voip.mode !== "prod") { + return; + } + if (!this.voip.hasRtcSupport) { + this.voip.triggerError( + _t( + "Your browser does not support some of the features required for VoIP to work. Please try updating your browser or using a different one." + ) + ); + return; + } + if (!this.voip.isServerConfigured) { + this.voip.triggerError( + _t("PBX or Websocket address is missing. Please check your settings.") + ); + return; + } + if (!this.voip.areCredentialsSet) { + this.voip.triggerError( + _t("Your login details are not set correctly. Please contact your administrator.") + ); + return; + } + try { + await loadBundle(await getBundle("voip.assets_sip")); + } catch (error) { + console.error(error); + this.voip.triggerError( + _t("Failed to load the SIP.js library:\n\n%(error)s", { + error: error.message, + }) + ); + return; + } + try { + this.__sipJsUserAgent = new SIP.UserAgent(this.sipJsUserAgentConfig); + } catch (error) { + console.error(error); + this.voip.triggerError( + _t("An error occurred during the instantiation of the User Agent:\n\n%(error)s", { + error: error.message, + }) + ); + return; + } + this.voip.triggerError(_t("Connecting…")); + try { + await this.__sipJsUserAgent.start(); + } catch { + this.voip.triggerError( + _t( + "The user agent could not be started. The websocket server URL may be incorrect. Please have an administrator check the websocket server URL in the General Settings." + ) + ); + return; + } + this.registerer = new Registerer(this.voip, this.__sipJsUserAgent); + this.registerer.register(); + } + + invite(phoneNumber) { + let calleeUri; + if (this.voip.willCallFromAnotherDevice) { + calleeUri = this.getUri(this.voip.settings.external_device_number); + this.session.transferTarget = phoneNumber; + } else { + calleeUri = this.getUri(phoneNumber); + } + try { + const inviter = new SIP.Inviter(this.__sipJsUserAgent, calleeUri); + inviter.delegate = this.sessionDelegate; + inviter.stateChange.addListener((state) => this._onSessionStateChange(state)); + this.session.sipSession = inviter; + this.session.sipSession.invite({ + requestDelegate: { + onAccept: (response) => this._onOutgoingInvitationAccepted(response), + onProgress: (response) => this._onOutgoingInvitationProgress(response), + onReject: (response) => this._onOutgoingInvitationRejected(response), + }, + sessionDescriptionHandlerOptions: { + constraints: this.mediaConstraints, + }, + }).catch((error) => { + if (error.name === "NotAllowedError") { + return; + } + throw error; + }); + } catch (error) { + console.error(error); + this.voip.triggerError( + _t( + "An error occurred trying to invite the following number: %(phoneNumber)s\n\nError: %(error)s", + { phoneNumber, error: error.message } + ) + ); + } + } + + /** @param {Object} data */ + async makeCall(data) { + if (!(await this.voip.willCallUsingVoip())) { + window.location.assign(`tel:${data.phone_number}`); + return; + } + const call = await this.callService.create(data); + this.softphone.show(); + this.softphone.closeNumpad(); + this.notificationService.add( + _t("Calling %(phone number)s", { "phone number": call.phoneNumber }) + ); + this.softphone.selectCorrespondence({ call }); + this.session = { + inviteState: "trying", + isMute: false, + call, + }; + this.ringtoneService.ringback.play(); + if (this.voip.mode === "prod") { + this.invite(call.phoneNumber); + } else { + this.demoTimeout = browser.setTimeout(() => { + this._onOutgoingInvitationAccepted(); + }, 3000); + } + } + + async rejectIncomingCall() { + this.ringtoneService.stopPlaying(); + this.session.sipSession.reject({ statusCode: 603 /* Decline */ }); + await this.callService.reject(this.session.call); + this.session = null; + } + + /** @param {string} deviceId */ + async switchInputStream(deviceId) { + if (!this.session.sipSession?.sessionDescriptionHandler.peerConnection) { + return; + } + this.preferredInputDevice = deviceId; + const stream = await browser.navigator.mediaDevices.getUserMedia(this.mediaConstraints); + for (const sender of this.session.sipSession.sessionDescriptionHandler.peerConnection.getSenders()) { + if (sender.track) { + await sender.replaceTrack(stream.getAudioTracks()[0]); + } + } + } + + /** + * Transfers the call to the given number. + * + * @param {string} number + */ + transfer(number) { + if (this.voip.mode === "demo") { + this.hangup(); + return; + } + const transferTarget = this.getUri(number); + this.session.sipSession.refer(transferTarget, { + requestDelegate: { + onAccept: (response) => this._onReferAccepted(response), + }, + }); + } + + updateSenderTracks() { + if (!this.session?.sipSession?.sessionDescriptionHandler) { + return; + } + const { peerConnection } = this.session.sipSession.sessionDescriptionHandler; + for (const { track } of peerConnection.getSenders()) { + if (track) { + track.enabled = !this.session.isMute; + } + } + } + + _cleanUpRemoteAudio() { + this.remoteAudio.srcObject = null; + this.remoteAudio.pause(); + } + + /** + * Triggered when receiving a BYE request. Useful to detect when the callee + * of an outgoing call hangs up. + * + * @param {SIP.IncomingByeRequest} bye + */ + async _onBye({ incomingByeRequest: bye }) { + if (!this.session) { + return; + } + await this.callService.end(this.session.call); + this.session = null; + this._cleanUpRemoteAudio(); + if (this.softphone.isInAutoCallMode) { + this.softphone.selectNextActivity(); + } + } + + /** @param {DOMException} error */ + _onGetUserMediaFailure(error) { + console.error(error); + const errorMessage = (() => { + switch (error.name) { + case "NotAllowedError": + return _t( + "Cannot access audio recording device. If you have denied access to your microphone, please allow it and try again. Otherwise, make sure that this website is running over HTTPS and that your browser is not set to deny access to media devices." + ); + case "NotFoundError": + return _t( + "No audio recording device available. The application requires a microphone in order to be used." + ); + case "NotReadableError": + return _t( + "A hardware error has occurred while trying to access the audio recording device. Please ensure that your drivers are up to date and try again." + ); + default: + return _t( + "An error occured involving the audio recording device (%(errorName)s):\n%(errorMessage)s", + { errorMessage: error.message, errorName: error.name } + ); + } + })(); + this.voip.triggerError(errorMessage, { isNonBlocking: true }); + if (this.session.call.direction === "outgoing") { + this.hangup(); + } else { + this.rejectIncomingCall(); + } + } + + /** @param {MediaStream} stream */ + _onGetUserMediaSuccess(stream) { + this.voip.resolveError(); + switch (this.session.call.direction) { + case "outgoing": + this.ringtoneService.dial.play(); + break; + case "incoming": + this.callService.start(this.session.call); + break; + } + } + + /** @param {Object} inviteSession */ + async _onIncomingInvitation(inviteSession) { + if (this.session) { + inviteSession.reject({ statusCode: 486 /* Busy Here */ }); + return; + } + if (this.voip.settings.should_auto_reject_incoming_calls) { + inviteSession.reject({ statusCode: 488 /* Not Acceptable Here */ }); + return; + } + const phoneNumber = inviteSession.remoteIdentity.uri.user; + const call = await this.callService.create({ + direction: "incoming", + phone_number: phoneNumber, + state: "calling", + }); + this.softphone.selectCorrespondence({ call }); + inviteSession.delegate = this.sessionDelegate; + inviteSession.incomingInviteRequest.delegate = { + onCancel: (message) => this._onIncomingInvitationCanceled(message), + }; + inviteSession.stateChange.addListener((state) => this._onSessionStateChange(state)); + this.session = { + call, + isMute: false, + sipSession: inviteSession, + }; + this.softphone.show(); + this.ringtoneService.incoming.play(); + // TODO send notification + } + + /** + * Triggered when receiving CANCEL request. + * Useful to handle missed phone calls. + * + * @param {SIP.IncomingRequestMessage} message + */ + _onIncomingInvitationCanceled(message) { + this.ringtoneService.stopPlaying(); + this.session.sipSession.reject({ statusCode: 487 /* Request Terminated */ }); + this.callService.miss(this.session.call); + this.session = null; + } + + /** + * Triggered when receiving a 2xx final response to the INVITE request. + * + * @param {SIP.IncomingResponse} response + * @param {function} response.ack + * @param {SIP.IncomingResponseMessage} response.message + * @param {SIP.SessionDialog} response.session + */ + _onOutgoingInvitationAccepted(response) { + this.ringtoneService.stopPlaying(); + this.session.inviteState = "ok"; + if (this.voip.willCallFromAnotherDevice) { + this.transfer(this.session.transferTarget); + return; + } + this.callService.start(this.session.call); + } + + /** + * Triggered when receiving a 1xx provisional response to the INVITE request + * (excepted code 100 responses). + * + * NOTE: Relying on provisional responses to implement behaviors seems like + * a bad idea, as they may or may not be sent depending on the SIP server + * implementation. + * + * @param {SIP.IncomingResponse} response + * @param {SIP.IncomingResponseMessage} response.message + * @param {function} response.prack + * @param {SIP.SessionDialog} response.session + */ + _onOutgoingInvitationProgress(response) { + const { statusCode } = response.message; + if (statusCode === 183 /* Session Progress */ || statusCode === 180 /* Ringing */) { + this.ringtoneService.ringback.play(); + this.session.inviteState = "ringing"; + } + } + + /** + * Triggered when receiving a 4xx, 5xx, or 6xx final response to the + * INVITE request. + * + * @param {SIP.IncomingResponse} response + * @param {SIP.IncomingResponseMessage} response.message + * @param {number} response.message.statusCode + * @param {string} response.message.reasonPhrase + */ + _onOutgoingInvitationRejected(response) { + this.ringtoneService.stopPlaying(); + if (response.message.statusCode === 487) { // Request Terminated + // invitation has been cancelled by the user, the session has + // already been terminated + return; + } + const errorMessage = (() => { + switch (response.message.statusCode) { + case 404: // Not Found + case 488: // Not Acceptable Here + case 603: // Decline + return _t( + "The number is incorrect, the user credentials could be wrong or the connection cannot be made. Please check your configuration.\n(Reason received: %(reasonPhrase)s)", + { reasonPhrase: response.message.reasonPhrase } + ); + case 486: // Busy Here + case 600: // Busy Everywhere + return _t("The person you try to contact is currently unavailable."); + default: + return _t("Call rejected (reason: “%(reasonPhrase)s”)", { + reasonPhrase: response.message.reasonPhrase, + }); + } + })(); + this.voip.triggerError(errorMessage, { isNonBlocking: true }); + this.callService.reject(this.session.call); + this.session = null; + } + + /** + * Triggered when receiving a response with status code 2xx to the REFER + * request. + * + * @param {SIP.IncomingResponse} response The server final response to the + * REFER request. + */ + _onReferAccepted(response) { + this.session.sipSession.bye(); + this._cleanUpRemoteAudio(); + this.callService.end(this.session.call); + this.session = null; + } + + /** @param {SIP.SessionState} newState */ + _onSessionStateChange(newState) { + switch (newState) { + case SIP.SessionState.Initial: + break; + case SIP.SessionState.Establishing: + break; + case SIP.SessionState.Established: + this._setUpRemoteAudio(); + this.session.sipSession.sessionDescriptionHandler.remoteMediaStream.onaddtrack = ( + mediaStreamTrackEvent + ) => this._setUpRemoteAudio(); + break; + case SIP.SessionState.Terminating: + break; + case SIP.SessionState.Terminated: + break; + default: + throw new Error(`Unknown session state: "${newState}".`); + } + } + + /** + * Triggered when the transport transitions from connected state. + * + * @param {Error} error + */ + _onTransportDisconnected(error) { + if (!error) { + return; + } + console.error(error); + this.voip.triggerError( + _t( + "The websocket connection to the server has been lost. Attempting to reestablish the connection…" + ) + ); + this.attemptReconnection(); + } + + _setUpRemoteAudio() { + const remoteStream = new MediaStream(); + for (const receiver of this.session.sipSession.sessionDescriptionHandler.peerConnection.getReceivers()) { + if (receiver.track) { + remoteStream.addTrack(receiver.track); + // According to the SIP.js documentation, this is needed by Safari to work. + this.remoteAudio.load(); + } + } + this.remoteAudio.srcObject = remoteStream; + this.remoteAudio.play(); + } +} + +export const userAgentService = { + dependencies: ["notification", "voip", "voip.call", "voip.ringtone"], + start(env, services) { + return new UserAgent(env, services); + }, +}; + +registry.category("services").add("voip.user_agent", userAgentService); diff --git a/voip/static/src/core/user_settings_service_patch.js b/voip/static/src/core/user_settings_service_patch.js new file mode 100644 index 0000000..42ebddf --- /dev/null +++ b/voip/static/src/core/user_settings_service_patch.js @@ -0,0 +1,26 @@ +/* @odoo-module */ + +import { UserSettings } from "@mail/core/common/user_settings_service"; + +import { patch } from "@web/core/utils/patch"; + +const VOIP_CONFIG_KEYS = [ + "external_device_number", + "how_to_call_on_mobile", + "should_auto_reject_incoming_calls", + "should_call_from_another_device", + "voip_secret", + "voip_username", +]; + +patch(UserSettings.prototype, { + /** @override */ + updateFromCommands(settings) { + super.updateFromCommands(settings); + for (const key of VOIP_CONFIG_KEYS) { + if (key in settings) { + this[key] = settings[key]; + } + } + }, +}); diff --git a/voip/static/src/core/voip_service.js b/voip/static/src/core/voip_service.js new file mode 100644 index 0000000..32ea54c --- /dev/null +++ b/voip/static/src/core/voip_service.js @@ -0,0 +1,316 @@ +/* @odoo-module */ + +import { EventBus, markup, reactive } from "@odoo/owl"; + +import { CallMethodSelectionDialog } from "@voip/mobile/call_method_selection_dialog"; +import { SoftphoneContainer } from "@voip/softphone/softphone_container"; +import { Softphone } from "@voip/softphone/softphone_model"; +import { cleanPhoneNumber } from "@voip/utils/utils"; +import { VoipSystrayItem } from "@voip/web/voip_systray_item"; + +import { browser } from "@web/core/browser/browser"; +import { isMobileOS } from "@web/core/browser/feature_detection"; +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { Deferred } from "@web/core/utils/concurrency"; +import { escape } from "@web/core/utils/strings"; + +export class Voip { + bus = new EventBus(); + error; + isReady = new Deferred(); + /** + * Either “demo” or “prod”. In demo mode, phone calls are simulated in the + * interface but no RTC sessions are actually established. + * + * @type {"demo"|"prod"} + */ + mode; + /** + * The address of the PBX server. Used as the hostname in SIP URIs. + * + * @type {string} + */ + pbxAddress; + /** @type {Softphone} */ + softphone; + /** + * The WebSocket URL of the signaling server that will be used to + * communicate SIP messages between Odoo and the PBX server. + * + * @type {string} + */ + webSocketUrl; + + constructor(env, services) { + this.env = env; + /** @type {import("@mail/core/user_settings_service").UserSettings} */ + this.settings = services["mail.user_settings"]; + /** @type {import("@mail/core/store_service").Store} */ + this.store = services["mail.store"]; + /** @type {import("@mail/core/messaging_service").Messaging} */ + this.messaging = services["mail.messaging"]; + /** @type {import("@mail/activity/activity_service").ActivityService} */ + this.activityService = services["mail.activity"]; + this.callService = services["voip.call"]; + this.dialog = services.dialog; + this.orm = services.orm; + this.busService = services.bus_service; + this.softphone = new Softphone(this.store, this); + // VoIP config is retrieved by init_messaging RPC to minimize the number + // of requests at start-up. This is why we need to wait until + // mail.messaging is ready to update the VoIP config. + this.messaging.isReady.then(() => { + this.callService.missedCalls = this.store.voipConfig?.missedCalls ?? 0; + delete this.store.voipConfig?.missedCalls; + Object.assign(this, this.store.voipConfig); + delete this.store.voipConfig; + this.isReady.resolve(); + }); + this.busService.addEventListener("notification", this._onBusNotifications.bind(this)); + document.body.addEventListener("beforeunload", this._onBeforeUnload.bind(this)); + return reactive(this); + } + + /** + * Determines if `voip_secret` and `voip_username` settings are defined for + * the current user. + * + * @returns {boolean} + */ + get areCredentialsSet() { + return Boolean(this.settings.voip_username && this.settings.voip_secret); + } + + /** + * With some providers, the authorization username (the one used to register + * with the PBX server) differs from the username. This getter is intended + * to provide a way to override the authorization username. + * + * @returns {string} + */ + get authorizationUsername() { + return this.settings.voip_username || ""; + } + + get calls() { + return this.store.Call.records; + } + + /** @returns {boolean} */ + get canCall() { + return ( + this.mode === "demo" || + (this.hasRtcSupport && this.isServerConfigured && this.areCredentialsSet) + ); + } + + /** @returns {boolean} */ + get hasPendingRequest() { + return Boolean(this._activityRpc || this._contactRpc || this._recentCallsRpc); + } + + /** @returns {boolean} */ + get hasRtcSupport() { + return Boolean( + window.RTCPeerConnection && window.MediaStream && browser.navigator.mediaDevices + ); + } + + /** + * Determines if `pbxAddress` and `webSocketUrl` have been provided. + * + * @returns {boolean} + */ + get isServerConfigured() { + return Boolean(this.pbxAddress && this.webSocketUrl); + } + + /** @returns {boolean} */ + get isValidTransferNumber() { + if (!this.settings.external_device_number) { + return false; + } + return cleanPhoneNumber(this.settings.external_device_number) !== ""; + } + + /** @returns {number} */ + get missedCalls() { + return this.callService.missedCalls; + } + + /** + * Determines if the `should_call_from_another_device` setting is set and if + * an `external_device_number` has been provided. + * + * @returns {boolean} + */ + get willCallFromAnotherDevice() { + return this.settings.should_call_from_another_device && this.isValidTransferNumber; + } + + async fetchContacts(searchTerms = "", offset = 0, limit = 13) { + if (this._contactRpc) { + this._contactRpc.abort(); + } + this._contactRpc = this.orm.call("res.partner", "get_contacts", [], { + offset, + limit, + search_terms: searchTerms, + }); + try { + const contactsData = await this._contactRpc; + contactsData.forEach((contactData) => + this.store.Persona.insert({ ...contactData, type: "partner" }) + ); + this._contactRpc = null; + } catch (error) { + if (error.event?.type === "abort") { + error.event.preventDefault(); + } else { + this._contactRpc = null; + } + } + } + + async fetchRecentCalls(offset = 0, limit = 13) { + if (this._recentCallsRpc) { + this._recentCallsRpc.abort(); + } + this._recentCallsRpc = this.orm.call("voip.call", "get_recent_phone_calls", [], { + offset, + limit, + search_terms: this.softphone.searchBarInputValue.trim(), + }); + try { + const callsData = await this._recentCallsRpc; + callsData.forEach((data) => this.store.Call.insert(data)); + this._recentCallsRpc = null; + } catch (error) { + if (error.event?.type === "abort") { + error.event.preventDefault(); + } else { + this._recentCallsRpc = null; + } + } + } + + async fetchTodayCallActivities() { + if (this._activityRpc) { + return; + } + this._activityRpc = this.orm.call("mail.activity", "get_today_call_activities"); + try { + const activitiesData = await this._activityRpc; + activitiesData.forEach((data) => this.store.Activity.insert(data)); + } finally { + this._activityRpc = null; + } + } + + resetMissedCalls() { + if (this.missedCalls !== 0) { + this.orm.call("res.users", "reset_last_seen_phone_call"); + } + this.callService.missedCalls = 0; + } + + resolveError() { + this.error = null; + } + + /** + * Triggers an error that will be displayed in the softphone, and blocks the + * UI by default. + * + * @param {string} message The error message to be displayed. + * @param {Object} [options={}] + * @param {boolean} [options.isNonBlocking=false] If true, the error will + * not block the UI. + */ + triggerError(message, { isNonBlocking = false } = {}) { + const safeText = markup(escape(message).replaceAll("\n", "
")); + this.error = { text: safeText, isNonBlocking }; + } + + /** @returns {Deferred} */ + async willCallUsingVoip() { + if (!isMobileOS()) { + return true; + } + const callMethod = this.settings.how_to_call_on_mobile; + if (callMethod !== "ask") { + return callMethod === "voip"; + } + const useVoip = new Deferred(); + this.dialog.add( + CallMethodSelectionDialog, + { useVoip }, + { onClose: () => useVoip.resolve(true) } + ); + return useVoip; + } + + /** + * @param {BeforeUnloadEvent} ev + * @returns {string|undefined} + */ + _onBeforeUnload(ev) { + if (!this.softphone.selectedCorrespondence?.call?.isInProgress) { + return; + } + ev.preventDefault(); + return (ev.returnValue = _t( + "There is still a call in progress, are you sure you want to leave the page?" + )); + } + + _onBusNotifications({ detail: notifications }) { + for (const { payload, type } of notifications) { + switch (type) { + case "delete_call_activity": { + const activity = this.store.Activity.insert(payload); + this.activityService.delete(activity); + break; + } + case "refresh_call_activities": + this.fetchTodayCallActivities(); + return; + } + } + } +} + +export const voipService = { + dependencies: [ + "bus_service", + "dialog", + "mail.activity", + "mail.messaging", + "mail.store", + "mail.user_settings", + "orm", + "user", + "voip.call", + ], + async start(env, { user }) { + const isEmployee = await user.hasGroup("base.group_user"); + if (!isEmployee) { + const isReady = new Deferred(); + return { + bus: new EventBus(), + get canCall() { + return false; + }, + isReady, + }; + } + registry.category("main_components").add("voip.SoftphoneContainer", { + Component: SoftphoneContainer, + }); + registry.category("systray").add("voip", { Component: VoipSystrayItem }); + return new Voip(...arguments); + }, +}; + +registry.category("services").add("voip", voipService); diff --git a/voip/static/src/mobile/call_method_selection_dialog.js b/voip/static/src/mobile/call_method_selection_dialog.js new file mode 100644 index 0000000..a1f4b14 --- /dev/null +++ b/voip/static/src/mobile/call_method_selection_dialog.js @@ -0,0 +1,38 @@ +/* @odoo-module */ + +import { Component, useRef } from "@odoo/owl"; + +import { Dialog } from "@web/core/dialog/dialog"; +import { useService } from "@web/core/utils/hooks"; +import { _t } from "@web/core/l10n/translation"; + +export class CallMethodSelectionDialog extends Component { + static components = { Dialog }; + static props = { close: Function, useVoip: Promise }; + static template = "voip.CallMethodSelectionDialog"; + + setup() { + this.fieldsetRef = useRef("fieldset"); + this.rememberCheckboxRef = useRef("rememberCheckbox"); + this.settings = useService("mail.user_settings"); + this.orm = useService("orm"); + } + + get dialogProps() { + return { title: _t("Select a call method") }; + } + + /** @param {MouseEvent} ev */ + onClickConfirm(ev) { + const { value } = this.fieldsetRef.el.querySelector( + "input[type='radio'][name='call-method']:checked" + ); + if (this.rememberCheckboxRef.el.checked) { + this.orm.call("res.users.settings", "set_res_users_settings", [[this.settings.id]], { + new_settings: { how_to_call_on_mobile: value }, + }); + } + this.props.useVoip.resolve(value === "voip"); + this.props.close(); + } +} diff --git a/voip/static/src/mobile/call_method_selection_dialog.xml b/voip/static/src/mobile/call_method_selection_dialog.xml new file mode 100644 index 0000000..322e884 --- /dev/null +++ b/voip/static/src/mobile/call_method_selection_dialog.xml @@ -0,0 +1,23 @@ + + + + +
+ Tell us how to make the call: +
+ + +
+
+ + +
+
+ + + + + +
+
+
diff --git a/voip/static/src/mobile/device_selection_dialog.js b/voip/static/src/mobile/device_selection_dialog.js new file mode 100644 index 0000000..034abc3 --- /dev/null +++ b/voip/static/src/mobile/device_selection_dialog.js @@ -0,0 +1,54 @@ +/* @odoo-module */ + +import { Component, onWillStart, useRef } from "@odoo/owl"; + +import { browser } from "@web/core/browser/browser"; +import { Dialog } from "@web/core/dialog/dialog"; +import { useService } from "@web/core/utils/hooks"; +import { _t } from "@web/core/l10n/translation"; + +export class DeviceSelectionDialog extends Component { + static components = { Dialog }; + static props = { close: Function }; + static template = "voip.DeviceSelectionDialog"; + + setup() { + this.devices = []; + this.selectRef = useRef("select"); + this.userAgent = useService("voip.user_agent"); + onWillStart(async () => (this.devices = await this.getAudioInputDevices())); + } + + get currentDeviceId() { + return this.userAgent.preferredInputDevice; + } + + get dialogProps() { + return { + title: _t("Input device selection"), + fullscreen: true, + }; + } + + /** @returns {Promise<{deviceId: *, label: string}[]>} */ + async getAudioInputDevices() { + const devices = await browser.navigator.mediaDevices.enumerateDevices(); + return devices + .filter(({ kind }) => kind === "audioinput") + .map((device, i) => ({ + deviceId: device.deviceId, + label: device.label || `Device ${i + 1}`, + })); + } + + /** @param {MouseEvent} ev */ + onClickCancel(ev) { + this.props.close(); + } + + /** @param {MouseEvent} ev */ + onClickConfirm(ev) { + this.userAgent.switchInputStream(this.selectRef.el.value); + this.props.close(); + } +} diff --git a/voip/static/src/mobile/devise_selection_dialog.xml b/voip/static/src/mobile/devise_selection_dialog.xml new file mode 100644 index 0000000..85f6951 --- /dev/null +++ b/voip/static/src/mobile/devise_selection_dialog.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/voip/static/src/ringtones/dialtone.mp3 b/voip/static/src/ringtones/dialtone.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..438469bc0b6c157ff7e37c19ea24f783f69ed105 GIT binary patch literal 76402 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�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 b{J)L_z$^T3CI5T>e{KIax&L*N|D5=L@4q*W literal 0 HcmV?d00001 diff --git a/voip/static/src/ringtones/incomingcall.mp3 b/voip/static/src/ringtones/incomingcall.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..fe74e402879ffc2a89b68301a9eebe9937334deb GIT binary patch literal 81954 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

wp`r9@A80dR@uG95 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 Rz+i# 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

Ak#Pn~rRG35 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 wNE2Z z`tos35$e|?!J3bJ%QBfT%VDM=L-ocUDp$i3?#4;y+QYA98wpz?VlNJR^p3m*L#&0A zrO3mMPc>d@Yld?7%m4hC-TC$DJG+6CKpcX#mAOJ+vBU%wbgJ@(wcyqBvzy^A`;BKR zj|7yZmcXmEXLO9q7=nw`bOi` zI9vX2Zxs3LbBV3n^>_4(cN`E)`L&diK`?Sqt+Ha&t73O(@cELqn&-u7dWPcb%g*lY zpLYYQDaxF3N;`Sr$%00{3zoeMPsM_s&Bh(M&?~v@B>&giHIfEplCJB8u0N+a=^p2P zt3sNA9{Zo&cxfrz=WA_-y6r=W_!IY0w|CB$EGSXN34B=XGg(-=gHB>r9U^M_)R`tn zpZq^%g?JYc>3xG!89koprpcd7A-poGOCsJhaHwGg3x2!G@8G z?3`d848p48J6ll;@V@{sM56q)m~q2Ucdo#KYud1T5OHa~Vo}m6i{RC-ili=04c^p} zMc9m@8YP>3tZXm0G;-`__su&)kw)(ATj6CE+PC;QRYljGT2*sI0z!PzIy$z2ow;^j z@&FAS4QNCVE0T0wUwO|ZC2FY2-{;^LuaBXB^-8|Y=+;CoV!^wYl@)hm)xf(9PcD4x zUy?pDZ+@yhdj;t>5hTy5q_*H3O)QvDl2}XQm^+{+szSuD@-lN6Bf}|~$0nk1G_>jp z)2bX$(6?`xIMo$XtLL<^GP{PT} z0KcInQJb5cX`(RpQi=+VpA7j@a+udJN9U4Q<+|o2rlq?p75m*p zMxF1C7qH*1r3$UtTYUpC~W00?7t}UTLtVFJnq`NBem6iWr z)iozA+`WOxlTf>qE%}MfcIM8cepqgPagP(Jga8@$6W8IjZgjU1al7g17Loi|-*lb| z!zuZl9b5df6murN0^_(w5ha5p^Abj@`>({A4B1u|!(vPZY1O4<@O5q{k}3nLvf>12 z${V1JRiWlit3hvq-a<%}ncm2Gt3Q^;f5uOaIP8Pp+Zz?dH{t`;tJY*oEs5*WXGAnb z4Z!E0%6305`4HwBomTfI^Ib)h9wtIvk_K>?!TWpkseaoNE(XVnpVjxxV3L_rG^&`g zhhY>Y)nl6`NZZc)Q^sb!%Y`RJ)K~KBe_f#WN9?b4XqmF$vxvYvACJnL77d_biWS_LKg@`A>q?rMO{DPaUudpp5acf%lO9i;e4Q01*20VAs{lm2wIM;J); zMF2%Y%P!C-?RdpC|9bkDS={l6bD)Qr2>`;-y}f%M^)iumdS;-O`sE-+#9a^WRBaSM z_TfXMDmSllR9IC#`bUa}>`g8;XrlTWv&)Rn$N~O0Fb&7}@<~6F8j6ON#O(7NL^Wo3Jii0L4;UBPF!*zqN4+mM^7`J~#$%*1O6{}jeP zJt@Ycsg&SG9gqK(8q&PKH1N9V(1V zEx*@1jDyl>)H`AGSmjvluCNG^kM>`aVa-{c=vVO;!yHBCtT*khQL6q*ncjpqrvq7N zsw?U8ef?VEdivsp|2hu8QnQcxR#$Lb)P#OK<{cX^Lza%Gj=Jh*8IY#xQXkMzkU|-q z&~tWE_n-04!MvigXVanX0U}qAqn~rv{>e7mgEZA|X9X|*PVfEsweIm>Q}^T6wg;zY zkCy4JpjVqqAz%mLjosoJjd8RB?)s@y^3GspDI%7A$Xp!y?D%8CzW@+KqKv&B#lI?& zaxPs=|8;?+RGC#^^U?h5_I3Bnt)0Fxc*b>ytO|$qnp70iV>MZwrNY}Og;`vv(TeMH zV$?1Pt@5qsKd2{`V56L!^SZ*F@gGIa6i}B)B2$fo3bpkK8lM6Jtt&CJ6~Rey-sw(- z>Xr>o{GKJtXVf#W*q$7Vz*pWP)mk8Vh%=~P+dix6PhiJT;Zjx~J$@(eUt4fTD~CP- zRG?Md)+LrRdDQ`cwM{`^pn%VO>^qw4TVkL?Lx_oilVmvtO=C=%kk(#onvv(%T-E4hPS#g7~BKD;DYCk2kSc^C%d(R<4YK+vd5%Nw!J(UA2pi9Rf;> zm-DtoU80>?1QUvG@b$HV(CSbABlsnHFKW??mB)dLe5%vy37l)%zrR+Dq;8<%<2{4! z*t5W2_y^u#YY2|;DR9`D5w{av^TwVOIOyQCoA0n?9_Hq&d>5@;#FDkYts2IPtoRP>d{vy7{_b^csIudqzm*egD6$pbgiYH? zkepmUf)2WRd@;*Ygj4Dz-EmjQ(~9+pY>&IW1$c)oYCqQaMkkX7xQt80{P^4pw_{1) zm^u^U5@W)9Fp6(=)ku&hvUQoc3W@t zCl>~SYBrwOg|`NQ?F(;jY>(oeRLdJ_{x8U|j70kq{@Mn86=b}&L0`K-6iPc(8n0Cd zuJ?8puUM4(Rh#=&7DqIFV8Y|Cg-~rx+Np>=iWj$_V1JBq7svOh2$Tqa4ekHv&uU43 z*fPx%C0fceEm>k(6qc8?PFDLIgT=cKNYmDtpm;+YrxTGTaJr10z{gqHOnlLtCbg@t zlg+o5~130am+Gd zj~-vLnVmKp@YZluJUH4h%x}~u5;Q6J|BE~R+Wd&!80Y-(bMy`Ad)QNL{!vx^*yTE9 z=~q9?)4H!pSOl|zXC_y+e@#L=2CdeGF8jKFWL6!DS-90$9#^{edfsLt@H zv$||^16uY5ZBNrKQV^#m|5@m3E_wHGZXAa^fzQqEK?x272*>v63G$FEOAqP$)SpRh z!b1;6*s{cEuW^aKfRrm%<>8hKvb$b1G%evYpF+rTGJw#^egcCn1xfdtdJNY@OhQ_Q zMp}teu_hj=Caa;^vzjmKJ@YMZKfay!dagaviDA(nF5?-PI4Y+tknP*|{fy|w; z4Z#00+d`{cB#<8)z5Aw4xsX@Yg>%LE>v-I6_*v;vR+x(gB2a`w)VvrWA zdEO$YsaDU#x9-iM+F~Ap;UiuC8{$zrCY6-vP))q)oix+Y(T9_6rU&6~c_z-6q-u6k zV<*)36G6MYch4ZZtLDXjF8}}m)m#_!dJ$#~6=@rFNIa4n5MOUUC zde-;|IT4~@>IK4;L6Ra=J*3q+U@GL+53w=K#stzA>n*n285 z0;@^ExefW7@X`1Zd2dq4YIQVBnYsOkiI3{UG#(zXm?N~*Ol|1Lj}*M?^ftND87miI zjpf(QwTIKizCgr&;g_RIUvaR2gtjop5C=G9vF`j@C@PL71ej&)K%#yA1j(u){$ z6+JaqZBQarB239fLM6L7@Ht3$pDyHTYbHaLHx_FLNQkXfG44P?J8f;UM~XoPcrzfT z4#U!67O5&XNu?waY~Yk_cPN{piU%o`r#d@zOp&ryfleUG1TsD=Zy@Sw>J2#zB5gEb z`Y!`&&Kt?qx1B00c0AHALx1#rWnR9;HoRS*$;rPG-JRc?Oy0ZS%a<^L`<(k=13UfR0)UPh0qtVaV+i_a+HqYL(1S?EG^93_A&nU z7Z1N1vcoSXH}aMR9*+91$%PDIv3`Qa4h*7jSx5iY#DPO}(Xm*hcq&oObO}n0lH@nW z_UULQUXGR1a!4eFSV^k-`prpe1}uEceS8k&CZ%5s9dE<>w$IF19cQ*R0>_PXlmcnP zqlKk|ltaNP`o^jz2p25SzJ;3w~?E<+m$-H<@-cu}o3 zFF<4SrATN}f&=p+UQ2F<_U5@Ahp-t`b}3)w3LPzObDcO<4I&5~1wo`JNqUGH`0BD- z`c4)Z;Ucsy`Ja8A9KEELR1IsP&P2YINN=0SB!c1^9cv;2#l8tOgklUT3hJt>O0**S zW(`G>jHiwIwW+4~PR*g{^Ta5zcp+MQst2R87bzecpiW^{R|QP*SwCDHv$l}oQE=E- z$2DC$PrVE>Pb*RGrAfUaH,gSeP8=1XhMvmm*)4WvnSKZZqv#I)LL>ShvgnBuGC zaD1T`I-4&@25j$!b(C^d5N9a3LU~O)V`WXP3Crlllp+X{fZq#(5mQDGeTnC512n?4 z_gfS>Od{9&172Fnlub*u!?pJ5{#wcW(BS2*tAS)9Uh>9S&7JH-G4#-kCeO4i$Q9Na z7vxU)c3%3~ijuRsx>_3%vp>$BU1OrVo>MmOwTm><%g;nP@lhTL4BLSR!|H^!BvWOR zz#aUI*pa8&XmZ|LY_^e=v2%oiK5QDiZCUiZvZ*S`NGwWei8}uRAdY}0={7O&x(S|6 zGv0pP1RI)YGQZZLqmQ^?@PxK@VV!mc)8pXd9<)qy8L>+4KpS8CLh*R+PW$^Vbf%(8 zI*m8kN~9ohrg9O_o;~%E!A~EDSqg^!sAYX$*Ybvu@HD}eJLIF@O7lvHpu`+31RgcC zGN2%V*y+g%#&FjpWTK5jlP~7fEwSeHh|N)n(NJ7qRvReo0MRB5^>{M2ClD!eWY*B= z#L4!^=u=(mVFM?w(KmYGW^)fz@Z!0hQQG3^VeiK()I*pH9Pezb+Euqm-$9ti~V%eD?!_q>csH zf=ydBdF7PvJQchTybmtv(b(SF30@;B7-)CuC`{I48;oV0cbM-=;ho&S$9s9NYQLW; zZ@JMvurSYXcFC9X!UY-1(iezc`mqJ{qpl)LZ>xYR17)aHs(8m9vKcu9!k*>{BT}e& z^R^_Vr2-RNKKs~2lGTMe?(lj)EU?Rp!bv*HSo0x`A=Lq^11TirbUXPg%T|CW z=Zyu!-2ubNlB`Y=USq|JTbF?Its5&~3QtNb%ki|7$l*+#i}GFUm1XJW5XU-$0~dah zQayrbL*$yM$-%%=_;2%I7eYPNDLIU=QbPv9v^nvNF^=qCU$Mnuz+SBHmmM$ZD7UNP zku3_PV$Eh%@K6}6`9N+C;BKLq70p>H`dxy>naQSz0Rbdn@ALG-i9G(oBh^{~uM=mA zM3S3^Xjy($yUEmoSG=1Qz}~3+lW1<3y<+sZI-t5rZ`qJ8Z$^u^sen>KOiY|FXLxTw zXW0cD8h&u?V{sPOQ3++CcSF;7`V<)Wmi6);1@@^Lx*YR!x0w6C`X2rYB;jeL@cl!W z>?WB~?~x4Nqp7LjmmP{DZqqQ9lP>kpn3!u_se-jzTR1UJHNeGsB=@wTXuA>5#FSU# zQC>wi6Vo-J=1q|gBC;;_c;=B^WpoztzW{I`pb}WB9(+}IE>km+d}V_Y&a1NjbA(01 z9Ry$L&;ZeT-UcHV^HeI0sZi5+dc|5`50iPX=U0p9*fBi%55oBHN4uVn5 zGS839W2j_Egd~sxEEpv(t8`G&=ixniC%#ZAY+bdnZHjC2#{mDdEX61g!;LAKP_pEe z37LXp5=iPatD;_Y3=_vY3Wr3{C6bSi7Mk#)IMnml#h`4fIZ>hoLgte+))E+}-@$2t zm&$ADV?<`k5L22m>0k<`uOsOz@xmF8O-O7)nY)b@m7Z7b$C0YlPV3Y=i^?CG)0U3fqZ8Lh?}& z&+OAKb}j@`S&P)Qz#@{}_H{#6ap`SlE zf*6N11qLS0X(FP42xHi$=5RQY!^xxN7~=$MgyC3A7%5|#{$bz5@&TOhdEVTBh3b>$}cWSJJVZD9gp=^%6Uw>8;7iWo&xIz4Q4J`6;8sfuPb- zH+S~h1=Z^hq0XkUQ2U70UZJ3))RYGE<6OpOjVq5F>`MMA9wcP2=_B`>SH?({n|y@4 zhl}UC5sH#q_*1$d1R%oC!7Squb4C8HbR&nNaeZOA<)TSl9U4&?dQ=Zn-*VaB5ODO8 zFb(^7a*b2uyf0d~A#4`|BaPeDaOU;>V<1_R3MpX6TNv0#5;5v;XmY zJtV_^Ue6}#Ap@T%pIxz%17qA?>F$SjYYovrDI|dyxwBSJk+DlFL$xSf(2=`L3S~Ks z@<$De1MZQIx4P+s%T2~^lTb^C`lIP}Q#mL=>+DhPCM!ri8;NohF`ZZuLVh&QJrlZMU(qpu( zp2G{t%Ob=|dGlxuCDGh~)>|*sKAz5t)rnYJ)m<2L27fP)ElUcq^UVUj%C4$fD7NeM zSY&BY;-Rl%AAl%VEzbfojRkmn`J!IHEKi-qLQHIEUm!=OLoA}Cu<%FW^rs%9Utgu9 zcjsP0BYvsB{TLu{CL(g`#85n$NsqvYnfeMY!HjYR+MYLY#|r*z=k4AtDj$Zugq#w1 zrS==EyBa5^nsoPT(VdEI|hgQ5TNvIE(>!e9k({i`$ryHKL#0L7E zdJsygVw7|FNPtEUBXb-^9*8c6^?{9$fZj$yU0o+V3tbO5C9P<_Py`_S7XVp=S4Glz z-&b|tt&D;mJ8Vx=j2;S=*C~+TtF!pItuJ1I)Lh-!anuQGx{eJBItH!NWs?BPOz3MvH0z|5sl*;x&q)fbr42N?-lwLSJ z0ybQUQo6CctSWrUPHlwS%g$^LZMh8qH3&n9b4vEl$88|> zUywEIM`w@H8TS>@JFi4HDP^CgZMHeoLWA&m_rYFnQ%gx$24vvypu9P3ucw5HYH>6B znAlEUFqoI}54Bubg*<)KeOWzOJZ|$e`KTGN?_>A2`m5^inxW$IP{X`tPrbihXdCSN zYWE#`0Q-$%{{ipYPnuFRyNBgw zv9=UqvXpd69%5QoZ{4>Yzb+S@Mm$Uo?pZV&UeEfq5yYu!J%_!G z98uQ5ZYDzT6`|Lf=Jb?jQv}GlmHFaU=jqJW4Y2(S09GVQuI}tVO=@Djn8&|Ou$Ve~ z&Ff9D4BVk}g1Hk`m2h7DSX++tn2=pgd0&&vf{GsFDtI)_xN&d>ENKUIkUNG0+_h8` zkIu*D;n}nSb?-C@R&_a$8Lel})1E?fY9jO%3X7Z=A7W^a1vZ}&&F64~p9-Lr$p;%`d#;V5F7(52aBS)Ne_E7s9SFA)AeZCQb zlkJ+7B4y(LblcVKbTlD5>79G@jz>w&R``t$mBdCwsN-%Ma>R>f&bO}Vqs-(ZZ*HVq zP29wHuw)*4n#89y*-5%2gaQ| z<^DKh4=jLp$O%#s;Y1#J_yK+hs$sI2au(6)d)?qkwcKTgY4wVti}8T{qMx@mRgt+- zvqVLH0zNO7xWe07Y)8J!M7!O9yh-vD=G< zM_O;myP*rJ?<<~~f$5WAsC3=}M8#g2bj}B(R@lsL%+KP@jtN8)&~{2D|6SZKhltf6 zpe8Vczi6C@KiR?7fx(4WzYWH#+88capA#V^#26PdgJy;L33|SJmuc;%7CN+wi1mRx zTlN%TxT(gOjBqh;0Qa}#-d2gI@#j=K3gKVmMs3_? z&(bzJ9+sb;c?>jhcdD~|>um@m2PkezgOvHCoF##@1hIY-^ui#i`VdIQr{wcQC#)7f zV+Lr{?85ubpGiwg+P$n5?Lj3aZE=$iE*(Hy#yOx}N^|WY&(G7ms(vBdDgiE8dCRzf z!cXJUjwy~?U4>OwWXnVU0$>!01`8c0!n5<;$J?y5`RYkRqt4#=dK28-av~JZ*QsS7 zzw>l@@#MJrGu&Znoz1OzC$DpD=(#3uXHpDOwzpZWv0(ifC5ZRH5XYEgQp#+pus~Me zfor<9e&8~p0O~KF8y6`KjZMwZ_@12LYTz$7F&5Fmk8zMUaVtZDqwzj^V(V++m650x z=HdCoW<)h)W^4PCT1jU$QaDaXtf*+Ix)=SL3+TlU_h)HxzzICmenyngB`-ACY+t6U zeRJ-xRw17clKQbys9QRIWOmimR$mO}r@YxQY$58gKzce+b#wLS6n^*7tk^mz$kj>&(x|M_&Uw<_(vihXpBC?w7JK z*NI(U5iTUAF^j-=A1dAywoF|q4%R4d4HnDj!o&&FsmzsSJW1ya8mU#^`ZtP+V3{c# zi=^8a5vXI6`f+NJ+s#{Z;sOkMBAer|-Z(GjopSJW$UQ7`)JM5}SzbuIp+^l6I?Kd%jNsjy%^UafK0^cj%_0u$l#2^z3TaxI}NA zf|;h$2ixU)4sJWHKEx%S3@n9}B}wZ`^246_j~V&gM^)Rd25vt7TTkz2@;=1&vx($$ zC!f=(rWGwHiBz-J_Bj3$Ebm_E>wjywM|YhKK!OIjdy^J`B%bQqf2vfwjzFJj<$LI= z5unVM`O~8mP;>(bhJlVp*u>maxmG6!8QN`Pqx3HA$T-D1{g?z^Ubhe$@X^-U_2~%z zdMqLo^E8W4HF4MAjDr@?p431RnoX!D5-=V+4$y!WfDb5PEFr{Bu4UY`NgVSlWSZc? zk)QtpAdi4{6h1DXZRfj(*IW6DMKK9zqiKAtLQr>aPCuDY--92U=A`aVP8(PBlX^Cr zJbKKC*x$Ea(_ZnY z=m{z^MXk+}^YCX25TCYHC4}>vO7~tcHDfTEQckSakAKP2UVlYhq%$*@bem~%fD%i! z=B>ChadzZQ2Rl+<-OjLmDh=nb_s88>sa#;Fo#exV3#Yn5+H$jlm!=BxM&YWKm0dc! z{MP>0Ke}-|1Hnzq4u@WjxeZpNp9(EPsMD`49ea9?5E0luBQh3gnIgWp05v^Z0}@jB z2^czS9>?-k7~P!XCxe4KVm~;ESdUvY)sgEjZmyml?23cqpSSC)IzSsi*LZY7^{lZ~ zjyB#p_4IcNrv$kKb<$j7pyX=3QBG!lmWwHWCF_FWF)n0%X1sS=9=#Q&{~;2T{OlE@ z>uv2FrVsFcxDmi{XFg3A%EhUdWA08XbvUyn-xGY--31)ka$dRu{w=y*m_KXjC>4;L z`xkJ7s<>CqV*}c}@+P9}6f^!SeGmC6yQ{Xq@BH{3_7E#~ zxzDBkiLCc-GY)Td^k$BFH#IeNKG`b<6f4OX!gH@L`teg>tx;Oo8;^Gf09EEZZf;3) zP4JsAo4z(Q459tN^MNU7d0oAe1({Nd0CWpXY`~sCAl+-wk!Sx05cLLR$c9t z4($x7e+6T`PJy^IUpqitl@V}ep;t?!qX2Zoj~f8iHDU0_tmhmfk}RlLvH9S+w7|>v zc?C-eC?B3AD;e7d$%V1%n@Qv;k&CreKg{zhHGrG9&zH8q@S^$(8L(vLBBCyIjq7HcWcC zyMP^{&4h-_1<>zsCQNJJuw2Qhn}D}6e79W}%AXggI)4B_5^IJozajZ~u`mYbI$VUy zQ`5>?8JP@;D$bm}vweR(3OL#*biB@?16M?@I75s2u7PG=*}g?SHe9k(0ceC!0zMMU zrCt*%j;!)1K63g&qI?%&t{6-^D1Yt#l~0nYCmg_SJU&vaIAM;_uV>266t5|+?Rx|l zQD0rQy}=}BU6NP3PEJsI@E3Zz`unG5$9p2jQ}7s#5I!fMgw#)nsYaEKB4Mkp5kT&} zL&N*tHyvX1+vJDk6MtGeW69_LOuL2TQr>X8n!H68U|pRdVr#D}h#ebiH}E0MR_5c~ zDZ&}g@(Jo%WNHt1wy_7c_HktKG_cp{%I}&bk2P0=p;7&cIBc*}=M-!zdHHmg@{a1F z0Q#dTMvYPJ5iwQDvk!SdHQ_N~`wXkKtA@u&)HTzzzDnN_H8wrJP#Vy~VEKnNMgn6@ zy#I_L!Cc~{0hs4&=SvTVGcP8Hsv9e3Pg_f0h>GjfIZX#0CBzOWNlYU2tGstx(}|qT z9RxwgcX?bnpG+Gd)T5}$vFgHIlZ1+48dB0w9sU*Xv~Hzun}*<5?jQ2fHz zlu8?2AF{=$9qdj28m#M}o*C3X#_0LmK+BD>XXWoIlU(nrukv1GtZvYKK)`-5NzzsN zY7J%FC`;r=oqk(8b0HZY30l4jNHly86a>gUHDi4DM|d&Lg19@6>U?djGA_>=*SgPOARy_pR79AgGMgugJ*H-Z7u;&*a$LxQRtvG!lH9m zf$cdZPy>t%aO078W7QK)pO`IXMMwBb=UGAc`kT#xi`HJs@|Nt04Rwg+hp0AT8?{3Q zNrJ}`U-c8}vd>-b$#(dIa!q`YCh~`PKpdxfg01NRIDJOf#=e;=%tikK?o7v7H3Cyl zPQrZfWK{R0R&*ixsISvCw7qzon~t{duCp~sEb2lorwTP8@iNI>wV?)_mv?tr%grI= zJKjN*d&AA4K-OGk?6+ADtGt~3MWp6>>bdguGN&4&-0Haj-}_HTfDb%ad};&uIJ6of zbgQB@ZlyW?T>YcYy^W4>+x)aK5>c+^)cQ@GwY+M`13B(_8!Hr*I#@ok|KK}jyK&AewX)x)hCpY%bP8SBqvDRr!U#Pdg5h(Zz7bSyqJ<{K=Jj; zI80?(DFz?4eOpa{DfF-D#*i!*$*6fDaB0zeyy0)0gzzP4ASEUxagWz*@CvIZ8 z6tgBRv!hdjbzRu4-}ziRez~F=+o4I_IR*CIh`mj4bCV_s?Jv@W%*a?K;szA_6u&G? zw$3zyt+Q2ujIh@8VuDpeCtX zaEJ<&F1jcn#U^6_=OX@?zZX=T(}kUKw}fYEbkcYD4DSKChZWTiS(0u$XDdyXvTF=g zl~sNlRu;hso+dZ})8e02t39d%3K)pA2w`gcCDz_~$d{N6P?f0ife?t zK;vA$X*>*R?-6=@L91Hy0@W;k5DqvkFrRabFF|yG^(^AfRYzmJ@^iY-G{0<|%2SM1#6ovWThN%Eh8jX{jTpH5m+Cxf+j=x(Xn9P~2$m=M zMT=%w{xYl+{@q_*R%U@{c9vMfxlv9ck0rR9=C0H>o7LcokH^Zw!iloO#$kZ z(2;sWnzam^m6P^2A<$I|KH=S>lQ_|ftpBlfR#9zm(YghSySuw;>FtH z?(R;2;O?|oad#`lrMMO-<DtXO7gJUCwVR96egcgzwD86=9B*CYU(RortE%gMA9UjiFNVs@0bmE#iaFKzcgi2(u7r*S4N54v>HJqrZ1w78i#M)OL3g*(L}$ z#DDc;aD5>-uxn%V_UQHV^Vo-U%;kQ)wqP5pw;oXrscz-;_T{EoyH~ z4WN(oVb=K_FK5M5w8|mE~D?^;V4ceqI#4>JMhNo08yy zkv0BXf3e|jEU6fxh7g#mDTd6GL-5UjNIv}C;hAiL%F*ozRmSVpDb+gXin z!+hZ&%}pnvn$tAYUl)PcX4*sI(7KIv90dUvuNVb z&GXG|+wHVzzEq~?`9-F^l#{0tsg(z7zZ49%I4;orU85xf{$xhSn8dc3D}&k`oh@7{ zc|sD4p<|>Rx%rr$-T?uBYtqw2vn?6 zDsK}JOtWtiP`YwqPuN;+KNm7*1@9Oy=KtKJQ9bk`+4J&elH(r$dN7Eey}oO| zr9r3FR>t1MSZ0;aI2__<1HBSEC~sO6o(m&`Fz3pKwKRnS7LBc{j9x9OHe*LV$%pmj z+(rI28BNAhR4EuOmJzI&h(y<{Qh{!h@b)EIS2XyD?PL2P^Bv0mB;?FYNVuM|`E~OA z7^#^U=3tvP6BJ}0-hAXE#4E{Oe6Zz|ugu4lV1-D+#pJY)l|qgAE~P#nl~dZt+Zr#Y zx4YGpH@5dE_ojhL0MH8+Uec2_G)@=Mj2hnYxDU%N6%~WtSrz#_*~cw73Ft`MKSTjU zsYvxnR`-;dpTj1tl}5ALrq|hk*>f+FYMIZrY}$Sq7DRLIDNDbkUiF(K*BR^Yc9A~A zD=xt`pxVK}(!-EqVz@CWRhtLVN&DgfjfqN}o-5qH28F{QaZ5$INeYFKBk}&E`-Swa z1&O$!aI`NRBCP9(3=Yt*O+Az&No$SXA~Am3Uuh-sR@rANR20(2)9;+egDN{0J!Bnur;>xF z!$3!Vvf|GBH8@_Mr+&^(%unHXl#h*naVJQn;*fk=p`9?3{WYwb^j;wGyxGc66x=g!_58ORBm7 zOEVmTh^!~*HWAf*tpJ@FKOz_!nHL|-s_oQR)9z{G^WhSX%W zh=j5sq6Wy}mon?uO{W?{A-MT&^n8z*c2a;9hSCsS|oX+@gZ70Y}D` z9|mciff$Za#c8{6Is4=3(YRF0U)86gDB9>T{R03l5FVm2cKjBFcq_^K?@zFW8sEP; zfF6s@?OPOr&AA?V9_=RfT%VPy{l+v(DV)Nd{%VNNdhd60>=)g9Ja``tr_T6iyWKGI zGuy68>YYzL{bwX7cMAHvp&yk@DiWbWAVzNQH7N#qU%12BdcHIejzSr!Ey!RtR9m3m zNu_AA$rWsfZ3LauF6*GwPdn&6QRW~Em%bwz(`hcAp+$}i87R;s_?e92DOz4CPvKUv z*C;T;SzM(6Z=J%L*Q4C;$j?MLG9>Ljw{yMSe}p+*;aAgqP}3|#35S`PlV>qjjCaKr zVJ56bBI4Y|EMrcBKNkTCC-kj1fnMX%$iSk7Sh_KfGY^26ZyB+Bh})nF3F)%PWyZP2*%@fjy@}H-7(+P5Nl;#S)ox0Wf7f8|X13OK_E&AgFYXcD zQXv0WYt(4Hs)dPTtA_LFBxv;-rDmCwNzPZ^h*PL?V8oC)foYOm=Hb)T6G+trEpkhw+iUe28XRtl_r{TVahoj}jtSiG0M>{4N3NgIR0 zsMA4?{2=hVzG6f-eN5Pk66vH?vmAbO-YJ~ML(2IapsGb5Ubyj|uc1uS2o|*B10I{j zVX0KcRnQe}Rzw;}WHD6(kdm__wK1oa@XlKPs!bZH7@bGbv5rrZrVnj!Q3)K3M8KkD zPN>3npkU3Xt+w36SCO<;F0NuioC^Z678tZj+qvaO^kidEVeNy>vO9URr7BEw@VqY!K%~G~oFqGAgf) zAdx8-1sZhr$4B5rEXa7%I^&Y#mM}-XL&WbR=z#I{aN;K@$-=Q~4C0~JN%CC6vl4pp z;u3t)lo8RT$CPUP2Y_rK0+ZJ0KLB!B!6M?v&cq$%|0382zsOGCNs>7dtbap!(I}39Emg^ke2D@Ne zQacgP#Fn-LoXZlKpE2)U(K5N|_ zv8lyQkKXnQwD0HiLj}_oVHROpY}GYLi~J7IwgovjDK(};g9_{AWiU0vG#HCa#GCq2 znsBK+|>TIULA1A%-y#3ko470YfSFp0c}10MwC8dW1{d> z!lwqdw~k+@K{KJVTHh>;LIx68>Bf)Em5A!$Zv|P?amZ@$@wV8x-fn+2vV3BkmG4{l zh2U4&@{Ms#!Likp%D}DSyDBVGb`DNl&96fl_-pqp?^O6^ponj(xiQu$;tuEFRRBT-iCdIZ(%PNk+^5LJvH0-g_3>;^#t40J2k5rfZZ`V3w-nP+5}4$%J6>ay!E zfaB{&gY9FXf-%AwA@BB>a4p=QXk&r{J|EosKW%~Sq4F2fNa8&(@YJA6()5s0B0_L` z&ZK5roKkrnlcl6MnnwALAvS>s*6sF&-cNk&%sd-&4z?tV8l0mT8u(-Snx)5nc1)SL z4OA58%O7y6s}WkI9ydcH&yVrZE4hmGx~pTak}dI(Q@HiIDYmr+kG$T)=V3FyXcUQ! zY^Gdr2)$h+@&t?(%hhV!MwAq)t%hA}H!e?jXyMisoXcgk&)Kw5Z^v=@Q^fxPpb3Kr zuv6528-(?;{XTiKLg>S)FuWCH1aDMYH{bI#zlz^vHK`VCO{`7ao*A5|+1l3ju6zlZ zQ+gYOMo^qkZ}#S&OWDF}0a?t&!Tyq*vNFZa2j-;lA(faz`5x?tpvuTF!Zqz@-EZ2U zZB>CPBZG|vX5U%dyQ@X#aY%)RQ=;Wbf8*FobfQliiHn=;M04Nhn7@K4HW6hbI&)`j zXZ_~7oBhi!z1$5TOfI0Osl}C?g1h@A5(^Xq6lLB$1Opi-@PJqqE*DVUE8`;%GAdC7r-jc zuh^Xgj77ap!ngxHW2kwYwVG0zoJASC@uK^4pD4p^F)W*91Ex{=>|f=23_=KbqoPFC zDnV!NBgPEriNJ_k)&>$+cN0}1PSQ4l1QjN=G~wCBvT`LG_x2f@?hUpXmyVmk`20NT zETWt+j&lcEQVOVocz2|Xi3WI{Myzreg`kpq4`C)Bbiyw4Wh>rM`4jgJKc8-`2$V6f zxV7-gi#6pVzFVwjjch8Z^wZq4q!LHP8VmEB7K|fu&<>Pq_@r5VK8k=$G_cP=>z_HT_69O~#X$0S$&2qhzkYih*S$Bad z^ktbV_ryN9G9o=cgg-e~SfYrd>0yVi(#`R=5_^p>!?#g(^`)sPvadv#d@;(K2G(Cr z@X9i?17DD9wM?=cD^7X=30z_(>oy~CniXQ8zFQl=e*nk_A{hUV8?<2@%=%W4fd^E4 zOM}K0dob_wzvN(?{NvX=G~NgTpFIT$`P=o+_R`41%TI7q>E zbXFjfSV%0!Asi?5@3%-O!zcbeh@6_9CQqWzk1`Ln^qdu&DrZFOdFzR!$tL*eP0vA> zY$4rRK{{Agm9UUO$Q4^aHnfwq{RD}CU1*G!lTAB-$7?x6vUk*Z%weldyj$6FA@ckS z-FCjN(7W*zvXM#83z}%4Ina~HY@O$z2KC?Iae-Q}?|}ge%5-d?HhU)MS@(hJpW*rW zX?E74z`E!gLDsDYFZhKd22!^+YD6fd8ukOb~2!9$QrOJv5*~{0Bom#o`Fb z81cY|I*B>F-i2Y=Y003pig?Kk;kPAVjSc+eegHn&<_p?!yE1ha?2RM3D37REJf;(Je%-xa^+o%Naw+X8MFhne zlNe~XsuW`J8XNX6C0=_2viOdsdUVYVhDFQ|8mj{40o;Kv-r5v2Qh67wl)T#N{VztF zbT)iR>4u@zCw3i91zL&U9cY^+q(j%dDnLp~*$$d&y(cK(LAWRZ<5(CpoWea1L3En+ z=AC~4yuAWhY6CUjHo|I83_0GOK}q_aiJcna2IM+-DKZ+`BhO_BQu>)Fz=n}1QyoR? zI@{RQdO#XW7+XZ^QIZ~BBAevk7X9EeNHD`7JCY&$Nam=#fuS#JMHHcY!!ClQXfPs9 zidYy(Ah4KM*nA-Z7?vTW+fgAmPgiuD3Y&xydo@dd6}|4)PA`VT9SgXeqfKC(^(>EV z5jJI0n{96%%yJAPOe|_aMF>Skkhdb<87b84viEQLsVWr$ zqAYbbOMq`CkDoGmkJE&%Xnb|RKEXQ{zpr>2SbYAt_K~%pJ`tU_r8XTf9%4o*o_7rX z74RJ>bz$=fFpaJDLp2@Vs_~;2lkQ@w2{0Mws7)CHnu#0qYd3lfdqUicx z$Bs=A&6jgW`kMXndD6I5f^}1Wh~*LT=G9O+k-H)O^1E(GvSGq;z!$n8EU8~LRlK@} zXjf#f>X&fjl_>0<QjKYMdc!Veee2#gv!LN}pyBXSd1V$02Tku(*|H^YRIm24A{`1$%-I;JGW%+cn zdD)J!;0E9oZ9T~=#Fb~Cvvl>vis#S%!NSyYJ$6D2gaP5rxHhmKMvyFRL2z@YFqw@f z`lWdOJhYn{8b*c|W9j*Mwph>uH0wotAKh(uJxc9pF^&%|;if*cRl`N+v{Eoc!JdhKK;4*a0< zU{rehb5bk9%45yQJbRoH8i9o(uqKK#4-%xrR!7g4Z1EScJ>R=eIbt%~#Sh9*%LLb}R7PD^S~yhm+IE*X$B>C*KCHkptncpR$emDG0V|3J^qI zCFhO%3UUA|9>2~N=YGP%k_`l!DjyN>6Z5uqUA1NFtx$jQEGX5i zuR8fXxzNLc(36e8bpdFQbol}{y2iY$37z&-0C5 zU5#oP^2zN^ErA&d{{?TFDNGAbzC@R+E^`KJ?LDph)~>o3J9%g74g^5~@7A`SQmDQ( zi7ec@jp$p>JgrD^imW$TXG!-|9rrrB?9;N*BIL_lQ;oQ>ac7nJhZ=!4mk+`w5UtsL zZ?QIc-xc3EAB^VHH!l+9}Nq2ne z&@Ho0MCnYX6?;nbnNT+1FdB>9v$I4qpk(w;j46q)lfs9He+ce!HHuXJ8 z=sw@bOtUE&r=Kuy&C=7>XCht6!wxK+>6#Vo6130{Vnw3Kn-ZlC82f)){e@Ne3U%6= zsUHrIrI=apPmy%#BI{YAyLPzEw7}072nM_7DU7OEqcV?AlVo}OBft@6@(_LxoHQ)n~@7F`DBSkLdyoCMx`cw%>&hOW8=P;xi*oEM>DAWBBE)r%mpZo_RAD! zU=7P0hi&m1wzj?gd0}zfs=JBv+?Cw8J8X3p2#Ve4ekrSbdV2xf;pjfM^H^Q>YX{sVw15TU_zZ2Q8>38MU86hi+jjP5N9 z)IVHVYW>jAY`th5)MO8)<(H|rj&m>=if?Z5kY6gOYO&7qQecWtOR8g1ZKzC7e^fsp`&Pt>B3bRj%TAQM{V!^bkcV!d)5bQkg6uE8MQCaQia*0 zD_`X@{kh`$_WSgAc@B0b|gQmOrP&B+v>5R_~twhDzfP7?&FRKE#sT}GFKH?6i4%m3m zk9S5>+I!7EX)kLb z!D;8<-G)s$(@}=4L}%CkyjrNt&};{{td8cWNxVwF3g5hdS2NCK5K5gL%ob^Noo&Z! zOMBmU?*4(xZZP{j8Y?)9ApN^ttG#NcEgHPAtwwc-LfNRmhsOb`Y zCKo<&je2Lr%~s(2kiH!(J9zQyaBs6`N!RrGuE)rigoB6Snz&FLCn=W!T5?x87WQ1B z8s!Avj=E-`dfHVP-1)TQF ztH8pS!KovCQ=#`ErTMYk6!WWV)_4)bv9jmPPv`OtA8)N?ChkW#X?4_Xl=gVtp}jsz z6~gYec4_k=*P74-8q#!)*P#X3B4Rbo)lAq1sy%0^eDU?rkG1IIpr4{MHaNY2yK^ z|dpTys9Ql@6Egsp)E;@bBt}sesW?CR|HE>&$^`o_h;M-Qf1=%GK#g zB8}+qH`7hifMb7|AtPhDjd6|qhXmT5q!!6Ar@9Sv97r!-Yv}=h27Ye0R_uBb`@nsB ztT9ckJdU&q;!vYZ>X0`f1ve9K2kCtBm`4#!3UAlmP}v`o-{;odnb~6${9ICf&M=Gp z8kDKad1v@CUk$0yz-TVHNVSHBCwEZLR7#x(D!eodcOiDv@;k>bA5ULjOL3zS;bP)d zlsMw8Nt5uUDXItz^cshOJajrZSoF%fv`xhdj0Y?DoCP*X2Bs5J&X^e%_ub(n>as^F zl-a@M#3G(JLTua$w0$J(m?M$L$maButf<*oD4z?p(5mBnw+&X8=tG-l4=RzFq4j#T zpUT!ecs;p{y%k8j0KFwH^s4zc6Ut|B&zAYz3#k(;sMJIPyEp}bqz!w#}Rf1j#g%Q}9RKD|U$&_ROz zXK`4oJB+vajHuj;#PA-keH?A&z3qV;7?@rvc^npnJB+unqJfA;!%?43l4Mt^hu* z`Gq`o4hZmq*KuG7&kP~-%(rag;i)Pb*5F?K!Ts~qi`y%>kvV#hQGE=l!;&~ztcF40 zlQplZKD#L$8|5brlDuT~86rk5mI!^F-n$D34O!hn+SpGUYxw@7)5qWN2A&MBpcluB zp??4?_Svo$OxC!SQM0R^_C2BY4X7&&*rQcE} znRB_U8A~`XhomgntD<7G;`ZoKNRGNB)A??XXX6o2A`hsZy)MK^KHgJzOd?HA)oon0 zWt=H)g26S~MN8jN5!fcshxsn4{B%xCp9>#Zrh&3hR=K2~5Nrs(nolB@2raO1!(Mg_ zv929SzO15Go zJsZ~?0W`*LrktS}j)O`lrR0cZ@R-qcFt_-i&*Ew!x_$a)vwQQ$xk&>NFEP=QbIu9*{poJd^Vrk_uhBFCZsWaiy zVp)8jROD`TaYlJdso2152E;SB`E$*29VOapzw279HPr@HnEr+quRhDz(i|35xMb;H zt6KAXtU@v%SDnpDgc7`kCH!29pK3@WgG-D}sD(*IocYc$PL->AClXM8ve=5~n#wW+ z`aZm*>;(?hlrcLVCG^sfD1;<`*$zS#;iBtW_f?NYd&E|w-|fnSs|xaD?%!w^+`fM) zAr`Q^4;Qp0t-ftTj5;J%B1(VpfZ=3En%*|>@00F+hq#ar+#x#zlTW!e#Ows)mvdC} zmXKDD~aLWv%b-%`^WjC z=`9WG#sZ=YqRwsw&f3904MzLTE*fSnR!Y6+8EK{nx<8akki-4~pbmqe{uYLNI|1sd zg#U%%h-k_v--@#PA6l%A?s?j&e6JDl+g`Bz@2|f6F-aqnCN`}ZMWLhlUdQ%9gdDc z2HJy+?82CA<5|sCf5(yH?gGN9N__nw<=D~jwDWtHw9&r@_inciuWfSCN1>1}He1Ut zdP#`$oq;roeYPG7C5G^SA5+SB@Syi^QBB?V2WrRzR1~akB5V**zi}1&?68wxx@AL z<$I3hpIMVW_}~6i$TQi^#>X(I04^GyyH zdUoy~l$e+fAz%Ct?7Fz7CKTf0@NJldcZrk}-GFbZwl%GpckM;ioW&~&%MPV!So7y1 zML$XTxyadhmDM=plr1ghv_m$jIKOqs9AXwKsQ3gx+pI(ZZaj}?DT9)=5+75^)0$7A zV`bHgD;cyHvk-AfvG^fc$xPnf+Fai4N40P|)+LmjCi|6)qg#X;w#?3UAh$S2CX@cJ zDeaex><%vCw^D40TQ=rpY*HH&xqG_7BS7xPMf0oEG83cYs<7}4|7dPO*2z*{+QFVF zDznY6Y$%1JMJVz&XiLRfM|PtH0NA^d7^m8=ZKYRQD>hdByxjmXfmD96wS3 zIZ7uCQXL)i9R#Z+$gZMa4z`3KH3v?s*;IsZD`7DFTvtxsxL-Rp{DVd&RZ` zdmjgSsqWnDqZPdL@7y@(DUzaOY{rWy3%@)FJK3tuT~izfgB;8tu(U7QpU`R;-Y8bW^(b=V2HL?RJnE{!TmV)4yrrM=2*TN;5EQJ7;HAqf$GzD^oU!(9@E4gpv;y>n_aD)0}&~ zkW;5TXzD?RIEo3`AACe#PcT@xZ5Pn`qtovR?I`=?mH{;QV$m@qjS%=(Mo7W^hJ}nN z2a6-&NI4T%hCz{GNTZymv)60n#gKW(f2O2d;c)4qMrKjV$U-Eg`0NDOH&fAln;PY~ zNKa_WRH^EBy~j7dlSV)%&V{m|v^Mx1JY5IthgoaHF>9V1EksGkKZY)t&f=Sbq5J^)x{_9hwGi%1d2rG+_Oh7{^5arbs zU(BR??!1oy@7#Us9IVV)TnzOL2+-s9)*8sF^WucsARAOtp)$xtr@DkX%lij^PsB^5 z2Iq+K7oN}rALT}6DMxx*gpXp+vXmZ3JNNi49Wy3HlYstkFBGrw45kM&hW=$|=_*eh z^y?gqYfX+b$xRHu={GRFb){0}wIOCcp{9?qET=LhrT4J^-L0pjz{r|{9V>Pv z?~GbM2di9x3_?%i1j4VQl-*fpbt}vkv&kq~Phdw8;kh#x#uf=z9Lr9&+Ak=#LOpcT zS5h#l2YB|czsELuJ5D0k%~uTS7PJZ~8Tx-jK5eO{-g)TNjMnE{^fVMKT`W5Cw2q>K zG~w6OmI)&gsTT`b+(~+{`xh8$ zCz%8lD}E$hZdM#DP;liUt1Y)?J0WAoz4tq%o^x7G)qX81d;zVmH9~=*Ra$x7;Lr77i$r8(R4PV899TJrLK><-z;^#6UQFS89nh+ajA5#b zfHYzbJ)9y7`D7}KPOSvikawXm@-ezY0(R(92DOm6d)IqOlVZ{g3cvEQU}^1Ko&0hH zcT0S=fjgFJN~~opo2iCf`FSeA0TVsl9*Z_Xt^q=ezw%_rY{be-#>es6{?8J2pHskj zt3PT#PM_j6zUqC>o_y{U@}S-@>h&$5bnf_F@Fbe3`wswf7(^JyVNnz-_t8_Kled*f z6Zr>hwYL+XRKgOat)ZR76+Sg3{oOXfK=at@xRp658i+1(B*mqMqq?MyAF*G(iy&u~ zxuiq4zrQUYIP5ODpr-C(yxw{Q(oUdjIj67R;Dd!?<^EApLC~tri!xiNwb!gHwf7*n zw{uwMmW(aX;o~s|X$%Xcnp^0o(W?m`%hTrHbld7qEYhC%B$1L#+@Z22T;Yxp>Qj_k z?*Ady;*)O5Ws|cg@n-ZDPn!kQE!@5?`%baceR344k^H?iQbu`N~);>4gjb?D=s+>vuCO*ev-}{wg9h-8IO!19WI_oo)$V@0O)h)PYsGd-mEHGSEy4fJ#c~H*n-YtW& z`u4gX`QjFtOCT6&kpuDV9kbNOZTkK3=5dS1SR`!O$AIIYol&HgK{z*o5nr6S7-nH{ z(GT$&VCB_NVec1tJA%`e_1Api;q0nmqaRD!_4dyh6507!_!5tQ8~Skqg8L7DdQevy zl4Fau&yl+hk+oV~ELT0GXGuFuWbN_mO?-nv3o*??mnJ~WG@Q1|-gP#mvA4{2%6uyCYCh;_{)~E4=_i7y)9dSn<$$+5fR%hZ;U4wEwffTmN z$47yb!mJ8J29nC)47(A4udW(`=1+^7A+xpb@!fkW7P-vU)@Mi53WY67*+qRZERP}8 zz|EGBg4#Vc?CJ;?e=^^(UDe#1gC%c*Ump|%#LZe5Qav{PdQVFX*$aMDEboC|DNAuM z>Eptzr)V?r>Kl2x~iD+w*yGE4mRI1azSmo6h@~qK0)MrDp%saL{ z>vs;e6*brOAf;r<;Zu$F0*Y||0HB9~Kh+uozh!|SV?Z_WQ)dE-0;Xzljva8N^>H{u zy}Z#Uk_F~g0X=%^RWh~|Zf<7tcpONK^B^Om1sS&+ePOhNF-g7Lkvcl}&l2l>bdD$~ z{i8Yk<><$=XL2>~G8T33Hx@_gpJJ$YeDIjdJG?_8Ii=35 zfk0PkCy3*FRQ(?n1znc*t64W%Jciz&yNJ}{k`swRHqNz$i(-kO`KA@5r)*3j?k-o6 zmZ2Fyo|-nH?JvUNkB>5P)5B-&HBPfb=)>r+EulC_dg(s~0pDIbkiX8~kOnz3u2(8) zJ0U8dIwl}d{3bYpIIx(`gd-@Comy9kO4mX-)B|)xwqXnaZFbRYhSzC==L_`4no<_hRxSrFG(yXCQKU@G_~A8;DFJ{d9ny5;-p<@xpQ=HgZIa{Bee z0*WH@^{F`n^d~LZIWpD!JL-v4quuOU#^AGx`bjb zBsuvqIN+2hC4&~e2h8_2GnD#XbJP@m^$`&^$t@Qwn5xH znc0m_N8Cw6s92BC!6T?h+s56pKWS#qc622kKcChl6c07}JKOK?h!E8rsLW+xZ&`8h z81LKA$mw_vj|02FHC4r2S^e{ukQgNSD$FUN>Zf;jUO=s)643!>n@>1GJ$}Jwa(@Pg zk$y4y{td4G2Y`AYqSjkc_FGTzWc->d6bh--(*0 z4roAMm)Yr8ZL7a6huim*)A3C1l>;A0JrBl1Dd)Z6q+k#j^8#OhPHjHE`yquDmJAg6 z1>Qf9X}|=n(gFg(YryxZUBPOQs%a;>S*5?cC#~A*k<;%Xj@8W zG(ZUKVCEE59OFd;AYC6%x_4N9?wHFH3e)_{vODPF;GB#$e(YW@yPAe=VDz41{}O>J zgUdj5&-%J?6qig-6iQ10M4yl}8oQ^YrOL4=I#pjn#wbXOg6@2u`9VjTz=J|A(L;7L z9x6m4F1N?z#IeApkTfV*a>CtNy{+coy;#+)?tt=`pZ}V(U-cpH`4o4!p>em)bo!SX z@lr+8PE*H1u-AziV~sza(V88T?W`f%=Fm?V7laX3o_5&N}O zwPNoI=k%16G(4_U&%7`K4ms`9)^!&+)lT3B*PgP&UvB6bg>$SwBBB{%fSM)h3h9-P z<%%1Nw}%BpGvz+J=DD6*gQK*|biLPwWLS@dO9r<0Ll0+J({iDZXBqCKM(?`KKzMhBMGvU&YP7+yUltrjr%Gh*rcKYN zq~w|?rYWyA%)J{8FhuQA2cN^7?x4cfQkd4uf$2)8BUnn^cIZ0Ok%l{>500Qu+`ky9A)8m6opwJ++{!1GCQ4XdcoC*(Er%yvfw zPdVkp7g@zS5sq1zD&oN%wi9?j;4!<3-m+=rU6V&ya#6Oj#~yzT!=EbEuS^B#rm=O6 zA)LF&eXsxZ6D$dSL7V>o*C&1k%q2_SWU65S~XQ-Zd zC;(p0;}#+twP>vVa;nTj(meK1T;SUI8A4VQWik4UbhzhFBgG4F3Jk+ztOj9{MH9+J zHOhKOWQX;+1&`7N&2b=DJ2UL)$cY^%26GfK;Il^lSrdlsFD>2X0hK1|M93>MN_qAR zq{>`t)vBI)dS>a@FQDMtdygXT%nLb1+b35CCbB3MPvL~iCV0jm#%z12n)4|PaSASo zXdB0Mw9=c{Idu#YzcUWsij+)bh#Ug{^vw4jIAoCfrF_Ua^Z8OhgI!KX4zS_M&`X<7 zQLWX$x){eKWVTyPPi$sHD?v<+=Riy;q)HIftcCN=`W8Rvhr%}j%;etLdL{-LHi>rjXgSE`Q9&Dg4i`771PJc$?$KqYqCAaXcV+|~{2!eC2p ze8gqJO4dmBBKbX~IBe|tLQY2UO$r+JetS0(NYp<7gkTU-v_{{qK<4$1Z&@IAXWU0M zCdIcu!ETk-`)^C}#ZranrLuB1QSzEdsd(Ecys?~X@bC_(-@{SyD*5G|Ym50ygNli0 z=$w-gcmaWVE`GtI&ZYgN!yQ2l(mPom88j9`YYg0PDK8imYx-eHu1GhZPjtpk@W7dl zCkyPrIYzW}?$tz~S43%5VkEq|FLR+UUEiP^F63@R%l50~o>F@JzMh6Qt;PM1APY@` zAMAukR=){q!@}bcFq+-NJDNIu4Y6~J4*0cxx6ft^bj{OK({st#k+(Z->v&SBYarcN zRy>@{ryC|vhOKdNy^lIA3+Gq0)Y>kQ6B49xDsqEep#BmTFG2-ff?RnoOR(# z!>oE{YC+DR=FjY{f=>0GVf8!HI;J`O{Xm73U?9$6PxvU)S zg-z_uiy10J3f83G`w(XR3oXp8Oe?wB=k#F zXNRge*=JEC52HrWMAhQK$-2tgq?^y%dreG5Mo?R<-hE_%PSP_ZWm*RwaCbgg2PTn! zuzxHCOP^*dG&ZPxDRZ`V;?zZ_sUY@9VU^Rhu~MtZVU^bURe6uzv(@%GhhQAMKn9OZ zuGs?Qd-DFo$K`IEE1wi3FJ`J+nlRk=Sbb)Rg7AnK_UzAX zQD4gpE)rP($_o9;-X< zx=3=%0^^4JTr2SfMc#-vlRGw?6P_=JJBM6sjOPHNvo_yd@MqzD9V(e zIGa@WbdgR8$wsGi*L_dsU3@-^QR`|0N5DRN-yhF-r2CoC4#U>=%YZVt&Vx|H=^{UpI3JdU%BZ<6%1%sQ#Woi&X={LZ{ilp8A<#uZj#4xDYc z;t^q#+CvffRe@=nW@Aez!}?*a~C-gDaV*d z#J;h|CM#c7gBOf-t%9-R*w|#pk0KzL8K+OJ>Fl|x@P4DXE!l&W+~TJcx95{OsTK>k zNI`SwL|1Llm_g*}5B$q(9gNh?#hy6x=%38ujKPp=)aI;UH+Ey(iUImxs)^&$$;B2i zA_w+?VdpeitN;=qI31hEuZy^6Jbk0en6~(AT*~GP0Xe&_fqM1FX@d&!dL5&RZ#S0O zC=>W#^uz|#G`-|p>#UesleABms}8Ii$ByWd>*PuhqLT=6_VWe>isAJ=v4Y1(i08DH zZO%N3c9~C0w93+ZFA6Uh_~PU!z^?m@>XPaJL)@&IDP!u%Xnv$a-dL`SR7DXaga;*f z%`EeF#BWe<99kI<#D^~PKag;V6m#xqAc&1sSzBBBlqgha-i*5$ROg>qq=F#G+R0<8 zxX2hBM%SG)%{r1Do~g;qjB0Dv9dH9(eYy`HN#1m0Sc8ZeCXY>VI`)&KQC{nU<|F45 zW-m(r0C<}O)7dJ%Ss~net25t`=Q?B0u+vwK1 z8B^;qb+$K+PDi$0MlY~akM$9X;jb~6qDUjAq-v5o6tYONXM<76TK_n6-5V!WHoMS> zlAh(%$xs`m)XA(BAxJeZ;R8Tz$v7XoWu+L@XJ_PA_$0jirIMVJq1e!F-&4^0ihjk( zR-98TO`Y2Wd?EcljGiI3sFZ%Cv(gXp)1bpp*X=ojjm=PP?8idhEBi= z;Wt+pvI%ZXpiU+urNIkLKAQ!khRKi4xH!Cb7H1#S)b!U|##H|)X28TUFf_JaUpN@$ zgD;>G>Q09%V8qsr%g%=7Xd>-*I3@HE!$LTOpi+nyQMPcvODCQepaK zsa(*2GjNo~&PmUG-ALM}MWR=mi-b^&vu&wgdR;(gg8mI}A(0h}d4@lQyiM0=Je3PL zEHFr6x7|0C$neR4<~(hn;rGjLcU>!p&3wat1ar8yi5i6lbzdohARk`cO@-?NCH%SD zNmgzijTv%nwlAuA1A`C1*!(|o?AheiPK**jj85f|00$CVrrev{q?A zJ6J0iu_ifONoLTUoBztJc%;y3vTZUlttR7^Bwm{D+*qj_UTFrl+)b>Tev%yJieewNdeS6gXq>;Y$;iN4(nZb}~RS9@JO|AY6;zdlTStbOi@p8fkc6F~bRkw;T7c0i)^ z&%L0zB8CYYx5Q#M-a#*{=fG$6<=G_BB36lO#5#^NvD(t!7+(vWYUcLR-N8)iXJcFK zSXm$=)pQC0A4jpF3<%iK=f7p7*5leQ^|x0{_Ad7v)rp_SVSG7x3m|xNSc&HNwUnhP zISrt$FJlNW_Z@vYk7$=bM*ab^(V>UTu zIB-pDYs1oF)3P3 zx$rUzA~0sywu<$_7pT^f>*_$>!ZAj07gbA$uRe>6CS;;ih&R@`H1FAt7S^m zFeo4NYp@7X5vSZvrz)CRFw}W_gs*4Q3J2txm^qPZVd)#ir;D`wI{}13ky&iVV6`Y7 zuwEbv>10<56Rsf<;bxF4^0zqw6k z^1EL@e}#O4c~%VHHpXNYS&;ec=5kRM>chI7tAQ5j<>g)*N?6ZqspsSA869GKylT*r z8FZ~?A9UB{?^@{w!)%;3X7va8RLtT&9ki0V`O|)kMu1+M!`my&D68RY!DhZ=SHj0a ziSFjA2GiB5m`N8c;^%R8YKLp%97E5Nc4NM45~dI(k1Sn!<@fGsL@XpdI+R=#@g$N0 zS6_*FtG2T%!=4)1orwK%wis37p3n!*B}omnF^YHY)%vOm*mxeU$82LSmi5Q0khrt7{rtdcNlrIFczl~(PT+(dR@OmSdUOpXRQ24rfZdPL(g4xm?rhfLQ?dr&nY+E= zbNkKBe$6w5{hsb-nV-?Wey#`P)OAZ|6#e}BBaVbF1qqNE zN;x(WaeD8)+m8ByRfRk+K@wZj6NojVe2&EM-;+B~Qd0*YlajYL5MEXRG2ok@cdY}V z$NtPh>QTl2+saN?9q4mXK%rMeMaJi00(**jvdIAr|1{P|xIOxh{*-)|JU7j_T!N0G zHURv2*IO6*ftie0UAc;cTqfpwzaF-ti1wrK?-ckLwA3_d0P0uJZ*itAQ<5 z%rkwz+!}(}dRz4XP)n)))wNf>M>x&j@zPPq!`off^T*8CaX6cI9UM}Zn;t(%X>JW@ zyG43Je^V$;q?4+<%x+3^VE!~PZm2Fhcl+;$0EUu8v$d5Eks$@H89(0O9JC(|V!x53 zPT0oHfZV8J=%Kkap?eO4jIt!`Fn~b1y8_JfX;8{$MkajwoOv&Jg@oi(EUtBDuh^D2 zW(i~VF&%tCCJ9Gn0zMx~2WkhTb&r!$+~la0MexPjddatv>UO5|Br{4>wijDrL-nQb z^bez6OxX63NCR+O=ybp)JkxV{H~jDTq4rIH@8VzrZJ*Ud(F$@2=>@!oc2j}Slj1Nv zR|X{zt5E7Sd5s>!1s^4T*a?jn*O(<`p`Dr7h?(7dPg=}cYNRSdaR8XX#7SD!SkBQ< z723>+LTA!^)WB9&Jx@%xfM^h;+4An!+wqg+5W9gt9EP6(bX{k|HFV~9a;8j9naqj94iZ!71t{HC?8lR8wf4vZ z>TX~1zYh`7Sqdj@plKmo5(C@LGF2-V4K>-N@=`Sp8k}+h&;B6kwf178p2?NimVPE4 z;{%@8km=yjdyBVlq|943jdBn1Mkp3BA>$n=xlc1g`>-Vjwan z3^@O?kf_>zy3n)7^rK@~lSUWBN!KoJhFql4_c!x`x)%zYoNJ>Bx-s3?FPaD>g=$WL zlYi=1&vgq_rwi8){_h?DHR|JFx=xVCf4pm6;0t%+J9}0bBdoNPz5EuI2{yfhA8@QU z3huUvC3WLvyS(*p8H(Im#kJrTIW3TXA5i;k`*?(s(ehkKY@=!HXqJL;#a^0nx!~5J zgS_QIIBz7iVCK@JR3rLvx&9K>?{jski4eDpi-1rTno2H^U!`$hQP&|axN^b97g>;BS~h+1i-nxI zauqR`GUzC#oECfA1UoKElxaO+oT(bSq2pjFMDru2lorcZ+}IPQvA^<%9Fe5V>=k+K zM!der(?o}GP6L-yMrrY9bqtH*Y)KJ%9=GFOBAIsYhSzendmqgJ-SM=E<=M9=O${p? z5v$G!%dxe<|J=4^^tbDPgCYzq6r_c!=Q&n3=Ti%F&~e|IB+|}P%=qnAcAjslmOa{v zDa#|*Lxo%Vd|S>#TcKERrofD-ju!d=PpR2EB{G!6vr>U{M=Nzn0M^bcQ$1S)UkJm{ zv?b=nuHRsMu7p#jeC(qkv1ay(&Jqt3X@#dfzT2-b5KRJ-{(k%dWtX_jWAK;xbb+9R z{FSDf+QSc}O1GSwg9A=OyDl#&cdjnU>wdGel42nKTeaVaF{MM*@nd^o(Q#|dxqWqQ zkT1Tz4i1hm)ZQryrcG&Gg3Qv2L?R?)yNXdgBR8r10-g^Ie?UBb%{slcJ#izVq{OY8 z(Q%PeI3(c7Ysn#yW6ldDbN|0N}d3ukyE-juofT<3&SjGQp$7s)#XklyuVeIWtc zgjd?cA7LpQ&46W zj`H_khiz;t6LR#gh*Bu`u04i!HE<2PF@?rQDqW51&J29Ei_Yjp)<1~sYBe&WP9VK_ zx6PEe)gGLcK=vXqaCzt%iobXmiCNK7)!1_2bA)l)3BUefOD!le^hBR^P-S%!tvy4RTEP^*YM!jZg&8?=TI z6=J3-*e}CMyC{xZ%VzBIcf*l*_cm`Nj)=Kclb;oD;qrwh|UaD28963{E8elt>fdR}_a&5juXP59r8SaS5-g;xj-NW9L7OWCB zu`|zQE4;61=EYZs?4<%`(iGhLYUE%%Tnmket*=avBi}>v@FFk~7;i19`)H9|mc~wJ z2weprTr{|06Xwzg?H)muv{X}C36xoksP%78U07MYB8}J$_pvind~N3G z;t6qsI4zE!5qJ%$LQgexwe}c;5+xqJ7xxuElp|EL38R(?um4IcqygM=t9Up z4j`<KXE4(h|-w_7+kIyksE&oF;#M6{3erHuTJqdoiJ*Bjg5RZ2*eg8lWmCkY$txek1-@=aQr{0ydORhx>R;N}IE`*LKD(Bf^ zBiPAg;wx`})iP2&5w9YH>J6!>XBwqt9bSVImWQngt7k01fPVsjwL;hgkH9j)UW@O^ zCZsRijUlbHutnG)ZtFitUT01PyE}CA_0IMK>4MKz4<~1OR@D(#m#C;$d)4`R>*ifM zr)%HG!>k~sk{CER7()i`yAd_qrY@Q$0tpy0vg>U?jUXXsq67ckn`T556df%UYsRMt_OgAV~%FBXq4n7F3m z9u>yhlKv-GRrd1q=A%_?C5bRV5NRyyNRmt~CJQTrr`%AV<@E3M2B9;B4{XW~8W2)S z76FiF*k0ND{1&IFM`ZelE2A%0-+Y^2OkFSDoL8RBR<#)c59*Xmd* z?W_01&45(EqAo`tXREI2HD5N(RAN;8ic%}X8$~#=bB@S?`Wgm%g7UofO9Y3x=%h>v^bt&$BE?48tV}c` zy#f1mLo33xMQ<%*ArF#ogRD2lD~_`FpDK3q-Z6LYyvhwOux*68+ZZbth3T_ti@KpW zGAwqZD2m!@eSGKk@ta=F!Y-YlJ(#PjrvT%KIkL26(V;0|><=2=thS!ixN8ex{8w>| z59N$u6M{SLn`{ocv`N*dto92Jr1Z6wps|eaQGo{bw`b@bsnyv$Nn?rggr>66R)+pw zW&h15)nna!p^W8X5KLdY+E%K-I#r)cuHf0)eK4jP#BIzmT_2DAgvkzK1WeAXR{DPY z=y-E~W0g~Mu01=odfF0DK3!#VEQt%>-OFAttHV>BT+N1OmqnNxxl{q~m4$(0KRt{eYbs;I8Uz*35p5M)31+E#@z2?T7{OrXh>d ziD@p`lY|9=b+t*mgYj5s9c!W$x=Uc{KLNlJVNnLEi&(ZcwKZUASUWTk^Z)Vz;{Gwh znxN#|U?>}jut`}{Etn)ed6IFX>Dtqt-Jqh1icdm;nM^J(nacZ`TSKHGJ!leaKS5>m z2}Q6^Fv3!+FtMudq7X-Vvj*nwDO6PhJO@>M9(>HY=!kPF1x}B{y;4S=c&nMr>kvAh zkQuNI#|&Fv<%D}g*hUkofBLL=97vQoZClz7m~d8#(M+l0ZZ zV;p>t;G(4Ws1tx6kBBrx85~3f2N5y3T32V|Sp!L(I7#{q$FcFNHHm}*U3cxihqE!o zOhzJrqjnfgQp1FPHW+Kl+mHeCn5`p>MGWcDP`3wgZgz>;YB5{Bs;gc*bCgg!s~B(# z9m0AVGB(>Uf6UpZXjYnchIA_XLSu>1A%qlS9(L})h3VMKq7nfM0W-XuzYWJ!-&n-F zhl#((A_a+9jMt%0F$#0daLLxr4rGGDRR`na9|efm#YsD71uX?+1cOAh91{=QY{2$E z^({=sS|yV%e?%=zsAaoNdbK8@C!seEalz z)m)9AM&Q-X1Q(<*Nx+8ztL?}lU;Mg8%5*Zx=fE_Ytp~cLD1`IWqX>f{JJzF(bLq3s_}6*ac}P!?d$Eji0;bwE>evat50T)!mF z49`WM`0d>toO3ytY0)!PhRa?h*DdvjI)(2!UR)DEHI1b@my2;%OKC?c93%(tXA=`5hwZ7` zF~j-6>G1`cRqw(dA}y10k7bmS;28)L_H4P*&=3`vte1#g!aMH~df=*{UZNsJqEGS< zwS%cdjDG(UfEFAIft5Ne5oXus62JjEbtCrFVy)`sE=`5ld&4rp6ZMkfdaC3$PZMun z-(HU|9u6Tbf&wE4qSfQXLv9QiB?Gw_mNjV52dK@}TN0~g2?J9R{oYE+Zs>czrK%Cpcq1mbI9Uya+2&ZZ)eNl#JXI1n`uQUg<(|-M zQkQIO;QU(*6lyZ06FPv42m~m~vo+oxZ1SJg3c2E#^vk^Bk0O6NQrd8jX9qg?RXuCr z>*8IatCiv~nPNh_h+tcCKX0VFM0H?mCzz-bNhAn4Gor!neekw5q9W#qM1HS}rafNZ3_}ZyxYLyXZNYG>NXjz1GU2 zr>_|~nO!01q%dxFtxUwgffP@-nK?EM2o5z-VgjbX;l-UUoe0FSw?Faymiu)ZS+U~z z-k|1-PEPuTchn#brG8j)-OjmPg+DdUH5?q+NxGZwrA6ceKG{)_^I!3iOi`TizPasgt>iqyiK z-yur!_)4>LP6>O=@!E? z{|(-5t^`AsmsVeK7uzDDANCd8^P0mWs=8*aLFl_^vU80# z9%o)l6gaYz;~l;JbDc{_@y*DC3Rgdj2rXtwqFa#uOHH^v1HS`NcrSL2p*<^AoMLU` zGS1mN`?3fb4QH%)B&yt9kdsF(C$Ta5$%;b3n(VeY*VlWV)eYj>60?J0Uaqb`+PD-B z64Zi35*&j%$L_;z|(Zs=K?Jwf%l z_&a1G%2P|wmi9gCn>5GjOvucHs(UMg;rXJ%E_Exh|8fBM#)&#G$tI?L6g~azW$NP1 z@a$m0!I2yNdlFrzkqZm(oAKA%m@PZ#gl8umiNkm6|7nM|3`O>|96yCUgF+@u|6PGd zs5M{$NDMo!w-bgf!m@?j8x+4R|7ZB?&|cTJxemR!Ao(oX$0eJO8jns(AHARAIG(4= zQo(EV<1;E|y4>C@(QYfeFm^R)jC;7hYyfn(4e>@uL`Rz%GGv}CGBsqSHu~5IBm8!u)}88O60S+-X9MxEI|N+sn8i;om!|S=^_??K*Wv!a04zzGBoe~iXPsJ!eXj+I81s@u247M$xkF&-bRZ`s)nJUvMtgNHJOoXxh!!dZ@sfBvJOm(&H)~|msrJF zG{e877yT*NBvgOxwwEN1-}J?_Z5;VZFrjdfzW}T0Z-vzzr>FZf89LGX{VgP4vJDu& zII=kAX(_+=(3uYLJAwQE{pgW|fGMasf=lf?EC*}k2f`ck+4;TRXzNyy+#>egCWk;a zklN5P4*vUi{Qh3Kk35boqt(GaAJXsdh7XLTsx6qZ4v-T%GSlJnnEh1}(K!-$>k%D4M zvP5v+woDUsar_N0drNz>+JGE?Np2ntME}u;;rMt8m;zjr2W&w}kEM zgBvHAvIYBQ>_Dk=UxF_&&hqf8aWjHl2$V|uU!3g5)(PAck9D@`IK^}-9g!JRcd`ri zr&*eVm#Y0xp+}P^Pq%7lKdDSTevwMeKeaX=lWqwM9RA1il8||!aJukiS5i7>E9ddD zaKp%9sp5Wl_D9vH4HxyV=0{Gi!N2UQg4$UGab#ni46+L*_t62<2I^FCl5*5ZNFa{M z*Rf+Nr;KTCVxnUJPncXRx}g$%=?PQ%s4lIVw%m2sfm>;)VVpQ(<>2sa0%$;*_8{=k zLRT(|8I`tjfHWso}G#>9DBKg%9{+M;=03UGXFYTwzQlZs zr2=+WjPK|HsAK<4Wa73O`pdCXEu)tpu71h!bkk&md7LsG>GE;j1-trB&6^Ne#%_&5 zP-NP(j3qD?Uq|cv-lxFHQJY0c{Eg|y&SNe( z$wiS-Isp5Ozzgj<0vxu@IH{)b~I2j@nd-m zB;rK1SJ>K(a(o^Jed;%Cl)Wb7+U3~uT?uj~n6#YBltu_&{?CCjQ%FPFs@GeGz={JM zw|Wi3x!A2sN+ni2ox5weOg7;9h^fjGCxXbCDBxDh&H>}XH}ftEadLYeB*B-H1u{9FN zTIjD%Xh@w=0~E7c>N4kzWhIp~4M(!Oi=EL14mD0NSLo3MO=*+&%Q?(N#>~`#$JSuB zfhc9UfWKh~M=;+r+H4!Mf=|wvkrsnIKbn1lvPz_w4~7bUA!giAD(gj&K$?b=CMeU; z(C*eyktZYHm~IOBrzmugK(&zeD)7PQo9wIQ+|Sq1!IdMGoU8xNhrfr)aK^5Hk1K8} zT@bKRkmA9UpF`)3(s~NAn&Cp&OD`-ZTjAH3X$0}-p5Pu>kZfY|(NuKNkf)I%jT>|A zvfWx3=mA&M!^cKOnQW;T9~LXMNJx!5?-o5Zbj{~a@@=F^jd`T2De-4rZ2q3d;YFC!!KLPNCB0K%>Cb$XK3j|Aqks@m_s=~@~ zm;bjHsJU+ArHR(0{DqI*WZ>oo5s6_e5i#P7ik@uVvpm1A1U$bBr+QM~Q-M2o)fL#* z&~rw~G3ozG)tH)+T_PvbhUf^rm+1F<>g$U?V>g1?y+5Qa(DE)-i688}BOV*^0c1vQ z@XsjQn)OjG3A?47c~^kQd3dwjCSLdidCj<34N9)KRy_6E8VBWJd$v9WL4ifR_RAa` z)k<82xH9Cy`PdkyKTm7A{p0jOaaylXBeBBr&K!u{W0^lu+eYd9Jl|tXR;uR3Pa#%f z3RlKKG+rwMQE_H50$|XZlI$RLrjOW6!cz8{IlbdXx zHf8w}T5grB=O?7f z7JN)@s5X4WXem+157->oQMpGU8aV^ z$P`d&*#Ik9xP8bB_oLFVx?8Go)^9T$}35BQ*d+n88BI#L~REv0SdtlIp}aj?H5Y=9$Ec1hf}f~Obp5-EM4>J`cJKR)$VL=7iB)sczJ+q5Q7Uzz|a9_!q&H8E0^8rjM3pC%0@X13O3SJcu`@%OHIQ5f2dnM?sL;H z`q5dH<@m;pc%IssGz%q=%NT@kSBOXQ2?0<%~ zZn}s$H29EwsBxrO#LLxh6JF2h)TI_sR)LW(>mafzrs0D{4kLOk&G3pQ2I$i${=Nnu z&&{lBVeGdjZA6A$2X}xJcDsF|#_0qmYM?WBoU$vm0Ty{PpME(S{m7Vg;Qf34(}*$E2hINj#?<5HS6;*2cqiBS0u@x(*at+p((HaOW z-;&BJf^^0D_f^=jX$0gFQLj3qIYRFnWHsr)mwgCPd4ImrIZcj9oL%J*1Sv8e{1X6c zC{nlH#J^2&c@4x87Kj1f`LS2^CYJiLSHRq$P*x@?Iz7txGy{z4FkH6p0L}*OSSBJH z0h1xrjAF z^!3{F3n1-QXizzEi7mtDX+@?M%qsqz!a82mF0aOG`X?&;h%kAhNQ0r#BS+2T}-hkr@RnQZ34psLvwCz0dVD$lraZ!7Go^wnjOu#%+A0_aq!lYwei+F%a z_J5KWntPzlvQ7JUO%E&vRn??opTRY+I5Vp;&p^2r_%&p@^zcITpHAY+?`@`yg-Jz|pQH zcfCc-rnRqGPaYMw3ls)5Fg=8h>G?r$p0fMIhaNNGt zdvX<=xToCFSUKRMDynSd%l!55D(i3M3RQ!p^1Xf5JF70@@v?g328X|w{V_mO#f=3C zg-`9aMn9Zv6;mV3O!AFeE?eI2Leb=qB2sXjwMj5p>> zCrfRnHiZ-@5Uq)KQTHlA+qRYw@w>{YuBUN^qLM(zQtZ=G4wtZiw2`@pZquY!R`v=S z!h`>>bdkS6Nu?@0H&eI!>T`l$y##@NGxt7$U~TBZD$AMqKLHrRp_sn^Uqn(;_5^GO zu<*IT)BM*8(YJ@5)zq2q*jXte`7nKS(T}2>>6;X?^fmdSzg&W6T5@iQOviH)=5Uc$ z>V#hl5AE1y!FlQyx`H8Rhuyi<`QyWT2+T1hMk zFBdAl3ql|%+|%l}DuT=%!xL3IL&qv*k0s2+;!~2xkUI$5BAQ;fIUSBx0j51)l8Cvw zvXb;~NJ1X+xG|d+?ZM*~{+Vfe(OGHfg*0iaC7ncel}4;KS9PlF&dilE9MPN;_KNO8 zI%aPl4}Llx%d+3UelxD^Ua|S;-u6&=WguzWdUIUT>zgq?v)&HdW#YIf{n6DTyQzd!IG#>)s>(aeCMMD(HMLVEA=y@vNMhBD^MxidrK9e6~}p z1cAC{z9{7(G;r{^h-+`kGO~a#iYI+72nRERZ4wVSp_=gi63VMXq79p+sOA@fOOBMB=#}h!QHRvleON*=)#b1$uu_S*^pz?Kbzuv-?5n~oS7-z<#csB z2DB=PQcT>3JY_P2Ll^$c(1Oku{s{m#6e&y}@b3gjocP~fAa&LM=>;;aKJK0Ri74WY~9dS=_EKbz(jQ3leF+Bz|6Q6Yph;&}#4p{S!e ztI}iCABJSL5^c_WQmQJ|rzUNw)C2_Q0DOLWg8D4Iq|c5?_I&CjfkI|MIPH1q)fxh7 zj{>zMeW3^Lx)~XMZGj0XjMF5ri{pm!(gLT#gW)d z$%n^-=4qqXF&IlDVy?SmB2X%UYSm~lc6}${MoQ(9UPcwPZn23}UYB~=na6Qct;@Bb z)BwVVFD1%Ts94Lv>Cm^U79>KjPr!;$$vv27@RIGW#@^agD?dAYU)O8Bl$r3t;Y2UI zkw&KS3SiC~8=VyJ`0r;>mqq5OIgp-2$k6Vy7skdVX&_>%iiNw{rfbwxVq~vxroilS z(9#olx)+C@s?j&4ahZ#%ZO?VATKO#Ys-f1mD{Xgp@6Q~7&r>1htHvbGL90{R(U-}B zKr91vBtF-pdNG4Bg^MfmZk7GolmP?Iyf7_Y>+Si9zDzOw;&pA?G$vA+35drvH7HLT zD`PvAIFsAtfHw^(?a!P~UlPOjN|Icd=MKYRe3jZgJowHIZ11Iz<2TR^8j zizZ%YE`-D2VPE}TWdzlwKr8$|>5b5GU8W^zJ*`+iSEzmQsWKJocu#n_2#HX5gxZuo z)rl=OvGMy4F*`f2{wd`_)w4q7re2<~H<1>4JI*vRu{n-JPqa>i(#9MG_!6ltMl9UF z-Y94T9SkB0K4?u8XSt&6PP+by**^XBVFdD@^{b#7MEGnGg3LxB5>Oi!{rAq_Kvz=F z=9u9zr0KO1t}hCQ#K%7ELA-vbRtBVG$JYh4kGm8%$q!yd-?+C5R&@HW$6pIJg}d*o z`p~}L8b@(Pz3CB=Lu=c>y<;I!WQij|uM)RBWr9k9nuI2cv`d5j(3Mk>FR{c?C!qhv zP3k=uG{{q@n|hz)`o0nyY#1YV2`eP8Wgo=lT7Mj9aF316Y%(HW67w$(P+M&%=^6?? zz6utVj2jfDaXSW@Jw4a=x~To~`}ECxob$za(PRI6WIKk#g4KL0tYT`9OC*$3bmz=oX9Hg{9-4vdD(v}CG+qoj|&+UR^`^} zEvb#3G(Q&Uu(lZ&4S;t^^MVkp^ZH8ru3#;jn| zU$X`R#@pory;_p8c*MZzwqd900LAol!y)Dq9p!_n*(5t?+tF;PyAjXF8^vT975}ry zLwyR7q%F52{s5`Fc0y)|+sn+?>2{IEZ_f#$pEa;gq087Xx1=zoE2>{EXStl)@d zehmSUamW&;BwGnNRJk|4V@xxbQb}|ct{Ac6NKd6#6u}{JS1}p3-uWj0mQZ99TQx~o zBCK}86azK{6aQ6Z{YQwIgV_DELlgOHTY^dy_;sUD(1i_h1hCvDg!H*eY@UyjoEgfF ze-kh+k(KY}I28Nj@NM(eojPmfuqMh^l-6qWb___qy**BxKfk^GdYbjB56L~BJ2Jb_ z+J4)r|1`?`th^nB4yyv*OoQJTrZqOx{Vf`xbnrvnGREDae*V9;2yr@65=!Qkg;I7U zXtiv;ra5{F77j5b4P?z)Ey&Sl<<8Uy5#&KK7731Xm8yVK6JTlG1hPnJo5YTNKN?oS zrHEr~M=T#|WKqk}KghNJJeX?&HOx;?a4V;CD$k6Z_55;lMJjvEIjmuT;Bk+7tdySGK~5(YDR*#DM;8*#6DnMQC5_A1!ENqoP%{`t4Xgtr*_i_}E7+H5f(2^zvAX&{$a6?T(-2B}bv9 zNN^{Nf>zQJ1sc^frsiy(2OWG_WX41eD0D$!Xhf3n63hEpd#osD$bIg*2q+-1;4FF z!}7n&I>jPum?^c-O7ZH)Eo1rFOF-LJS4wKC+?tq1oVOnh_LQ?a&g~-`LKIH}dmX|Y z4=w62uDBBF;6O;)cTszRs9jE)F3(yZ_oD!x*|4F2c>m;V{PAA7pL9L6!_4W=SdB~} zcL*5&Fo{H?Rl9o%@Jrmu0+32SJ;Tubi}arWL_?7$t;S$(P@AT6c5YZL3Yl9AEo=su zC}+1jg$==V7hk+JLTfH<`K>(cD#T%wHxOTPZm!;{b1k?3-xq_%IzvJt&8OCHg5Lsi zs`@vD3w||-|9Jc%0fbi5Um)(Z(;5+dn`zp3+vac1WiHRtT7kpQy3v)@S6`H{eJps_ z%DJC{Mr_=Gzs*EWja#>F%I`vahkw_U(=&qb(e-NwRMJ>S>k54Rrsa$&-F|e^TTq}3-Wwp&|X)U z3vH?-!g&d5f}Y2y&Aj(@nU7`}Prvlr2k!!8TY`&nKXsw9Xxfe&d85YN$NZW zZWw8`9ThKB7n5;Y^=b-mUFr|~?3(wrc@QC}u*B-2|8Mh3`@iY3b+Y3u5mi>(-Bd_s zno7{r8TNbWoHcW+7O9xOXFvA$9XmX9LikNb=<3a-tc-!IP**EigsSrdjRq@nZJR{r ztj4EgLrcatMeky78(ju&-*I&00(l|8q{gU#r|#cs^-DhQOlQ`Tdf#r7UH=s%h=t?| zyR7)lV!@4|pkVs@oSbjQ=by%3F1LSto4p_YEv=c(adhxj`~1y@+0@Ssu$h8@bk;_q zOy~#d)b=`|HQ*jW)gdTvVYiK$B~Dx)HL~9wB!8U{ybB49H7kfu_ z_L0zg9;U>A$0dr)#q13~lA{)sukXoilAFW^5%d3 zspf-Y(nvsfPa%$U0;UU#u&zma2&7GLWG$=WFsW7&Nexdp6f-4aDR8t9TozfYGT@gX z<1m7n3mLc`%kHlD$5aNf=xJ%3^Y|{h6Q563?UW&+@RbB>U{-1 zB!%_C(2b*Hb#7YR=Iu<)xFN8@XVCCU0dH3F;vqo+$c#A40GnWF<9s|pOs-j+(2+p@5T`()uq>Hw8?Dl zk%yg~1rP3#2_!KCmQ9hp4r3TVyVJ-gK|hcuit`F(=HwS_ndMHny&vFzrm)#OM&43+ zW=k*pK9(Cux%M|j_rEouBdv&cFFOdN_T49vK~YNqRKXgDgL}2>x^wMyWc5s@yY%!| z==~?#!eh2Ox8HwR)*qIq7wc)>^9OzmUe7TXYSVIYJZ&-4F|WDx?KN*ZzI_Pp432F! z^DN#^GY7+sMKh|K>ObJx9O_AAgV_lgMNEe)PC^nlBDrYoc%-ziJx)%NiNET@+}PX=M7dljgqzn|@~W7^by4dz1nyf&3_)FP(ev`Wr0T2`qC=f-Q%d`K8c(wPSa$zp!<#*!YbB_YWOi7<__D()8K^O2ig0pK?f z%i>!0XdcL=(duTrSp@a+uCUdaCVwwN!ZG?HyYd{;F2Pd#eshyVFWr^ln^#}=+gqSq z&N`T7vkPvHb-1IY*7SGPSL~%st)`K?0q0cvSX}0+vvy$_y>pQJAK;K5 zOD)Ry%wmjQ#3_`PK_<-yN>k`Nb*336tS2h$%i%+#cl%;TF4Z&Mh5K^s6nYmpDDI3 z3==wR2`$7-e$P|=zPeuC@n~!!Vjb52?^T!?!~(9|@bz5cet?e)$#D`OQc1_MiB>C4 ziSs@hsbnN`b$8Z;ca)QcW@7pxivl>&T8u%^K zeT33_YH$>K@aWhneKUxxA~OYoGG?haysYJ=c3IEMuZ&H==iwc|iW{UU%EeJu*yOxI z!A#PAbvD^m4T!iM1`WH%=ekABfU!+(Crv!KC5EGwg>g7|nCv4Eg_vJ2_yx`=5;tzd z{Okpl5Dthm5OAKMH=Th+&i_Oz5+MW*hvy%)!}lA$JwFi%{i%7<+atk+m;x_ zB%%Fw8=O4Vi9nP=r&Pw3QCnsZquoW#=Um5BJ${K3svtrx3_3nKChN~E;r;zGovmpi zrKM)|T+!3~ysSo;0s=kic2X0knQMJ<%r15B1I2hCSkVlctV54%|D{$hZ7vAf#BUBS zN#@nC^z$F&C@%}zja;7#$Nm58KmX5v$k2W63VL@witu3q?=0qdPx`10if9%Z(WKpK zUv#4^V65#pusmWneH7`oNhVrZ2`VVtqmGwKB|qUnq_LVcp|#9GN(iX3cc3nnXJ6X* ztlH7fz&1I8r1T4so`p2zQ24H%=F7Nt%SC#L>&)~88Zm*E5#hEN2Q{ubEi18Op^xBf z=8z(B>zHw|MvHPUm98wm^jo3Fbf078&9lIA`;&u%AH?YpLMkz2bO1HE@nV;R6mSmJ zwA$tEArG+p695d7*Ya*0d|~U<;QWsg=}P(enE=KK9`x+nQ;%-yB$p6HyQzbMje5Ns z5-N#_V;fSYZN+tcGW}1g1v%=y4%2M{o-Mj~Kwix6;N2lcJlbh>L?_v|HNL+q)2Rvb zJkiwcwwaODG%l%7&@_m1N|enlM@UkV#k_h`z5<1}FE<0aMT{8h;wF`%GHB^Du@>rR z$o>yWXW18J|MX!%knZm8?heVNVd>7L7ilD=Vd-4Db1CUYk?!tNx|K#sZ?6CS2F_>S z&&=A8vKE__)UUL-_H`+hV+?bzE8%!L+e@JXGC)9>7+NEs#fQ#GpQ;rKrq} z+K*=|v;<4YDDWZuS+1d|Xm_vsB345)oP5au5M9Fn0n~ZF>H&Ne98Md zfCDV(Nw!3g{o@0;`)_{Gs~|I6xZ= z>*0b;Hl$82FRhw^Ube4VsAvY)qh3cQY;d_RZ@BU^yAJx0=}DNwpNOX+kbPqEC{oh{ zkC(K>BiKKzKUqSgS3WLr=_CQ$Mo;2u9Dg*|1YucnZ!x-7s^MjfT)`$2OMnGzEw;^! zvou0%&Z174;8ZqEMeGoSW+B~;_K{a$%HHx6^y6U5)koZXS+XSByi7QL+$!tadRyzH z%QvSpx7XR<*(#pD1OeO%HI9kGD!SL?H@qQmfefS-dpQVU>=_-ug+^hB!XmvCy-V5N zFhtosF;ljrm55ZA7ESfCE2HjrbL)G+(PIa#e0J!-%`!$zI~kuVC!?~za6d&3Od`Z+^Ah_lUuxTCnSV%miNi+{pqEmj#a4#6o@$c^{MX6DlcXyQo#VE(ph7Pzt zwTJiwne7TZi4Lr0cNX9jp>C~Ob(%eK&^R!nN_c`xY_?+ALk^!m*|QIUbF z^x74ebS0}te{W9m0H;_xpQSEr6m=teTPDvhzDcb?XP&;Dzf3>(rvF&0IGnZ%oIX7% zj6*}|O@Gm7`?~!29u5g!zC2`_;9ELdO<#k~)Ojq|?Pk0*Uc*ag0Nx-1sckTulsG3E zL^U-@>G0ULrjA|ruYMKNvblMfuE9QZ(?y)$rGNqM`_8W0_wd$V)J;Z=H(%goF8>M< zv^YIJO?y37kxNSebUB+oU951^k?`rbb)|G=el(1gd&=pV6X}#oh302b8TR#E9&~t( zt+W39=qy%nSji6M*^2?Xvi$i+(k-z$Ikc+4st;F^=x6cFBW$klW3~^7DClAxLdMns zLsy2&i+}<$Z^!FG_l{5x@^Liu7nRfn^tqaDy;_v9QrFODl9M`KM@j|#Zhv%h-*$l-Im1#|Z5{4;8)i0_TA43|FuQPd7*2!=44ltRoM}Q885`F8w?5Lp zPZ3!32Zg%p@~RN13?@4wUzvT-`I>J0`$==chy65^)I+N(^;nrp&Rj&sIQDBEpWj5Z zQ8bF%GHbF}c0`+v$|7EVH_tqql5mOcTyt_Ybow4K6C8fIqwSA)P6!V>dB%uQQ8zR6 z%I?q?J}947bZ6fQ&bJw6e}5k2=qRV(-E#vS{?(clJQw`;Zq0n6)41w+#K>c7xwZE7 zn#)p(i&_T>0b9T*lG*7;XaD%EmYy(ByYnmE;O(($8gPH`=NdqBVbc~L)n<`|6OWuL zD^I9jc7;AzS_R5L$W5&pE&qPMqx*aeZxj&6rq*t;Dq)*AI$a=Jwp%@In0ON2powMwgq1 zmD$-Fn-}NBOpAY^*8Li#X9#5qKZva#ms=TGI9y0N8dr&@-&A)DI;=lHJw=OgJPk@7 zeto7hA@v>{$WM}H;|H;=HyOSx??p^uopB$p@a=?0t6Gm%#G74kwlRtv5@ZgWL12b8 z+foGrvexdv7c*Wivm2!^x8}PG15l}!A4~vkZhfuXs2*did&9#Yak1#YAvi?iK45mzwt5~XY z+JLpAaK_x+8e>0dA#7+J?1Ctp@Ta+(ffQ5HWik-^WQC)1HblK7@<4vx6QrU#?3{`c z9e2O@Xqv#c-C}nA;t5 zlId7+olDj_MVs}Pk7hBO0!_`6Z(Hm{W6)A<`&4+W2sgOomLnmK9n;YD74xa%gl^q7 zsZ7Zgk(t2r!z7(}Qjn@5^^wyKd%eLs>=L(zvq|N0^qGvVyS4TCSp&~6;(o2h9`T-@ zl=V&0P0+u;zWwv(*$8O(rxzn6!Xy>!W4FQ2J=Z}uvjTn<&H973NiLqz5>}TjlF2_p z=u5VxKSS`@45*9Pba~q-igdz6^NGuzAK!o8Jw7wfLAw{{#h`kz?gWWGZIt|UuvD)y z-yku^r*DABA({tNIxQctA3pGD9D-?w?%okBB;4N6UX69%^6YZ57VpGNH#t4p-=Qs9 zZosuuZ(JUPH@>8b3r*1P1~3~BKoFEz1j}krhnw!JtB+inO@&>*ytWM|0j?Mo-HvaDpjaIKCL!n8)Z8(8D!~*t|E_i z@>j~JfBu`1z_2oWb$JWNg{kIYR}3$Q+rSL->%C$+D5pntx= zY(0sFHFCy)H=G}(uqM%6-PiJCw!Kg6eaXYi8wgLu^=;ayg#FIHVN7#UM|5mpZ(EHb zX%X(ov7x-%#Wk&NJIlaR@-~omQ!}@zaIhtsAr??EZ}2ns*Aq2W4igZFX0(wn3v(J6 zsI+MO^u6pXFgW5!(1V}DU%w>bKviY7StlaX{F7==vxy)*3yEd}rih*dUuSnx-R|-t;{^vEcj|O94l-kXrl%WR{+QX?enIRDBzG zGCN79t!NZ2Q)Z9`Qm6DU8}w9fBfxf)BtA*Oi{;}OT>sT>M|%N_IHXzB&)5pQEBul9 zSor&?@abQdu9*>TskE38D!JJ9U8$5fuu`usML#%%@LxoJAHXjSl&H2}YZ5~w zju5jc7Tipc+)jhLf8*~x40q^-6%!*xbRqOYJGjd zpJ7ykc0G<$ub*4rzJ_Egz0GsAW&XgDMr#}_nO%D91a;~m`)$+S1$?Jm*C#7OE6&CHz+Rh^ zLGW2Le2}D}dYt=tO<(p`G8|gCCz@0}m0*;*@KQNnyWfkCp$)cSQ4LzEX_A3Fk$}LU zxrdw{^82M3EJ8Wus#(i|@s2-Gx-NXrw1QpMO~Mm>L(yK#wk?1KO#~Z+%#1pfiY1}V zAO{LNiq%|fX)P^N*%lWO6W6FpwzJ24576kf)-Y1uZ6PRK3wHTa0!-aeElEjXo8Kz=$?-PQ40cSkctm|B`RYI!W<2nP=nm0hj!m-Hm;g(ROOIO2CN+z^i5qtv=wHO_UU^4QF zsDwsu5XeiAkoqVfZ#Y_qk^UYNNMxMq1Na0?Fm$aBcWZLFeM(msVqJ&>u<~4Ag0eJl zBgEZuxXJZZHQW;J+_RsDp%KirDx_`p^JMli2+2#TbXf!RNJA<^f?m{0IT`;x?tOqm z0ieE<%6LPtYl~@7GSsIIf;HuT@jEPH{Op@1XW5LU&X9NBNVgc4rp?~h%z+%Rj9X7( zaM3ZiB4CGwSo(P*le6*ceYm!U4=L*7HUt6(szNt#$I)@ubV@$()DcW%64K-1a~b~B zlOe5;pO+yQq2tinSY<|2mR|)45y@5)Ek;%-e%FmzusfJg$e0kSF%Gli*ooMjbU0^4 z*VdeZD<2M5Wv4JA;h^JiRc-4Z`kBqg@b!U4g&lW&qw8QkaSD`a<_(M-Vls9?N*5Q6APe>rX75}8Qi}{+udzPi&Kt) zL|;(UvH1@;3t16sXPE^xr=>NsU_?&QQ=3!NYO)Gw1L=sy&n6>^YmZ{bjf1wmL5VBv z6rHxe3+jq*zR9mJOYFSheIxZ5&*1XbfqKHod)60N@T8l%$#lECU2EIEp($K68*e$s zwL&=!9D_WTy14K2je8SUz=>ef&o-#7xEjJ_;0A>Mae>~9_HbHbClFPKd?!?iH%Azb zsNCBw5N3%440L;2-r9KCb$r~OLWQql`=B9T#;mUH)>}-2k=S4dg40T63fqzkmE-lZ zTHSSkES zG+yyb#U!Rh5& zFrdX)Uy?yy(~NBJc#I^iV4OdpMoW9DS?E=GcLHiwWI6C*|M*ujF^}34d|&SzStIX` zFH^$uW{`#1hrv{EOP;b20xbL2Oc}4x4Bt~5d4%YA4&AGwJR>f??o@3Uw(+7Xb_J$g z`8QmvMVC_{lKzNxq423jLPaqnE(fiY4+>Vu?|2Q?Nxro*?h z<|!S;W^JN_wgpEwN#sTwM#2QeVynU2S#pp?^#*i)(XW2&*UnAuRj- z@MI#b5P^(HH>6}&%P@T(fEH2Pm7pGI1%H;Q&48zY+VrKvnCT*$IDB^!s=!ughu4*9 z?AY&-5fE2=gqP|ntq|kf;-9TL6ar5kUKCS=V9GfNU(tcWua?;9m3-4Ouvx@_03U+Z z31{qrl+Q((8dnz$CK?NzyNtzL=Mj?#tbc{-m7~2!a=&dK=(a!FufTfqI%FqaG~>gj%NK6|)4^m%V)AZkh}C2<$xCV&N8+U}knWxGBd-s!d`7dP&rrH8|XG z4tM(L{gHpjlqQQYxEUj6bos9ZQiFSc^;QAYY}~ezR-tcXIHFGV|4i{=%U|{#qZ=Eh zktbAVzmW6twW8zMm^aEAL%P1Ydyb@VTT+ZC_pHXAEI1Zhr-_fQ@Uh zXTTo|Tq8nLA1O&5HjX_Cj^2<#9pWDlW1EH%dqIeBX*&(IK3UIg=VrC+kUmpvo681L zI>aq8cyuqH3Z+liO0+JTkSo#BQkV^U)TL#?lz5O0?97@t|Ba%~WJ+jXEUg#kC$W}NsP7s95>Aqw zMml94uUIg>g9ASg^$fj7Z}zaFLgXzX3wujSwb!@Jc60OEH(auH4@e?pboEcL%ErB$ zkk}l~S7joo6&YSmm+QLh(zLj~qK~6;aLdxEj*&JfGh2am%hwTMlpe6ib`r*tn*90; znBHQHkByAilr}g{0bv^xmy|gs{xB^dFMl_uJhifuUbh$OhGI=FRZ?#qi`Mx))06g; z-F|(^I$YDKojza}yb-vjGw#KHAlSShPQ zS!U`qk7eGV^#Ex(1MTb5BpRE81=g(UM@}zy_es-apf|j!Lrnh{>lZuCNeVIX67k}% z8TwsKIg^urUuFWQx9!?49#4)mdv)vr_JvIrlRyw81w0i-I&cH!oMpAKbw1YSkEDV6 zi=q7(zSOX$IEY$8_y=1TG>na5^aVTA2^ureh8v~@nPf=O(-a{#C-1CUmSwhJ9Y#FE zZde(<;eP>OhC|}lQGSEtI^>;-O1vG#=;31Trri&m~4<6 z#C;J_Z3`Rs`KRDVOlPfJHL^tMD8(5t0WuPNxXMlV`U)JYwIXIZ*Pk~#DG8NcUjKMY0DQl zpIkI&k9tH)i)8gm)obbq6ziDV9^CV`p|m0A#oIBlxw&Aa-dc1i=#v~DCrZ|(7FfGD zorV2oCa)esHelm$+Kd%&d3;c0QtKys*^a4Re4Q35B`YCa zqVCOiBI|{j971~IX)1SniPK=GzPC?db&4h6)%_Mo6OI*tLM7sVnpD#eBv~Dm{{~@A z7^Lcw@gGSAw@B3*IVaepZ7|?#3kqF;pMHU z>1wMDdwny@pM%^qBO!Bd`(M^d)`AUr*hu1B_S9C|^QvN3r+dx%GvhElv0iOhx+H;J zMC{IU@K5%B5_xf)7zOID=muAl30oXO&!iVN$DKb<_Xg`Gv&n z@Zs4-prD}+$+jcP)A$e1#&hl9T*kNo75!@4JMu5ldGzEV@2^0nDtdSlXrw6^i#P;y zdsOHiY{J*f(sru4=Gs`9(Nf}_S}r}Brry>}e#2mG0})3}cq zMjg7P|DIvGt4TdQsb)NvO@fgs2r`}UC**?Bc_Wk#O=~N?b*?7LK3M}`OBaUdu~Wmu z=ID#89|i+Hk!>UK{+UajQ5H*w1Q;zYpc*-`pwknIG|Opg@cnX@RN(TvaYZ#&!8M}F~a ze#h6I2V*clzqC<~+V`LE$?%9Odf{36a#Nr^9Z`a_t}!~ijsx*i#%lIrY7RzHf4H#u z(n_VUM?ZH-N5epp66t{D0UIztlL`5EMS`MO`CXEp3eIgHZYxUqsQ^Fvu(i*pmh_(8 z;r(6G%raTEs=hLlUT*aCMUgzH`F8bfEjc0DRFW81Olue4+qj-inyV{SH5^Vb+0#E5-3(PmWg ztW6y(Qoo{;if!OeHMJ0tVA@cSb9gwNJCAZnE^^UL8J+u01pK9>oU4?mScapDLV0=1 zt@*-Co6F8R84Jm^H%HgCPx-Bg2}d!xF*fJ0PyC;sTdYkJroT~7F;G&tKeYunvXSn% zZI#wawNg{NuJt2Wc8TW?CQr2tuBg~mZHp-ujGPb)6JSzus;Nqg$N%dL6F!+e?8EahP=?stnLycSNNzf|2<>HE*tJLM2bo=rRSAD%u{60 zg00!Hm29qHmPdwQ?k}nc_~XQ1m4lAP+Rf*;jpzL2?Nt}}kS0^l#FdKNl7R ze>BRq>n8tp!#gQ(?_24Z?m-c+lgQCa`S(QG*IPeIO9qdL-M6=5OQkDidf`Ny^sunxAiamtx~xygVUaosde|&SYioBj_~OjbkfH zOna?^oF$2a^}T-$Cqz|3f{~V)^39n_EZ_=FXQSi-d^+X##{LE`(3L@Zx$8Pk=e{V9 za568aEpf1<@Sycelex+?X6T`tR^s!o1$&3O75ePvU`21TJ5R~ZmF%9|{ew#91?e@8 zPF=~<`Q^&(&B#oaf<@u1rfc!YQ+l1|E|pVhDQ$zU?~@PYk`Qi zXb*ol*hfX%gYmBuEj*8X%65&cX;yA=ybgp2?MmSj8~$>|c#0{a zG8Z7)Tw%jw8cK%d`Xy+#kqkSws^!iA16zv^dZY4_eD8?}HJB6VL^f#4M%Q^T@{Q7* zC-t>TV~`@*+4gK}a%^J&k-yEt0Y!=vzOfZMW%Jo=f*ZPNXvwfzTn`i_PA~mrLvulH zEE1vug7~rD8Qv~6->M^*yYcxo#@c85Ntp$UJ$wPi=6|jI3rg4 zm3O&>$UiWgRs_6T?{rZnkWh=_Gh9AI#31flSBRbUfCzX6{~)!^7U?$8-YeT4IHVf- zFNKdz;Sz~BhLnt!CDLWMxm+>#d)-= zHqPPVoZ2rh2`Jb3jUN@;=+@NlQ;j+BxZmuZp#r-Vj(kx0)0y}sBGWQ}P+1#M*TnFX z0x^nQc4-U^u8~%)G`EJ|z@K!g^yJyaHv7$-lU*kwj12AoER@zZ`4+9+SbWS(vMt`{!hhIR30zukA{)rc2MJ)wu*6L`c(ox zpEk()e*v(7L#7TM#OJng+t=&}d)o#z+8THhWL!*0eY2r_Yk>~VNkwc$_8!x)-s^!l!xrRjx3)Ke98lW_Xn7)_O&e!DTQL1 z#szcv`#^g*by>v?e!|pz^DJ+r8FIRkLUwYeO1)hS72cto$qByJw?FOzjf$V9*D`W_ z9B@4yez74V?q+vVbZ4JB0n(;V34B^NpC()j^znFOb4rgIX+|70niOpV=>JH4RvZ56 z{836c&N*P2*P`aI@ChjJct5Z;kgNGo%|d4z<94dOYVXKI_x(eN&OLiJ4Puc_Jhj^J zLTHz$28XvpfAOP)z8OZRb`;$Lx^cv;f3=IY=$eEH5Se$en}=XrJBm|@Kv!XlwkyZ> z^b7Op;?;>@?$56H@x?bX^;jG_DkXtgI!G>hY%E@||5@|9tUM@66EaSs93Ati#(QBH z?8pl}zFJ>+ceC3N_;e4fboq{HT}{s?X06|0p^55IeK@fiHhTB9vbxtq``i3Q&dlRu zn{nHh4WXq{?;H~*vJc9MYrXb{z{k(jO27ap&z0i!)fu%xrBobr z8Tv_RnkUdSisiW0V)6N89w%k{Iz{RyaEAo46Nwac#lfe7$ueOaLV99@Lg|^B=UXoS z@X$d3{ynIoH|}a${>-@m=&XMl61}R&vkeoY3UbhKji%TeLNNDs8`P2qqMT| zEJ+_UTTiWG_;|ds@v4eJ}FKuC!wZMw4wIIgNTkb+xnRPE=W~at}q& zBID!rHQD%v30s8{{)V5eUfvSOi+*T=9a=cx8}L2lF$h!4gJ)M25dnh}Ta=fJ(P)bE zYw{J=8BQwxX-oeK#qHB&o3`lT;3=1gq5nyW`5l8k@+7&qRurtY28%624lFS7tdnVN z{5fE9d40PsQ*5K{*OvqHUZ2Tjy64v5sY*LhPtyOd0PjcqhwwGuRv|uSl{lWb>eH$- z*YYNmw8L!g-pFu&@RsN`7#0Oc3-YWKfhj(3pfBICe<0g6A{GQ<-CzU?aSuK z31nd-`Ukk4I*jCy!%E>47y(%dMHh!tIa&N~3pE}+u1;zd!au2H=KWxYfeh*naZl4O zO#^3DRc?)o_X$E6%0T805N_y(kjA@ASz=~n?NlpP%ujwc#Aw99v54b z=laa9=?~o|FL#DvCxwUwNkl_EdPXvGzaH@%uGXL3Dp1qG;Do&UOlO?d4>5CwnmINm zbG&IhqHLrw`l3W+ZOX*(F^5YJ77nafS$9r92UYX6Y_%azyX5F&P-gNoHk#@g?n1g& zN&rDnct=((OEP*)0S{H)9W!hT)_7E>6r3n^GVXnIM2m&5%1U zMk|s}9;-f+s#bOrZG@VF0;S{XhLlRY`v9SCoRTvj&@vBd7egH$5xwaJFTmAZz;M)~wieZ`H-nN+dIe}6TkRx<=- z(jaCsNLD2^h|g$Nc@5pb%-#F9&)B;!FIQOTtZB3?S9>J1zM)*w()jYn9$X8n@=8l^ z_Ldw&^)ORFT^vFvw^}rM<+4OR4#9TwMm-oZd;^DRl%%X!fJW^HqIP4L;i-)ku6Lqs zh?^xdiBN4mu46RvK4FiCyq16Ghn=`G`utbG4`M#kB1JddVV{xUpV#D2+35^-a#VPHCF34^o7 zKH3KfIo1x@aUSaIOLn>i%b1GEu;>CBmuFXpGDSQJ6TmYL9lCZ($zHF^*Y#g_cEa8X zk{1Ai`|RY6v{p%^{H^5_1JqqU^#8O)o5!)@8=wtEZOz0bBBbkUw3TpBx{mvPNYHGE z9A31`%%(A$9=wHTD6{*nEb&bmw2wrWGvP#lat`c4LY&T~9q0Rel+N`KxW|1)&uXXi z%c6D@=JMquqsVjJkAalfDy5!C zVLKsJeO^=>Zg!AC#@cFOBnnzoKDY8y{SJ2Ez`*w&w7(GKN_~M^X8>kYm6}08PirKq z@O)MLt91z~CE3FJdCG$FKlE3RSJX3DNnh+|i@zymIGUy!n+l2HIaqeeF(>mB#6oze zDa_>U*-WIO*UZ<2vYST8T1!K13MK5?s`-c`j8^r^FcM|Vx<^Djb!mp=SXZDSmSqnEnhB zw)`&u+#&DPJrozzY&^bCqP*F%T!2&R-2W+(G-2hp_l&Jw4fnse^bG%!1Xv(Mn;uC-<=Mz37Iy4!H#K^ z_Sg1JU?-C<4~HK?ZQnk9T_afP0&#!KHaUNFR+74-c~GrgL0)C0+lO~NDF{pG=i8CG zWM_=piLqY%yt)w|30$X{bYZb#HQpI=*Xl9$sqsG%bG8=qH?21zaAB@N!sQ&-SnUG6 zDS;5rMOH7y^}%|e3IbrO*;VhaOh>QBp)6Lo8tZGr)DUmT`KRmW;JUz{-%#l-JVX`L8VTEonIn9F?)yzSx(c^vdjZYC&1*NgcLgtxC(WK5 zg@)I%WmdY5>rPec%rH|HT9|}qGfWEJjH7W(GSxUVFHF>k08NjS)miW0m$pioBU&Q) z)|<~nEBBDpP)F^tbN4$>!KT(+6?(NfkBFpcueGCVoJ}xGbpmZ4@N=e-{meyH5NWWt z_Mg1d8qv=qwFXA-<_dZ|~ov^$m*eHK{Z)I+1 zEO2f40L4XT8h-Ybv!$Ya`B%lRlgM)3WCEa9b}m+_Vs_Z_+^7Y+Q|hAe>SC34f|xl) z$W${NgG$t7-h1)tryxaxDXHAs*WLgQjgF~uoPc6f*$G)(;xsjUw2-@t1~7wTgE8k2 zC;SL{p0fU)fJ#jTXXI=uU9C~+X+4uQhBKSj1VI}A+Txuqj=10uYido|9E1R8S2Lq* zCMbRVOYrGRzKEbdjGVk14u~vc(M)_u*u10XO-AvT@0bT6GNMYsW&(k>nCu9WClqng zqAh}e$#J+aI$IRaCj%csD~48{plBIo!CvKZ>7l#Ba9-WSfIZNh5$Wma0N8YxWN986 z@f{ql14&_vRw!uR0Blxhik2*QnVwesuQL;gl-^(9j;lQ6G0?kNCCbfw4#$ac^Erl4bYV{amFBHT<^g09%!uM1ZM)! zdnE8NF!8if@m11S=Y$S0;zuH=L>n`iDzMp3H9FJLRc{R?>s6~Pkb1T zD&)cl-jyuHO;pavxGCXN?bACY9$=fna8kHcf}f&MfAiU(KiV?T=Tge?3*@&7GyM=1 z6>SdKpPm7WzYR6+em;Zl?`(=XY;P>MBxd(A;j?<^ghFT-85!Yt%g;I~O{!@87aBWz zZgo79F^*rPMYbw6GUZ=$K*BvA(*F=2f^{mh} zIZZ-~dx)KevV=1O*3iAGwO*bDDTE=HFkx(})1&t2+r$Qhtn|k47qEE1M~VC_kzt4f zHF&7h)PENjYrb*g8^)Mks3uA(%W;YOVL}J!Cczo@ah;S^igv zTyeSrcr7Wcx3hT&6={OQY(`6gvAH(9i(O}s%&i3sP%01!sE9TTS5uEjQ6wHRH4Uzx zCY&dVYO{bzRyD9j92diG8M;kjM+JC3@J8;Z$=+!LbD3$!v{^!vnV8l73`VyBs1hyu zK8GNyysvd0>GyZa$qP)7Tcm1Dt$L@s{{rxaMhtv&g#EU0Xg*t$e7grA5-g^Ey9XF= z;j%ftEpH%lQ9+fPiau5wZL^K7W5cyeJ;`4^9@-b!B3%y1Lo$$4wQ zNV*l>fi633*SOwcQqmQ>ZfeWqy4R1-A6v8k*1qgpCTz@o^qIN1vEsvkE&yc=hdaa4 zRf&W>c(_W0MmGBU|Ea`9p1@yWXu98>kifW3a90<%+&2I#WM|%?6Q%lYzIVY>1=;>U zSwe5iQ6o~62w;tkjxLFIh8DWj_pJd=itG_4#o;#bzXIILyU*Jr1bOYAf7Iu`^5mbI zbcizV_qH7R9;}n;%2cGL;s&#fT+_&Ec&c5=36&`FcPijX;q$ndrI6J7Nx{L%?h5!J zFk%*I+f{V4m|zOn3b>>ew$;qYX7ET0X(0g>7nP{wKk)H@!n8?gIaH7rw6h!591k>hcG;JTxPfVoFb-L(Tw_@%QJFZfR=#is_3+~N zzfFld#hw_pjy+|^GD><|tDS1Yv9>C0sQd&M9;j^>8k#DC%aZ09`?am~!A`1`6E&R) zCH&_#gcy#WR%m=LjRNFF>(1`?ucu}>laP_&sSgiJ z1O`qopUG{@AwqWNe`O|X6}IsFG3b0gx3g={^UG@Rv-3O8VM(BquE0aof_)fk^%ioV z=gl*0)&`KWZqYeHhyyz3GNz0C*v8(+boFfHF(kHp8C&x!H*mOSyhxB3s;UCA- zibYlUOnwnMh;W*{Lw=Nt6l8-=XeI5f@tQV)c~WJCo{`W&H>?`h!f2o-<)I?0yh&aEvukLICszmfW3z2D+ZJNA4YJym8?xFU8> zpuE`xMT?s8nf4oKpES)Nv$)6q;-jyWVcgGUL$C?dM4g1$P4+v;v%QbP_9b4F&InSj3k#6jW#@I zWGKu~L4{7lt8tm79-@qoJ}oY{dysE@YFur)e(dP~^V)xdqgKkBlJr9$o_D#RpIQ8J`g$hqlARr)@?PL(>JDR$A9Xj;q4iDhgh% zvO{r9io`kC8E%%|#~KUAh%!-=FZG#LflNed@HK2K{m z2X>dW<`ECJ&|JK%ICJvwVJKiUB3K``ousPmU5=X)B~Q~i&e0kR7N`*01g-O5T4C;X zrYdQ&S-ab`7V485N0-$LibW+rl9jl>v89eu((GNHajQ7-)s6~o zm&9uXbSE?h%ay}bciriWjb%3D_mPMh3*p|wdymkz|v;YcZ3rNA&KiFn))mSL2Y zJw|Be$Jv$S-D$Ann~}J(ISYH&at?B1TA?i>B7+K2MSl}vQIaa-vQKb_Oo*wEPje*u z+r4MYG9GO)>azQ4RQWlX(7K}JJXHg#0-`#5^b!VS&J?AluUvd}*`*fVUz|}@-KpeF zv~IM%`q)CaNqEPm<}HQ6gSh_6=D#D#Q6s%c->}@-YjWbd@9O zYe;%2H@(Ex%6`gfX^cWg$7g0d{X1B4TUM&_g->zE3S|Z|oyC(rbSp$85B9d#Zb%eL zF4FSXO^9?U)6Kqajv7HO#}A~$Bf;?_fffwy_0Tt2MOQ|&H0G`2r!Kn7RvHSbE4fXe zb?ANCJ%Ae;fz^nCr-Kq?U+?0!PaR+~SR{lDxllNIhm97A-KvuGuXRGVu@)TKK7#T2 zM5+%=&~f{t1O?B5`Qv#Xe+xkgs!?k)EZU5`|D)s z1Oh<|cXxMp4est1f_n%aB*{8-J9*1syb@ z;YyL`cs(Z0_TNLGc_PC*k!dm0XVjB%2|2<$2VcEyP&o`u2Ej|nJF=)0c_kA9LcMDG zonMMF?JbYE9eHl1RXumQ#!7MDH#^;p0-}`u1wbVT0pKM6uM5=8WOrg7#66+@3kP^_i>t>GIOgCXl!5;B(8yW(PNh*3H6}H_GMi+#68> z90)Y;)Xm>=z;VQs)TtJ?k4Y{!1}(swjznIDyqSU+!ot@6xK{0P0rc~V*reu z+ODV!$4yywrpUu8OFf zpNhsQBsYB;06Ns$kAKuzY+N$Xj4KFU|DB$p(PmqIdnewx#m%j}`7PE zy!`CKY0MrOIpvU3URYsnHeExSkBeh@ULbA+b>lvwzNGlOjh> znqU#T>=UEt~x z%H&HBNkDBm?bbVJZ|xD;`f6l1QlixpOoup)9Tr?L4grlN4JQa=)Ua!-;ce#t}s-MV6)=3p3k{KCk$o$WY-^1DqMQkDGx81`k>% za!7QtMpZzp;Vu6QfB+Ocs;1)m3}9A>s{gMGMATSMuF@DgxyNXkoA&+=P_<7>4>!f0 zT`^jSmt@Rqp%9L@ImPrW+f@v@vM=ce4e45urj$kNyh5(P_%ZWImZqq5+I!z;tCP!W zHs_=hreU!sso2(I8WhqL7R{t_?<-7#A5xr7Q%@rIVuySPZetl`xSig-G-Nk0F4IJ& z;2LOCl!A)&n(QQtVLBN_q_QiMJQb!{VoT7>_hly@Vy#Mwg`hQPC!?_h^~X}Y-rAm1 zf7P1-p+Dmk#$ikTTXTf+U^oACMC&1VhM5gI2yOF`y@9@z{SMb1zvm0^*~OJ@Qml4KiIq@kI(rmJ(S1YSAE!T_ zov@6)Rn=!H4%g3!K_q>Q%rtF@CX{72ed8e}n%pwRO}trf+X^hB;|P2Szdj{&Gh~Fy zoABsuT25Qsm&DO}B}bFoG6URDPnQ_CnV6UvA+i~F4|83;r1a_fC@H~4E0gTG>&ob$ z`Fz&GzyzN2@{gp|UPKp0Ej>lQrB92y)9Or59B0LEjtZaj0$IKwx{P2Sp!nm3M*nXJ zhC2qmm*FhU(ox>IKoBQV{JVEJZtN5r|35fxCn4l48Z`!Yk8g3WG50lnk;fU>RN}HJ zZP!qeTY;ydM2Bk`#oMY8*43)s0-vYEjXNgQT^@VKX-ut7Tc}xgjQ`#K%01Ht?XW;V zW|C7;yKorg(W5S#EDHB@G8!Ps&&dO?S9UAE`OeW8io1Q}b(O@rX(>p=)0joEXl>B7 zn8J*LtPXgX6m>PExK%ko9(W!D-qyzQ-8{m=HJ)WTv`^1EwA1bxpuR$(FezYEuf*;I z<86Ft^qxd$cqEM7iOAjmLpH%zO+Hpl9MqH=^F7X1nS&^PDLU2SO69B!O*<`oo%{`H z^3mEtQfc~I{S*o0&h4v!Ze+03;&80kY&~-ZIjr~8wOB?TEz#!rw??XLz8GO)1*;D- z9W@4QEmx^52HKv@)n7Gv$!iGMb zbkrkq#p-Co^jeLC<;-Pn_)Vrvq#FIOkB5gY-8~ z*U}z7Iqt`@XzbsG>l85U7aH4(p2S<53rfyWHlx+;RK2Dj+&-A36{r{m63ovM7cZ>% zXX@v+SqFN>=$>3Iz4Ek8^G;+dPI>gH(s$DbUeJSgV}3KNi?f_|t|VU+LdaYyl9*9(SO4Ztx( zKWI&UasFVf^q{mB4XNzPd3I8N7)isxC1+t&9)pwqmCnG=?;7)w+E-DmUSQrG;UjYeZ!n3M!4Sn`)fq2|~5TmYDAvPQ%{604M~(r-8=bMcHQUsL%fl zF(kYf1SjtSP!hLTe`@R)N?lDzYxAUY40Zu!u=~10;ikfUrFvi}Fq^{oP#)0lq6es@ zqD^rzjSPxEUBIq#}o&jmA!ofL@55&!M=6PC;di^bXCH8K-f?IK)aWW>G1Wan4qHp@xPoxFtSp z37a?V3xrsu9hdg> zO8UM!ZkIX2js-`d+Tb0PT}MvV6q8!Ej6#eP5HP`67jR;rpuq1*Msrg%)asO5!0yv$ zjnX18!AvBx*0b?C^(}-@bI+|?MK`# z!1`54>Oi(0bIRJ?F}?Uk`CtDO$41s426~84#O(0vQ*auH^7_*f5`VCy-kLR+pV_~N zz-T<%EbQlU6~-<7PGTY$juR-%IJLCUh6w`7fO->`Xa#_2@!kPNPPF(cGptoGKkI(m zGwG%A+y*bZ6Kwe2?F%bnTJH{#w#xhJ->Cy!+f-vM?rY0W$)$uIr$Tdrezy6!8oRbz zfPc-XKOD$h=hAGJ_?8=_IzY$#okYmzw<-a!RkgSp~W8HM6f) z^iK5j$2ya#LI!$!dZ`qlZ8Hj z+kvw5hy-aCP)T>`DwMxnCcU|Pisx|4Aw6fEw(bL_`RYYW5Q7 zbW!j~L7HygJDDwIP?1Q-!kmmyeL0n`{H^@b68UXQo(=9(7)POz{kHJ9(&I}bhmY{a z0H+pJs|U4;=o<{0%s3k|N2hO^om8$w>GWXQj^S#@sq!4-&o}zWn)oO@opw}2FjxSE z-&VPiJWQC(XhbmKaN*jRq{ViIs`Hs2Hn9ewAIXe~d>hyqtSwOul`6>h$h#pUBa^m>;wV4Yz;#CfQ{~9f_J-!t?Yjp`fbsCT< zw3EHjMjApgwSN5MLK9)PHj_|fET_*PAkcbPQ>ZJH=%i&F_5i|JFmWO^ zqsG^;Q;n)F-8FSSegzAz11DeIMI|JVuL;k|}!Tc_U! zt_KFb{gMCuF95(Ggb4pp&37))Bu2*AI~T|h_=NZG6UeRK0#e@Ck(*N5*!icrZ>`ng z&!&IxcAKYd=I*&_E&1&~bkWqNGxt_^+SJF@?A$nw^B1UK+EOB%D8fbrlIb(T!I#p{ z`T84p+h)ZK>eFnfNs~PJ^fVGhJw0562W2pMTufFWD1};U1aaD4H4dBHB!WELtb}95QEx3_hQ}D>?mMld`BDF4N`&&c9?q90k)Ixu44uyJ@Wv95yM^ z>S&V!>G50Ktf&R62XYI|ZaP>tpFpeCX2JZqSH;Z@`qhED*PXfg8$HA-uWBk+zEPg6 zllXxKTY+T*c+*Y>8eXndLjYl87&XRr1Q1}rDCjWdeXscOUb?kfXa25Wt9^gPQ zu)J@F1_m=JZvkQD+PD}K>zH8fXKxaFy5dt+06t9kOnE|Xow(RbOEaX%VW{u_4^D?r z`MWjJCab87Yi)HYm6q^_5)m#QH6z#Myb$Li?aI{Wn`=TgkC%|oT7&A$BaUolCAtn{ zBDz%MERiLqp2B3Zf~k06X*vyCjf>ZMj~83g1~VF^>E3r)rs}O}$Jc8P?dcZ{n{T(s zOOvdaV~YClIPz+okQG+oU2bc0=VIzbf+KFbajfwsXRn}tzxfAPAL^j9mQ-Ua{Gsu{uro|$$oUW~GqIkLb{JQ#)Ks%aN|7PS_YO&5<&mw?OxcP* zD!f6i^$gzXPZDu4ZPTH~OHI>Yb^+Gt z=l`uSZnNk`Yj)T*{gwM=MM1}l>3WOvvgt^B>a+CysWaQ5uy5I1KxHnXB)evL{YNt? zoh4OXYBdhbLJk)P;dG_&Ppx9Pl?Ekb0G2ShuPZPExDFOg!N?({VYZ4R>Hh*i2n9C` zoP4iC+ohqrTOt{qasKlJvlazamj3euCysaMM9~r)EtCZybGD2y!%VO}uHh7TkmO+1 z)h2F|0XrE!NYJ}?W2NGo+mO2~bC%;d}S1HPYrwwpj_L zHmjr$@yu_PjvP{QVQUq*0Q@L{9@3X~CHnT^y{)X40=E64mhm zz))qRRcOxG*L4gD;mDM{$wW19(7`Q8GRzbu3}L`xVL(iLAni!vD#?c?8`qZS31bl{ z9vUwR@nWvo;I<2sA1AdNAXg=|PoSl+QmIX50!S>#Vr~f@5K&24*Iae^N9sA_d9Deh zX%$6U9AdB2eJfezc#WtPF}#2J)3g|qvIycigtqQ(KckJwLo0v`c~Zs4e`nTsIZSX0 z(%_A*ti~*+RjC&+qvT7v)!0Nbin+X5eW=zfagj(|k2K(#4}n=<-mp4Dn_DXL!I#yH zp@&6o=%J9NGJs@9l_X+k?0~H93>91Z|Z{1-Q#) z$6xYW5y{%hg?9DbgtB57alD|4&C^o{T>%t`kk>f2mu!c*Nj_|lH<5Vb<7$>7}BJgSWC z)jR38&QYFm#Ffc3U&(XG(?U)rDk^$|iWs|C;R6q-KFW2)VNzzdoZbF*P?aG9vEn#A z?=C*M)XHGBCM`}g;b;?h%BGPD&bx+t8^BJ zDAlO5AR~ilBL(ST(Z4$}toOj*-(NJ5`yrOMeCP7bZ^%ds6nXR2x!GzEZhTSZ#%o)W zlXiF@4PQG6CMt|jMBubQQ>8`2*zA4PHU|(J+$fWnSf-|o3y2K9H+R2HagsbD`$7L3;_DkJqgEE0rG;Sy0X9qap6iQ6nU&+AF~YQU*aqL`R{{n zP4NoFc6LoE@?`oVMzcngnb|L=LAbO|v#{zg8YB{`T3Dss4F|8<$i>{NlX|}Y=1eWj zz7rM}uEog3J=ifJb!$*kp3aFdD*aNtaIPGN!w!q`mZ9uYY!nyi%Azz9cC3ur6@Mt7@kl43!Q zS%}HW0k8|y7=R)HZhIPq{V*(Zm{WfQEsaGx9E(w-E)g!q)|021+feI<{MGXx?q-Rv znRNzA6(uyhxLTRhlJK~k%%Jz~f`1AZ=L1M>(O9J8;Cz}22`c3P7EcQUnv*AL@q3(j zw0T7prE)7X*TVYmOatW)Synqmc9AJTZ`za*(qu<4Zcv4`OXJgvJ>gr3Dh%tK6)VW# z&uY`f=dgD?XAwMNVPB%>dTQ)37p_8*V~Vf;nZ7(Okdo7|$QhkGqO@E6?^V5@Waewz zkKVP-^tjjyyq9Bf=O>$4;c4Uar#o=Y+R=%1)~qz4)%7On?VQ{$A{0W|B3~=Div+1= zo(@l>LE#L-d>GfvJG@F_=*AT*k`0|2eYg#I&c|_q5N)!&%}qvS^r)s{T_i|a$lN+h zLkX6jTbZL{z7BH8^e+H(L2wKIJi+fL0F%A*`!y&|fHL#H89=zQ)HAfSMQWmA{AbWF zNXhu}iY5Le+K3-RQc1-sSG<1vfF*3puo2n&<<|sJnIf+yZEIPRXch_xg)dQ-P>}}- zp1`%*AxWT(c7799ni6=ja4-HKOJ&~HB{9XxUY^R9A--_E_P{N)Fo~V!oJ2;!u zMT_;LxD~bNtS#1*4Ub%SA^p%u`VuAIz_JNn6V}6srmLL@GZ0M7GnF8THiMO0J}6+4 z65ez4*A#0X8;6$@hYAHds8cvEK_C3y`;;5s1A|-JJr)_+d1@_deaacy+HEGnlCKQ? zOr7)pJ``-Lq)f)PQ}L^MC?4ljyuCjy6%kY(G?HR#QQ<-goW{Eu%N8Rj!gWKehPwqE z?7zOn6EjSC3VLedQ)rh*46t&xBfuReM4_>0aYU^Ze) zah)jTT)+I#EMI1kl)< z4$`yf0&K1$-5d7XZ_E{JmNps#idL>6-|N=!xtON0*~17;xxeEhFZG<88~Q&B2R#0+ z>`VFBs&^M_ga7;5zMy@H6R^A*b1P;x73)8Kutl@UqWdoZW>ARq0q6(xM`dN1aZ4 zH;6Lu+1>jJYeJuG7g5L04EI3_KXic2k((l>himmfI(~{`6X0=qjoiEn#@c-oyj_7d zPWGEmCC}Zy-ke)o-)(NXzHRnTnL0-+dvAj3HWaLBsdY=Dgxp|Lmi+`1adVRn5O9$3w{!3#0c^<5*do7 zk(Ne+!yTCu)x{ypZZpu^o22>xu5??Q`iQBh29Z-hqY)UU8Ol&T0+oml8p-|vBu+wf zzk&d@fwvw5fb z{;j6_#V&tq?VmL@b@$;ArA3h88^UQOHe8aC*~H>^HqU1SdMBJ80$L5YhktpF@cpV- z!;7*6*Bf{u{W^~QqFW6>3Vw&%0GdvZB6n%mudBn4BzLl!XsY-hM?7*ON{5+A+4(s< zByST1dJYMu!l70|M=F^opxSDVP+}P=7SYheAplJNu`v}Xf3{L;W=63V4YIg)UHT>a{=E^5>Yeu#MekgZAa`aAPST1cfwfnryZ67Tx~fe2P}-rklbK|Ndc03HbA zhr)G-N(LQ&(Q8xy_Ke4GM6hMq{0y3!*QcU~xR#1RKK&v`mq-ul|!KZ=n*7Mr=tA=`;7 zwn~uqP2boidSu@+#YQokT{DVrrNV;)WZ~9|Bh?kb)96cdr0o`xeTLrmd&R4!Qnf4z z2v~Fr78V$(T^hz^oQlMEkJ>@P!kb7Cz#_-zB2hT?krMN)Q0$Y7@rq)ovYYObTRzP+ z$3@5xpeN{(#^Ko*r130S(o~Z+Bnqy~w=`{x-ckt*5SRd96C`786;Tf(nhiiTxu-Zz zWaQZJ0ZD$ZD;%PTks|QQ&^6wbV9U)}Z{~hT!S@X{+R`)biQ?i*8PdZ_8VCh{Un+V*LD&S`L~&Q)UTA(x9ZHN6ZP6 zB?sU~ak&I6?-^7_=Pi5LDB?<9F-XE(;ZDHs%M6$5hA1l}db=w|u5F|8JnCv|x!dDt zEVD_p$_bM@lc@F*swK_{b(YNm$^7st_OHOgH^bRye-$}9Bw5?Gz<3${GL4sS3kEl@ zmiU_`EBBuo8j0`KIPS(RD;l3>M=nzll2gv67s!$YufkEp?gZ}nH9|+_k_?a&%lXe` z09j%c#);J5PtB8ml3-29VyU{rt@Zm?KLyq{{^#N99Shr6~N`bWdyvy_8ea z2kDy+)6a7gXW_~e)Tda=X2?@_+(C7I`AStFJ-FZ&$iCYwfrJO0mfQtpgTXZ7hBt}s ze}J2eH9WQEf`X;4I$Yembj<{FT(A0#TnB~WrUlKPj}38 zzJ6$}{m>e2Fvk?cL`+>W&Fd)30A`e+YZ);*v;^^kK|zbnue>JGZ51&CTD)~NAAwu? zc-rX-6KeePQe1)Gi^x0RD!c7)TIwppe0sf{DibWyp=8vJM#k0&?XQugFb8}N6>mr5 z#U^LK7P|7#eGswMyh1Q(*g0>QElQsymOW%3v3aS|uZymB3rahu^;uoVZushUHB%|a zMqs__b)D7JFW!XBrY+O<_$vcBYf$pXunZ?#p!Fp6=r9DfbaCHuExj zdV21o$riV0_BFY!wq<173u5;}7}Ql6Yo*1bh8o^v z|LIhYm6?N!%t4)kE^S)bjemyS>3;q92qmty=C`Gz_w8=&i7M>ptsz;bIdZ@$jguYp_{-q(V^?T7i85Rd z_Q~1yXwLNaq=s<#h=B>;Jt|u|)lUXRLto4bPS0;9eorx^vxDqtS-e(3E?%)Amq7($ zp*$oyQhZsA0+G|x+=WoTXekmynaMxc!y?6D#%DU^D1I%Y!1};4wWuva7nZq>4F~`c zkF|0q(8^3fxejdrxwwS!_<&%ks8paObHuchT0(knO4S>fE9}1js0Sf%dXJL6TO#M# z*T>$6V8We|_bw3Ya zO&WP@^^IaorNZRBMa(#&UhPlata34n7giG1yiAS9QAO8qc5ij3U4ar->gkACF;Q(B zb(-1qefsD@mBD2~vr;i~7KeOgB;zHrljuHI(qb|Z!Z9pxS5BK!k!qZlF=k<^l3x`q zcIP<1F1NAmZq#xzt@-mrm2V@xed}61OQ+4DC7mxjv(v!zWvA}shvmj&{v&`>47NHrZA zd}0z;b_^-Lk@WB}ydX?@g(N=#PVg~G3X4(_96UNl+2$-?nPeK_2P(4&J$znas}f7f z^X8MP$}`^( zsKRBaU}z?x(&6ijhk|4E&8c1Ml#yFSWbcMz^eTNdZqZd@g&oz^Zw%YJ`0!;UDKygS znff|1CslBl3sNIjQ!!S`)m&RA_@$(n6V%kyrW~;*Zxe+qi)qR-^aGVMQ}olAhxk!mhJ1QJl232^(gAb2LuM3OPPU3{Mme&r|V! zxdm@o@mWVTX%$T40zc79!(2;vl1>)Z0eKA7 zxVFp$BhGF`4%NH$0tXvA9LQrc5H|JB@GMjmiev}JkhE59KF~&Qcr4?gM4FM$=;i0m zI1LHhARi~!h<|ZxF=t`XIvSffROK~jXBq}K@@$B*JM44M1&kYYjZ?_#_+!oHv?lyr zf3o?h@dJUle^tO5mu!Ws>4a|fY&qYH_Hmj3s69?zIajsv0$oJ_Zu?P?bNNSa+jyLW z>-H-jW!qwlXEy^)_b2e|0JPp=AXgPbiMMq-yv1jRVo8sii^^iA%gv$|K+(dI+RvMO zK`Fg&!^}qVUXobPgEC(SCfkU~Qcbl;qo^Z)KI1u2i-uW7FXe5*-_%PO_08n6Su>>R zMVm5{=I$8MG%aRK3PkXn=8jZ64{2Adn*{3!g$XDrnY);FEvqlu^7psDUhgh#sMo1z zazh2P8NiYLozAK3Hss$BA2K})dHPJHAOssV0r(X(QU1ma)BGz26GLOw$rTb#eM3i< z@2sp%D_0>?gz7i~D=bu7xc`bxO;4axm90anIqi%%lx=9yp4w46%rNCen5?#I^hI+) z>G1u2G{w_r?+e!3BtzsB{vvJ};e(=Oc9+oo#tMHCq!()D$34sskq6Ia-Nh*! zam_zNB>}9YBJoEmHEeFvtxwJ$aSV;b&8$Biq2GrTdJYUzv(rklWS6@Q_@4xMt{Y&; zyDy%8^7|B2s8~4=v_2iv@{>u1DlWF(dI+UI&?wNyLHvv-DwU-8{ur%*dUTQ6z+>Q| zSD_KFna|}ndKxeB^1lFppb(`4hq>SJ=tuSIU*3mcqMJF=e{E0&JT23r7|u7I72ydbVd2z;|2wv)i&_v$>LQ!%)+UX5pYr)?NLc`!uZ)NxLxBPNnm zjn!MOOh3w+_YK1YEIfZ^a3_F_noRP#`v3k9Hb=agI7 zwPsPg(DOs^!DTZ*o=ky7sY07zqH*e%qKNw5PmDzZ#*J-8_N(DC9 z=_t6nxL#FTj3x~5s^*%Pk3jcU1^OhFISdm`om65fvT+ohpy<*cGRW+)#;Fb;iZi5~ z(vI#4jr0c(oX#Arn(Po0`4^PY59n@a zdthA~eTbHK=`9P~U04Hfi;}YHV@xg;gP`byq3~j4!{(}Vm`kU`c$!g3tj6RZ)vTLXUSr!ueZuIICM{gAJQ-$^)tx{eJu}{u&0)Rt4mDo z>_%n5E9o1j^>o!Cn=$r&NxR{)T`k|Ai62+xSA6chYyI?BrvC1LkCZz8;xD)Fi*n*n zlH)VGG&GP!0Lk-;p26>m!>piwZ6e!q58c%CF!FnSxe&+&VT`4om(XkdWR9btyTOt80N=6aR81@GoQgJi5yckG~ z&i*sbo)T9&F*vw&N$D_{(W&y>(2qqRXKH;JgEId3;sx;LEe?KsXs+>FC?MeDSA z-)KN)@20sg3P?81BjdJcdMZY!9NXG-ltPc`0^K|_Qr0tCfZ=J`L?+l2kIWi~LQ@z- z&;eY#ec7yo-BB@>6q-3S$+igZ{Ng=}>&V(`lWJf;;jvY!pTgw}?8*b}0+zm=tyNE@ z;ACSY<=Nv2q-1L@yy93(bQmzw<~X;(hr7SPSbI(SaPOnp#x!xEJfbjt6`iA$xy{fn1 zo!u5#cd$~SZLzvxi9>g*A+dO6}6SqU{Xih zRIyyOzRxAfqtgO>Ou8Bc)LQciGZa(k!3`?mdy6`Wl_o!HQtk>pi4}~KyF?ac4oAsZ z$TM|KK+|I|*J06;@Fc7-r=207gELBT!w9!}6A$$&==1#~-l%*4tI10niI?{&vsm!&}c5U$t2Cs}FJDW}VA4scv7)t176a_g?_apb(M+a=5YzP; z|7HLK;vGU&PSz=H0gIjT#!lh>&&3pajhXW#s(*l3ZC9au3!&s+6wk`yzLA>UW?69I;$UX{GI&b1#sH9*j?`li30O{uGn_xWYcPkw*X+CC5Q)_*=ZdiwZskc|Qb1p@+paXSQJyXjHLoTd$7 zX^v0^T&ng_b)qY(e$Bv)G&6(4gyi_B@dr+6=i?1^BX z%^%Dy4xO^vH;8E6Dk6|-pDvBpFrf9`m)2C7@oZ=u5$EWYvhj<=hn8+y&YE7huK+Ik zs!y( z(~5mg0uE0!XE*=eYcN_I{_a9fcqzLvW3Te9D%3B*+0l3p7I=g-}YzW>V%?q43mJWkZz>yPU7#9!?2w85Xbh;VmVFL|)t)*Hm$tpw(pdSQ$i6{x`Zm2@}wCD>q0dmQztxPTwP&{F+ zr9*`++ctvwC&ilXNkfv|j%si}L@A~i1=TWo)O6)0lo#sc*0@n**>B0kRG6b8vFq0G zwOHp0_ZV~4jiW97C@~GKR62;3H#wHI{sn*q3a;@V9a`Bg3&mdb{RAMW{3pqa{c=-( zX#H-APrib&3isoV!UK?lerVVv7dyt^v*g>`7{e6|KMEAvqK^y(Mc_2Q#6_tH#fFXWB>;gzEL!8Z?U^FN=#lU-m_f$&4zHA+bL!txlM-TUi)7OqZ4+^`NK z%DGm7U7rqNfkCSc!JfWMn;$^4UfO8jxeHgOB;+(H0Oc0u*1XV6$1d_2qdeS=pX}q- zqE0x=`w&rDZHgl&;x+^!;2ZvWVQ)FjkkTsQR){B9ZTQz`$8u$YzyJF{%H)SLkvh%g zZPV_#2jL_9e2qHf9&K>1Cq_V?23b~|=2@dYGUSyJ5me?dCZDh}x#FbYbSWL?^wKFi{@ge6(h00QP8!{2+vYs9A$BSHtn?9H;mgkqtd|T6H$#Q;w4U8CDXl zy+bP=735=?P(>oE#YK7CEG;LOiciYXg)qwFWkFZUgu}hu^o?sr6*1GtN7Xa#wo?8w z!RM00S7IwP&Df_Ey}sCT2n!S~G;LB6Y%*3UB@XdixC!(1uA}NVcgimp5{;HXQet`> zv=hQy77@0l-mzed>RQTMpt6MdqwdWw0xw(dv>Om7K_@`FZI}=4}xqaQ3MK zmjDzlr#sClAuT%&>ma^KT8Tvnbqg(rj7+ft%n1A@W}#|0iGAB5-Me9Y)PW0rOCIVO zxd~3j9bh#j_%8s8K?q1La_^#S@PMko+CMt9b2R0D8)01kz*wCyQF*WZfh)^*?B>WH zQ#UvA9&hMv6m|C*$Mox7tD@lk%*0Y_kr>%~1Ipg^x{)OCj1ovoSaiN5#$FaCs7u^j zU=u6zq#@HubjmE)g^Hyk{|XO820FTKeAqr*)G(Rm-6TW0(3Z zyiK+V1)uOl*?Q45R)XjqplQD}M*zlx?nynrozq=tII4ZnFXxiM4URd8^(}hjc}8aBs^y9kyz5=`F{c6fr2Lj zjh|gAo0Ue{lfN&-5aPe@1oy^%S!XP1O>b<$9Kg>&@CKtc`0 z6lH0e##cC$*#-YR8d-BoE0Z>$Fqm$2eX0J$G8Ydz~*)a5t~W{I4VgcN&5XX zTt-{g5gTDA`(OuChN%{;I0ffx%erGTH+mHp*X5gR{K*O@gab|<*UW%z-$R|ArEI@1 z|Cn0N< zO`i@HUy_T%O!V*WxBxUJk)0r9vyOsRY$Mh$C>{FaThqe*fgk=8*HC`HR4<)jqvlHlBqSi zd;wyukonQ(XJBVZiqfe=@(qO7f&RMP0fnl;sGFAS0L9sZd-XUHQC>FbYS*UxvT4r- zApzA2AuUNmp#)c%cs^~7SreJgc!PymrRPGMa>H`PGX{4Z972esnt*x{3OAAO3%ub0 zQ|RfPM5Ofe}^?A~jZhsc(Qn@%qq%byP zuw>~ga`XdxJTqWR)=m99&Tq6;d}~A~69gFz9nRsoWqO7G0w5QJaR2F@4eAfx!t5w=erJQq zD*pEgw8Z+KCzw@RF(QVOX~)x#75&qa*Rg{Ro<4r7OIa%~cYQ}*>PSfm*{}NDXU?1G zv0*gY6R$1*{L!I3DMD!2{eebDX7aR&x5>s9PVIfsKKe@WvoKJ-a!Q8%*2n|!7R&&Tgka6^SOHREf z_+f!iZ91L=ClvSS{O8LdXcEVV)Sj21?kcbr`5dy$UTGGfcb1qrggOC#D^aj~e_IDZ zqF2o%>RZ^yp}sj#RLR%rE*6OTqaO42=fzQnf@e8$C)P{vw=%w4R^I4-)GJzpA9^p6 zH2i9lc@pb|+T>JlVn__#ul6brY;Frgrg z7GaBW>g->w+OzjLgA$iVLk!buBs`p1ZMUbAnK+d^nA){8?YsRE+)2$OSK@8eaQluR zK~7z1>%Ba4AtTdro1?KF@Ytb0aH*eLl)IZFSzx3fLrzQQ%dh6ZYrhIrZV5W-Wm#UD zw0TUJLQE+&DXB~+YYSizoA2@fxh(gJ-w~$8Vpy8rP-dz}c~sq^!lR|uzV}b?NR9DC znszXI8cHG{76i9Ui=g%|0JK5y%I_z@wX#{UgFdT1l9XHz+hda6=OtcBX&H# zUt0uCQOMYMTsZ+!HhfMjv@JWA0yV8&BvVk+M{3Gu)aJ+(S?f#_C;FPUq>9r$x8sVJJ0D|2(_)|Y1Wkqr zyB?|ysuOASrZg_jGm0Lj?{j1c{;qs;3)h{~y3t->=b`BFfrY4dWIGK9-1L=*S73=1 z8G;nx?Ph3!QE|%F5y#bV~*3{AMi+WVoBYH8!-wnGX~X zpG6oc&+!c8BDa^lHof;o5YwHL<%lVxquq-QEDj$~~Mbq1wMTNNqe+wpyzj7<9PtSZu zME!=v#d$$U;;wP71sv~bC}MzjkO^N(f>Ol`jcqvG8~g4=x5ywwn*M)uomEuSf7JD9 z>F)0C?(Xgwx?#wnqy?nA8>D7{p}SGKq`Q=ER6-OGdB*>rZW`Z>&$x=kha75Gh8FX(*%XPg`r@!lxogcl z9S0aF_}*cKp{-VPM0Gjn@ebi*)5!&phP6giY3?-#`8A~f56f5Hc`cgP@9Ahg^!fty zo}V1u3*o$-sp6jQf_E4KAOMGc|42;eLQQ6PfCevFWn|b_CU$Nfd6;X(ZJsx@85&x* zDHRxQj-K~p?*i#qewt;aIt9yibyFXfAMj??R7HsDDU$NtDv?c{_<;A>KOW*T{p&zF z_q%M7HsTknfTfYlLxq0=kcLBUwNiuCqPWznn@QPndf>DDuN%~_x(Y^#Y_EkCZNEQE zm|Rz_TrCkEnyu6i9h{jo{&kYP^5^Iw`myx!*cBOXt0Ofas-<@9X> zhqX`iT{^R}$(-r@*0M%_isF+7m>bo92`vaTicxhz;Tb)iN82_dYjc>S;wAl5%0;8V zaCn9HDF}~4^x-g_+cY%XM^(`*uvMq>n18tKAZlqR=1tcaM(TQIm_c>2rEi_d+JWWM zpaNu=iT2g5a~O}9nMz9ZWfClQ&CJGbr=AY zUOP5IPoqBz|D9_hYkiPChZb?1J7x@nNtB{N-IZBP4C314IsLhwwnCdp^KyI8LJE(SwG>tA)EWrT&43_xQ!Z3)kNh312uoy8kE9OXw!zfV6&j|y@v4P z>^wb55<}INrXss^jE7l3{B~v>t+h#NnQFO9OG@NfvTQ9u$Oa8}oump&d-67DxRtIj za8U51^v1xIpIQ=)HRDE)9Z|h;6&i*RJsEYWp2FK2WAu#Q-Ng7qBA4?icSs6M|H%KH z@${G8t9{18|G7aCkrKS$blj(m%!%i<6Y)9!7+uki6xmfwRLv@ZM540H>F78j(4dE^ zDAg3UhZJ9&sUri;c>U{P6Y~qY(U_Y_tJ1Rh!^woyV7N!>dw#?uvU^aq(RcD}t(#QS zM3Fa_VuD}n@O!LtUj}^oi3C{#J*vc2;;_0j-Ehnbtj7RuQjVJ3%XQe*OJUQq7n^oH z!%<%z%nIBr+V!knQkSeaC|i$**XrGe>RrF5=re=v1}*~AkK5T^zI`J^F$Ze=69CK& z${0Q-z!T!V)2X3xQ0{N99Vy~G_!fnd&uv&{3wz43O(gCt3%Xf-bt74 z+JBmA3SO3gG!<^;#n~YBGwet5MlV_DO5*QBvvCgvlagN`bO(D&%G$%Iz65qZ(jAoQ z+48a`$b0A0ZpQ~mz{Fpm^Q79PVrl0lebk@MpRjOztVe_)o zvds0#<12oYk4TIX+PH%o4e@$NIWkLF^v#!Kz3T&-~l!rN730#Z}eu$Dh{* zRNq&^9O~9vvB3g=I~%9hC-n^N8d~cx4S;HJLNi;;hVOyw!9gV~tDMyvE+2sFiT34| z@C64I0>6rSOMyrRuZhM@vPZ?eqr^2#RwJ7b`mdMlr zQ1QRk_J5@QG<|rL`TP7!JmuK)i0~KXuMVr-m^w}zbbh7vg?$rF#&rBbPgQtGlNz-% z+u!2kPwgL+rNoSC_n(e>Y%JLc4SHm+%mvAu?SEM4&AFQ;;Lm1p4Xj=|&KzAE)38Iu z28txDVjcAUz)dhE?;(L|ld6?zVRT6F#h>V{gmyQkL%2M~2W>!b-Ug1R2*vP0}4qiry zQ67wo7SOqV1Fk2UNwOyZVB=lcSjyNXZ7`J*jkZpcAM(rNRe1{E?8Rybb3mac<^_H^-FxQF%`u>~ zc6Q_LSPguIoX&AX3U>9^K8tr{>&+GMB-nEd{^~krh%8Q`0aFKL*AX(Ja=~Aamt!HJ z^O@9WMDNmV6Mjq5RCxc1D{_j6`3<3dizb)CF^&+nyrB|{G2T{7s2+XXZ4sYYegdGn zo6O7H$juX94TZfUV5=xPox_L%)k9RnLMIGACs&h%<>ocd3nOY19sG` zmNHp_{ykdRk-K%ji>{vr{O#L`ssYo4veT=bz&;gXE&72?|8M5RqA|wc?k5Qc!TOKX zE$WM@yIuuc-J1zrbUS}?6Ef;&^{$nR^-g*(-x88$T(RtJKK z=*m&Y)!dQRgv~D`=xLnV2VR_z*0X#jW*I96USAp zawDt?eJ&Tpn?XxQKpZRO_dK`Y%k_*^)+!EjqZmWr7TXgj5A-df#sZ8Rdhw32qubkuT|m&WBxV%F?_Sc;QMm{wl3Wgqn84CIPHNJ*1lg zS=SZ;2bats(d6#o6Z?bKXjk>aG3O!{^u##eQl4$}WY=395)KEQ6x-IPdi*5D1>bKQ z5y0nP7uCZBM!*X1g%WhUC#~rtp;I=OWhNUZMd=vOScc{A)J0Byi-YBE!{So);fNom z0xhBK2Fp& z-3NXXX%wi5&2^}z=tYP&w<;^fVZ2C~YG_p3$VE>Zuem*}373^*WNK{i)ZDU^het-c zSJAy)D|Zd)9XbHtN9HaUmvTqwPMZA_09^#Kh}+~M>=F!{0m!8|-SKZU*c$k_DlA}; z$ZT+Xjr1f%^-B8rt)gv<<06UK`&(ft5!z4{zfzs`JFKBm;<4^6LS{Qv%LMjHgzm=L z5ofvyGYxi7gWDXw{-JrxGe%m^@$0YGyWMxM+jaf(R`|28k0*cr{{8Oi2dFz;V_oaKcppKuGV`0@bF_8xE7@y?d#QMagpAP{t zf*WfEAWBbcOoUSzy+z5CB$pbZC1=5-;U?T4rtM}1mmRvSq~z_5+bDNkGf#79^0SiY zvzs&$vK21_0@{C)F>0m+v8wi{Ae2RQ)h61jb`gl)ST=SuDl%T6RrK%+Uis5E*;TVJ zJL$zr<5%%ouy3v?2EH{+oGPG~S0OeQ!cH0?Yzn!pZrq?~Yh49szQQrS&yN@`(KJ^+ z&*6cH8YtFixK0i&hv3JRvFu*w%zka)XaNR<>v;0;)2hGcC_0A|a1%Nu)I_&u<6{xv z7kIie0JJZ=nA)aBA|lLGdZ{_tRFw;2pj`8rn&I!*w34ZocOo$!{UEf~jWDC&A~==9 z(AH(wy}&<%0dv(kn-ARL3m8m$IbD{4jxDU?{5zS;Ro88Ek!j<&s~QYFZ^O)9FBag? z6^3diBJuKh_bR41qv{;J=-dQMc%KI(vEbdf%LK=ShoXAa-n&Fen7V-66}~nVyWTOL z@v~^M`#Jz-j2T+^+95`99i?oC<4*Bkx@!f4EcoMtm-c>lw81ZYeoL48IiZQ!PeV*~ zx`U6`{MPMoY7+#{dZBiwgn=E$ulICkg5hdW!}CM)x2w&L zHWD$|qHz4w-%%7X0I1^KE4IbU6%uE=%P$Km%*ANBZt1#;G{@dk=9aOz&78$)bILhp z+;Zig9Y^=1vy=~n3_Y7Cb3FrGL=5T(h~CCG)I9h}iSFeXd^FLlaCdOgtumeLAj}S_E!5%#)^F=NT_FWioq|q&8V^&Xdr%|( zkvP>K=h(q&_Rv}^a6`b2Detj^*4XYjeZH?OV*V(nHo~u5|2Z7-BPavC`t7WifCz{4KRfgna$)JVkNkb@1rtqzeqQ@POgnoBWc$ zcYlBVs(Y>V-%U(aH}Kev*Qzc{896!)Na&+D&Q?eyC1y(JCC&dE5sTomC>YA>luMNF z%_!Ys0%?f3888xb+Lit#I##iNvs89eTo8+Csmn*9f@gu}<&_?GR z#!f`ftcNI2vAp|reU~MnR$!kUI)V(uZ{+XxQ&$K} z1%jU0P4lmP?C(#EdKk)It!;cK)ry2IN(85*|KX{_R&>i-h} zbp&Fi?u=f7fJ@HBqbBSUjQ>-MqaNl3a;>fU2g;UkA#EU6n%$sq)+9p=_0#QYW6IlL_z(d9yp85PEywb+VPSML^1 zdU;j;WaI7>-U{)}tgN96y3s1r25E16Vl{*YZkJ~*_Kcs&mw5E9!;pL)2Le6S0Nh&U zEgB0hS-zDe4@0iK={OVKpNKGn!ODu@_9 zGec0ND`httz*CKvs=%qIfnM>`wdt0cuL;A&>SJ~cs`^=2nXJQzxu@cWJo1py&)H~E z%xTb=&XYD34Usp@V07bxy&KMo0)~WCd|1JZO@_K?g;NRBOtTac;GKr9hbd!Ts_8DV!17({+#LC0YRFcwZ777{6F&BEhN5aDGIWXc3 z8Lu>Z8VlHuhoIIGvq`Oqm|UT6Cb6;B)aiWDQW0XPI;i!rwg|c|(+B(tXI z77b=w8sXQMElbI*O;oYD4PQd+G;k^4YA+wIyFyh;4?Ch)T|7g^U$k!7sG2-U9YCi1 zd=4oNxK6hsI+-Hmt;6KdIF`Da*@F%`8IJ)u>E2(ti?)7Hy<@)Un7cA|aQXeh1(Uj_ zxeQGqXM#J6mFRneWe7&|zKgeO!)X4fd#!+!aYaV9ln2_q6 za|>(yM16s;ynW}#KF5ttrnmb7P1W#X_!w)pb6^M!F1&^yvLw z2b{7I-3e(LyI`mBVWlc$ms%w44=000JldA;=l`K#;rG_T*S2}a!hrZRTBs3P#T{fMlD zFBI}BoDqXq%Js4~!7{|#o*k|}pExIj$~Ej8S8MQkRllAaMio-J|24q%_7@g&2~+G3 zw)x#_D9Y5n-#lf|7l@f|lYRUJpTUtYs8x}kLN$-SzWXD7iM(xV2q8uSR#qJH46CRf$H?p1UwO|F_fN@|Mk6ms6nU6EpVthGXDzc;;Nc8H;gND7DBn|LVTSowc@ft28o z;|%^=gEl3?)}YBAq)cu9tPmr#LiRu7TDq?@JGlgf10OZo+#ni!Ts*w>s!Q$N5Udh5 zYFCu*x(|}yRx)>AS13WFpS4GK%K+H7QVpjMc5H;P^v#MDGlNYOR(9%aV7A7_(og+0 z>V|fK`-MywLwPI@i)qTv;fs2}u^**0abutlh41K@+rGNYZsGYlhgWMw>#2H_ zbDvX_kD8T2!!*$>)#Votm>L=4ADGm05uvGEnH>jrsJk)thNc(egk==EIhP+OvBxvV zu!ef&)rLpcn5q->p5Hj1+A7(WJ8oo?d9!kVfP`Ju{5iyqGqD5=A!%Hj*V!r z#8%k(=AxL#hk&A?sZWt)m3#RmaI!dlIzc3cxw@)$_ZuYKVJXb}d} z<)9}c=w?kncerh}@oipAnw^cUViX=!d< z(A~Vl3QO|C*zc;uJj}%9yQO@tH(MS8g^^@`04{{g{wTnW5tCP1UbhWW95d- z0W6s-IVn>}cLH~#f_~;kHOONW@Dau4R>37=OQHqVc%iGThwz}GZ9*K;z_W*GV>C2l z$gvlX`g^jAiJI*UMkxXDi0-HHhJa0Tr8Lc1{!SQ$t)NRg^v_yAxbv+?N7uaOH-p@% zU;5m)H6kibX0p0)aD+BUM)^i|=C#KHiXwOiJ>oBex78l%bgm9`Hm8C{xP^U&(mN;<+^lJ8I?{DE^L_}9~$fc@41d0reMS|)shYSlbD72~2&Qm>TEc-wPlefwB|&-wUw$J^#NKKu?42 z-wRL&djaBFnk7^eHaE9#&`^|Iu=JDm^vHIU8^pVzGW@}&66)JYmO)F~3}$M(l|?S4 z?@OT1+jLX0NrY0tp*@3#rl8Od?e4sp8OwHnvBu-WrlVzk_J`Bii_hjS6pO;Y>Lb(l zP*F)D5W12~`B)t#JZwqss@jQCw2v_RcM-_ODbPmE**5&Sr`bwG2vxEjT9wqn?u&yv zqbp63@EGB8>AMKAi z@#j7Kl^Nd?+#TlY^Tg!N&!^{E;#Wz~jt3DD=4?x`adP?`SEH{G-q!&v)Wqx**YV>m6W5DCAF&#sFx!4KW~4VAIG(I|H4Cc z8T?W(1(wRm4hI?0R&Dz%yr*A|pgq^<-L)X2vDU~4%nBgQ#9Wj&Qe49OT{^JV>Jk{5 zd=dw(@#_fQz}&Grr=cn4xX1ahx&kQ%8Ah!Te|9=IDM|-xAoGvC(a-}B5Id8y$jnQ& z>a1xbQ(N8sfr1Rxg&t^CM(ZfSs_H?8%v@uHTmzmT*F>-n%^yD+N}mk)y13;VUu=L@ zaYI<}sM)C)Tt?V%K1fqiQ@0ZrYF{_fK@GO`)dE=gsYIWZ0v(#_F<8n{%#V>kZ62vVosjb&@xpmbVGs2Qm%v1^ZQBMYHI(X^v zt(|O17E}a+i$OL=PWO!|8+y#rVaGqV>Kk886~Uyfxf%T?x&^r#3Wh!xlefnzpp!3Q z$ZA1$IfSC^&Lk5;+W;mECjcnPhwy28fvwKRa5+WIa{b#vwTtTamw(V?L|%facEK5a zJwI=f9R65L@WN4D9Y%EiT$#X)qpi=h#5@7_JYAn@Yu8Mdz2iG`ov$3$@Oie{J zIS+l}O6*k?A3Q#XR&;xedGgsJ;kw-$qp%Ba3V9{g4nTRwvAD5s(X7A!H2{@^jo~R? zwtNqLOtLq2WLUnpg;Wh3^CbMN8Cy{+m&K2X}?45(Baa)1UdBshaSP`j) zYi7ahugL*~XJmtjN89F>`;w#FB&1s8Mmz~3A9%|TiN5@LY`-1*OQ2>NSp55a6a{dl zdVXo~P9r~}#?7D-VgIx-EUlk!0K+JuSH5f4^-1_G;+r3h?9{73hZ%sVEhF~}tsC%p z<6^WrMMBGiJ14yjW#U@|JDNm5Yt5?2qZFPD zbw!QPtU?W7!cxpPD;3AJu={ zV0PwtYqxE?amd~hnWRDz+HkLBt=8f5cQjy1JK1$tE?vv9aca}fYeeu$T8aYlp=c=D zr+FawoxWo(v9Yng1d<7MJPOkE{JENIOSiBpn;yS0V3lp4D=v|di+FH zSFVz`so%;b3f6tUp6O1lAb}oSz@itnQEeL%oG~*U0S^b~O|-y{4n*-wNNLLP>oX?W z&C%^-BL!vB2SlSIMR1v<*$TRvl&9&r*xzYi)OCXiQ!{xD5=~InNZ*cL#s*BhVZE^% z+#*pgi5XRhCeq6)li{)$v;VEiRwoyV6u;LmttzP8b&ykS?dO^~G~c|OJpNS{3(81L z(igQ1`pJ%NbD3`_&f}w{e$BG6Efw(s^m~zxjluTAV5np@c3t5VWVxZ8DO`mCKEOTnBH`eU%_fo=sGK1VQ$d%kNhE&Mo|>*{m;7Ff!~-={+9bE zCEE)unppP>ue%`@WsZ^hhkgtZDbn~E_SpfK8><_8C=~z2jaRt)T7mmgHkJ{W;SZ*u z+_(>loGwygdL#zCS9q1gIC*R3fM&fVW6{I#$Gy%5;qs45h2CAg*TC9xHPo1dZ%`O~ZhK=R` zj(9l*7AB@gm!F;U8>`|YEVz`Ue^4FoMQTEqMm?4FA|b@w<|}7s$3+Gn`4*?AYgSkf z#lWOa*TBcOlEd5nTbs96LeD}{tswIr<8aR}3TugBPtPL3u7U}`SY*b`TsWXgW?NAJ zESVJnZZ1?y(mfpS3;qzFm1>$Iv_x8HDbycaV%#i{Nurv0wbd8COO0u~YVW6^Y@_`} ziqi15N7+a&zmpk>Icd-DBl-bF5@~pxW-bT>I5Ob-Gp=J+Vuav0?omQGJYMf~9G{Ac(2TVBxUqWb)sdFBwj`R_bkocIxNnmHT@Ze15`j*sb%(%W3yB zWl5MZZgMS9u*D(dwrJPp&b13dT?G2Us!Od9e)L;pNKLr`CAn3B0qK8hOf32E?YTcx z@UTnkOJ-q{TCwP!M`fX0EhaLHtG-a2@+Z}X=KhT72)cheHD6HB32U^w6V4Kzkbdp+ zno%0~+BqNWB~ieu38%gYxSkeV9p#Zii^w(-n=H(PTPK~Y4E!q7I6*k&?PhK7;ZU*s zu!f&It;FF^eUTk4xmH?w%N~toH6N%0z&%c!B0HSmG|adX`|l7&3x}+rud4T5!>$Zk z%O-X1L6iae1cDJ_vf2K5ftu51Nz;FymGSX6aM$$5PLnO+kyf}w>d}!Gy*;e4X)z<= zx_Q5GNaxtuQEetCcS*P^L* z@8Rv1JeTb*hxVYy+wWanbAo47CS2=6@{DnQ2#%Ut<0Vdx$!p_ZF4g)gOjtB78cj(H zA!1~-C7{(NiywfYj;C+*!EP-geZ~SDh;Q}+EDEZeKOi6?w6&d@83{xc!4L7$mGkM* zpIBIw(ziR*R~Q->GPzk2vhjarz$}Fnv7_6j2WhUgHjk^bx-vVWVAh<2W6f^XrNu{b zTt&UE&uytAf$wj8cYraN}wR*t!6 z33)7X>-NVU;}W|c9f6W`yptaUC*D&NB`7mA{81srp_wq{=-cQy9KN|d%gnI@dDV+J zuDM^bWm2U9)8{aYTZ(MjNP_6wMZg}g|5|Fnz#2Z*Zft;jS1x}?3Hnnc{_{M^F}Y)7 z+E@6qE6)D8xtpVD*PYRt;(F~_ds&No5_datv98{nTd|ZLg7IYwkXTXOgN+VT9)a2+ zv$PUYHZ%@N7sCr{t0<-$OMD+u?QGn$rM$vaYmfW!u|-B-5`J-L!~4G6$Q zk3Og-a$+F~iV9HHYsso*M;q`_G?;)0<~E;^Scw`G%Jv`BSq(ZA7VonO2%T1m_Z5A! zGkBlVzEwJQv5hVS9U)svq>LgRGkF7dv?Pno?v7f{8*!ImIRO3I7qS+*v~5% zB?H#!;1^0WZj3rO;sn*B4Yv%W2v_9)y#R7>$bs&Yuu!~r1-mPk6q`HIzQ%u~_}*HF zf3+xux{N-{@@;BU=y@+Audhv|U0?soyuQu5V=4+FRVTSUH30AsLUL>89g#m>%8f45 ziBJ~VNhZ}+O=JsNchIi@-@4D<%;UnD@ze7cbQdM=b(gf|8E~@VpZh1VW(+519TX}w zCoN^bJh^qGYXsKZ0M13AZ9q+;uFOEJ~=F6}rR9TYOAH=(B`ClAMr&D1WHX$HaFGnFH| z4iwJl+=uw_0|Xg{?+&+zLsa8A%qS!FOK7}{0<0U$OGk|o40F*Kaedc1mTOnAnf#Ac zDZPKJa=6YoAuh{hj~SB;VGq`P{*yk+Q&LQ{=i(*>xS@MzIhM~d^I^sy z(N?5~7u1JVq%}{xokf~AXn=1hd8Z|s(-SFT$!|U=uM9Fo$k>d_ORbMz3_ABa zx;e!$rX!J*i*EI?h)Dxz%Tup@>aC#^HRSC?aaAh$wLjwp2FXti>mI{GM zEw4bkvB$U^im~SvxKrdJ1Uh)vHnsdyH$44UrcQRM#kaz(GW^N>1%DEYMCBq~>M>Q& z2PK{ArNT!`3#BrcIcZIg3D9Y%5ABd*F|?XH-SbC*QI*e-6OA?M2GyuF7ONHRg>P{Q zB^I|1M!_*i$A*GX82pn?p1l+&v9f$zc;Lv*-20)<4Uu~jf8wDF!bf=G0dcarxNc(( zaI6+_a%O)0Cje786xZO1f9=qtpYyN(wL^D2|D!~Xc*@wpD3RSj_ftShfb*$y=vuIo zQ-Ftr>*b$6OIb3A;ncRv2o;>^vT9;Bf}l$c|1X)BOyat^kQD!?IL6Gl986vu2)?IR zK5NJk1w#M>bB<=cN8(w+ZuyT=#n@+0slwT0Od@9SRRtZhKNcA7rG!_Z8-1xC}DAq9$0*99cv~&Z-iN z6pZt;fJ2YoK~etZZEc`V%DOgH=~Yqa{Qb4eYpb(_W1-{I>oYa=SD6X2szUsU+fV&r zINL8PlW;h15b3Ar3w1?|7Rs-e=%l}NDaHB`?5v2SPsIGtLDf5OtXoxziHSdS58d!D zffDOq;Cas#iE^|;p?AW^hQ=I}4O%+ZIz%OpEAh$I+?04*4wB*cfoGc5J{9%+l4xHQ zw~>!>jppe^V{MoAhYrd@jn%c zd^>uZV*v)p5BYcJhE*hakN{RXJimRMSdg+PfhvI%t>z0<6WVG>@(esON);~*STD^Q zwb=V~uQ~6Yn;QB_5|?ws*R8!}YXrdLVk`?mN?9*(-|^{1oF5JW_Uas2fu$7DwCN1G)k!tNm9ZaKO%73BsMKKX-OlYv>Blus}cO|c-l2y<}}?ZIYW&YmaVHD1;sdV za(9$f4Ey4Zr{Gw4S1<`t4WQ!9Q?4llEU!FMJW+a6HRrh4ac zGqA>UO+fgY>(f~K=k~1|z|Ri@9tB|_e^TJXyB!4jB(*MB2OQ2%EAoX5bsjfvH?Pvg zF@PWu`jelP#6(gYbXNjkk8#uebDx@EiGyA`Z?JyhG053-r_3{q8M~4Ap8)9Kkj7!{ z(6C5kCD2t1)(uLG7XsS?aYdDIIe=rC+H=Z7!4yRtX+(d}I- z7wgMNzS-6&Ew*+L4PTJ2W*aMXj?R)?sXR)R z=`cwY)_C~~3u7JRZOssnfrg9)hor+5J~LDfg$&bR0j?;eMLJ@9y7w3~e(8c=@u}!! zPKuIh96+rMF($SMxGeROn&Q#qjPj}o1o`Ch@u$qcKofNj1#P3WOD_g zIolDD;W`@0)1;U1fv@+B9e!CJGpc54V@aR)I=X=GK&aP9*R_Cbrm={l-&H>S+1kg7 z%d1my?9H77hs+zDux?j_KBv-paVSfAejxhhSVF$yn;2Qp5f?kDCw*p6E-sIE($LSM zs|1fyCP9ZV0UW@zXs+tB&wD-x-3&J22h|65&8gfDHaTOgMTc~95kkzalu#uST4U4_ zVF&i-kL+!$O(Ea9j>L1R2=TBGo3Z^mGuYLo%oSP|&BVP7?^fSl|HjOeljHqUVSAfB z{!52Fdp%#0GI5=|kT(P^gI(x+tv{4Gcq?;Ki;mPh9(|>!S+JG#r1+?oZKPJ1UNMSk zw4uU@Uv_m=nBUvxv4)5}d8pTy6Uv7Ffyow*WueRplUQx0*&!U+NHkG3K3Cgi5-pv3 zmH3?&x4&a{Vm%{`xz#@O z5PwoZ`;_nJN?|`8A;+HBS{ur}8o#EPh1Rf%^N93M07?-k=*}vz8NjC>-3%R;2QXk$ z41eeiXWF9n-v&bKMDs2fokm%8lK9X`4vPItP;* z6R10sJKWE`lj3ja%b7Sbs>10K5y6d9uyk_{J3|pQJq@Sk0S?ctae{fgN@P)#HF^1k z7$a5ns9FM;zX#+>xW?Wti4M3rn$HrK`WiBZxAX;tJBtthPi__`}Y{5uY6Jf>Gk z>x6A{2&~|hryD~qRU@WBAaKDG{>5;aN-zd~f3tLoMm_XN<3Jrmeeu#@j@&h1^my7KAD3F+L9tJ)fs%$JB5IfY3r;pex;aI|m;3842Vraq!a zHI^~&4Z4_J$CDLO^@ri~^h|rZGnMy8f!x)aJ;7NSIgCeD;rrg_A=OBzWmXLwVBfI| zf_)}Am+pSm-n(VN1RO$Qdnz}VsYS*hs~YZNa%?&CiK{}ka-?jZLzi>A%DMc(M-Tk5 zSsn{ho|*%=y#WRdQ}EFZ;M(z!;g_lOT4S&=4er4oi)bzFVS+a}O;sAXvyg}OF%R3b zhL3&sAG=)mgMJ52Hv<0S1DHpkRD~$P5J^5;IvZ`UParbz{C|uvW2yfbVGWxn0MC^q zQyt2{yj~}=fce?pfak7`05=)OoWo%}wsEW!Z3xg(xn_<`gY2CR^EHCqZ&rB3_$rG* z-LBG!pq&Ro0l#BD!kR;HkMsbOnF-p!Co|9BQjJPFK8Vp3w|kC0nu+w}2j>u;-p>#)bGymKv} z@lTt9YqO$bd!XBMe`{ayh)3AqTUe;qNlEy7kwNH~+2*vTR!c=7S8`QG&+2DZIM!-f!EaNrt}I+lC&W0q0)~on z36KLkKb@vhcQ5IL&DX`iO0mMPXhX1KNS9R#_Esd}nOeKX4cifi;C-xE2~LsASpUkY zeZSpX`0`uIjs7GYQY}yci*6I%rXkd3*deBESc8a1GWZ~~XHC+;V$_-BY-%iXMBaN( z+hQ?lCHCY99Fuiu)Ix&@Y&WzD&;kA&xB}lD-qW{iQE+YMxME9x4Z75vg=~Km!>W~% zKvA*Y?I)~nE6KT7^IGi+_wapK>2%h2%7v^Ib-C4iHZ>@Z&{tmcF>}lPL{#~sR~JN* zyJoahic-02iMRFGduQm-h9g?O4%J2=q{caoP6C@O8XiwsJZ39v){4vst~eogY5lhb zg?$1|{Vyo{1G<`v$p(N92Kbi;&hmkO)7m)n9n*B5xx2EzDF_Y|f444;5}T;6(Q z_`}N#){?kI!=wz>_G4BJi0raml%1X*zbLb=MT9c%P`yKPaYYoeE|2O?U%=*~nKIrv zA+o-bi_V!gPj^l!73Ag6OuQg#N@|OT&kJEk!pveRf-1Q6%Yj z^nRmQ9byIcXX^&CZ(zuw$LLW2ax~p2TGun%2lc zU<@A>rYeQ4S{iuROPND%!wuvcx7TDmZU7qC}*+^ z1E;6<_(Zhlwvi5O-FecTR3~DUv|sxB*_N+or~E-@nKF1z2L(OGH`F?Y&oS}e37e=m zig)N`ER^lyW*M$NYGFMU!Y?CY>XBgT0B7Kz&La!9eILJ=^8xaB^995Ylul88<@YO# zVqYB1psbs_n3xrX+>o#6zK4wp- zW~qa)&;=O!97xNzm+d}@f&T`<-9^L5Ib+c2dRVw1AvRTcLo;GW`^}ziOm{4e98iyA zwVIyT+R#3G)G_!I<5-1h5E&;sVWc<0L!-5AEz}{luErEVXJoC$MVw)~hUf-0@YEp**!hOD zn&@8{Cx2@NoLu%yFIJw8S?)sB^k6L-#pj7#?boE+saXCb5LNXFId z!qoax~%36Te4vLu)pJAhxTGOvB! zhZt$;=d3py!6=m@*+Z683P3j19B|TxYHN~Bewp8+C2*irhz5&Gc`z^e5l_~!_5rTj zxo%Y-GuLbYF7ust*xAQA){n2^9eqd4GGW-wXv~$pQ5kK@hR_u8(28_1Z7P3x3YuO(jojxJe$oLqyF|EVpkO+=4{+vqhVh6%)l|XNvj>dCN z)2PZs6vh{ENLAy=T!Is(A*EK)ufPkeA4Fbdr06x(BGYXyIX)OB&%Q`H1upf*7l*cB zGu4vD6bb+vqw4+%fHDH9On=5T83xFhhBd>%02#0t3xtWQ!h`kL54HyFgn{9K!t;(; zXeX|`>zUvA69ge_o$D_A&Ej&?t*oZ)ArLm71u|RG@5KofvWp51_~z-fGD#gus#uky zyb@w$f?E=;l1DWu)u`=@YSqcoSu)J$qnzj185hK+7rEJ1-8f2+biwuv42 z)g%xpQA=JiT=rAFD*COExi}jxYC?9liYjf^v}B9#C0!AL zTjVoo!p0zTgY9*x)6`mVs7vYcqIeAe>y*e6ce2rIq z{FcwJ_~6KRsq&JMPXN^nk}{xH&gpNITU0A%UR5wLq>|P;OQJt}&0Wq3V9(@-^W$Uu zOpzB9!%k7taZNE1=ZdsiGL+bS^{I9yKC(nW970A@TL55H6zc}BKH73 z2L4tx?X+|aaq{3>Q#W&+pb7n%Jyl@O?$Z+h_|>QW{qOt%1w@0rlR0nr&f+r7tkZU- zvAtg%x{|FG`w8*+_5R(HEHaaB>~=1qej&R;pIaeePg(W21g6aWQl6ix44SZ_tkF^e z+)sKJX!j3mMJ2|+?-BWioaTSzrjFr_3A$htreV(9BxslLV~>pXa4&GRU#i#uCL2H9D9WPzIYgt>F{{&ze zf%48DMv4#d`3N<=u)T7(;(Nx`9Jn6&C}W3K&(|F?Rj7FDEcWz!OyI*!=u}t8g9rN( zJ}sOYlMqUr1h;_5JHXPdD*-5f=0*PMbN5x5&4@fVdJ3#U7y%=hHRC(sU+c}4(tx@! zgjCDHkh)wGD|{ib>rtddw?lsfZ53UMTrUyVwqvhd#`urEG%K zo~q`s&^1MvngaN@wXj9t1=Js;A@5~$)P4oE?>qj!b6DYpb3s{iKx&R3Z5UQK~@1M7!5iz(DiXp0oxY+w=Pf~a4Yg<=yUG~N3qrY;^x?44H(`2jjR$NXy>0)sFzstSr79t0UoMGI~mdPR>hhP-ZW0=zwca3!ucL1IR_w zyd|jdoABQ6quE!lkRsx^IO47a@+vP-L(#5WRl~Fhhmu7LzfxNW5hP7r%fqN~v3#tf zJaEa=P33*jTTz}iK{F23M>v%Ch>T-!iZ;4(HhRKkOT_R=qFPdYYk_(jm~U@&3xTW) zxf%c;TRc^dQ#*}DvK-mPO<%~Yb6c+NKqCiTG9coNEKn_oSoaz(iSfztNTFoYm5@pgtYeqXpZ4!OA?HFz z=i%hg?+yNWbgn>S){bZ4P1PHS|K0M~x0ZT$q06nlb|6vTn~x?`%Jsi?oYJ_yM7u{P zrgSiI=P6^@O@jD|q6k*-WwFClOC9!LDEVfnH`P48c=R3K!o7xA7Z`ox{&zU*2D#%bv zf`;Y`LLn$)&gemv{!FIPEF1e25#;;yu8NIQ?+gqVy)t}kTty(gY7OXT z86<+?9Gr$3ky{)_ZcFc3$Q!e3h?QE&S!ck}*Dkq49G8*1Fx4oykcJJ!$T?Hp%K50Io#T=DIK>N>x zj&oTS|C^0wg`8wSTJ&n_;cmBYnLcS7KfmKc_6oeT1+|6f&49?jD*U{$#@%3ZR?`+? z0(8vBMR~z7Z*nqc5(0V-n>5i_>K$Tp7>6S$U5p$HwbH&DHXaX)qZ#XaDg-67L$Vsf zXDfS{I=0xxAfWVuUh>i)Di+3`9`u|H`cWh?%qV3Yp+kk4W1iN0hE^>l)68b`QKLpp z1#>=pEf^;QjA>^TMsj#Hu7zO0D& z0ei`6uycv(IqJHGTh3Na&!|eqKFB{yQtLC3psW%r=3@O1opK_`ba04s!6uS(*%KYJ zRC@{0lw=kc1nSzf{&dBn=g`ztt*BgbA{NxKta*)7=rVusNi89Mm13Am#3i}(H_WcO zSR$}`qiNQs-bq|Tm|(>taQpMO|KINF-;b65StRKO!{n;Td|rf^)>c;`n9$i1*!;%P zNCzNV_M2`t-2fzFY`SgWF~AN4%Q5iUuTI$7z;K)ZjZ?Omb?4TtGlT_kGV_7`Yb zg(tE(N+BtZS;_6e4q5GSzOP4cU)4Jn8-~3<@OmAb%!R+$yKRGdSVi!?AZ$CmLs>no z@#f2SEEr?sKG(o1Ir6TRxNH!zMEDn8Oj|?-_=*aa9zC9zsjrd**4ixTC=;h1!Yp_# zJ#Ck=vK5JxLcC(c@`oK<#Igr^(lzfltpr+{=-FPE;MfhPh6tbQwk~ozb>*7nj5!2p za5Loh_seS>I)Zfq{nsdx6}toz;rNREWqIA&w>UxNUKSrc&bjF(9oMIpX3Od$6b}R0 zUzvW!CiyOI)>j#M5v{wwCq06i)+!X{p1AN$_kziSP%72CB+}@VQ3vWJbROH*NhNZd zW9Q%6r)?6nD$qtei?kegv0bYy-RvZ6=&)yDau*rW&E;HZ*XOS?W}m((b4kVRemAJt zSgI}!zg~=_MUkFDTiqRU2p%d*D6>=jiQ;@%Le?j&Af1#}t&JabC!l$C&D>BL%g*g# zxuEzDu>5SNi)Yr*}JU4g~_ow>KU9c<$D`)<4Nk4Pn_{p{Fx3HyY zfd28()icWFpbK95c==_+p7$-lah?9Za|#Fu04XWl=Wnp6Pm;N8v{-c2s&^rtF{_ja zJORi!&odog69d1GI@6W{FB>=06E!RIZ#EBq5`+|VsHI$!gPpN<$xnK6$}emLv_Hb( zv#Qp4gR5yx%a2vk$&sMB*_%1>*vUoJ8VMItkh9K6U0f0XSxKCLs%@=VdTEzcKcPX%>JtR$U5*XvgjAxYUF_%=xxcdH`+{gXt~!z-sYdFO~HDIse1b3 zHt(~t{8_z)?6l3+#hqP~J=hKD+P}M} zZhr>_)&IUI==m_Je!Er+qQxXmM(4~1f8@|%#5RVEEsCH4pwR#!00121v^3T<4wQnv zsU+YK0?q}G)($_xvxbr}96#b~CN(}R7mXeqR?@_G!nhH?u5pV~1r zO$r3AJGC$J+}N1x&>W$|J|s#hP@Jm67G#{9YM21d2UV>3CAQ=Uya`rbb1czzW|BB` zM%Hz5f-Ge`0{EEOVKnlb{+rhkV+}3P?*xW7y>>(W$F7{2KOQ?jOgr zD{+MGTzB<jbyfNGyba8kRmh4BiK;XX z9mYUcee%A2wN(lYk|dbej&+mi&JRWm=kCE0ILt(uw$HVYdf6n4%)fM+`Xh8^u-;&1DV zj+PAB+Zp_TXd(fZmxg&6o}mUg@0uw&JU<}^DGZ+*lf*J;_jR&fZftQ<$}__9B% zeD4{0KL@TLaj92#Ix=(Ig;88JMjA^@q9B9YN)_`aL&I^Y;`im>G%ZG7Np*|3UqE(l z#XMPvf5(ws4*6T74R_XF;6Dh^-!Ws;z24uBTMp?x_?ATg#bxR8q+a`*S=jVEV(RdV z!c9{+cT=tV|K4UKrOZ5&Mh?2v&JR72aKMrc?aFWMzK)~FwLb&{Vt?htU~IgdSRHGR zKtV~(g>g{~BuRu-IyYC>EfCUbBSVK+K6EsDz?&y+gdK`j9>hN zMMd4JdVRdOizzm06n^Rxov{rrsEQ$0L@Y+YY1YFs>N@Dka7f5$9 zGfD$5&Jk8xttKr?H(%L*aP`lN+iKa13dD!a5Jo9YrRl0!(s<|gOn-b&ijh|#W^8Pl zjfajwtfKE?<;IdTb!9Swilz8{X5=4n&C8i(<95wtomrq?SyTjCgR?J)ujqH{HARpXfwQ=4>`EOQQ>4{>pTNx zZHVZDnA$Qx0 z??37wL7sUK)wP&9AGhr7n7PZo)+Hg4rVr}~`5h2EAUTPE%ev_&WQhQZni$#3#1WEE zaCgpRMgfgkhJovlIyGGx#Gut%a7a|8?9jxO8<|X1HYPOV(Q=;)lmDj*AqRl*1IjNs z$s6}G@cKGj+JE(lr&GGR8ct{^quXih=z^aGnxNzF;}oa4vb*9y4#wsy5aG(Gyj}eD z{|pJ8!&3vGU=d?*2rbH{vCpNth{kFwikB5#5LbwniVm|n_F~U5qW%X~rkFAGoFK2| zFZ%G`cml8pQA$D4IDS;Nfpc8AyyMOO!x}SC&?PO~Se=>myA%oreh#^;=eBu2x_%w_ zSU&AoU&1vniQL4yjvg>gC?Z0SJGX26Z?|DzbYEp5ZERx*Vt-#jUTPsEJx?icK?i@s z-MJX_=^(~MSW>fCZ&O=yVYKu1+r!e;IE4%kZ!gKgXtU#U_@t0$ayXug8uKFBwj)Z$ zmDMJh)Qpr|;?N<76k-vC*nnJ7(a=b96PMP?o_Q<@=n5IB_ocQq5_lS-tJxk-PN+hZ z7K`%n?Dxy2(Kn_CQ%A>$AQJGOO+~x(QmskoNLm z(?}0XX4KDT&%J1TA;3v#z{Nq=H5LkItGx1}HGI-ht0n2!qPC{;TV1}GMk!Hc%WuyF za5R3e=eUk*qP4?nJCO&8`rOa@=e3>wvF6+AL-$>9|K4SBy>nPoNae?U7v*Pc0IX7N z2%ED>ePdP`>o8qoK%L1tGbba1N%;4{6q7?pv|uGt0NSM)DBpn)FT0sS4HD-|g!gt? zOkvVevegONU;d}mqK|;WugZBFlZ4j`*IF+>r-;@vxU$S2S=}kqtHbf};0m!J;^ZSDLpGi#N;96;LQ+GC7YXzib`>$?{VQ7 zzR()_ce$Dnbc`QjnEj$%N*RSdhDn>R4OiXQQg*aqIZ*_^Wo#N+{dD`c0d`v1U?n7% zv@wpik^_u}Ms2;~JOcojc7ki~C5a5VbsE~1B~lT!M}5nEz4|$brbUfI^~-1pi;w6c z^Q#7169ft9Q|2ni469kJUd?O#KU=aaF>x~g+X2Xep)Y`{cBp37`IiVx7H1Ba8}iDv zg7HmhbZ4I}k?pqNn&6{8cU2$HDn8!EWj51r=#c~OQ!y9&D_+ihd^;TsrN@3jmbiI6 z_p?aQXs>RzME_2>=8nG~QJ3RtC&80uX)Mk9Wm&gL&%#MP*Oggz)>97sjM#p0P%r?( z#pwXVCL_eXEF z01P>Y36M)nIB=qXHd8Y(zsl8BJN>q$16S=_@!2ynLtr@40|pJwb)TB_~LgeKIEO#sLUOep-NLU?w%lxTv?X6F3zIK5!6G50 zdXWT>p=+m*9c$THSF2(`|50@gw%D9)k1ro8E0%qGqdOeGA5IMvkV-$PIMOq1gpqi! zwFIR*SYmM*>a8&jPa&EhAr+&3aYrB_fMU&4<>?}12=}#+A70(8n(Rmy2R2T@gqJPf z!r5%75sX^*zv_=(P#umNDC{6R=2cGlSv203N>6F}0k-=>Wig{d2$s6r)ii1_QL{Xm zkS`B3DTT7kpThw+pY{vU?3LLrT%+i$B1_iG7#qY08Em2OUvZ$4zFpwg=ULWz?pc0C zW9(jBFUB{s?EUrFy~z7n%Hl`RNZl^#jKzF#6xY)qUSxyK?m;xUU~O5(q0LIUn7|RS z;Vw6{e|pjqLoOzH9#8KwB7%g&<6#Uv&4;FVD+_*1=~JQE2oGeuWT3+_MIeuV&#~;N zI*u~q1(H9E_!v4~9?5?IP!5JkS5sK>HnVMK@X2;!w9kf@XQ;Ee3YDrVvzh5_WTA#% zOZ?@5Xh-h!?OX&c(rxRPZt!R3r{c-V68S2M@dXNygZn8#k1jsRX?j>?{>0%CVSbA6 z>w_dB!=BF~W=U6FY`I*GE^2>g-n5U}l;tPsw}aB7@^rn9+CDbV4iH{0bYzw>8az+V57beVdlR1hSI{+8UD?vNtVuq$HO3(p!~!>Ux6rVfmSg$sL7b-beaX6fM67sg}othgg)n_>$v;PeFm8{s^MGTx4(Edw{0QJ%+ zq^t$tW2Q(d#87rHBs_Gpk4tF$2_Lk`InYoQSn)l|*iwuVJ9~gu5P7oDuW>CEuwpSs zX9k^`>YAf1P{qHMlYk>`7~DBDudb?thb`l8eYuc8I}d{CEJL<@4#g0vygvW+Ev!zZ z(`ncx)~cbdsa8&I`e1T-0~Y6yUE%poTQYoB12sl6wovR~oS`GME$G4fli`r!#&|HE z%(J2xAF!pI?x)XNE6znuizI$wq_F*rW6cgs&pO;m;MfOXhXm2qe>VSy=vp{=T2zh(nHep2k! zF+a%w`7rlZeCJs6F%2be)B$+%zFVLC7j+usv*=T5E6;B9@0rM9UcIiTbdWv-5`BK{07f#3jL;BC0vEjMIfd29&L}K-$+{p#* zm{($bm7{1rWBE4CIfbp39X_j&1 z{{X-Pfc~qhxMXi;UBJ-U;}GqjQ)I%Vcy<-)RA1KEE7-!^wfy6kTw635#5av`7K^-I zYbVa?ubIc>v9z9>e-_52Y7nA*PUph5!>Q78c5xJfKi3%8X-bxJcIr9pq~6o`;EdFi zlzjwdSc@D3XjgjJKpchwJI>NSH$S%s4Amjsj52E&!9J^El&GF} zwqe*edE)3=Qlo#BT#^N-s{_Zu74#BB^T)RO-|Mw}ywLyvfB~<+=plrsjV2JcJY^`AeH-uIm>a!dWO>4 zP^~SY*XjD~x~}`trYaH3202ODD=}vZGg94G5V0O-&5r}QwCE=)9d9eg;E~AOvfXoh zIgN$NN1M?LckHMiR`5C8VM&s<`xa4IdFXy$FLtBPGByrc3C~tAhPvuhEEC}m?bJ8? zd(*M84+gD;?dQHYp9NL>k8k`*{i29aJL_>p3VPT5AEIGGi;4y?t&PcKztI;3+_S?X z#7GQHTP}ZLF?*=Y_VtB`-!PefO|6*f5P)T)N}bZ|TF7r$%|W>G)p=#?dHT88Ms${U z{+ovUJ#AY%*|194qG!5`=y-u>UDce`laY;;z*!>(WaKJmgr7Sb@|`c!-mD0Lg>~xt zX3EsUSWuTzRZ4|!Kw3Ah*_M}b31Sb#h*wSO*)b$xq>e~&XJL)tBG4qQi_`t}XlqN& zrp0LMI4h@wVB>4nzv5Q0GKW8pxdCd=YxhgOvn7N+&#}6|;J-y_G}_Am0Q|S+lmPsQ ztq{zuqO)Lp%8PEEf~e$pP6rem)N=mu9*gonIRy$@;DWx)?v%q4HQ}!Kr(F&0$sN3| zL)0T~EF{XLwLGpDRVFC1(J^;>Nu$bAV zRN0bPTsi=c&7>~{nW_!Jm4744S}}8}3VXU>Y5TU!*>h&!G_)^21>)qi@as1D$Su}> zX6WW>pD_Dm%XjM8=29zQtxg7X1f=sOZx4RmjD?Fe~dwkBCfoBSZIKvVEa! zLpRt6@|yi|I~(1IJC2l9rhsR3wJS9})$5uWy2^}Iy}^Kl9gm zVVjD%DOEz=8N@Xz#{@bFoi)^J*}A|^6z(9$#LLIpyEl`bwL4ASr}V7r%RX~P-rb#2 zSoeLzB&dRVzVr`+f_9QmJ0t*fyaD4@QHwAPmxj4OR8|XU3aN9nyCeD;d;T$zV18Av zY}uew{CoO(gYuD}Y0GZ@&y)C;>^sh5T?=D;PyiP>P-c;Imea<%RHgE!qta1qDyAo{ z#X2?Bikty5YLHx>b&Mp-W(?a3e|+&Zo)J%=6LQ(R$Ni zS=6lM9QYj8|LYt0tZ-8FTJ&XM_~k?iqMxp^2H}HL&&=??FJyf&EVP+wq)R)Pm&aEl z2|S$#*Uict-{MVgeK2O)0jW>yzB{d{dy|!vP6%wDS_Zi3W;LrZgTVZ`ti^CGcZ}<1-SnJU<`m6 zRFhZpHZ$#{*Rgd%vM2m2Pwsei6*|vmuDH|N35ms-oHPXOw$shIzl>J6XogQNnggS% z##|0S0_sy0J5OeR{so3@-MmmDQ)7zkS3hd$!|p6X+J(bx6G3z1%-hHR8o&B`5g|yG zTg76~1a4eh-@JmqOvN+D?GLjXH*0XZj1KZrFjd&ULa6E$K6jlGU$ZSMaHh*rdKtow zPl~Q;wNAOu+=pyC)QdBUXv%xNU`8_KWxfm=|B<&L*O4qouN(?9wgNHIdpUIxe%5D@ zzt90qs~~n*JUp4)u!C%N+)ON@%p|B<-l(JCiI7Qo_gax6v$!k*8Rh+=ZyF>jK57|a zX&vnFc9Jd@j7;e*EqOum=j;NtDr(Gw1762O<&LwtM^Z|CUE7uuF4Gh^P<*smiAMxo z7dT?1a|Wq26@`z zoP?8h7%|#q!VVfcI#=XjT4xLhpc_t0kYwn%hhJXr^{$i5YO&MIp2}={(?*l~S#p<| z=#@2ik4hD}XgmaPYcPAww0IXc+rahzxcse*@&tL$+jJ=b&nsHh?NyQZ% z9;0x&P1Z?Nr*23;~_ON|K&P~3EeItSim5djzYEL z>4_kCeuIcd|2ykD?Gd7RI1JP{XyWO<-3oLTEmc{9wV~AtQR*Js_6E_P?$Y1>WJH>m z=8%5lg|*9P^m*;d$KhotxRG^z=T*yXW@k^N0Ke)P2K+JGcI)oeMsL!QUrmik#68GY zmqa|8s4J7pu5E7S?c2oCc6>11rr9j!Y?Ww!F2{%15??t@Gr3Qa`Ql zn(<1D8s(>Hr!w$4Z0NZ7?jjH}#bi4IOqpuk2r3RI*IXv2b(AkCfi|TCM4Puw6%Q)# zywq+*v&SWsz9Y`g%wTDY7yR>kse6gb>h_8=q`*}khfou9Us~HPC2UpEbQ+rQ4~t7N zkvyyRl<(CUY{FQ1m9g*)_t8agYs=SPj|f|_K6{7kI!L$r2OV}QjwSj$L%cX3hG|FJ zUrM}r43->s_q>h5ecF{niPlYp{R~8ndK?wEWp0R}?y#3@x@B&PmRlp)EdrKyTYg}2 z!1QMvXa{oIM5{<;dJ!bN6N0GHM+knp)(y8C8b^3=M`Aq%-0+%eY?28^c@u{(yc%~k zM9N+ILT&D@{2kY=*|`!VlR*lYHW9n1GN~c7Q1<6amv}`lkm%N&`kIBV_M}hwZoJ9tveyn3_(cHd+Y{ z(s&b{eqNjgvDnwBVNFQ@L8MqMNe*S&aN}4Jzb*ps`KWO{-4(ycx>^~SYoQ|rHu3GN zS^pSC)w%1?3}~zu`o2a{#e{4Uo(U}4e-9(~JwZc=qwm~TagUtOG6@_KYWyam9j`m# z^a?JEjKy+LIrr0B|2I|e8|;K@c*}oL*ZXE+=W+5Y1O%oR8$%v`p9X(5#F}OH}1n}je1iZ zYW|9v&#TIV`}lQ(M>p-ild8FY&g3_qaJd9tokAj>X7}2igx|jJS2=zbL2?e1yM^5E zRC>87W`AHNW8^TOWtb$K=#wNWe3*Wm&*r4^&fTdomRig+V_dLI_2PDN7}}OitvJt8 zY4sbp725ZZ=q)CSA=N3Og*i&_>Z?hjzrx?3+tfjRZL+Ob` z8q3TtssxBJ7|wfoRRRN}d=%u!4EP?ZR9RSGf#8DtQVe7a96cdAOz4&lEdkc(@OoW5 zOdNzr7AB8motGc?qa}-Ff0t6i67>VfAG%;u><+HHs{^-ML;w%~TA(9Q`Tr?_I@RR6 zwau)XCw08+kR0??4QQ3@kW0+zsEBrY8?;rB%{Jb3*2T;yQS7VDR}&pCT1)XvgSrfQ z>Oc<|0%Y}!6SgDZ2j$fQDpMxW{Z6?Msw$K*dJ*iRNdZSQ=?$&Jf2XMl5GB^~vl8vE z)HoQ-wzUiJz8Dx(lGqBb`_Q0mLr=^;-mJcvq+u=1z9u+4zjf{IAH>Oz0UojXO|M#u zDf^Kdy}K#iHDlwl^b#=~fyPI{>iPm2k9|=if(NKaqGitz^}$xF04O+52OU)}1tCU( zkAZpU5;zpN?@Cz_b5cPtr01I+)0!%Qi%n(sM%P2!tvJ7qd!0v`Y;J(Zny#mK%XJ~T zjZ!iEqwD7jZSv78mEDU1rhH_vUlR7RL=KBCbA{Pa806zd^ zc0{854Gj%N1rnUt?G{NmL5cz3BtjN+k)_<>*bDA7FM2sNNK(DK4^`wKxo*|w>tbve z^W!b?i0CaCvqjs@HQ;R@0}3c1ANn>3oIh2775&r%s|G^UcFz{`E~lNePe8s7LyT!a zC+A|FA36k#tvcSX3tPneHGC~wwN~QPIrKL01Vcom&BAMN{k;2O`ajZ7h)L+?ZEUfWMFkgq#KSWSR|Xu zzpR26A#XZe@RDB7RYx2`D6z$qpV@2Y3FTrnb1cZ)q`(}z+Jk<4ndSv;MNB;Kob~d` z`^2|$f2_0Y_?t4kQ#dTl@9JMdlXKhJug%2(_W$hw0GMPQ1vPCm<4%T`XeT5GOt6JG zSTMdirmE5-qp{V;r_qPpkCC-IaN{LZC2yxJf7t19sn`^Oa~W9>@oLzT+~o1Lr{M#o zAkhKLz5Ng9`!^_v@W>+794kfz0H}qTBmr=xMnIBg3qmx&V1w{Ti$pSi$mWHV@6keF zA@X1jlC^v4uirhe$(vg@=-JiQ1i9T@igFC#13 zZ~bJjx7k;-a$gYDj}k;3&B36M`&FfEtijnEdpG$Mz4?2z7H&mV0c@di&B(M%Uty0} z+SLm7VJB&ETrx$dKt-FH$tY?3F`^Z}nlZX_)vMvc{7rH)GhrN7-MU6>!2k5vL9yP- zuT)vVKMWX9vL)Kw?73sXSQg;Mi^H#VYWp@(7{4{H7f=+x^>p+xE6(wi|AF_Kc<=K~ zLrrPUa(G~I*+HP9(;{ixe8&=;Smj^r6ga@b(d3^&3yYx>>lyi0M=)cSutuf)9Hqmc z=2$7LwX?B@GMT(bf zg-4UK==0)FMN%zfjM5(zb97|cM+z+5k* z@$|ZTD~nZN->bYS+Oup_k$ZY@tk!M>xKFz0Z@FdANfvK&_qUcu=6}Q40|3ZE2FO)g zJ6wt3dBQz^))7$v>oIHX7ZpsHa42T+a1=yHS$7#tueoAY8F)RFJzAu2XE7gCz-$Er zl?B!Jc&yV|-Bu_jU2j(%E{Og7vtKyrp5?$nZ?ziE@B|U; z0x1Pn0cmC|*f)F=mBN{03Y}9Tg-%P~V7^FljG&ydi8%PzWUN^AJZ2SDgPj9LUVFSUA2|NFDz0>sH*NR&9H1!|ya+j+~)9kw#bCLcEheQPC4)LzXBFfsh{XK&QZ{p-Zx7w@Tn0>0^!BW6bmmw4*1RBm=c@96V zcV^T|6&1$+n=`@FNS-)4GFT_-Z@hN3Tk`~qSM4c!JJnzQPqH_G; zN=?kc?c;qS{}CE9ovls2EF#u=NQv(c_ohoi(r7ZE%7Vgs#`s?y{k&_R#2@m%%&%6N zoc;p&scYje)VJMWZZl9EbBD7b z7bW9vAI;T0_Wncp*NOiubAH+J+jbp7&ty$=yC7f?L$Fz+zsK)<%TCA7$ouRcm!bQc z0-bPIc%{vk&~Y953LaE^=bPox)Oqab%8rXIhdcPW6+fhfsCK5b7$?Ll4S(DcMB2uL zd?))p0cL|!T{YhnwVrVu_|ZJhk|&g&Si{lY_rkJZaygG~eOFPz0POPbujlF88eXrH zKD&V=dc1xVo`f_vWR5uzyqez(-cB!Sm~V%oH0y&P=lj_T@ZL}1wW2p1(v@b}R0_-y zlJup*Mx&?3VQ^T8=wXmZT;F@sw|(E#kIuQ+!8p7tu6=nMft`MxT$@{`CvB~5EHhbu zf~mVTRoARr!lHrg3<=uREz2r`q)|;s?3V~@{r(F-zW9dQvE1V!&Y;7sH`ePAm~b=d z-961&De|pUENLbsc`l?C)rkU|l_VuR%=2X$E`=K|M#v}j!fq!DJ*kQ6zOTlf-nEup zlw@D4F~?}Kq*R{YZLMsUH)&)TuHXv%(U)O$O!r^pDeA!uxA)*$t9;CjJy3=p#_KTDXsF3(0x>(NGw%spEXu-j+dV0sl+1Vs zF_H<3Htws~T!@W+H>a>2BKrFjtnOHUo`6DvyqaDl3~vj+{~r#JsU^RZZDu@z=;Q0A zU{BDiNT+0R70O;kg*?O7_ZS3ir(-gz8Z95iSB3h&e8azzM8{=56G>J?) zu*lsC7MC%0xfV7Chw~~C@#J^3N>Ak8P3jAfvdVh!=z%l9_P+Rj=F&VHC>F%5Od==Zonr59%P>%9ur|Z31 z^lz-l(1U?|TCLOk4#=4|(RPR(F&*bzTw}^{4rLzOC9}MqZ}J_NS;@KFfb4DLtK1>} zGBu6u51j5(SW6GXR0VLQFIyXyAB~=wAq{7f33rsts`kL`A!Jx_rOc8-ZcOLTWk>+7 z$PKK>eVIw*4@-{8ua_7mCip=k!4YBtna*h4v0?d#E%6tuDRtydxPlVt`27w#j8z6S z#S%j#FXYbslV6~#8+Z|aFvU#Z*`)|}cDps`-KOoWI&~T1Qrm_!?q#?Q-=guXv|;G9 zfJR6VS|77ZH^-ueR78^t_gc|GcpQBCMtoMN8zJz9XSUQMAUQTV+opr`Js;ZRc0To$ zgt*6&q6f{z<-tvMUfo$SXEBFjgwdGTNk8z8o`*qSE_(S5wxfUWcCnLR`+O|`0MoP~ zr#Y49?coQ5kO>~cg2stggC(4B_9lC;PP0r}nBJN>>xbq!|zBqa=*t)+}ZXC*wudWRvzIX*FLLQpMR( z*DD5ekyzAmm>jJ@Zd39m_IZK*`#%7P2E*V0mFzxAaFqi5%qI!Pj<*s7o5WYw(b4qQ zvbEaVGMj3BWiZNHHLEc6>E^khwWW6d_z8tst83p~?S8sj~!$+hyp9p<|2oIQd$4Y9J=o z#PQlHT|1mOxw(DCa=qvq3G=tK&$V@p>#!I!Q6oi7BjlU6r1Q5{s;xhu!B!S1`I7wmPy@xz>gL}^cl!^K|R|yH(QY?n3*Tlm<;^RtCY398hZ`Hv zNwAYwI16VyrE+=dKln`TCq|6OpC?k10+p71QqBV&TPCN=w7}i zT86}wJp7$+TK{8)g(^|4!#rDiMdYWZ?n-hjURuzTREkY2WKLB*2{w2CruAxmzRQO; zn8NY+t>%pASb4`3v~cLjO20B$fH9Z%tMy_bbt+k&nGy4RNg=zsHBHPjK6~?3&ikBN zmOEhaJ`!PaN;$^UyQUh-@tSJjCtfVVeC5OEm2K&P<1-9&zm^*edK8=YSZoBMeCsm> zN|-ywWX-?`4Yy}t!~-g=cV29e=GQdf=p~{L~a@XxT~bOHL3F7n0MIe)QH;z9{LCxjK0K5jS;j@g+rF{p*;?1 zZcwU?{!=20bYhle!=rF}hJn50@x`ze-b0ZNA&-Oidtk^5J&ip8+}^+7y@8~fy(~@pn1~f%nsFIBUzq-+2pE(g|5tIy0JkgShZx}7gc8Y_fEtR zaonu2Kr-SWrei9*TLz4m>BB1%ygyJ~Mhwg7{8;VaDl-OMmC5di#euWds&Jvd zM%Z9!9FAOS=(C9eCM~C?3ENU z4dsw=v+P!!FBKbW8mc6q91S7e_A44-HHli(Ivx_Po({8cJbla z(ac*-sss8W{v|BNaR*&=aSO@BYxoSEZyX_xwizJDl6NS&X9;W zTw~7GY(pN8P8um`L zW4`j3;Eme3o%LyWV0vwNX|i+i2hJ2uZWI+)oo;E` zDNSc8P_{{I?Wspu~P7(5suhrM6i4}RcD$YFzG}0#Vgrpk#oVQoc;M90D!?T>%b|s zEHm3-MtCbXMh9Y>g8xYH@FiEN;!JNxIzcb$d?mL_NS-BSmFnrQss4|Tt2Yq9&3JRLG+5L!)P(ZVZLvKQ0oYYx{0ayx{(s z$EA1Vzm8Lg3wJX}Ja+Q?IV#UsQTw$!-3!Z9GL)=$w*&(qL?{6q?nz8KVc`%_OYl{p zJb3ABGUNnk({l9F=5Qd|0oKAoOe_Q5BR6C~&~UIe!mWO7)PPv>r0(KgM~YIWSHW5t z51yPHRI*xhzfxs$0E#@LqG(-;MaC{jXzgb5O3Fgqut|V)$ktKR0155d#6`JBgL{(< z+S~67hiKe@0WO^;)}4AoC1TfLm&Ul5j4OTZvYLcWU|nxfZ=jmtxkYKW7>IG^y4WJy z`f}4ri#CP69Zt2dAl5UVJ*^8?(XwR4mR~KMOf~+5!ztFzcZQ=js6O}PUxCiYL3UkZ z{CRiSVJs3Msu=n-Mbd+y2mnF_9)Qo61R1O#0%DuXy$Zi44@T;s$6&~6th3%Tg@}Wt zWq<*3<=^ASM@mikwrIszR}_VWk+w33d98gHQKth7)}IAKS84xZi-BGmw400%^-8-C zb%`7UJ*?uCtt<4_H~*yG=wqB{gPV!8fhJ0r5Z|0uTvtT+bqXX zv9D~t!9(voge0?%+a+w?x5hdi-^d<&OWnnf{s#brU}z1X<^__xVxV|95tQb=UX6NqelV1XE%$mh*e;Ag`Q@vg1#a2%&uuy`P^dd{Ga4ZC-S!}eyYOC z`0mYY-)6M$N1$h!!!>G^(h(KevjuoX)Ql~Y2s-{TifMRqCHuIJ13Xe1s{4)V8n+CZ zKzgl|quiA5}=rgt5j*WQX1iq|I+sK9*qGK_=elId)(%U>8pjIv3b0#lT z=QMS3&2pH5I}6R$o=`#mCT8s_&9~F@Fo*mFc;D*)sDCG zC+dVVBfuzoDcA(=%xd?Rr}10P;V~C>-^tVM)#_8JpMU)4ey=ru^chZit-5r3AM3q= zPmgxehGUeOKhrFgLsldX5^ZWag+Ib}?@wj;!bX#u*iA8QdTbhQol=}EHg-&|l%&cut&Tkfat7l` z=DjyxI_hafjXt4c0)<)`+oY8OK4UOF%vV(0J=!wc#IclTLemU&JL7q&EFeo-^yF=)W!)d#^rPm(McOU5 z?`JPao6%-|UJOg;b)l=_j^zRYKt80<(tpb^kT#Ps81!_vkjB1GiI zJjlVOpGwOqa9=+ALo_C4Dka?;1VE=k1D;H(3^e;|h#9c(GnZ6!_|j0KW!n}dnS+WV z0!@`~U2tdpQ{6|#pQSs~e*n+|z({`H1Z&INwjs!F|5pO_n*EOiD_2?2%?LKaD#CHf zIzkq!7+-s{6=z^^|HeRoVa!?~a3oCXq9gUw;ze*h&N9df)Pj*2?G;yfSI%C>bhU*^ z|5-TKz_>HYxgg&{4%g7l4`Q_1=LFX58tnJvYBjNajhU|2bfc@l&|>(l+NTGqIn$VO zFdCB-h%RF?YguD+QO{X@^y_fh`?fO}{e8LG%d_N9W|%vjp0SXHaBTYDTKUA&n6~q_ z=Gl6;AY5~0nsUR#oC}oNw&2gb7s9<%PM}4^nsDGtNd_o^Q;rIr0;C`LWqOav?lK?| zw2qm%Sy%jxt0k3XF+MoK#X*t^dDkFySm%2Q^V?WhdWB^vDnp}hpNAFIJ#HcQSdWZA zR~zs=c{57v=TO6eXQ>CI0Ktk8gR1H08%7DbY?96&t#oyT2^P$V+2lx`YjJh^%(VMw z_y}5?X~}uw#POg067N2%L9BVX79Ng5}WiHls){BbK)vs{_hq(A}Zy#T$ z5mZgMkl|`Y7)vQmKl&;^gCT{i(yp3Zfe|4UPoCTyCuW2Rm3h}y3Bk|%Vn<|EM_x0q zVYZ`tfXwzSY1{npuh{~`^3e!LD0d5-_AXAR8@W2@N1+ zBHg-8g4yk*QLh7#WAW5heM2x(cK4~U66RHEA@(4#M5jB=4}uR6c57y+x7AzR?_B6F z=j5<|#fz<|_fcRFER{2VeUcM^@!+~U^dCGA9SZ$ssI;m)S$5}w_el3==#rL+H(fIS ze-1H{09a_P$)!v)gT{l#FEEviEHN=EeRXt`jwri4rwYas0E?%|8>Lo9dHiU)w z^({NC=CcKwDCtzJivvzHJpR}TF)Ar z=O+?QyyQM4hQ~VPGoenH+N7tyi1X{&u?vwS)A_h{nR+nftikaL|u#y_F4KYRAL^EJ}pk5mXG34%H9 z$&$##M0$!J6vO|qmCTk-xK6n?5LSZe6#bqs4DZN$pYel+9?OgovVIh?n?jwG6?lOhei$GPIFy4J%7kK>s}UxCws-%!*BcBUv1YnZ>MO@oG90berZ$1r4C zijsoV0AjzowJem%kCj_z#%(lbuN_lo<@BCyJ9H2wz(c)D-#uFHz9XfIJH~#brQ^00 zoFSmA_ebBbdoeDrv6?gN32mv)610|7x1MV^(!94G#ui*)6l%B8&3Jpt+fpL(EN@Rf zN(f8&z_Ft&w#A^Ci~|PNn8z+-2pjva0CzDsN%lj)hrxlxA<;)o+Nc32NAaMBZ1P(Un;gycDgmzk z-$6KnK8jmf>9~egHSB^v7{f5L->)!uO&_Q;1WIPry7gqx_{#t7BX5_TvM@ zrl4HneyOQ0qT!1B>9uYf%4=VfLW@0cDhY+%9)MBY0yXYofmm!#OCQyhx$DchDoD!4 zqLo&aFVnvAx~%vBe2k{D4Jt-|*Hn3701dxDOZ}b=`|>IGRFvj?jjOyPB*`XV#8=_> zaLGA*G~C#-ESS0W6pO`S6Lb+Y$*>9_rDODg3XP&1u1TGKQdX*&nKjTdL?}Erh8OHX zjmwCiQJt1j-nxr+RHg~mP$Qk1(J5n}_834Y zhfI7jE;bnj54mRy$k0}hgVG&q-jlesXxeoUd5TIISb2`EoBW;Smi{^P zm<2RHxWNQKkd!3UB%1$j9z$d2hYFSc4*)Paw7cfavR|M>w^CJ(`;9Z%9*hp{d=7_qO|ZjN1r z^etJp_9c3S_D+1=qME06elQaj3CB$0#IofCV`tD-VDL*sm8iHnSUOWuf_Q7=+s|e5 zf1^^Ywf=jv=-lS~irJ6I0384T)ZrvCm)nitach;+FGV_k&LZFvAS%-#a7)cB1+P7t zGTEJT?au<@me-hWi~IxEyT?njtm3^ZzOu7`F8Bx`tpRay8rb_dDAiwE;;R)xZ9h|Y z+DoJxakZL5-Y{H+ONfDS=JHkyq#wPV^r}7_3cK(xv&hsit`(IAj zbElud9p~!uwA7gM*oPo~KQAtr&hXBhGVJV)MWPiNtaNv%GXfno8}^SvmJ8xDTq8!`ig+GA>h{}DTkZG27EHEGFRmeS9fj6pXQSDCm}IK+*W zi511 z@rF}0)g1n~ZLlLAYpSg3r)DgH-258(SLtePwg4+8Jf2$tlW>n-( z(&KUWYECn5kw*6)09XMqHmKT#nx#W&wf!Gh1b}?97Jx;7nD2GRXSGeO)PI(UdUv;! z*b~(SrZb4hM-CDP+&=l+OS1{h9}qP@mNFXqT$#*%{dT#Uw|7Kv!*{~V3}4v z_`EJA>D>NTl6$A;RRrcZXf&(%Yxx-gtbs``E$DGYnABrNSU?N*6bbmjg--2WH_uXh zQc}FKfs1_A$T9Y7)FFezySCwR|H!zm>CBy$C)K#HsLG<=7HwPAwQ|84;jCH#LDq!v zu!lNUVfL<4pt($$OW!yb;;9Y3SKUHa?{`k0(bQ15v2#zX1O%WZWz5W<=f$u1>RlbH z__3r38|Rv}n+$)&ONO@&M|R{p|BS(mOm-XZLxPt3VL8dTttX2P5`eP?5hZtRTkjN* zX(5U=pl9{5>iv5;_URIwaYJ?5zFeOzcgp&;sYmu|N8&$SRx!mXOWOs?)VR9f0~&D5 zzIF`tH})v`#LPjwux@@YdJ0M^qFzNRMq`TZ<8kdW@e+q;_Z7G5)57Jw!KKsVe2qO zbL2ixHzxhbT_~(Gnu#L2ieK!FgtpinZbgkPcn4Ihu%%Iqioysho((q3SCI3T_sbB5 zv}n3d$?6!qopRJImmFM3HJ`k5+?IX2F#LzkR8ltS$b*X&!BT~vk-1goN^;Y_wqvrf zoxRS<8&_#BW%F-s7l42;?K=XAr1Y`^#uYS7P(cJFM`jw6%%*@91UN}jiaRXkBYWfS zDm#;&B6T(-r9H6p@2>AAYDNRll6J8R62tVv+ifV-PxY;Ra5_-&C3wZ#GUm965APpX zDqe|O1@7SVY>Y4ATzD^BZ&Ghod8&*5Rav&{xyPR%Z6{v!2ndfvtwTp_KArtPDuf&q zF-%ig%RkVf1*{+As_aBCtH@q=6d#JgepJ=l)RbfU#`ocK-tbg^;MyE|-}ecSKJ~I+ zjkZKawwea*FTS$^YBkugVQ1`>Tpt>a1ER>QF_w;ot2>b?=L6ws1+g;N=o&d>_F*Zi z_D%j+;}Q4FPt%JN_X#!UibnqBzU&Yg=9Ukqma-;)`W!R<#Tmc%nmHxo=-ORad~Y$1 zc9EF+!7H_~vh&nS+C9RpPYWeA`Px+ctDlGP@`vdqu{!>C+f-`Xi?Zd16W98dvFEOh z6Y^;c^XYarZ#5;lyKSNS&{MM2v)X*ka4@}9Ua%Y#1=#P zfGc_@DL8z(b9oG?g7w+qY6cr@hd_@TF=tpJWR=3Z8#nCs7xS<{f0m6A6`QktMOyAyP*sZxzqZlobiQ6XN2UNMTyDr-7h zX`bWs#$Qe^C5H6 zw1sW8VMx?klc(9itX9a@6yq(w76j1hiz;e;WroKOff95YDKAFbuWa{Xd-$P~r@nV& z3)U7(wuYcnhK`NyFx>&|9Hfn`WPM^_S9BvMNfW=2jw0%f1+xH zZG6(c%W21MhF=I5*6`!*Kn4fMjhJc=;1Pusk{(73_@ONEQ;Yq`QGj~#W%`SQ$7jYJ zy>`Ouws>nF0mo;iD$Oy_hDWbOndB{otRea7+$&pD>wcoZg|<7{D>wd?BDk#e*eM6w zST6u^h<~-+mxEKpsP26+#8#e9{&&RJnVnaAN4)k`h5u=T$^j6S_2&L7gf)SyCSjG} zO?yjL4*RPTK_+YaS+2%2jrp9wghnGNg^~?}h(nwk9?pk{B_DfU5A7;@7g#P`#v0Zg zVMdN52zqniDvM1sCiYY|BCWEha{8`h9*&y7=Z{F3(0Yu!nuhGPK?X$MRg7`1 zBz^k!WKRp-Th07jz`RJ>B|m>GYR+orS&2YWpz$1?gpp2Ih-^vDz`!2s19l8D+};>@ z6tl}>dLG#QcT*>t3O-?GG{LuYO5>nUB;|%*aL_-7l^4yv?jSh9Lkol{4K5B~7A z2Crj!(c9mH62fU?W8b0eA$o_>b!On`BZ(r4gjA^(u`y_5D55CihMnOLrP-1wD?X*? zR#{40$IUel<}vAQu-%C=5q#4X{xu?3ZuQQJRB8r&Am8Fmw%;+)cTSmE_cni(xF_)Q z^S%D=-b1LWr+Z>Ie_7Y(Qz&dnlH93405Pc*OR$_uB&r)}78FZPjjE6+YQ-v;v_ zAd#5pH^BQ1>PM0ZFU5K6LIj4-57zb;v9Fd$Ankr=j$+Oo###|)A2K%WR5!_~J8}KH z;l3J`TqH$Hv8@eMNNV8{1@G{p%3wcunRsgBoyF&KW}r#~Hx_lK!3XE7ld<^Ke`81% zf`s%w5NZ=>W}X*5bwl@h)rwwo%TKCsi|hwi!4uFXy{S5p`8-XY1rR@0c_CF7)$}-m zBLkFqoO`W~Nl{z>0`^))NZM0YxLh0h#!iurlsbnrsPoUV1H$Q<_tMf;ZuQ8A$F@6U=g6D z{!-r^V#v{ptw?*uvw9U^fNSEw;~-x-nFusYi96D(ugt&RxT_es=ucHAIQ;#-X0 zAFm-@MkVu(wUEZH1M_A-;twOb_Ih=3BWF?oWmTd83lB|kWFoX?YexYDCh(BwN`|d% zoV7m1boK#~hk)=G++RyizN$sOaf%vKTP*0o+8 zqiIz6=cuZm`fXhBvUp{T`S{%>A(@G_h33NBvRYb58N@oQo>M2F6AV%{p*TgZ)i+Y6 zEuo|8S7nQ`gr0xAb&mIW$C=@1yYQuXE8ZejQva}tM<$k_(?b@z_gJCk8D+~wO%`kN zWXTsVG@GzHQ2J*Sy`lPq;Wrb^T)NaKJ^M`=?g8i^bGKBO#(Mxw%Tn|h0C>H?9lSV? zXktXkR1+&RZK$wAKVQe-_n~o~{=?fKo=1-2hEt8cVag~IeY$Q#a3Gm9Dmc>xJU7pM_W5BbN^CV zz6*mkVrYE{VI9OawsGO~`kcbfLs+k|RYUI{S(axRg;?-fXu5a83H?OK0)|Ssa367Y zW^N^f(0E1+G$tZ~#)V+!5F{C?HHu7darHo+6k$wT)52#otB?-`OP{O zXjf_8{B^<`1oJxpL^KxRde8v67u3xXu6$&;1YZL*fG{k*ixqCTSS7CYb8;A-^0W4q z6-!lZtD5u^y+ts8CW}uyKi)w0VOeU?DCpZ(ku=p2$e)_{NXb;+gOCd!Eh3HyM1>L& zJ03|bB|@P<{ZoK!b~YwN!J;xM>GB~^#H5cX$%6(n$~OA^0c{c!pGw?0a=Q00EqYN17dh?ASMBWXE)}x_G0P~3aLu|Q_&k^+_oDq>HnDA#v^F<9T zTqq-GS5h`M`KBq0%&PG&hL<+b|5O{b@i3KVxKr1-ep^dhX^Vuz0Z;$?`fACsj zm$roX3$A+Ujugfrl?Wk$xW{Q7V$3nbsN$-Yak)S`{rJXh4= zIKv<{{{+SM#E`QDZnMER++md!1)UZDi6`{P$wxPy$9(j&+Kbr(Js}ZPAn%vp_N-^ zeq?+zWbISG=cJp)1O%t8IcRALy%(UhSNS(VMmlGX*-sC}j3zu296?*`4PLEP&14F5 z^NZ_;9rV7NbpA!J?E8%=457X&3#(0RahhVET8AWa*5>Ed{)+(8P$XH+DJ@tXU}A)AZE_T&j)W}3%(bP`v{)?kPu80%~brS?~uVfh)kXQA&*fkpncL41_W}}A3 z=LFN1-mM@joxjGg6o1rUe;=o(zNrcV%03Q1SQ%y-!`2D}rf2GR3NtAym6$rIti1NPeP#zoV+Q^@}O{C#5d6yY6EcgNV+^u-eR~lkgk#%4-c|!Xl&)0`51Wcu$NRA{hqaP_?hJ&}ky#v$CC|u>JaNanAgB zUmHG8{OC>ER+z>@QS$kKH0H~bYQVQT3IIGU%e{tK9kYjrnKYrZtJZiL|?Htl|>Ji+QgfiGbvz;CuiuHDw*C1ve4wJ}TUWOZF1>(tNLy5Q$| ze!^og$J+jAS-Zl_(n=;1Rkfz%i1GCAKo$)&-}d~TAWS{mPxh`+BBL!|KAx}nN8N7W z*49l&*a#5e8&_$~&Mqd)r5cJZF02MM*|X|1csW00!jtL_06=99cIa(&OssR(y9C=^ zQ$By`S28i1p!-%E<1B~$46fRsApzXQgt`|Es-lJBS>B^-{t6rO(9`cTs##SDloUFm zo5*yeCfnHHasQY}|w8viKl<8*c%G~r3?i)r^8nLYgwEX?I-)qT$4;TCP`P95Ma zGt8jZM^#j%eq{YnT0d&mG&TBGdwPVcyvPE-Qb$zQ-d2!TS03=)wf$3tv*G3(00sgC zcy&IdOeR5eGmDMX>#-2}chn(J*-bsB>|Tl=KneCB3aKuZ*4f&_RZT&yn~aYJR68ylHgJEcb{O|ElUDmv-ptMSzBUB#Sn zmV5U$HPWi*<2*1$*dDbVUy^UlWE8_k5_x!vC6tPpmZHmQ-ZcmOYPsU3EqqIj`*jv?@TYs-&4lX+%=3YQmRjUUIC@y~B_ zt}X7I>AMqKjdQ3~Bo>ib+HYJ!YR+g>bcU*?!onGiG$PQwn-Tve92ac`wF1P$BS2FD zo!x7o2&kh97_mzma+eI@4+BUk<;Iu5hUCuZatFxIgFv{EwW1|E0M*b3m1y{PNqa63j=Uldd8(L&%z_K`u>UF zp`N^ZGOwE0G4wN<9>vKBclY&Imt{}W4k~-?YE!j{zzi)--68)+RwW$ziUf7ynM}R( z$}UT-t1&j8iks}DmxL#muLiL`Wm;TO9oW(Q_GBFH_TjUQUzIf(%sMP=nchKi$Wlf| z_XQ`&yt=^Lwu}|3ecUi|&myaH;R@*5O5S3dynR^I6D`fNOST@ef^G$Zvw>G$D zHrT|{6zDF0%Z))X1V$+rl8?VPbeCn$C0!`mjbLHXUDHke@QmROlh5dUL(PYGvQ92eC*i2Lw9F6D7mQN3CAI&>mV|!Kncda zZ8A%PfW;GvH8uo~4r_XLBmFaD^STZ_H?FwnAr4o6YY7r?hgXFx^FgZnw4TMzKU6=? zX>2?H*!kCSxLVDpWcJyL0Cs?BNEMA%`u5HD0PlV{*ub3?asBch4ciRY`0f{umdeFo zTyabbFR;Y&VLY$r*8T#&?$^W1`gV1jtuHVsf^3@ZvoOHc(k&$fm|@m6h*nGAgkO29qu!z%h<~XF<|Mra%0)hYKs99HuDpDV zOgDPgj-Fs$L7$sAO_)#1oR&xRZ;f(ilIcEvcXMkpV&aW-M7od!fPJtFjkWLXXCf+0 z_jwJd0@4SxM0n{qIeg-*b z+Nf8N5D(VsANGbb_8?n+PDkfmwjRipd+6B?PyDtAVuh=4xtZY7GDf(qB7^cx*?$1g z1|Z&Qf&XiWnYko3@Kkmor~kh~*erLcVqagEB{EZMrsp$V-;i(gcaDfc7|tBWkV2D zi%sEEtyakAXOw4lcj8SbJtr0^DPy`4E>;~Ooo?k*?a@q?T5Tq2Geo21wXrX&E~6%a zaQjDR|6*fOe%wNQr}f?D&F{dls!W&3^vD>}hK>|DYj>2vKujyU?AR}8NK=>kH*ycP zHx)VHzxn5Xzs8_|T>vJ9vutqOlERCr3RUF@bY}Mt4JNMF(R)RJ#^FGi zvIpH0-yGJXA5kTZ1AX;Soi;9CxlOX_*~hTZwHPrXLA<&#HEBdl5}=hz0AMGv%DZN^2F) zJqB0T!C*||5yjt*V2;PctGI9dUx?pA9sem`5SF&S%m-KUh4b$Ar7c^M$&;mi-ofL$ z{&70+0;{0$@pd>>!WzKjB@k1XSiSvoV=f)Zhq;k z<*z7P+Z112#9rB!+1Cd2ACFat5KYARCE_5|uv$PnfoCSq4<98D8KJS#&Ac~qu4&98GkOG2Bm$ZGfR?>9&OzI)gd zT-5_LCD!t_9s?ea3t_q2V#SzOQz!snXfWwh6?OP^O0zZoGdyOj4pb|ftoHh}AQ3nE zx_%sAi_W=E^U4rkwJKn&fL^IH{}Q|;!qz}tVH+yu3vAPDoEc^f@YbNPV_uVEV!CXS zj&C(E#KvDN;E|Uy8Tj0$(8X6t>K>|6Q~>`l>{4a7q^stzipf_jt|gg*p2Qe1`tz*h zm#v$lfm9u>By`lbt!(R45Njpx*ZG&%hHvdx2#26Irbd|G1aMMQy)!c^REGEfkW zN*+RoEtD86IFhfu1_HIty&m`>M+2bhaA5=c+-GIdmIH)gc$f&q2oJALSVT-uc4aQi zRAs*-Xcm@5trF&Ch*X6?(Z=4v5AiXuUW_BG+ReF&QT^%ljO+mmx0@mn}l; z#fgd~`xy7Ih@*lHjO-@i_pzOkxVm7iz8et+A`YyualiwK6gY{D2bqN{5tswWPhs&K z6Dvm!CgyeDU6r@&o<|1fpaV_CB=?YGSHg1_s2^g--%7CauSgiKuuRy_HO38 z=rGUYiaUABp8As6;NZ(=lj$hPm#VXhBK1ir!`48E42)*Z#$t}ibrCy0yP+uDu8%^_ zCi~k{>Dw*lD_dTfQMXH%=P!e27eyPi)p2cz(sy(ENopQ2A70RLZ?9do?MH!qqcsTVbt9iIO1?HF}%g%Od>Wlrw7 zsY85#ucm1ecAM*&_j~OFg`5Zpc(yy7Lz#GQjty=~UFoN4V<3aA%rsbl?yxzawr(@2Y|$3l_IV&d;6yA{|Le=I z>AP3fSE7G^zXJX<(onC&g#9d3Wz6Dx4sQfm6sH4lDC}N3#$*o#PK*kM8*=w`$5<2- zfeZ!cI;Q9vqoX2|foJN0nz!MHYca&Bs1hCJ5lEAF|)24wtdjhaG=0&UogwNL1+?#wA$m4c4I(TnQzd zL_%-ap{K1m@yAx}K$WPqjoXcEVKy|{ES#C~@8k-FUo$^2U<;Pm-BVolBH-rS-wA;6 z&{`X5f7dG$XmWM5&K)-5fVzv^P*D$;i*;T&0BSN@f;*T1q}?98MWS!;>umVbA+^)H zj7tn7#n%gs^uMKu0LJtB))I?yuggDpKb6%`&rQ2+i+!A!2xHBW2To2rqA0deBXbvK z<|8B*PdE~z zI52MP^0bSVJkPm5tm+Z=1km%}*$Rw5fcZJL(l=*5bx!2>*Euriw{z;D_h-TqNqtCeH*nJ}G zmzAz;3gI8uE&f$GNKAjfzQ@%&t+%S3N;is^wdN6w$amr3chCRT^A>sK>=|3{_yEvCevj6nki&Wvp0A2$D)fNXp7Y-Mzy?y~g#* zxPJ*r%k_LbA!nr{Futn~7J-y;%?{>Mb#Wr%#|}!t^N0rX^Wq`ETLn?MrJGxD7lN55 z>75lZn4A!5yWwbbT#!|3H&qAH?RZJ9% zzx{37WB3=n2VjtbAttNsq5jiFLPgt-`mOm}3WHeX0zDyv{?9I~QnSCTg2~)%#UZzg z(8YUoy$@2n#xjn1@1v6{qvXcedDVM!Ml)liifNs&XN{qCSu9|P9jR46o3@ccvlNsJ zHQfnO=BL$#RA#35dCjHvl8t^I%z^(uKPU(nkxx?sYaki#Kwo=52P4u~yUS3dTc87U7~E3rcTGny-bDsW zD1XGKp#DZ2KiHsT7m>>|SA49PlA8%1w3R*oy-f z(J`ta@0_Pky^sJ#uvuk*n`n8Dqz98AS0uu}P7(4-}~ryQmSnv=}X{yMj~%{&OL9>`L!xg z_%YK7*OXJ8JeUs>4)0rb0nYwsBH#&FA(D5%7%uLc7rkV z`3k^rGC2&-=u4(@Egh45vFA3>Z4ox{ z5JB~|{^|l@ftuxftY}Gg$f=9EQc;&`ntU@glHz6?HKEiQJ++1rP`U3a62du%#oXz0 zQw>>A>c<(_LV+KP&nq|4aKoJ3jc_pH%e^KsR)V%&@v+^?KeDJLkC}a zI+@nr=Sbp}9x2MPsnXvLE^8&m4x6LveDoV*UkKvD(d*^h>KjnbNJW?~=l=r$BLLwH zvUI_zW* zXktvr$cwEJtS`W^A$r`zj9_)0l2tV3_A1lv#-a?P_kFiUk*;Ys=Ursi|7ze}^4IZE z6k|#P5SDTN$B@EDV#+LZgFfP8=b?bLn9|+S3taH~`_3Bm4&2WI-!<)(IuhJD!iwJW zk+O-`A$O9%OH90`_w65~F!|3F}lb1w!)r=d4?(fqP*+a9v`g4 z!j5jbpA+ZvK}}y|&-utQ1?0z^i7(fzkMSoRsFm;>dzyzw3af+rX_B;;$0P)Ot zQgh*A=uuH)PF+o3hSc==243G^Hy#B!{`>k}e{b77MUCyf@M z;PkC?f63_li4`@NjB`hqbGixTUTY+v8QB0Y#DaW7(XX|ZT|6qBEOi@7>((=d1XXuB zUgp(q6aKUVsrnhJtS#7$&TP@`BS~L8xQ=qPvn`{s^R;W7`x~ONo>!b&hP*|EsF*KD z?LO2@Q#!x)A|oNAA2s7L;9p~H?_ht&$5-p$LN&yiPyEC8ho}3~{;xaDjkh^hfl=1p z1OJ_!U*j*mZ>>mD6lDerV>d={aBwTWemPZ40O+v;iv5?7Ju~xgiNqr4;6zFe<_H%0 z$A>(761vya4|l}X_Oh%7A*L154Dg`}{jcK^t1N%S@r^eoZTP5&2rP8<+vo6B&$H#` zW;_zCJ~}e#A>nZ2%*?P5jNvb{H2%@aT9VW<9=Xs_ZBEc?;?1iBqL&F~uIKGH?KfNa z&Kr1a)jNK^svWFj(5xLRWsx>d>^Ro}4+PqAoneTv_9#!Z`E4W*Dj|(U$K<T~~jRvE@y>oUs5EN(`CF>6yD(I8Y@|qyX{rvDCX+X7L$As$QpyZZGQm`9C%9u~!P#Csjn}CgLnQqZy_fic&0$&@-zE!r-7%-1 z|3v@-D1xolA}j(pB-@{h!Q|03UTGz3``D{p8!GuK%G#viIAg9~>pz%Z7z)O>AFWWK zc$S4DzPC(Djd6eh@A2Y_@1&A`UK{n^KaM(|{Q0Nr zsQWXr+#3D4zoK>YB<$#~$&)m0hudTgi3jPG|!}`v^L;G-&@E{w@w;9Zs zwWSp%D$`bvJrsL@x`*tPrPpKtl^80E>W?x9iMj92gTM<(k|<2sN) z8-py8y&s~8Q=i#N*MHr#=q0&Ux)QZDBe2ig+Gnp=0YP*#gjlgeCFsSY3elPjNHbys z`pFh9a`cE`6aJ5E$Zho_;LXGxlWX)c-k!a?Pg&A!%@+a(%^iE+&4a~RMkm-RWg53# ziJJmC0Yqqw4lZCL+s86AIO*h~r2P1+n6fEdi1i{W02}?3qw#M{h7aa#(z5fjgDa$0 zk8+AB`f@UG@q&~lhXRWt=Wa!ooM8c%@gAI#G8o1Yfz+eY*g02iG`oK#r&-_Wt!e*e`Lk(yHROL` z@s|QN>34t3f<+Xkj;tT`K3u1I*nXOF}w zRt0NkDP6xbI^zMHBEm@1&fznkzb%)@9*_wp>CiU`cN0E+3ml%fTfbuUyj|kFmf{rz zYN8`zX=*C-n26llWcJ&Q<GI_0*4gCy2~4yM5ycutVyf*w&e(HE zG}Aq{XrG>h7E!C5RJ4f{FMCmk5IuPAO>Uwx15*nR-d`ic%tSWc9gs8#rl zc3&|roD6qBaM7BfhS($qeH%c98DDiuoe$F8Hc}rbM?hteG81A{ehShsKdET=M_O7q z%;j-S3cuV0JV)7~KleL3#>-ZXl$Xy&9L%^$Tnqhq5tPcCfE<6j%Y+IaDorA!9$B?o zi#Ec2Ho93X+&~npo9z-2e)T)OCntrDz~>|_V@iQS&ta7f1>gj_l*i_WHiDPf8!rW%X$!`_;aF{x%Z z^u@|5(HkH>o5A0W$ zi>C8t^LFYSvSE-N8X?%VbCU7XQ{Ya+Q27+W)Zr5cfCDgs{rNBPGvQDeSq5`<(ai?2 znu;2T5k_p9KuIcRQBhO8?8rF95>^GT8ARo$Z)a_7!7dm<^5_Ec$1R%vM2lXTPy)1pvJ@V_H zy%&!|H0v(wW)VxtE4Fv^+?K%}J!<+6T1FLV9d(k!tf@{+F4)h2>!1N%16|vo@FW9f zQN4TVF>f@~zin0gc}b;GZayibd<^I_aSK)$b?8J?O_EK-I4n?~R zv5CROGfP);MkrYooGj^BYMK1nQmO+U$cl^pKT+wD@qHRyXvDNKG6jFt2I{Oqy7gNa zd5>IGd*rw6raaEA@*|Y%Smnxep|~?}-Kwv!V#G2mlO)J-|XNDk7Nl=Nuif1~hC?W`7_UPy^{z&O_oBH^yk0jQdF=tGPI5W9ruf zu8L@2sNxFqL~xD3>=-XKf!>zW@Hk{2w*Fk^wnt(pha?@|E*64$)`j2rY9|)59)NR-!($O}$5Fpz=P){y$f}ueRK~ zO-D!UOx{0ZZ+-iYtjp7zG^KMRxE{(m2B7#biFs=uEIvSw2eO45Cx++1j;2R6Av-H_AgSOOmOJULtyNT@y1t`F!1b&+UR~rA_*ET=?o|Kox4_ zo}=(24X#f^{Un{`*WkHiPAoT7c#4vuN<6&`w`CVraV@ zaN=57t$7aJS zKklQV(_Ou`dhcMgJge30to3|3Qtwe(>59P7!cL7nChfu~F%g|jNCN|byF)@lm`6x*`q^;7oKAL^dOro@;ZH?xzy4vxFov&mE3n(}7CF!l?rpehp`1Qdbr_mtD8AqBL0(RLD#M-c)UL0SR zvEaf**QRuw*B0=gX|ErR;3>U-R9&R1rm*+q8%{D!HSGIwLU{ES$jRK`@3MZreU!vh zJbi_7MbkQq5+fz@QmP@3D6ML1JIuKF% zQXC8-nbw!D#Wqz}9ZKA%XmIk`)otN3{xnsHx6?`0i}}1s)TTi(&CM`{yZ3gxw#A*n z&!d4cHH0iJcT(47wCA_x_laC+*XAS|k98_I-L_r^DG>=bOpQE*)tG@f1fv3Syf9F@ z2t%shI}FI-8`H4sGjtxpD|7Cmb&g53$1(^ZTrWd9))?2oW+<8v#pyr!UbvAtwrqR_ zx+MAYla=?UvLN654>L#P!fkPN9vQDSy zih%Z_S4M@3MW%}-N73ve!kqxno3NQExk`y&;YPw^7Y7*~TVHJmL+pgHi@q#VbD@^W zpi@?`gnn?2<*^#6K~eb~NHjj__2}OTfA^YnS(%F(Wo`P~XMJVEufWxNOEcoof3zrb zL5`2F$5o03?_)P%f%eoWH%-8+tm=`29OE->K(=bhSpkkgj-X=#vpsU+za2me3gPCn z{PI^{qwVV`UROH@LK<%-74x_+91P~xv%-yP9+q6>Y)l#c;rf!Y0`eRe=5a&7Wt+As zbOxKVPki+Zbw`48H~mN3F%=;d<0=|_(|La!bs-xeOsEvHJMj`nGz!K_4tE#s_%J4x z6bUxFB;o)Zt{}x=6nq%!S}vsuqm;;?5)`~d#yO%6r#Th@QW_HS5_xdcutd??r;?9Y z?&rYxr3qKNzb@rbt4-DGu1K1{_7$zl%!=-uv_Z)wjD%c0Og4LJe2GMrETsw_z3tM_ z3Ykq^b$ZN}Gq z$~wrj-ES&APg4|TW>#MUn;FWwJ9+8)jV>b2Z6>fT1`1> zl8Nq}cE~Wpg0VJHeLcHodwGpX_QwTKZAl(2PqNYBR(3J(wA zlJ6!Ui(CXFjaFeJ;bA#(=fB)nw8R+Hj>{F8P}cZtc9cP zn~D<#N5v=xf@Dz#i`V08wE#a$+EY*~6ckzsQ~YHI>BVY@a?7ds5iOabd||w+7GEDU z>U2w2zf+`f?!0zg=m(fvmkElE$#bXMwek}kk3ipl2|xw~x2UmT%V%m+SZ#x5iDa)% zBM+>lVeXcwVr)w->p1&4Z{FQ}r9>_}MbHtLjtxcesH!eds*%MnY`-pnOr_SKD&Fn- zjE*}pb(*@_-mQ17ovyTc+}Bj?ZYa8`n`EIvXa6SBytP($GQBZZ#>{kod;iM&{Hv$^ zK@XY`BG&^m<=y3Ol4MmgQdo2RW@CvTiF|f~HfTxCS^8lZq9;$0}NWReUOo5jyYCL5EARlrG1k1@0Ol2l-3 z2MFq-igmL>Wwd)mz^lm&D!xL-ao9RecC|svi9OD_ye`M24_H%{tI~`=_K6jbHttJ? zSjaU-bciF-BU&iUK(jV3tPH*B)WQH!B$_OfEUKg0_{2Y2F#6E;;)U*LDH>_EF(pzauTYZDWahFu55HJ~ zp(Ydq2m&BHrqRx#bV_K@&|4L2`^^B8p?2@U`;aVxfJ+H0kXTz&6PM)`LSz9j5-`Ek z^mkAX6upe4a>Gi%cfomwPbIDAi?d5-(27>(uFGmH@>(~~k}fA-J3aEXx0*k`TEu^g za%#fC*|tR^2=@16oZIMTA*bhy=QCEmWV?`l5gsXT3{&3>;z+S#oK#eBLv z5m-*-wTwaCJh?Xmdwje4Al*_#<1%_JpD$2j`qEWqTW+Za0aa2;Xw@1~)F>9yhz*C+ z(7;QFqCOx~TK$gFV20gY`j-GkP;j@JDiE7gn_8QfSw{?e-2-EK6$lo{nWYRKQUiPk zZ9U7%=0NxJN|KslGW#^2KV~@K{Cs}mo>b`&wJ1N>E|lG=a@iIoW#emT?fl-7d((J4 zjVcJDHu1U$*=l`p{lcV$812E``PP!#KyD-Q{0&z1Xdr6&?$(mO32?E0grsi(dBHs{n+^f;qMeF$ki_2qBM&&Pew@9AJ0@XCm zD~)%S&8rg^hvERM`$;RNR9KhuG6_F=wkaIq0~>16qY-rRdrx}{8%w;`RQoA6x>j~DQB>L+PtB19msM-duc);Bs2sImo~EGxH>$1Bf?BD$7a@91@{J^aC0x^aK z!pnj@=+vvK?LX$RVpOS+*#_*!PN{G(k)mbj8HfP16~==ul}?jTf=R*RX;oG=Uw?S? z9k<9H9t*5j6}WRa>R|U|P;(45pMelV#X;Y}xn&-ITzLuW$ZEyMcGxco|1J(9UK6oO ziLTFnyUwy6G;sMA8K4(2@65%#-kFQk_u_YT18+C`mB{JlOY&Nez8)N_-)(bonp}7{ zj@y52P}Lv=7VwlNgby%{tfSy+XZMlfe{E3zW*VZI-k#Rl5_?L+(BHPYAzu^5(z8dl zI_NCR$(v)sB0Hf|;)%5?utxr#*9ZNJv{T2%pf`GjkxG!%suGFayKxL|h>|@iTE-T+ z^4uslQOY9%^;_rT_Rf1F<65|obR=u{* z)lYqA58%Fq6!Oq+bgMQ8A-?fIP^`46HzS~tuN;?putqb z@E&=k;<{)YxqUF|3C)=>ahV31pyJ$G^~?s1H(uGg+!i1(cG}*OGYL=78P9`>B3gRy;iE7?zo#gFklRFs~B5&D5j+p zhnwx}XQymvHqL7s?8bRgD!|?qECUe6HWZa;{rD^$vVBAxmpHdHv|nXFVY9K?*!=Wp zRj5ra5po(0(Bh(*qe1QROqgvMsXEE8L;!G6Ax zQr%5S_(Xuj3C13#VjSW|9<9ZfezN)wa7vWP9RMCJGfHbMvZlPlir3=lnX{qw&Q9Bn zv{Y3S3tPMnU|%Ae@y!<>=uUkGmh(MUlF}v|p6&yRC~XC|@sv*5KrR%330JZxn{MPV z-EG>lP_N4s#c`w`c;4IAr^e1xZ5dU`7whO+OU1$@TRK(5bxOSEo@Q+&pQ`CMeNLyL zg+Br~=RI#e`?NRZoV|~Jt1r^N;_q!}=yBNN$g2-I1mm^o3dxOHS7Yy>7Wt^E)egjTo7C4}B)^-wr?o1t+Gl_OA#Ii>jVA zzOY{`lGXfo1afY;{AZDL?DtOeS)ve-)2*@rGIHXM1TMGd7^MQN?p`- z^h|Q_+&{BW}Nt0rlqaNi`Qw~@Ja)3<2U82k0e)~A8YGMT`xL= zqSPk=4)O@oW{$Oq;FjMV7Z)^tchJ3F`Z=rcWUd5$;Si}iU?|W z%=k_9+6ig}WCjXZ@tcTIMjOI}G)Yt5)cSYMAGY1{*DGt9{1$Ip8_X=!S#}TCw^I{r zw!UV+rde)>GP+b=y8{!*6lIOi7B1l%gLkas#GrAHTxfGc#?{-7`Cccwk}P0{5tpMe@&T)mIU~6m zvxH39M5XhXu(w9&{N>_VSzmvCZEqIb6>GD9b)dgNom^+qsiTo)LgF5q#;9ExX1jj( zJJc2Mjxn|NTp0E`cV>pXSSIH195{{M+NTPvD|lM%#qYd2+c3MsLk6_?Y%>1o;&{t5 zoX_joe0u!}@|3QpXMCFO-8+uv&x+I2-G(LK*=#(R>C7|8ow z*G#y~hj3u(=80o}VqPH#A)KXdnZd(@3H7s%Yeeww+YHxTcd~wDDkU9C9GDiZwW5s| z{qG2b;IApaoa1Y>KK&v9*#W>b{;Uv#jN)5{lZzhqMze)`M59;{tU{N!FV~McprC&R zzFMXg)LAD}W@@tcmUB%6f+S2P8_ATCpFXENd=~WzDiBkU!T10_zxoC+FiZv?+n>$3 zXx&s})o76ftp*HhHo-J52lB*Hk?|T_+OIY_I0{bc8Mc=eH6jX{Suyn@IZY~vi_51R z1s}hUOh`_kAgrzq4M|8onJ*|2HGntiw#kP|XP+FJ19`Ue=els|5O7UR?T^N$BO3Q= zZ*Gv7byrW(O`Z#-Ne^tZg+xCiz3a&<^;UFTa8+p9qTQ^__BTS%#r{WK_5lJ{QuK3w z|Ng00f=p%5)Fn{bc z&u)hWYuh@B#Y4v|5im{5yU3A1U73gK$oJ`WZ;eScA@-Z^ER}ti2qXadG!BVY6}hEV zLU!+=fVgTL9IE?W4)$SwVw-DVcDWjEbZOJa7A19!um*FE__=Z8$eborfjc`1p-U0y zP3tAFfGY7+zujuDZcbc%DQF#Kq-54l{F6~N)+DuuM&7|Rs!DwvVslkniFy?$6^oYb=!vaJ**>X)pDl6rbV{7<}+uM;d2ybLfW1OKbe&v%v zrul|Bjric8*ufwccX;NrPx_@;?Z3CLqw+fcae_2FF^Qxc(abwATVJUk!3M)1ba1#l zW=2SIzr#f7Ajdv@x)}c@x5M+yRPB3_b=Ai@Sr2tb)W!zZJ>fW!`c^A)o^2aq;VnKn zgs84aR7&kSqH2KmP-VL5htgj!E1U=9ilPI-dYGF8+715_Krjg2Oh@U;+tj4B+By%S z392malLJNq)O!L2^*TA7uThqpZ+-FvehA@r$&%HlaTw~ zuX`x=tL-%n1Ahm#M^%DeY7%@vl{tq2dq~A`tUtK$r^&3=|83c~9Jd^w42v|%7IV@n z;ajJ0L(y-#>@7v*`A-0%@(MmB0Bi4Ao?+kj#>Uwjhy0x|wjo%R$7DCiB#2w{`eE~F zF!SRm!FlaC$8nkQ`Ae+$4G#p#%=f?|M8?}yQ??`4f+zs(dz%rZ*k>tZk~oj9D{k5p zo(|d#+}dd;TuD|t)HL=_N*lr-IeF2}XgV=V#0xNL4g`QYTS!xt>MRaLQSJEfjKrz3 z!d{cp_aLDp^Dtzg=Fd(hET`oR$Um%!c~{JabHVGrU4*CcS8I5M&oV@KOR`znT_!f| zq`(-S8nV%!FD722j#dVW`94r=6cnthZVik=(^kyYH36 z`^CWQFffsTzTeW)Ds{61Uq&AIZPZpo{`2Pv-+pG!mUlg6dsIE%K1Fgd$R`4a0#qg; z9bI9I5V(y*y=Lp2A?ZU!AVO5JQM-yn#7Tt@!cL&TvibHA1&2&2mU#zyHXX&$xHQ2w zcCshA4%+B$ztH0)q`}Jkz~^J#%bc=&m#yW|cq3I?#$z||mHu6m38>I!Wf}Xp4WBlc z1ir(zr1;ZqXYL>)kXPrVk9#TiF99T=5C#q8r?Y*Hu28LoAz(NHG-cL*(uhPXG*7+k zjn_LH zB1Vio*n~fp97>GMq_NwAo(`1|3O5zz^dt16g7B+Q*D8MkR0?aSkp(YNAQ&rwv6NCN z8B|UKl@~Gqyt}SdAUFvX;3*|stC6mKNK~594c{YRByE8sWNZ_B!VdMX%t z{Vlo>V%VuF&5wskzkBzW#LdLsu6DV)nC?iCi;fO?4}1N$FU4JG#q}W45QWpotgZVO z08>$-yV+a&sO02o@=$oK<#0-9V_`>~w(|`^An~7-UGA$}-@kFDue)!voGcUQ0w;9{ z(hWG5%6%#;TK__oqH$qUYce{i2Eds}(q;9*>VwD!5kO}9;TEXnauX#XxbbPhgWMHM z#*danUwP<`wJEybnh`SOD$iWqjJW|jA;uf3uHhvvx~Pg{EIW}|?CS0p(A1wYl=Qb} zDoRy4RwJkMmlU32=AiBi0hF}@T0LYmqv`qLu3`Ac| z7{B#fN7Su6DLHi>63N88nEt#OrCV|{sP@L!{}FE2q9>9Y1Q|DCak&L0rI1o5w$(_; zT=wt#;B=?P5)4jfQ+^n^QZaS0YO3f;RE8lZs(32QFs|&5gGy%OT?5`ld+wYh{1(Kr zc_IKOZ&(*~-?hnaEQ3F~)S20eV{BMOK_lX%N=h-o?8%Q47Sv@URqn=Cx$Qhn;3Az# zZ}$zB&pud}#{4&WAL-hSiRg3Rv1&ymrzY-w4v(WhMWsbVNR_FwBZIKDD&XV~_1!wt zta98PXSPlQY;9(Lf&*ls!xH7TGUL8pSFQ(PDR)uXfZNEc^sJr`>2zy<&P-lh+1C!l zM4wdC{7V3gAh;||;1!0V9YpQ1_g@VVEDx+`itFa6s&0KO>mW3Em)|fMi~x)gZj-gL z*z+peo?+m{6P@3m2q{J7GDZfmZO(*^NaKu{sf!~G7L8g|u3(6hzfvQrE`}!(@GD7< z#%F|Hsb>Y!p+y&cqmx;RR!P)nCq7e=jvOi3;;?5)8j%JGrs!{L^53Wr6t~Fv&e)03 zmo6uD01Plfl}AFtnW|fMcl0lPvl`;Z^tC%o2VMS9SLazelQor~el;BmImw;Grq)~b zq@&AV&aGSuk)v!i$Mas;m>@sCE*9!GX<3QKT`!Vec()6Sq`J>tRtZFR&@q(Gil|0Y(`e^3lbm0f6 zk>5nlcUFQglGogIyKTqB&b6w|ym(?|n(rx}-<|s^L1~8nZE2t=d$?w8T-#`B(Np-X z+l4$uoh3Y}>t*4v*|Br*=k6XVQ(WBam;TT1X^PK7@?w>#bzS7aBrNi>~S_HVMS?dEl*N)unL>r2HL5G#^vn=3(Ch?7;5>2LrZ3*Crv zr9|quDpGQ;T18@k1LP4+i)E<*`fO0G4s@waqjlJ(IZXh!Zetbp^36?UgxUcLUq?fI zF3`>6TVzS!LZ03U(#T37Ib=bDMRAqc<=QVoW!mJtD@sS8BWcDym*{5W!!$EjvsAgj z^7>+7hwAasW7F+%YaS3g&{BtPJR)y(`6iCD7qZmxp))6QXJTacv2(Lt-lU7xcJE7HELX`8Yp;~uSpJ40+hjQ|! zs>8PqHlYl4K?`Sq-|)8ZfP1cZ{Hx4Y^SnOT7*~F*WC>P50vIcdPVGoLbcq!#W1LVB^glEBQ3P1D-= za(Z5`Sle44@Ubwj!(&IET*OBI(B;wUyx?dIcOeJH5u+KufICU!Q6 zi(^YVYG@+NKpF@Id0k=NAJ;n_jihi{N~{HyjgP{Z>Jz8+j$D^-34>OHP@2LiVGoNd z`~%1paNEyz4X=`@@s|sK>9RTe*j6((H?*N}nF%w37LBWFm2o z36;H(Nt^xjMfJ=WGn=yKB3G13i5_9>y-jOa1qQWTbF@ye;>x*u!g4Z))FzkexU@G? zY^iZqRvO`;C=L>y@6tr>sAwtO?Bx-+@#ZNUH)8}wUK@R0hnUM3tS4)<%XXB`#LNRR zoiuunYRVx?Q6O^FM+U1#9b;f}wZ;0!9l!ONjZ&MnoUb15o;emwYk4%nVbbH7Rvu+< zpe&dqmkt{T-4_p7*N=_(Z#^w-9oSzzi9%@CPh$)yw5Wi(S2Bv4EF0sj&J;u`P;yarK)aEL`_{MQ9qZj*;F z!s4ov7%JRrY1*nPXU0>NV6UZf+9NIHkV|sDOCbSzvg|+A*KM=dH(txqQsBBXP$b8- zR#vG`3-p$6*Eb*cjXCGPm#*mLQ=4mI%G0c!*iVw}81!-x_#0~6d|hz#vk{YhyHV6N z{bKHmWyaZF=TM+g4@(=UI8bjLE!OTY?H9Ch7&Ofkk!jLngy=q#PTlRGMQ?+p*45&) zjg^#8#vjw(jg&4PJ(AyC5yJiBAcSk>v6u@}K<5LH_(J+8AMm3ra!KBDo+3-8`xxeh z(9VMh`}Z8kwHp*Aj@;DhV{lZ-K9?M_&NqaM>i3dMC{yf7>y;0OPiFT`1j4$j-<7lM z!b|jZL~4fipY0;=dzbqadde^fI)>Li+tQ+o-*qTvm7hhuMxeb>&)mK!y*~9cwG7ny=iS@pO1)RVy!pgb z+W+PkQ~w^p(J`b3fri>t07WiPUNMtv$)~Bf4|m$e`^nMMqp|~Ho5#`C$I@qIw>-y)}D)l@&T|bd! zJib&i`upk=Z%QC7F0%5>+aTlx{=bhCW z!0j`N?9oMk%!eJH%6VX2HnMVt^Dn2Pv{q@n3VSC4ZZ5X&r!qPWlrZRq3GJ^+?hZB_T!CPiCWYE(MkjfFL**R*o;Z%6Hv;>a-Q)jI~%O#g=b3jl{^ z_nXo*V6mlGR#=>H>-flPifBBldDp+yp*ys;-yQq_L zgl0etMdveF{e7QAoqaLIH5Qy3@^aOV|18>uV|8E14WTe?zny8o?)4J)}t@9KK!Eb?Nl4{vm9+WiN%t}y+a5d z$AQpnG7xQv*OUEyb~n%jP!=z#x^xmqm>kg^-zr-5YliD-ba&EkwF|JzKUH$~jcWC0 zt*6EJqx36Kc~%f-Q)+kili_OCsrqyqdxV3|T&YYtP|`Foyy-jt_WKrE#3ll{KH~5M z&&61rK}_J&*FqRr=(6w7zB5AMY+Qufu!Zcgd;*M!9Kk|ULy2P0Gi7X3s?-l)(oCuc zv<_$K3>36Djk$Bjv&^t`*Hpwt?F>W8i+Q~sxm zRY&tu3yaR$+4CKG(}S)Y)!aH}eH~k(^tl6Zzwq8Q?dh1xh7Q^FeCAJ<9iY~~A9s1< z4&@)fiLTvO1b;Y&q>EM-+;0W@|6a6)sB27`I)Dq)WVZd=_s$1Y0kCL?e*lr|{SU}!30(2|9pb4^ldR#N&y9>DwoFv0VNf03Ur~ttrZKW>3<&H z7~v^PU1YY~%9q9uMq917Fl6d}X%R)+7?6fp{-|z(R_C1JpWy`^M*wHw7yFcL&ICPU7TnCgpSEu%ZMawIAj=w-C3r?e%qn<^>J?dDbgqY zJ^5wqBjwKUfX~Z`WA(hkQd3Fqj{auFs@kYtb_mhLk1y(GpW`sb!)Q*MOHO$#+is7R zx4>;x@(nS5qBB7djRWK?#+197={vJhOO|v0;$qA)Mm8r*ib)1yq6}{trOZ%#u2G{n ziImliz~hVgZoMEF-iv^PmJZ#jZ*VDo)J_B!e8$ClfeU@P5cX02yQ+T=ja19(mF9kxh=NrJRJVwVm>$MB^)y$Ax}V`FDND1I43kIEC<0*+d#MR$3`io!Y1ML z&=Y)RPojl8Lb81K1BxwptzJ;x7->l1WA%}OGM9)w6Ibj>+M=(m_pR%0QhOJy{tq+)43f z!XZULAC^tVQm_%itBLI+^$K+H24}I*d+W&r@3f#2U?UVK4Wr?GFEhVFVqtD05x|Fa zFD&2GlvQLNCpk%PzNs{1uW9}9WcHOi$CBg7>qdzmvl&}jXV98GJ)MxgS6Qz zTT$ISFtC26rR6mf{mp(FEgl{D`E58E>FhsJyh_jq4wK2Nuf9%C%p2UEj*bM@icBiT zabIZbPON9x8x%4(I1cWS{9MmYh1H;N_;y)y=&Qz~sl2ah%vazX8 z0TgTla`rNKM*lQj+|~xZv)9hipWj6~g=QYiGrZnG!4aag{WP9JKq(i}Mu5c#9quGY zBZi$J;GHo>3lc-lM1qonsn{}U&NSIA$Au+BiONje@Ts!zEeWQQnp2R>fWc*y=J=Bi zYvvIBMfUhMr6%3;a)gfJ)sFULt%S2Om^MjJItxU5_MjInh9rqkx&If@+f7F<%L4oX z(bX`L@Ec2YinuNv^wgb$SwRXtQ;U8EDeYHOu3y7~nYeKYpoOV=QwBxin+EhH8v?on z?eqY0od~2~cfV2PI*XH>4xo=n88GZMZM<%elmBv!e1;wJ<`xaiboz<#+-urwA;M&@ z?fdrfI41HlF3|tmoGRJgyBB2kBcWH~5LYhgbs~bp+xc_JkpW*&F^r(lzCfMdsEVV) z#OKuev^GwX@Zu7?G4j*iWc;lgec9Z1FS~7tV=CyEc#v%Gqke2l*U9-%maX1grPaJF zuNCenb^pkHgJhnU^IuwzvW9=SBGUV_uSv-C!`8E`p?s6)Abt13VB`ka+N5ZAhH%UHJ7X`6~3zf zzE-lx>hW-+nb z5m9FJ8)t3j%gHrUn+sq5t9f}wo$lW)C2^w*ihA@!fTs5EFy%{-B;?AB`6_IZGr( zE$d3BEElh$KDR(xj`iIcW6ML z#{d)*ZL&3uDO>PfYa~J(v?vl;f0o|V=cUb2mmGW}AjbEE_|P&EHOo}5c&pVdp8`AN zY)YA~kqU#ErPtLMFIE#B8(YJzRSjpYf%_xwq@0iHJ|oj<2BW-I0bY;4UP>+LBIY|q z!N)Cx%5LpSSCMBnS5NH)$~<&G8eTk7?r!JTs=*Kn{!@jCx9L^Eam1BD9l1Hi9OYrb z=}#*kTFCgYbwg|P$WwYRF!6{@mqLbXPaJ*4#l!}T`4yJdQIFR~-%4T!lGn+kcNMa) zIb-Xek2TiE%R^u625qR1gaIE$t!y+v{fE+p29H9=WSUmKSxSYG;tRXE zPcpDNcW3Y9Z)-yHPfeA=ASfs{XecfM=UpfwWneDbf|VDlX`%@}p*i*!;57I>u?~K( za}o6A3eW*YgkLL7HYiV@T){?&Vra3eD-Yt98QN}?i^3Ngnqjf&X_A|b+*s-w9pg;K zOb@SC>VaA!Ca#q$I^$VoIAW_#@|bMxKJJi^PJ>%x2=M9~=+=;-N0uow!}*cq{GUe{ z#3q$ieX0dQiJVo`(RFpS!&@}xR)!S8t&Ox*wd~Cnyf-muO?v7#KMS0I&IW689WN1` z4$7A@331j((apMJF?NQ@HK(4k_+AxARmCt7L$lb(3}u&pN+}?LVnfZu!ocV?$va_Y z+r_Gf!c4D^8;tg8*7X8wIt3y&?dndV{KR|1ztkxJ(ws>uE89$NDQ_ibhiaR zsZe}qTm%fwZY$(F7KwL+F6wF>%rOqTd5cY+uGP^=C!5MuIq$^AuJHP7;Zjw`3is5J z-7|NFZJuDh%lP~sj~MkHF%ra!djCWyOrsL*eid%iH(a&>+O??&)Gz zW2@J=+KSePzp&iv*KPm}kEyU~xF+h%q2}(R@C+fBZc=qqM}4!TmF#2qK3SYe6;<21 z>p)Q-#{lK_mac~a;blRgb8^UNBUOr@WQcT~2$5L`uP8DNKZe4`!gZI00EX_I7k&4s zOZnlUf<56IyQm9S94o;RHgt4pf*3;6@oOKkq4$~=*urw{Vt+RXnc~Bn z(GpxW);QQ$$<|L}C0^wI<(MdsWV+q{H1#7-BvjOZ<>+4xAQXg9t*M|1;RCGCAjx_< z+TjxE2rKo*RcF-GwPiH5=_YfqH&7r>)J?#1Ok+y}(Yy!mRE(gsRjzmTG8)(wE< zzR9Vu=N)Fx*z#G2SR4%-5^u%A(-0tQ)7>8QuvTQlT1$NzB+$@IqafSK6}Rs*v07xH*nlpX=XXeUkD`!ilf( z?Yo7h8^5}Mo7hehf#zw%7YQ^o*L)OAc-0`criDMgKy|G@4ljZTYkhr9{ka z3MAGeXVbBukP;q?xmRDJST|~3ayeHUjn5TwrOE-XmC)?Mmts?1W9u5Gf3H5ee0U*t zN)uN+m8kVe$fZ=8K*v{3Z9G7G_I-g=&MfuG(d6pJZm4^6q06Gk)W`swAJ>zTsn^P6 zajjm>}ZQ-{=NM^zxZ% zi*@DmngmaWi{X4gSIlSK*y~MRPBl;6tJhf?_ruZ`N)iu*xsdxhZ?n=Q++UGB;((FR zs?yk@*?UC@`&n_cY>Z8qFGOut54gS3R;R1kY*Mt2UNU7!o6D=?sg);bO8;_FQ-tla zpL7@NxfZqMzsT5gwi&SZV33vHx^rkb*1U|-y5Ov^&B-_! zlPZ=hypj;-Zt$s?_}yS&XdC?J5yln-AFZRT>1}G$z$jnm2(Z((MiBtp?7t{=;%@$#uIm2t7rRsQA;U}Vy`uQwF5sY?4`lK`<|~S2ZJwu)`WB4 zb`hU6<%&4@<`G*Z#1nh$sr;S(>)FEEA5%FM3(0mk+U-6jAZOxDG(vVnVk09@6lz~N zdH@AfPKMMNP-I>&3mlRTU(^FI_z?L;e(+(3f)cj8}qng zE)G#Yi;iSC*a3EK^t>{Dw&WT~DR?MH0k>Bcg;}*~Xhk z9~ta8g{d5nqUK?&VTqusF$!u+kaN9}UW`;mU1z8z}9IzRD`vo3fo4Nt&q;tlL(=U%6r_40@(i%KdfuXAe z;}mxJA)aO)6L+^(1%ISYz|?nthO3^VsJcy>W|MK|-Oq8Qf(F_5DJ3;qYKME%s?RfR zf76~#s5CBusIB*-!r(C?u_oIO^%y-s`g7;ASy}X07t_||cvqa} zhlWFfe>;F;5In1v>KoY9rej+EuPuf>xJr@XUl#~eRmRXO+$gcUYQVOUhoCB6aXDH_ znFvAULowQI_EG1eA+*3BTlkd^`_%3vMr6h+Qhei$oW*;r7O?oXup zOArtyrK8>Fqr=aQ6Mk0_L}wTQ>Y3Ny{-jV#A8w}43#g%MFJd6D_8?p@H|8GX$4H+# zNfH4cmzqBSt|DJq8mODtYC)g{XWh?E-8b1Oq7DjzF}^ZiI{%>L`un#sPvTWxaeQ-7 zRUS^VbZQ`@S$A4LK;Y($3w+SqEpXys3#1GFmv&HM?uanyHd#gD$<=ubS-)e5j4|m8 zQ4vhXXyqK_VD#OxVM?9OZDa2z9a0%*4Y+-tbplcfP&)Ff&1Y8kK~nHUpJmRt0TG|; z*Xx)gESX)fPYmbF0JWOqvalSb-b8!>Ld~=o>QX+D9?p!17fw4i!7t8UGPZ<#2xH@| zO&8a5K6K|RDnu-b*ce25XDy&L0v(YKtPKhA(AVi_LIHktlL8z@( z=|<`#{4%Ak(K9Df;y}hp5dOV$7uB1u+_8|Rvs^C6*PyY~jbEvk$?42_(GD7mpa#D` zasXE9_@N(4=Ctd03$@mGQwWI6HhAJw0cF5hHBDJ94|8PVfip;df!a>yNs`-bLV$x3*s`P#zjqo$i(e`H$+Rp|-8#R^yzL|B@D%{bhP?VBkD z!}SpkR5Unf*|;rj6ivFjxm33sWb|)pSjq^JT1VS)(Pk;*Vu?S*A|NRdp^A%7emT^M z6hCyM@oJPY2W9KR9%+JGq#wPJp(xJ9*ZAq8yIHh+xcc^REzK4LU?P!_kit~@klszS zZS^{!m*24KvL?S9jL^o;OjrlfeBYZ{4`<~NSbmdixs~*%@7Dg80K!2C!H^?RH-r*- z<*neUYKJeZ%nmWhi~iY2%K&kRnJ6u>=`w%g@W;>xiWPXNKEU4}ZBg2Y+frd#zl;r#XwTw23LkuUS#hU3PW3id_K76BD2}9o< zYt>6hX&j+bvjY{2gb5YGLhn;mDhPHRmw=CyWX`7jC9Ju2X`a{V&}T>JpnIM*3qvE6 zuQ6T|YoSBd+@TEb0C*W{Msn4eK4w?Payj0!fMd2l7T|3Y4Mz92Pxo5rrP>7$Y#0L@ z*@rb}-B)$f@DtG1j-Gt0XI5MO;1#s6m+VRU{WzL*)VU?bXDG1$?Wd7h-onbWl4bTQ z)mhfa4QYxCk;yS|kzgOPC@=B0KoK)GL6eKc$DJKrM>6X7$#a>&W(ToK*?b_?IWJ0c zNTN+#&x^#$YIs}zc9fGgwr^Lp9iF|Ti^g45eShBiRb(gc3+qY>vb_EzoJmo~kOpE0 zSP6$xE1L1pG_WyMSKnlsYAP(Oe3}VAOHo@_IEL)pAnfIrNP)=_%DUOa`HPEy(&WaN zV5886j!qf`0nv8-X#_1cCGQjP*6`S#V`}rL?|YZmCJh?j)8GH$zT7eH9^*Wnm%Zj*bA5A7e4i4+toREY z?GLj*pXCA+n;u2%bz4r{E*F>5N|SegmHe-OD6KPjsvE<0obPLuG3MM5lypZx0fcvO zy4{3gj+z<2u0Yz2!KJNZ0x64a=;AoKVoIUB@BMQC;y@Td4W&yRdAk~U;5Jw$RV7zg zxjZwrQKbTOAJW~12>+ZEtuvrX*Myrrv{%f`S8))jhl*NFNjsugxFiiL(UFWyX|3Cp4il*aBVe#}4}MP4 zfX)*rfY62vjhd z+N%!3w;=Pig)+FUIVI8IA9ZzC>Y zG0zAq**dG0%h)6n{YT>nBaMJP8f%Sx)rL^*VFh5TDX?gZ{)g^C~5OtMdFX!6+a zYTD_kizhSymT~2j=D1SqyN+O)b;!F7yFc>#M#4IE9b zOtHygAWkRDuazDhW$B{S%3$D&pXyjJ4Z;#2K{%lf#EB+W;aqtdD+~Np*D3hOu*U5e zagT@Tvq6hA52NxDII7h+m;llLx|So;=M#4PCgYjR=MsKOo2G03Wk`H?@|~!`^6A_4 z=@$ZTvs!*ZXJOpMDNh-)*MAP634qhL2FiC0I^V?5Gk|GPw9w7L?a;BoBQ+;3U|yj5 z-1O6YYW&sijpVkbLBYfym*!@qBisJC z(cTle!$s>=q4{;s?hHQd!E(Z)u%fpoz7cR7lp}T#k_G$0{fG`3(r)=c!0TV zX(VK-#Xbq4`=>X+;TP}fd%_#9!l}S7@}Ey>()$QkqKy*cGj9bSFT0O^0n_l{Sya)I zoZmkZCe4@t5y{A&zu6Kp9EnM209+7b(e#pJjOY_YC3#$G9UpY>cyd@(PO^o@d+s<#cRO~r48xWgvt=X;cw+6 za?qwVb*6?pSm6FuQcN2TIu3ZU$SJtw>s@X=}A~A(03l z9*+$Jx@yxDFA*&!NlKinuS5tJ>66a9-Q1Lh84*?FKtSMGBk6=MX$fndM)AY1UKA(4 z&?+wUXSMEYs zgbRK>+eulijV>%%JZtUFiyC-J#698lK(iFvfM1?qnnWeJ!=3b&Qd(R11JM&m#NL41 zuVRTv+|~3l=LaQPQsx>R-8uoX4k!rovkdb~)$U72Zi<$R$xN%!I5G=Eo%t*)*eo3G z40QQ|=fM_LjL1x#b)>RCuH3&iuQKKkicp>FrXiLlRa{+XwTgAY&bPtumTJf_Eg#Pb zvgu6lRjx|5JURvd?dvCH?R?rdMPIJht!7EeMn+rAHL^v)=fAr2W5vcbuZ9R2EOauf zYoRBlvebpcr@7#aN-6Vb0uSl?{#W?n2Cj2l!!}8^X0~Z04BLyz$0j>0Zk{x4jieDK z##);q|JHT`ve=|lySA8(m161Z*8+YBAnYu>r6UOB>wev9t~d^c|)fU-i8O%#1~zW$3TXF?~+x;|5>zV;gUa zw6Vg1tMF8+#=GN&8oyR2_gZqIa<_LGRwfMA@c)^x{4fj~6pZ4E7&-?XckkQF}A&)YMGzYstJ$)4(Bw^=5twfmeS zDa*Woh}}kR_HOAO@i4a}Cso7yhq`4TjOU$zX?8uaoo|2g4Mz7QM8&DXwxq0A6l6#3 z9&G>+Bapk3*$663eE7Xk##R)_C!dgMcpzz@@nHGmC;%4y_3WQ;$k+a6*g|bt6~p4W znjR^7hG6leA}i9)IE@82n08G zIAtqESUBO_elv`|GM}I)XE95w8O`?1Ii@)o=+W|k=%IIVu#+-h_&JRp z8dfGO(hctK>BzUxRW5YWz(n-Qn z(s2CkQ%kz^z%SsFg~s{~EUhXCk4@c-9&oBOP`UI!Mu%WX8TW0F=H>cnE5g?0)Ix5E zB059wK|xb+h_UXFl5+Nq!^IuC^3#mm%hIL)eR0d$4<%+|!;BC{%%-2`bYEBXd_0)1 zPL~<*1(q0w=Km;aZZ4NLY}iaG*597E**)4`NX>T9n#p(HP3Q?duksMp%KeJ3!NoKI z-v%g%Wv_{?WD(Hf@m|p+l4&g(MF;lKlILl11Cf6Z3r?kplX#GR!gj7H4(--+UsWh4 zSV$cm$%7&}G{#k`^qg+kl!Exm+JE)Ky`j8X0TxIi#^)_A5V(|*it?QTs3G?zj2Ye> z-Kdp?{-SlS>qTOf4^t%VzDbq5V&ED7S^B1zW00gRu_2e`ZoARDB#yBOXb-S=T?@`5jARNVqy zt#%tDJrq11*GgjxvHN{_JFADe$pcX1D za|PB2(<`@mOJi@T`=~$o^J`2ZFhOuQ>{Anx%|X#$1elg6jXDPco?5QoV3xRx26A$_ zY~qp2Ns;6~vKN8v*HM}enfk3Ce9P{`2+J>s=TAIoIe#{1Ac48 zQMZGGBO0yLW$Vr)2i*0#0u`5_DtkVI;E{9Yan-q+u~oru;pYcUZY}SN_fW&;xEAgy z4Ufi}7n40h2=?dn`&In(#`E=REa69R)!I}{w70|Ytisw?P5AxnenhrChP+PS+Sn+_ zEe%p<1wB%u2t6LY$a)~0IugOx_7>R;u*weEKU1H1bsSf%TFlNKuf6EUPQ|61d{|jI z^7~9!u8rJMD$oG{K@g=pbxv~>pAc`UkhOWWNXkl#6futdmWg9iu#smT1fqAcwk@5; zZ=;Cef9<}xmI@12`JSth?tl(E-I^*YMHqYslShZ3cIm1_KD!7}*x~bVxC}HEU812< zr`fn)XXI=2mWAa|A)pGm33qNr>2D=g1{<_Rk&W6cF3e`y1 zEyDsk6!d)7daHgzgr#P}9iu&VIH;Ch?Qcgu0mP6^5-WAOYA0#$u}+fOC@r??(Np}x ze22kiYswdr{|J`o?LXZGPOWvjbYi}g(!G&o1Ohzi?BsV~JQ^+)s`8{J43qQMPQ8Iq8^_TO zSa^5asoW;Fj8Bit6*80})^;tFhAAsDMSELk98$aBdRJn9ansE)UA&jEA-VJS4_)ieFfrWtg>O7RX@^osIeeSpqT5Xd9Ep>3#k zIsUrRjQGzC)gI* zODh_3Na5}eftkmqtfXrSAPg4LQ|GQ>*`ATRphKY+)mXMmwp?wMJVJP}Imy88)Xo^r zE}vDS9JAbFaiF21KCPuBw4edmKc+_%Q<8^V&sRGrD`Mnp+aIzk&($<(;{0KV1vmR^ zlDhl#!Yzer6E}mwm};fLY|8B~)713K0>K$BS|Lfc^md(P3>%d9Q6OJtvlwLWCKy=Z z;k<(h2C*s=OupeTVfH`>_>>eN-=xO25%q2U5VF%x$vZPucD+(-%j=C?kj|#JT^WNK zjlhs6_mj@JH_|ENa$czN538@IN5D}Hu6bu0ViHmjZ0h#=mTIF#eT?XzuTp1ITG>We zx3R&AI;}raRZdP+d7KA-8d{6ot;|yRKcynBws?9tAgE}NLM;* zX^TrzFPtB{U`nWQ$mAUwj4>h#1OTZ@7M0j4NN_Ylmeq*N8LhFLk6~aYl4Z##i`Vuz zSbmN)4=YF}SMt0wW76H?TukV$H}zgeg1pSL%z;SZX~nZZ&z9%p)CFNvXT7Jx@~KpM z@dntq`Vds?@Od1hT(iHJCLWf`-)q^>t@4L{Ld4bfGRoXgWD4O`$V%n+>gb(JJ;Xi|1S{lH?Z?Qhmde4qyy&EMzZ5 z+;n<<>6gO*4RKb6n7%`FHAit`+e+|n0}c7=_<^53JQHQXi6I-o)D|XNX1;~k10m(g zg>f$95D4r>G%#z9grO4*A>}Tn%erx48`5fp)-hCOC^{RUz_+L8w_JmXt^9EOprwf4-4nuSnmH;KEf z>q_$0_>4Xr+3by0NSUcJ2~Zi+HN|Vne)R*}0f3mw2+eWN$)N857Eqh7R+5eFy9Y?CBrMo z?wMHp%ZAV?MPK?gWLku?jcdDe-Ptcoo~hBXA6L^dDXRH<5(|YeE^%`&tPkF2Y{&WN zvxa0T-%?M7V9{3h3=j-e7{SEiuvr(&@`cRRtRsz4w|ahb+Ob~hHbbiS+TKBlmH*p$ zb%*4<&}%?jBmLHxlz|4JDq;PqvRREnbC*>-)Z1G?w;r;<6Os8PCorQ>Opu6*1j}Bm zi4ph+6=v3ZsSyZXGadqDBeWx8XbgNN+mQe6a1&`DA%S-WGM*XRqNGNn3YmI{C_DrS z_TtE#Hp7WkqHfwGs-RNIeNQX27t5tHK`ScLpI#TRhW513GDw4)q`wBmZW#njK(`7; zJEam-io7wKM8xWJ8=t5qYd0sjpcpCigFomd`OS z9=}caU8OO+j;JhD>_Q>2Zq6nlU8F4jLiEA0o|!m5e!+{R2*{v>zCDcK$z zj_6n6$<=82jw|voahO3KtDX%v;ya`^92 zQ$sX!sAPvVlIGQdWfq{^<1LkmVb8A~nG`i+JMS?{ z3J!_8BZi=dZ-ouEJm(!P@`8=astm4hl-S9tL69)AT6`&j(POG74grdkLX}~IZd_C2 zC9Wm(A%W5cfA4g7Q7p@yuxPoKE;`OtH;XMhd&TMTlJrAU+$rS&9Og4VBzK$Hp<8cLj=%2YftM~qFPzI~m45DhAIJzJ#$ z20DV*^^aVG7yVubce<~uHhyVznZfbJor2b z%_GmJ@!D$_EiV`ep-YPQJOmq(LMA?RP13?%;I`zS{_(h+06tv+MH&^NRBUK8h<0QN znR9N^5h$=QU@=Jw_Cn`*6K&fut)ds=1~i22#Abvbm9plkfdcdk&xQ+u8jMv$F_iiY z9w?bkANMGr5u>2l_HOLlDawnx12<{VKxoO*_#e?Z7nhJSdJH>nRJhlKc{GiZ4xPEX zBN5;hkF3l%g9IkLoJ)=B>>pReB&o%yub=^Dc4FjmQ#x#h`+KwMI|bXIOv~9SB7Lpf zwUL8cE-4Y6Jpop^CwwDG**lS`xZ~i8x|O%K{2FcV<>G^-?C_2qu z95gukSb_c;>I;roEbep!pB5Ig6zx>Sbz7xUOA!-$Wi@||E^yM2^smY(J+K4Xtf?mJ z^DGP@j`akB2{ow^)arxjOZw!0;Bc4|d|&t;jeFp2!+%TcM3k z?9Z2?lYpElfsYJj-F?E%&5N_)TM^1Y!H`s3ss3P#wmW zZ}0!UbiJapIc~Rty7|0ECFLR7t?GZAc5|8Nn_BsMP^1RR{L_7 zq8#I6g#1{;Ye&=GKk_IHWM;is)F&RFEIvk#wsv4POCQW zOWAl=W`3-0f$a^@H7-owfN)P$S#21^S`b#SLDG@zWo=+Gr?rusP?N|uR^FC{9lpAp z@6)uRaSNzXD}^>{#b%v3?e^S$vyOM#>U7?lwa5{Pcf7(vL$E7W5^`6>*2?`<)kBdK z++kWaCaER!Ej8j~NS07Lr`64-($^-@P@AQp4nCAS^gkTyH^faj zjxy4%B|4d4B%zZ$H$6Kwq^KbJ`pS2=9=7XfvY6vf_1&whwqjDOEU$7J2XRal<7a(( zFw(>`DiZ}l(K)zLH`j>+K^QES92L2LJKhYu>|1Ybwu4T1nOa436KDiX)9e}pzHnO$ ztkga_O?GqKtln6Z@o$U_3NnG;4c76Ja)a~;gk5c%Qb~h{bC#8q9t#;u>*pk-)={bFd@4Tbf-K_4}r@(_Y$?k2&qYMvin4U-;@~G< zUzj4p){-ZOBXmlOOQj4FJz!o+U$fmkzo3a(yXtH3EKYl4qEV;+Kz?v%Sm8|J?!pnZ?18-^HIpf-(i4qMi1&&uEqKeo?1u6b$*BhqJCG74 z@ifUBq8JBh9J_IE>^8`lO?zJ2T`0H)$fEnGnKss3(m6>@&ekfG29=^|K>W`EbOYhg zb;bq3-JqA%{IuXSsOB4xyT&xOXpG(p+z#E`#>aT#;NIAwDWNW6q5bp4b2HZWQ1`Kv zTD4(*L`tW~B$0+xA_@=6<${UMo^` z8qM%=GgJhaU=zswP}fjV@+CXnvmPzBeuzG{m#^H=;Ax-kI82DC5|0G{MF@@2wmL=> zjEy?F{nxGgE^xtDT`gnKG@x=axo9oL%0L%QUuE>7ygYLdrWHyDM51)D01TJ7H-|W5 zD&tBZXJ@lQ!h)ZGl@rk%D%+V@*XastJh}{W`Y6`s_r z=`4|M7(gDy4L_{(-`UOn9`~k2X#pRxbW7(;DrPv|KA6%iiJ6=9F`l{}U*s-an%V_K(ak1Ohd2*yW z65{Z{+kV}@h@J{x7rs$j%PZd(`WyD+x%X3uu4J&e4#Y{G(rR#YmD>w(cJFPk5BC=c zik6;QgREuW*%eP4|HLx6Ar3nKzGA`05V1MBr>NCWwbsDb9t!5orjq%)P|{n>-My`m zgBF&Yq|K$d!`NyzrH~Tai^iJlJE%hT-7<`w%f%fuPG^t>K~4fiif*a8E3%> ztTV);$fAgh2x@2qA&1Gr;vG?l-YBZ%S_IFVJbCi6q~$3sH8B0CV6sz<#-Mp;h{{W? zO9)Q)o9md6!~RT|C&vrp_VKQa|GV;y;bZ(+1N=e31M%RWMp3e@PXcN@O^{p|PbAr1 zAQ`hyU&&J}gm@Vn8jN@`Ku|#2WH=2ztJ=T^f6HXA_;}~012d_er|-8}=#Sy!;uPG5 z)*!RyIxO~Sr#xfI7Ns}2Qw2UL#RAGc-YnSXCgANmshl)TS;=A&P8)&<_)B)06sI0F ztLBvZ{`@_UBaR-na#dszIFMH@*q57x>?HCZ|nNW03HWZ?A!5V2u{@W-8@DS@RbE{O-A?}2P4dW%!I z>YfVFuv33Nx z;b!Qd@rk>afKsB~JmG>C!x2B`gDB=ReG3l){|sF1=_twRgcb~E{mH{*Lct;h78G3t zRlElrg9C%KU&4i+%R~-WFS%QcFSWNR^l(7>eor(*zcU4p%W%=5U}po6?{l96Ufwdm zD}@J~+lFR;fdrheF%d;$*%r~O$XWu_4j2%oRB*Kx0x1EU&~MHv8u%-~c{I}DowQFU z+J$ME03PTCOZf$YxU{!3|5{P5#;lt>qZ+cW#+xkAXNNYXj(xvWD)h`TC?grR+shZ_ z7`di=jD;KiZfzBr@nxuiur618_6uw3%&HVlf7$95Xmi=cGdq`Mah5uguzv1}!DB%x z%ZO>TB1EKAu0iiM43#gHV|$lkXS6m?^2yFA_5V%4RR$f{@BS$bCrB%pu|V1fDaLT1 z*{@|j5FBR%4B5W}f^rgjG5y< znN%zQ47Jky3m5^)kQn|UfXX_rAy_HCQ@-Z18LSjv(_NUTHm!Tr>o~!yRooVv|1Ocv zxvcO-Z;+w=#;iZ^ThoBT4~gMdX}e(}ClyCdA=xV>_D{Sqs18iG0&#oAYP!$tk;5nQ zjpZow`=9fuxS#EaX!QFWO_p~?e~>y1=A+Zy-uy5Qh<@34o?)%oAXRZ#aEFCn%)X~0GH7m@sBATb6i({4UW_SWruU~s~4U&bM0nl zP86oAM-cijY8h!uu##QnEnMe551I4hnkbL-6ft1x1)b26#xNAu%owR*7mHei5LKX} zO3xQ78b%F`6EvSXOCh8rB}&?Sos%RnNJMO~CtAuN6EeBo*C-GlSFeIjR3Qq9;O@{1 zpSD##k-Sg2Mjn=d&~WP>d&XN&KHv}F~?z^%yg>J)z{pJ~{-$rWl@ z9kI2kNn}l<(-Qx%kF@hz6f3^2rv8+E+EdE>yF|;JDDdw;hW-+#i!|iS#Pl0MB~|jm zF^jDY`&TBK&-}WbvFO%vK19W_f^)C(41TF!G^&{0^9cVqGI;LXf;O|?HdDM3jSg5$ z+%*g&Scma_OX+@4%ZHk^8tT>AeTS^T-)rpwN)A>eVoMiJ-GH3+4~U$1#jLh>r7f1e zP876MP94=BgFpn(iP=tn2#eiVHhU;7)2Qa}+M}aJB1XH0|LX-(0l=85&tB^I+0{(| zpTL#il_z<2#r@c6mN zozH<#3cMIqf>NP4WsjZoIj!^s89Q~&n7&V&+Yl9A8<|Oxl0_s>w^pw+~ZCzaEaDEKt&7CDyp zzoT|j3hr1%QfkN}yDrDg5dT$JS9KJ@M7C^nZHTmWz-uTTf2i~i;Q2uRs^Yb5+(#S; zfIz@Hk|c*mh+t?(7u^s52TEl0uz8fQ&``({t~go=VIU5KH4(`-X$qr1e)~&s!12S_8&n?53&NCYMu=JO2c745B^?sv`2K`DeG&?GnQ9k1@!m)NX?_GRJ*2?ycV@LT1tf7S2Lj-E+K@tOzBjZ;V`~5*cCQytH z-!MeJ58^3{X&3SUv0r&!xfDT!4jYpK>I0XojKnMM=27CoogHZ$5K17F-|XwnVE}CZ_6L&nXffj z?O;FwM+DHRI-d395W|WRRmYfkK|v~XgQ6BhPWO{}6m=2@3lZ8F^yoha&yA%TX_Ud*L?1`(B{OM*@!BPh@JK_&Tyc_piqL)*sv_eI)#xr zgA3@G@H44zwhqG)sfB_3ko~8SElhKVb|N$=Owzo2Ac(13ooLV?$LleCEr( zKAy#jkswuM4~^B;#Miv!q(r;D;G#Q)LqDi3JTb&>aL9p3Ad`F0I!>I+<)7wc>+^NZ zu(rL**EifM5c~xxxI6^ByO-Uhd}svtRpOX;$&)kF!61X~eHV&p33`4y?Nw0puu>B^ zZ)?+_6_;xBcIL8Fdw5SV)u-ZpDf6m2^r@v?xd%FeS>NBTSu4e}49zxL8)B?_y>^OB zh$EI{FTRWhtnaUMvxAfHR37x~C6W-?87hDf(CCGk1QTMH^Bh}&WSJWOUR(RuI^+uvecEWOF)|^W!Fb%qy19rDLs*Sz8uVfnzuz;r#QSg1;_a0 zDqOc(Wd@r*rW4F-SO0fLH=N^2f;B5PN2Mcc+%wkovfx3T^(F&iDRK2^*p8V(Gc!Ng z35f+w;E*L7Psc!|DU#hli`s>D%|>R2LE&ff8a)R)&sI$#|I1h7(}M=9h95@1wnV|~ zrg(A+k`5*aT@gVrQVI`P8u+}+n~bPfBv^6N5(qKGp2jG>-8S96c-hB!+`5B>Ob*25 z7S5B*hIfk`-dobs9RZdcPODdyIU^qEkxzZq0al|an+#=%SU(xk+K7nzmkN2OUs$lK z;BI}u0c_>O4|CO_Jb@%stoVw}94Klg0rFXMsP2Jk)B8CYY zqY=sQ`=|d=BccLeSXEZefB88TPuOjnBRhgsJ^#}OkOSFygqOCR#j4hZq>ABsIMw77 zIU0JAA*I^6I5}Iz`hWWf;5CisQta1Ll-fjpPj|i#5hoV!b#pNkGN401jFL(nPw*?w zFf36(Ed~y9#c>ZL!hg-E9MiG#eVc$uNP6rRxmaSUX*Ljc4!n1oZgULj3RjrM)N1x0 zT_$ntMe%FqQ^9~YiW-vEZhDs_P;P|ayG~lCZur{^(+JN+h2byQj&JpIJM_W9jC;Gd zzdz_$4)WEgi_tyv3$cxBXkU{@jU}-+M^^gg>Z#o-d(X5>$*~1|aNQ0nTR0|BNJ`$IV>Tw-@0cqe0lu))tMq8Johs4|;WBGvH)zl*XskH{+)MZBSrWnB2_oeqO@EwN<~$yLM`3w!A#&|GJA~IFMx1kBW&MLijDg%^KoGorn%<=67ManXrQ(xzFZnV zn9W{aNF8-h{|Dt zn;?!Jl^ZjXMyvj{gc_2#Ws-VMT4Aa_(yOmY;HiU&6E62Nv##8wQiWA`01@d{sA6OA+>d z$BU=5ST7`}3+AlVpsjq~nKoU9vB79DbPLd=PpgOczco{(yAoj4{zcFjl^oTjBfz6V z)2G3whr-Q@@h8rP%V0`U+M`XkW1s8?PX-qTbxPmoCwbHjS$vN`n#!L;v$CxRRGm-5gVGv++&B z9)PQ6{hSQcoKW0W7zK?aYoPxoo=dI~nUJvSLJAkCNS8;^cIr8x|>wBmjUVp2%%4 z%QN;;4T$A0yyY%sO1d7VgIptU4-P^bqVzEP{TjMleOxp3NDy2nSAMxxzGbg9;5)obx=ZIDj}_qXG)DX5HQ4Fp65!u*qF?;s@eHf169emv~lF<;BsI? zA|Nv{N~6}*d(#d;R4jLJxa;2?S}fU$Qh+WrQAQ6lOu_ovDA4a@ z*f6abC!C#|?kRAfVBIslnlZ_{!wy{MBt*$KBDBYv3<&{YZ{QNb@N)%lVp7qjM6JYo z?^+>M9PYPjoEY)+_@IBCNu-oVC4yU2l-qDv`R4$_fiS2F%Kz>FWl^?o;F(}GA9-!C zOlqSQz1@8nb=ya)YX8J@Wd5FABBxG9Og}7Y6RBtJ@$OLc)=;HEGD`2!$~b0R9JrpH zmK!H{c;on?16kna2x$i8Sr^)0V3~0}02v|rAajtEC5VpeS>ly=ipc45TZi7=RUaST zRgo(!pLVi8Wn2D*bl{O!Cr{i&dpI=?J82TPTIm!AYhwPJJNtn9DTID2A0yq{=btY2 zbvmkMq8=E6Z?p2pe(m8AYIZCPb>cB$TFj^X}I9rTHI z_Ws@PPef;RHyM>d+$3ch1!meS9T5P)Mbj!AP5`sx88M3T*-^*ByTtPnD~ma+zAnzX zDC(I$Yj>#R>kiXuc#?J^`@ZP8R}nhm_cf3+wwfyjG7qOXM#({cIHHB@x(F%DV-=-U z5s#83WE-y91h7lj{I?7j2A*0;j{5plu@52zJ86?1tgviU>L!CcbLo#%FnNSTom_n4 zQlP3DuS48gy}I*3)enHQto_%&E=N@}b2_%G7E1~B3I35BqYA2pa;2OkjHIaEX5J4YS3JW?Uj%tB z>6{a=s(QUr<`Sfa^yv5LYUd&@HK%C_K5rPdR~8O>n!7$Tg$CKLc_U|5*LbIw84iJ#p`pRj7d6Neg^Bs6u(uYk!Ek(MmAY=O3 zA@^zN-_8gf?1oZo2+u@rj4Mg;+A`DfL9}F1O*bLrC(t~aa+|7NjHoM8@YAeHQ72eg znVCTNH=)I<`8{g<8BO{hrb!-V>{n8`{Oq*olNsoSeHwUk|4W0yHR%4E2QY=Zdiqxg z(-HIG1nUDtPVN{-|)=~D-TvLMZG%|vZ@e@W3pZ5s9SgP%L%kW2}r7ZKv{ zG%V|SxZyxr!jfFQQmqEiau6lnG~&MSVzNCy^JKZ znUlT+JLcLGPllSMYcFY@Cy%y&fyWNzrxt-lI+4AV*1H71>9Y-+G^T}^jU4-;p+5U` zdwjis@iJirs^Hzj{Q0fk9zERl>(>2Wo)OXBxAbQdWds@W9$9R=&^!`y2AF|xiYd1e z573YRkJk_2!%Y2tPIkI$_EKkMHX$|~j)qE%@XPK?@y4jGV{S3IgcKkx-?4P8qx-H- zjpd?p|HQ<;oYy68#?VW&My&+9u{VKtN()tk_gk#(8L8f6bYjosz2#ZFS?<*HS1Vd@ zMXO0(hLSJ^{3QbszIdZT8BdTHOKS6l9y;N3nH7^kapO)d7$I(44Bvw&&&!kqn5}!jX=%(?I$12IfW#X-%Z{hTy~`!neT<#3kfGkV0&2G4*;0*b z=xWr&rA5E$?S=1}lEb68yG8f(NnDRTEz1Mn=7c?*q+34IeV4sq%gIXopOap>)tcQd zqn-7j2>rPe9|~SF2>9mQ#!a;}Z_}kj^6_I#CcTN8sPV`PzO1(6RAz})87hmV(Q8dQ z;^>nV%kr8(oSf@^vKreIu@wt;g+kaU4D?(Qnb@kBT&pFKSs=LxF$`$MB573gLKU?M zx(f((?bF7dVJa!cnA&tDzP4md9)Gi1A7H6DDXY2?U9*2z8|#bCssn!q8dXx3n(UE9 zB+In0N}8dn1O_K^yHh^0R_$SxI)mTPgEoqSZYhZJwWr4P{N-}pZFYA<7uO_70j+o^ zie?`ly&IEpK`D~1G|HC-&AWzvs}z>rI-`f?k*1=zYSErZP3p zQi5Pq0FgRQs>+YG1c8DqNncLaBF2Q6DK^6Auk~%YYdQ6wPiN z`?S5CYP0HCQIyxbV0p#W;X~gzki)J2lN;vlfp7A(Dp<1wK9g$1$=m8l06uO*S~GUz zWT53Ns~h7!ZnepV{42ua^{=;!SC?a^MR?-f&3v3=qkuPil1ekb(vPog^vW(W9b{l1 z_y5|l?IFsF6MZg|d>&^bgR4ef2O>ZZ!s1wDWG7>(x&iS0 z*!)vMO@}g&YsHlenFI3#rv&8XYV6 zNuS;W(voCpQj@)%A1|MU0SGYb%tI(49TSU2mUtyLjV|Yok?|Mc`#>+ zt)1|>BVMQn*_Ci?)C;`@aSV06go9kw0>82~5T>FT7zjm8J|Cj=4)`7WMoVkUV$MD3r|Q!jtC@;3QHX?%2eRZ zV@dj1TNNPbIQzg{*VhDghZe38kAE}0d$x#3b@*5bXHS@g|goiTbCosMxqC{0VM0Unu{ivTKNf zx@t-%gpaX?wKhI*4#=Iup)1USw@oZE(j{IoW#<2zeyI$tM*b%pQHfL-s90>npsYbm zqVp;*Sok!5DHrz($?K`q%F4})!@A7wMor#ay(GYlpzzh^(MPc9<79iszGDyI(&fTE z)mE!s^f;26x#GE%4>Sb~eJ9H>K9qK1Cy1YyX*5;z^Vy#XR<9wjYzQsaDR; zF0c9Cx7jA-ST4A~5PqFq5A#UIoNsJP z+Xy`eVQiofm-cf1;B>|Lxc0TGB7!WdZU)KM>eu!v|Nj9%zMksRmAy+lz!hkl=1FP$ zhNba8`!OyD*Eqq}KocbsfbiSDsrp-5!Nc3D*kKJ?#8u@c6v_8TS%b%nv9`n8tv$9$ z=Q9l^GIE70D?21>l1te6N5+)mcZO5R-%R2ziAtGqpRWzBZJ2O@38#75xkW<5(>ohA z`mQ~_s_Vp`h1?K=LOnDt9^$mSZII4OQa5V6Z~iV}4K`8P5DK2}?Y9I>)6+|Nt%n`L zGL4rhg;-FL(OScwtlqpo{vp;Jd!r&5QC&qclNk}{Ig=`&9&vtriE+ao^(^vM&j7@X{0T{cJ$4nUql=3ZYvB8ConHNJ1wc8a%sPe(!Jl=Wp2s=7 ztq5SXhsV07xM={~-)wU4Zx5#Y)T5gXa_YDF-P*z=AuHf#By?cG$D<)J_)@X1d4fZF z4~=&Q{na^PUsHf@X)d$dM((Gi>!GrqQq7*gtiXwjjZ&s-$!FidJ*cb6-nqR|8R!$F3Ma z`mheON@%oZV1EAx0O9(o=Pv+w3Cfm{N%o|nzogZWNtqE9XL$iY&)>9ovVCvYVA%D{ z;#9E(9*$Q={r>eDRqwWH?oiReUniB^>F6J?1i|K30pCNu^06^6HS^0Xzw^&pFnK^! zqGK}E{*CM5PSE~rZe6*lhiR{tI+5o0Ez-ZiG@<=c>9ERC6wF_Y8ED}#a*>&3`7XPW z&-cS_&%Juk=?9ljzRUp0=`2Bv^?1zY|`3>HCS5pxtfhWYPiUKC{WAK#3=6Kg8T~sU> zIft*kO0Gr6C6QiVcb6TXnp@#S8Rxui6*rh2aV)HVx!yYJJ)uYoYMTaiiQJcVo`eM5 z7tYm)pZpd(pSyqm^Mku?TYXDUR>;*J&4lSx%fD@o>P!r)H}7w60u67l(6CvPa!|t9 zQ0m8xGW{Gh3;4-nRqD=c(MQTgcjB6ibF?UF2u|5PvPRo9eo|+t6RbMUWECuH!A?rD z0PU0++8;MFu}Zy6tcx1`lB}YHR9|)_vruZRiW;7LKhYW`7mYP;y-}S!+Tx~!revx- zn4(o{SDZtW>l7b;VEcYpfw@5*oS&aZNJy@Z4ZmXAZd9udbR~2^V^|H)?e}SO3!&OC<8FRPeEs@Y%&8PkA@Q~fyjw8AN175 zd^EQdx3d<1J*B^Dx$ov5(F!+@6G!Crx82$y>+GGhWP`FX`9iW`ha#$I!pjl|2?;J! zDqnumD9W01<0yx#Vze6`Cl>jPz6X>OCMtKulibEKo9%iG=_eQRnvGlnlkDjXKmk)v zVj3#$Io+L`GC)hCC3sLo4}NStIUj_1*M6S4ZLEZ&7K+y#$T4Q}^IXolAmBd$=ptb- zyHDuj+4~IDn_Syod6?uEvNQ^&3}5oYUUGurd(Pf6nT0E`1w?h>%GLUQ!GNS`ffx(& zi*&Zlwj4ucYa03GO(9)baGc|EMZTo;GgaFOYbs!>B3)e0o&Yd-K9Hky@YR^@kwe{l zEXvz?&{JJ^*M}j8u#@c6=fPRerA#iZ49QWJa7W&N&BfP?x>dXs zs-&k-sr%MmJv{37NTjIkdhf>e`9?$4>A~Y*=pMrKyFc5nJjC8D-2+ftRRS9<2J=%7 z8pSy?7^IFU*g>U=HBC^=*g&qOMSH_i<@0DGV4)b0r6{AQU=ltoNOZg!6@cZ~30_p3 zNJ(5T2gs;|8u%Puj{2&Kjv#Xhdg#33wUqzjCrLs=J*vsx?;#1*rQ1UvkxvcQxAd)E z%F4H6Yc3PnJoh{dE$@L;3@;lE0POEY*mq2V+;P9{Ol?rI^{(O3^rZtFt^3vFT(NtK z=f7?L)tc*a@)qCHn4Jr8@{mI zea)~vkGjF(Dk*Y7c7@AZzqQMi8>>vi9I-VC_u$u-ldeCXo47>(U7t_Q?rqvBq2JEw ztYR4bV3H@Zw5;`{N5W<;()+;TB~MsDcXfgIi;DYAsd`F}JB?g7GfMECp3dPkEN?+H z=7((9-;2c5j}4XWCb>MZ6-w!qY%X6fv6NKH$mn=n!kNjrw!|?KLhw;FVcbr{;?z*h z8;tD9=JC#9WVtKgzx{YQRTDj6@K}rW`>TRV(*>NPfjU*Epvwrexkc(GSKCY@#PtoRY$@3umT?L?cy*cttl~Z zazj6vVZ9*h7%Q|R94)9gf{-tnLvkfzHtz06M61%9N9LGJ>k8!USYtS6x-!^e&VpZg_+_=b->yl^#x1CY|JL!bqaJFeY+>MpF-ZlOE3#;VqD$o)+ zLLN)D$>JMeOrj|-4+aCK@*TGQl8DoN zAOhyhCOPxi2Vv>GI)+4m5&U?EY$mLMs!TY-q@A~V-R4POzBkjmEX1f1Uu097Qo0V% zw8fG%Tb@7?YgfYUsKNg5NR@#W=otMF=d=L-Y1>-hU9-OOe_NaXzrS#49t&v;qDgj7 zAjs@>f%y$=@y-tI%`+uT?^%Y2nmuimI5}h5S~ojQ1MMfzH&}m9q^D;=I(+klcsQ2*tnb2x{Bgrk&jR; zjgOp^U*tcfj%J-20(#a5GUNhN2=;hq5)*@1u2(@5>EjULrlmJ6z;~x5)5}gy;m#ay zPOH5;I)wY~!t$>MoQ2yv9@V`T?vJ+qNfrKY3xr`1s*E7C_v=x;kuQ3h%f-%9yRz$}{IxAQ_*2?H?YjyIKip&D)a-Zo zS@E&k{ncSb$R`hJGDWKurbMGLzNR;r6mfPIzytsK#&iEiPn~bwy}GwpohW1)D^a!`R4$Zy2XN;#!KG@b8>KCtuYK`I6dO&^M2PDOs)wCCW8|(<16bW)1^*f5A%acXC$PtryS}I>SYWT52h;G`Kl}Jdc8pmhQHKDj7sT#EgMuYg>EX&w6By^y7*MQP=v3s~bv?}0XDDWa z-6gMICI_5e4gmc4Dv9qtHWa72|D4Dka49(h{iNlVr@*TOoNJ&8}kPadxwS z32`GNz||pG&Sbmh46_t8;}r)i5Ber%Qy~SAkdkT(yu9$aIhuRl603MZRH|#PRW?Xk z2>Kz6te09qAlrD1Pa7nvQMmfJY~-e>Yie?8mBfX!Eta=Wzv;~jrV71wW|V6b&F+dN zI29H%n^@v6^)KC-&S40C(lUm#V`VdIPGNt3__w|`SZ1Nwg>YlvM(*FmD=x1-{~Dn? z)SmGvDRu%hdYplspilB@azry;v)v@!tBA{6-(efAL4R9VNt5I)`^EHhqJ ztsu~=ZEES3v`hYcvwsdh2wX}Qz#^epLS#;p{Ht>o3ob*0{wgFSlS+I67WiqC!^ z5}w}&1~^1)^;#%y3A1YAiD;zYpnAWNH!#|eF3T%+#Zkf{%BKF5=Snv_Srl^+*dG$^ z(iZBzuAtvmNKAnuB(;3!d8ep^G_hK39Kh$4ezfkni`opds62k@Iw{5AhTu1>M?Y(kuT)kc_K>ptc zJ(E62m8b83!a}c-B;K^L3a6-dxis&YjPZ*n9d5S0e+O|k#Swy>;oJzOK3VQ&z+Lvk zw1NxTc)Kh-`HiWCbVXUA%39KPB$QptsW#Y)Bva`R1aD(W5$*WEQ)N-um4oz9R>mys z4|$|-B;8IkBu%Gt7zRbV*TQn_)+X>fUY=3LtIJ}d7V4%nTWhqYwZw;bd>ibH@wl98 z!%T>!;_ZK0#9WIqD;hq=k$Js`Sg!NbUHnZ!MY) zIZHa6sJYPr`s6S7+VX;`E@j0bl_P!zVdllR<8y%gC!wKg>@d9CWFTn zug`};<33{6hPW+;wL3OH(tZm|WWO_2>5i{|Zu$$qAGs57m<#uGJABy8|64y>Qqo^P z5FUcKZ}JB^v)lCHhe1P&?$Nt}LW!yzq8L`Bp4roeZJj=rU3)p?t~s(dLX(57&1u2j zeNrTT+$?6jhC2ZTLPji0W9|Ykmx8RW^r^FgrHA|%=RVsMGrVq&A(LtoV^6S`h(?dz zUpbpDV-~s+T3hmA*$Cl%??DS;#g{bgALNbvk#Y0r$QLYVhi!(pYU^ugXveG*B|H#g zVASZC&bj74ahO2e$~?&C4`&uW)^^54>CdL?(Ai_*57mW;jy}s4O`-6%OZb~q`g=tg z-xAT}njhp{ay#;9San^9Ak>60pYrRJ70_8YN?hrbX3baH1Y+n=cIA2+p9agN6Pis# zt&x!-fJ%sru9OfK+s0HW0q0gv(wWVv0_sfZkzb^0xpmZgxwNh3wN>2CdirIyO}fc4 z;9HtJdYXDV@ZR%DCnw5@!G*-x)0z`i_x|uepFw>9Pe<&GEN=oA8(oXc{H^dW0 ztx?W#^OLanyuu5gH+%E`+-;8IuWvoP%74GA&^5RV zlUi&!nO#r?o&+K}H81^5CVQ>g$CC3o!89qEOyZ7GT*P0B4)f6njsX$S%N)hw6Y$B> zLPZOHWK55FT?RScB9zEyo#mM!F#+wPI9C56K2#YRhLIiITI;N#m}P76urMzj;@;O8w;PhKqANmt9Dh>0PvK*LOGMZSCY3mEr9W^}N*{w7Np>Pg?Yb z=Yrm1s4su(m}I1gZKMwhL1CCH>h{z+=>71V@ei&G(%CQB|)zlf=bwQ%T;ctd#MfV!OXKj4G?B zKr2HQ92{UEzU)3#|VLCx3i&DT^b;+7!Q9xd(l1w1}CeT|54xBmvY; zDaD*Y)N{Fy&hRT5G>c%6GQ78hgcNFhSU=xXe?M3L{JVc*Oqe`Wm~EQ7*}S6?&bQh_5qP1XvKL-^ugPYC_TC+PAMC|!h0318Y+5? z&Mw0P>dTv0sQ0^HU0`asiChI|Xs&`=_eNN%9_cC^$EQ69ELw}aVrlfge+dau7J!hn z+Y)Q@C4&k8+L&!<9!SMoo2z zXPKSgYP=FiFD|KylM=7)NAfny(9VV~Ms9jQDdRQGZGVs1MuNt7f!|9uAHyw zTAZws4s|q!r$rB+Ai@r2%f@Zo?nMO>9{W&@ooCN6rwwn1hY!=(?p-49PVbvAuRH~{ z|F(kkL5>OQ=3bLP`UardWX-IxwrYU8;b_Nw(W6_$s%ldbqXXQO6#x`B1{ES7Ojw$S z!fQVfj9E46o_|xS5?4=VV`P^ZrzpdZ5*QrJp(SoR$J7*m;C8SYkj5aFIlI4YumPn<~shTP!-(KF(}MEeV38wemlGHN_Gz zog;3A125U=9=HbZ4)W{i3aC8{Y)cb8X%iDEM7xyt{XsolW??yJ#l3v3_v2--$#0ZO zW>*q@+(epr#6W*Z$<9R%bMhNKYuzy>g`n>Fzd0dK5&tg*Ktf_f`tGxpBjHu3oD2|y zZMJ|5rM_>=@p#t8`4;^;v3FBgVcmag@dhMEL#ft{)2>$+HR0kGyJwPDsU9PF%M{p9 zMRuzyOrafZ7+t??+vWmKWrx8n?4ncyzQ8|CaWckL13Yb4iJ!?vZ)-AJ>B%ncUlnz? z=PPvdH3o*5WHXEqTO8F&aY@!CWi=}EDjSj1!qsyI2Syr=ZfT4>!9_LO)oHISe#?Oy z97Pjz9=jAm#mv!ve9$>h+L>tYe*9k!fH503+VL_4I#}4qx4rVB6}=?+j{|5A9;n7w zbw^$R_`KkqMR8I_*HY*__wSu+ep=7WzFAzvdNDNmvib1q$H?L|s4wl#I>0B7s?U)NzW( z%)^RY@W9*erGi;opz2!J#dV5J>%azdEY$LVFDv);epcLK-BCSQXC(>{yGx!VWqAB} zttTTk81v(ChcL`h{9D3;9>cncnMFrxvw(o2-8|q@sgA}LQ3HDjRi_kmoQ3}o{ zsL>z3-jdVw%6V`>-OQy3R-V8#8oQRgCI%ID(R#4E(s>`G$7Gt|CmnBpVa}gvK6Ca- zkAVS+9LX1@EVCg$u_`bQO@u0oj~o!*luH_HmQ*yS;W7SH&UWlC zhUd6nP$sLL-kR=Y$@GNl^@1+Z!A5TOvZk=uz6hS%_hhGs{9?WpTl|W^A2pl@dPWz< z;dXpj$UqpTj_?z-_0SYMNk8_B)Bvi zB*PqyZv4Quc4ADHLAiism1EYW@o>&9-QeMt1cFgSW@c#MG>1C3cTzc|#)U(~Q&U1+ zN4&b+S4;Q<+f(k>e=twSW^?vs%M8JwMAG{|PSxUHKi8GPYkW`D%jKEnHoDWhUVO%g ziC{N$WYuMRQ}K72)K(Z|R3R=RF|$;L2OYJ#UameN{D!WSbiJnEilYa3si??Kx>KTB@bDTW{<{RMF8fCfR;&=_1_=N|~ zOciH!okFT2aYzzc60&j7ms^G(8_&K&cE@HmB!ehv3(PmC1aQux@RN1uusWjLGB9bO zL?x<94rK%b+MRXjGgY3er>PffsBr4UVsTV(!pnP1u~8)BcAQZaUYAP>MzyXmW}efs zW1yRHTSPjbM3Sn(qVyaJK%iT;(fx!x+Fc6-IKe1h2ei|bApFnxd38qa@8!3kV$n8g zB|#dwd$c9r?xMDtHmt=!CdKm%2!R$y_@L$ zFn&is5LctY0G)^{(#h!f>hP`y3(aw^J~F;Q0l`e>f>Y0hI$KJNj0SlHwy4*vfhufD zR1v5T8mQ^}WAO%#!wy&+bdeKQBwQ{?W@X6oZMH-tv)x?}Id!iJG@}aanh>tGpn>(z zKi~glsQGvE%rfE60Bdj2_WGNSMiFg@r9$(-j8S@w>Plf(ARbhTCUbFPN|fOzsCm1! zPFxbqCF-a5CZ)CLC?VU|L(a_1-<9AeRU;M~!e6qv*D>`owJ!E;(;Y8UJ@g%9#)oD0 zw6luL&S?SNj``SRv0k})k6UMaaN{`&kD~L5o8j$Fj=u?yKJU2w%n9sIDw&^iSdqJb zczyOD9!E=sp7V{hvPYw`ZaK)Zqu(ms#B=<$qELL0P-a_^O^SUsI<+bD=Z^ZmQxtr;F|F5_q_^SujkEH?5wDH=RIh zKT?p%rx=v0Xr$uDMpalv^Y9_&L8^8)pfTEUj(&ApJUDc4N#Wyj;XMb%L(}2oX2?7D zn!bl58(YnQ^AmUDF0<146Tywp^oP1QU?3t3=e3iP(ZgyO4f%R@vKl zOG^@JsWTd9E6hhL&YQ#($7VSx=@q78-c!b>@K!s#ByO@Cv0fN)X|azxw`CI$!u0A1 zSKWdbvRjK#RKOEyWQ7(+d^zRI(psbwxf^mI(KHp@#j?cl`u*0N??r#>#UW2a+ZMH5 zL1ET(^Q!IypTo~7vUX)S=&OX~EJlgCI@RbAjSB0$CT#R3>Y)(F6RrHc0j8^8bw6k1 zTnA5%-7_se%5hm1&m4LFd7HwrZjs%78uV}OaNyr&{tv6JXB7Nqu&MEv%*NO5o$PIR z>~!ynce50D!F2YD4m$`bLys9A;n&h)lg*a$IyJa5yK zTvV54KMTpM-Zj!pP|yIcr>S!obMDlb9-I%WfenLUAsLlOXs~U`nSeq&eah7>*pg+P zUt=b}w|bs%_h;PlW3rDDJu)fA7-Ybv554Eb{{esk37txB>inC!O(ozZ9~$CG606Sp zB8RSUs&j1mq=lVx>`k`GBCB`_AggPY_bBm%XL9l*1 zs3vltn=Ye>20$IJVx&$-0J$YkT zabCpPcDtdY=xn;A*o$L??7MxaUlz+hUILg8yjTx-TLt5%mg)65$*TKJYoe+Z43&%x zOs>={P1f@nGHJ-68lBnRF-j97n|j4rq2cA5lV;vOZU#oCqo@`MrJ1a@p1H&K3;Fmj`|3wvTd72 zy&?lly<^Z+%D!SIL&KrK;W|Ppx5*ZyzQ&{6D=B@z*h-nB>*=#4%E@BGQL9P+nUay+ z_}zFpaalV2+}9OI1hF$hRC;oKX1T~Ve)zn=@3jOg$veJUM&{I0XjjhDtV^$*I{QRb zan@hft`d5KbOEr!{n|-x%4oBqLM#uSEIS8p6Ao3=$+q?{CeF}8@A!pWJP@|G+WLO) zQl@$VYC3TZ>AG1iKTaG*E^=h~-dsFI=a11rEso%^m#WfE;1A`sYKbp~X{le4@*)r( zc*Id^5D0lP4S?xP6=KMg(hjrZgc#~DQo5HLMw;q6q@c1#MfFq%@+i8(iGZzJN3mG4 zF&8-Ls{X*&tZs)+1c^kX4SoWVqwds}eK+5n57wo?==wBL52da|R zEkD-Ezz?j*C?@&OXo7fTUKmtNE zjjGxe=OeDbnkismIY%a9S{dU|Ih;#;6Di4QNm8y#bSRX`J$v35V&ugc^mDS9YRmJL zefNKBHj&Y-A0>2uP7=;J}ib@89ADqTwj{<(2^;Eq54Kh;Z`qDMA z4HToriR0{IU!7jhFm&(Z$`#0sM@z*gq)?4~^5>E_2PK#5GJ_`yGcejaQUuW)9->vm zS*ZCmoMG`>*~f9Xj?tOF=I4069Qo3wrni3i0vT5)s@D@XvRj(L`Jz)ko}av=>Cxk> z^}Ta};b_mvDb(Nd`9;gB`uv!`*5$V=SNbmL$-CrCexuVbGUfFnd)#s-a|Wjb3~GKu z!kASt&y{+YpOGk)^kY@e)tZ)%vn60$-~nrFIbY%t`pySz>+4Wlbw{RrKZkIpNj$c@s)_q$R!jtfKWZ8eF|};n`27 zQBRo|<|OqQrwL9f&SM>j^7~xEI{Hj<5@~Dkz{}p5(Wy!0xP&u_sPKlmETuIbx@nT8QSOWfxOz?S^^OrSsHXQcq7d0hfeg$C8o{o%s=`YLB zo$(cE@1bZhYT?Y~FyBb-v+UufvJj<*loF9|Sjahte8%4@#KUh;#T0W4^tiEtA3Xov zF>fE<+N$-jiH>6*bEmKTxM1T0=l)EY^PN4i#)G2YwCuxZsPwP33gL-pX~Jp=cbp;My;*xJ$$-ONIcoiJbA4bW#)wJBd2O85=sa>_ zONeO3~v0m00?wyRp~oSfk9PKJ{(u0gkq1Gjt_nMc+Iuud_hCY#-_iqouhEHR+Xi+ zUb2y>p^~#%DIiei#?T}uYtbk92x`D!o~U6Ra2!klT+89)sLa-ec;*~vt5~s%1jPht zaL*UZ(8QXCWjGyutx*o&;o9ug_=6t^~zkN=-&Uu&9 zg8)*!QPrx?s`>m-QlU>T2{))k6d(g~j;DfX$jReA3aSd-_EO#^s99aIt;D;y6QmNn zSXm3-k%eoLEVoGMgeD%ylEQm@+uJ)hRabee#ez4o^n_wf^DTO%nOmCL0^e@@3F+yT z#gBx!FR`5P|w%O+XecPs!aY-AB$W(gKfCZ_BabDKKYIlN-wRoE$1}b+zSC7Y= zUPx?K+wT;kS>?dFJ%Bm8(`LtGsf=)DX-L@Y0!zcAWOh}T^kz|^k@J`6&%vgl@rIW- z>x<7YtYl152$v1=sJu80aJ~AJ@(-y-jo>lC+Y6yW#E3;}W}NMaeee*tV6-z^$`KGk zCuX1BG^g;TwGe143{F8;NQ#-hWhm621`Io~@d358d26J6voWz3J3Uobjbt7lO`}W$ z_J8(-1kAmn+&8ehV4VuPA;4*|fT&%(H3=m>y1#<+>avn1+a5d{bZ=MH6y)mv;q;M? z&5kY#S{Q1X3l+Zm;QU^&@$-59w@WLkkNn$GyK-t1&L?u^q}ZZDEl3$@Yg)Y39V)Mx zx3$FWbM5dG12xUk)w!oX*p(>iNr}MJLV5C~@aZLVs9tg#$NmEVX$0D9y=ixBb({2Q zSAZjz2kEmWSEC?rg>YR}XI2$_l9s*4%7H`|9>)Y4TPO}``XqZS%84!UgTi$2F(We_ zz;1Jn2#Tz%z0sb_*Vmt5dKGoGHy;?VCU&%>e_8e> znKyoz#?+2BGT-sE{~BZQ(Fu;lTRUz<#5}`-E)yDW=YniW?LSX;CeQ(`vMx*PDrfE0C?bh z`5)r1Wy6xx z>g!mQSv(4l4@^P|3YJ*;xy?)Y9SK}znnj~nM2ZjCy2QNNMmg(_^S7@4x`6kL6RFdF zz?2zpuhb@hs)?Sl0I){F$Os?p&`|d|(eBQ7{pLld`t}UOm^PtkVvKwy&;z$0~M*lyfBj{ zrYAL6Z9$Q5OgKk2TJO)5cbOG|^PrD&#*goYbWsz1;M{?8Y_&+!`kOkr;CqZ<17t71fvSK{BOIP1!6yIKtqp5drwEn2k z7j3{t=ryM=1KyU&Cw!Tqq0GK-h+UDutt;6&eJ#~|BG=@okh$BOMM z?%B_sR_>VfeQ#lVjDLfyUPbVn!`!mimi{X&Xk+9v?1~q{u|PE z6N0=-50Kn}lh2y;#f|hK#r=N=)?vcP<&hk`YB^g{^aSr03qFfj#Tn?Mt`%^bo4t0w zvi4lduaR!c$y2J;F-jFcBE&RHw2g2#MK30M(q>I~`3w)>SR@@!Q!$6dq}uw?6DG$< z_tAgXtINE>lUu}Zya-OPYLQ&)u>sbWhp#oi3!E-ls7=wTT4Q#Sr$)lWWny|O$(U@Q z#X<#$K#Ct?luRk57E_(8-~(Z$bs_I@uo<@PcQlMfXmEPPVSQRJe?_KLE)S$dnj{C% zav1zFZ5QQ@PeqGyIH7fLJS|5?X4O@R0E16Z_XDeq$u;9Bl0vqz>y@)CN@$jK9RxLn zqI~6*XGuAAP5-rwV&K8&Ma4L0>uEX470Lf9cs97VunBqR@Ii+#lxf>%+@K2V+`dlo zLa-W`!&Saluu0K>0Kh{+Gtiy+j|0Rcx;6=NdFltg$e{;#D?qi!|H+{tA6l5rW3;$j za`;9dnF&&;uVIjw4wYgy=tT-yp}tp*#8i+oV@xGFwJWYU7>YiQt&>HFS(2KaGEEA9 zN3+tQuI80?-F2zUezaYkL8{-tSa8nLZPhyHtUA--)Fov3SI(}m#VnAmp|L(v-`o4+ z&1=!#?RV=vfi|M%Eisi-ySqT;%T);wtwi!lSsW3w3B&-6-e3+oMDFpl?8Y%Cu2(xx z0=;NqY|F;}d5GZ|tl-M7l1Q>-3fAX|p8uLW-@BkEln9;r`sY@W$GUm;mT1i)HMwxs zm=;22?Cm`s*tS03uHyy0EvkWk`|NlpwW5vdpQu^AFhALxrAQ$FmY zSY$x%5K`?JSlE_!_hZYqax8(S(*4w%!`?fr#&XZl%j3a6PTxZ{F+Ht78%8cnJKgM*JBwiNn-}xqj5Oh)nBb$G797qvG+M>C#spR6r82how^%5 z>7=ZwAJwbLnboyJJp*tQ0bR`9<<{>`$N``KDS#ysH760i5$_0CW$?`%8PVo$Bmac7 zNf42=#>l^oOUjI!Sy7kZY<$CG%si?%J=L91SXHeMD@V1ULy{3UCmIX@!80of6x{&o z(>7+zjh~>HRGE6-L{RpCQ6o^kK7S+6Y$e#3%a@<{j0}!~Mou}5-64_!YoDL~h|$^Z zh%Ia_WototX>2>=5`m*^-Q z1?R>kX-c^BP1sdD&d5G!(i<9Gc^F(4_y7cpapf@wd$|WKdqz>YCs%_wD>h25(Q zica;)so`7djLR+wFJD5_6fE0)iyJ9&jm4WrI?MbB8W)uU6k!xUeXf-SQi3s)is7cN zdON+B)HI4}asiOn44Sd+TV&RmD&n#yW;# z#X{9nkeu3M_4)w$ds3FT}byq6M!}g3->LYXjvG%kAkMWyqET?=$P` zo2nz=^hzN)0cI^>@*X?0jGO>laT?%@N!C|pz;SUB0gHhVy`^t_5f?WP1sI#POHI~u zG_J)@tlqClt$KR;keFCuXm%P6DW(CDWg%gs@QIt|7E)6F0flB^uyF=>~OiMJ?O(_!2H8M_DqC~Xz_*C0}xjO z(RG(!^x#m+p(!c#D9roK|Cupoh~B_+a-}x{xwehSs78k%+rZbhx5r|*NJ1wr&H(&c zP^~=57aCP>q`CSkH5%RS+LP3q0oxg8l@g7cM4 zm0ax-e_jj0Ma3#nZZSo5l>W|QYUbF{Ad+?#T%XD&CHo%$fDsr3F3K-A!G51`^PXO$ z5Qfy6FJd^}L}(q%<-V#_fS`c2l%18KK&Mlo_b4_VO4&BmH=!-5cx_A2kp5WELz`}L z$@Q4o_fe+w8J_>S^f5nwdiJOH96PQV=h+gHfcGb3(bJeJLawl{*YMFTbfuWW{`(IyD_#2A zm89QXU<=Q#{P)M;q?dMX8e|8y7POt%`t8qs=bRQVDOTM-nDv z<(vP*Bq~!XV3}n~lo=v&dr3Lt>I7jQ>*1s-<0i?;AXl2;w!`Vaz=0jqO>0a9JBsxepbWHhc|{s#d02#kubF<~Bizg2IO3fE*WO6#2+<3p>}TEqa{xZ$@1^YyGLO5NOH%bzM&CX!b0E$0l2vwTXOl`k#IVCRWZcfz z(K&O?H|KJ`#Zg?!*l6u8q=#@UP4WF~X;Db)L(pgEh#^yy?<>Q+7fhm^UoBHugf)Fn z_G^LwPY`>{QC9XGEUaZLPpF}UC_O>*_|VrNjM4kDjg@#LpUx`wq}*Bwb9nCvLa}0L zzmEu;^FY*^D_^B{XeXF1VJ?lOW1?w5{aK@%+$gBi?4hxQ*P?h^+*mhM1)-C2Su7I^ zI3Yy4-O5#tZWgtDsP>}8c0{l&@tR&Fs$7Jk^G#CuTw~vjG%Wq>@@{)zg!Q=p6Qx+v zHyOCtN?m8Lbf0kFYcpQbyOa{@s_gr&*e1VQIw-PAcir@L4z)j`ZS@9Rw1Qi87H(xe zUufd!=NfQz2z*zFW^fzmaO&$A)?mqy%Hw<3Y>GaIrCmv>TfC)R{6Qw7zQAg&)TnpN zQ1{5aS!<-X_59x9J((N}WC#ssG=keUKc$h?B>hjiOC9!$z=GBE|6}Q_+oJ5hElzh1 z9fEXscXxLq-Gj8WbaxD0LpL*Y8FY7-(v8xBpl5u3=Ox^K>}!ATwb%MAgle7i%sn@G zZk#uWByintTcUQ91JKbHJvq^`xGfyWU4RvFqn2C-E&ll*$S}~CMJpu#eq=R*{5gNJ zclbT~!m&fP$VZB-bbs}uYQ3c1^`o-}(XY6MhE3;fG0kZ}1)I0UE$cD(!;j;Hib<7fnhp{TmJT+IxkJiN5@7IXp{?Jo^@s##+PzqXpY z;hnyZKj5HoH=s@`G8_9-2~PsK>6*Cec`UOo?HIgF{l4*X)w9=H#t7F5QX0io2dik7 z=^kPqs-_k{EVmjsW9JLMnHLA2{<^R7_%(mfV|KAUlQ(IydC7P9Ip3@rO14X4bR2>U zm-i@co%i96W_Ek~8V(&PUZ-jyN868*)fCUmrK%Fhj#9&kf=wV2-A2tHgJWQG$pomY zW+ZUCGq%Ao#cYe4_%9Mk4u_Pcs{;E6uu4;P2Ewo?L@Y|M4UnAR4hzJ<%y6nfCL2G)uZ8S@iXaJTNSi_a4<7NeCW^V$U8uMpA_~b>pfLEnNKzt?BfHvisb5q z*bBV`dzZs=uAR$^A)Udy>rs>^ONoBwyomT-^bGFp#EZ#mW85h!41!h0yxB3evTsI zCI^19xoZbDb8EKvXv}RBiN$YH62_L%x58$Jv;q6d*$p4{N)k9I#?lfd1nlVhWlTwl zld|=*qstf?n8RN3VcvhsvGIJR6zBK68Y;QkH-?M6`I>B$N~F*P7hMq*SrQXO9AF#1 z86!Km=0UBDsnT;|x;OpTR|V2@vV=@0#RWuDlOgo;=bobZ6MjbitTZ@zT|9!Y63{Ut ze=D*@O?h27;=cchnz>U<8ni#tpc%J~uZKt2G_4RKvp=jmejb|`ua2+8(D@=~{`7QE z3~LNl%>9rL5(Ehm>)BUf*%l(t% zn>3Q_-^0));yLYzalyhvY4KVw}3Mk$MEN#;^KC6=MfzdgT4 zVgs7L3(BMIlQZ-M;yIFUH71?o42i1{;zUecQ&qI=U}Yst7JZ4Fd?PEppHL>WoxsKN zLx)#5y`2t`mJW-RGlFFu%WttT90YUO@aM56nvFAneKXzYM>VjE{Fjaz3UMN*j6*Z99J9!k7jSFTO z>1BVqtoq|~&m?vPgi+Yq3k$a&dp0c#rmLKl#j1>dQ=^&W=si}nC%13HA#o#7Ar@NE zZWCuX$)MTvGt7u71-h%KeOWCX=etA;i;^)I;DN>#Te!>NC^4v48Q@Nq{ECw5+NPJC z8X8t>@3npnIa_pO4zFPlyqNY?R@Q%$TY4WgKsqv4L(Ac@wqy6D!G9AgYt!#+N-cV* zrN<?&k2?FK6&Cko{mo|Fu+qB{i^AsnVBxRxW z@42E1f6GC()QH){#3jOq(JBL1$jbasS-lOCI21MdGqMxeIgI^xAP7veOy+Hy$C4mx z@6SrdZ;s2u?Mh@?OwZN#^KMDljQohr3Jf#OUOrt=eQUkoOjxRx!Ym0{BW*Mz$AXiN zps%DywQtJ_2!lFa!F4_8^+0OXgGzS;ZsyZMV;pkVKzXXZ^PNxR>j+nZ-uW-TIRmEq54FATHB+la&h3TR3?6 z94ldg=uTvy_1r^=(sAqj=6nJ|xt-5o%Zmz+0vTZSUQPaYgP_~?keVuLBANedZ&I{f zX~V&#xYqCDbpxLC_4>ixjN`q!!BWMZgzq6;wHup>6xJ(vTl`}6Q@J9e$~X+mRmZ5o zDOEK&vd36d9O(o(${aVkr`&Pyn5kUCoO|=aPvubESdE&~q+oYHBSA5ro?g9g9aFP9 zr&TY0g${WdJNcI^fqDaonE1g9Ei96Jtxvl$(}L(~tkU z2HjSm<-v1F?X9EMqUGwhkWlPv@-WYae2+D;dodK+&H^m)uL`R`L7i#3L@hIVX6OlC zU5~FIJ~XW7o@{=q=B7`W27@1~#nLb+Gtq51o`^BiwK|$>sg?<2fnNa4SXiAPosV zo4r~JJA6PjFIB*`;yHV|n^a!A8*R}A_u{*GHkcvu>#bdxr%qKTR%vmEtBDTzQ5lbF zm*Tt+kAGtYLQ6kyflF6B+U8g8jUJK!zYaU$Ab<*=T}?%ZSFF;SwYjuF8gt<~BdxSD zxb9rnfuOb$#jubh;ldhO*7dOE$IJt-r>J*pe-G(s`Q@Mdve91a=Sq#eJb>);leJ;=k9Gpe))&B^#0^Omu022)Z7WzK!TEiXntwWThJkiRy z`MU818VLDxRU!4roCNe$xgcg1qj!=HxZnx2PgiKGh5AOcSXXn5&QW)Ed0gTPG&7Z1ybi=3+5=m~x_SOF~!4oGO^su7r7Ixs#PS)Q*)&S)d&Y3#jLL6)##!8jk{T(iTnNqj{JA31FCH_x z>bCbKby*4TsgP#-1JI?e7<_%(Z=2s8-%kS9fBpU9WExe#X^Q4D>{{z;=YYG92rM#@ z4^_d7RUfybT}v1o9j477bSW%T9!jlKa%G~+7hfFi#4o~4B$Fn`?rSEE(@(ru$-T); zkD13oE<7Z)da{l3;aeNxO}AQSxm~Si7^znd*st@e&SIW)a_jOdv#A;dd*~V~x{YTH z0=z5hh{l+j^9YFZ zNCl=oCxl4hTfV3~jlLEOUaX+I&=B~xb5_J~=MD_Y)3AHy_RVCbz;sPT^R3di+1*KP zg$ZjjDdsG>_?+*XX2wcL&XzYqo;MLM)VJ;j0Er1xs>mQ#93tMagD>L>c%x+u%xyUE zU^qdIVQDw+y$DZjv|=JcT5dku7U{bX0d2g>Wky*#CaX9nNi|tL002M$!-)QYpzYAS?5}B};gI6+^aF%!DyzeQJxY}m{%Od29U4P;ufPha zC8*V(-pi>)W3{+Cgda!48S_3%4gP+C-OegE-DK$A$hli=D2R>2^nkAcp6|{Kqki4c z(UvnMpw}+siy68YD9cN}!8ksY%|t$@X9A(pHXu2@lMTT&0rdj2y*r_G?&){OIRS8l?#%2-B_7jNEt;gp}1G$~-->x=VJ>3MgNB*%Plf9iqw zyoq|x0UXnD1y2Q?!o07af|cx@Op$e`8wa_w{t-TGIvZoWHs?0O5Ntaj#Te$tm zi{l(SDTfAX{p-98Q5wl|&21!OPf0QfNhmob>*wc>*JO2VZrKbd2L@IwZxPu@#x>V2 z?k&OUQylz-eJoL3kSf1<#(H*vG$?rCuL#Ck^2)Jz(X?OAn)|>9F09v%i8K)NyUjaJ zN=c8;SqyBCmxL`{eY;Vfr2Lg{c=QMZb@cF>J_*sDZJK=E-gvL^?L->B^oT{){{+qh zlslOJOwVByFK(*4>XrKh-oq}3*Kd~1v=#no>&QtirdN47?PqRQDVmcx=~&1V^>VGG z{^vrqJ$FJWQz@u+lj!^s^$;baxTvfWZwA$C+#n##MVA?baq#8tcuBUzuq%y^CGvRc~@7#pSoyRHs8Wet~8;~I=_XSFS!Pe&aoK+f41^iHXJ&Y zyH82f=sSiM9-5A91%|O0kUMwMYP6VZLp*@?_9k||V*dsJJq(FMcjENlB^X1*0_FzA z*HQW}68Zjrk;rAAMK*n=HfIq3eO9L?mx64MGjjZXFHR2vH>*2hcipIc za)-3?!qtiP5)Zk2H=~_riOV`<6`ooOUnPJ>gsN{P;W$HJe|yBw6}^P}u@e>Ju3HU& z2o3|?3HVcOaH$%iYkEiLQLOOh(1!o-@WbAmgaXOR_FluKwqe%+ zNJY;x%$AormBh@(|LJ#EgS(I5?OC>y6H`#PBwWLchr0w@Bv?a*8tcC2D4dA z(x@0Z++Xoo?hRS%de?Iqbocx)W4KG!z!m;>64H)L;jUl@8KprapsU*L(yjn2DJd5z zeU3=RlDZSqi5B+?%^1Ze;Ht%PMu=E!QNk+*PiWz&oTXILsgzl~Wsu;{S1wiVWfe&2p!L*8y!67`$kUY#wks8Il1tg$A z+?tMET*4kRNx|4Labtv{Pw&F~G$4_km;3i?5$jvD@?W@N87u&4WH*Kzh>nzJ^$ogt zQ_|&J6xdl^A0>96!Be{3`YCa!%aAZ>+-}OR8dBuF7u&s0H_*zmD{TI%4{bu+*KK8h z@W@uyP|pxAP-bF|*6k%*N2%C28s!kFJ~vWM`Lef!J|Cc%SzdFdHV0Jc(HqD@_a+I= zR5J_G38~ zLbrpAGN_tAbc9kjR{a|QSWPN0SfN$j)@vTuxDytLF{!+#(185}ZWSi+TY1E%xfU$sqCd(+dB7Pwb-oq*MWxL>A>?j3?XBHQlRZDEm>_XOm8GGI?2GR zfedHZr9PkyrPXTaIkm~VVsaJ{w#-#pj&sHamY%LfT3?mh;Bz~^Bh2B*^40OCOv6vw z3~$Y~si_K6G4+WFgw{KMkGg1v?yLm8Z)^1WDEN`(N=oSEZ~kQG`yYI_LZ^wLEA0-S zg+6IO+g=i2FVVS|HCrJV2B9L?dOrzFF4BV)-PzG3XI7G*IJYAqZhrULfE zI=q#_zW61TO&x=VVpoivAtREJ7H?rOOD!iKPO40_GxZE%zZd68m#y9DYV##^?lLcY z?O%;XbU+J|>ZHGc+wbzVCiP#&i+(E^LqTgnf<+=)?X1yFe@qK-l+x{{1G7q=PA@vA zs~huPRjS1(5yGM5Dr-31xVR2kP27xy7g$l& zA|%Myk8(MMocEn62#ImS$S5(YeQcQ_ZtO$YGl?lPR1}_G`Gc$j(M$n}VS{=-?@vf= zN%M}t>{efM)nBuzyFVZPzAUU;o?iWUYM9Zy_s-4nOsVn;bxq%p=9u}wOZ^KG8{quV zYjM$ON0YEvCcP%N$t7>8ay95)ksL-i1a76gBS2)KowB)>Yma4L;n`9g)rE6aUHG~9>2%?r+(djm?B>$!TgR0L_)eE z?(oSQ^mbl$CD@eiHbPGdPQ39S_J*fH}d`g;pl^ErQ+RlKa<+RF&>_~nhkG^(;kRYGb4 z%qtqkPaJ`=ShLB_Y8qA=VJ(bsX7s3fI{n_RTf51*ngijd@JR0%ZYLN)j#h<-FJ`tFCC9S z66r;sD{CyHDT;%MDw~jQ6d$B5`a`G8(^}`%p%V)wa!P}{88UOMC z;kOj(JRC3?l+GEJ2MAePBoV2>ZyC9yK7Lru@45AjXwNNn*qo|GgQLbdrHlMZw=b!E zAQTUcxi6fo{q|Uk%~z6z1beNe3a;|%XNQi>N6tfXM+0ladi_(ig@dFy`XqyNOf_=sMU(HNw)k+hA7HBwz)o zk@E9q^~2fcZSSi43L*}}_vUdo=fpCqc1_xUT=~pxB@V7=ZJgh1d<+y`KXt#}*Hi!I zTbT1zo{<4u7&d2M6TC*H6&ca|L&fIu?z4_yLJ~zYTW+$-H?~r$BG3d*N-}XaMBh zvH#U9m#yA(MN`1*$Har<*M?Nv*Ncz88o4;SFWrO3F1S8!bvq1DWk#coAmgjRzJaIC zf=c>6?zYcE^fl(VC`kW@Xr7L7g1|H> zZi6u>{=u6Dqq;e@^P=S_En`2pgH^xNgxrbkovr46(Ap}m+2^mjmCG^bD=w=4eajbc z)ySn7#B^WVtTlZr#S!v!dT#1?)b%noeSF;U@uAgyy<*be#rBSCWIsdn%u5=Zz}zu| z+c|91zE$@Zxlt5Y2QD8J?u!7u>f5Y1WusSZ>9|e%#DF>#SB=6@-fJSHet{aJI?Fe+ z-12qzdA~K%k;FyWNLDhaaU*>1-vF?NA%BD&;;?L;>Jng)NOmC6D=ZWbi$r#?*tN$n zv>{Ba&6&rN&bzxK9v-2l(Uh=>k>Iv#n_9i}D?|$nc^xQCYR^*>e`{O|Ko{+n4>bY< zbk8z$E=F(pZ zBo^Sog_`R?cT>5;ETyEZbSd4zu(9MerwUJ`R|`EF)cO)l9`R%r_V@`~0Xt3N1dK8A zzApOg9KqV`cx@g0PGGJyX1NoTo51w|QO#8^()2|@Nf$5kLLfqp zbV|&sZRbr(;186RHLs~fx2|}v34~(&@O+k6bgo>$%%GpE-Rly5j*QUt>W2@PQEGk^ zZ(Vs86Y_hP!nvAE7W}Y>U#~ge;jn%Usf;yT$l$ z^r9ns!|KkA(Up3>;ur76t)WASPHUkxIX=&}v*f&$qVl z0aV#8ROs>}v^r$DTC)g`HYQp8+9I;pbS|!StxQ_=t0x8_d7&!jP$@m$CZpygoK*()*FCS|GOM|1u+NB`wBbDgOhDW{oS-4? zsjbA_b$6$)<>!TEGQOM|pOoOa7;~|?<}}mFmV!8S@XJm^p5ryiXmtnK$$GXNao!kA z^`fZNr5-F@`1ohmCc5J^aQ2Z0=Y<$Skg#RX95>BV`c-q!-TCbt1s)V7Y}AZ1zn9*8 zG0b;K(rK*^ZHNAuw(GixG28-Kx@M;)C@qFjqzOM@{D z0MSE8aijOyf700_s+0wp@grnxL6#$)(Hs-sq(|3Mp~7U@LKHqo}Mm z0lzs!Kkd^)W=_Z_Wh%B(hPJ{|3^`ciJ-^3FvSk_O4<$GY)wo@62`T35PgIT}&7fxH zt`+JCdY< z5cO;Jym?d7coQ|=x-$ycv}$*xM-rvJpP0$Q!nr%@s~B$$rmcU! zs2loVd$uYt9+E|ui6uVR!G2bmpm|AMHew|)U>UWpHuv=hn|Wx6T3;-}TGmZ|cjJ0p zO=4rtle2TU@!K?({b;M)!ZTyk)EXqLO_#ZCx|_e+_{4W!Lik>AQhERN16aZ#N9&He z!ZtuN28<1Q0VKcwO$>y|pf>$`>kT~JvP8`OSBljKyyL;{Uf19X(PjL(rJE4ZC&V`0 z7#_zChF|XBj-hw*9rn@M`{ENYS+vdRWD%)GO)1oE+5gudP|E|yaCo!WCR3l}d9>ihMz=bGWoV@L6`hbLF!#2hu)jSg(oZvHb@*w&52CT=SUX zO@PlPg75sACscZrjIfyfU({*JN*N>iI*m>$w zJuj+4PHcRydMf&0lx>)VH_p_EvqY1Q4;g8Ag281yobADU%Zdsi9bR;IOiEr|Ve;g; zat2Byxy=k2%f`~+pq$EHc3F{R*XpK%-$E?%mX6D1(hK`q<9*YeJU+K2izeF}J0-n; zE?78#sTaZ5_iO~1ET#^eW4lx5n|tp#R*G;Be2NMV2s<@gO>CnEm3OG*IqYQ@qvt~% zsaUFV?}pxunD?wm-}Usy7Y6T@CIr8`j~<@PsL&up??(H1 z4VUrj&abYCdZ;im4p>D<&s$of$ckQo;-BohD2lS!Mft@?n|tUm_=esUtWrKSGITPp zk)=!`J%muB)dg~m(?c{Cev8ub?5%MieUU4~^6v=*Ln8_Vjfk2>Veyh7Icmq~BbftBe6Frb@#c;tvEu*HoSQCfJy33Da6*cVn1i=O=Bn zf37jsV{xzxHdO6em%B6$bLXlEQliNl*p9I`lY&hfwU%!?_)IT+%m)bH(hL4HHcTfK zPqHhl_p>8N;4vPk8K({Vy&sWgm&|<)Ph)PCV0|F(Wu?59W>=Uaqm(h06n!`?RG-mQ zRwg%zC-@5^OUUjp-J}v_$qmB12RIYFv3d8yrGMG-DCj+n3D!E#`^VOHU-3%|*(QO+ zzXcQyLC5S#1Zzud!O-G0U##kkFnMSv+zX2lD;$}tDvZoJrv|NLvdhd}-V z+R=%IxUmEcWesDsthi0?dhnO~6*_4J`$P<%{)Bj42`(7|Z9rBTD9`152J$49%zI~g zn|s%Bo8D8KL--;Do(><)`C&J`|I*jDwDEh&{dhWWYvp9gO+wX9>&q10`**rE&~KHO z4MHK$p+FW@(;&vYZTsI&Bb;z>`1F8s)Gv$9c$uyyY^8>pTXcqRFgf{43v>8eZE{b9 z%=2qf_`nx*swBK=@W%2iL3TbuFS@7QB}T=_+WR;L)iIu!0lDcSPKQ z`n@dtEp(zyEqy$()3~s5CwgMGo`kwAko?EQ>O=OVgZ+Kenxw;OgU_G*zvq}g_R_T@2Rf(DSRSAJ)7BPDRDPgQIYy{NVPua{KvAvi$Zn5Q;J*D1oVonh zZqX00(9HpvG}V*gos~mk&Eb;h36!!sr`)7d|K!C;Zfo>S;Qax&)H&h1(#EG`m%iJM zde;Sp9>1E>XWM66%;NCnmd}Witq64MHYHL%VH{nJUTS6_Jk~n$wu@~?UkW`w>5weN z$uDc2XA1R;(JIwGheR^V1KER;R^#U(2P+LaW{U`D+Vh*JT%elq;z-qvK zBt0#%S5zhe&TqYudRJxEQKG-1*wgFoZphteyPWW$8icjbVD|nUi3&Qto^*sr!WO$J zHe)lpW}A6`OEN`{c{ake1E^YvADvuB0U*8blPZs)y(vR+4Hu;0XzS=b<}^s4-PQ!i zu>Nwwew|z)T?Ayo{2wI|MXpi$jkmlU7s^pM(ZVOPTMG+J27zmW2-#E048=@=Y_nTP z@zD31D6gJuZMB)G-2~r(9tPPj0rjOrc}33SIifK!WPs|On(a3Xc>Cn2X_v@mNSQIC z5c;k4D{7-i#pq6t8Z;x_)TRqP+^9$v-1ocb)s%9J+saP2u>u{>f zBsbWQdvpJukwfN$2Yyb@y_u0elT1G9$Mu2rHuY{g<#o(NDqoQxkMzcy`0JZV0xk-ynBJl79|*w96T z+@C8KuS5Tlv=4CLO3wV3d(t(WS5CWv;f&?^6xXgkvQjTIUz7ayjtARQb~EuA@NpT} z%S~jWQ;2j10|pw^XYFL8Y`g$S+t}N%W2dCMojw*hrviKOk+;fQ+Ad8n>L0>F9oh}W zRciArq^$zPM%$G&P-ffne1)R%&z4NyvXL6(8qm`m%{eutV$6PrjwX_?*~(cN`85cq zRV09KTIv ze)<(_xHeYzbQHEB5!-u1c)&t&jO_BaD%nb!IA;8)p^-`2aE!$YW)GzC4EPaFJ@%P1u?5QZ3+d{Ql-vuTi4a zxUBK_>&^zBE*u&WTy(K9@w1dr15c)22gw767P+53k}3&u8%yF>acUjEE*C3doC+R3 zbmAtzl%($s@j1u38xYNswicW1#_slG8~f0eP?A-}_w~4%t3}zk#*K*w@M}+^L+7tI zh#>ShBQ zTb@S^nnPQ}Y6>ebZ9lhNHaySvo3)X+PYHhOJ6^~iB(vZ7{UR z9*9$^!c$!_4Q8ulXuE4{v!8>NAE3Tt&SGQ$bOVUdvhy7f?eTa6ya4+emGK#SYE6km zx|lO=Cv$hW<+2r4Hbu1K;ctQDHHriZ^}Gv+#0BzLe4-A;@o@X?mAV?>hzLj1w=4n< zzCL3{Ny_Bv?A=j)ghLO^b`fq3e~$OkM{bQ-LbXMFhc>I5Ymf?6R<`0*;L+bIw>uir zuD_pIgx0)==DAJ}^}E)>!z(ZKG%0wl(EPgeGUklNau3?iuezb9LtWt`1O$xll09lF zt!;~z`CA!R;Hi_DYxa<`f;Wl4z z3vYFN=d;rN7><+a503T(>@pZBYbp|!wv?Hb8E6rmemwtu{MaB;kz&T4JdV~e|8*~d zfa7MC3d=<)@bvu9HF^eG2LX<)xD!ak^RM$yj5{0F6q@A>rfF;!E+oQ}s-Vgj5eY3v zz-p$}br^wAh?L(Ij;jJ!%#r7R>=!Kn zQb_Fm);8@3n+b5Y$d>Dz&C4i%-r6nO8LHQM9h~KcveHT?`+^_GFKJ zr`;k0NbpXHaoW(LG7Oka{eU!EEEO)08s?JH74Aa<5+j%Fh5Da&M~e-G&<|z+3ssk+ z)bc)&?8yR7FRVGB09}&BPWq!h#8rp5%fDsYcA+Y{v*F(<041^rOD4jKo&W-08cX)W z__7DYjfS7Y>>ubAf=A!=@|F}aYHvPzc*K$BrqszR+gNtNP8l1JQ6yi4SL&x6CvhBi zG?O(Mq2_sLYOpR{Ap}}xST~{E^Uv1hz&$M`Y))raud`s>8}@~H?W(;lIHp{buCScE zAih+Y)ptvW3T($e*OngT3dNlXdAk*C;#pNiPiGWBtY3q-8sj$X>zU54gxm&4ltX%c zoTFUhUqG%yW~s1qAD$7r+Zq19CKXjVWQf2m$m0NaEdqGqPJFNNuOu(xpoJb*lGmcd zD5m={@0*Dz#Buw@ai;Qerg)>^FTQi{VEikE`TGy+Rg!CbNeaa$aLAEmIHt&O&UHx% zHtU4&!+u4hH48R+sdxO;O9h>bU(Xh4tJky9jp|C}j1Bwq z^4WdN6W=e{zsyGj_5@_MxCcw%BvVjDq!TBMVxz*71{Y?CmNYUliHHc=2f!DUN!M%# zvEX)l)=g>a3J9x1V}V`bxuX5=x7mGxt>mU{E+^dNpp2~S4qL}&C5fJ8P}K@rOAP zFnd9=V0^6AN-E^Z_!H-NImq0ZH@f*j{Rz^Gfugz9nxCSbpI^1AG(bD{##f90T3P}h zKC!yYyM!&?ZQ=<|Y!UwQM~YFDUA+AZ7;|V3u(vTHoU*a0#--}aS?uV4*0r>1?Exb zx2RbY>GM#zQxdo5DqN_9Kd& z*S|b^t7Q1OL zSJu<*69P0c?W}CiDwESW_u|X%!ZQ*&KJ1~p@{Yj@#XT=pgWtBve^0=l=rCgd3IdQ+ zY8l6~;?^3~GvnfDx^9Qnx!Z_z_x45@!v*#rkgD`8QxrVJN(y6ID;!CmusZXp`02M9 zhnip;^>OAeZ`>Nc!VcdBm~H7%gC`bf65V!;Jr#5Iw5N17bnfgYCG1TU9l2?h5e)8b zXGxi?BDQc}!y<>rJl_SnYtEiymNpS@=7+m8(kbq*;s@A zjlVo~9af+Y!aSSAF)T!LRvSjmd8eG^GZQ_%;%Efp^ixe3h`SAWaQ6|>KxxaUp9x}1 z4WdObKeG%pA;%~xgljsz=d?YzA?xQ}%G$4+zMnCg?1jRbhU@IVrZWhRU5vB~Gf*{c zV(8~Op28VM&mB_CEs!5$+v<}~-JkMKf9n<%bi3s{yu3{PzHi-#CU7WZj-xO) zs7JqA?z450o5|}W@kM{~B%{dQdQN3`PrH&iF(#iX-eXKew#cXz5n>JhV*I3xkUqc= zYFV|nuo3!=oY>ov27yRBEuWr1#a`z6F7?S=>>k0BTLFI(i(0bX6${k$a0YmNVo*^q zJWI2Y(zY68LMP#mYTPTEcMe>39*USjch01hbt-%(M!iH%!zCKMjCgZ1`C9>lxS`yg ztYeYMGb=HMfC@xZ)C`>#=Uu_kp8}SU7Q6Pi&#Wx9Y;aOLy*Ui#21R2lB)dx6>d&cFw{k>YNlTe);+tx@jM?SGo z^U`X((@T4=c++cLXoaJe{*f;|^L)Whw`6NUe8snKGhJ2-J>pK)&wMMxF+Ye4lHET0 z9$`ryu;R(;qE%dcTV)BYGh#$16BD*Lc890*)XdmMnW>ihtcog7vzV~m@TRLq0!)85d3ANIfzYh+<~L@NkufmU$D@H zh-alnG`FL{gMJKiKKrXzlecVp#ft-3hR3W@&lF2;_BEA-<`sbDJk4oPzKmwiZi&Wc zzJvX(;sH&%aWuN8iIBECxoQ)YUIwQ&|8S~`@gzmqT2gLq?wfqsOnZ&C3`9(ffDC(m zO6kp9<6;+fNFE?bg2xQWE@m}k)cc9etB_0Lpu8kUvz{z6(VpqCvY5AK#v^Xrcsx1k6hu&hqt#|a=!cps~s`IplbE(`APqsy(+N@LW&0gb>cj(}_ z-u#sCutaTIdB&D>d|INu`u$P!_uScU;GjuA@ZSK4h9TqYs_2~BS{1|Y01_;2MCck! z)sSRxPi@8BBcx5KC%LTyVbIg@5^9z_mLK@)BJdqyEQm^F+GOE7$8Hw0zVl7ARz7Qf zrXk1|pp3#E z^p-&b? z(=}9i)`>c;&Pj{PhBojmBCyK__kGDpW_3E6(At$LqYvh%VUb{>ripj_DIxcW%li9+ z)4^9V^|Yv13Z~=HD-l1$D1FwF5u3K94`t|3vT{uQ!UlJ~^B|3my_u50IwIr8&!3R5 zxVPr5N;RKK{o8?l1!u%~JVn~0bUeo#&TD83EZlvRV{J6MR)wef!%P!H``&a2r>;0a zeLRK-dtRB^WEyy|f&PcW@z6Th?yY1eR@rBJ!>>Q^^loZV;!y5}ALGiOS|DF>$r?>{P~RU;;)y+t^zH1fcp>IJPd4%L|SX==SW!ngbn)yS<40r zuGDOtQpV#=6l7eokd5kcxnC(nQ(uhd9GKH>m5HU6Ki}PcJA*@!i&WrJv)(03C|9=k ziEQUzB*_#9Vp|Qg`=<-lonrbEG=SX5w(gD-~g4E4m@CAj;Z+2S?LaFbvrIHd>Q9RNZ#}*4bu^ z-HGS-kH#scy{)vg(BEgMe&co;Q`0hD1!&n<)%VqF+7z9B=gdmbb`+T7*Yh~4%C-8r ztlUF9U{;rroIyHVb$L{`^4|bhgrQu84iUgqptIDP2$%{)VgH*@9dbFS_}L~thM~)8 z+m}l;fD|MrY;6Iq-Ws@)ycGH5yrDa{oX~FKjuRby_5w$aU7wB%(I)+QFMw&@;7E3757%c%`{F5j8eoBb=tW_hrax&DW z4>*8V@AZM`H{YlmL0NJJpQ6dF!-9|j2zn;ic~)ma6#)j(UAV#NzV zife+qySo!yi+d>UP$(Ll0KqBlP~2NwgS!=qJ1trYl}rD*b7yXz@|3rgbN1eAee2>z z{QTR78Kp&kRDd5|!&{Xb#+^%4<?ZuPMhaTz?X49+M=LbxOX<&oz5Tc_;E*U z6L$>YId8D2sTZ_AU+)-07|HlV4P?LWp&DgO=f-!D>M|;?mhgW&e`W*Dgx zvxbnL+Df{L4spNB2H1|{4WbN*GL9zRu>_60%Ud>MFqf0c$~g8?!`7>`HJYtl+>Xwg z(#|9>xj=7R4+Ul16}7ePZhV1+4Cj3N^VMH0^2x83`K~>6AL4wyy^gc8aemooW$IBD zXR}0g^t=UTK{stq-pM)wk)3q5LbD=Q?*WbDU+l{AyutJ9-&i+d8U7Y6XUYd%x=PZSNlinGr<84mH ztHC_K2hF0)xlSYcdrA_{;(r1lc#cGZ5&w#^Gf)4cLle?z{8x~n#sd0BhV#1P@wl6P zW%{E={>pqPnZG`=7bL5v*lCTnpR0kqqa9jK0+N?5Nx_;GOwuU7VZ~^zg%5DhTPoNU z95>j3*|aWoC!p>~}IiB1Qn$@#H1%CcP-)dt6j|)D1kyI`Y20sX{VkO8`qyJ5yQ9T>ER3lcWRyvzVL;8aWC#b|ir$M-XfOv8&T~7li zP+f#yy|f!>JGiN$b6w}3wAA`O*Au|@QCO^9NlkKH~6n%ffUCv4<_CkcSu4dMO` z^Cy!fVCir&%iU5!y=(cdK@g!VtRc{m2Iq{y8EEd9L!zIBWM?QOcxPH!!Pr0c#g4h3 zRGYjWbRfST-N4%}QmJY6M66jJt)DXO97jP3?mf~6UfB773M z!3p0&QF`to5kEAbd-)hPWZu}&SUq(o``8GJ5-=t@^&CbPdOtbPR-9D&XdRwi<{`l_ z!}dZ}D*mJ=6T&s&k8v|19$%qF?mYo}Bg$H2WM|$LP+g_ja+>Bku?)hhIFd?9rd4&CHgXzx2=12!`c+^=W3irVC#M}y1ND@YCzfR=|L>Q)Uuday*@+O&IY0&CHv)2v zbJOhv-YuTq)&n0-=RA&j)@wFa14%nynFnP~N7b-KJg{-(6mRbd&%yWpg}2W{&M(}Znn2Tk*Fy~`I{Iig!mR#jqo9rr!I zr)rS!<}?jZ3`|eO+h5Xn#hEqNSeTLur}3oGbPetJdH0cBs$)LAvQ8|uX6J|e>Pkav z|JNy|IyNf2>(3-{(H+vxVil%%lsuqa8_G3+AGQXW_8OuJxp z$@m}fgcBzU7O&fzwJZX1xv7LX835u@D*m)r--I~TJ>3b8=A8^f51C0OSVk>Y!e#j@ za5ub|KCGf+M_6Z86jI8%(<6NqA!CkBzp|Efr{#=IEX5Jd+Vj9qY2&BG39?{ss~Ot~ zvVaZV5~_MTcAI`UFvq{FMz-0L>j_=ooqN=<8%kNc>NTfeN@ekr_~Rtc?CgZQSv{_> zChn>CzHI2ThgMu;hGRYi?oFWzyw?Z!@~c8u;50aRF#qhr@W%S6XsCbEI`yNQef`$@ zA<~169dmA5xL#2el5RQvMf0h0WKE+6!rIL!Iho)+eGHsTpKP?yy)&GBRaDWBsH{|V zhTf{!O3g*$sPT}4Vtkq*E?N2sXlTfPnnP2ga^vN&!s`h?uUoOIK7dNl z>$49uoYJ4^CB<-V(^N(Jl)W{0a~Z>HZ*TuD)S*1^ZRZ-F1jk1C-OtncC)3G|dr8~4 zzbpPp_|~(*72g7N+xgzQO25TOkFzb&rl-uVEb}8_=>^QFnzF?5kibw{yBubwEF90L z%NCE=oNtsF87GsJP%CEU_~)VZ${_BREUbEcqD&Y3Y{IOL?*W*5v75bNWz4!d1Zfy5 zdc5>bh+G;vPz$C+jX;eGrQ9)GNnr3TQ9o0=wzLi}ul29d>1;gA$X9O9H{StF&z~$0txo} zUG`kUUjYUHpalnE1|bRpbKR;*acpJ^vx=a0xVVjL&shX`g05He@1LjYk=# z^ENU0UTM$DrDrn8tc6&{r3CXvs#Ps2F$Q>@=2Gc<>b8?-wygH^9kMl*>;P8UuwWw5 z-+$s|p>M3@5!1^CTyT$9#ONs4r4hj`xYB zCj55$@#oqd)ixa~0r@-cz}=YX=mU!}K*P1{py5#;Pf>#fgemu^D9!U+ePh6ZKbnQ| z`lZ)SFotW7_uADNIzCN0#?gx>$25}6Ql9w)p0x3YvJ9exo5g(0>ZDUcscx{nXUo-K zyFf5rrr}3rIM(wDNoAgzrnXNhwnCQRp8&*>&?5tf|8aqyA>nOS32w#*6%^{vUZB^l zHcoJ!PEc_`qr^M%yfjKlYo2Wk%BmTQPCjh%Z$`m~yr~lw6)QZ3ZZ)~ePom<{nL+m7 z55NY(qFJ}-XA;3%4J;Wg?ObQ;_dbA-zs?R^Zy%>G+1sc7_^!_)W&3R~J=g|`vDc+&Fcqv$FyO?BqScBWJ{Ex%;HHC{gZO1`FjEO&@|Aurp+-!} zT~f;$ga?vtS!2_g6Ro9&9V|ifaJ>I@YW{@Lq8Tx6H}s8~4mM*f!lZL3agfu0-8~mn zaltsLspo!v%@z55|4yd=CQ&e<@5!g;!cyDKFzN)HFpSY38Y1vwoyQ{j&3MVvN=zul zr1vP7Q>|2H8Hbt=C1Tp{h%wZu`?cL+c1Ckhc8Z3RZw@^)3JH@R=A`lhjH>Fhs7UH< z%pT3~+UYvMa&%t=X@9srmy=`=X-Lj&BNhd^0OH?|+2(kym4q2nEwQfvJN{MYNnbpr zgv_v4#)wu#dBO8@+-`@1ta0!x8K>+6@6kx{Cc5ICs)@R9W6`htihWg>-iKGQ%)W9E z0`;!wVCC2#7V)184gd&QKDC^b{kjJymzcY2PY!d&mtX5|`3JE?){wF7w z;F&x283XZB@h7gWK+7MQtthuE17Lv7O@fTI7WXaHvbDKAQUWmx?`BvuaLt?imS@<( zC2PK1J+S%wo+_bQneMZ4Lb)n1H$N?1wql;t+k!;~wt=J)5KX!!Z5 zn_k2!5YCkV3OxVc8KC4j6MSytn98d1FB1$(JGrN-gGP~mP)_lsK>-t3q2+d8i?7{~NXz09@qu-5ZN;pdr<^VaTuE63kijv~uu zUe1v{jWLWH{A2Y}O7a7(df6g3F+P)rLvuik32oN83tUCp3S2L5rT0O}*ZOH}iVd9? zET1NlbGPr*631vjoY@zYGqU9 z(TlPL9+4eh%^WOO&%+a^p+$X>Y73mKoK%To^LpuqJHVUX_P>8%>lzinHpP9U{0V-I z4aexFUYCpPd6GNsfV+6=)Ag z(JE9QeAJ(;ESU1NZg%*prdDhXwT#69o)JOh){9vA+#SA&?I%mZ0*OIWT*~tXGx;8o zsgi~ouLRqUFm@8l933*3e+}Dywtg3s^>OC&5HvC-_A=71J$KiDtR`mI3-(U{7GW=y zpBrMdY~0V1S3RB+VI(0zOckFJi`%P8@16rODDr*I*+&I~C_vHn8Bbe!%Ri4}YliX0 zF?r66Z#I9VoV>|x=Ob_b1gfHSd0V~mXw!FlF@1x)7G+0UE5UKYrgDE$B>iW zz(Xa&<=4Y2cun|=dp3#qLHmk4{ zND7O*5+|mV&f1*4a-XL~Md>W^B5d$=Wy0m0t$zM3lR!;bpQg!?z_XJijda?!%u|cu z_a3aGRjXObp*+Q-UqT>Bi&s{e2V-hDp7JReBcE6u>Hdow3ovg$T^AI}<>BYx}W=iB|-J0~xJnB#eA8;{N& zPsVd3Tw|j7oaaCvJ1$G9noy5+)%uKrh1=HR_bzA}=72ZdsK*9oq7qrciFNH$6acV( zk$=uy)iF)7*k)7=T8_P4LuNJ-lMN3Xb}18ui-)NQ8|tIlWE|Y#8BDA_kcp{yE?pHs zt51D=*=ZP|JmW9r7s|CPScxKAfG8_IatWUjjUQ(7A_pWb|BzxI)XYAzwl9Ph^vvvU z-F)B^5pw8TBBtq?s;H+L|1Dt;)>UQ9(-=bnXX>Z(!~I^vX4M#sv zGUrajM9;Ibl(x}5@YnFbG{AKU-0M_aCT?@ca-;h!K=saLr81QFK)MqWpfo#!5MLd% zl?>}JzQ?iVr!Acg5L8)dro2;p@*26R5W%Qp9?$lh#{AqQ3=@{3Dn#i!tC=!n9nAIe z_J|M#8;@wl7^d!!Of8(=UCvG(zy$$+?JaZS&A6M)e=jKx(qjON+>`KByd zYt6&6BfH9gDb45(&Q?e5P~m&;UHhcL>El{+$QgE&w|G|Lpk=0@u@}+B-)ZMWB174U zVl+7F24163C$VL5)z<=YNpp^zMsqvqzaigmxm0DAm_Td9-~^Fra=%cE3)^RU$=yt8 zoL#o(YZl_k&uSI{@z-;1+^B#Oi8qF5Yt8U=YxuU*0Eg7NRBNN!i&NR`Fmq(}N^wc!Sni`tW3an zJ>l!g_8{ZjzzGt)5z=NZ?t6Y5P2sxeY8K~2$Edj6oZs|f45~sPHxsm|q5IdbFXXJy z@NiO0i<)!@S_-ePAd#OL$FUq;cnmahtkidTsmh7kh-IU(C+i6b3CNg$@>?e9oz7Bq zonbiG{LfdLtGXPWglr2QLIupcwML4y2^CG-T2jk<9&7)R%W*Ko7bK$Gl&-L|;cRc* z?=SOFB`fq)srGK7Q-x*zpZVwif8^86E%{3oRppn;&N$sSM$vV!{i^m$dA=WyRU?(r z%Q5I{ZW_r_Cem^OIoY_v<>(@aBs#V4aNDv-YczpR&mdgGe6L2Tz`H1VB@)FUUjW64 zaVA~x;i2RA-YMe}pV=NzAHsgNB+1-b;7?=P?JaAJjcw%ck(^MZO;{oiF!*6AMcufI zPq>(;CN{6xl|GJe@ROS`Tmp?N^Xa$OBWdVU$nUqOUwpkjC>Z|Wcu4)wym)p{*qCX6>AQadc&0*F2PslKXM)FZJ4Wpi+{}JI;nhAj#Ps!A4QGDpD4#O)T=?6pHG1jc zgozAW=M`|f^aWiP3+9W5h{U{`EQ%T9?2gFA7`psFdtVIywidY_d_SLW zd)=lZ*X_mL@-v7gVPIJLCR77=8%n6%)yO684yIWwr8%BNp^ZRzk{B7>fLRb4`NK;0uOYozOcaL6t00a$nIYsrO_yiI@PJkja zk{q3UDw_26NIKM6?4{WF)+b$Jq-tvw3@l&~Wu>Iy{hyC2b)4B0Z$3;6 zK&d@zKspyWVjc;hwSupGyvkTb>G7#%MUjXq7{bvk=R0ouHsQwVK)mma)YB@{)M=9m zv=A4zWM7gi8`priF(=j1x{mYd3fD|((cf;>^}(K3SMCQ<*;wcw@<~Mli@)XZ?)^3Q zBN_278Ya+%P?0JD^pk+kQH*6~TIw3fcdhNk*6UqOq3#J651Nx!cl4%JTt}`xJGNia zKzHVWp9I(ccp=sVYVNu}O1umk%{XIrT6|6wqc)#flsh`ZvCHJt9uw0JE4LFr7o2Df>OS+}KU7%uzcr{& zuZl90J#9je;er`R<|_`>;whD5ezA>u1y&^cM8SoAe7hZ_Z%vfltZ5-_SP87o`J#r- z_Fxfr^5G+oQiv0UfpHx&j%v?B8}=!x!DgG55&MjTxqQvfT`8|1W2SPTN0eZRy;7~m zj*R!$+K-_X(FNU*Iz0bL@3)gdy_-hdTXOd$KZ&#jR|mE^9j`elPsq-VOSEurm%H_) zLG-#ABO5`M==5fRLtw(e5SC6;TFvEsL55oDXnRlz3hBv_1{Eh?)yY-hiK+TO0lW@F z!_`%Jz5`emOc-nY%LC-A{5J!bvy?rzM7F>TxV9Px*c81_ZvDf}S6TR5t@R10h~e7( zI%nFESCKrPMUko>b(6}XQTRQuna2rI7`%t%@f4#3yrXp9i*`ORvFELLle^d{&pT1k z=>y2>*RyIh>nl_4;Z}J<_v;0YK$8+BYzvfNW~>YiyN$n0CeXHGH|2RxBrZamBAK%E zN5Pfyjez=v>5gEC{wuDwNP6HqVmLJ5KxiyJRXiaj6N0Riq*&1ze59t*s9~^t=Ba;y9@hdQRk}pvzQBqyFx@GhDiX z8SuGW8)aP_toZM@G+q9ky;>}JEKxyuFJrmdrWaf3r^;wCFZAU$vlHZW(rjCCEyx3z zc@TPHsh+6krt$y<$LI5I zMBC|_owxp|Ua$eH0kn#!UPr)}rLKFKE3@QJ0~#%nTEfd1a*{zKTMzAK(lo~5c{@Qr zYOXyG)B+`nN;M)T)TwROY&}duOh}dD?uuQv97K->p*m@eoyH()<-X+Sv8{<9Gqf2h zRs}SH_h&eaee7P!H+d=T14N*6kf_*MIIW_;k%gh-?_nn^<~$}@M(gWc+u=+ttvD!F za)v<(L$Z7^xbHFk)mS7D?i;JZ5M}-244|5K)fE3v09s+_GeHX7S~ky#FyZFsegGrm zI=bhEn1Nm9eSw(9h7#J@->S;_ry8GgE~tIePd5%*teqX&)y#r3Bzxiko`3f_eRU*ODI%>=2QA~{M=AE#g}f&Hj*Ii8yWRXkPNp8(#~TQi zAs)nJxR*_96Fni8qs2uc9sz@PD@alh&XwK>Vib+ecf1af{@NnRqEOQB#Il?A2r#kS zpQ_Ah^gcu>UlTJkkw{p)ocVHaLb=rZC15i9{KUrKca{2#Z?0MH^q-IA^FJH5NPl|y zJUQH?QM{`c(A+xg_7c2a^pf%0RTgwR-1q#2zJShhn;J%ju*eN_>E-VV{^}l{YpGn- zAgtHWV7_; zI|;yOGRISnDLjG9^D7Lu@k+2#zQPt;pxEmA!93kHxW&hWEMyzv9Vo}~TE(WH{dd5<4PCY;kS_m|K|#p;mO_VKmm3<4yFvn3$F3e)onjvZH^ zj;vKve#|(f5!bGYsY2{{$3hfs*rY4#GvvGlLFOBostM&z`x8^_9IWKIEG8Yxvo+?7 zRffdIBqY;j0L%huW~30zOw0O%mZEf3pq5Q!1bcla6Rgz7l+~>dsc)5n7b`x~ zu>@_5OboM}mJTM8zbTtY_*Mr4!iS+<%M!x}%q5=2a8T4v#fUX#U)tqCHkwxv0jFcR z_W1^j@LZo?wBe9*xe#`ivH$!h0JbpHVT*|q7E?!^m8aany1Aj z?RlF*;jZarXA+2d!$_L1gUr)BYK^{TbRpo3UMJq!HHxVOc8Zv;z5j%65=Yi}oK2?w z_upr-#^Gwc-Az`5c_X!x!WXHR<`^V;TI;ICJ5Xp;J60@Bs)R-(>V@9w}{Jg8fO!&vndiKYf_2j{1(U-mTrRAtq2E>_+Q7&+0cI2^lXc+L<@wiU3Cxq-Rj845S0A*5Q zf}@hl46f;27{9N@>g^g!^bBg|%#|GPVzqSA>rsP66tUTHPJ=J7xVUTyD85ZjR9XYvV_>Sk zszdPWlaoYv>F#BMD^W^7wjX<3)~EPIqR95*v$==(&{RvL6RmwBch!YBOErTqzIum- z8j5!Q%=KGIooIbyK&aEzaHY}JkD?*jPWf(0aJOyKdWwb>LUmezdT$M4+h~6IMgiWB zk|_4B$dpm<{{{gJd^F&^FOsVZaS~swPxcU{NYx?f({eO}?M~^1u{ISMFln@ZDaq9{ zOooS+5E>sV_ft5x|a)|%}iE0&Boaez)EAY^p}wmX3v;Wl`p?MOKeKT7&f1M z4TwMa5ViV+v%oI?WlBKN)YrIix8GapS`uJ>Hq!VR?8pdgI!>|In8)HDc z0geWwXMmu< zk%i|OV1S);{dop3uKP&!d|Fn`zHs`z%E)9-qUOiSu3UCk&x0dnh4l6c|3N&8U0+$8I^V1`LWox&m0cL%f7k#0 zD&;4}4xgfCwi=i8r|Gx~Y%|7kJp^WL=vfTr?U$hXyqqGc!*7$58;3VR^Y*TnrhZJO zE+&6VFK%{n-c7Ds;_uZm34A`n0YVt?Zf>z@u{Q$=}+Q21ca&OKyi-_jd~uWz=7? zJ10zTqL(Lia(byk+`&RXx*TyK%BW&vbMi}Dxip5B zX_86RY0-`~R=`BpH|@jqrg5}PE&NsWaJ5L3#x{*s@84(!U&+mE*ZdQJ3=+DF`+ou$b0b}N7Jy;+ z$Nye|5LLD;k&O*U2I{_&;2h7r_TSp`gC!^6z~ztj@$fv#%0zbcjWd-`_K-JaL6C*p zgVwSeQ0|jK{j~8<1wx7jjm8>{UXyi!B{r>O6W*>F{U_UU-4?3EOe=ZP63xC#-gK}nt=d|w^T1it;#MqD<+cQFA3WwuY&5? z>}rQKYj~)w-Ck@X=&o1N*cr0&>Pm*2(;^R0n)lKt3D7nr&-GPy+V zerEmYHNPx4hNz!x_AVTn9i>`@0B{7%NJ}yD;eJ3bXC#FEMUQh; z94JWp{4nJ0cQWR(%bknrM>BOVh^_QhHc<_`y||xRA}LVz9Zy^40Cjd_C+BdL+rq$l z!S5z?c`u097b>@xYB{8mx|*iN3>jV4`1lqiMELlm{%U0BpH7FKFMkjVxoqD@9l(*M zN!^OsB&#KBh}_UT*PwfIg>ESDLX-enahm-jrs@z4Ib-X+HQj<7IDi);7049$0vR<| z+VP!1PPuAvpmnPGOm$tQJiuez0%~@LPgD)PX(JNu$r3@W@DUBQKKwjkQ!lR}rZ0zG z&zMDCVAGP&XY@GjbC^slY-DQhHr5$~sKZa%Rdt7>A_@`%$eh3U`$9)3IiSxky$%OW z8gZFEiW?G#;Hnp`}LH4Js+sRyGR04Ac7ejM84RW99zv7%L07d z$e5@&ms>NzVYGkgyuczgqP1mICjPllh6w+9sKc-&YwAI#VS$YZ1Y|I_=B5xQR}zLO)WUrGfcL7%w5lo>3!ClOgCsIPZ>dj&~wiviA6q zd#dclfW`uI|LKgH4_eDoaV1n1xPqyKR7&r|zwb3YoZJI=K z=jzNBom!Z~*s}J7#r!rJ@k)G(z~@J*WT?gac(+cMcoWYoA9cHdqEirpp>f#gjB4ra zu`nkmY(xw5f@i1Tw?sZ?XHG@X-={yblxnwFpp;FIR?Z=!N)e~}9D{KjsqI(I{&(3f z^A@5;R3y5uY8wbKT$J{9o6xXpjA>N%bu$og`=y6x`bPIm#2-G;EhlgS^B0GvI)t0% z<{`OoHybW_Xuz$VMp^+ z`I0=OiqXpMKoAB)GR|Rm^zsmW%PsGFe($1Pf(>ge6m(S+s09(vOfB=eH{38(%taU4 z$4^x^33$9NHxmy3G@;Ip7WrPDG&0-_l0G@~eF5X}18db6qN%v1mv0sL5JIj|qoxn; zL;nQudITCsCew}&$UnFvC03DJ=KjbWv2@;^wPY%Y; z&}U0Jp{I)A{gMlF79L^0lYGbV13VV^6iizF51fg>^FEXASeWQB6|?fz{rcW$*D1#-N_+Og|)ResYhCtl=ZL4X7w+ zi6OUFkjivD_vDpo5ngjufyKq5rnIoDj{##CT#>^gJegp`I@S7>>^IWct>idxRom*Z zq&*_JGZ~;Cigmh*K9{l$T6xf*AwR;AtToRnX5VIkk6v~NqQ0oZqK)XP9S@8_{1hJi zbu;}JRvjHu@b1wSQo7}+7dLyeROOOW$eW|8LJfNxOLQe@nWGhAsHlF>KeyU)VTcs> zdAU)X?P#>Q{~jIHNIiW>4SlbOSe1z>*UWWdK!#gUk=;0KfAi-}YgaGCn(@`_3agB@ zdk{5iJ9pfNQlf$wpT4=H%iT~eig<$P^!VxNVY(57K7?Qomqf!5S;j9q zbM#~LY=oe~?L`EaQO7~>x6s}TNH=Gj&&WG57GD5Q>a_JAW+{_S>jn3;7!R9r+%Wz9 zB4_D81V}vY2g5hkvNdHU;-bNg8id9}@4OJI;RS z{Q<|r6;6^n#Vvv%fP*ARz^=9Di!0EUjJJ6FkegTfnSM~0G+HYI%#h8k?}gRJ7u0XY zjl65ivyvEfJ^9_gJ0Yo9LOG8C$kWSVdXoKxc#$OX6xxHpD<<`E6vfzB`HnAR_ICP} z&cPujXqC45yvk)A8_E_!lEL4lI7H3Cw)o6te>YuW8KxD-Y9_A#1R#KfmH-|gRx%A_%S3r55ZG4&n0<0Ef2pIuTRM)A^0#OU{Rf8gJK~(6=Ovs-3ixup~RMc z!1J@-uMtbdTn-V!3;s}xANs@=kzU|gOa4}4+U0D{Gm!OSkM5hTCcD(-GhZPFbVdPT zdh{S0E;e)c_?kG*W~oPCI5v2Z7$r{O6tQ@zy`tgf#Z|Lmx|%V0&8y()k`OxN{8pYb zt$Io`Uqk|Dgr9eu=nnI`$qQD(DXz;6dIr<=ZDAxU;XmBh<$bE-e8?W?*H#u0Za%N7 zo18@D-9P>{-|7&RmIj(MnyM%}V`f`x;#NkLZXqgIirP|A`lRTXb*w~4uOp7hvW$$-wMkJ{ zN!utAG9-noE5GWMLQ{?Ead|K$M31vL@RVGpZ{5-p_WdkRm_v8w9`rP+Giy7eG#6r& zstD;FLzE5N8QHS{d99;-`!O#`>{_6&rGt`Ks{#9g8bv;8-}wFv8_u28LAzYBmK(}O zNl!Utjyd=w0z%)NE#^O7_kHJ|J6JD!8P~Bs&!ZL}&j)_|QYu34@dXGKk!}}eKm_s4 z%Sw?Oq{fXhGe?9AQ_S8*M)n9$#TS3KLLO1duy?{bTcuuP6bBM(BAAXnM(huu$&X8n z430|A70u<^tet-=Urs2tTlhC*(R3_2ZWqB4E9f?7&vyc#$|{QWLQ7fP6FzH%s~x+< zqa(Ofua`NZia)O%=9f0>Ozan@nzK2ek*Ch=$`~H#?q*%4_oVNnuVpuFc9=CsqscO* zdj&C%JqGsPA#t`d2)cVtw&KWSrYpTwt;S5pdJN4GTVjHsOqhY^D>(O$HyBUOKDgz2VGi;sD1 znXLGRbcn|!`)$-y@Y&ij#(ny-p-b2VfPVrIM?$l)m~i^0=J@g1uxbT$CAl&O{g()1 zD{XleK#e^b^VM#8Y$|P76~!DrKsOP@MmzwFC5IC5VI)w>-sxml|2g~hKD zq+`eDpp2(o(~}#tdnw|(bO2FTZu4nEg)sM!9huan98JqETThG@TaBrGdr(%Y9VTW* z2Uc0Wm|2G46OIMX1lZgm19fF@Uq@q6S8LPp3mc)`bs1ch_f0r-9j zI(AUFjM7&bzgJNhh32jaIdx}6)szRd%>;HM`-vh*a!cb2_`gN-IZr|EW4 zFEwPPBWDBZ)Kw!g+e$O>3tu)Euo_=?5uprFk=lOY$C}N|`XH}d!j|v~2QNM;_D7hq zyH<$TYd#KoIEL%-5&CDXlBq8N*$UBdi;HFZ!z1eLP zqz+SgH{(T;%l(T48Wb;*v2Wc!poU2-mc)ZLZ_*lbXjk;pc}vcC3^-*4*1btG3;j%A z;*z%dkN~SqU#O`P2G27AME5YU@!=O20K0-%dH zi40ugX1LS)BL}^-HMAU1H6mw}Xw8>7a<*)BiGL4i5z4V)3j{zSTKVG2LNdu0BO7K9 zsZBy`q?H;as?yzrd2pgiX-DnPlTQhPRrpnGPzqO2En{TcrZ$n`gibVVbPbsdKlkdU zdU@W&6!W*<&enedPzggzb{Ts}M{J)Q<7rtKVnR=i^ubcFMm1=ya@#;OnZ2@Pl=RUjG80hQoAn`& z%L!qWWm>WDf*DcD9Z~Q`UV=BkblrF{K?RRAGPfIt;`QJXa2Re`ctzY0Am4Gqw(@MYi4xlyS zVzw3DLMhco9|j69FNzA&!1AXbMD_f8_B29K1yqYX zvS@{F$`A&uuZp;RZVqRz#iQ3B=-n}(% z{k*u&J0pN?Y7Spf@5g-`v~K;*!dWCcaP5gG=qcT)+SG5W?h4MtVYu~SeJ13w87B-0 zKQ0xJ<0kEamr?YPKxfwvclm4^#Ro*a@$^37C>c8xpR}t;)G83J+8{M+#lm*kIHRF> zK=^KL>$t98>107ZnoPrRGKqH;AZ{eZ9E%NuS~a%st8Q*C-KLhntUYH;AEkU>^AZ0O z06!914@BwYn~i6U`g2n}iyP62(!V^w`*IfBmS-{?O*q7GC<;3v@3+?Ko9(%q3?GC7bNWLroEz+FNC&u??JbQb6%ga7!$II&c?EL8#f_w49 zbUW=XP}IspAAMYfg;p-oc7bU5Fk?~BAMKRLPzMV=k=yo)$5IPfdC)nGUTOCTU@Y8Z zA-p!2Ae5EHxI@n&&73$7*w?{iFuO|QRgUCV}(T{&gPIi-`5RZOwtzuuzY#gqgwojTGeWEjxr6{eg zt|Pt10!U+sXC6X%FjnD~t!=ZPld%(22LPJ-YIcE^rxQ~h{F`{4D6xpu>f*3X8r1tE z;9BdtWZQh53?aO+$Gj$;x*R*7lllD%4~8S0?cnm~!k$uCYWj{!111sky{pv5V#Rgm z84A@}eiifX{0H;QRx(|kM2>`8dnOsTHAWpWS*ulPwWMRJ+$G)njfsN3Pg^#wS z2*(yYfT(Sm)g9A)lR~Y-Cy&XwjvQJh+hu?F+KiCr=$m-bG2 zC1%N4@!Qp|K=!LCaS4u7FN=6f*hk?B zE2x{X$RL&aGZlhM?B5-rLm&wN+b3jQEcsR4?&hc61rG_7d{`MXyDW2dJD4)-Py^&N zCJ986j<=OhpIFe=@E+0{6{1A8U?(8KBO!A_8OR6Lf(4Ghu+=>F;xUS4oRrD0h#p$} z8&09_9$Xo(lcw;sCsm<4A8GJBk`E%N{D|rk>G|%MoT|ADyb}R8E=a{))Y+(E{PeSp zp7I6>;g~P_`x!_I(ffB%)0At|Vc%`5ge#DDJ&Zt9O)_+g?v{GoyMPf=+r&g2UV`_N zEI^`L42+C`T-eu$0=W-w*c0s@{?u!_3-t!jmmVRL`!1Jfr_~_u`rAK#b z(81BsvOcZZ!9dg-r_zJMb0?W>LOdroivAa4o#K1rVj#0-aVuR`%>x%0QD}LAWiS2n zO8$}P6hu$7_L_9^=!uyfw#Z8BPx z#~HDnRldd-aq)~%Ow{YO8m%`4N_M9RrG!_rT~n1hRNBK#6l7ClLqx(7s+%R8#%Jt~ z4I(Y`av28?k-QgpPZymFf?J>d+S_m6&AcnOPn^HG>Gt>HeY;dv74qxLuTZ&$KY0+9 zk07TSBGgZeX|RauvP7ij=so;w*havcadGGDohW+!aLW|j%nvlA?@?i^J%NI3tz>hz zOcSuV>zi6Ku27|grHC+~LmgI%0iWIg))pPr1)*f; zqE;2-l-)m_f4`TB+I;1(b zBq+Bp(`y^3sH6kOF-_kS?|+(bI5hw75C#fE{iv(@uO>AU>$xfZ*$brbFB6-eQz>&v59mlHwhHhrPSDw?WyEyqq=?hou%tNU|DEZ!bS-al#+^rHR3y*wsq)jY zZ`p3o5~r~b38ByC6-|U|nxIn#<~Gym@2E&+1=y2YE@z_gLOrKnnq;ZPxzgn3af+wg zXZw|E-`sd3Q(NWGv$tX|y*j_w-+R&K&V1e{4yoy%ULdI*?JlX?y6oD1{3VopnM-Xn zG77urNnF!V``!Ji8cT5xR%HX0rF7=kxlR=Yc*!UW7OxO__cJihk?SQv_;_%d=H!^7 z*8_o$#j#QPR0R6v6GN^Qx9QNh0IX)-CJpjba=?g9Y#wKh?c8v@YLFjd=RFA1eMKex za6m+``qa5Od*6X4ZL>;X3fPF8GO{%T3!PU9NiQ#Dh-Hjc(&=QBj9k6iIr!XL@*e^2 z|8Bqk{|gz--~{jX>r3fwW7N)H0W84er#lM&k&aFNea?#TflnS^i_VoJOAdc%t(R1| zPkrH2{o`}^z)1#)HfLy8w3JsU_DRBA>}W<~ZSWA|G@%cwQFD9!N}U)^JgX;}_KL6~ zfX-?G)#d~mp`cLPr3@z^PCzZeFf0=cj+T`8vr_(C5b$F$EsLEiZN1jaOUWwHAC`f6 zX#OTxz?Z&;yyn6@uv03Kdx-EZrX*MHhPcY4|8=qT7xKU_lI9BKs2>;qJprEGpp~J+ z|Ja~2)2nU&(V?G6o;$*xu_@MHDjGWnbCZ03_X_>auiviw!vD8K;NpMiI?Jv$*d|)z z?(R;2;4TG9Q``v_C{Wy?c#9S&?gV#tf;)xcuEC|a6f4E8a`L?Ed^&5L{DOSQ&dfct z=h~ZJ$&gqO3;_(Hd8aH^PjjA56HTea7GuVgPRms8FM-y7q^V61ciH+26K+@-m( z8dwX-*p&{1Eg2Pj5) zXihFFcOO+m3aB?Y_UpP?>hTSJ$7>0~knCuw8EtD63aZdgsv>00HtUu5QySaeWwSiecREANKVscT7&s)D5{BKctN(Mob1Bk!^ZZi967j)Po0Othup2pe2(up7MWCr0VW%(g0Q%tSGZ zc<`rV-jUR4(fj4#UXZtyrT5=tj`E=iy(4udC0ccUv$FOXt9U=p?P~jkvq^RP-VxK6 zhwl8%iLs}R<&CyPAL)~{c-g(D<_t~0$z_jD&0HUNr|XK4cHPiSpy}+hrk0xc&(QX0 zD@_Iz6?R2DJB<9BVFusK;*F8U%GU-sZvtOou4}SW(?=k*q*2CcK_z) zS?_CBo?#mohDK06JLZdOFr=%id=OeF>C~)J z^>IlRF0y|-W5hF*K6yqYIcaJG0IyA+?0=<`vRkV1w?D7${WvT3Db4Z6EeXFaut?I=%n^vmg3K z(gJEH`|J}kgv$ceAT+w!UyNNo^{S{NcyoZ6(d^Q)_?g2wk(T=}>wf|OBB5P^RS;uP z^WthmLQJ#^VdGo=|LD+`Rn~|xXv6-%-Z9yd?sXus`kx>CEf*d?-%EFtr#kO8w~%Ag z)in$Zk5YPd4bI6myx3ybO&3=`A+osEm&F?IUz>Z=w!hpK=y+qtyELCJ4a!R9gUN%%HuzGRRYQE-b~3Ke`3s+9RmY;RwZHl(*NOaGVZH<*TMH5ELsz zqen}oSQS)NKy?`ODWdTEsX-#^b+1A&JgIj-!W6rY$sDdv)>Q&eywrd#;t0 zPnl_bkzqdsvO0>$E+TgE0y(NWRE?qc_>ba|p5`C=@tkTH01d z90*5>q-Wbt0Nlf66{e+$^Y1s#xQekgIS|}MB%c0=7T3ft9z6Dsff+#g9&wo0?68L= zA}6lmWWUXGfg5s7p9OAai2ClCm+sP$syGae(^efP{VXVqo4gj*Br0eLTQ_i*+~rt+g-ocOs{OT znrwk&X?|mWlocn8=_+=`%)#Ap@5)q^Oi!-A{t+Uu%4);o>0S^{^(ns_MKXKRwNy;Y zQ1sFW3ns&|6ITs=of1zj7C*9MRyEZ0Z34!5>h9tcLow7uQ+mK2PU5==RD;!9B>$=) z{vKoL8@@;c=RF*C+KUQq*gWK(>gys+X`z0eK5=yMw9UBK@RGWq+{(z?4~GqA-P*V? z*fzGC{@)5v?>*d2Xyvh*nAwb=LKsAs&?`0aPQa>4DsRggdl}7o|E=R{wOkrMT)L(r z!{i*Q`xJ>0M$hp9V=t4TXX_cyx;yh5gc-`CxifrRu2r9FCe2!dDOHe;YAI5RWT&m~ zvvAFFogLTD`t`t0v#oLDn@8WED?o>JGt0s4ulzQz$%bEJpJg-p3yC;#6T>~$czP@a z$6X|4N<@L+k+qjN8akoWKUk-SqUBN8gi5hr^<gPq3_6A1_lUblVqGl?AQfkWTlGakz)fofE{ieU>L9_Qv2N%YkViy2qz+-Eu`E`=MvwneVd>5# z)(>^a(`m=i*LiyZ0P&77!z$UVd4hB|M`25(k0^Lea<8#bheZv>~56+zVUWP zkDZB=o50O-r1LiWG{?BeNTM3J&U82qB>1qzNSFUDmwbqAv5Q%mbS_@Q+EPYTn51%- zuDmXKHWL5|WHCmKQ`rF{nGj3oyfblNPqAT%sV+8dC39|OPbRdGOr;ggGHv0fQq+yj zHgcd>Ge!T9%&GA`a(ux=OkMR#?%$9@Vsng%-@a`9be*i=w}3x?lFTurj#1j%PP0j) z`w!T#IcVEZ7m|Fjxd*5fGX})j7tj9~Lkb@SqD=B4b5zJsD<;!fd7`3#Ojb-;*JwKd z>qBsfUQ~Q0RyJe|dG@j7;EWGEQ$dp>XB1y8;#-+olgKP!&-PXJ26=ofZM3kWJi z&ne_TG@@a20izPa40p)8|Knb;v3#;?(y?r;>MpBxYUXzRyUfi3BA;NU{cU%S*qUu& z_H_g1{Vc$->EiWl&5zmrYm{;2%|$e3C*;hEpBefo-!9{o7tN?)ym|`UjMR&5E9EwV z*ZN_NYjSrq$O0#B&<^ESaBTxM21@4ZL2`CQU4GJ$w!Kd#wY?w#8O`_FC-eSOMTI-O z+z?Gu%cqbS8>gQOho#O>FH-@WLTC4&6O+V|WS+vuzfbNYjgKZBcb^$#tLBl8Mw0oR zt86Md%U(yOdn`PV=K7ACp^v3xg*CmOP)Nai*Q`a^%s~Hix2?AKLC3p!dOtt?HDeVd zJHr>?4nIbkN{lmG&{fRR5s&B9C_KfB6$Yh_q%{3#~w0{Nh0gG~66_lN#G=;&A z24sOI@lvnWHFiF77Ad4VoJ^jq@iSv$)5dMM#_#9WsHf!&$mD znAOSLElHLljv??$;*(5N`55c1Zaf>YeCDh{KX~^Ura>$z$#n7x`?eq7V!jL4(mrhd z;A7bm<&bbnyO97zc1J)PV2Obj5;pE6FSxZelh45}J~6kjE+!9v4|ybmpe#x&7bb$? zqFh$odp{vT;cBg;&g{wyiDg2~gljJHF=peo%}1^#Qx-LYnJFQrSc=vD=I!ZmCDNx!1!5ivP46Po`X}q&OC42XuSF}Y$YEVvrmzzxD$zT z(`(WaWm-Cn90vZVS3HE+CKBO3B-6%RgvS~G2|xz12hdfXN3=j4st)uB0gw(WaUfz+ zi_NRpy>1&@fDXUg29RyZR-PElOqzZg*N|-0QGvZv{SJ zziIp^m0msCn9eQmR-shSLxq0`&pu2>b(KP-Ns=Ph<4}Kxk{3%(`VNzYezAI;it)U^m`Zb-&Ni*1;Zlu*=Rd_KEfDJ{nP z72X?kT@YOOu)KOn4fA+}L=brgjvfNm@V3hV?z^N$V=(IG#%tWBEpO%8i1qbtsfWVv}75vCiKW)es7%2^qyc!8=d#VsNES~7hGo>J|$^f#iKtjUs# zs?=GJ=WDz?BI~`sEl{V-ZpTEfxhSlg@u417M(!87`Ca;r-MzyPeqUTh^gNVvl0t;y zq{bqh&qREQp@Dq!<#W<23l7uCiJO-d-SZjOGOz);6x8UGv#d{mt=KJtU{M3Q&Tvw~n z5|^mmjD*6N&kkmd!|U3UQ5vc}3aT%5bHPvy>3edNT?bL;Kjz5BAtiYRn})moSuh%j zi|omOfIs6T`<}y(prqdm+eF41$fw0lD8vvS1`~*u`8^9P`?Z->xOHps0vc-} zYa)@8K8^&%+#>KSj2de=?K84lh zHy%1sP;r};uso+MvH1+8pT`osH$qeU-m9Vp0iLp@B5f zHL6{^%z06gzW>@glRn=MYxQ_@lxA4;%X|VFW#~2ooHG@1%e0opW02XZdy!Co&T3P{ zAp}iGHMY z7<++Y%O4{Pw2PCC!3)7c?O6dvT~FEb zk#S7DnbqNv{*A8iE$iF0A9d2XLRBkV$S;KHGBb`?*d#F3=jTl&#SAN-7{m8}e$daF z*73RYMyICQYa{6qxba%}P@frq1}3@4THF!McrLua8uFX*1pTd!>Vei2nMa^56?k-@ z7J`2xx-}`rakWz~l<~;(6FX>VDy%a7dg}1inEQ4s>X#nG_dIzTXY!+)9Xn_pE?&F( zwdm{|j;aArQrF={* zlH>wkYfdmL%w0}BGql(h4uu9%M3(A|tfcbqez1J0B7FkA6%C0nb#T7`RA0`>`r9$x z=Sh6k8tU!VYR&ewS+9Ms)xx{I{4el>ZoA`b-^v*iI|r@%LsQ}WV!TLWm%s_>sN-*+ z?EeIS6O87erm~N%W)D3zlD0q`#1Q);9>MX&RGjR$_v|fGG1i$1aX7j{5Y?0|4VReJ z5v*bR$+l=3r-qoP13>Zfd;Ji2S&T7R)`+5prXDB@`H6@{kr`|~6agh0_aPhATd(B) zCeAvc=^63%PgiGAtuX`j=YR@4*kq7jn(m8<1dUW*q_4`t@D>njft@CUgcc7$hwqA}8S1A9F1b;3 zTWwW;a&>BTCF}U^z9VeyZ_`5g*yfqrG0gg+tBrSUUIKj2o z@ZQqHL+n?JAN7r2vmP?KPlg@yW&HZt;ce=uf-`rVLPq)Sg&g*I;lnd7x@pt*)^#Hm zeAR{f{itVaxGrJNcB6Q5NP`0tXz&A*nAmvfcrF3aTp_b$1i51J6VN79f}lZ`+dYEE zHlbmiLM!dp3qfPe`G$bp-kx2Z*W#|6qpEaAa660~hN|Ye_|eenRVO~7@ne2wUMO9R zQK|cS?sQJ~r0q7twu7?Z_^GC;+G6C%jP=yP?7^jht^fVUyF=E05U?a)+a#L@kq68b zr^0^8zY?e*OjpOLL54f`jL z61Ne3iN<9$z^?o}lXP>K4KE1e6s@$?t^IxeNcPCV*S(gUl+p+-y@$B{iBmd@gz3r! zaZzTrA`Pc|p}Hub_R+~UABLQ~VTh)n56*;Yh^}(>u}#W+X3aRs{4aEtx;G|hk-`Fx z?k2`w#U$9_$}8V=2i9&SeEhyPqcLPwRU7(xf4QmPi!^hzV~c6#y85gn#I?>^yTq5t z8&yRT7kz(lm4P2^ksx9tHKaH!pL+APxg+k=ZDPDcQ%!l?#9dSkh^o@M;tm6DfO+#bBlEPZgtf(Zi+tfiliB zHNa$x@%UtRuOAbZe91eSXIG4})1I=aF_Tg=vWhv$~hURRi}oB|7`Rwx#Nx zelI_Mw|$iV*VX>zLVx(*uUm=lHTON;wEak>I1oV#l0ZA?7bArxPjU^PNhouVxr;<2 z^9Zm*4VwDWA6F%6!EKaM_GjQ!(zGK3-8~u-wGc>hVrd&yOJHm~lUH8kFYgl2b3^*3 zbG6n3Y_D-Q%ArL^=&g%A{v;h&#iDM1dl2kqUfYa(n98dRM&(%+OaOvBwvH>Q$vzBKiX?D z4ZB47aHb^_>X+|(xeN2BjZf2Y7}sMfp@f`!3G#9Ymg10Ua9YYTP?K<$t>ggt6sW=E zHHLIlpYG>hLYtT>Id7Ut=6QboN=R$?{gF^>)&P!?q~+LIR-HO5cg zwOrCxk~#2C;q#is-{lPj1>#(`ZtM?fI-k;7HhJ>=Hyq)dLG(R4-*gX;C9CNd+5*SA z>o>4sDu}^qP6={iEk&OW1!#q#TPfg6V4K)~0>DE;^8rsfAu2#lj1kv=72x~F|G{xJ zxXML_%35N4()sqt!*S6i@r$qWdq`rC;Rf>PdvJV9dq?*SsqiFkN#cB)CWUMq7DyJ3 zN*e@W4#2}PGy$;*xS7QJmKIZ-W<^&3hPnw{w&AFJ5_N_7U=POKX*KDE@6|vh>8Yb&iihdPeTL7@L$IPK=%d_Lm=oDZ!Iav4GtXAOp) zlEioiKoKad4@>b>o=iKb4i&kXLscd!G`8=uP{?N0&a(#lt2ayh43EKfhL)ru;*XJqJZEC$>56yUG}mxHtnHJ5r-RLHvI;XR zwdYrfc^F9I>Lh^1cp9}*P0Xy-#pY5}Zxyi%$62WsH)Nv1!SZokLr!38KslU ztJg*OsE~C;i7icymng~^vyx5=iF(>$a$>UenIpGD`7sYv5(ds57m3-p%_X(!oM2^R z|6Bj>-(*+8zrRViJx{n~eH+RDZZY%VMy*|wO_+uWL%U;MbQGecO=_0LMWwooG<4j; zxKSiAr1I)Rcu*1si6=!3qOadIM0mZW>@}bQ91?Nip)AczdQl{LiCUS-(|SZ8TO3a4 z;ff`&rK2bXz$m0Fj@)Km+}6Kb-bm}o)2PhX6_o_Yjk}G$$3NdPRTKqeDi(oAysMAg z(ZYR&YW)3IbXTwX$V7jNLDP{yIjsQ&MMUN=(bk!U`EkZH=pCG!6>zEECj{ zD{6z)b)WkhH_NJI5dF*5vqD5dKWc-lE$ph#T}C@NoATRuyK`OoRVDA~{aVf-gbO@c z?;hAD#W!m3p8(X6Fi`E3bP;cWIRg7r#2dh5>4gYkh8s*lRDj6F4yEazUh6In&)Y|z zZGHUz2HBmMW<8ZJJ(0<4^%+m~er^wZcYIYspFO};I<^6x!?Jw%yi9R+eJp&;eh^}j ziSE&fuPU=jlvc#t$sDrxgh0<{eT-Ro@?Sr>N5O&;9gk*}~xb1UJ;zam)2- zeZ%g~g`LL3z(AiTr1#e3dP2lNkiUw*JdpbF;aA_X1lTMft4uy#I3oSy5pVd-OS$hT z&G_Hzt)Yucj|s8Z+1`&!>JzI8Gzpj{62){_N%P|K;B$SySqrDn`YkP;P0MW_jo-d- zuoB^fe<4amTQ!#bhQ4E}W55c?%xKm>m~sbZh5oirKGmf+d4Je>2@3iwN_YP2yd=&< zwMA08DJ8hT!l25WaXyQ+p`c-I9}VsU1;u^Mems@x3w_jlB1bxOm{U{~$LJd#!37E4 z(Mk_iWQak@OCuKbNy1fd#@q{&V?q|t28iKtd=A>T<8JAH8Pf_5Bh=f><=Nk&K9#|R z?d6AJR2%EfOG}rcOpb`RMs-|-t_FtbE1dAvK9$D}dd&zrUMt+zG~N-xP#?bDb&X0P zST_q=mEj3JhOchhM3(!~h5xS7Z3u9Qv%6QZxHJeP{}@SiU)&iRs<27;@Xej-e-$7Y zEe))SaDyVO5C|*^my1r78mm$nZzxeEVhU8&LKR(CZ!!Sx+*3@trvo|xpJ|O=>ZAji zPf6@k9c~WlZ4@@0lO=wmE$ThQIu>hsb&a9pt6-=*X9BXS1hdpR2VzV74$8jS4|GHT zJPOCEc?D-dWZ!FqKUSw04rP3pwsoIgte9Cpc}~5frD?~`R6UF*lxZz#`=-hZ$aYso z@c&wwmS7x~Z!AJgu8M(&^~l62)#XiGk$ar*nyJ2!GTWqrq(Fc=-*%+zz$`j_DIU^|iz{7_=B;W6_{nuwP7qKKC8Mm%O($0&oSsdH zxxT@orR4~NgYv#AW_V@1kwc?N6zDdtsH(Eu;wX*{r<6Jqryd^!rdFNi(Wri2oTXCr z{$NU;+a=N1Xc!&dSy4nLjp^`yWBI3G#iE`n8x+ivV;;bO{zrZwTKn51j|9G^F{`q2 z)*>aFJ-O;n`5N(r;7-t6_x#Ri9b_(S=?bbzrjKMz61IJo)G14pLXUxE6q2OmZUV8A z8XO&*@X!kpGhX(B2ZbyUE&&>zRggxLMBJ!YFMNiDTZnYy7b{Dhbj zB=OoE3gyuBki|xfofkC<^8MnO2sAI28yJtPiYgnMrh)eFw|acEtG}Q~urm8;<{xpI z4xquesdH7Yr63;0V()PDrmJsGDUr;haL^hENo#MyBm##KXE;qzAueWtC{fnqxJ+(-LxEfDF2qTqAUZ_Mv)mTIj1jfS66`=5P+6=^ zA_9s^xcO7llkxBI)A6`8Yc|FedbajDCz^--aVwEqNv2*?m~9@Ryd;RboBP7!ci zh)y>>A|`d>3~>~Xz@nIAQOq81aAxx=Cl+#P>t(B~rlO&}d+(ljOC$7S#56rDfUT z4gm5yr*LcP7Ra4*A5t^>XSjftOWtybG~vu{aFjoZ=AY!BkLTrYeVcCk;E;E5>dgIW z=gBK)1xI^yxLOgga-a<7)@SEM)@#{C+I@h*hN{>uZ;N`nuH=%xOkC(NCH(rD`#rU7 z9u0-G7iA>f%7x`|z62oED);p_esZhlk~rjUMW8#;M8cbl6P~2+I~Yrl*~z84%Lr0{ z?{m<{n>=YGX~jGQu~B4xYH8h5%okE+%VkPmGj>^h;hu*wpP8D}dXH#eLnFX3bGbU} zS(VoP!uB>t5>;CH7g-l4`6nkWQwO@j-LLoqre=*Z+KhV&@?Hu4jQZ=g!ap6!jX`-? zIEEO9gXbvUVVD!0zJGh=P;(Iz#A}HW({HMf+{zTromSQ6v#dzozJJXoq4L9}f!!N_ zI4f%y8Xy^PxRO59Rp#2Ej3ZQ#{svPqONtmi%K6DHw>I-@?+=oyrSeoq&2&ewZ;`k0 zk(rcEEhP~m7IJ>VkBferI4sO57N5G_tl^Wi0_{vep0qN*0=5IPu4q*~znLAiH?;WY zTlGFuw=aot{2}tByPPl|WSWgkYq|ylbP8OET+;y(lB=mCPC8N}5!%1rl#3bJ>zRd7 z_I6h71#C14LVEjY((n+fH@d|dSQT7wRB{!3y@Ibzq{85Jo6-Kh7^xgWW!_qCeXJ?N zw%vYLO&x~(uCCm1A3%%%OHt8D=imuN%h@!qd%D2}IB8XV|2V}K$Br7;VM8QfXtlZ> z+5(YLKj9g7&GcX>36Fiq6}t5JPXNkD=nLTgS|H1>IFJj(9>8S&g@6Y^hAaJMF^*_~ zp3DYDXLNK1Ezfm@6?T<)TGw9l4?*5em6-3m!d9nx)rF+-&%fI&=LI*Iq=btN3N%Jj z=7%nSUYD<4@aIeUs^aN^iI;- zs*BO-XTwBve`Js@d+b+i*VrBV`8a>5V7;)!*>tR}Crrag7P&iMo03GdLgL zkaj(1WGC);l5vA}fNku__@~z@ZC4P~x{;eh%4Rs5TA9ozZG=bk`U$d~OYLznR&T1}_>DFY<3NK>>q zxZopYpHQV#UJTkowr4r|-luv&Zd!G{=cGt!Pw7$j6zm>sNiy|uF4~d~ zZt`0@6MBt{IL)K=s7+6cpi^z0I9RKa-G?8C45ajsk89 z!vRx3Uay-E+;V`J&5K@Br_`8La7G}2-AKH}xZ9TFR6|T7W&%^3R@VLAf+J)5z%Ei{ zS0vt%v0JzGbe8wYzPjeJ<-M^a&PS6-1}hTB5$~z^j+pf<nh)wse zC9*e?Q)=E-OO+l~4{QHgSGV2*#r8GYt>PQhbR7?c9T!?p-xN8xMFnz8vZ$wI@1FaL>)8d`p+-Z`1 zXK`$PD>_H&sMy4w4Ep>Tyzz~fHkY|COJT#sLdTt~Jo-_{Yq56AJ3OW?shrnV5`)Ce zcZlm(nla6SeH~kU_p)7YGXMPF+3)g-Yp363GI=}Dq%SOa$Jdgj$c+YV2kT3IR5dY{ z^_XkKy=e2jW?KT-vb8+6i72U@4~@+Ll>LoAMW+&mTXIdu=FDmM&@H$tZm-Gpx2U`U z?`OC2)0VTPEB7$BWV`4&RXD$CSM=uOrXOjn)^c}LA<;}1dU)2+e-~R7*R9Jf%&;aMC(Q~$T-IS0f+3RTTbA}XtptE1~FoAeL=%~@4h2QYT&A6bS9YjCAPRJ)KR zu~9gIwR0MQ@3BO#R+();TqVWWwcTTnzKZyrI8AVjE0m}c8%lK`>`kk5GU3=2%Vbk9 zjH+qM6HD8f(m1&RqyWGzk{@saHyP3zz|+~&Y7K;q`|()g27Q!~Wn1EYQMWYp`1obJ zNKAS_a*_zra>N@~9D`7^%kmPygW%1iJpeSyxd>TCpQk!h*Gg(F6m8}0oIIt-dmJ+6 zU8fvT&Ma>n{bcD$CYvTb`Rh^VC@`>the2_QJhTG-hDLEMEs0SHH|L(}OrP3QZ)l|0 z6~AGSO|6CkU75+xrQcg)F%wGWVktDPxMX<|Zd{J%qg`@B?pL~{>yjV*|9XO`;vE2s z>7jaWFT$S#GX{$^XrotSf!#O!I1?i=YBlQ7`whWT<8FT|t=O_yJ)WbI(NqAYQ2oU$ zm#pDokUp2RNJpNK#Gy@S$n=W#SmA-kL^bKW+&KJZvN?6#q2#zuY0baR<#RqB~XFaijF3*&`rhWi> zNz}A^q{$PA9(#T`>O&z5+o01Tsn;&2l`~K z0`s_3sgkp1CUC;oBGl>Y?_#Hb-_8d=f}5rozc0G-NRZCrs7R469bu;`8CJZ$k!oDI zc=d1AOSC*-Xyeykv*&;7m)|eP-Z#(6kj~s0R~w59N6gcl;|AdjGu zlnhU6aA2ptQs4CxjwU-77$lYdr=wY@$$qv>3ItF}r&d(&j!fZ1iI@zB)?3-R1`XT` z(9AzuCQ$tGqcerax}*~S^nIolZX^*vu1kmUE1yYpvm zznf5l!b*2xg@L_V+5)OO`T-0qCu50sdJZbHd}7*ndMY;#nlm)A154=~UxNy3oBzUx zpYLKm%wJw^aoXOj8Myr2()e8SzHR%&Aa}Xx)-)|4#gO7?`^<5g_jASPS-YEzOeEa? zcQhF5JU;3;anFP863t(49mI5^AYa@}a5t;;1dXRO(~`DoE6tfJ%SELaikV%tw}l+! zb36?ctOHK*B$srDSr|Tlaa(g1-JX56{|^Amb*5DxZCWrukSkwo(y-Am zgIj{F)v8mXXv$$}XhM`B88S7~u_<__Aw;xc^wHP)@VRIE7Br3b#qWn-uco=$`}1JU zXw8qD7KK2Df_6O}&d0if9C|#=Jy5f#NJ1^<`SFnC)CbYmGUvqPL6jF$3J4S3XTWYq%xQU)TPiq~kbD70V=!^mJUxA4L* z;%Pa^rD~(d_gXYq4&?-k0&Yv#q8yyUJN52Cu@#)v4LFw2F*06)J3F8$%1gB42Ious zc&xv|#!nktB4tdMw$fnKumy(;4_fO)Jy+J9Rx=L$)-WWctaw^K4Ml z?i;wzenEpHVlp#6rM|d=CX;Yk^>Jy?e_=9x)7u~WXPKXrdWlP#!JT5VLi3G!4&3SA zcH7UB6PS-f(9DE)ed@`G@HKDiS%GBJ;pQs^*oW%ogLcvN4w68y13McMg^2Gf>R3&s z!py0K6PLNPT5ZR|1`RruSbc^fwk55C*fnhlc=*jGjOw*p`Fd29VQ!%9^?dn9(SA)@ z0(EUuVTc?fCthDMGpj~STr#`DU4RSmDkA@^b597CLMk*KhGE2~g{}uCM-z?_5-zUm zJD;cv6zxjSIZf3+C$^p!Xfc36WmE^B>}lWLH?pObjE&1&M`oLY-`t` zl5Mh0dBdR!Im+$)3ue!XAI%?LKjoS;sxqQb&_H1@AEy{+lm@k4G|Em9PK7oLx5&}0 z{Lw8OKnQw=Dx8*_AA%xNVr@@I&LyTpgR#r55IhKK3!WUX1BLm8&ZWo~$5E%}H;a8W zsZC}8ONHnh8In;qO{a*g36gl|>?QD{dXdsV3@vWm6pKpYGv1&P>d@F9c~p{ytn%<& zaSav7t$23V8U9oS-peQyD& zuHCsb#beJIF9}Ltvozwc+K`i!g}BvT>Acmm35+%ELadDqB(o%?6!e_St3>hNJwh4b z$s=@C;t!vy2O2l5p&Pt+s4#x)D$OT&&+Qe>%t|#SPM9nUN!UckKA%YD4H3m)1R4P$ zGqrt;^{8}433uPZRLlNITxP9Q4;|Nlw;E+C^>WQS8C2X#$2Rn`5hllzxHM|ksTcm( z6{)GJ@K|OTw{%eG_rU8gB`&-zp6qHVWw};~)>mT)Mx9Mei`iMR8raDqHms3J^B5@vzwOR7Cq3n!g6E&1D z82~ST3B;T+4;rcGEn@-xPyk zT$>Mu=MVxF5?2T7?G!`y6gbwG6PC}1{A%4aUS%4$tXH|5@E#OvB`4-$;X(2bKt8fb z)SCTG5@0Njb%)Qb{KtcZ9GWaHg}XP}qbXyRw&` z7}2;4H2Kwsf-MYJFI(kTZ_SF{;Q7V9Z2~0WVcNh3y!MuExy^p8YZ|C{bIjC>bwqqk zwZitMvD=anGuJb%C$rEeGP0~*(IxI)a9Q5ph5+L#TM*Ms4)F3@{nSlQ^ECr;*1Lu{ zUbj@sqEC9PLO$%IlbAM!m?M>0%{CuuBf3geFbS8_Gw4dVG7`=Qr<-i|RtUpD$k+?; z=``Q*TL)TcIl2)geYYRwJ{nzj(a^ehARuuKByT1ss&2nF9zOl?pOQ7gxs?eL#foF6?k~Y6wDmmuQ1iA2}ndLi%$unvTvK`Ic(_gRkMERa**@P5WOEnG=!ey-yi z?o^eF8u0myK>SVEZ(TmBk}Qo2)~lB#T%1dA%w%h;WL`o9PTSYJE`*Dqa zypBs)GPD6G$u7HzNpAABk@R$t@hr1{fqjfHv8l5;=U@I$tsC;+zbh_2Xq6vLto6WJ z%7pG#&m?7M7m8~EIQ@;(jdRE(B|bQSMOX!ks~qL|n3|D59*#}c4J$n@`2cHt1o{=- zU$#o{{<_y``p@CrSD_G-Q4Wg$Pn#1>x@zUY6Cp;cG8h50Hp+m!O{s#-9xpnRRb(9< zl@&iZle`9(FNb$G>O8;LCDnq>1v5@O{XYSS2BR$^P9hO|fFe~%9>hTmd0srC1>&6; z%Y;toyGu%au(vogomDBLIBoo>-&iuN>N)(I=I}n*%`5IJC^oG z(cR9T=n1(tm21dadZnAsrK&w3Jx$I2155=)Rlp|!+HCUv*6;yBDTOx%i%0;UVHsAL zyr`AG$|~~)DXPjyXy#gYHt^4f`fOg;uLAOetyM~qR>$3h3V-@N-#8%ri0Zc6#xYl1=1+S zEprx_xk!;#HTkw|ELc;FSgx?ll_YWFc+4zM)Kz135n1@8f-+uiw#PnSt~|WP|Ml;3 z_&7oUPt-q5G~|O*%DS`E!73l`<_@RacuP(a3e|Gn2s5jBVCas6e7-22wni=mK@M*P z|Il>}Wc9FyTSW0%fh~CRGe^y9>O1WvDKa zFH7GJ;${~s2%5*Q$mMP5Y^Q!L z%&GWR69|y4q^9IT*D4KGpIT!#W_pCVk|2!?op~i!udY_fD-ZPx;D{G_p`;#js$j)` zk-x!smU~oLT$d~=T~wrI(UbSa--7`jpOTH6)>xuh$RX_tHGry&Ln3Nf&C$r`cd2E+ z&F((eRxs2_{3ifIBy>$(l@o*jTH>%}5I4cpHtqDah>$$aCaWq$1*nbgMj}O>i=L+N!FX9R1}}EhwfABXOj+>}V7uTuUhr(Ie!i8Y zm+h;!(AE0t&$^r(rwVcTK?|K-DoS6bw4)JY;Lh)DBOb3#fcBH6Eu8cp&gUs9h8Zn$R?e{5weL?Jn3%jp}bu@2-Fd z2~NmKAorMoe5)&r8z3z2Q)XFeOLS!m6nVY@T|L3Adk%357=&5{pTn@;3p(GQme!n_ ze#mGhRk%%%-{55J+*J!&c=aK#Rxi{+GAnQUyKu|wpKt3m?N<|jzKO-22+qeP%l)f{ zDQ(a0*fIl&O4ohn+?%x7WE59dhh!LSX1`8VGox81xtR!t#RUjEG#Y;=uzAwX;&31T zo1H~7vpTi#z%b!MmAFc~BbS&qXjy(dL1aj^l9J=*n`D*dB~GZNOFz%EeG17 zM&gitDx`_68q(1=`L}dzZK!lWCHW+aX}9R{$A}OyQ>%Wwh(`b=wZ}t&g>?=&}qSTgM0U&*)#%ssQX-4_q z_S+TQhI(vYJ$lPlV&c*gQaQZu1RyF9QxK3xbA5Fs^_qnm9g7B3*^oIXDcmMx5)`{G zCD|!-zO4%jPK^p=7)cd+vN;^GTpLfrc7i6T;n9is-q$rYJ*gFi&K108KhUE4PXKDc z81(;}0=adoLjG9rI75o+Y1MmpC$U8L9n#r5yV9IHngJ;(q6JxNSy=_;>g&yU_ntRZ zA~0UF{4%TcbsPcYh8VwDDToQX99l*&7sW>QmpSoY*Au zT2;jfv8WJCwh(L~ba@U`wNos~-)lrwGh(_bD;^ol+{Lu4OHmKq5x4U~zYY~9M@MW)`>e7whYzbCit})BG zvZbj>C;EUE5>^EwcR5I@DuW)LhHW+j&mOW0Vg?aQ98#vP4(u|YoTSAh^}|)vG{!A%*pA%@w``{AB zV2OyVaw=EK3$QsS@w|0UrV-@yqU4a}Vh;YnvI9wKwnE2Lz#>%fnJ({+!bYDtK*Kat zrcOi~)2GI(5_+?X;&9j&soEZxK1Kk5hJ0xV=xwa@{$Eb8I1)M-JUWT3W?AhBc|r(4 zf9-!k*`a$?)~$$qfS_F|^>afrw58W-E#)=P&PQP?#j=zL)f?MfG7DM8@9)2zIsJT& zEDDa(dUD@WqLH4xmIg^2fB$!1QqmWOeEF}BCF^|QcI9kNwdjnW^u#r-I}ZaHxmjBd zlU^Wr@1P~`%a72#WGH_F4tF6mVgnlt_&C|s zQuv$B#`BO@x}V!%@$t9)Yw6HS62dw4U6X-Yu7rpg#UR@}x2befzUuc7o%FD1gNCiz z5)qL6$$rHpse1e+W>?iMhiFje$K^&muE*zJM(Yy)a+v|y5Owq6y)n-uX0m}WmBKS_ zlz)HTh-LGMvucc?WJP3fL+oZYzW8xoP4!+yO*J$%VGgCR+4P-f%N8`M(otG0vFS|9 z-CC9=yYnb~deqZ)CxV)~mr8I>!b&kJq5v_LuYJ>jUvoP_p3nH2bmY*KhIXXC{f7jF zlHB$0>*>-A^Tlc(D}TgqM@&Tx&0)gNKRVIzgA1Iadwo~)_U-~PpCBAFLK0_LP&>T+O#b^ACYxOSQ? z3*Jt!FTn>Q1SnvDJ?m7=|6%K_!rEY?WldYWxE6{`Z zfqOjmM%p_Huh5ExS|cHXkeYC*^aNa7rXe@dF9`S~krp zW=;{w)lDiUEjRL2L@j78e}8C&?UP9^rpWKfhS9~ua}bxdpqPnOB6H-sky_-?LGa!}j*8c9BtkG(4viO*xFL^vJ0ywJLuJ z1tcJub|yYmtgw;ZZS4FO6^E$d^m^T zx_+Owy1>SC*gdw>&Q|8XC$rTrIU{W+6;t}<)U~{=qMK3X`+ILk&EUMYa3yQgaIO5j z>(F5PQ+i`thJIkDRUzL_PQl9HS=pW+J`D zPCGTnjup-iM*Ab_OxBsY1HvVe@>!}@cjHe$j2+te z>1DO+DAJzmK4U^F+iji)lTRK`f&L<$_s(LV-$n>%^eKlZrCL_B#g?;*V_~1S?}cP4 zzDgC{f-D@+=@{?~y=7Jj-o`LlpB=&={O@$KYo#2QI{eb;Do0DE(ZWWS5Q0Mo@;atU zyKt5=1gm(9Y5H7G0Dz3?gohZ&!jB4d4x{x#c8wwFgW`HOCTyJb9%*oS02%Xu|KzsI zs@Z-4OJuF`n7q}Qy;j?JE}%|CEBS~|tvx_Tv}?KY)Q`z8=*p7UPIQccct=9csd8|-=TlY`N^HByvYGlp=Vn3rFP=>U$($+kVwnqwLC z-#Rw9SY)@$siv|1698T?VxQjhzh0muJAFsE84kBvneAUI1TC<<4IYR|F40kCO`#_h zT(nYS-KA6j$crcnjFcIC(9hLMkJ zQyW{9bDOKu6XF)ow3B)0s@Q3I#CHrHka&8pn7i90NV9n1*~VA<&8Od7)fy4wwx%i^|PI& zksnHpgaWAqotiD^v8gq2_z>l@)KvwzT*ub^c!81zkIC7@XzWXLI1G%- zC?QpN@A#pp6Vt?6kVZyPw_3VCImsz80M%Bo;LObjB1pa_PHk;Q!TB8KQa;AQm;fNZ z)}Cc6Z(3sI-&Gg~S%#h|#~$CrZYlFg5H-ZQYW<7v&8RT3_E7RgP0V^D38BrX$sThx<&_;hWX!gb0EFk@-XYWn4Iw2( zQajq}@NLeEc?aXUbLTk`yk)8l{gn~!wamS}cDy7Pre54Evz>i(r!q5* zj_$k6{*L58`?*j%l9i}4xnLx8ZvUKg#%a&H-f(v$L3#n(B0RUNMANOQ@g0O`tIHB`CP*WTH?+3yax1_AF|q>ez!fXS+(ZG3{5r zU~9JeOo@|sQH2w@wsb^_6rG>XK(;UA@uk=LOaR8a{7|em^`$fdnE<#qt?-HKAtEA9 zU^IAWAX3_=jDsnT>`UgK9`N&n4ikD8w@@wM zn(fPVQ^&_YwBthDwfVC{P2QsQYFTF2bQoLAow~ObJ2UF{wVicc33pCpmOppai3>Rx z<7t0%8cQBWf6pODjmydN^+1D<0^UgO%I%G%AdYC$4(`2~neHUqA6^b2i6M_c0(>J7 zbxQ;CFU4&r9)Z@h;I^IU%aaV+WNV(K1)9= zC~S=hsD$RKwl_XrIC7|NmbW~Y9wE{Py$0zKIC&Kjf$C@Sadn*%CYa3I^m1Bt*~QoMu9_9WtBOyhhTC zZ;{bGaY(s6Ob5f*++^im2{ABOwdyQ2>=xV(G~)q0OmF!cJOAn ze-q$eGaOs-3)68MoD`qatcZt^3z7`2(lVhNTMlEGr2`G3>m4KG*^)%~)5Xx17|1#m zgUj1LHjT_$=D^p$so;&F;onbgVr1I>9QnWB-T#?oZrO4(HdE=f_%mHF%o{_0X16N? zQ82DMjR}(D8He9D|P0pgD(^Vs%l9H@ok(6nQ`lHe*{{p>) z(3HG4yLrMPq}Z5Ti3!3(1Y**VvfL1q;BHljKx2n&l-CTo7u5BPW0p;&X6DnKTn42a zOiqa(lb-KA`w6i3ckETVf2;A{5(DrD$q`8!Ws=Ct8ea~vlIb{0rjqoY9x??uiItnC zK9&1BmD(d4ghTK^hi(MhuRlcY<6Ws7{qe6LU7cft^`CmcLb5@<5nPP^VSg#3vn`PE z##SbHogOkNq_?8E&`GVKFoXk|J%hbAS{C0XD{GH*_t~kFt&~&T$-FMsN!t10T1Tcw zdi^q1u6F{!)^}2J=bm3`7TdwW?DD^#Rt>yl{h9z@g?zcBuOJkQT{HDGP(yVu6?M8rsfF^0U_cJQ=w+ zyrxk;i-W4?f7;sNJ6kWF{rk%QfBpza!%hUQ&}vvKlC`lMl9v0{^6hSi>?uZ9&AQI% z)NMKv84_G~iY6Rb@W+Pzep5Fyr#$2px$WOGLx$@tf7IE>=X{QG&TTN=1ImuWq(u;Xb!ToihHe`q}wi(1IWR z=4&mXz+avDuFIk=`S0Z`jno>_>i8Ok(rOxA8w&Dmby`kO9x(IR)JjN&kXb`>{?a+c z&b8<^iv&&o?*u@O_%MpkVeYnh(^X*!bJAhcrLW_PFR21r^1@popu3y()|ulf-sGiq zM{ny`LDUe#;V~~Ka#~sX*C_fp!@--or-sBd!coD@+AfGuD0Z4y2P09K;fKMfWE8{* zFXDLTNx$CgHJ2wh`DokDefaIRuGy#-=;M@B4gSDxV~TB@Rf7y|uTC2Tui8-@gWkB7!{FjW8C07r z5^|9^rBv&FdLI?RC+2fYqcL{q#c=qFAf%#zKX|{ZTiHybb8|kjfN&-scX{=YY7k2{ zE2c7Ow`>7#6c= z=(Gc<`DBo=u?ahX97k0dxJy>Ut03K1s7=J0+-?1(vx&;cIKJ6}J@F}iFHxnvW1NFJ zOX)fB={Er@`eRx~YgS%RVNk9z2wmtJAYydPK|tvIoo3Yl_vN<+E0`guaWq2 zdrH1PqCzrM%7QBg%H#vdLX9g4ZP_0piFepC`&TQEGq4lYaOu|lP5W z!+hM&c&7#Xu?%WC^vRB{d%=7dil-o!_+?Nh(OEsNHr-1$PW`68TE^zWz0yp&Hh+`+ zG! ztLP$DdQw^fDI01dUOg2XC8&p_5)O!5h8q>Wz1}*1_YOQ5hD}M!3*Q$h{u2Ov4Z0pM z%7d-!wtBNs0e=J&C#y25a9yQzRF^$PHMaq@Pg&jYUYE4XDo@(lAF_X(B)4{K6>?yU zQs&dGM)EY0+0+{`D8u9(=nLloT`BfEPa>;+6HYnjNl6TI$ytwXuR1~qd0n&^E)7Ao z`>kqZ^=<>2s#5+#PuI0FN5Rc&1ZL}23}!!)1LC)kUwAi}H4F4R*eeN+2gaMpxA4j& z{Qd)#F8~3N)1g;wpUO7Or0Lr+(Br-s6r*w)ME|BenbcLdz|I&641Dnmms8hgVahFe z8jX}to@vO_^GU^;K0QvktocER5-(t_+0@P65bt{Fuo>F~gA(q0;y==mH!lnH+inU+ zc`<*=70Y(-A%S*Wj4SAU+HTqV>aDE{)XmqoJ2G~z_*~kl&ZE>_@8Bq6(snrywyi1K zb^^)L#SAaFYbOa@SLccdh$G8~fnLLI1{?O2G0}_n|>iZsQ46`T`h;k&B9UdIa z@xXB<1>Wz#1*3xW;DY<&F|;aWjh`mw5M#P_PrQV;upT#s$Zid)5tz%1{9SxQhdM3u zsM}6~T2-bKsuwY#lm3SiOLYlb!+@L~O|IgawPWGp{HaA#DCP2b_YOHpNu{1vDt(U0 zd4!OqysmfP*q7lo(gft#JU_@vsMDy4)@tgH*XaV}3GjXuR7ILFw~$=R$aMbn_ghK7 zkdzTQCNz(Ov>UPxns-Nc^Wk5E(-pGA=mkhS8aT^p&oAIvq*=d_$vL7ieR)#@f`PA| zA%QeyY_7k6Nob5w)?ZeYEG7&-w2VC9*}j~ZuuyX7)pzZruSta8*C*0BGuHB`%A?y& zULa#;Qwr2C1{6J$SJ$^CY$A3dDN{bG|5A`&$Ub)+;GxX~pTwej{33b(_YV{1xRGaf zO~L{Ky_PNP;KRO*{;D&81&;$9ye~AEIx0mHwp6@=35@5wZ$aK5?mGYA0vz)*^=WQ zAfp9n=>Z31EFdwvT2V-lxmR{D* z*&8kZxg)AD(NSuQ<$>(`XbU=VNg!d&T+9lL>`dT%ake}d_R%c7oQ3KJ?&llzBlMA zIMdLo=c@iQ7q?G^ZeCg5Bbg@8W{TDMJTZ-o?pVaQO$5CaIvcr&7tU@lqlU65Wr}RN za)xcYz2wBn&~&vc7KF~19GPh@DT|waMC$}85t=y-t~VoJ*PbQ`MK$0i+UrTfc$Utw*(=(}I!++?imW#j4f zsd;e`6kQ^EieQD?ep-}^-{8}|i7t*Dk|DT8hdxKPbCF}uiR+jSur#YYh23eGRXvss z%AFGCh^}Tp2I)hP4%?Mb3>)h69gZIBGiA-dwtyO4N0n4QAfbM! zb65PLsTMzFTYmAeI_+=KDYx1}!0I%96=CwKgNozb0bgZ`%lK+|G%=3W!q*NjCnZsh zCFs5-MXY6Gvnn#4kgeGy=$4BrOH`0g+~UtUPNSo0v=OA{VS8h9v^qA1=$tpOTdnl` z=WJbw0f|dmUQ68~%0B_Xo8bmECT(xbO`E3l+2EJpcjwjrd4aII%>Nz261)qQD_PXB zSo@9^D!S=XGlrS$8c!7JLdvrRJzy#bGlIdk`EQ>+6eDn*gveZh?^u(V_G9!D(%4C1 zhZ;q5nk-QZ%qBX=SQ@jwa2J!I02Gf63pJT4 zdJ4-##pT6B@i2LpJplFk;jM6tLP?#LvZGO-l7*)KUtU?nZ98Fih8c%LXqABwz%fG&bd}wt_toFU@Db4r60$GORcdd;gS3=32KTxFe<*}K-spT0ZmWd2P7mZ{Vn%l3#DCZ z`c%d4P@5Dnk`!LHW~6j$j}I+2M$$ACqNBJU!!6u;c&Bz~x_mV7Xt`M>%lc(ngbWsI zspQYqClvwx}gB>--X#CV!zja<<1sXj*9Vo93nS17zK4=2GhG&E?I^i#^w}59v|$D3!)iFY3CN6Oqon9{LedajNXU5* z?HrKk==PIkqa;g9G%t%f2xYf}hZ#UP5lQ^ARjmpR99Hp9ZNXDatV`BT*z+lyeu?*S zEjOp%3S4KWHl&5_`GOb=Pt&hf=edHSZ9{$%-urKMrZMyHI!&{JhoGHO^0Vi3y!KWhL2fDBvk2G0fG!uY+=QNW7PGa?@!b z2TbBlJWE#GASMGfFXz}g{njed`F9C>>aevFh|QrXwkup(jxp;Vp}lcayOeJU7XAqU zj!2p}nY_gIx2a`T6chXENF=5DA0lasovt1J6Uc1t2iC@#SFc~X*=pY5qz~qU<)OiH zxcsF;*G!CVd23v3z^BzE0IaMmeUvU3 z`H-Afb`vSdhL?F^y&)?d)9zVtp~Azh5@Lfyt~^YI#ai*R#MPHZhpVs1SyL?8s~~2O zj#$iS4SS3+s$8x{S%tFiTa=Ok_XXGUQ>n;Z#^9rlcbIBw^c@X_I~U(AM1U+s-eCDP1i(g*q6l7E0m8Z?cvFt z&quXRi{^9VM|p>&Ftj4 zY|32#kU))*1{2y^uKC9OY7<+XDj@#HHo9*_b_MA}P7LUqxmG{-Mc~v2kXu%P-@fTN zwO0$$Y0t*5UMva^3vtx1VV*l_fjoSAgDh|3Xcz^3y$#%dAZA(`C}c7jM0Nvc9@P>q zm1uv~Q<1ck?YyvIrQic2qZK-t*h*~HC{QcleFE4YO=~Osfg*oJ`ujN#Pr`D8Q5O9~ z6Q9I`aSg*bFxK9rh@4ji;o@-j3 z^xgWcQnNSrYxEwZP6}+{oI`D|lev5u{F(TJ1rHazLIc#WNMi25(Ng%S$Feg~g@6!g z)PK|FMUm3UMY~41x=m?%k}fqka8roxdt^(j*yXZyY+q0-q77^5P@8iHLBPiqb}rW+!!1)EKOR%TjepkdJr6o-HXjX@jWeD$ zC0~D;oJTS?wv<9gK3eFUBHGYh+UZ1Ke6Qi`)w zFCQIcl5w-8eWm4e>1(ot?3>X*<-t{Y47Gx0PhGG|O&)D+pPUkUhq2HMZvOXBAV62{ z>#Cup^vt?g=8t5jcDRA$d73m=|KT*TBHQ+-&b5E`d$j}2i)NX6*UNG1V-M|&=PUK~ zKlYsFKRWOHh?-EDCYk;q1}mM(k7nh#4cw8rbH7Ui7)*dQbCT=$aAp)BWllzHDVg>7 zAiJIY6>$n!1Cy-RMNV6Nl+w|NLR6(Sb2hgv^It(CLcgf$Qi~rvhu>FW!~4Ut2`uUw zz~DbT>sZla<@*K?IR{p;=or(Bi^@Pl6E|ZZQ?cb}%zju?;1iNHJ87L_L~`7;!es+DZicKKX3%tK{@r)C zwte^jb$rTI}-h-$sqq) zpLO%=>(`3eZ$Da-#jgBlD50;X7KUwzKmLCVWT2;OzD_powN{xl?dwVHe#>G zcCO5UQ!-<%r*hoY_j=hO@#UuB2X_)Hu0c8kcEsJMp0ydi&@|C-_c3Ty0P0OO1`Aa^ zJ)>jC4y+o1RyE3Z@3-jCp*+r+DRg9zKFUcUtJ#SDOY^G`eTE_iM|o?s(tGAq#4)Z` zdHJD>t_)j3#HE-e1!A7)Z8B{kr9fTrwVS#CfA>vX;d5;webGWNRf-Ii9FA zxnld(g$9=(gT!k&2G-e69-gJH?VC2PY4iqa;a5qC+;t!voY7X~D+|=Ih1{#gH*U;F z87Z~AFoM!CknA{AKC`Xi21-z18v%3|ONMLBVUF)_!Q?*V6afATqAVb+TC@4Cs*@P4r^4GHAYB z?dzHATh1t7a_7s~%8NK9b7~7+YgL0LZc=m5l}?*v|7q|pL-QbHTFQ9Sv3hvcG>7Zd zyY+@d%Vdy;@8|Sh%Pc6WV-*0Po5=XYrjXkGaP+%Sh!p zmB*mp68b*@NFX3HT90eO6Jf(MSr_mvkltV`m5NyW&||eZyc)4N%aBjY#{ycfB@Ikj zIwU-*PUXB)BBpuD@(9a?stfByFPRLQX1ex7~dD8eXg_50;vTX@7LscU6~Z3Yb6 zt~28)_%uOqrl^?Ciri-BvYew?aV|KI_>q>VG#z@BSN_ymh9BknJ&GwkiFN>3vr-ct z*4o~l>u_wA=c$4?afR(Tfj0VR z?Cu_SXgDcDcE#==J*If};^)#IsE42T^p?byl`Q#d8y&}X z+KAu5=I;+e$j0x!hI}J%WD`!UciHV`&&MS?3)l=y(b8z%pG`;APj-R9F47&o#>DsHv*M7w6ZL;mckAR#V5kX7xdW zM}o)jW@b*c)6w=O`}&7t{j!)^;bdO+Y1zP9U2eogdBPbfkt9CcBWwMQm033QDWoNxh3t`$Fkp7Sm3|p1?t#O7Ky=L3!U>iCr1* zM(_xskIZJzXfJA+>W3XB$MzXaQM+O}aaA@J70UnA8m)qH@JZC4dF4|;Rva+5Pgdt} z#OKQ{Azt0w>eSiQ^}CpQT^Sh0$9MJ_Jjuy01)^*kMQ-iH?#N?;HS`KlSNIT+UrT;i zC!|C*Sw6Q-Gc^94Fp!qjD%z5z#ASE}+1#S86W9a^mA)L}vb7N79{rdL!@h&HdYh12#xM|=?(}`@E=Z!g-Kw~I(7pno)$8Plv7W4Lk-$InnvFZFH+qE*P>dQN(67lJs&c8) z%+$~Vv$%`X$|Z*~mtL^_eaZa$*YfWZcJt@IyPw?~-_b4R!rSoHiH$FV3dprB1rHN= zkAn5tk3x4YcMhd3*Pgfp{CuYA&WO73fd;&>hQnGQ+cgG%88=w%{uK$eqpitv(5sW8 z3i@^9s_@9kcV-{VHgc1t%A%4J8rY*thO4B@(Naf5i5$mehe0YziA3azQ2;iZb^d*v zkmFP(IeA1rp7E3=X;B6>rH^t+IYUFL+{a}`V@1-8Fku;WV&%jtO0dB?ul!AE=3_7t zfFNCX+il5Q8HUm7jnOyHqMDPT=rA|Xvj5A4C?lA_TL&Rhu8pU8j(#M(CR5ZOpS}fW zw@LnLE1ciFzb*ytTl+%j^Uo76Kbv#5r=fJE_ySYYx92MM8vjP^Zu)GEqn|OAi87xwPc~F|^uswYHFlbO}D| zInpsc%cS-0Ybo*>iJlJj94~!ucRst0kZ2-xi(g+)hgGl7UwXsBra>wP)0~LY@aCAD ze#M6xTk2dVWm<12R6}uD+=P@IhRxc9jwH~9MU+CH1d>^u3r13A*Gl# zuL1>ny^M%tfa7!-j?v8|_SIZiWo0N>dPAY~wDD?`1aHy8q9G>|T#-(0~`m&Y--4xSQD(E;>5sye|wfZ=QzV!pc+>Ek159YIg3CYez<6R2C1U zh-z{9_T!DSkexc^kDKdFkKcH;y%<%w4Y^vHfd`4UN8)fk;=F9-Z0_|$p|#I`rQAmP zYOMa2H}1uq(BL{St?w~utjVSNdlQAMmH`!RXtmw8-?=5vkBxLe*yn41mD|j z1|EGmHT=M$6srxkrbQkSf&tTEQI>0;J?&mWLSc8sgFn{e7l*ukO$_*H63#4#%NsHZ zHE8=x>8525ZoibvI?%9t>#?(`V}8~jZ=gBwB)!bYCBjNljHjs|l2veb@i`c>!Y(v2 zaditE6>HA76gB_Uh9r@Lkt{UU~=!s+|a48=>bxZ*{ko*?-FNlcFB6 zcH?|KCT|sM*MF_sVgO+wKquph7$XT88>_1df+a`#fkuT5IH4a+jTfG!iUw-uWR(A4 z-rOLZ_c4c|`>3*}AK;T;6Uma<`l8orF!7`p9kx*ndeZuX?+$c|NHs_JRg(j-0jX4< zFH54i4^d2_To)!JQ56_N(b%R2s@v!J`}1Jy@A<$sAat&j~PLz|soPui=!G>N3F zU6yayCX~`C=b=JW(~R^;!pd2DKf9DD#&z{&eQKQrkI;DoOCm`6Ay2 zZXq)jjKg1Ma8OT4UP}blK&7Z4?LSXZZQ$)0p|PumpHu5Ov-x#qYugcCb2>HMR&Hf| zdT`UXv`KhM-?PpJ@5@XcmH$h*JoEYBWH_YgwJYy&Fx{j^nmT803viRiccPxGyqQj{ zd$4)(8^HyptQmEr8sPOTq0DJa$-?=`6nk_BCu1=OyOn#@+#27JEM9jrgNYJgYhA_+ zBB8Dfyj7;cn86s0-SaE$rU$G}E>djzoN|2}YC)rS+-7I<&8NVk4$D<(nyB##40q`I z4e#$FH>fM#U)5{jx5v{GW8Z`>yX)v^XUpxXPiLpDFoMPlz(pe{$wmO{K4%wv8X#YjUFy2=kuQm|0MRBo%H{n!LwR@faLwLOl4Cc;aWR~vPi2dyD+dzu z?bvLIE6xO$Y7NgFd9mOuSH>KWs#_x6d9n~RuwU=i29+tAWExw>?}Epz9V98y@4p-C zRRqq0?2oyB9JUTGk7l}rA0F|9LO^Fl=hMog*>UG1xI*}yCeyRE#BG#0JtnNUf>_?S zOMbv86jc|(N<=1*JGo^DmjCuiL3c^Vewt*ldXxN0#i;!r3cm`%0rDRTv znYE&<@~Bo(NQ@Mcj)E$039Zo9Hy~eZ%%{36Eys?d_(=qGblLQLYSNmFj_p;|{v<)W z9Z5;a+=c9nnu)$Fdl1T`p_xKQfeh zSN@LXuHLGjk*5lE@=LEma<>Zi;5HXo|Q| zY%K0ZE@uw*gR7ae3p3e~qL@!o6s|_KJomBD-JaJtsbAMI|IAjmE^q}--<&MgtGli1 za!~@j!!4xLsTXA=!MpCb>MG#wu&*1189`WtPU2F0EtfOr=6r^tXVl)7cj5uO_t$O8 zj@{ZWqd?mt@8zmCTNr5rVy{i8&fX?lmZ6_TKf7iWRf&Zh zWMia+qLt@l#>CRzhCNTRjd0;S4kg!H(Ogg6v35jO8|-tp8iN~Uh!6DZLyU3j<#&Xc zIYLJ*2c>w$af?+n==+S>uxV8_DQL0dlV;Eko0;k?!fylIVQ@#1Niq_Z2C|B}YTJ_m zX{Oo%U1kvjd$rN;ZFZSj*QV~WOwbgS=f%S*7n|CTBL-K0YyUUz?_K&UC_H-{NUs26 zNuL`yY)#X2J+^}8ckg$QGL7OIBIY)o*bEKUp%s-nj~d5rc4PKAtAW?@_s#*qk`{vW zVN}4-VOE}=FD>%b%7pR^y0#*7h)ohoqk|&sICCq_m@TrMM5w5ex9UZ6^6OI@ip%Zj z(sN5Eg&*#^Zslo@_&E%EzRg>w;=5-Fa_F zXH;esnQ*kZ$Y^MjZ;iB4s>sqW%klB9BJyqD<2Q7CzmMSd$69G%g-@5h)^TvrHe1|! z4ki!bAA|ia@2loKl9h~j^iQ1DvGh&D-G?KE1R>5m&vkwC0Xd5K$L+rq{v=u?D^ju` zeby9dFR;oA|J=PlnVB`Z55-VEPk9h+!}CPgYIxb$=?NLYUQwI~;;hXS2*3U}0nmaG z>A*^mb7j+5J6jbqR!2NDMPOy~KTN76AG{iop~xr#FFaY=<2tD$O*>~fsLVQ{!{}wb zs@9_~RY|71LFY>zu0b{PUwu3s#wI05u=#uBnb}tl-}F1{8BqNG2;hA(C^ z_pV>VrsD`EjPNUN2xmTP|2Z-8dM`?XkSlWk{+mnm(3$_upN6btNB-l09p+a@TM^=T zFWF8fKiz2f9Pa9=k(DZfuu_{!Laz$!aAJ`biRD*Z(S(&0z=qh*>bzd9xiu5If9q zXX;@lk##H8+N!y>9*T2y52>IwBCAH{SotLd?3r6vkK z*nMqrje8@~>W^|!y9jWoICLDzGbQiEE0>4A-V;)i z-p+DY91WyrXj<~v-`}dH@zGE4g>T9?Gi9R__?K~t7L!+}tz><#_bQKyYp4@R8hQg3 z4%i62Am1^2M_~`9b?hK<&y^1U5-X?9IP8+9gIeP+7i`MCZ|=94G9PsH_~01Ob2YXe7nG0a_N=d(I2 zZdNjd{q z+tDYI>-kNh(yRTF>uEP&m&PDN1~_qXDQD9shM!+hSfq|+77JiHbvZqWM<=0vm7z&i zEox$9NoS{0YES@Rk-5&7!LvR(i9%N)rRn$Z64UD3Vbxzga%AYC^{g$>DW{pQtK_nK z|MU50ln|1z@Y2GyKz_hxuJrW`g#>Tknpqu{QKOoB+-XyNvI5HV=2^RfdH40ASt$iRgJU1qB{AOA8w3A_%h&# zD<{c3q0CMq%TEo4z2j!!X0?=m?T}cA*XEN*_BM z@zU^eaX!!ovRF)MOr5GvVjj3$M-QIV>(P_jdRh%F_RsjAFMd7N`gP5r^Ykrtxgxv? z!H7ZzBu|7KKHBrQkFT^DXukYrSRML~#y({$cc^VZYIkDG-k3Rm%+y@Az0COIcGwx1 zePygCru9G$=6GB!ymoZxI~CaunMf0CM_i3aZ+Um6X&pChw^qwR!|oJ=bX=l%x7Lnl zzFLV*L|n&G;~iT=)N!d==@X+P#g^4&60MM#t(EOMc)=sAyV8Uehca9Zp7~KB6#F(=2qXJ~APGNRuD(8hx)(9;M)B(y-sK3EqBXialct|O zL#HXBWo3R^iK3vh>VxSOEc{4f02P`6FrA>qv|Lt`j|lRH%*)MQeP4>IfC|Hr2-fgbvGvKs%iMIObbg(hj;8e8hY}6c5X2y#piK0QN3)zi%t+=OL!m6=IE=u&n6DORs^_4uhV5RplprtME};0_Nn%d;=%)! zo)68Oh!CnN{GjfFKf&i>fQnkp zSajBvkQ8jih^Lx)wRpYaW*t5YTr3<4DaqjkuEP}*$QKW^&SJgVg(L)OF_e9rGfo_G z<}{>L?c;f4TfH+n^hW*pDyFX?742zNdLan<&WC0xUFutR>7DZC;zK#^>2|J4wk<|VKC9cr--ek#{Ruq-;a`Kc_Mltt8ff)qh3iJp+9a+z!q|E4DjOMyx zwCzL9WG6|?czl<(tU{t4FdroPKv$KeYs9A`Uu&v&v@dkO+Ib!~B<=@U7wMJTHE9g5rQsW1P^vcUDJ_XS{{%xIer9q^>nkzwO=cRb zjllxZA-17OlIRcT4gn_|6%K_qT1l1b&D65 z;BG;JyStNM!M(Ucf#MX3y9Rf6cPSKicdg*=Ql&lVf5si><>o2x87ph=wZAoIdrJu+ z`%=2xK42QQvGk=lwxjDF)7uK_KmygLfQctF;@UK6r8Khw7AD3ASylQ}5XJ~l%|dzw zZAxZMfi%%4VJk|Ok^UBO8CG|}sq^%JQ6i;ao8Yn9;CG{PqEm@sm_UFO|@ zbgtV@UpJ~PG4PF^oSBA<(-;>&8vgoM0Qey&=Grs=ra(z-MnV5NfRQqLB|Hlx3j!XF zGqu-|rk#dWpXjW$*E)IqR_BD67^82uFTmzdaB3Si)Axy|l#9zDJ(w`F3WH|zP}}6z z)G#lb76a|1DK?&+d3KPS1{>qi>AAMq40BCY=iD?KV`xxtb2wSUs>`_35SBs9D41;} zhmwoNP@JmOgafvt651tFp2)Y8Mauf?J$0#?XZ;Kj6Kh>EC zXRJ-D)~qnEg*Ato2Ig2q)L>4N1G&x;%P1Wq-k?p!V#l5&(X?^lR~u_F8k)I+kUA^hFq4Ba}C)+E}KO z$Vsik*XVlqInMmg&08g*HBCDIzc25Ih9{Geu}TIvoCyd)%-AeW4GH_!ktv4LFnW%s0Jo>>qT3S$idle;5Yl!IiD>i9WwYe_X~4KwY!%X9}b~bjIkyamX<1Th(L7| zYoa%6UK+x(;E&?1?+L_H%ot-f;T@lGwOTt(`ufhhH!I>9V`74F*^}Q%@sJU=`0Qam zBHw70z0erHuKcFL@=HLSSU|wvl{A4L3s+S$m+CB@0W_CI+iQ}4g`71jxOwNu0lUL=eOZq)X$g*r!>A9t0j=0 zkFNqYX)pZe#zZBctT~^Zi!e@6dsicto0{v}2&`Fwnkf2?46nH_T^3a2)Ydic-l@;) z)(8wk76wp}GLU1uibRb(SQ*(S#=}c+pn01Rb8*y0!BBJW2Fh zfKX#ok;X?qbYSBfa$?w4YbeJR)S6Y@P|v7KL^#sQtD61{tk`c|8RPa<=SzDKD!Sat zIqSRPuTegB?&lZG|B_Srbn(DHM<^2UDvk^{3pMpU4HAsdmBj^-3kS&qw^Y+SVb;Q8h$EwGIYNkiwIGLpcoq&ICvTIfdx<~ZK^!NYD5Bc3q>4pFg%$YL-0pt zo?1hJoS!#x=xEhr5qa7-bEs)$=vW$Om*2YdVQ5$gC}YvZ-2&>pNN`JOY1J;_)^o#p zay=p(5Pw3krLDd>anksgm=a;G<=iMrf9{V1qt{J;uf%`czn0h|Ke|jaFcVKMDpUnw zD+S=Qxvqrg^3ce&52_03Hsd$u_QmJvEh!j>AA$*{K%}-MLi$(o(!HnHtj$ttIadYGl`~;nOA0q5 z>-l&lmoGoA#ovCrvG;#&r9HWw`(vJ-pzQS5aRZiMyv@WWICpg2^kor|j;MUv6M-{j ze`qb%x1KR&nQ8fK9Lq=dB~#YAo7OzSQ&xnf*CD%iUm(tsMxiPZBObDlS3<+{NMKmm zl5V?#l*1G#fA$VTXV~UO_cWvIh}u$%s(Mfh^KD8J>hl$*X~d@e4YYgx2<%P)n9 zJ2gxDU#;h45#6e zJj0<1xFYFlMx_0qCQ7nLQC81fT_xW|8BhA{L!!52&=1(G{lZ@&kV#ce9eD2u`0P@J zp$&d7nNKfxAymOFc6U*?S@LHSfB-Cq)RP@%a7;OM+MX{Ib-JIZSd&_7w0NkeYO;@ubG_>h=%oh+VvfWAT;vnw zQuI1a*^I0h4@JIK7`3&f1{{|e`dJnJ-k3G|q%qgzMg6)$?2WOBkB=u)S37}D_4?E6 zg~I&otM^x#r}Q&K-iNnTUtx$2#>{z{h$~S9^5#DHKl>Xa8ayV;gShS$_3pAx_q*BP9{->I1TK#8uO9iMqezOQ>~fwt7u?dl`O%f%2}NmY z=fzWc!0F~n@dyP-F0`GAM4EYb82vfw(^!hw!vnsT6>SA8yNDW$;of@KpEsfzQ88WJ z5`^fN1fjlGcd6DLMa6BNx)y?@qL+H^rzu*28pgHi5dlU8^_!u&wr!5QU|g9U!)k2p?pver|8dcuc5Oxn9Aiq~7Px6FVn*CueKb z(Lg?eZ#6J$%0#xoyZP0xeK)JI?&T>cz)juc_4%)H{yOL1)=*=&_RMsoP~%c+uo1waoc!|ABNJAg&Szc5^^%fB(`zc{oZJPZdP zgSJi*0v2kg#=7Tt?|vYciTqGea>c>HkXv~e*Yq5Bfq{?R>%>Jpnc`*&8?x@kT?1Y- zjuh(IQADnD>+iOmQGOFWqU_v(eiw|adIJX@%eb4b!idnb7>1q%*f?A~e0$LA-eEQ} zSfMGs)=;@B$JDE0bU(a5Ip<9XOA35t*L#1icRr6;%tKGIzBC%m5~edR?3@{Qa_qck z+F19+uiAf&j?K4+7qQv&-kHLZfjRtw0xvaLh*sUkDvkl#nXxf@j=X?hrsv|YjCOV< z=aArIYTJrD=9*Vc>Bi;cp$+a2t8P>Skt^CV4M^N{NAc5JDtbq~0+VyewUu7s^GZ(I zw2h`lXz!fe6u4={T)Or!#tIE`;)ssV_4WcLN{!rJOA8~dijdf`kSLjZ^N|ZA;^3#G z)>lVJG?%n`s?0zy*zi?R(y@>0?-$wLy`rKDYfDuju}c+c2F}LD7+PBWEKN@mr;IX< zPut}`P@)PtYael_uU+PL1grQ;is46bg9tLba;7w-uL+E?()npp)6bc`E~*qFGL)yh z{#IvhtBT~uiVQ8{h+ez+?Cav&3ckBkSFKQr$(EYKER3`Hem`m>Fiy=AgkD&@%Hh_MU(WZ9|&7$3CdE(tYb%Pz2u1-Z}g=dQ=!0G~WUH12HHOe?t zeS$Jeo4VqN!JNpR%%EVea=FRlZAiQ}BZqg!nkM4AKtn61{R4vWK`n1l9+#KjEnqgP z%-SHpVmXLw$@6(l$f9_%+N=6I9j~b-mxLm~<8~3-ut#gEV&z9<0ZtZH?9Wv?>mFcZZ^Ia*^ZfuVM>I z(HJzUecFrl&MHvw!i%_fd|Bpa)g;!w61khR>1m}B6V*KRQ9hcAqCy{kz)Yp+4kcEl zHf%Hw*}cB)yDL}1l5MfYiyNz&zQ(ZGm?%k|8h#kLA6l9bq#E^{ReYr9EQ~2 z^Ep4!Lc&+EH1RCK6RD&bCa?AEtGJ6YCxDgW-VMycAI$;?NM7w&CYxsvwERf+qD-D$ zt1Q+tIp|TbRooDFtHYKm%znSnhE+8GNl7nrbL^W{X5MSjOwyw_N{cln=Fium=Udra zbqb;GL5rL-NMs|X!3n)t#OC9(+*b-AZg*q@zCbrXL}`B!NlV5w=aKC@#afd`{vnt61lC) zy{CIBFLAlcU{9d0FjrCImvUc8rr$X2STsWUx(8M7-;&JO+l(6&v$*d_RZWxX1w@qX z3W?i!U|^4JaJ!nJsX_Xu0?;aABRdM5?g6gb=4+0lqxJwv;MC!Zv3hM;2fS&pEk z5XzKL)M4gf<3Ha3XGt^LS)E>y+tgtDxWL9H!^~q+XEasY9ae~9KM?|J8~;m#f)G$v zv{eru4EB z2t~QnhguoHNS7hsRkY=N#Wm>%5CZ2Z$3WCZlX6sY426+YRZ1K4HyAL--#V+HE>M|^ z2x%a3 zBF=X&PjYF{K3Pg$)Bt{GQF6rU@TDfSypnaTN-;A6@S{1UZnK)|sk{_1O8V{orretO znI_bq@uoptm{d4ee@|v@%JmzF)t}&Pl}lvER}_RSEGfYxx-rSb^!oB)MUiwk`TRAN zk`s-IRu`kBQAVZh_HRc0B91yk52T+6<6jcm;GA$vDEZv7o5?(WP8LC5uSM)*AB4se zStKIFR=A|j;sbVxT1xY;2sOfZO(^fCx=JLl7ZGj9%od5nJPqhHcOiF;1N=1Se3zyt zGTgjABw4*~JRlfpEy`Fu%?b4LM_Q6WAED!kU0y8t@Ip9A1AY0XcUWYIfP#M{w2~RV zM9fg-)JSn0UEHsDa@H_uz1SR7atAC=6s=LXJcG<=DP-tJRGwZpbQ<;4%HFfpxvI&h z1ihUuI`^D1L;sfY%IXJtfbsHc@2Kcuhp3O$yXcm@AXe@s@&0ixcCb^6@z@Eg3m(B} z>-B3hZXCan4BA!Fj5X)x0&W2w{pN$OK~_TgP0Z;@U-Yc@pQ>($jS`+U8vD`S+Sv{8 z4@f@cZ&rQzIeWeQ^Gf*s+d|bGzjUuFv7qGR$$zGJ_!v~!6|PCO_WTH6h=E^%$)Vp! zW?MLCqz0_E;2mJ^$4BiR@ty9zqX;tw)LpqzO78w`aHi1C{AJwGr{5bptd$Pe8*%d=y<;fMP~Y5z>U6zp~#e)c}+OiYwdjL1h(Nu8e?%81vZ zGekzE9I5hL>Z$Yi?v=_QbUnhmYgVmW?m-fN3gs$UbT-4-+ggP4!71Air#&9~k>>JmDU}ii-AW3Oi2)!5ukXk&f%625eINeY=r%N4mljwy6o<=-nO>cwpUP zzffPHY}#ufWwSDF{~2hoV&d{PnA6s+87^-g4~ryR8B4^VwkzlRJm0HQx@FLWbMgC{ zxj;luWbmaWQ~WJ9Qx@>tX1a8h|J$2-Y2@o2?C@p_x>^xHp@gXq?cgCjs3ZD`fE{q) z3L&2;Ld*;Jsi@Sz6U9WM7dGvksHZDnp6IVhu_m0Tvv$sC+e!7*vG!+Yc6wIl+njx6 zLD%PY!r+Cos6Q}qlcpc>`QDYi10tWU=HI{eDH4KjDV_(fHyt%J?|l3q=(!^tf&t8P zV?OX*W>}Yu*$MGzsj(2{6Jn{7!^~FUz`#_~!@`5}qOvcSphhiIo~Y+U`SQqqnXmLW z%=ryj00hm@_aybSR)&g!ioakAoD|y%p2>%^{q(V?zb>K%JYpecQ3>-)CHSksPL-B@e8SG2XqJ)?KEAe_-M2c zb@MA)Wl_@Y%2#J0{3JYG$p%%-)T{(9L&WZ0!SBrdJrye(VEvZ+cFAd585e|`{)hEB zl)1SK?8HkfKu#4`#beIB)E3su3-Cm2e2fe6f|g!m%nZ(+*?33dQ8dK3RJe`G;9}pi zMbIu^F80&z%e3*!fIv|PpRbfFN3Vq*MQpv0Ou$h_hLt~45&|p++PUSq=!wPUu%i9k zlg1l6*LRKe_**rHn8QJx2wZY1QP8-XXPSnc#JUQSnyztSUY3m7Z(Y9XF#hwbU(do~ z5)o&>MPdcYFx^OcRx4pz(6%2e2)h%DJSZCxjGw-%=Io&NENAC@5Zd<}gPs6BNr{QK zlFyO7%gz2?YvpTIi{iybopqfExlhSVEms^UIhU{HY+WAhAe;f{@jB*j{kbVD_|bI5 z^8Ug1#M7B*<-U!aNdD*zMr!{;!iu5X%iAaIo38@(4ej~u$ZOFh$3nx#IzHfT`S|LS zN!oCLYK{$;O7~&?o{x#w8Ol+{989_FR-(thrHlupe?pj<`Ix z(exB4!AUnhbYcBt4JHZ}60eh}aUv#3xV`;A&=HGeZ*T9+U%(%*QR&DpExdEN+|&OQ zefn~Ev%r}38F7Yt*Ec%a^iK#*XKvCIT=kACJi_Nkg6{oz^SNm5cV(kobU#LmR*gea zwuLGBGRtd+L44*tufhpid3jhp*;0M<{Ej0X`!w|@>eV};o?bDM>ets724J$@u z?(2$w1;BxTQlmNTjA8ANbZ!K{{kxK=Ls+W%6HA9{Y#!lhQ1htf(NU9V-@{f-tJBk! zq>0D6nXmD+b07AT7Hq}DIz(}*d|rJ2O4bT4cHv`Fk!kkS+@b-joSo|B$*@rgQk5y) zD>q-U&H9+Qh1rGmtJ-wtiA=4EDJi+MH>8U!kB-Py@`S0y(w5sZ#b9AI*VgI~%!$l~ z?nhyww!|?hCV&85;5V`4FeIs&;$i+C?L?~!p~>lNu}DXL4ZSOha7h8@@{l-f{Vz3t zO38oK!qUJcXYrF2Eop+RlE|2qWihsESR88iY1{o2rx-$|p7v~>gBY9k-Fwn;M@WFt z%BVK6L%O`uo&zFXN^K9!Ilz`1^U?Q!wI~nHZ6DxzS%Q$+?B~w?x&HRcObBnShQiZ*fa3w2Q zn>gKSpmPot;FW0UxLr^}k;BNrXQ;i+b&WTwb5^F5Z(_bYTIohzQ0DE3 zQlGJ_$X#G62?8<>#?b>5&#zF}YR?$gSsP zVGMVZ_gF`iYRK>IlnRuLJlU7El3CaNhVQ2{tP$^sp|#DUv1kA;D*F>`k)OfSw;!3( zav8{|Dr{~cy04}E1NLQxqk-P2%l8$SMguey9DHUMpCz3MQuE&?Fa1)UXVr2N!#&ss zXFzmITTRB4Q^R;_*jen%CCnor)I^;2P*@UryDFv4L+A9-N>BX`p2NQaFhF=E7d#4q z?*knE?>+$Onl&waB{Cj`oAE4)x1|s*N$Wl3_p8NW7Ln2=`FZ{-H|N`Wk$p#~OFB%L zI^m1?d_N@cm44_+LvTF-L!;yeLLP?e&g$NE1SE^I2vjsG6cQAZapqKz_84KUu(+Mb zK?1`t0}EdQTe42W9K)d((b59Y!#!!XNrS)Uyx!)mm7X-XM?}iSrGu_VSkhMXOfn&3 zPlCK%n^svt2*P89^ze)oHE2=XJjyVVrU<335rvM0ADvFMi+MHXk7`|E01qqPo*8R< zlPBQ4J*&^a={Y5po;A=&B>~%ygRqXuHZ_Z-nK&#lBT1|i35HF$lW|Eq0xBmQ>ja4e zb3f*0_de>m4(NHV)opO>TIO=A>dyZyXmC2uY3gTj&U)d@Kh_s{s%%noJm0q$MT4yIW!^Ox2e= zq_TL@)wtz}VpNguG~K3oN!7-}3nn-bW5Mb{ofJjxd8luv{V`@mQ=e#EUO`;JZ{~iP zas~^s&ZU`zzsrsdc_sF6s`!WIGp8!Q8S9v`+SiC_@ha{Kg$u&MGeuBHX0-zC29voh zxkV`ccc0B9l|Fmli1eN}5<|;u!$Gc*0l^+4M<;sfRP$={3$wEeUmp0Gi61aWuMOjI zJR6Aylm5y+tgM?oC|d>O*(vO+PcXRgFoJkWsvA&*v6b0BmzNc|=_)JY2JlVODuhI| z9B;_;IEH4AI*v3<$*a}odZgp9qrAn6z1vm!R{*pjD6`uCb%4S+BQ{Hr3-J?t3<_U~ z{904a`pnckqm1(Sd2cMMPUGb{0Vo|bnm~=6-D1l&nQfd#B$DXG^J{_YX?rBS-Py%k z@6c{nY1WRN9droihNXu9W!QGxggK^ML25~ztkX57PeSRqMR>x+D6I{VGV z#U-ZmNc&xHY07q`t0>SS#oc!KVWA3RaY22(fFypxJ(&TdtH5s_sJ%08M_iwu&!O?T zgn~8XVqu+RgOjX?G&M832ZsI@D16Mh!DEU?jz1v@NByhkGhi(5>hXKqC<#n6bRj}3#y=W1xW+X2T|7*=*rO5yBItd z1(hJo&KO39YP?cKl8>q5vq$3Z% zDGX&yBM8SI|M4OEzdHZ|8j+Lo1^g1+=43~S_j zan)Z`H1zvHz}ereU-s{RT0czQ$dzrr6QP&T(N+PA7j8YYE3@I`(=iRu;?`zVrrAyt zHa0CiiWPCDJ&es~kLb?kkLZv!oY?bbro*E7KwgeA+8h>NTXk8eWXzbVSQdYYgcuXU^jWS*bRk3BSR~YHHrK5l9rjaXkyuL(<)5q@E1=O#?)>O z*O-n#vHYLfb0RG)uNxg1DRrFgsr<>YGMgIdSY$ z;F1qzmgncedA8_zi$L@#csjxnO;Im%!^v}yDq62rvUMt&Aybgrjlii5pCD>9m@Oss zwa5yNL*U9?!-G`~I%hIH4epzzJ8PxhM`7X_q?TxcHD+bZ>BCn53T@O^YK0?@TvUY; z{|bN&0d>|4PKL8~Xs&~Mf)iW;(Em+?YS)w>!qcF}%HFD2XXiUa+`160Eij?=IwW?V z)F0}9=GWJ9vZLSr!>Lce&kt#=BH{@p6vP`lkYOez)~ax@w@R!EFfjsh**IzL$6>-K zmAX_7FQ`B8x9w!s&+gm@TjtIQragQUr78MTT%Ib-=)-)-uo&!Uay&$sAr06}8xoZz z%fNHeEh3feDZtm5*U*@*W_FAoCk0u|l6OWu86XOQ>x*d%9M0!(-BML~*J|gCD^#5O z(LZe1dVXKSAMzY-PoWPet?{lVC4IZRWMo)h@l0!GGtN%OQK{i~*Ry4001Pzo5BJR% zWHaV_zu{InY1V7JyfS4cqBheW>_YqQB7$!a|R%Ece_$j?nkI(5R$rbf-fwa+k^_z?Dm>$19shDC5 ze9=2Un(}k=DH!%1;&7R@=wSn>%r)7ulF&$yGMJ26qZRH{k)}JBF;uhDibRSnp$Df- z+g?nBd|}3n7=68xBuTRWau? z=`g*kzz(W()IF_Q%R4qi&GQUP6Aqko~ z-ET2@AK%fhpWR-$*?N>*{^h>zHp>gF*zSodw12h_c+dZ@05n6;(48mXFTw5~<5YfH zUb;|Xd?V(7Pk|IZ?#EX0_AuM`zW+7w;n@D%OvH;VP~emU&AJtAA4R(XWclJ5F&|6W|qM_u1gA-e%hTJDUed^UZ0t}sV?4KnZV zh@}DJo(`w4RKsLyG#MhMOL@%jQ^7$Ciy);eup$?$tSm-A2-CiuxujDr@0iD)j#4l= z{(vTpTUSTOo5)$Rl!ocrCoNxj@%zSdsBnmavXjU#IiJ zlIK@f(!+Md_XAp|#>%3`RWB{n#rYJH*Eteum(p&C+AP=`-F)4<8rO2qMKnJDV4@VU%`BIxN;wE9J`;wlEa#T-58kEOrLMt#t7w>&b#o=Eo&<1F3 zGE$prQ(2s0FwSV&EVK&{;rD7GNnbHPr59i)4MVcn%iTws3QcU}`}G&l!$pkZX+N zlJ}Xq=I{qcu9U^mzdEkCTMJqt#)eAd|0@7c2FMzQTIp|-7HtzR*hzcH+i2jov&-sICbp7y z-AakT`9NH3C@|Bx>t?EkA7-7WiOfvF+$c$OC1Zuq^^2m*}ZhFyWw}5M$#{3?Ktg2$BtJHgcovm{* zQyf>6@yb+M+IDZyh~qY87`$umIB2_fqBv-?&tzwzVwKlrIdF-)e7D7|d2S%BT6HAv zNQFBy^99+D3Q+!FohcxR7>U=2q-q($7#YjrIJ5kNGF{Gx79%B>x5g!N87v(1E#_lA z!>bNe?wl@jUTgpjO}{RZqr|GS(AxwUPfnf5_o)d2#n|mqCg3nc95C_@UWQd&Fel+Hg_D&Trl z1gK#r#77#w2Zq81ONkx8N;D3U$Pnc+BML=9{nF_~vy`q`_Eq)PnH5aRbuyJyWm#Km z=9HZSz$ATI#V@oKd2J0x-fcE^Ce`<93>V!xYu? z?C4HCZ%?(U9ox5I+;}zWw4_9ulBJy93LIgK1Uzag)OA{gs_P+%0sSQ1%)OHRF)XdP z3-mQhke+DFr6h6kDBrytU)z)fh`5AJsQuQHCS?=cpK+C&klr9EDTxR6_FocF;ipZs zR68F#WE%M|3nYbr26CQ+KZLpW)*9i!I{;w|gh>sa1@eM(fg&oJP5nP>>I$%Pn`_&m zJTcB#^nPxz48_^l+2MDzOf>Q1Qt|d~k_?*Ow%ZzzbhGt)Y9Z%GpX9G!!pG?W zszbzNwsmp{X@X(BTDKJU}54B=c)7TxwBfPVCO zL!Fz{)cJ;fjjfA7Xbc2QhvI_DOAv-_0!qZnz>q@&90z_vPB0b#vUMJoG64}4!}iYJ z{Q`GkYcI@hmG~aHv0!BrRT9CbBrl0fQ)=%Nx?@m@Mwhc&C{$s5OZchVR`)oH**Xq! z`N*TU#XV=}f)hVSy!kMjNwfTstfv}aqd;ykAO-{kR%KYw8FN| z&Lb`NkEnXmtTPj3Gr=XLCEBobFF`-e&ju!g99sMeeX9FB$9#Fm{LKKZsjWJT~Ysd8wtTchPK>e;CT>>IR~1ntoMUoSz#VdaF&)R>VSYPmr*hu z!}KaArd+--J9fNkRBk@O7@IiB1nLAWE7rD@q`|V+{Hi$T&qtp85rbj7kEP_mv{q4m&Z%F_} z9cT3WQ;mQtL;Z2O(4ire?%$PcLPyBq?PjuCJq-AYD5aQqm9bY835zKj^ijFFe|D7~ zv?krfSwB3@`d?Tf1U z_#7Pf7gpfjHeWVJ|D_RH_WSC=nO(*+-dv^WStpqmrFlXfoHys$XB)3S`+=>8wPdoE z7;B7-7PxND$57hv=&JR9(f|M7H#7lbMNweZBDcOJVPII9Uf?3+jkcM*>P9G?Pkwj8 z3;Pk{C5yQ2*a73RESDMvDhr{4Pf0;QrbhRbiRI>awZXb>CL!MkJK)(iNPF%sZxi@g zD=S8kp;b|{j`I2N4)8#1%JXK-BN>;-hwO&4BeS-7D?@BHE~(6`e(2{I`)FJ*KO0l5 zZdK9{Iqa6HoD86O><^&){+u*IIP%d0Z{Tm_m%r4 zx47B0|C!<~5Kymm;76c9tBz@-e@7r1)nEAP{Z}JZ16CMaE#2k2Nk5T2`&c;yy6)@R zaONOoZojUGZ@JztFuIN>mYBaeXc=OCV(45?Rm+o7%b%EC%!@BnXmBO|m_K+qCAadJ z9KEDSHhmQ}H+CXEVdk*+LD-}MOD^Op$P^{6b!tD;Gg;E5uiI;nc%LymTH98;^ia{8 zPVac6CdqjTK|dtIM)aw9IFw8VMXin7(#L4~9mv~vtFm2%+{PgOZdh#TaL%TXAcEds zZubO-umUSC{ZWhnFGFqCN7{flf#p^sJ*-5l=0;$*!mq|VjREmE)o0HRF6zRM&t#S; zY=@5MkzS>z^+hyyC$gVv<>~7On)(>jbLCu5f5OP)Q!*>6c~;T`A1TaaxzuT{Glexd zxmd#plLIN7uV6`gZ4>U%X!aZ%aK##g`1xyJJvvWgQ8Ex`|JHzyhx z!&6_zQom+jZHukH4j;<7NYv;vZrtI@t8jON$fM*gcuG8B$+pld)sX`5|;sxK7n|Ss{h4M^@oi*N}8(#ZPs+IyA9&8uoYuFyRpY zzIx&%#>1uaK{U(?3ago_jg>=I!is(%p^}cDkzx(mFyoi^u#!FU`u+M}2Vf3CMbV!6 z*8vJ@jU*)DR0u@~H(Zie3WXbD;8P&mm;$bP2?@3g4OSp*qe9{hMN_@CZjW}!e&7x~ z^lgC0iRtV9vT2|O{kB8lc=|HKZM?m`^xJ!e@3%o#VcW%GX)x}$!UaLu=wBziZAorX zI)94G)PbK&f)OUYb1ym0_Xo2)mUD6%miN)uF>BOv@I{2wYvX}rR1*2d#PC%@uPg7? zSkQSz%td~mGj4j3*hjL~v0p+D=Znb<#(3qSgn@RLN8JqB_ecRS6SczOeZnTQr`{jS z6I6nSdcF3#T(uOLO~e#oHMrJ(A7)#`dLn0j2%MkPya}DL{@rt_EjKZDbRaj@EkBm` zCokCiFx93m{i71pJu-LaP)Vh+s)HoEHvIo+#{COf&a%i*uOvp=;*n~=t zou0K!S9_I$s^!Vw)=nt`oJp5j-S|++qEp?NXfI5=`1#!C^C~e znVu5jR1PIQL_Dl?*B%MTGT;S5nMkR_v4omee`=`3=$4_-m-Dzeme*cev?dw7d0VCv zlj#tyL(H*5@n>!5Qi{Y;f0LC@#V%ZAhrC5DNl$dHx-9I{ORE*ih*FarhaL@8tutdH zqqjFQ>M&2Ep%!P6=+IV^E%!^RZlO#aW0fD92*nlt0H#jNKz0*;I^9z6^V#!#Owk8}0uHbZ$R{tj!7||L5#{W3 zyV6#kK}3`E6S2^Siu(uBd+@GTm8PEDnT|qSDZ^DJG7;)dZln(JLEdl2-%b+Sxebuc zvH6S{jOYve&%+vZnH1^G)>1YmIUXc97O%x!#+rqdh?DNpi7NxTD&dLLSO`e)Nz zdqg(;9X|};-+Xy{5Kz%2x#>A&^dQzNEc5jjR)^(DekPq61ypPT_B`^t3O5^^5O~gq6rP2J!f5hol6ZN79U?D zBy;{WuF*j->%8i3>_{L!0GpL!KChC?)#wN&lV~50zN2wU5ARd5_c&*1rqH{JzlJ9J zwDW3|Cq|7qox8f4(K;y*(O)tV#)GC$eF(tuY77=*vb`<1LUshQKmLdnpzp9Y`5pa! ztok6-$I&78tA?jtd-P)Z_3(i%`49fJFF4m&REmjos&Y8=TMPdWL`&3FAm6#&z#Y^<6PEo^%lA z3@XY<*oXT_FXLnCU|&mP3c`x?%-oyrQqjv(*ar0Ua1*UQ+jqy9D?F$Z6D2FJ1sl5> z$Z3c>%C=7E(=z+Jk{b`Em)EC%%+5VmL9_BW_^I=n=~wIdg@HbY2Dn$incAY!%l(b) zDLCv@&x}yG!p_G#XE)mQ(__ETMiqaf!t7C5gQwU&3HpJ(gOiJzh%39-y ztH2c^V-%;5MaH{lmr8n06G}}=+-ROY$lG;J&Q_++D~S*eReV(7(=1weVW)1Tjh_)6m%Ako0uOnzwv9_ z@1a@gAPKVjQ`^D*UgcwNVQ~s!#MM6?|s&kG( zE;wvH$$`x5`g*iDOF-O_VWs?3--MC!m}76Z2P=A505GF{kI!I~S_mDc~ROqi^nR{>04Aq!T|=VH1*? zfW^~%U}})4Ju}81X+EJFC5IFUM$CcuXY+&uvR+>mHlDns@@)Q%Qj`+k(S2#d3EU5? zYWQ>9mGpwFSVlxzza0r~U;~zibi!a23<03@O+6va_Q0y}Qkc%DoMRbLXqbb8-ij)L z5kV>tLfTp%F&(OeU>SbPRi~KBhiNPa$aM@E{-_xiVWV!smW#}FMV%)q$ScTv;4X8* zw>-{SC|i#U4bxlW*Xc~cchMpNkZQPK@w06EZJJ&#HPvyY8+bCl%^;|p+~17M1N#_1 zabo^zzt!v|O_u(1?S5s=MX~W$a?QP{s;`HwN|nM>=52BW*D#uQURq6F285R*dGSMe z2QEk5;r{J!u_jJEG0O3U(GRf;xURYue*H5fpO{;>85juFq-Gl1$e*xk@LmDk1>j!(Rs`8e|9yY*_i&&QV@dkxaFoajA61GMg5UQ;b=3?0c#F?exx=M` zx4bw5rnm&t`QByB8HUz4RCs9h>@nR@G>dSsoJPI!lVDA_dV9K-fo{t)YhaZ^0@#kA zj#?i4F{GeLNaIFIUSy_xNr^(~kHgK3jo*qqV5wdLjpEWWqgovRRUkqch%3u{Jfe)o zt%bhsR6K{HlR;^$bz2Z_1PdxKIcgGSIHe%o{O$+EK{H6 zLhvhyl~Q5IYWb+wFN55WZ;AXFtlpd>ix{V?QKh6PKC0E6grxgJtgSqbWocGeU=ose zR0y}vD;E{Dsd8s?TkAWC6$OM_prCr85#c7sj*m?JB>F6VT5^u%%@&8^Bql16KQd;m z@V^2OKtSztP+ozrL^i@N!Eijf&WkD|d?PGOv*tf63ZIt)L#QWt+B}{aIU4}8-Wh!@ zi{ahU-adh@zS0vH^%YkyI{vsnA*v2)h`l=ahVhHhu=ny! zlmEeIa$e_+VmT#DhZ;JOyTNb@y~y_ECpMV0Kz_V}jR8oXQahp$0C1MDOf;<4)yo&` z{50>I;H;a*dB-U3;DLd#``~xC{|8FI~vAFVS%7x-*NL#N6WQ=iAi=8 ziCPSy5z7e5$n>|9G1t-4_!PN(-bjPFm+hnF2beGdf-HthiVD8-_x;^}un*_%d-rvn$I&`h=(bQ!+M2$P_BCU*6KblE$e-zq zA)3}fk(0S$n{!_G;1wb0SU1b>s%n24pCT)WL{1$Zq^zY9CuNl^cOOY$o@*UJQ z2OjSR1G3mR6`T00g+#PiGTSyCYWu;y&gl3}BD$aD89z+dD)~+&**Te@Ap2;P&)+ty z944}_DoadWf~<(#t^|+((i=`;NGwnrH0MC0zYhp3ctgQ$r@o*45V5aZCW}=lc!C?` zdG%fm7%pNo^p8~R%T_jNAxrIod#Y#0KOwiFXA@I{Yg+>pkL|(DivoH6Pc`KXzix$w zVLAg1V-$$&mTJ6*4vp_uLO5qtO+!=_o8KGMP-h?-?`OMXbhoS{6UjZ4X2 zQ<#haK4}gLsHwn^>b$E9g)zA-^%nR@h$~6QS^0gWotZ}a!zSmgBf@4zscPR^awr> zi@lVf>vH=D&6zO|R&MXf^?Y4WkUygx0zJDmjWucRlspIiL@p06-voP@?2lIUrCYHe z!OWO-|FS~67}pv_~?{h3=t5c-`57N54}qQ#Eyz=3N{Z5q4%7iQfI?QLgYl`0wB^MmkyKrLU5`_6(r_Re=be!LAMd_HP^ zN;PgH`jSMv+EVOaxO9H}(C4`ud|$LVy_3o;*DDG_l+W2;jA6`F{%hapn{u^O&4?1e zuO9FT3$6L*ISv*spCw$dHrObPvTsvuWA9v~M8YF3tsfLLr1dp^F52fvp60MB8^iPN zp?A)$Z77v10w~V`5Nva+H&PlHI=R9xG0%;>HQd)>5Bgnx53Gy3U}8>HO(LVq$D?kX znr_FNo>b-dLTjPucMv^>wUV(SY1sQ_BHM~x*wAI*@vTX7RZC5(vxR478@XfWWkTZh z`-#8?r6cO{tI#Jn)hAi`o6MV*t_=0d8k*I=FT4K!O&k0G3XMbwMr}EKz3-QIkzCi3 zi5rWAi4~=~ERm{6$&_YtR;Mc1IrChoU=_6(L$Ey#6-prgwdTY7 z+Wg2=b=rn_SaD`%Ox0!rYd;P;cKBWb4faWzPIghmcOOAGVp%SxlOB1u6lFLjBATz6A;7jd+9C6JDWjx3e#eJdXiS@+ zvqhL7k8MHneMy^TpL%lZ@+NI*8%PEPjlN`_TjrdgL5H<*1h*%ie+MI33GmKRYBufT9e!OpG z{5aEf{Js{>0tpM;XQYBHxPGLqbPV2Q_q^Ls{%zSk65B<|r5L1}birInm8#08T+qjo^}*EJJIKo+MZ(PPQCp;|>=%uz!KlXAW#KnN zXGNB1Wgl}iT@b+K7WAVBM?Z-NMgrw*;B2jYB56(d8oHam`P~Y%yOCzVIcraHA!1eg z+xWNQy=eI%{)xeT&a^X!kVKEOQ~!(+EDy`Hp!(a~zdymq{GT%?(xX0qJZsBn7xQDc z%qRG`z=VC<0*Xg@6N~r@TGij3G_8fVnu4*&z|I6FnvZ%o5UQC zA29f%YMVX4G|-Qm|0~&~>VIDtgo{78SSxf4|2*!!(H>r8+Fa`I3~~t&;~_HRqaKEw zTY}b})cHt>M%#&%TE$NrYiK9NcS6sipRG*2CJKBYC)c8@bxj#7c_%xIfBRlCG%H(D zZ!|9+mFEpA9tC@J9mAemUVhFF{R;rR5oY^-)PUO_IHyBC21g@Ww*4mImbn_zg`*MU zn!5Ttq^$((?&=XqoF2)M^wiaGZFY_jZTRh5cQ!l!`}*Kx=1#|l^QLA{FQgN8dTK;k z3ong^Ad$ttiLm)&TIkA>am%bh7&9uj(p?cZu@+jD5L2_(8QXhV!Q7(EDxVOXczCB< z2pmC=wI4|(EAcWJUdAqqfy$>yI(<6BvzF$F)tXvQWoQSYk}pg*FZ02EdZ<; zJ};n0zdmonn9C4ZP6_;7$-`j1bR7trDH!LGPZ`1Uo2(q?6?L@;>UIa>B+FWHJ{d#G51XP3@=1QhBq_w?a@@#znl+f# zf+UH>2wnsZO{eEod{K?LMvgP=`;oeaFbnv0_`au6vtk z+hRat){)KQskZs#Vx>)rw&(LF?oDl(w-0#+&efNfvt1G$Kf7uZOAQf{hbVwB_^&-W zV)$1WjqJoUng{V0&g%#yfOs}#HGO=#YQHKfJ90SU_@-u_?IC=S%%T8VNytgiV)W#X zz#WgiSDmFR{}%uz1Y|on9{pIuJ73X|n631+9)Y(i$84dv(Y(q)67LOxd_pC-hC zkrly$M;s?juAz(<|SlYDgZMI zX;eT;si^v;U)viuPR^zQN=5=kiVIW4EI}MsQ$S+Fe!*4i_8}8h)scB%?Y69B z&vu|phmDm@hhTHe!6zyN5xbTuJI%m;afE(zd;PUyLj z?pw2Jsy9@Dic(dT%ji~n+<-+}0DC2N>wYACUu*f8d(*0S26IY`O1lUts0kR7)ozWF zS&f=2Qnb9?RLq%ExIs`7-U3QtLUD!ZOu4O}g;pM5H0tn?Y86HB)ChB#mfS4`qk~T5 z7!GTEj$U&HE^l+Q_UQD~yb>QQU1C8WKtE480zz}-qdZEiK1$#s7Ci1$5zOKvMGP{l zBm_rrRuWzVcQK^=OFR~i)&6RITO4l9Z|M-{qNy#XGPs;wo|@HUv46A=sUgpk>QVIe zY>D(+Y_k_rs>vAd*pL8Sdn_R5py3no>3Hzq7*b~-smmZhT8AZp+!reI80iA>8ufP~ z!!h4~PT;LzDJiIG5u}%ErE-yMsK+N}4reO#*eg?T6FEB+6qqp#xpn1I5d{1TfEEJE zGkh5iPXqXkhx`{@kz`i5Nqz}`1{D%Npn+>rbq?=84u$-ky_WFa_z!B?!gewAtTQII zND0|)^ zQG0Tw!Y5864lWuTB0T|H0-U{V%IYnh9X1 z_YqF`lv<_J8HwQR**`Th&cDA*eBEux?zq`eC_DNTOyy%wVf#8kY;bKEvnwXFjLE>l zdVsdZ3FC~Bsvq(Tq&xF)VquS<=l#TMXQl4{JZX&jbaG?X{tV-tPQ#R(Y zLkZI0;?m&V%kn%KacTTcW#av{Tb(_t30 zf*ThdYMiDC|TyQxW&^~d%M}R=6&oPSk zq#Nh^mAA*z+b6SETWTIzG#v*&Ix~K)5jZDk8u(uo7bx*?Kiwh2kJR)^uU>ZxWXk>9(bf}W!eu_6rz~91Cc9#r0~Lw7|8!yMJ;#6~fhuMi4i4ZHBdY7L2gp%S z@LeFG?r52~W&}2=n#9HLGx0Jbye%c#q$4r%xj1y}P`k6sGpvj;D){W6CBd6Xf_F49 z|1|sGNCgH&F@36iL2xgP5Njkq?kFFfgezY*-PNxdqVq2ReBmhFrZ9LX*rk(8;-4v= zl%$1*n+1+7;jo89Lz?zHqn5qis$S2E*S#$-!T`YJ57;)4G_cfgjlwva%Kh`xi7i;A*Ii$4rYZ`~hrU^SEEyhG zZ!K^g&G?LtlvRGg$CRR5qOd$3D+Nz(bNZd!OC)^}sxr6+vRu5WrCZgJ3or~N@)H7B z^Yp@Q1DCaX^T<@I3LU6v05VX)NI9xu)pzVmgh$Z!+LIe$l}+~f@!BCOd^9U{cytyaHbNw)AKjd zwH8L8*fAUKsI4fSi>UF#qz)1@b_qGJAV5V{tu)3;$gy7TXL=JWUhQKZaqT3sP3NOB zQiUcX6N8JZph3{V@Krf(F`U;AbBRdDk1i8HW#MArJYKd?E5FS5lINr37rSBUV-p7l zGyzec8c1L;PcY+7!7tq?Fl1>{cvHzpv}@^xwbsM-vG`}zc6QW;R z@B63gP38QM0-)7Pr!MJ#rg({PlwSRDJ@_QJmx}^ZhTDU5yAmFNtBLyNvhoK=S1M83 z$+6O?we}qi&J4A07o{Cc;?dEcTu5!+;r3~lgMU_dUpTchSsoBpLqkBPFo$HNG{hUw z+!`Ur@ZVGLTI;d1e&pZ0Ezh1NGz=eE-N?Brnv*-2x3j{Dy**BRjLqC$ad=LQjS(|C zZv2Q+_?kmH6_OHiY;;LFyT|P|?G)01%TZzlXMZBqV2}U}yRx*b9|!kmwQ7+bTtJuGzA7mC3)L3;|=RavJtunp@0NVo|m7C zBdPtxa7L`}UZQ&ayX+wuF2@li7Uwr?6%1Oj%4$KtMfwCRGVO9IL=f(Hz6*`_IU)g~ z@H*YRiZl&7@w^Gf9|kqR5X`)T)JZ&d*vLtM1oW`gctv~b7-4Dh{yi?h0;d(2N3FuC z@Hlc7pP7L95IGdon?|}3sHu|XLbV8cM5B}Cb_x7F+I0H~>*f8zT18k>-QOg)ZvubY zLnwSYO*ya`8-xlo7ru`18IKVJ9Lf=GT;TL+d8c?m&||6BS{`f2v_If5K%7Z?P5Gq^!CJhQ!m zyWf;u@rl#$Oqd7oM_ zyf%|eFJLnrWTfm0o%oVwT&LE|DHsy_qsz1oTyNln`BIX%$Qt~0H#0PU)?virMbP;M zPtXTbMph0PvGqvV$RKe=mOsKhZ_`tq9x>j0FZB>QV+&q8t#kplan`d_5xv>qRFY<9 zVz!)bPoU>yj8__;2el=0bdL;~<~DiSi3N())m@j<*Hsu>p)9g%ywYo3ZDNP`vC ztkHJS%qP}yD7-ZZ#+&#R&Fd@~oND%SP`_CBpV9m3CK~kr zgf%twT2(WIiwi!p%2NoFGRZJtSm@(>I{<3O$qOpqn^6)fB(d4?mq;R7CLHck5+s;= zLlQ?d3Qq_NX7Ug~1ek@Srhzq#!AZ)eZUNOMD5Tp3yxJocnVL&6 ze4Puyhv7}!{?B{yjC6dA$Vd!xbb5qr#!dBF5K(Sm5Yu#ZxK{aw|CpOLKNa%fe{ATW zd1c`_@@1WauRMG!1iF%rfm<#ia{+BqSxldEq3JF0?Q2<#9I~Pj@75{@I+}ZNw3Kuj=UVO6;tQgCi>-6wEMpGBQ74a-hPA? zmZ7;>Pk)AynN-v!NCea8`7mlMuPwN!tnEheEI!PX1Qxu zJ&$>ioTtrSA{A1FW~5W~<#uHvjfqP0fMx+zQqAw>avXHr>BU+xpE1W-=?w2`K?4wF zovKJ2O;c!2nnQdp&4(En6}!FYoQhg9y;1CeI`m;_SIdAy_)r5Tnr~RyC;6fAMjWyuH-0Rxj$tMp`2vJ5G;H)%=(xZ(^%*w5#Fsf@DtiUbp; z10R^TJ`p`|ublc>P|UmT>A@o4LO=Ujmge0OI`)9=tg%MB=;g??2Df_W#y>jZan-gR zB4`GAEod4|<;>nz7;${ln zY<>+c7r+{Hj)c5%B2I%qbd$3e7J8a($_MX@6j;&HB?%;Q&@zQ`kin5i{f;%ekB zoqAIO{c-Ve+aQ@cI85s8Sj?Ko%Et4Uf85s|)wLh~X_7Y<#jRWg6%SK?7Wsr0wQ}1R z!AkAZs6G<9}N>qmYe!)9OGW`7m^3xHWT3dm_}{>&a&_OBDn?Lql`OQvUp=m`>m5LA^r*aDC~XK)nDu9?n3#B))@V~SV^^&>_hCFvp`|f&;b3?%LoRPw zT(MK%!dymO9(12(f7IeCMTeC@72ZGnV}VCVpG~I9Cf~$5OLU%*a$7C^&M@qrW6vuu z(MQV9%-!B3FKel)dhjB(@3H!aneB_mjMVlDrD-?nPN6?DOGEoY6;&zW#N0lwTx0W| zaJn1nh4HpqwaCO)76Yz1x+O*VqDJ%3;W>6OX3C%=@nu_g6_zGObQ8h@MnCGX-jV{7 zxWilgMbIG9`2K)J8tj&~5%Acw!cwD#xh(x5exHpp3$H{X;IolLa=EnlEw^fMWaDk% z9vxZTxlvS<@_%Qx<^Kgl_Z9B56kEPj)E+ag{WE<3*ziEF9Z_9E(om`Ksomv!RoFHPz=Zbau zag$Ae%mxsUC(lgn)$NlYBhawI zbK}hjhy?5?d*91Vd$~n=iIGOr*RU;Btv}B2la*m9Pb`tvw+Rd$jN%<1q-zO8>?QvE z&Q(++ZRs_4lXgN3(>MPG0A7eu@>YRYB7qb2IsdLeCKPRSm3=&eJ5c+FACN{GsZd78 zqsNUU7%Z>42_QN!u%tSCbYW0Z4!-=2RbZx>JM#tdKL2f7(WENv)YPNPw)3alKC_Q! z;@1a${=4_jIO{P+tZ2Ul2_49gKpc1vbW9JT5O|)eqAR%^e zG|d0Km4=#v3^UIK;4-}D=kP>Ck#Yb4FPCPW?W&nw>;BD6IEE;xsEh>_+Ab=MQ6(gm zNG|ag^!i|;EgxzXNESZM&2uC!Mx~z5_AfqNEty7-AIW2m$LO156kmaQhLh~^} z8ytL~gx=t2Nu@w*l?{hXq#Z*F;%|$X=lA6Di06}Nd^G#Ks4aVz zf>Kl=${@7GaWcQvgLeT*7c`;(O$0MLj^jX*hfREv#t9{((?GgCI-GEeVs0$sWbnt;Omj;Ws@pC9Hw#sjTbE%DUO6NbmzQ~T^sUA9xIE@v-pB2nO@tlUIe)jH~Y}h1`|;+ zYm`mlesaLeOnlM#7Y*xk!(xnzQlL6>haKvsxtC`;1ge-Mh5haG%mM%843H!JL_fmU zT%t5>nGuMYZdwSc8eIc8iBM8dc}#gurwceazt2y=Wj8-v`CPR*?)4=<#`2l{vGx34 z064=@+VscarFa{7Ba8;#2qRcm|KB>aA=L5V0n)ZRj$aV+!PPT)EbFi({7Pn)ic9cH z=k%I3n7jMr+hh~wi2v$#>f$(`D;xO6UxS-dcIf#hsM;M1TV4g9hPe=Mw>mR)m3xDg zLhN}#s+Nezj2JW+6|ShnNrWj`KJR>?r!I^&J!!dM`)}H&dUVn6+8c$><_(%>F7E5AA@9{mcm63u}7UHVOy&{;h zl5D2{H1lk~U|C91l;q`9mMyUJOpb2<<`xcGGcJtc(H?7>l*|H4q z#b3Wqu8j!y$cKgq%*c!hsfd3gM&1aHy}Vx(<%<_KOR)AHFOKZWU_hw$)wAC7+Y>So zb*{jCbU`P)NTmg1ueSg3G|*W>tGEOuCJ;ArN{Vq8Ri-4z4p*faR`s)Mmuwfg3MCkn zP%oR^WO+!ozl6fsPiLNauU^NOAD-RB8lFDgTx%a4XXZZV zZcJSr&p!P5F?%CP1RdSVTFSK1N9p{bU^WE7o1ly~&fY>jT?162LbI^e3i~F+z30mNI;9RW}KsQr}#E04K&l*|BHBHIHaORqPdRW@Z|XVit4RsCkU3 zd}0?kZ?wcr)QM<<>*)0G3Twv?x!ujhf;SZ>%a{*r!p&79+k&Z@k@J4cTi(&ky=42H ziua~x?WDcqx#LH!E*a7G8%MVHbFqr0t@elJ0ske7S6sE1qi%Y1QKzuk5Cl4ju*@ue zdFDpH>+)(X442mf&rnlmV@;kUMoUQ$QW9EPZy@cPCB}s`J89}$iz$k&kW1~x_@XMe z5>7af>8yQR5y+a~e^WLxu3JZ#Q?trJIr_=>IEm1>j)!vM=pf9h8cf~5dq8RfI3x^e zAwWNv*wH4qgq%5On^f>%4GRq+>YcDes7YS4H zKG~v6HIYO*i`gQ0gfO)}905Nbm4y=6Pu9j|b=+O7O?c&Gc!$+=?py-mADjFw9RP_U zR>oB^XkAD_*op6P3CUF;rM<>B-l!^SE;rI>dqbJ0+|}KuFtKvnJN#YQ`XYf&gmwlE zGSs#9lvCv7FWuk(G5|@^78E3?{x1Nc;i!=wqZfSkz!|=^4aWp8iqKpJI2dbiv)%zN z%5J=`oUu3UjWjoGZH&QK{8`7@8btRc=PNO7jgQ$4cr}&9hi|Ecs>?A`{5bzz99F4H z&*vI@K%ClH(*gQvNX zq(a7(ED-wos!eO=Q#kNZL(u4ir!Y9ydTfc8s2ckB?|;$mqfqwWeUBE+(VRZ|%!Jh1 z>h8cx_(C=w6;ga7x#Q5ci9q|QQ=zE&$s8Ea)}#_dknNecG&31>6znr~ zLVJ8(2Z*iC;^Os-Q%!%5@j(^X%0`N&d)7`ylr}@s`uxn|eg3(iD;SBu^v_`j#DrRg zF0I5Nn{64gr{90c#E1imEv z2*eN|xjk&vuoP>k^&Rg0O&swnqoNW?eFJGI3gV6nreFaK1H|i9x$7kaj6Y&h>QCZ} zsDgJB&I0nUQm^QQ0`O7|%gwt*9#d(p-dvM_oySO4g{{@P$b|ohmE&Db10NcuKk#L? z+3rb3xd7km{RAyy6Yo}Pfz`rQy*Rq4+Qa+!0^QZ1C0e3ejkWG!Yg8=Cl{zefN{cS{ zL~^t2>HmfPI{}ChkTvvR^KegaJg1rEKSx-hD%U?xFe{Yh-xWyB*|9ULh6AMxqoN_5 znsuAEs!DL3%1+EI(aTJT70q~KgTq5z+34DRBq&=?B-6J$EYNWJc%Jf-bGhcx$sy8+ zW9Ec1x{@a^@reE=k%J9KY5QG?#{uEG&@))Ntg7XOdHh0M^0=3DG4( zBq$)UKN{;Z_C07ZG5VB;<3f4rc@h@8to8mjVaKagz0z64T-$xRr^2DY=SVX_9h|(W zmQW~jhtuWKdDM6`KQ>zDK52cy0r3YG*whz~;FnFS^j2c*nC)WKbvlo2h&3++JR^5H zDks$He=>f3G5+-0Se9OK32tLXa0>8JR$QB(+V+WdH^AJU%5^(p|I)qifdk)ETySl9 zxg=@q9krPE#dD1MJ3neq2`WwnOaeir$fbmCNE57GVWXXD%ka>szRl1s6=3hJ!m6WY z%D!+L)CH|WU0KY~u}?|Y2Dh^6HQTyYJQDT#@%|+7?eQZ$5Vlm^XW}9qV)~SOI~d5E zIL6~<8Yz8CS?g%(Y7R8&3#Kry&qHbk=`gAY4nigf#Q&r-S`8Y3#M)DkreO?EdldJn zwh$wqVK(AR0a5G2#PIXV7PZiT(L!&SXN}06e>b6n@UoWc+3{w1ayoqWEXYR9v6Pd= z;2)sMzVAY}*t2YwTbP)%12sAPCi`-6WR@*4mi}+&?f?A2MN$mrJQTr#J%)3J6P<68}ig6t`9Nqw}Mgb(Av zPo#N@!!~hib;4B#l;8rIs(>tHVh-v(06LwFxyi$H8wTS^(IgpX&|#m-lDI?m(`Dn( zmnjaLlTFB)t+VuR8O+n&ueA{G;ki2Z0vS#1^IRn=*H#o1rPI(;0*1(Z?o)HtzVW3^ z`~$)`Hvwr=tmmgk!_-+*Ls0s^0KhxJ;`-`(3HCOn05eW_A%-g9g4CnwYEnyfe;wWk zqot%2ebcBymUq~QMKF=Q05r1kq*jAz#A7j1xg2O#c_ z7uo^x5GaR)S0RWdiCLRBa$sV^4Y06TE2A7t94hE|W@p=z|8NS$0@XBQ@Mr=aUz{Fb+oEv0PYMH_@L^jNS(C^OSjc91xxTktjxQ{uZZL zKFNbldcK0Qm?6zwIwV?mKUarB+GHTGw06}z1II&&q(B$`v4(kN!xK?4~zTW+>7 z23uV9zBFf}bXtwN9Z+!muGc);iHXR=DZrl6zu=a zI6>XyDr3UHdtVqzk+?K8_~4>HNcmEdoy(*ab`K@AxIwZXT82EGcA*NBR9+e_>zc6k zxgGo{{1dhq@N0F#sAiR|r%vWACaB?0rK>z%kK>0UL} z`MC!H2Il2yUdgwQ-rN2USZ^R&e&y@{9(sfP}`!%qj2 z!=pzdm)@qMNet1^ixGVbWp|kymXdYkKmB9Gzd0ye4^{N& zAA5lB0UrMXppSs^*W-VFfSzhoxF5j7qU#6#ze;4p*L@85Ht6)#c6M9Cc3p@;e(&be z&kxNKVBlY^-M`2Jlg(V5n67Nx$c#yRsEn_bn;(i}FZ&vWZlus@m4*(>5_7P|xp94g zBC1CY@qcpk*iv0_6Iqqx)Hv$ZB$N#$ix`8FnD~wqVrzXG zSvWcOeYeZ;S+{4JkVs*>^Y`3my=@8_NIcVt0u||RSBy*z#kfU_mufvVGjv?PH#Z3> zYYsYg$6h58OC-Q_A6MebBCQNn)FgY~Dw#{_h5;xo@ImzifZBpiUz__j2~MIVz8Ve< zfm+^L#`)N*xDG`Q8NW(g*MQpM!}hLIyeuaEIJz}bJzSCh##HlbX}Ir#AE(}9ci)}x z0fZ$2mjy2>f&nLsntq-o+I?1Mo&LfQ^MG`>Bju%QVV}4vO=DPbITjb+uL~h;f(4Qu zHxU(U$ZZ<};^&hX3RN~+>$)rg*V^=q-kE7>@%|Lyg?$VmKJTOn7Dk{z9)K|{L1AxC z_Dkx|UBw-df^_fV577&E!eUUc3F%YS$-r8bAwGC^MgyfoD`8abr>q2V5g!}jKvM#9 z=9$am{F1x^9|ozz;g!LKy9dlX6+#15NLCs7&TFOslV`A4(enCPS}DiO>c}?C@bG` zK-{J#r7}}jMrtJzb6dD-oU0~-ubb$TB%rJy&>OuC_xgTI(f(}<>>DQt=m#eJ!HbhF zO}NpA2#w&l4DE`?!Q&=Y z3LhkPOe3WTbgOk`@B39c&Kx6@@U3>)0D_%qUkFq0s;$-6GhQX}#ZLl8RCKIty_$Tx z>-fFBoAu+cn&|JRZ^m{0vs6+~(M>Tp+=G&Om)JEG@zd^L^b}2kHPYs_S841v-aG(6#7T#iiEx@c ze_^83G@kLtYPfH4It~rt07kA>JSK7^BPllPF$2?rU<|B?QAbo@@v41MCm(CVl^LRA z(J6~n)w%bgyTCo12b#KWa?J`_+qVOLvSW9a|iWuQ>;?dZ920$y>f{T&hdut-s?86D@@7qv~G%~FdiwddImJa@`95I1}rW2e7WnQt{`(+ z7JBR4*Etz=rJ+lj(^iqN;#oW~%oZk3fwj2M)!mK4FPcW;>O8OC2>#?P;%tO+G3jT2 z(%L@h;RbhR{=pWGpj4i7{D?iJUOcB5qDzqS59o?i}Utfn9!fO5ey2YW@M3EZA*c7yM`!W)&dRM>Z9G98hG?={P(1hp{Iklr)SH zH+y!TR66B5rf;*U`lc|HSOs5LMBn633J>i43xIk!3W+`dPKI+S1i1e515io)CWbr0 zhAh9?OESbYfg!Vf0T7~b1ro-<^|0?Hm)}AZ7Hi0Mlw6`FO(tN;az{^?)H!La45}$ zZEDISrfo*(9q73?QYB^Qm$Wbnh&@G;D77H!%8O>i2Bkq2RCc+n%T>w3didAPnfiny zt!Wu|!dc`>5wfeo5$is>6`{kj6CIy^8*+9;KM|vh%8f<%wm9`qm)~}_tW<(m8Hrjo z@b0c>##;x7P+qT>W_YfWuQ8MjjhJUD)S7yO`j)kt`Q;NZT0FH3BYz%(-j;cP50j*W zIjPv2h14>W5i1kB%_<^tlnOC2+=9xK)%;~yx`KEtv!ZINW0F$MxH9q_+9=7t2bIKP zujI~@hdf8cVx3OZB(G`4uKzx~JIf7RM&C&gN}i6F_$j*xo~aUzU683q`}?KZM*hAdK9wot*T#=D4V{Uen)Sb zoh2YrO<(~TV)Fo^2i`4Ls0(=YEIRTTH_q~Or;>P7s?txXR^M9Am@_>JeX z-Z!&G7!Q_qB%b||WL?>K6iWgW&pZ_NA5vP(15NPF3Z#;_4r0#Ur*I*xd}byOFeu8#=o zq2OTX?l9sJi^X9}$NS$a(A#iS3a|fNfyOlh&f%I=Kt6D|d=L-WdEy zL+Hp}tzT~d;)I0K_(pRp=qPxEmxj_}MNvHpIlhBxuw zF;L)VO>#vD3?n9Y5Lg)@XNe;13o6ADj^D-tdjex`uSn?v1mL_(HEKPiilVu4T{eIN zUNl&xIGNOkitrur8zo4b10AWXdFmIYCWN}ME&}nYJK?2Bdz^B4`esqQ1Xvzh1Scz# zQY4y%ZPbxw5kg+4Yn|O>!1mFHE}ddFDpx?cYYzg-3|vvw#K5W1&bdi_6!{s8n=w3# z-;fL|3T3b)GaXZX%_Z_pEKaP-h>H^<3IG$AM7BDSF4wf++eA8p5Tctwzh@0oKKP)XY}P$^sL3{xK!JkkjRK>OT|P?|b?_x@{be1=I`zA z*Wt&NKX88`8)nhTB{fh9^Rav4*}t__gg}y#1_6slklOjG%;p70BQL0sOKx0F_rDWB z0s%!`f712F-UU)~<_YHl8BYI?3|IP_qulpNrZwC9KV@q#`0|f6FgYh_R%a@Swer^) zJ*Yd|(%Nkbw!dQau901BXe+DbpxtyBbS5v_{9gXs1DZn@tZu`?4KuT;Jcv_$FZ|GE zpTpY_ZJo9RF$1xgM3<$s5&bipQvX8v!6g$(qa(XeH4;6;Ff$e>hf(WW_A1~0XIp}3 zDLPj@PQsxf__TC|W!+m>mJ{fn;DdCzg~=ExA;{u{gv`+&=`fF)`92SV$jH~nCCv+IDX56p zeTX9P83v`ZkRv=dUP%^l;Sar_ZjCpGC1H3Hg@=OEW{Ee2bq!-bA*b{wWu(kWn#NW2QXm!B0f!nF2F&$ZArRcAZ#=E&PADZ$`ZX{C7( zj7XEh&S2)aKgK0|F3$rO-=_pUTDpVZB;>&GW4;!yxznXTFR}v<@dOBgikst*I=ZML zW3&uX-1JqG)`P8fp6GmWfclnMzY|KH3<+Z1`gm;X4-~8_*}1vt9tAV2o&VJA8$o%a zV^|kygD|5R{vDc2tG%9t(3*x4FV7pHs60<9uTqrj%VObrp@r`mQSMag0;RB35Y>jS z!#^z2O0M%)q$#s%a-@{IWU1noPv}OHnwbeJCD%^^lVyVc1wbnt72iW;{zd~hmJDBo zfQz!9JE&CqcqWNO>|LWFUA5I|TU+0XiZ{*9A*hrVq3^?H1nk+e^}QI01WeD-He>rJ zw>T%yk@2bjdB7FuRRV6f^3bY>-wJ#<0>#siYZ|3;?xctpGAA0IO%2oQu4yJUa^Wo# z^w;sFG}0B`QkKkOL_`L^ElWx<(NY5|Hd@*M-N(R8#u(O<=++F}-qgCr`UAJOMnKF} z?d9P@?5K2D(p9a>VF?dleS6fShcN-+}+*Xf+vJPZf9ny=3#D4O+R&Yorm4$?Cw+B9%lNEnFn4TZ&U%HEsvx2&P0r=7;H=LI>E_<2ksCcZ;}(uq9DwnLiLGv$ zA>-<2#?9|3Z^J$1*)cfGF^0#5%rV1tH3&ZvEAU=@1(u;&ZH|J#?ZRWU2B7F8H;a?yg6xjA;Yqa|ve*;C(s#>b}UvKqJelnBiMl3qC)44qstd?AzQ0V6FLDV#AW4_R7DG7%kV3uj}=k6IEwM>u!|vs4OGM>jg|h@v(5 z*4R4X&qw{okM9~^r{V)w-+FtiBs6M9b!0uUe@Bs1$IL2*w)?gB!&xx5rnZLw+J4c; z3}DLUiEt{f?#B{3N>Wp1XHwEC=b}d7C);p|3d=vsk-0*KLMKd>_~H085hZn{+)~mb z(i*ZGenraKD%PmLdPHkI!V!A-wxp${v_t`HJYr};uJ{K4TQF>v)wl+txm$hpe@G+Z z4=8}EK@&<287w@&9${9nUAi+#S%Pb=z3odoO1i1>k58T!llqryM)e$B0+Z$u<#A>n zGjWqWWchs}d|wNI9n;6tGk~DN9ihUOM}bTe_?u=+c293>WbgMv_p04aHiqAhm5z|O zCQnQDeP^-r@@Gffa}PHi4C_DKpir$W-G>*Bx6 z#RWKYfsvc+Ej=1nX-b5C^C~VgjWz|x3@l{pJU^a=7O%crA1)m?E9Ha& znVe785z1Lu6!PkN2m|xKwH|lh=r2|r2H?h>aJAd2> z4{%$OEtONZP3LA)XkPP+FyX*DtVicSZ7d`)6feXG9{6dcrh~A?lS<0d{PM-;?9_uX z)8MBORf3_tt#Ni@0z%`KRG#=0AcO0=H{GCZ5n{XX>z#I(u-@jROgEVQtaRnQR)^gX zwWP!!-LCuDQ0Y^!TC(^^l0j-WwU~L?vl;Y@G_!}nlQJFLH3kF>g-WJgGUR1OSP~`G zI*P~`=*fMdhs}14)YO<05#Rp-zzG4D6)?JlZtgaXvc3Z@h0r=Nr>O*&LafqTwEk>r zEuOs0XI6iG@C?enF!SDeSr_k)*MQPkBn*%ib@Qq2Jt12$!(lcWEw#8_{&OFQ*8#IR zmdqIFcGz+^_O|ll;`i!1=j&fTrO$xZ=Q!^-+pfy~@Jz>U9c!a&Z#Ijg57 z&NE>iWoan#aw3QH^59L%NIDe$={&gApaLbuJNbP-_5MGIh2c~SBrs^lVX$+mZn(Hb z!9JhD#c+>W2D3>-RIBEMI#lS|wck?k@P`+GygTDKAk)lgZG1Hnqx7Ma2Md1mIBY!B z+u$AabrDHHbOm(9EzZOdUHwQJX8dGR*32~)B$yT+{4^#NarAgRqQAaA7wtNm*N?1e zC_A41;f%oHKIv**Z=tS*_fv1yzi&%=w>y=4l|N5=cw(J{pCR?JmnBR9u`950C6ySp zs>jF)9W<%Zc_#1%fVs4N136PyGq&X^=L{zcY%(F2K;ENLz3^OfV!FtK4m)G z&NrTj#DFmdbqyAPH6@v^Zsn4ZRsvFDWFoHB-B9(QP019r0o&wWh6mZxDYlU2a~jB# z@aUV)a(%{HBxg?2`j&E*nK2Q&E_67z{{36@`>G)l{S+r@WIojG=JzfXSEkyHp7M`3 z%kDH~%S8YV%XNJ+y}3*%PjFDfB_c;|LPxH$D1>MBnE)mWjj6d)Qlyn9R=`iz@`)4( zmrms<9wsyEN%yDyfYom?B0781Z;C(UOBCxhDp4ix{|K6YdrlMfYMfc)%U08~kcj>x z>)?%*J2cNfaELrt@kuVO-Embj`uN%ICxezlqv})t3Mhl^+cYupeWnIQC)}3+_~d!opt9t?izK6 zQH#4e3JU-(4x%JY`aXiPiSlJ(p|z~M@)t(?j2S?+$?ab2*fFC-v8qp6U6D7ePK*lq z2&q^r)l=;s0APK#VnF2EY=9a4P&6il}<0T}asNzHVc2OVPOcd$#MobktVHZ?AXA_H_F8 zC%0=+4i^^5$^#kM}R<50CrwT38cX*)NixsQwDK889A!e1n3Qh2uqmw zM%%3B9v57C0IV%zEEiXUlmlK4S}`}REk{76I+c3`upDv+MoC1qnbGkMfpm?K>YVY* zjhwsGrR?o`NWST=52>{}YSgoeSFgT-g@$Qr$VGo+g5;vfKF<(3K!di(6ETFYYRU{2 z;hB`c7$<}jjS6GK!LP<)rZKvQI{U$DV2C2knF5(hHv0j_Oig$MM+yp?so2zl!)D_T zA~{7KDmTRm4sKeL;{-iRJP_v|qL7GVOBx|h&L+05uRS3r7CSvSZ+8q?jUO57`vrHIQp`KeSH%ZLUJSq~c3?Qb8Nk|9HwAlc7Ml_R{T$A_N z_irw#3crVJ>{o$#Qb_)!B${p&(gr0*=?NEdD97ot(q$5cGO*LSZqR26vP_>M;5;o} zM{0-tryHeRc9^LIHND-sexKW=WGYZgHD*Q)4co>3%7HFjnOM%EK`FS;ZSP(_>k!d# z3K-?rJW(H7iq^Fi;;^!^^0Q_ZS<3y~VQn#|Ftx={@>Vo`^*6ew3sg$q^ACV85O6SN z?Q#K;)AqNNV!ExHI?R}#N3pfH|8#9-!(&<)x! zwVh9QyMHWiG(}XrF(eHa-~x1Q(eCdJ21P|NY# zr!D)HYnPXKwM0(UP2ReCuxb%0@_OnE0|fpEFN*Kg^ndQk%lG*6c4PZz>*~Y08|z&X zNd!fd>QXrPsaoyleQ10AQA3d3G>nEY5)S4tl-xWUV{foanTrS)bN7Ztlg?I?ku#Tw zCticu(A|k03v)(n{QL;}(zw(R&bg(`5x?$N@T}Q*h+nDz8K@wpj7Wt2*G|#JyCWQ7;~r_$gJuao{Tb}ezcg9EYpk}%58Q>Gt)(dfah8^s!6N4_k7aIsPvO0Kb^qat z*P+-zR#35WyJ^sBbiQ`8`%7n4py_R?y|%;adiM+K-+usz2E#fyjd9YOyELE@Tv#$W zsV^wd*MbvareI+#a3YL^>$cDO!|!W_bIV_$H@_ea8er{ikTv7AxBBx&AM0PAvcynr%aCX;cZx))TuCNsuO=A!B9ZvA?7OqmxHvA-5_c< ziKG(%6E-Y1)6uo6F~Lq&&s0vZUKa>`>K9l0c(zc4b}nvjtpOD(@o-Y*9ha0XZk1Ke zaID7f&Skw$<=`YO35* zF_ zZd#jEHJ!!J<3iPmj@pQ5g@@;8fqdDXfE^`Ze5ShIe!9$L64&gRG)1}z;3EY)KI|wF zBgCyeM?+n|GXDcB-|UrR)^Ox2r*c5>+_M#$6QC0uqG4dbSG`J2UxMxvKj)UDWH!O0%{v+cCSF;78+G zAmx}!j@wKH%PG7$zE0oXyXgNc34+^q?4s_0KvkAt9zOhxOJ{fFr^5|Ocf>bb_#?{z zJaDyj+1GTl${^xb6BDUDnaQj&GM@sHHb}S1>8J0Mg|{0B7A-TO&t}8JKb_T*7L(<7 za#KZV(fd5B9YRS>GiKJ)In@*OnJ?T^wfSyVmMq?-t2ksfPMlaH&tj6+Q?+Z-rzcOv z=ajP>cA>`ZgpD+2);_O)x#PdL?M7&D035FapbMEOu!BE`i9lr4u zzPlU@ss0ZDa4itHAK+h8d>7;Ezm`ax8E>k8J;BxV7B){!jf6H)k#eq=)Q~T}Ozot$ zq^A42FtD=Y;t|VqqL2z6Srde3T6^a8k)}DS|hSeEMn(s z;qC4735wgJ4s&*Xqi@X3hkd@U_YOMf3%=W-ii4=a-jBs6#E&_22E z(zpFqsVDrX$VfNHee@(gw72WkXOYWnP(zp%pU7^5Vx6xvNyFnM>Ykr5AwFzmI=vXTHDxJzNM| z6}lzj+AQFnvVT6#Xl9+sTGPIAGK!{4Zf#c8*DAwAHjxLSOs-n;PKos<4TfdYt zP3t|5yE|4M|J`)ABF%dp>-tXs;3&MM7p~3S#*}zBh2ov`W_}P{gF_&JPIG#22$Uc0 zxj2~$g)JulK~&VtDjhw9$N4L>G{2(~_pD|RV|@LlY}AlCiBjPTKGZt{zm{25T{x%I z=DfKjtKTjAd`55Qb}M>|5LjGKB7ak@9QlqM#SHEKye2LBj1Mm#@xZY3HMK{^H7n`J z>sB;&l5D0rOrl5q3P~=rRJK?ns&qhbVG@C28H&MdqyOPeHkEDCO66v}o9Zd&D`EZa z6;-uf?_OP3n#h;$YiIPFPnrH-zdnE6`JSt+sBeLBUdNiP#%^zT%>|kr=&yxIPj!R* z$)LNn1JTdOAcPe$wUf6CKiuoZ^hrUUDbmh^Q~wKlKyrU^*!p}7Lmr=1Tvc65TG+{L zQu&EWVcjEqu{Kbz`1L$9&!3$Jh`3_WM7SSrN0XD=*s0?YMLRWJr0uYAvmZKz+-N(9 zJYG={0BSaH-dVO?tC96E%{5pR`IPjj#H}W=LbJ;Zo8^i=;fkFKpQbqwIX`X`kI5O-vtRbljf*88M$fUwVZ>{J)GxIg^ z(|wH*Lu`GL*ENZ6$if{-DA#w(TX=Ake3&RRhL58uTHb+$IX*F=@>yF*RV{e+Y7{p% z?tOaYpHxzg9c3lXNLQ$GbJJ}SyoFO)D+>qFKC?8o*D_cVPvGZeI<6HDwYv;Xr87-5 zJaJ8(R1{7d+xB(I5BV9X2sBf?Dg>y>{iKF(N z@tw_1YKA>p@w3;+wwk3eiT)%6+DlD52;@p$tj=}q+PVc1EWD2Vbc%!)P44m|uYh?|_272{^XiU#al9 z%oT3m8e^tNWen>HXl0~I1?x;nS#pG`qh^zVdQrNs1v9He!vpb{v+Jknr$qui)uy+< zE$2Z}c%}tEl~K@jg**Yp@`DhXkpt5Vf6bWHc|IDRL*rRer4%5EaWK<{&!iw3QDRoFY%$2b8%k?5bKFYfZERTdcp4bu%H{QNphZQfR32^(sI^G#Bay!xgJ}Vq z>Xx@O>o0B;$Ef7tlp6Mi2>N(><1~2ADR-IwH08X~<{ttTpR5FZ?QryacH3LsnOJ9C zG7f!IZB*ummqBlkN@0@&W5YuN^J4hdL zkg2CdCb3qmtGxS=kJB3AymHf9G;_ zym`L1oSO9+FE2}qP;Z&u!z4mc=P2_YDzmZpTt)vZ3A0QTo*N1zEleCW{s|PPqT*4c z{lrGa4| z3HXx$NW`quXp|pi&{;TL5~8{n&`y3S{Q#|zD5(pBkMNyWi910=Ots%!4*XedrfP+vzaSI8 z_bT4N`Sy%wKxZLrj<}wO+}|La$-k#vi7P*vmP9^xCTO zGHa|Q!A~mKQz#6+mKnkZK~b@n3BJFx3xekQo5pfb7#PsAG3frh%i&r}xm z)U+Pkwj&G%C(~mLDRE7|`_6iCT|;4wP8D*HhK62ai1CnFr0G*b=gIFryHGW(C>_G# zQnQQ!Wyck_jq2a|uHv^qL0d8C$Pk>Iz;mmvGsh}(zYT>17I~pjy7VsFgZYxseiuU>og4e zTSTxU+OBBR-k-;aNqb4eWGx=+wTj45XF;L5wJr`zP((^}49g~fm zMMW!~n#OrRpLX7bX&}SkDCQO&el8_ZXE-82L#Ee3JgQfi+%KqY0l0zXaH1(w1Z8(> z8E{qN9i9)HVa5CBh^LK=AE718g;uSE63CgWnKJ6;EGg*|MNy_P+q%j8=*v6(!28HB z42OUy!qJE)8_2TcD+Cg&TFTe|HOROx6XsyURHu7w^Bck>iDt7jErb z&JIAZ^6)f0LB=YS?2if2b0PigE5RR=BYRYbb=k~)Vd+z4_1E(p8oGTu$~WoB`gVrOxy#d^ zO3ZyC@)oO`X+;|&_1#T-do!{81x;;lUCIq_Y5xE)fPmu*>sQk9lFxz@MUTm854Tg|_q|6U~LB&zngO*?C+;2SqG4atZ z>CLBOebeD*Brbw8mdBp1MFdKwk22J<5H|;J*^gDo6;8#u5>%HChubOuuE`Ql&egK8 zq}%+d;<+f*WTS%|5l#<=Wrj1AO`3=2uBj&7zGini9cdbV@z14f{*|aH1c8BLq#iBB zPbLxa>z50lUeSd+mPyf~+Ro)oRuWXQ=e#7q$)BsR zvy!H-xXD^~YE-f6$8Y)Kw-wNL=G>=n{r#za=r^*KS5z>YW-srykuvA6g~My=8C zogh+Q(S3&iZZ-Dv9|X}>_pX%T=1qZq_iW1^BMd|@sWbvX{B<-9qv-_387!8lu$B_= z!<}3Kjq!OQ5GL^h#SqG<79pqXB;!A2W2=*GLzgH~CWh~MTlWV|t*UZm;!{)ICn;hG zYV(ls6)K`F+5s_;I{5%fH4Z4LXEMjC=Yy6x!7BO|HToOh?6y&ncWdj5Q)e$!NfD?BI={p9!roCkDWh__+!t=XRE^pmMWcOF~8 z%SzR+zZvB<&cYB#|v&cq|F-xn5pjwfQSxqXCSd)_2((ikfw89oRBh zx1x*nJI=0Snp`Ejai3M6-nXDNPT#_u(d#MBP!0%OOc32tDuktk9A5#Gv^Zb>?{?f> z`Y)R0QUi@9%09eC?S44ZM$bHa{A@KWfQY5<+T%~arP2xu@x@^qgcX~VQi{$|`s!#2 z!m5fF*-?XVL_M5bBx6Sj z5N03+>wBue#7NZ<3|w{9yC=|DAswbE%fcxs-$^Wv$qNbo9XV?AM3ZPlUPu8bo7olc zPDp-+=XR3!IH(%CjE&%^ZFz2436%Mi+z?p;<*`kUWi`36nl(6al=ur|Hg!Y&X*|0OWj`hz zH3`%8@wvq~C&e&_DVb8)VB+9D8E$5p!V{56#-(8Gq{`u>LK7szb2zHolkvFdRDWUA z!yS`w;6mE;HI9NQhH&8+ zK|)9eRmo*)s#F4Z69;kd5Y(S{SId?Yi;h?(C#Fu-Pp7H+coMuHjU!AcO(&2fr3PHb z&4ICA!sTJmkC8j?QMci8=tP2sK9xfZ87Y~G7_ug~VCT}$=_-!d8n5`ehM56Z#A!IPFZL=#u- zfmg%$2Y@UDTyc<854wWOYQuOlxE6?5N`W@e} zc|fc{Po8DQU4h-s%-*c7oY0(HgD=j*+BlV#V!Sn9^oggug@~0FpzpY^g(>gHi#fVW z&m}~}!RVvo3XR^DjDGNZ3={i-*k^oFW}F!doC^|w|&n{8AL|R0XF6D z(o}den%yDC2_4QFPS6*W9rB>WF(QV(K@NicLmf`z6nTQ*Q{v*QSz_9lsdls^ubxX( z8CCOzLF2XcvBriyS(jLH!h(i|jJRsOT6~zWW9U`g#9ljnluueBvgT4a;bq$H=y}*} z0=1QHIk5}aSoOEF<-*>yfW{fy=Ssf6+P62qZJUf!*1B`=7X1oaGJ%n`)=zkqtX6%E zI#*qsa4lIt8(L(!iGayyTP|EkDM$&l70yI!_Xa&|tcf)2{vkY34N}A-TG)^xkN!JY z**FwJeZ-Q)1ccbgXz`KM4cA~qV$Fp*2r5tvG6qU?RFU={Bo;*&lYM43B63P*P7EA6 z7iy^!sq*Oe7j}Zov3&ULA7nw;VWV>I)zDK!VGqv_J5o1N8C%E*UFR^s(-vcCvI*1cz@ipo$UDgrTr;L z%?ieh<7NNOL2dBTjQUWvpB@`t~+FCTOmH+t53RDZzm-g zlj;G)?eu)MtePx|SG-b5`x6tpc@%%)TKm|~98Y>ix|Asquafe$8tX5A&c4|+#je@5 za5RaAS9(&`da-v+cZQXKPU}_3qS7q>r`v(951WcIH z;#IbS73fm$-5tddBLQFLpDM)X@~Y>ordEph0Wpa3HhP#?lmOVA*r7>P^z->md-TSG zg?XXmKh~lBz3E<1yNLT82mytaYT%Gs?k?wt?I;py;ePal`KC5~(LT>39P#A2Yjc5!M)$!! z;TAC^{!ks)<((77VHEznTIg==pso2LDk_Ev)YpP;{DfzdR8||YkY26a6*F{0(s`km zy;`uHnm$0PS=W93%K4t&q1^b>`*wP6h9k%{x~*qU%2j4w8tgm-mKq3U-l(b1&SZFViD0}U`hM>I}HsQ5;i8R|4!du;`qYjpw( zo7OcBJ99HR(>+~*Euu%iG6Jk<@KmE~FM_+Ea^3hG5_P*A^h50;FR`8UjPy!>7QX~U zl~uU~weI*<<*|RxAXQeVS8$veWD;T`A|2He^8E0xUH!_(H0k*GlWFrNI>6xusBD1Y zrrFF$F_Ix#8NPeqQT$S6L9gMm%h{=1qybuR&@$GVcA|64y7o$C{*yIIF*Gc^qEi4p zp8n_rxQOp}E#+!=?M*eNw$=L}*lU{W1h(3vX({{zKotTOR$cpwz~79 zL8wmXraGPue6!fww8n83Gp5YlMy8(bH!G9H9jEBj+=xq}HrbZop`s?xZe;ig+y}Mt z;t`mHk`NI+9MaD3NDNEplRB9vqqu<^`&&Wl+0fgOCsg-lWz=kq4xrX(IJ^2{UrYrRNm*wHP!WW}tAG^UgnMf3Le{*fSV`%~`2vOnn5AOFconu} zikpWUOUnk{6*5!l+=JSnqO|qoviKJzbG1Nw%$Q|3$F_y1t-kV0u+&ZY^y=>fflX`G zU1Kf;Pfxvj+*5Bv16?8Rmv^<6&R}Hzd`=a`{Z(Rp0v%6d`9httCiK1UEH6f+XZs>K>S8;LD z4nywmu7M9tk2F-uj&hTO(TCM0>SjtB`t(JLv);4@nQa^bjue0hFg>(q^$ z&GV|xi!%G{F0RyKpw;Z6-irj~>+T0ki3Dq1-~UW<{a=2`1DnJI1FdwUWS0p_>k+qC zX?AEeVnM#aBPSg@p&lsgVm1?)r_bT-odaQ+orESsshP3GA2aqBqgXw zuh>`xVp^aEwi3(uc$4TgB4QO_AI|snxd0Ru=u=7sl_i+PYGuXiUpd;!V}IBkksK%u zf}XW&6X{kpNFA>`m`c&ySe+W{zqEBU_W^^RCfiTwj*}$@6>?v*4xAyfAs}Ee4yCnI zQ>sW?ooK;l_z$A=`GlCE(5(OA6c0{>k!vVlshHbU#=P#>UOQ?bS_;$&B~*{F(0XPy zwJr2O4nydsw{TGRH5ZqisMq<8s)5K$NYute47d-6Z!1KS>)It6#BaS3W0x%@S{A5f zwEbQ~)7-U{7vaXn6?CQ%wJF*a1Ks0Rg;Nkl_(Ifc_$Odw=@WU5fC1ll{vdb+aaTrq zcrAZ#c{0xM-D4Cu|Iw;F3}e9B@}}%qT>^cCu3iFBu1O%rM+gA{NdU*=1ezQ$qdq>O5~WbB_)2=G~efi@bB_Bl}0~nr(Xy2 zqF;Zik?Nh=V=N~U>y>PBI~YavP#GF?hepYq$<;3_^o{GeYAo>pcYpRdYk(xfGcxu$s0Q#WD zv>*#y%d<&d>uD30e)Ca=s%V?vS%Q-O$|m`Uw9z?(Hg%szw3+YYm>7^viH=1=|Cub% zFC$t;p=N90G-!3Tebce_k1^)|WwQVOu4#k-M-W@mvKXHjnj}+Cry$HAqiJQTDL+sN zr_4FLt3*I!5(>7ZD)Jk{20lRnJ?ud}dOa8l8z07_nV%c>hSGFRE4<&fQS+W-?-hlh zl3i!34B@t(^%6Hd84M_fd!Q1RhGoPYdS23s-+n1oTLyS}yAP~Vjn)c&8I1i%ROT@< zV`?(gw`U~D9C;`jDliqB`KW{DAE8j`@e7=STG`>O4Rkh!iGDVYw&4J$^eB-c=!vLK zc+id2mT0pRi?^gzb#N(EGRLXN?v__rZqfIZSZFUAZjS8-i&(;7sqb)GkFqp!+SnYH#WnKjYM)7MW+uesAp!p@xEeRHMuA>>%_tfL7b zII!Me6LJtunyC9%$x3M8pt>UH|G=7Fx@diqp{gaBjNi1)v0H(>x9By+m)1#0(QlvO z98WQ>G}Hf_$#oK$rOQ&kEYViPk5#;z zlfwr%nythA{GZix(ejHj32rsN`TvZ}_Z6V*jV#aUH{z>fIW@4y8b|+jfl_SA#_f6v zzf9SbYrIKVjF38M6fBzeWWC#dy%1tZX?+4!G9{gmr7K#O@ z%;Zo|C^{nXyuFgQr&?KVk?yq>*zrIAs6z%Fvya2y#m`O_1z4&9cTbqU-etJuB$2gc zu;*~Ji)m}{11x~uf=`JDz7AIS`18ABR(e)C6e#dlZ31usLM;@DOwS4WM|>3~w)K>O zO~-3Jxx^$!JMXOrH~8Pf1U8+lud!|$3wXX@*=y)G^Nsc0=Z@Duix#FV#DtH72aV{8 z%c$cLXivZH*_DyypWPb#UjV3SDPQUO+f_`-?btIpYF)^ERsx4W4b^}PFaX04Xx>zP zXcXtb8)%}n(pDqWMlYV`tr!K=aXUe9djdmBRClfIYhGRYH7n2*^hIkSc6d(wlN>B` ztbH+G%FV-zmucgj(oCNU=~#)Zx9kMO-NSG; z9^F@+9=d=~$A=o{UN4j5K3v!FGI@QeUB znxon^Cm(#gMq|3?WOW+}g)?=OQ3q^zW^WtcVp|C+qK5Y?KrbKYFVoA)%7J*&(za$cQmz`E2SF_hxKqWSS{#= z8~zmcvs=$|HC@4yp(UZOlms9q`1Z7R+Wg2`_LU{(tR1Hz*geXDukBKzD8*ydd|DwaHf&!!xx}2w;dq*#{0tY~`EEPdBy|UV z`9KZFPj^H>PO;gLs)v@sOes_uN~0KBpnX|j7`_t^IpJUsh)iI&ci*-uK{%6$<(j|E z0vdR2*XuCJ^WfQo&|bW{{Iy+@-N^d22Gw}Iggn{uc;l5ciSp}sXqg0PNd4#1P~+AI zY?~0?D4)aRD+(U7w=Z7uk2)M;j(Lg%AG#hLw?`^VEIl_?@hO%0vnJH%;|*}B!U*My zZmEvQs#h9SEcPl-z1sVPF4)-@ME`FDm_R^4iK1bBe81PWB1a(ky6S080E32vlL9@> zLczJu*9o8xg#wTVo8BE#j5uhxCVQb!!s;=0ep4agI;mt-t-kxN$euwp5gd#IA*g+b zw^im@wKO~QFcPMO;cWFw5loj5>>b zRy&!g(BBdk@Sgy{{m_-y$n`h5P@Ir=cXq<1(c$~I37!H2P}$VRyRr@Y_4mxre1G|r z3Vl3LDS#3R8DFuVVdzr}#acgj7X(29fPkv~WvMtAY@T*Dhv3L2OA@Ufa!N=T0zx8* z1t7p@Kd=`pC#N%)?8S#xu|v@7isRxFmM>dNLeddRZ|ibW>x%{_SE(~~Vn(}dxp;la z`kHk-(~T#h@s!3zuqfoBh5YMdptmk|g@XavjVyw9toYoAK7Q0w%-zK<`aXPATSA#D zKb(v#Xk@!G^HXHr2&)6*!|U78PiMj+_9A^_+ZKy&q(}4$mj)+_`H8!)o<8xDJ9Ukm z-^+qFr)z=70)1nvAIydR>V=;1#bmYli zEOs!VbfUnCIuXsKFi+-zvA}h=1|N;tgEY~ozQKRNgH;?Tc}2XAiI(C*`i8pAqBF*r&B1*|>s?ulio zM)@dsd9utFZ8Ks~C0jCzM*NPzLS^Z*6rY5Zp(K_@=gKi*g40D5jhPAZ5r�%WcoH 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%0AVwlg3@f7iDV^xZE3#Kp0>5x(QOUMM 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 CN0}%9 literal 0 HcmV?d00001 diff --git a/voip/static/src/ringtones/ringtone_service.js b/voip/static/src/ringtones/ringtone_service.js new file mode 100644 index 0000000..766d5f6 --- /dev/null +++ b/voip/static/src/ringtones/ringtone_service.js @@ -0,0 +1,38 @@ +/* @odoo-module */ + +import { registry } from "@web/core/registry"; + +export const ringtoneService = { + start() { + const audio = new window.Audio(); + const ringtones = { + dial: { + source: "/voip/static/src/ringtones/dialtone.mp3", + volume: 0.7, + }, + incoming: { + source: "/voip/static/src/ringtones/incomingcall.mp3", + }, + ringback: { + source: "/voip/static/src/ringtones/ringbacktone.mp3", + }, + }; + function play() { + audio.currentTime = 0; + audio.loop = true; + audio.src = this.source; + audio.volume = this.volume ?? 1; + Promise.resolve(audio.play()).catch(() => {}); + } + Object.values(ringtones).forEach((x) => Object.assign(x, { play })); + return { + ...ringtones, + stopPlaying() { + audio.pause(); + audio.currentTime = 0; + }, + }; + }, +}; + +registry.category("services").add("voip.ringtone", ringtoneService); diff --git a/voip/static/src/softphone/activities_tab.js b/voip/static/src/softphone/activities_tab.js new file mode 100644 index 0000000..3c676b1 --- /dev/null +++ b/voip/static/src/softphone/activities_tab.js @@ -0,0 +1,68 @@ +/* @odoo-module */ + +import { Component, onMounted, useState } from "@odoo/owl"; + +import { ConfirmationDialog } from "@web/core/confirmation_dialog/confirmation_dialog"; +import { _t } from "@web/core/l10n/translation"; +import { useService } from "@web/core/utils/hooks"; +import { isEventHandled, markEventHandled } from "@web/core/utils/misc"; + +export class ActivitiesTab extends Component { + static props = { activities: { type: Array }, extraClass: { type: String, optional: true } }; + static defaultProps = { extraClass: "" }; + static template = "voip.ActivitiesTab"; + + setup() { + this.dialog = useService("dialog"); + this.orm = useService("orm"); + this.activityService = useService("mail.activity"); + this.voip = useState(useService("voip")); + onMounted(() => this.voip.fetchTodayCallActivities()); + this.state = useState({ hoveredActivity: null }); + } + + /** + * @param {MouseEvent} ev + * @param {import("models").Activity} activity + */ + onClickActivity(ev, activity) { + if (isEventHandled(ev, "Activity.cancel")) { + return; + } + this.voip.softphone.selectCorrespondence({ activity }); + } + + /** + * @param {MouseEvent} ev + * @param {import("models").Activity} activity + */ + onClickCancelActivity(ev, activity) { + markEventHandled(ev, "Activity.cancel"); + this.dialog.add(ConfirmationDialog, { + title: _t("Hold on!"), + body: _t( + "Are you sure you want to delete this activity? It will be lost forever, which is quite a long time 😔" + ), + cancel() {}, + confirm: async () => { + await this.orm.call("mail.activity", "unlink", [[activity.id]]); + this.activityService.delete(activity); + }, + confirmLabel: _t("Yes, do it."), + cancelLabel: _t("Missclicked, sorry."), + }); + } + + /** + * @param {MouseEvent} ev + * @param {import("models").Activity} activity + */ + onMouseEnterActivity(ev, activity) { + this.state.hoveredActivity = activity.id; + } + + /** @param {MouseEvent} ev */ + onMouseLeaveActivity(ev) { + this.state.hoveredActivity = null; + } +} diff --git a/voip/static/src/softphone/activities_tab.xml b/voip/static/src/softphone/activities_tab.xml new file mode 100644 index 0000000..95f465f --- /dev/null +++ b/voip/static/src/softphone/activities_tab.xml @@ -0,0 +1,18 @@ + + + +

+ +
+
+
+
+
+
+ +

No search results 💔

+

No calls scheduled for today 😎

+
+ + diff --git a/voip/static/src/softphone/call_invitation.js b/voip/static/src/softphone/call_invitation.js new file mode 100644 index 0000000..57cf208 --- /dev/null +++ b/voip/static/src/softphone/call_invitation.js @@ -0,0 +1,34 @@ +/* @odoo-module */ + +import { Component } from "@odoo/owl"; + +import { Correspondence } from "@voip/core/correspondence_model"; + +import { useService } from "@web/core/utils/hooks"; + +export class CallInvitation extends Component { + static props = { + correspondence: { type: Correspondence }, + extraClass: { type: String, optional: true }, + }; + static template = "voip.CallInvitation"; + + setup() { + this.userAgent = useService("voip.user_agent"); + } + + /** @returns {string} */ + get partnerName() { + return this.props.correspondence.partner?.name ?? ""; + } + + /** @param {MouseEvent} ev */ + onClickAccept(ev) { + this.userAgent.acceptIncomingCall(); + } + + /** @param {MouseEvent} ev */ + onClickReject(ev) { + this.userAgent.rejectIncomingCall(); + } +} diff --git a/voip/static/src/softphone/call_invitation.scss b/voip/static/src/softphone/call_invitation.scss new file mode 100644 index 0000000..baa2a0b --- /dev/null +++ b/voip/static/src/softphone/call_invitation.scss @@ -0,0 +1,7 @@ +.o-voip-CallInvitation-avatar { + width: 80px; +} + +.o-voip-CallInvitation-reject { + transform: rotate(135deg); +} diff --git a/voip/static/src/softphone/call_invitation.xml b/voip/static/src/softphone/call_invitation.xml new file mode 100644 index 0000000..cb97a8f --- /dev/null +++ b/voip/static/src/softphone/call_invitation.xml @@ -0,0 +1,21 @@ + + + +
+
+
Incoming call from…
+ +
+
+
+
+ + +
+
+ + diff --git a/voip/static/src/softphone/contacts_tab.js b/voip/static/src/softphone/contacts_tab.js new file mode 100644 index 0000000..d22c047 --- /dev/null +++ b/voip/static/src/softphone/contacts_tab.js @@ -0,0 +1,30 @@ +/* @odoo-module */ + +import { Component, onMounted, useState } from "@odoo/owl"; + +import { url } from "@web/core/utils/urls"; +import { useService } from "@web/core/utils/hooks"; + +export class ContactsTab extends Component { + static props = { extraClass: { type: String, optional: true } }; + static defaultProps = { extraClass: "" }; + static template = "voip.ContactsTab"; + + setup() { + this.store = useState(useService("mail.store")); + this.voip = useState(useService("voip")); + this.orm = useService("orm"); + this.personaService = useService("mail.persona"); + onMounted(() => this.voip.fetchContacts()); + } + + /** @returns {string} */ + getAvatarUrl(partner) { + return url("/web/image", { model: "res.partner", id: partner.id, field: "avatar_128" }); + } + + onClickContact(ev, contact) { + const partner = this.store.Persona.get(contact); + this.voip.softphone.selectCorrespondence({ partner }); + } +} diff --git a/voip/static/src/softphone/contacts_tab.xml b/voip/static/src/softphone/contacts_tab.xml new file mode 100644 index 0000000..aa14fc9 --- /dev/null +++ b/voip/static/src/softphone/contacts_tab.xml @@ -0,0 +1,15 @@ + + + +
+ +
+ + +
+
+

No search results 💔

+

Contacts with a phone number will be shown here.

+
+
+
diff --git a/voip/static/src/softphone/correspondence_details.js b/voip/static/src/softphone/correspondence_details.js new file mode 100644 index 0000000..0ead714 --- /dev/null +++ b/voip/static/src/softphone/correspondence_details.js @@ -0,0 +1,274 @@ +/* @odoo-module */ + +import { Component, useEffect, useRef, useState } from "@odoo/owl"; + +import { DeviceSelectionDialog } from "@voip/mobile/device_selection_dialog"; +import { TransferPopover } from "@voip/softphone/transfer_popover"; + +import { isMobileOS } from "@web/core/browser/feature_detection"; +import { _t } from "@web/core/l10n/translation"; +import { usePopover } from "@web/core/popover/popover_hook"; +import { useService } from "@web/core/utils/hooks"; +import { session } from "@web/session"; + +export class CorrespondenceDetails extends Component { + static props = ["extraClass?", "correspondence"]; + static defaultProps = { extraClass: "" }; + static template = "voip.CorrespondenceDetails"; + + setup() { + this.action = useService("action"); + this.activityService = useService("mail.activity"); + this.callService = useService("voip.call"); + this.dialog = useService("dialog"); + this.orm = this.env.services.orm; + this.userAgent = useState(useService("voip.user_agent")); + this.voip = useService("voip"); + this.softphone = this.voip.softphone; + this.transferButtonRef = useRef("transferButton"); + this.transferPopover = usePopover(TransferPopover, { position: "top" }); + useEffect( + () => { + this.userAgent.updateSenderTracks(); + }, + () => [this.userAgent.session?.isMute] + ); + } + + /** @returns {import("@mail/activity/activity_model").Activity | undefined} */ + get activity() { + return this.props.correspondence.activity; + } + + /** @returns {boolean} */ + get areInCallActionsDisabled() { + return this.call?.state !== "ongoing" || !this.userAgent.session; + } + + /** @returns {import("@voip/core/call_model").Call | undefined} */ + get call() { + return this.props.correspondence.call; + } + + /** @returns {string} */ + get callStatus() { + if (this.userAgent.session?.inviteState === "ringing") { + return _t("Ringing…"); + } + if (this.call.state === "ongoing") { + const minutes = `${Math.floor(this.call.timer.time / 60)}`.padStart(2, "0"); + const seconds = `${this.call.timer.time % 60}`.padStart(2, "0"); + return _t("In call for: %(minutes)s:%(seconds)s", { minutes, seconds }); + } + return ""; + } + + /** @returns {string} */ + get displayName() { + if (this.call) { + return this.call.displayName; + } + return this.activity?.name ?? ""; + } + + /** @returns {boolean} */ + get isMobileOs() { + return isMobileOS(); + } + + /** @returns {string} */ + get landlineNumber() { + if (this.call) { + if (!this.partner || this.partner.mobileNumber !== this.call.phoneNumber) { + return this.call.phoneNumber; + } + return ""; + } + if (this.activity) { + return this.activity.phone; + } + return this.partner.landlineNumber || ""; + } + + /** @returns {string} */ + get mobileNumber() { + if (this.activity) { + return this.activity.mobile; + } + if (!this.partner && !this.call) { + return ""; + } + if (this.call && this.call.phoneNumber === this.partner?.mobileNumber) { + return this.call.phoneNumber; + } + return this.partner?.mobileNumber || ""; + } + + /** @returns {string} */ + get muteText() { + return !this.userAgent.session?.isMute ? _t("Mute") : _t("Unmute"); + } + + /** @returns {import("@mail/core/persona_model").Persona | undefined} */ + get partner() { + return this.props.correspondence.partner; + } + + /** @param {MouseEvent} ev */ + onClickActivity(ev) { + this.softphone.fold(); + const action = { + type: "ir.actions.act_window", + res_id: false, + res_model: "mail.activity", + views: [[false, "form"]], + view_mode: "form", + target: "new", + context: {}, + }; + if (this.activity) { + action.context.default_res_id = this.activity.res_id; + action.context.default_res_model = this.activity.res_model; + } else { + action.context.default_res_id = this.partner.id; + action.context.default_res_model = "res.partner"; + } + this.action.doAction(action); + } + + /** @param {MouseEvent} ev */ + async onClickCancel(ev) { + await this.orm.call("mail.activity", "unlink", [[this.activity.id]]); + this.activityService.delete(this.activity); + this.softphone.selectedCorrespondence = null; + if (this.softphone.isInAutoCallMode) { + this.softphone.selectNextActivity(); + } + } + + /** @param {MouseEvent} ev */ + async onClickChangeInputDevice(ev) { + this.dialog.add(DeviceSelectionDialog); + } + + /** @param {MouseEvent} ev */ + onClickClose(ev) { + this.softphone.selectedCorrespondence = null; + this.softphone.isInAutoCallMode = false; + this.voip.resetMissedCalls(); + } + + /** @param {MouseEvent} ev */ + onClickEdit(ev) { + this.softphone.fold(); + this.action.doAction({ + type: "ir.actions.act_window", + res_id: this.activityId, + res_model: "mail.activity", + views: [[false, "form"]], + view_mode: "form", + target: "new", + context: { + default_res_id: this.activity.res_id, + default_res_model: this.activity.res_model, + }, + }); + } + + /** @param {MouseEvent} ev */ + onClickEmail(ev) { + this.softphone.fold(); + if (this.partner) { + this.action.doAction({ + type: "ir.actions.act_window", + res_model: "mail.compose.message", + views: [[false, "form"]], + target: "new", + context: { + default_res_ids: [this.partner.id], + default_model: "res.partner", + default_partner_ids: [this.partner.id], + default_composition_mode: "comment", + default_use_template: true, + }, + }); + } + } + + /** @param {MouseEvent} ev */ + async onClickMarkAsDone(ev) { + await this.activityService.markAsDone(this.activity); + this.activityService.delete(this.activity); + this.softphone.selectedCorrespondence = null; + if (this.softphone.isInAutoCallMode) { + this.softphone.selectNextActivity(); + } + } + + /** @param {MouseEvent} ev */ + onClickMute(ev) { + if (this.areInCallActionsDisabled) { + return; + } + this.userAgent.session.isMute = !this.userAgent.session.isMute; + } + + /** @param {MouseEvent} ev */ + onClickPartner(ev) { + this.softphone.fold(); + const action = { + type: "ir.actions.act_window", + res_model: "res.partner", + views: [[false, "form"]], + target: "new", + }; + if (this.partner) { + action.res_id = this.partner.id; + } + // TODO: Missing features from the previous code: + // ─ if no partner but activity: prefill form with data from activity + this.action.doAction(action); + } + + /** + * @param {MouseEvent} ev + * @param {string} phoneNumber + */ + onClickPhoneNumber(ev, phoneNumber) { + ev.preventDefault(); + this.userAgent.makeCall({ + activity: this.activity, + partner: this.partner, + phone_number: phoneNumber, + }); + } + + /** @param {MouseEvent} ev */ + async onClickRecord(ev) { + this.softphone.fold(); + const resModel = this.activity.res_model; + const resId = this.activity.res_id; + const viewId = await this.orm.call(resModel, "get_formview_id", [[resId]], { + context: session.user_context, + }); + this.action.doAction({ + type: "ir.actions.act_window", + res_id: resId, + res_model: resModel, + views: [[viewId || false, "form"]], + view_mode: "form", + view_type: "form", + target: "new", + }); + } + + /** @param {MouseEvent} ev */ + onClickTransfer(ev) { + if (this.transferPopover.isOpen) { + return; + } + this.transferPopover.open(this.transferButtonRef.el, { + defaultInputValue: this.voip.settings.external_device_number || "", + }); + } +} diff --git a/voip/static/src/softphone/correspondence_details.scss b/voip/static/src/softphone/correspondence_details.scss new file mode 100644 index 0000000..71787a3 --- /dev/null +++ b/voip/static/src/softphone/correspondence_details.scss @@ -0,0 +1,3 @@ +.o-voip-CorrespondenceDetails-avatar { + width: 80px; +} diff --git a/voip/static/src/softphone/correspondence_details.xml b/voip/static/src/softphone/correspondence_details.xml new file mode 100644 index 0000000..cf1c8b4 --- /dev/null +++ b/voip/static/src/softphone/correspondence_details.xml @@ -0,0 +1,68 @@ + + + +
+
+ + + + +
+ + +
Call
+
+ + + +
+
+ +
Activity
+
+ + + +
+
+
+
+ + diff --git a/voip/static/src/softphone/numpad.js b/voip/static/src/softphone/numpad.js new file mode 100644 index 0000000..d5793f7 --- /dev/null +++ b/voip/static/src/softphone/numpad.js @@ -0,0 +1,67 @@ +/* @odoo-module */ + +import { useSelection } from "@mail/utils/common/hooks"; +import { Component, useEffect, useRef, useState } from "@odoo/owl"; +import { useService } from "@web/core/utils/hooks"; + +export class Numpad extends Component { + static props = { extraClass: { type: String, optional: true } }; + static defaultProps = { extraClass: "" }; + static template = "voip.Numpad"; + + setup() { + this.softphone = useState(useService("voip").softphone); + this.callService = useService("voip.call"); + this.userAgentService = useService("voip.user_agent"); + this.input = useRef("input"); + this.selection = useSelection({ + refName: "input", + model: this.softphone.numpad.selection, + }); + useEffect( + (shouldFocus) => { + if (shouldFocus) { + this.input.el.focus(); + this.selection.restore(); + this.softphone.shouldFocus = false; + } + }, + () => [this.softphone.shouldFocus] + ); + } + + /** @param {MouseEvent} ev */ + onClickBackspace(ev) { + const { value } = this.softphone.numpad; + const { selectionStart, selectionEnd } = this.input.el; + const cursorPosition = selectionStart === selectionEnd && selectionStart !== 0 ? selectionStart - 1 : selectionStart; + if (selectionStart !== 0) { + this.softphone.numpad.value = value.slice(0, cursorPosition) + value.slice(selectionEnd); + } + this.selection.moveCursor(cursorPosition); + this.softphone.shouldFocus = true; + } + + /** @param {MouseEvent} ev */ + onClickKeypad(ev) { + const key = ev.target.textContent; + this.userAgentService.session?.sipSession?.sessionDescriptionHandler.sendDtmf(key); + const { value } = this.softphone.numpad; + const { selectionStart, selectionEnd } = this.input.el; + this.softphone.numpad.value = value.slice(0, selectionStart) + key + value.slice(selectionEnd); + this.selection.moveCursor(selectionStart + 1); + this.softphone.shouldFocus = true; + } + + /** @param {KeyboardEvent} ev */ + onKeydown(ev) { + if (ev.key !== "Enter") { + return; + } + const inputValue = this.softphone.numpad.value.trim(); + if (!inputValue) { + return; + } + this.userAgentService.makeCall({ phone_number: inputValue }); + } +} diff --git a/voip/static/src/softphone/numpad.xml b/voip/static/src/softphone/numpad.xml new file mode 100644 index 0000000..b30e681 --- /dev/null +++ b/voip/static/src/softphone/numpad.xml @@ -0,0 +1,16 @@ + + + +
+
+ +
+
+
+
+
+
+
+
diff --git a/voip/static/src/softphone/recent_tab.js b/voip/static/src/softphone/recent_tab.js new file mode 100644 index 0000000..b02d7f7 --- /dev/null +++ b/voip/static/src/softphone/recent_tab.js @@ -0,0 +1,25 @@ +/* @odoo-module */ + +import { Component, onMounted, useState } from "@odoo/owl"; +import { useService } from "@web/core/utils/hooks"; + +export class RecentTab extends Component { + static props = { extraClass: { type: String, optional: true }, recentCalls: { type: Array } }; + static defaultProps = { extraClass: "" }; + static template = "voip.RecentTab"; + + setup() { + this.voip = useState(useService("voip")); + this.orm = useService("orm"); + this.callService = useService("voip.call"); + onMounted(() => this.voip.fetchRecentCalls()); + } + + /** + * @param {MouseEvent} ev + * @param {import("@voip/core/call_model").Call} call + */ + onClickPhoneCall(ev, call) { + this.voip.softphone.selectCorrespondence({ call }); + } +} diff --git a/voip/static/src/softphone/recent_tab.xml b/voip/static/src/softphone/recent_tab.xml new file mode 100644 index 0000000..57cb969 --- /dev/null +++ b/voip/static/src/softphone/recent_tab.xml @@ -0,0 +1,18 @@ + + + +
+ +
+
+
+
+ • +
+
+ +

No search results 💔

+

Your call history is empty! Make a call now and have it listed here 💡

+
+ + diff --git a/voip/static/src/softphone/softphone.dark.scss b/voip/static/src/softphone/softphone.dark.scss new file mode 100644 index 0000000..1db00e0 --- /dev/null +++ b/voip/static/src/softphone/softphone.dark.scss @@ -0,0 +1,3 @@ +.o-voip-Softphone-topbar { + --voip__topBar-bg: #{$o-gray-100}; +} diff --git a/voip/static/src/softphone/softphone.js b/voip/static/src/softphone/softphone.js new file mode 100644 index 0000000..19ad688 --- /dev/null +++ b/voip/static/src/softphone/softphone.js @@ -0,0 +1,265 @@ +/* @odoo-module */ + +import { Component, useEffect, useRef, useState } from "@odoo/owl"; + +import { ActivitiesTab } from "@voip/softphone/activities_tab"; +import { CallInvitation } from "@voip/softphone/call_invitation"; +import { ContactsTab } from "@voip/softphone/contacts_tab"; +import { CorrespondenceDetails } from "@voip/softphone/correspondence_details"; +import { Numpad } from "@voip/softphone/numpad"; +import { RecentTab } from "@voip/softphone/recent_tab"; + +import { _t } from "@web/core/l10n/translation"; +import { useService } from "@web/core/utils/hooks"; +import { isEventHandled, markEventHandled } from "@web/core/utils/misc"; +import { useDebounced } from "@web/core/utils/timing"; + +export class Softphone extends Component { + static components = { + ActivitiesTab, + CallInvitation, + ContactsTab, + CorrespondenceDetails, + Numpad, + RecentTab, + }; + static props = {}; + static template = "voip.Softphone"; + + setup() { + this.store = useState(useService("mail.store")); + this.voip = useState(useService("voip")); + this.callService = useService("voip.call"); + this.userAgent = useService("voip.user_agent"); + this.searchBar = useRef("search"); + this.softphone = useState(this.voip.softphone); + useEffect( + (shouldFocus) => { + if (shouldFocus && this.searchBar.el && !this.voip.error) { + this.searchBar.el.focus(); + this.voip.softphone.shouldFocus = false; + } + }, + () => [this.voip.softphone.shouldFocus] + ); + this.onInputSearchBar = useDebounced(() => this.search(), 300); + } + + /** @returns {string} */ + get activeTabId() { + return this.softphone.activeTabId; + } + + /** @returns {string} */ + get callButtonTitleText() { + if (!this.softphone.selectedCorrespondence?.call?.isInProgress) { + return _t("Call"); + } + return _t("End Call"); + } + + get firstItem() { + // FIXME: items should be correspondences + switch (this.activeTabId) { + case "contacts": + return Object.values(this.store.Persona.records).find((p) => p.hasPhoneNumber); + case "activity": + return this.softphone.activities[0]; + case "recent": + return this.softphone.recentCalls[0]; + default: + throw Error("Cannot get first item of current tab: unknown tab id."); + } + } + + get icon() { + if (this.voip.hasPendingRequest) { + return "fa fa-spin fa-circle-o-notch"; + } + return "oi oi-voip"; + } + + /** @returns {boolean} */ + get isFolded() { + return this.softphone.isFolded; + } + + /** @returns {boolean} */ + get isOnSmallDevice() { + return this.env.services.ui.isSmall; + } + + /** @returns {boolean} */ + get isUiBlocked() { + if (this.voip.error) { + return !this.voip.error.isNonBlocking; + } + return false; + } + + /** @returns {string} */ + get numpadButtonTitleText() { + return this.softphone.numpad.isOpen ? _t("Close Numpad") : _t("Open Numpad"); + } + + /** @returns {boolean} */ + get shouldDisplayCallInvitation() { + const call = this.softphone.selectedCorrespondence?.call; + if (!call) { + return false; + } + return ( + call.state === "calling" && + call.direction === "incoming" && + Boolean(this.userAgent.session) + ); + } + + /** @returns {boolean} */ + get shouldDisplayCorrespondenceDetails() { + return Boolean(this.softphone.selectedCorrespondence); + } + + get tabList() { + return [ + { id: "recent", name: _t("Recent") }, + { id: "activity", name: _t("Next Activities") }, + { id: "contacts", name: _t("Contacts") }, + ]; + } + + /** @returns {string} */ + get topbarText() { + switch (this.voip.missedCalls) { + case 0: + return _t("VoIP"); + case 1: + return _t("1 missed call"); + case 2: + return _t("2 missed calls"); + default: + return _t("%(number)s missed calls", { number: this.voip.missedCalls }); + } + } + + /** @param {MouseEvent} ev */ + onClickClose(ev) { + markEventHandled(ev, "Softphone.close"); + this.softphone.hide(); + } + + /** @param {MouseEvent} ev */ + onClickError(ev) { + if (this.isUiBlocked) { + return; + } + this.voip.resolveError(); + } + + /** @param {MouseEvent} ev */ + onClickNumpad(ev) { + if (this.softphone.numpad.isOpen) { + this.softphone.closeNumpad(); + this.softphone.shouldFocus = true; + } else { + this.softphone.openNumpad(); + } + } + + /** @param {MouseEvent} ev */ + onClickPhone(ev) { + if (this.softphone.selectedCorrespondence?.call?.isInProgress) { + this.userAgent.hangup(); + return; + } + /** + * The auto-call mode should be turned on when clicking on the call + * button from the “Next Activities” tab without anything selected. + */ + if ( + this.activeTabId === "activity" && + !this.softphone.numpad.isOpen && + !this.softphone.selectedCorrespondence && + this.firstItem + ) { + this.softphone.selectCorrespondence({ activity: this.firstItem }); + this.softphone.isInAutoCallMode = true; + return; + } + const callData = this._getCallData(); + if (!callData) { + return; + } + this.userAgent.makeCall(callData); + } + + /** @param {MouseEvent} ev */ + onClickPostpone(ev) { + this.softphone.selectedCorrespondence.call.activity.postponed = true; + this.userAgent.hangup({ activityDone: false }); + } + + /** @param {MouseEvent} ev */ + onClickTab(ev) { + this.softphone.activeTabId = ev.target.dataset.tabId; + } + + /** @param {MouseEvent} ev */ + onClickTopbar(ev) { + if (isEventHandled(ev, "Softphone.close") || this.isOnSmallDevice) { + return; + } + if (this.isFolded) { + this.softphone.unfold(); + this.voip.resetMissedCalls(); + } else { + this.softphone.fold(); + } + } + + search() { + switch (this.activeTabId) { + case "contacts": + this.voip.fetchContacts(this.softphone.searchBarInputValue.trim()); + break; + case "activity": + this.voip.fetchTodayCallActivities(); + break; + case "recent": + this.voip.fetchRecentCalls(); + break; + } + } + + _getCallData() { + if (this.softphone.numpad.isOpen) { + const phoneNumber = this.softphone.numpad.value; + if (phoneNumber === "") { + return null; + } + return { phone_number: phoneNumber }; + } + if (this.softphone.selectedCorrespondence) { + const { activity, partner, phoneNumber } = this.softphone.selectedCorrespondence; + return { activity, partner, phone_number: phoneNumber }; + } + if (this.firstItem) { + // Note: would be simpler if all tab items were of the same type (e.g. correspondences) + let partner, phoneNumber; + switch (this.activeTabId) { + case "contacts": + partner = this.firstItem; + phoneNumber = this.firstItem.mobileNumber || this.firstItem.landlineNumber; + break; + case "recent": + partner = this.firstItem.partner; + phoneNumber = this.firstItem.phoneNumber; + break; + default: + return null; + } + return { partner, phone_number: phoneNumber }; + } + return null; + } +} diff --git a/voip/static/src/softphone/softphone.scss b/voip/static/src/softphone/softphone.scss new file mode 100644 index 0000000..bab64ac --- /dev/null +++ b/voip/static/src/softphone/softphone.scss @@ -0,0 +1,30 @@ +.o-voip-Softphone { + z-index: $zindex-modal - 2; + + width: 300px; + max-height: 100vh; + + :focus { + outline: 0; + } +} + +.o-voip-Softphone-topbar { + height: 36px; + + background-color: var(--voip__topBar-bg, #{$o-brand-odoo}); + color: #FFFFFF; + +} + +.o-voip-Softphone-error { + z-index: $zindex-modal - 1; +} + +.o-voip-Softphone-tab { + height: 360px; +} + +.o-voip-Softphone-content { + min-height: 440px; +} diff --git a/voip/static/src/softphone/softphone.xml b/voip/static/src/softphone/softphone.xml new file mode 100644 index 0000000..1da5809 --- /dev/null +++ b/voip/static/src/softphone/softphone.xml @@ -0,0 +1,43 @@ + + + +
+
+ + + + +
+
+ + diff --git a/voip/static/src/softphone/softphone_container.js b/voip/static/src/softphone/softphone_container.js new file mode 100644 index 0000000..956b0bd --- /dev/null +++ b/voip/static/src/softphone/softphone_container.js @@ -0,0 +1,26 @@ +/* @odoo-module */ + +import { Component, useState, xml } from "@odoo/owl"; + +import { Softphone } from "@voip/softphone/softphone"; +import { useService } from "@web/core/utils/hooks"; + +export class SoftphoneContainer extends Component { + static components = { Softphone }; + static props = {}; + static template = xml` +
+ +
+ `; + + setup() { + this.voip = useState(useService("voip")); + this.voip.isReady.then(() => { + if (this.voip.missedCalls !== 0) { + this.voip.softphone.show(); + this.voip.softphone.fold(); + } + }); + } +} diff --git a/voip/static/src/softphone/softphone_model.js b/voip/static/src/softphone/softphone_model.js new file mode 100644 index 0000000..68ded13 --- /dev/null +++ b/voip/static/src/softphone/softphone_model.js @@ -0,0 +1,125 @@ +/* @odoo-module */ + +import { Correspondence } from "@voip/core/correspondence_model"; +import { isSubstring } from "@voip/utils/utils"; + +export class Softphone { + activeTabId = "activity"; + isDisplayed = false; + isFolded = false; + /** + * The auto-call mode is turned on when the user clicks on the call button + * from the “Next Activities” tab. + */ + isInAutoCallMode = false; + numpad = { + isOpen: false, + value: "", + selection: { + start: 0, + end: 0, + direction: "none", + }, + }; + searchBarInputValue = ""; + selectedCorrespondence; + shouldFocus = false; + + constructor(store, voip) { + this.store = store; + this.voip = voip; + } + + get activities() { + const searchBarInputValue = this.searchBarInputValue.trim(); + return Object.values(this.store.Activity.records).filter( + (activity) => + activity.activity_category === "phonecall" && + ["today", "overdue"].includes(activity.state) && + ["phone", "mobile"].some((field) => activity[field]) && + activity.user_id[0] === this.store.user.user.id && + (!searchBarInputValue || + [ + activity.partner.name, + activity.partner.displayName, + activity.mobile, + activity.phone, + activity.name, + ].some((x) => isSubstring(x, searchBarInputValue))) + ); + } + + get contacts() { + const searchBarInputValue = this.searchBarInputValue.trim(); + return Object.values(this.store.Persona.records).filter( + (contact) => + contact.hasPhoneNumber && + (!searchBarInputValue || + [ + contact.name, + contact.displayName, + contact.mobileNumber, + contact.landlineNumber, + ].some((x) => isSubstring(x, searchBarInputValue))) + ); + } + + get recentCalls() { + const searchBarInputValue = this.searchBarInputValue.trim(); + const filteredCalls = (() => { + if (searchBarInputValue) { + return Object.values(this.voip.calls).filter( + (call) => + isSubstring(call.phoneNumber, searchBarInputValue) || + (call.partner && isSubstring(call.partner.name, searchBarInputValue)) + ); + } + return Object.values(this.voip.calls); + })(); + return filteredCalls.sort((a, b) => a.id < b.id); + } + + closeNumpad() { + this.numpad.isOpen = false; + } + + fold() { + if (this.store.isSmall) { + return; + } + this.isFolded = true; + } + + hide() { + this.isDisplayed = false; + } + + openNumpad() { + this.numpad.isOpen = true; + this.shouldFocus = true; + } + + selectCorrespondence({ activity, partner, call }) { + this.selectedCorrespondence = new Correspondence({ activity, partner, call }); + } + + selectNextActivity() { + const nextActivity = this.activities.find((activity) => !activity.postponed); + if (nextActivity) { + this.selectCorrespondence({ activity: nextActivity }); + } else { + this.isInAutoCallMode = false; + } + } + + show() { + this.isDisplayed = true; + this.isFolded = false; + this.shouldFocus = true; + } + + unfold() { + this.isFolded = false; + this.shouldFocus = true; + } +} diff --git a/voip/static/src/softphone/transfer_popover.js b/voip/static/src/softphone/transfer_popover.js new file mode 100644 index 0000000..64dc182 --- /dev/null +++ b/voip/static/src/softphone/transfer_popover.js @@ -0,0 +1,87 @@ +/* @odoo-module */ + +import { Component, markup, onMounted, useRef, useState } from "@odoo/owl"; + +import { useService } from "@web/core/utils/hooks"; +import { escape, escapeRegExp } from "@web/core/utils/strings"; +import { useDebounced } from "@web/core/utils/timing"; + +export class TransferPopover extends Component { + static props = ["close", "defaultInputValue"]; + static template = "voip.TransferPopover"; + + setup() { + this.inputRef = useRef("input"); + this.userAgent = useService("voip.user_agent"); + this.voip = useService("voip"); + this.store = useState(useService("mail.store")); + this.state = useState({ inputValue: this.props.defaultInputValue }); + this.onInputDebounced = useDebounced( + () => this.voip.fetchContacts(this.state.inputValue), + 350 + ); + onMounted(() => this.inputRef.el.focus()); + } + + get recipientSuggestions() { + const suggestions = []; + const searchTerms = this.state.inputValue.toLowerCase(); + if (searchTerms === "") { + return suggestions; + } + const contacts = Object.values(this.store.Persona.records).filter((x) => x.hasPhoneNumber); + const regex = new RegExp(`(^.*)(${escapeRegExp(searchTerms)})(.*$)`, "i"); + for (const contact of contacts) { + for (const key of ["displayName", "mobileNumber", "landlineNumber"]) { + const value = contact[key]; + if (!value) { + continue; + } + const [, before, match, after] = (value.match(regex) ?? []).map(escape); + if (!match) { + continue; + } + const suggestion = { + match: markup(`${before}${match}${after}`), + phoneNumber: contact.mobileNumber || contact.landlineNumber, + }; + if (key.endsWith("Number")) { + suggestion.match = markup( + `${escape(contact.displayName)} (${suggestion.match})` + ); + suggestion.phoneNumber = contact[key]; + } + suggestions.push(suggestion); + break; + } + } + return suggestions; + } + + /** @param {MouseEvent} ev */ + onClickRecipient(ev) { + this.state.inputValue = ev.target.dataset.number; + } + + /** @param {KeyboardEvent} ev */ + onKeydown(ev) { + if (ev.key === "Escape") { + this.props.close(); + } + } + + /** @param {KeyboardEvent} ev */ + onKeydownInput(ev) { + if (ev.key === "Enter") { + this.transfer(); + } + } + + transfer() { + if (this.state.inputValue === "") { + return; + } + this.userAgent.transfer(this.state.inputValue); + this.props.close(); + } +} diff --git a/voip/static/src/softphone/transfer_popover.scss b/voip/static/src/softphone/transfer_popover.scss new file mode 100644 index 0000000..95fe864 --- /dev/null +++ b/voip/static/src/softphone/transfer_popover.scss @@ -0,0 +1,7 @@ +.o-voip-TransferPopover { + max-width: $popover-max-width; +} + +.o-voip-TransferPopover-suggestionList { + max-height: 140px; +} diff --git a/voip/static/src/softphone/transfer_popover.xml b/voip/static/src/softphone/transfer_popover.xml new file mode 100644 index 0000000..aed6820 --- /dev/null +++ b/voip/static/src/softphone/transfer_popover.xml @@ -0,0 +1,27 @@ + + + + +
+

+ Transfer to + +

+
+ + + + + +
+
+
+
+ + +
+
+
+ +
diff --git a/voip/static/src/utils/utils.js b/voip/static/src/utils/utils.js new file mode 100644 index 0000000..a5df80e --- /dev/null +++ b/voip/static/src/utils/utils.js @@ -0,0 +1,24 @@ +/* @odoo-module */ + +/** + * Removes whitespaces, dashes, slashes and periods from a phone number. + * + * @param {string} phoneNumber + * @returns {string} + */ +export function cleanPhoneNumber(phoneNumber) { + // U+00AD is the “soft hyphen” character + return phoneNumber.replace(/[\s-/.\u00AD]/g, ""); +} + +export function isSubstring(targetString, substring) { + if (!targetString) { + return false; + } + const normalize = (str) => + str + .toLowerCase() + .normalize("NFD") + .replaceAll(/\p{Diacritic}/gu, ""); + return normalize(targetString).includes(normalize(substring)); +} diff --git a/voip/static/src/web/call_queue_switch.js b/voip/static/src/web/call_queue_switch.js new file mode 100644 index 0000000..9e809a8 --- /dev/null +++ b/voip/static/src/web/call_queue_switch.js @@ -0,0 +1,107 @@ +/* @odoo-module */ + +import { Component, useExternalListener, useState } from "@odoo/owl"; + +import { _t } from "@web/core/l10n/translation"; +import { registry } from "@web/core/registry"; +import { useService } from "@web/core/utils/hooks"; +import { standardFieldProps } from "@web/views/fields/standard_field_props"; + +/** + * Represents a button in CRM leads Kanban view cards that deletes or creates + * call activity from the related record. Call activities created this way are + * included in the "Next activities" tab of the softphone. + * + * The term "call queue" refers to the list of the elements in the "Next + * activities" tab. + */ +export class CallQueueSwitch extends Component { + static props = standardFieldProps; + static template = "voip.CallQueueSwitch"; + + /** + * Useful to prevent other unnecessary requests to the ORM being sent if one + * is already in progress. + */ + _hasPendingRequest = false; + + setup() { + this.state = useState({ isRecordInCallQueue: this.props.record.data[this.props.name] }); + this.orm = useService("orm"); + this.voip = useService("voip"); + // useful to update the state of this view when the record is deleted + // from the "Next Activities" tab of the softphone + useExternalListener(this.voip.bus, "on-call-activity-removed", this._onCallActivityRemoved); + } + + /** @returns {string} */ + get iconClasses() { + return this.state.isRecordInCallQueue ? "fa-minus text-danger" : "fa-plus text-success"; + } + + /** @returns {string} */ + get titleText() { + return this.state.isRecordInCallQueue + ? _t("Remove from Call Queue") + : _t("Add to Call Queue"); + } + + async addToCallQueue() { + if (this._hasPendingRequest) { + return; + } + await this._makeRequest(() => + this.orm.call(this.props.record.resModel, "create_call_activity", [ + [this.props.record.resId], + ]) + ); + this.state.isRecordInCallQueue = true; + await this.props.record.load(); + this.props.record.model.notify(); + } + + /** @param {MouseEvent} ev */ + onClick(ev) { + if (this.state.isRecordInCallQueue) { + this.removeFromCallQueue(); + } else { + this.addToCallQueue(); + } + } + + async removeFromCallQueue() { + if (this._hasPendingRequest) { + return; + } + await this._makeRequest(async () => + this.orm.call(this.props.record.resModel, "delete_call_activity", [ + [this.props.record.resId], + ]) + ); + this.state.isRecordInCallQueue = false; + await this.props.record.load(); + this.props.record.model.notify(); + } + + /** @param {function} callback */ + async _makeRequest(callback) { + this._hasPendingRequest = true; + await callback(); + this._hasPendingRequest = false; + } + + /** + * @param {Object} param0 + * @param {integer} param0.detail The resId of the deleted record. + */ + _onCallActivityRemoved({ detail: resId }) { + // note: the resId is enough to identify the record as long as only + // crm.lead uses the CallQueueSwitch field widget. + if (this.props.record.resId !== resId) { + return; + } + this.state.isRecordInCallQueue = false; + } +} + +registry.category("fields").add("call_queue_switch", { component: CallQueueSwitch }); diff --git a/voip/static/src/web/call_queue_switch.scss b/voip/static/src/web/call_queue_switch.scss new file mode 100644 index 0000000..0a9d9e0 --- /dev/null +++ b/voip/static/src/web/call_queue_switch.scss @@ -0,0 +1,16 @@ +.o-voip-call-queue-switch-op-icon { + left: 5px; + bottom: 8px; + + font-size: $font-size-sm; +} + +@include media-breakpoint-up(md) { + .o-voip-call-queue-switch { + visibility: hidden; + } + + .o_kanban_record:hover .o-voip-call-queue-switch { + visibility: visible; + } +} diff --git a/voip/static/src/web/call_queue_switch.xml b/voip/static/src/web/call_queue_switch.xml new file mode 100644 index 0000000..dfbdbc9 --- /dev/null +++ b/voip/static/src/web/call_queue_switch.xml @@ -0,0 +1,13 @@ + + + + +
+ +
+
+ +
diff --git a/voip/static/src/web/phone_field_patch.js b/voip/static/src/web/phone_field_patch.js new file mode 100644 index 0000000..59fd600 --- /dev/null +++ b/voip/static/src/web/phone_field_patch.js @@ -0,0 +1,40 @@ +/* @odoo-module */ + +import { useService } from "@web/core/utils/hooks"; +import { patch } from "@web/core/utils/patch"; +import { PhoneField } from "@web/views/fields/phone/phone_field"; + +patch(PhoneField.prototype, { + setup() { + super.setup(); + if ("voip" in this.env.services) { + // FIXME: this is only because otherwise @web tests would fail. + // This is one of the major pitfalls of patching. + this.voip = useService("voip"); + this.callService = useService("voip.call"); + this.userAgent = useService("voip.user_agent"); + } + }, + /** + * Called when the phone number is clicked. + * + * @private + * @param {MouseEvent} ev + */ + onLinkClicked(ev) { + if (!this.voip?.canCall) { + return; + } + if (ev.target.matches("a")) { + ev.stopImmediatePropagation(); + } + ev.preventDefault(); + const phoneType = ev.target.closest(".o_field_phone").getAttribute("name"); + const { record } = this.props; + this.userAgent.makeCall({ + phone_number: record.data[phoneType], + res_id: record.resId, + res_model: record.resModel, + }); + }, +}); diff --git a/voip/static/src/web/phone_field_patch.xml b/voip/static/src/web/phone_field_patch.xml new file mode 100644 index 0000000..1161dec --- /dev/null +++ b/voip/static/src/web/phone_field_patch.xml @@ -0,0 +1,19 @@ + + + + + + onLinkClicked + + + + + + onLinkClicked + + + onLinkClicked + + + + diff --git a/voip/static/src/web/voip_systray_item.js b/voip/static/src/web/voip_systray_item.js new file mode 100644 index 0000000..f6e396e --- /dev/null +++ b/voip/static/src/web/voip_systray_item.js @@ -0,0 +1,46 @@ +/* @odoo-module */ + +import { Component, useState } from "@odoo/owl"; + +import { _t } from "@web/core/l10n/translation"; +import { useService } from "@web/core/utils/hooks"; + +export class VoipSystrayItem extends Component { + static props = {}; + static template = "voip.SystrayItem"; + + setup() { + this.voip = useState(useService("voip")); + this.softphone = this.voip.softphone; + } + + /** + * Translated text used as the title attribute of the systray item. + * + * @returns {string} + */ + get titleText() { + if (this.softphone.isDisplayed) { + if (this.softphone.isFolded) { + return _t("Unfold Softphone"); + } + return _t("Close Softphone"); + } + return _t("Open Softphone"); + } + + /** @param {MouseEvent} ev */ + onClick(ev) { + if (this.softphone.isDisplayed) { + if (this.softphone.isFolded) { + this.softphone.unfold(); + this.voip.resetMissedCalls(); + } else { + this.softphone.hide(); + } + } else { + this.softphone.show(); + this.voip.resetMissedCalls(); + } + } +} diff --git a/voip/static/src/web/voip_systray_item.xml b/voip/static/src/web/voip_systray_item.xml new file mode 100644 index 0000000..6bde0dd --- /dev/null +++ b/voip/static/src/web/voip_systray_item.xml @@ -0,0 +1,11 @@ + + + + +
+ +
+
+
diff --git a/voip/static/tests/activity/activity_patch_tests.js b/voip/static/tests/activity/activity_patch_tests.js new file mode 100644 index 0000000..7ed4b91 --- /dev/null +++ b/voip/static/tests/activity/activity_patch_tests.js @@ -0,0 +1,84 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("activity"); + +QUnit.test("Landline number is displayed in activity info.", async () => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({}); + pyEnv["mail.activity"].create({ + phone: "+1-202-555-0182", + res_id: partnerId, + res_model: "res.partner", + }); + const { openFormView } = await start(); + openFormView("res.partner", partnerId); + await contains(".o-mail-Activity-voip-landline-number", { text: "+1-202-555-0182" }); +}); + +QUnit.test("Mobile number is displayed in activity info.", async () => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({}); + pyEnv["mail.activity"].create({ + mobile: "4567829775", + res_id: partnerId, + res_model: "res.partner", + }); + const { openFormView } = await start(); + openFormView("res.partner", partnerId); + await contains(".o-mail-Activity-voip-mobile-number", { text: "4567829775" }); +}); + +QUnit.test( + "When both landline and mobile numbers are provided, a prefix is added to distinguish the two in activity info.", + async () => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({}); + pyEnv["mail.activity"].create({ + phone: "+1-202-555-0182", + mobile: "4567829775", + res_id: partnerId, + res_model: "res.partner", + }); + const { openFormView } = await start(); + openFormView("res.partner", partnerId); + await contains(".o-mail-Activity-voip-mobile-number", { text: "Mobile: 4567829775" }); + await contains(".o-mail-Activity-voip-landline-number", { text: "Phone: +1-202-555-0182" }); + } +); + +QUnit.test("Click on landline number from activity info triggers a call.", async (assert) => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({}); + pyEnv["mail.activity"].create({ + phone: "+1-202-555-0182", + res_id: partnerId, + res_model: "res.partner", + }); + const { openFormView } = await start(); + openFormView("res.partner", partnerId); + await click(".o-mail-Activity-voip-landline-number > a"); + assert.strictEqual( + pyEnv["voip.call"].searchCount([["phone_number", "=", "+1-202-555-0182"]]), + 1 + ); +}); + +QUnit.test("Click on mobile number from activity info triggers a call.", async (assert) => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({}); + pyEnv["mail.activity"].create({ + mobile: "4567829775", + res_id: partnerId, + res_model: "res.partner", + }); + const { openFormView } = await start(); + openFormView("res.partner", partnerId); + await click(".o-mail-Activity-voip-mobile-number > a"); + assert.strictEqual(pyEnv["voip.call"].searchCount([["phone_number", "=", "4567829775"]]), 1); +}); diff --git a/voip/static/tests/helpers/mock_server/models/mail_activity.js b/voip/static/tests/helpers/mock_server/models/mail_activity.js new file mode 100644 index 0000000..eb72996 --- /dev/null +++ b/voip/static/tests/helpers/mock_server/models/mail_activity.js @@ -0,0 +1,83 @@ +/* @odoo-module */ + +import "@mail/../tests/helpers/mock_server/models/mail_activity"; // ensure mail overrides are applied first + +import { patch } from "@web/core/utils/patch"; +import { serializeDate, today } from "@web/core/l10n/dates"; +import { MockServer } from "@web/../tests/helpers/mock_server"; + +patch(MockServer.prototype, { + /** + * @override + */ + async _performRPC(_route, { model, method, args, kwargs }) { + if (model !== "mail.activity") { + return super._performRPC(...arguments); + } + switch (method) { + case "get_today_call_activities": + return this._mockMailActivityGetTodayCallActivities(...args, kwargs); + default: + return super._performRPC(...arguments); + } + }, + _mockMailActivityGetTodayCallActivities() { + const activityTypeIds = this.pyEnv["mail.activity.type"].search([ + ["category", "=", "phonecall"], + ]); + return this._mockMailActivity_FormatCallActivities( + this.getRecords("mail.activity", [ + ["activity_type_id", "in", activityTypeIds], + ["user_id", "=", this.pyEnv.currentUserId], + ["date_deadline", "<=", serializeDate(today())], + ]) + ); + }, + _mockMailActivity_FormatCallActivities(activities) { + const formattedActivities = []; + for (const activity of activities) { + const [user] = this.pyEnv["res.users"].searchRead([["id", "=", activity.user_id]]); + const state = (() => { + const now = serializeDate(today()); + if (activity.date_deadline === now) { + return "today"; + } else if (activity.date_deadline < now) { + return "overdue"; + } else { + return "planned"; + } + })(); + const [record] = this.pyEnv[activity.res_model].searchRead([ + ["id", "=", activity.res_id], + ]); + const activityData = { + id: activity.id, + activity_category: "phonecall", + res_id: activity.res_id, + res_model: activity.res_model, + res_name: activity.res_name || record.display_name, + state, + user_id: [activity.user_id, user.name], + }; + let relatedPartner; + if (activity.res_model === "res.partner") { + [relatedPartner] = this.getRecords("res.partner", [["id", "=", activity.res_id]]); + } else { + if (record.partner_id) { + [relatedPartner] = this.getRecords("res.partner", [ + ["id", "=", record.partner_id], + ]); + } + } + if (relatedPartner) { + activityData.partner = this._mockResPartnerMailPartnerFormat([ + relatedPartner.id, + ]).get(relatedPartner.id); + } + activityData.mobile = record.mobile || relatedPartner?.mobile; + activityData.phone = record.phone || relatedPartner?.phone; + formattedActivities.push(activityData); + } + return formattedActivities; + }, +}); diff --git a/voip/static/tests/helpers/mock_server/models/res_partner.js b/voip/static/tests/helpers/mock_server/models/res_partner.js new file mode 100644 index 0000000..9e822bb --- /dev/null +++ b/voip/static/tests/helpers/mock_server/models/res_partner.js @@ -0,0 +1,44 @@ +/* @odoo-module */ + +import "@mail/../tests/helpers/mock_server/models/res_partner"; // ensure mail overrides are applied first + +import { patch } from "@web/core/utils/patch"; +import { MockServer } from "@web/../tests/helpers/mock_server"; + +patch(MockServer.prototype, { + /** + * @override + */ + async _performRPC(_route, { model, method, args }) { + if (model !== "res.partner") { + return super._performRPC(...arguments); + } + switch (method) { + case "get_contacts": + return this._mockResPartnerGetContacts(args); + default: + return super._performRPC(...arguments); + } + }, + /** + * @returns {Object[]} + */ + _mockResPartnerGetContacts() { + return this._mockResPartner_FormatContacts( + this.getRecords("res.partner", ["|", ["mobile", "!=", false], ["phone", "!=", false]]) + ); + }, + /** + * @returns {Object[]} + */ + _mockResPartner_FormatContacts(contacts) { + return contacts.map((contact) => ({ + id: contact.id, + displayName: contact.display_name, + email: contact.email, + landlineNumber: contact.phone, + mobileNumber: contact.mobile, + name: contact.display_name, + })); + }, +}); diff --git a/voip/static/tests/helpers/mock_server/models/res_users.js b/voip/static/tests/helpers/mock_server/models/res_users.js new file mode 100644 index 0000000..41b1354 --- /dev/null +++ b/voip/static/tests/helpers/mock_server/models/res_users.js @@ -0,0 +1,24 @@ +/* @odoo-module */ + +import "@mail/../tests/helpers/mock_server/models/res_users"; // ensure mail overrides are applied first + +import { patch } from "@web/core/utils/patch"; +import { MockServer } from "@web/../tests/helpers/mock_server"; + +patch(MockServer.prototype, { + /** + * @override + */ + _mockResUsers_InitMessaging(...args) { + const getConfig = (key) => + this.getRecords("ir.config_parameter", [["key", "=", key]])[0].value; + return { + ...super._mockResUsers_InitMessaging(...args), + voipConfig: { + mode: getConfig("voip.mode"), + pbxAddress: getConfig("voip.pbx_ip"), + webSocketUrl: getConfig("voip.wsServer"), + }, + }; + }, +}); diff --git a/voip/static/tests/helpers/mock_server/models/voip_call.js b/voip/static/tests/helpers/mock_server/models/voip_call.js new file mode 100644 index 0000000..64c8e26 --- /dev/null +++ b/voip/static/tests/helpers/mock_server/models/voip_call.js @@ -0,0 +1,173 @@ +/* @odoo-module */ + +import { patch } from "@web/core/utils/patch"; +import { serializeDate, today } from "@web/core/l10n/dates"; +import { MockServer } from "@web/../tests/helpers/mock_server"; + +/** + * @typedef {Object} CallData + * @property {string} direction + * @property {number|undefined} partner_id + * @property {string} phone_number + * @property {string} state + */ + +patch(MockServer.prototype, { + /** + * @override + */ + async _performRPC(_route, { model, method, args, kwargs }) { + if (model !== "voip.call") { + return super._performRPC(...arguments); + } + delete kwargs.context; + switch (method) { + case "abort_call": + return this._mockVoipCallAbortCall(...args, kwargs); + case "create_and_format": + return this._mockVoipCallCreateAndFormat(...args, kwargs); + case "end_call": + return this._mockVoipCallEndCall(...args, kwargs); + case "get_contact_info": + return this._mockVoipCallGetContactInfo(...args, kwargs); + case "get_recent_phone_calls": + return this._mockVoipCallGetRecentPhoneCalls(...args, kwargs); + case "start_call": + return this._mockVoipCallStartCall(...args, kwargs); + default: + return super._performRPC(...arguments); + } + }, + /** + * @param {number[]} param0 + * @returns {Object[]} + */ + _mockVoipCallAbortCall(ids) { + this.pyEnv["voip.call"].write(ids, { state: "aborted" }); + return this._mockVoipCall_FormatCalls(ids); + }, + /** + * @param {Object} param0 + * @param {number|undefined} param0.res_id + * @param {string|undefined} param0.res_model + * @param {CallData} param0.kwargs + * @returns {Object[]} + */ + _mockVoipCallCreateAndFormat({ res_id, res_model, ...kwargs }) { + // recipient finding logic based on (res_model, res_id) not mocked + return this._mockVoipCall_FormatCalls(this.pyEnv["voip.call"].create(kwargs)); + }, + /** + * @param {number[]} param0 + * @param {string|undefined} activity_name + * @returns {Object[]} + */ + _mockVoipCallEndCall(ids, activity_name) { + this.pyEnv["voip.call"].write(ids, { + end_date: serializeDate(today()), + state: "terminated", + }); + if (activity_name) { + this.pyEnv["voip.call"].write(ids, { activity_name }); + } + return this._mockVoipCall_FormatCalls(ids); + }, + _mockVoipCallGetRecentPhoneCalls(_args, { search_terms, offset = 0, limit } = {}) { + const domain = [["user_id", "=", this.pyEnv.currentUserId]]; + if (search_terms) { + for (const field of ["phone_number", "partner_id.name", "activity_name"]) { + domain.push("|", [field, "ilike", search_terms]); + } + } + const recordIds = this.pyEnv["voip.call"].search(domain, { offset, limit, order: "create_date DESC" }); + return this._mockVoipCall_FormatCalls(recordIds); + }, + _mockVoipCallGetContactInfo(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + const records = this.getRecords("voip.call", [["id", "in", ids]]); + if (records.length !== 1) { + throw new Error("self.ensure_one"); + } + const [call] = records; + const [partnerId] = this.pyEnv["res.partner"].search( + ["|", ["phone", "=", call.phone_number], ["mobile", "=", call.phone_number]], + { limit: 1 } + ); + if (!partnerId) { + return false; + } + this.pyEnv["voip.call"].write(ids, { partner_id: partnerId }); + return this._mockResPartnerMailPartnerFormat([partnerId]).get(partnerId); + }, + /** + * @param {number[]} param0 + * @returns {Object[]} + */ + _mockVoipCallStartCall(ids) { + this.pyEnv["voip.call"].write(ids, { + start_date: serializeDate(today()), + state: "ongoing", + }); + return this._mockVoipCall_FormatCalls(ids); + }, + _mockVoipCall_ComputeDisplayName(calls) { + const getName = (call) => { + if (call.activity_name) { + return call.activity_name; + } + const preposition = call.direction === "incoming" ? "from" : "to"; + switch (call.state) { + case "aborted": + return `Aborted call to ${call.phone_number}`; + case "missed": + return `Missed call from ${call.phone_number}`; + case "rejected": + return `Rejected call ${preposition} ${call.phone_number}`; + default: + if (call.partner_id) { + const [partner] = this.getRecords("res.partner", [ + ["id", "=", call.partner_id], + ]); + return `Call ${preposition} ${partner.name}`; + } + return `Call ${preposition} ${call.phone_number}`; + } + }; + for (const call of calls) { + call.display_name = getName(call); + } + }, + /** + * @param {number[]|number} ids + * @returns {Object[]} + */ + _mockVoipCall_FormatCalls(ids) { + if (!Array.isArray(ids)) { + ids = [ids]; + } + const records = this.getRecords("voip.call", [["id", "in", ids]]); + this._mockVoipCall_ComputeDisplayName(records); + const formattedCalls = []; + for (const call of records) { + const data = { + id: call.id, + creationDate: call.create_date, + direction: call.direction, + displayName: call.display_name, + endDate: call.end_date, + phoneNumber: call.phone_number, + startDate: call.start_date, + state: call.state, + }; + if (Number.isInteger(call.partner_id)) { + data.partner = this._mockResPartnerMailPartnerFormat([call.partner_id]).get( + call.partner_id + ); + } + formattedCalls.push(data); + } + return formattedCalls; + }, +}); diff --git a/voip/static/tests/helpers/model_definitions_setup.js b/voip/static/tests/helpers/model_definitions_setup.js new file mode 100644 index 0000000..7f2ead5 --- /dev/null +++ b/voip/static/tests/helpers/model_definitions_setup.js @@ -0,0 +1,18 @@ +/* @odoo-module */ + +import { + addModelNamesToFetch, + insertModelFields, + insertRecords, +} from "@bus/../tests/helpers/model_definitions_helpers"; + +addModelNamesToFetch(["ir.config_parameter", "voip.call"]); +insertModelFields("voip.call", { + direction: { default: "outgoing" }, + state: { default: "calling" }, +}); +insertRecords("ir.config_parameter", [ + { key: "voip.mode", value: "demo" }, + { key: "voip.pbx_ip", value: "pbx.example.com" }, + { key: "voip.wsServer", value: "wss://example.com" }, +]); diff --git a/voip/static/tests/helpers/webclient_setup_patch.js b/voip/static/tests/helpers/webclient_setup_patch.js new file mode 100644 index 0000000..d423d57 --- /dev/null +++ b/voip/static/tests/helpers/webclient_setup_patch.js @@ -0,0 +1,32 @@ +/* @odoo-module */ + +import { setupManager } from "@mail/../tests/helpers/webclient_setup"; + +import { patch } from "@web/core/utils/patch"; +import { makeFakeUserService } from "@web/../tests/helpers/mock_services"; +import { registry } from "@web/core/registry"; + +patch(setupManager, { + setupServiceRegistries() { + const services = registry.category("services"); + services.add("voip.ringtone", { + start() { + const ringtones = { + dial: {}, + incoming: {}, + ringback: {}, + }; + Object.values(ringtones).forEach((r) => Object.assign(r, { play: () => {} })); + return { + ...ringtones, + stopPlaying() {}, + }; + }, + }); + if (!services.contains("user")) { + const fakeUserService = makeFakeUserService((group) => group === "base.group_user"); + services.add("user", fakeUserService); + } + return super.setupServiceRegistries(...arguments); + }, +}); diff --git a/voip/static/tests/softphone/activity_tab_tests.js b/voip/static/tests/softphone/activity_tab_tests.js new file mode 100644 index 0000000..88afd51 --- /dev/null +++ b/voip/static/tests/softphone/activity_tab_tests.js @@ -0,0 +1,101 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("activity_tab"); + +QUnit.test("Today call activities are displayed in the “Next Activities” tab.", async () => { + const pyEnv = await startServer(); + const [activityTypeId] = pyEnv["mail.activity.type"].search([["category", "=", "phonecall"]]); + const [partnerId1, partnerId2] = pyEnv["res.partner"].create([ + { + name: "Françoise Délire", + display_name: "Boulangerie Vortex, Françoise Délire", + mobile: "+1 246 203 6982", + }, + { + name: "Naomi Dag", + display_name: "Sanit’Hair, Naomi Dag", + phone: "777 2124", + }, + ]); + pyEnv["mail.activity"].create([ + { + activity_type_id: activityTypeId, + date_deadline: "1999-01-29", + res_id: partnerId1, + res_model: "res.partner", + user_id: pyEnv.currentUserId, + }, + { + activity_type_id: activityTypeId, + date_deadline: "2016-08-06", + res_id: partnerId2, + res_model: "res.partner", + user_id: pyEnv.currentUserId, + }, + ]); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-ActivitiesTab .list-group-item-action", { count: 2 }); + await contains(".o-voip-ActivitiesTab .list-group-item-action", { + text: "Boulangerie Vortex, Françoise Délire", + }); + await contains(".o-voip-ActivitiesTab .list-group-item-action", { + text: "Sanit’Hair, Naomi Dag", + }); +}); + +QUnit.test( + "The name of the partner linked to an activity is displayed in the activity tab.", + async () => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({ + name: "Gwendoline Zumba", + mobile: "515-555-0104", + }); + pyEnv["mail.activity"].create([ + { + activity_type_id: pyEnv["mail.activity.type"].search([ + ["category", "=", "phonecall"], + ])[0], + date_deadline: "2017-08-13", + res_id: partnerId, + res_model: "res.partner", + user_id: pyEnv.currentUserId, + }, + ]); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-ActivitiesTab .list-group-item-action .fw-bold", { + text: "Gwendoline Zumba", + }); + } +); + +QUnit.test("Clicking on an activity opens the correspondence details", async () => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({ + name: "Yveline Colbert", + phone: "456 284 9936", + }); + pyEnv["mail.activity"].create([ + { + activity_type_id: pyEnv["mail.activity.type"].search([ + ["category", "=", "phonecall"], + ])[0], + date_deadline: "2022-11-16", + res_id: partnerId, + res_model: "res.partner", + user_id: pyEnv.currentUserId, + }, + ]); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o-voip-ActivitiesTab .list-group-item-action", { text: "Yveline Colbert" }); + await contains(".o-voip-CorrespondenceDetails"); +}); diff --git a/voip/static/tests/softphone/contacts_tab_tests.js b/voip/static/tests/softphone/contacts_tab_tests.js new file mode 100644 index 0000000..e29b986 --- /dev/null +++ b/voip/static/tests/softphone/contacts_tab_tests.js @@ -0,0 +1,39 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains, insertText } from "@web/../tests/utils"; + +QUnit.module("contacts_tab"); + +QUnit.test("Partners with a phone number are displayed in Contacts tab", async () => { + const pyEnv = await startServer(); + pyEnv["res.partner"].create([ + { display_name: "Michel Landline", phone: "+1-307-555-0120" }, + { display_name: "Maxim Mobile", mobile: "+257 114 7579" }, + { display_name: "Patrice Nomo" }, + ]); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Contacts" }); + await contains(".o-voip-ContactsTab .list-group-item-action", { count: 2 }); + await contains(".o-voip-ContactsTab b", { text: "Michel Landline" }); + await contains(".o-voip-ContactsTab b", { text: "Maxim Mobile" }); + await contains(".o-voip-ContactsTab b", { text: "Patrice Nomo", count: 0 }); +}); + +QUnit.test("Typing in the search bar fetches and displays the matching contacts", async () => { + const pyEnv = await startServer(); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Contacts" }); + pyEnv["res.partner"].create([ + { display_name: "Morshu RTX", phone: "+61-855-527-77" }, + { display_name: "Gargamel", mobile: "+61-855-583-671" }, + ]); + await insertText("input[placeholder=Search]", "Morshu"); + await contains(".o-voip-ContactsTab b", { text: "Morshu RTX" }); + await contains(".o-voip-ContactsTab b", { text: "Gargamel", count: 0 }); +}); diff --git a/voip/static/tests/softphone/correspondence_details_tests.js b/voip/static/tests/softphone/correspondence_details_tests.js new file mode 100644 index 0000000..fdae35e --- /dev/null +++ b/voip/static/tests/softphone/correspondence_details_tests.js @@ -0,0 +1,52 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("correspondence_details"); + +QUnit.test("The partner's phone number is displayed in correspondence details.", async () => { + const pyEnv = await startServer(); + const phoneNumber = "355 649 6295"; + pyEnv["res.partner"].create({ display_name: "Maxime Randonnées", phone: phoneNumber }); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Contacts" }); + await click(".list-group-item-action", { text: "Maxime Randonnées" }); + await contains(`[href$="${phoneNumber}"] .fa-phone`); +}); + +QUnit.test("The partner's mobile number is displayed in correspondence details.", async () => { + const pyEnv = await startServer(); + const phoneNumber = "0456 703 6196"; + pyEnv["res.partner"].create({ display_name: "Maxime Randonnées", mobile: phoneNumber }); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Contacts" }); + await click(".list-group-item-action", { text: "Maxime Randonnées" }); + await contains(`[href$="${phoneNumber}"] .fa-mobile`); +}); + +QUnit.test("Calls are properly displayed even if their state is broken.", async () => { + const pyEnv = await startServer(); + // If for some reason (e.g. a power outage in the middle of a call) the call + // is never properly terminated, it may be stuck in the “calling” or + // “ongoing” state. Let's mock this situation: + pyEnv["voip.call"].create({ phone_number: "+263-735-552-56", state: "calling", user_id: pyEnv.currentUserId }); + pyEnv["voip.call"].create({ phone_number: "+32-495-558-286", state: "ongoing", user_id: pyEnv.currentUserId }); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Recent" }); + await click(".list-group-item-action", { text: "Call to +263-735-552-56" }); + await contains(".o-voip-CorrespondenceDetails"); + await contains(".o-voip-CorrespondenceDetails .bg-success.bg-opacity-25", { count: 0 }); + await contains("button[title='End Call']", { count: 0 }); + await click("button[title='Close details']"); + await click(".list-group-item-action", { text: "Call to +32-495-558-286" }); + await contains(".o-voip-CorrespondenceDetails"); + await contains(".o-voip-CorrespondenceDetails .bg-success.bg-opacity-25", { count: 0 }); + await contains("button[title='End Call']", { count: 0 }); +}); diff --git a/voip/static/tests/softphone/device_selection_dialog.mobile.js b/voip/static/tests/softphone/device_selection_dialog.mobile.js new file mode 100644 index 0000000..e53ebf9 --- /dev/null +++ b/voip/static/tests/softphone/device_selection_dialog.mobile.js @@ -0,0 +1,57 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { browser } from "@web/core/browser/browser"; +import { patchWithCleanup } from "@web/../tests/helpers/utils"; +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("device_selection_dialog_mobile"); + +QUnit.test("Switch audio input", async () => { + patchWithCleanup(browser, { + navigator: { + ...browser.navigator, + userAgent: "Chrome/0.0.0 (Linux; Android 13; Odoo TestSuite)", + mediaDevices: { + async enumerateDevices() { + return [ + { + deviceId: "default", + kind: "audioinput", + }, + { + deviceId: "headset-earpiece-audio-input", + kind: "audioinput", + }, + { + deviceId: "default-video-input", + kind: "videoinput", + }, + { + deviceId: "default", + kind: "audiooutput", + }, + ]; + }, + }, + }, + }); + const pyEnv = await startServer(); + pyEnv["res.partner"].create({ display_name: "Gwonam", phone: "515-555-0170" }); + pyEnv["res.users.settings"].create({ + how_to_call_on_mobile: "voip", + user_id: pyEnv.currentUserId, + }); + const { advanceTime } = await start({ hasTimeControl: true }); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Contacts" }); + await contains(".o-voip-ContactsTab b", { text: "Gwonam" }); + await click("button[title='Call']"); + await advanceTime(5000); + await click("button[title='Change input device']:enabled"); + await contains("select[id='device-select']"); + await contains("option", { count: 2 }); +}); diff --git a/voip/static/tests/softphone/numpad_tests.js b/voip/static/tests/softphone/numpad_tests.js new file mode 100644 index 0000000..13f6baa --- /dev/null +++ b/voip/static/tests/softphone/numpad_tests.js @@ -0,0 +1,169 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { nextTick, triggerHotkey } from "@web/../tests/helpers/utils"; +import { click, contains, insertText } from "@web/../tests/utils"; + +QUnit.module("numpad"); + +QUnit.test("Number input is focused when opening the numpad.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await contains("input[placeholder='Enter the number…']:focus"); +}); + +QUnit.test( + "Number input content is persisted when closing then re-opening the numpad.", + async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "513"); + await click("button[title='Close Numpad']"); + await click("button[title='Open Numpad']"); + await contains("input[placeholder='Enter the number…']", { value: "513" }); + } +); + +QUnit.test( + "Clicking on the “Backspace button” deletes the last character of the number input.", + async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "123"); + await click("button[title='Backspace']"); + await nextTick(); + await contains("input[placeholder='Enter the number…']", { value: "12" }); + } +); + +QUnit.test( + "Cursor is taken into account when clicking Backspace.", + async (assert) => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "01123456"); + const input = document.querySelector("input[placeholder='Enter the number…']"); + input.setSelectionRange(3, 3); + await click("button[title='Backspace']"); + assert.strictEqual(input.selectionStart, 2); + assert.strictEqual(input.selectionEnd, 2); + await contains("input[placeholder='Enter the number…']", { value: "0123456" }); + } +); + +QUnit.test( + "Cursor range selection is taken into account when clicking Backspace.", + async (assert) => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "011123456"); + const input = document.querySelector("input[placeholder='Enter the number…']"); + input.setSelectionRange(2, 4); + await click("button[title='Backspace']"); + assert.strictEqual(input.selectionStart, 2); + assert.strictEqual(input.selectionEnd, 2); + await contains("input[placeholder='Enter the number…']", { value: "0123456" }); + } +); + +QUnit.test( + "When cursor is at the beginning of the input, clicking Backspace does nothing.", + async (assert) => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "0123456"); + const input = document.querySelector("input[placeholder='Enter the number…']"); + input.setSelectionRange(0, 0); + await click("button[title='Backspace']"); + assert.strictEqual(input.selectionStart, 0); + assert.strictEqual(input.selectionEnd, 0); + await contains("input[placeholder='Enter the number…']", { value: "0123456" }); + } +); + +QUnit.test("Clicking on a key appends it to the number input.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "123"); + await click("button", { text: "#" }); + await nextTick(); + await contains("input[placeholder='Enter the number…']", { value: "123#" }); +}); + +QUnit.test("Number input is focused after clicking on a key.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await click("button", { text: "2" }); + await nextTick(); + await contains("input[placeholder='Enter the number…']:focus"); +}); + +QUnit.test( + "Cursor is taken into account when clicking on a key.", + async (assert) => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "023456"); + const input = document.querySelector("input[placeholder='Enter the number…']"); + input.setSelectionRange(1, 1); + await click("button", { text: "1" }); + assert.strictEqual(input.selectionStart, 2); + assert.strictEqual(input.selectionEnd, 2); + await contains("input[placeholder='Enter the number…']", { value: "0123456" }); + } +); + +QUnit.test( + "Cursor range selection is taken into account when clicking on a key.", + async (assert) => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "0223456"); + const input = document.querySelector("input[placeholder='Enter the number…']"); + input.setSelectionRange(1, 2); + await click("button", { text: "1" }); + assert.strictEqual(input.selectionStart, 2); + assert.strictEqual(input.selectionEnd, 2); + await contains("input[placeholder='Enter the number…']", { value: "0123456" }); + } +); + +QUnit.test("Pressing Enter in the input makes a call to the dialed number.", async (assert) => { + const pyEnv = await startServer(); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await contains("input[placeholder='Enter the number…']"); + await insertText("input[placeholder='Enter the number…']", "9223372036854775807"); + await triggerHotkey("Enter"); + assert.strictEqual( + pyEnv["voip.call"].searchCount([["phone_number", "=", "9223372036854775807"]]), + 1 + ); +}); + +QUnit.test( + "Pressing Enter in the input doesn't make a call if the trimmed input is empty string.", + async (assert) => { + const pyEnv = await startServer(); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "\t \n\r\v"); + await triggerHotkey("Enter"); + assert.strictEqual(pyEnv["voip.call"].searchCount([]), 0); + } +); diff --git a/voip/static/tests/softphone/softphone_tests.js b/voip/static/tests/softphone/softphone_tests.js new file mode 100644 index 0000000..0e52187 --- /dev/null +++ b/voip/static/tests/softphone/softphone_tests.js @@ -0,0 +1,151 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { translatedTerms } from "@web/core/l10n/translation"; +import { patchWithCleanup, triggerHotkey } from "@web/../tests/helpers/utils"; +import { click, contains, insertText } from "@web/../tests/utils"; + +/** + * @param {number} numberOfMissedCalls + * @returns {function} + */ +const mockMissedCalls = (numberOfMissedCalls) => + async function (route, _args, originalRpc) { + if (route === "/mail/init_messaging") { + const res = await originalRpc(...arguments); + res.voipConfig.missedCalls = numberOfMissedCalls; + return res; + } + }; + +QUnit.module("softphone"); + +QUnit.test("Clicking on top bar when softphone is unfolded folds the softphone.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-Softphone-content"); + await click(".o-voip-Softphone-topbar"); + await contains(".o-voip-Softphone-content", { count: 0 }); +}); + +QUnit.test("Clicking on top bar when softphone is folded unfolds the softphone.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o-voip-Softphone-topbar"); // fold + await click(".o-voip-Softphone-topbar"); + await contains(".o-voip-Softphone-content"); +}); + +QUnit.test("Clicking on close button closes the softphone.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-Softphone"); + await click(".o-voip-Softphone button[title='Close']"); + await contains(".o-voip-Softphone", { count: 0 }); +}); + +QUnit.test("Search bar is focused after opening the softphone.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains("input[placeholder='Search']:focus"); +}); + +QUnit.test("Search bar is focused after unfolding the softphone.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o-voip-Softphone-topbar"); // fold + await click(".o-voip-Softphone-topbar"); // unfold + await contains("input[placeholder='Search']:focus"); +}); + +QUnit.test("“Next activities” is the active tab by default.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".nav-link.active", { text: "Next Activities" }); +}); + +QUnit.test("Clicking on a tab makes it the active tab.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".nav-link", { text: "Contacts" }); + await contains(".nav-link.active", { text: "Contacts" }); + await contains(".nav-link.active"); +}); + +QUnit.test("Click on the “Numpad button” to open and close the numpad.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await contains(".o-voip-Numpad"); + await click("button[title='Close Numpad']"); + await contains(".o-voip-Numpad", { count: 0 }); +}); + +QUnit.test( + "The softphone top bar text is “VoIP” as long as there is no missed calls.", + async () => { + start({ mockRPC: mockMissedCalls(0) }); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-Softphone-topbar", { text: "VoIP" }); + } +); + +QUnit.test( + "The softphone automatically opens folded when there is at least 1 missed call.", + async () => { + start({ mockRPC: mockMissedCalls(1) }); + await contains(".o-voip-Softphone"); // it's displayed… + await contains(".o-voip-Softphone-content", { count: 0 }); // but it's folded + } +); + +QUnit.test( + "The softphone top bar text is “1 missed call” when there is 1 missed call.", + async () => { + start({ mockRPC: mockMissedCalls(1) }); + await contains(".o-voip-Softphone-topbar", { text: "1 missed call" }); + } +); + +QUnit.test( + "The softphone top bar text allows a specific translation for the dual grammatical number.", + async () => { + patchWithCleanup(translatedTerms, { "2 missed calls": "2 مكالمة فائتة" }); + start({ mockRPC: mockMissedCalls(2) }); + await contains(".o-voip-Softphone-topbar", { text: "2 مكالمة فائتة" }); + } +); + +QUnit.test( + "The softphone top bar text is “513 missed calls” when there is 513 missed calls", + async () => { + start({ mockRPC: mockMissedCalls(513) }); + await contains(".o-voip-Softphone-topbar", { text: "513 missed calls" }); + } +); + +QUnit.test("The cursor when hovering over the top bar has “pointer” style", async (assert) => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-Softphone-topbar"); + assert.strictEqual(getComputedStyle($(".o-voip-Softphone-topbar")[0]).cursor, "pointer"); +}); + +QUnit.test( + "When a call is created, a partner with a corresponding phone number is displayed", + async () => { + const pyEnv = await startServer(); + const phoneNumber = "0456 703 6196"; + pyEnv["res.partner"].create({ name: "Maxime Randonnées", mobile: phoneNumber }); + const { advanceTime } = await start({ hasTimeControl: true }); + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", phoneNumber); + await triggerHotkey("Enter"); + await advanceTime(5000); + await contains(".o-voip-CorrespondenceDetails", { text: "Maxime Randonnées" }); + } +); diff --git a/voip/static/tests/softphone/softphone_tests.mobile.js b/voip/static/tests/softphone/softphone_tests.mobile.js new file mode 100644 index 0000000..3a3dd89 --- /dev/null +++ b/voip/static/tests/softphone/softphone_tests.mobile.js @@ -0,0 +1,32 @@ +/* @odoo-module */ + +import { patchUiSize } from "@mail/../tests/helpers/patch_ui_size"; +import { start } from "@mail/../tests/helpers/test_utils"; + +import { nextTick } from "@web/../tests/helpers/utils"; +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("softphone_mobile"); + +QUnit.test( + "Clicking on the top bar does not fold the softphone window on small devices.", + async () => { + patchUiSize({ width: 360, height: 800 }); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o-voip-Softphone-topbar"); + await nextTick(); + await contains(".o-voip-Softphone-content"); + } +); + +QUnit.test( + "The cursor when hovering over the top bar is not a pointer on small devices.", + async (assert) => { + patchUiSize({ width: 360, height: 800 }); + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-Softphone"); + assert.strictEqual(getComputedStyle($(".o-voip-Softphone-topbar")[0]).cursor, "auto"); + } +); diff --git a/voip/static/tests/softphone/transfer_popover_tests.js b/voip/static/tests/softphone/transfer_popover_tests.js new file mode 100644 index 0000000..46d34e9 --- /dev/null +++ b/voip/static/tests/softphone/transfer_popover_tests.js @@ -0,0 +1,29 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { triggerHotkey } from "@web/../tests/helpers/utils"; +import { click, contains, insertText } from "@web/../tests/utils"; + +QUnit.module("transfer_popover"); + +QUnit.test("TransferPopover input is pre-filled with external device number.", async () => { + const externalDeviceNumber = "1337"; + const pyEnv = await startServer(); + pyEnv["res.users.settings"].create({ + external_device_number: externalDeviceNumber, + user_id: pyEnv.currentUserId, + }); + const { advanceTime, env } = await start({ hasTimeControl: true }); + // wait for external_device_number to be fetched + await env.services["voip"].isReady; + await click(".o_menu_systray button[title='Open Softphone']"); + await click("button[title='Open Numpad']"); + await insertText("input[placeholder='Enter the number…']", "+380 (44) 4315351"); + await triggerHotkey("Enter"); + await advanceTime(5000); + await click("button[title='Transfer']:enabled"); + await contains(".o-voip-TransferPopover input", { value: externalDeviceNumber }); +}); diff --git a/voip/static/tests/web/phone_field_tests.js b/voip/static/tests/web/phone_field_tests.js new file mode 100644 index 0000000..d409965 --- /dev/null +++ b/voip/static/tests/web/phone_field_tests.js @@ -0,0 +1,55 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; +import { addFakeModel } from "@bus/../tests/helpers/model_definitions_helpers"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; +import { nextTick } from "@web/../tests/helpers/utils"; + +const views = { + "fake,false,form": ` +
+ + + + + +
`, +}; + +addFakeModel("fake", { phone: { string: "Phone Number", type: "char" } }); + +QUnit.module("phone field"); + +QUnit.test("Click on PhoneField link triggers a call.", async (assert) => { + const pyEnv = await startServer(); + const fakeId = pyEnv["fake"].create({ phone: "+36 55 369 678" }); + const { openFormView } = await start({ serverData: { views } }); + openFormView("fake", fakeId, { + waitUntilDataLoaded: false, + waitUntilMessagesLoaded: false, + }); + await click(".o_field_phone a[href='tel:+3655369678']"); + assert.strictEqual( + pyEnv["voip.call"].searchCount([["phone_number", "=", "+36 55 369 678"]]), + 1 + ); +}); + +QUnit.test( + "Click on PhoneField link in readonly form view does not switch the form view to edit mode.", + async () => { + const pyEnv = await startServer(); + const fakeId = pyEnv["fake"].create({ phone: "+689 312172" }); + const { openFormView } = await start({ serverData: { views } }); + openFormView("fake", fakeId, { + waitUntilDataLoaded: false, + waitUntilMessagesLoaded: false, + }); + await click(".o_field_phone a[href='tel:+689312172']"); + await nextTick(); + await contains(".o_form_readonly"); + } +); diff --git a/voip/static/tests/web/voip_systray_item_tests.js b/voip/static/tests/web/voip_systray_item_tests.js new file mode 100644 index 0000000..9314ac1 --- /dev/null +++ b/voip/static/tests/web/voip_systray_item_tests.js @@ -0,0 +1,34 @@ +/* @odoo-module */ + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("voip_systray_item"); + +QUnit.test("Clicking on systray item when softphone is hidden shows the softphone.", async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await contains(".o-voip-Softphone"); +}); + +QUnit.test( + "Clicking on systray item when softphone is displayed and unfolded hides the softphone.", + async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o_menu_systray button[title='Close Softphone']"); + await contains(".o-voip-Softphone"); + } +); + +QUnit.test( + "Clicking on systray item when softphone is displayed but folded unfolds the softphone.", + async () => { + start(); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o-voip-Softphone-topbar"); // fold + await click(".o_menu_systray button[title='Unfold Softphone']"); + await contains(".o-voip-Softphone-content"); + } +); diff --git a/voip/tests/__init__.py b/voip/tests/__init__.py new file mode 100644 index 0000000..6d10254 --- /dev/null +++ b/voip/tests/__init__.py @@ -0,0 +1,4 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import test_voip_access_rights +from . import test_voip_user_config diff --git a/voip/tests/test_voip_access_rights.py b/voip/tests/test_voip_access_rights.py new file mode 100644 index 0000000..24a3e0c --- /dev/null +++ b/voip/tests/test_voip_access_rights.py @@ -0,0 +1,47 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.exceptions import AccessError +from odoo.tests import common, tagged + + +@tagged("voip") +class TestVoipCall(common.TransactionCase): + def test_voip_call_access_rights_crud_on_others_records(self): + """ + Asserts that users cannot perform CRUD operations on other users' call records. + """ + shrek_data = {"login": "what_are_you_doing_in_my_swamp", "name": "💠 Shrek 💠"} + shrek = self.env["res.users"].create(shrek_data) + bowser_data = {"login": "so_long", "name": "Bowser 😤😤😤"} + bowser = self.env["res.users"].create(bowser_data) + call_made_by_shrek = self.env["voip.call"].create({"user_id": shrek.id, "phone_number": "+246 532 4846"}) + self.env.invalidate_all() + + with self.assertRaises(AccessError): + self.env["voip.call"].with_user(bowser).create({"user_id": shrek.id, "phone_number": "+244 0915 050 7017"}) + with self.assertRaises(AccessError): + call_made_by_shrek.with_user(bowser).read() + with self.assertRaises(AccessError): + call_made_by_shrek.with_user(bowser).write({}) + with self.assertRaises(AccessError): + call_made_by_shrek.with_user(bowser).unlink() + + def test_voip_call_access_rights_crud_on_their_own_records(self): + """ + Asserts that access rights are working correctly for CRUD operations on users' own records. + """ + wario = self.env["res.users"].create( + { + "login": "waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "name": "$$𝕎𝔸ℝ𝕀𝕆$$", + } + ) + self.env.invalidate_all() + + call_made_by_wario = self.env["voip.call"].with_user(wario).create({"user_id": wario.id, "phone_number": "2"}) + self.assertTrue(call_made_by_wario) + call_made_by_wario.read() + call_made_by_wario.write({"activity_name": "Team building (Extreme Ironing)"}) + self.assertEqual(call_made_by_wario.activity_name, "Team building (Extreme Ironing)") + with self.assertRaises(AccessError): + call_made_by_wario.unlink() diff --git a/voip/tests/test_voip_user_config.py b/voip/tests/test_voip_user_config.py new file mode 100644 index 0000000..2c214a4 --- /dev/null +++ b/voip/tests/test_voip_user_config.py @@ -0,0 +1,40 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests import common, Form, tagged + + +@tagged("voip", "post_install", "-at_install") +class TestVoipUserConfig(common.TransactionCase): + def test_voip_user_config_access_rights(self): + """ + Tests that users cannot read VoIP configuration of other users. + """ + user_data_1 = {"login": "i_love_voip", "name": "Handsome VoIP User 😎"} + voip_user = self.env["res.users"].create(user_data_1).sudo(False) + settings = voip_user.env["res.users.settings"]._find_or_create_for_user(voip_user) + settings.write({"voip_secret": "Top Secret 🤫"}) + user_data_2 = {"login": "i_hate_voip", "name": "Evil Password Stealer 👺"} + evil_password_stealer = self.env["res.users"].create(user_data_2).sudo(False) + self.env.invalidate_all() + + self.assertFalse(voip_user.with_user(evil_password_stealer).voip_secret) + + def test_update_voip_user_config_from_user_form(self): + """ + Asserts that changes made to the VoIP Config in the res.users forms are reflected in res.users.settings. + """ + form = Form(self.env["res.users"], view="base.view_users_form") + form.name = "钟离" + form.login = "摩拉克斯" + form.external_device_number = "110" + user = form.save() + settings = user.res_users_settings_id + self.assertEqual(settings.how_to_call_on_mobile, "ask") + self.assertEqual(settings.external_device_number, "110") + + form = Form(user, view="base.view_users_form") + form.how_to_call_on_mobile = "voip" + form.external_device_number = "911" + form.save() + self.assertEqual(settings.how_to_call_on_mobile, "voip") + self.assertEqual(settings.external_device_number, "911") diff --git a/voip/views/res_config_settings_views.xml b/voip/views/res_config_settings_views.xml new file mode 100644 index 0000000..06d378c --- /dev/null +++ b/voip/views/res_config_settings_views.xml @@ -0,0 +1,27 @@ + + + + + res.config.settings.view.form.inherit.voip + res.config.settings + + + + + +
+
+
+
+
+
+
+
+ +
diff --git a/voip/views/res_partner_views.xml b/voip/views/res_partner_views.xml new file mode 100644 index 0000000..f625833 --- /dev/null +++ b/voip/views/res_partner_views.xml @@ -0,0 +1,16 @@ + + + + + res.partner.form + res.partner + + + + + + + + + + diff --git a/voip/views/res_users_settings_views.xml b/voip/views/res_users_settings_views.xml new file mode 100644 index 0000000..77ca09b --- /dev/null +++ b/voip/views/res_users_settings_views.xml @@ -0,0 +1,20 @@ + + + + VoIP User Settings + res.users.settings + + + + + + + + + + + + + + + diff --git a/voip/views/res_users_views.xml b/voip/views/res_users_views.xml new file mode 100644 index 0000000..ca75265 --- /dev/null +++ b/voip/views/res_users_views.xml @@ -0,0 +1,43 @@ + + + + VoIP Config in User Form + res.users + + + + + + + + + + + + + + + + + VoIP Config in Preferences Form + res.users + + + + + + + + + + + + + + + + + + + diff --git a/voip/views/voip_call_views.xml b/voip/views/voip_call_views.xml new file mode 100644 index 0000000..c729acd --- /dev/null +++ b/voip/views/voip_call_views.xml @@ -0,0 +1,32 @@ + + + + VoIP Calls Tree View + voip.call + + + + + + + + + + + + + + + + Calls + voip.call + tree + + [] + + + + diff --git a/voip_crm/__init__.py b/voip_crm/__init__.py new file mode 100644 index 0000000..d6210b1 --- /dev/null +++ b/voip_crm/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/voip_crm/__manifest__.py b/voip_crm/__manifest__.py new file mode 100644 index 0000000..2990b1e --- /dev/null +++ b/voip_crm/__manifest__.py @@ -0,0 +1,20 @@ +{ + "name": "VoIP for CRM", + "summary": "VoIP integration with CRM module.", + "description": """Adds a button to schedule calls from leads in Kanban.""", + "category": "Sales/CRM", + "version": "1.0", + "depends": ["base", "crm", "voip"], + "auto_install": True, + "data": ["views/crm_lead_views.xml"], + "license": "OEEL-1", + "assets": { + "web.tests_assets": [ + "voip_crm/static/tests/helpers/**/*.js", + ], + "web.qunit_suite_tests": [ + "voip_crm/static/tests/**/*.js", + ("remove", "voip_crm/static/tests/helpers/**/*"), + ], + }, +} diff --git a/voip_crm/i18n/ar.po b/voip_crm/i18n/ar.po new file mode 100644 index 0000000..b46d3bc --- /dev/null +++ b/voip_crm/i18n/ar.po @@ -0,0 +1,36 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Malaz Abuidris , 2022 +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\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 && n%100<=99 ? 4 : 5;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "إضافة إلى قائمة انتظار الاتصالات " + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "في قائمة انتظار المكالمات " + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "عميل مهتم/فرصة " diff --git a/voip_crm/i18n/cs.po b/voip_crm/i18n/cs.po new file mode 100644 index 0000000..22b2920 --- /dev/null +++ b/voip_crm/i18n/cs.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Jiří Podhorecký, 2022 +# David Kliment , 2022 +# Rastislav Brencic , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Rastislav Brencic , 2022\n" +"Language-Team: Czech (https://app.transifex.com/odoo/teams/41243/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Přidat do fronty hovorů" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Ve volací frontě" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Potenciální zákazník / příležitost" diff --git a/voip_crm/i18n/da.po b/voip_crm/i18n/da.po new file mode 100644 index 0000000..4d08aa8 --- /dev/null +++ b/voip_crm/i18n/da.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Preben Lisby , 2022 +# Ejner Sønniksen , 2022 +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Danish (https://app.transifex.com/odoo/teams/41243/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Tilføj til opkaldskø" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Er i opkaldskøen" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Kundeemne/Salgsmulighed" diff --git a/voip_crm/i18n/de.po b/voip_crm/i18n/de.po new file mode 100644 index 0000000..8499c87 --- /dev/null +++ b/voip_crm/i18n/de.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "An Anruf-Warteschlage anhängen" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Ist in der Warteschlange" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Interessent / Chance" diff --git a/voip_crm/i18n/es.po b/voip_crm/i18n/es.po new file mode 100644 index 0000000..9d571f7 --- /dev/null +++ b/voip_crm/i18n/es.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Spanish (https://app.transifex.com/odoo/teams/41243/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Agregar a la cola de llamadas" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Está en la cola de llamadas" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Iniciativa/Oportunidad" diff --git a/voip_crm/i18n/fr.po b/voip_crm/i18n/fr.po new file mode 100644 index 0000000..7f3cece --- /dev/null +++ b/voip_crm/i18n/fr.po @@ -0,0 +1,36 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# Jolien De Paepe, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Jolien De Paepe, 2023\n" +"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Ajouter à la file d'attente des appels" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Est dans la file d'attente des appels" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Piste/opportunité" diff --git a/voip_crm/i18n/he.po b/voip_crm/i18n/he.po new file mode 100644 index 0000000..ae670d9 --- /dev/null +++ b/voip_crm/i18n/he.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: he\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "ליד/הזדמנות" diff --git a/voip_crm/i18n/hr.po b/voip_crm/i18n/hr.po new file mode 100644 index 0000000..39a2627 --- /dev/null +++ b/voip_crm/i18n/hr.po @@ -0,0 +1,31 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Tina Milas, 2022 +# Stjepan Lovasić , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Stjepan Lovasić , 2022\n" +"Language-Team: Croatian (https://app.transifex.com/odoo/teams/41243/hr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hr\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" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Je u redu čekanja poziva" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Potencijal/prilika" diff --git a/voip_crm/i18n/hu.po b/voip_crm/i18n/hu.po new file mode 100644 index 0000000..59a958f --- /dev/null +++ b/voip_crm/i18n/hu.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Tamás Németh , 2022 +# krnkris, 2022 +# Ákos Nagy , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Ákos Nagy , 2022\n" +"Language-Team: Hungarian (https://app.transifex.com/odoo/teams/41243/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Adja hozzá a hívási sorhoz" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Benne van a Hívási sorban" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Érdeklődés/Lehetőség" diff --git a/voip_crm/i18n/it.po b/voip_crm/i18n/it.po new file mode 100644 index 0000000..8d6c8e3 --- /dev/null +++ b/voip_crm/i18n/it.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Aggiungi alla lista di chiamate da fare" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "È nella coda delle chiamate da fare" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Contatto/Opportunità" diff --git a/voip_crm/i18n/lb.po b/voip_crm/i18n/lb.po new file mode 100644 index 0000000..ccbc791 --- /dev/null +++ b/voip_crm/i18n/lb.po @@ -0,0 +1,26 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~12.4+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-08-12 11:30+0000\n" +"PO-Revision-Date: 2019-08-26 09:38+0000\n" +"Language-Team: Luxembourgish (https://www.transifex.com/odoo/teams/41243/lb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "" diff --git a/voip_crm/i18n/lt.po b/voip_crm/i18n/lt.po new file mode 100644 index 0000000..fb6a961 --- /dev/null +++ b/voip_crm/i18n/lt.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Andrius Laukavičius , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Andrius Laukavičius , 2022\n" +"Language-Team: Lithuanian (https://app.transifex.com/odoo/teams/41243/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Iniciatyva/Galimybė" diff --git a/voip_crm/i18n/mn.po b/voip_crm/i18n/mn.po new file mode 100644 index 0000000..3afb03b --- /dev/null +++ b/voip_crm/i18n/mn.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Uuganbayar Batbaatar , 2022 +# hish, 2022 +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Mongolian (https://app.transifex.com/odoo/teams/41243/mn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: mn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Дуудлагын цуваа үүсгэх" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Дуудлага хүлээлгэнд байна" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Сэжим/Боломж" diff --git a/voip_crm/i18n/nb.po b/voip_crm/i18n/nb.po new file mode 100644 index 0000000..4a5943e --- /dev/null +++ b/voip_crm/i18n/nb.po @@ -0,0 +1,30 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Marius Stedjan , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Marius Stedjan , 2022\n" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/odoo/teams/41243/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Legg til i samtalekø" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Lead/mulighet" diff --git a/voip_crm/i18n/nl.po b/voip_crm/i18n/nl.po new file mode 100644 index 0000000..003d4a2 --- /dev/null +++ b/voip_crm/i18n/nl.po @@ -0,0 +1,36 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# Erwin van der Ploeg , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Erwin van der Ploeg , 2022\n" +"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Toevoegen aan belwachtrij" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Staat in de wachtrij" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Lead/Verkoopkans" diff --git a/voip_crm/i18n/pl.po b/voip_crm/i18n/pl.po new file mode 100644 index 0000000..fe4d7bc --- /dev/null +++ b/voip_crm/i18n/pl.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Piotr Cierkosz , 2022 +# Grzegorz Grzelak , 2022 +# Maksym , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Maksym , 2023\n" +"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pl\n" +"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" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Dodaj do kolejki połączeń" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Jest w kolejce połączeń" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Sygnał/Szansa" diff --git a/voip_crm/i18n/pt.po b/voip_crm/i18n/pt.po new file mode 100644 index 0000000..78ca322 --- /dev/null +++ b/voip_crm/i18n/pt.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Portuguese (https://app.transifex.com/odoo/teams/41243/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Prospecto / Oportunidade" diff --git a/voip_crm/i18n/pt_BR.po b/voip_crm/i18n/pt_BR.po new file mode 100644 index 0000000..d91ef2c --- /dev/null +++ b/voip_crm/i18n/pt_BR.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Adicionar à fila de chamada" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Está na Lista de Ligações" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Lead/Oportunidade" diff --git a/voip_crm/i18n/ro.po b/voip_crm/i18n/ro.po new file mode 100644 index 0000000..e204cb5 --- /dev/null +++ b/voip_crm/i18n/ro.po @@ -0,0 +1,36 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Foldi Robert , 2022 +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Romanian (https://app.transifex.com/odoo/teams/41243/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Adăugare la coada de apeluri" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Se află în coada de apeluri" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Pista/Oportunitate" diff --git a/voip_crm/i18n/ru.po b/voip_crm/i18n/ru.po new file mode 100644 index 0000000..0ed8ec7 --- /dev/null +++ b/voip_crm/i18n/ru.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2024-01-30 15:14+0400\n" +"Last-Translator: \n" +"Language-Team: Russian (https://app.transifex.com/odoo/teams/41243/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"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" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Находится в очереди вызовов" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Потенциальные сделки" diff --git a/voip_crm/i18n/tr.po b/voip_crm/i18n/tr.po new file mode 100644 index 0000000..2a0a82e --- /dev/null +++ b/voip_crm/i18n/tr.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Yedigen, 2022 +# Fırat Kaya , 2022 +# Murat Kaplan , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Murat Kaplan , 2022\n" +"Language-Team: Turkish (https://app.transifex.com/odoo/teams/41243/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Arama sırasına ekle" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Arama Sırasında mı" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Aday/Fırsat" diff --git a/voip_crm/i18n/uk.po b/voip_crm/i18n/uk.po new file mode 100644 index 0000000..6cb9c11 --- /dev/null +++ b/voip_crm/i18n/uk.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Ukrainian (https://app.transifex.com/odoo/teams/41243/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Додати до черги дзінків" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "У черзі дзвінка" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Лід/Нагода" diff --git a/voip_crm/i18n/vi.po b/voip_crm/i18n/vi.po new file mode 100644 index 0000000..24baaff --- /dev/null +++ b/voip_crm/i18n/vi.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Thi Huong Nguyen, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Thi Huong Nguyen, 2023\n" +"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "Thêm vào danh sách cuộc gọi chờ" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "Có trong danh sách cuộc gọi chờ" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "Lead/Cơ hội" diff --git a/voip_crm/i18n/voip_crm.pot b/voip_crm/i18n/voip_crm.pot new file mode 100644 index 0000000..5363c53 --- /dev/null +++ b/voip_crm/i18n/voip_crm.pot @@ -0,0 +1,26 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 22:21+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "" diff --git a/voip_crm/i18n/zh_CN.po b/voip_crm/i18n/zh_CN.po new file mode 100644 index 0000000..4e6312a --- /dev/null +++ b/voip_crm/i18n/zh_CN.po @@ -0,0 +1,35 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_crm +#: model:ir.actions.server,name:voip_crm.action_add_to_call_queue +msgid "Add to call queue" +msgstr "添加到呼叫队列" + +#. module: voip_crm +#: model:ir.model.fields,field_description:voip_crm.field_crm_lead__has_call_in_queue +msgid "Is in the Call Queue" +msgstr "在呼叫队列" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "线索/商机" diff --git a/voip_crm/i18n/zh_TW.po b/voip_crm/i18n/zh_TW.po new file mode 100644 index 0000000..899181c --- /dev/null +++ b/voip_crm/i18n/zh_TW.po @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_crm +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-12-15 13:30+0000\n" +"PO-Revision-Date: 2022-12-16 09:35+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/odoo/teams/41243/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_crm +#: model:ir.model,name:voip_crm.model_crm_lead +msgid "Lead/Opportunity" +msgstr "潛在商機/商機" diff --git a/voip_crm/models/__init__.py b/voip_crm/models/__init__.py new file mode 100644 index 0000000..26f8c1d --- /dev/null +++ b/voip_crm/models/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import crm_lead diff --git a/voip_crm/models/crm_lead.py b/voip_crm/models/crm_lead.py new file mode 100644 index 0000000..2f195ad --- /dev/null +++ b/voip_crm/models/crm_lead.py @@ -0,0 +1,8 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class CrmLead(models.Model): + _name = "crm.lead" + _inherit = ["crm.lead", "voip.queue.mixin"] diff --git a/voip_crm/static/tests/correspondence_details_tests.js b/voip_crm/static/tests/correspondence_details_tests.js new file mode 100644 index 0000000..40b42f5 --- /dev/null +++ b/voip_crm/static/tests/correspondence_details_tests.js @@ -0,0 +1,37 @@ +/* @odoo-module */ + +import { startServer } from "@bus/../tests/helpers/mock_python_environment"; + +import { start } from "@mail/../tests/helpers/test_utils"; + +import { click, contains } from "@web/../tests/utils"; + +QUnit.module("correspondence_details"); + +QUnit.test("Clicking on the “open record” button opens the corresponding record.", async () => { + const pyEnv = await startServer(); + const [activityTypeId] = pyEnv["mail.activity.type"].search([["category", "=", "phonecall"]]); + const leadId = pyEnv["crm.lead"].create({ + phone: "+1 246 203 6982", + name: "Vincent's Birthday", + }); + pyEnv["mail.activity"].create({ + activity_type_id: activityTypeId, + date_deadline: "1998-08-13", + res_id: leadId, + res_model: "crm.lead", + user_id: pyEnv.currentUserId, + }); + await start({ + serverData: { + views: { + "crm.lead,false,form": "
", + }, + }, + }); + await click(".o_menu_systray button[title='Open Softphone']"); + await click(".o-voip-ActivitiesTab .list-group-item-action", { text: "Vincent's Birthday" }); + await contains(".o_form_view", { count: 0 }); + await click(".o-voip-CorrespondenceDetails button .fa-wpforms"); + await contains(".o_form_view"); +}); diff --git a/voip_crm/static/tests/helpers/mock_server/crm_lead.js b/voip_crm/static/tests/helpers/mock_server/crm_lead.js new file mode 100644 index 0000000..3f3a4f1 --- /dev/null +++ b/voip_crm/static/tests/helpers/mock_server/crm_lead.js @@ -0,0 +1,24 @@ +/* @odoo-module */ + +import { patch } from "@web/core/utils/patch"; +import { MockServer } from "@web/../tests/helpers/mock_server"; + +patch(MockServer.prototype, { + /** + * @override + */ + async _performRPC(_route, { model, method, args, kwargs }) { + if (model !== "crm.lead") { + return super._performRPC(...arguments); + } + switch (method) { + case "get_formview_id": + return this._mockCrmLeadGetFormviewId(...args, kwargs); + default: + return super._performRPC(...arguments); + } + }, + _mockCrmLeadGetFormviewId() { + return false; + }, +}); diff --git a/voip_crm/views/crm_lead_views.xml b/voip_crm/views/crm_lead_views.xml new file mode 100644 index 0000000..01fb7ae --- /dev/null +++ b/voip_crm/views/crm_lead_views.xml @@ -0,0 +1,17 @@ + + + + + crm.lead.view.kanban.inherit.voip + crm.lead + + + + + + + + + + diff --git a/voip_onsip/__init__.py b/voip_onsip/__init__.py new file mode 100644 index 0000000..d6210b1 --- /dev/null +++ b/voip_onsip/__init__.py @@ -0,0 +1,3 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models diff --git a/voip_onsip/__manifest__.py b/voip_onsip/__manifest__.py new file mode 100644 index 0000000..e61ab7e --- /dev/null +++ b/voip_onsip/__manifest__.py @@ -0,0 +1,19 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + "name": "VoIP OnSIP", + "description": """Enables VoIP compatibility with OnSIP.""", + "category": "Hidden", + "version": "1.0", + "depends": ["voip"], + "data": [ + "views/res_config_settings_views.xml", + "views/res_users_views.xml", + ], + "license": "OEEL-1", + "assets": { + "web.assets_backend": [ + "voip_onsip/static/src/**/*", + ], + }, +} diff --git a/voip_onsip/i18n/af.po b/voip_onsip/i18n/af.po new file mode 100644 index 0000000..363cb69 --- /dev/null +++ b/voip_onsip/i18n/af.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Afrikaans (https://app.transifex.com/odoo/teams/41243/af/)\n" +"Language: af\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/am.po b/voip_onsip/i18n/am.po new file mode 100644 index 0000000..182bc95 --- /dev/null +++ b/voip_onsip/i18n/am.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Language-Team: Amharic (https://app.transifex.com/odoo/teams/41243/am/)\n" +"Language: am\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/ar.po b/voip_onsip/i18n/ar.po new file mode 100644 index 0000000..4be7a06 --- /dev/null +++ b/voip_onsip/i18n/ar.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Arabic (https://app.transifex.com/odoo/teams/41243/ar/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ar\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 && n%100<=99 ? 4 : 5;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "تهيئة الإعدادات " + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "اسم المستخدم لمصادقة OnSIP " + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "نطاق OnSIP " + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "رابط WebSocket الخاص بك " + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "المستخدم" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "إعدادات المستخدم " + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/az.po b/voip_onsip/i18n/az.po new file mode 100644 index 0000000..11b7679 --- /dev/null +++ b/voip_onsip/i18n/az.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Jumshud Sultanov , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Jumshud Sultanov , 2022\n" +"Language-Team: Azerbaijani (https://app.transifex.com/odoo/teams/41243/az/)\n" +"Language: az\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Parametrləri Konfiqurasiya edin" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "İstifadəçi" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/bg.po b/voip_onsip/i18n/bg.po new file mode 100644 index 0000000..912d36a --- /dev/null +++ b/voip_onsip/i18n/bg.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# KeyVillage, 2023 +# aleksandar ivanov, 2023 +# Maria Boyadjieva , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Maria Boyadjieva , 2023\n" +"Language-Team: Bulgarian (https://app.transifex.com/odoo/teams/41243/bg/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: bg\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Настройки" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL адреса на уеб гнездото Ви" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Потребител" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "Уеб гнездо" diff --git a/voip_onsip/i18n/bs.po b/voip_onsip/i18n/bs.po new file mode 100644 index 0000000..76a05a1 --- /dev/null +++ b/voip_onsip/i18n/bs.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Martin Trigaux, 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2018-09-21 14:06+0000\n" +"Last-Translator: Martin Trigaux, 2018\n" +"Language-Team: Bosnian (https://www.transifex.com/odoo/teams/41243/bs/)\n" +"Language: bs\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/ca.po b/voip_onsip/i18n/ca.po new file mode 100644 index 0000000..e0f6266 --- /dev/null +++ b/voip_onsip/i18n/ca.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Ivan Espinola, 2023 +# Óscar Fonseca , 2023 +# Martin Trigaux, 2023 +# Jonatan Gk, 2023 +# marcescu, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: marcescu, 2023\n" +"Language-Team: Catalan (https://app.transifex.com/odoo/teams/41243/ca/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ca\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Paràmetres de configuració" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nom d'usuari d'autenticació OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Domini OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "L'URL del WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Usuari" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Arranjament d' usuari" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/cs.po b/voip_onsip/i18n/cs.po new file mode 100644 index 0000000..3aa8743 --- /dev/null +++ b/voip_onsip/i18n/cs.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Jakub Smolka, 2023 +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Czech (https://app.transifex.com/odoo/teams/41243/cs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: cs\n" +"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurační nastavení" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP doména" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Adresa URL vašeho webu WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Uživatel" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Uživatelské nastavení" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/da.po b/voip_onsip/i18n/da.po new file mode 100644 index 0000000..0b30617 --- /dev/null +++ b/voip_onsip/i18n/da.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Mads Søndergaard, 2023 +# Martin Trigaux, 2023 +# Ejner Sønniksen , 2023 +# Sanne Kristensen , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Sanne Kristensen , 2024\n" +"Language-Team: Danish (https://app.transifex.com/odoo/teams/41243/da/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: da\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurer opsætning" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP Domæne" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "The URL of your WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Bruger" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Bruger indstillinger" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/de.po b/voip_onsip/i18n/de.po new file mode 100644 index 0000000..e12cec2 --- /dev/null +++ b/voip_onsip/i18n/de.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: German (https://app.transifex.com/odoo/teams/41243/de/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: de\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen " + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP-Auth-Benutzername" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP-Domain" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Die URL Ihres WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Benutzer" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Benutzereinstellungen" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/el.po b/voip_onsip/i18n/el.po new file mode 100644 index 0000000..2ee631e --- /dev/null +++ b/voip_onsip/i18n/el.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Martin Trigaux, 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2018-09-21 14:06+0000\n" +"Last-Translator: Martin Trigaux, 2018\n" +"Language-Team: Greek (https://www.transifex.com/odoo/teams/41243/el/)\n" +"Language: el\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/es.po b/voip_onsip/i18n/es.po new file mode 100644 index 0000000..241de7d --- /dev/null +++ b/voip_onsip/i18n/es.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# Larissa Manderfeld, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Larissa Manderfeld, 2023\n" +"Language-Team: Spanish (https://app.transifex.com/odoo/teams/41243/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nombre de usuario de autorización OnSIP " + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Dominio de OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "La URL de su WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Ajustes de usuario" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/es_419.po b/voip_onsip/i18n/es_419.po new file mode 100644 index 0000000..a58c6bd --- /dev/null +++ b/voip_onsip/i18n/es_419.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Spanish (Latin America) (https://app.transifex.com/odoo/teams/41243/es_419/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_419\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Ajustes de configuración" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nombre de usuario de autorización OnSIP " + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Dominio OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "La dirección URL de su WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Ajustes de usuario" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/es_CL.po b/voip_onsip/i18n/es_CL.po new file mode 100644 index 0000000..16e5d1f --- /dev/null +++ b/voip_onsip/i18n/es_CL.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Spanish (Chile) (https://www.transifex.com/odoo/teams/41243/es_CL/)\n" +"Language: es_CL\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/et.po b/voip_onsip/i18n/et.po new file mode 100644 index 0000000..ecbed11 --- /dev/null +++ b/voip_onsip/i18n/et.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Triine Aavik , 2023 +# Arma Gedonsky , 2023 +# Leaanika Randmets, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Leaanika Randmets, 2023\n" +"Language-Team: Estonian (https://app.transifex.com/odoo/teams/41243/et/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: et\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Seadistused" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP Auth kasutajanimi" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP domeen" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Teie WebSocket'i URL" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Kasutaja" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Kasutaja seaded" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/eu.po b/voip_onsip/i18n/eu.po new file mode 100644 index 0000000..d27b0f8 --- /dev/null +++ b/voip_onsip/i18n/eu.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Basque (https://www.transifex.com/odoo/teams/41243/eu/)\n" +"Language: eu\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/fa.po b/voip_onsip/i18n/fa.po new file mode 100644 index 0000000..d7a3a14 --- /dev/null +++ b/voip_onsip/i18n/fa.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Hamed Mohammadi , 2023 +# Martin Trigaux, 2023 +# Hanna Kheradroosta, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Hanna Kheradroosta, 2023\n" +"Language-Team: Persian (https://app.transifex.com/odoo/teams/41243/fa/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fa\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "تنظیمات پیکربندی" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "کاربر" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "تنظیمات کاربر" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/fi.po b/voip_onsip/i18n/fi.po new file mode 100644 index 0000000..6df9b6a --- /dev/null +++ b/voip_onsip/i18n/fi.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Jarmo Kortetjärvi , 2023 +# Ossi Mantylahti , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Ossi Mantylahti , 2023\n" +"Language-Team: Finnish (https://app.transifex.com/odoo/teams/41243/fi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Asetukset" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP Auth Käyttäjätunnus" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP-toimialue" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "WebSocketin URL-osoite" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Käyttäjä" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Käyttäjäasetukset" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/fo.po b/voip_onsip/i18n/fo.po new file mode 100644 index 0000000..a21827b --- /dev/null +++ b/voip_onsip/i18n/fo.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Faroese (https://www.transifex.com/odoo/teams/41243/fo/)\n" +"Language: fo\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/fr.po b/voip_onsip/i18n/fr.po new file mode 100644 index 0000000..9c20ac1 --- /dev/null +++ b/voip_onsip/i18n/fr.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: French (https://app.transifex.com/odoo/teams/41243/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de configuration" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nom d'utilisateur Auth OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Domaine OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "L'URL de votre WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Utilisateur" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Paramètres utilisateur" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/gl.po b/voip_onsip/i18n/gl.po new file mode 100644 index 0000000..3fb4394 --- /dev/null +++ b/voip_onsip/i18n/gl.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Galician (https://www.transifex.com/odoo/teams/41243/gl/)\n" +"Language: gl\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/gu.po b/voip_onsip/i18n/gu.po new file mode 100644 index 0000000..3b3ef85 --- /dev/null +++ b/voip_onsip/i18n/gu.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Qaidjohar Barbhaya, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Qaidjohar Barbhaya, 2023\n" +"Language-Team: Gujarati (https://app.transifex.com/odoo/teams/41243/gu/)\n" +"Language: gu\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Config Settings" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "User" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/he.po b/voip_onsip/i18n/he.po new file mode 100644 index 0000000..72bc740 --- /dev/null +++ b/voip_onsip/i18n/he.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# ZVI BLONDER , 2023 +# Yihya Hugirat , 2023 +# NoaFarkash, 2023 +# yael terner, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: yael terner, 2024\n" +"Language-Team: Hebrew (https://app.transifex.com/odoo/teams/41243/he/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: he\n" +"Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "הגדר הגדרות" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "שם משתמש OnSIP Auth" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "משתמש" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "הגדרות משתמש" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/hr.po b/voip_onsip/i18n/hr.po new file mode 100644 index 0000000..4884ac9 --- /dev/null +++ b/voip_onsip/i18n/hr.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Bole , 2022 +# Martin Trigaux, 2022 +# Tina Milas, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Tina Milas, 2022\n" +"Language-Team: Croatian (https://app.transifex.com/odoo/teams/41243/hr/)\n" +"Language: hr\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Postavke" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL Vašeg WebSocketa" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Korisnik" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/hu.po b/voip_onsip/i18n/hu.po new file mode 100644 index 0000000..48fdc60 --- /dev/null +++ b/voip_onsip/i18n/hu.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Zsolt Godó , 2023 +# krnkris, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: krnkris, 2023\n" +"Language-Team: Hungarian (https://app.transifex.com/odoo/teams/41243/hu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Beállítások módosítása" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "A WebSoccet URL webcíme" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Felhasználó" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/hy.po b/voip_onsip/i18n/hy.po new file mode 100644 index 0000000..b5422dc --- /dev/null +++ b/voip_onsip/i18n/hy.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Language-Team: Armenian (https://app.transifex.com/odoo/teams/41243/hy/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hy\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/id.po b/voip_onsip/i18n/id.po new file mode 100644 index 0000000..e1a01bc --- /dev/null +++ b/voip_onsip/i18n/id.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# Abe Manyo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Abe Manyo, 2023\n" +"Language-Team: Indonesian (https://app.transifex.com/odoo/teams/41243/id/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: id\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Pengaturan Konfigurasi" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Username Auth OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Domain OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL dari WebSocket Anda" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Pengguna" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Pengaturan User" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/is.po b/voip_onsip/i18n/is.po new file mode 100644 index 0000000..3d3cca2 --- /dev/null +++ b/voip_onsip/i18n/is.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Kristófer Arnþórsson, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Kristófer Arnþórsson, 2024\n" +"Language-Team: Icelandic (https://app.transifex.com/odoo/teams/41243/is/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: is\n" +"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Stillingarvalkostir" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Notandi" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/it.po b/voip_onsip/i18n/it.po new file mode 100644 index 0000000..ae50a31 --- /dev/null +++ b/voip_onsip/i18n/it.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Italian (https://app.transifex.com/odoo/teams/41243/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni di configurazione" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nome utente Auth OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Dominio OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "L'URL del tuo WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Utente" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Impostazioni utente" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/ja.po b/voip_onsip/i18n/ja.po new file mode 100644 index 0000000..8b67146 --- /dev/null +++ b/voip_onsip/i18n/ja.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Japanese (https://app.transifex.com/odoo/teams/41243/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "コンフィグ設定" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP認証ユーザ名" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIPドメイン" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "ウェブソケットのURL" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "ユーザ" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "ユーザ設定" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "ウェブソケット" diff --git a/voip_onsip/i18n/ka.po b/voip_onsip/i18n/ka.po new file mode 100644 index 0000000..9a8a868 --- /dev/null +++ b/voip_onsip/i18n/ka.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Saba Khmaladze , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Last-Translator: Saba Khmaladze , 2018\n" +"Language-Team: Georgian (https://www.transifex.com/odoo/teams/41243/ka/)\n" +"Language: ka\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/kab.po b/voip_onsip/i18n/kab.po new file mode 100644 index 0000000..4c68b2f --- /dev/null +++ b/voip_onsip/i18n/kab.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Kabyle (https://www.transifex.com/odoo/teams/41243/kab/)\n" +"Language: kab\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/km.po b/voip_onsip/i18n/km.po new file mode 100644 index 0000000..f26b37b --- /dev/null +++ b/voip_onsip/i18n/km.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Sengtha Chay , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2018-09-21 14:06+0000\n" +"Last-Translator: Sengtha Chay , 2018\n" +"Language-Team: Khmer (https://www.transifex.com/odoo/teams/41243/km/)\n" +"Language: km\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/ko.po b/voip_onsip/i18n/ko.po new file mode 100644 index 0000000..ceb3074 --- /dev/null +++ b/voip_onsip/i18n/ko.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Korean (https://app.transifex.com/odoo/teams/41243/ko/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ko\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "환경 설정" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP 인증 사용자 이름" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP 도메인" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "웹소켓 URL" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "사용자" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "사용자 설정" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "웹소켓" diff --git a/voip_onsip/i18n/lb.po b/voip_onsip/i18n/lb.po new file mode 100644 index 0000000..e147fcc --- /dev/null +++ b/voip_onsip/i18n/lb.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2019-08-26 09:38+0000\n" +"Language-Team: Luxembourgish (https://www.transifex.com/odoo/teams/41243/lb/)\n" +"Language: lb\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/lo.po b/voip_onsip/i18n/lo.po new file mode 100644 index 0000000..c6ee305 --- /dev/null +++ b/voip_onsip/i18n/lo.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Lao (https://www.transifex.com/odoo/teams/41243/lo/)\n" +"Language: lo\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/lt.po b/voip_onsip/i18n/lt.po new file mode 100644 index 0000000..6d59199 --- /dev/null +++ b/voip_onsip/i18n/lt.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Linas Versada , 2023 +# Monika Raciunaite , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Monika Raciunaite , 2023\n" +"Language-Team: Lithuanian (https://app.transifex.com/odoo/teams/41243/lt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lt\n" +"Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigūracijos nustatymai" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Vartotojas" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/lv.po b/voip_onsip/i18n/lv.po new file mode 100644 index 0000000..9726784 --- /dev/null +++ b/voip_onsip/i18n/lv.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Armīns Jeltajevs , 2023 +# ievaputnina , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: ievaputnina , 2023\n" +"Language-Team: Latvian (https://app.transifex.com/odoo/teams/41243/lv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: lv\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurācijas uzstādījumi" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Lietotājs" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Lietotāja iestatījumi" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/mk.po b/voip_onsip/i18n/mk.po new file mode 100644 index 0000000..8537f48 --- /dev/null +++ b/voip_onsip/i18n/mk.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Macedonian (https://www.transifex.com/odoo/teams/41243/mk/)\n" +"Language: mk\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/mn.po b/voip_onsip/i18n/mn.po new file mode 100644 index 0000000..9b3ab49 --- /dev/null +++ b/voip_onsip/i18n/mn.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# tserendavaa tsogtoo , 2022 +# Martin Trigaux, 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.5alpha1+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2022-09-22 05:49+0000\n" +"Last-Translator: Martin Trigaux, 2022\n" +"Language-Team: Mongolian (https://app.transifex.com/odoo/teams/41243/mn/)\n" +"Language: mn\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Тохиргооны тохируулга" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP домэйн" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "Таны WebSocket - н URL " + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Хэрэглэгч" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/nb.po b/voip_onsip/i18n/nb.po new file mode 100644 index 0000000..a998edc --- /dev/null +++ b/voip_onsip/i18n/nb.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Marius Stedjan , 2024 +# Martin Trigaux, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Martin Trigaux, 2024\n" +"Language-Team: Norwegian Bokmål (https://app.transifex.com/odoo/teams/41243/nb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Innstillinger" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP-domene" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Bruker" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/ne.po b/voip_onsip/i18n/ne.po new file mode 100644 index 0000000..930626d --- /dev/null +++ b/voip_onsip/i18n/ne.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Bishisht Bhatta , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Last-Translator: Bishisht Bhatta , 2018\n" +"Language-Team: Nepali (https://www.transifex.com/odoo/teams/41243/ne/)\n" +"Language: ne\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/nl.po b/voip_onsip/i18n/nl.po new file mode 100644 index 0000000..abb5922 --- /dev/null +++ b/voip_onsip/i18n/nl.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Dutch (https://app.transifex.com/odoo/teams/41243/nl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: nl\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Configuratie instellingen" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP Auth Gebruikersnaam" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP domein" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "De URL van je websocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Gebruikersinstellingen" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/nl_BE.po b/voip_onsip/i18n/nl_BE.po new file mode 100644 index 0000000..7dcdd8f --- /dev/null +++ b/voip_onsip/i18n/nl_BE.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Dutch (Belgium) (https://www.transifex.com/odoo/teams/41243/nl_BE/)\n" +"Language: nl_BE\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/pl.po b/voip_onsip/i18n/pl.po new file mode 100644 index 0000000..384a4d3 --- /dev/null +++ b/voip_onsip/i18n/pl.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Polish (https://app.transifex.com/odoo/teams/41243/pl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pl\n" +"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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Ustawienia konfiguracji" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nazwa użytkownika OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Domena onSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Użytkownik" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Ustawienia użytkownika" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/pt.po b/voip_onsip/i18n/pt.po new file mode 100644 index 0000000..8e137e7 --- /dev/null +++ b/voip_onsip/i18n/pt.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# Marta Marouço, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Marta Marouço, 2024\n" +"Language-Team: Portuguese (https://app.transifex.com/odoo/teams/41243/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Domínio OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Utilizador" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Configurações do Utilizador" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/pt_BR.po b/voip_onsip/i18n/pt_BR.po new file mode 100644 index 0000000..a9e3607 --- /dev/null +++ b/voip_onsip/i18n/pt_BR.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Portuguese (Brazil) (https://app.transifex.com/odoo/teams/41243/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Nome de usuário do Auth OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Domínio OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "O URL do seu WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Usuário" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Configurações do usuário" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/ro.po b/voip_onsip/i18n/ro.po new file mode 100644 index 0000000..8fb45d0 --- /dev/null +++ b/voip_onsip/i18n/ro.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Dorin Hongu , 2024 +# Foldi Robert , 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Foldi Robert , 2024\n" +"Language-Team: Romanian (https://app.transifex.com/odoo/teams/41243/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Setări de configurare" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL-ul WebSocket-ului dvs." + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Utilizator" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Setări utilizator" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/ru.po b/voip_onsip/i18n/ru.po new file mode 100644 index 0000000..40633c4 --- /dev/null +++ b/voip_onsip/i18n/ru.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Vasiliy Korobatov , 2023 +# Martin Trigaux, 2023 +# Wil Odoo, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2024\n" +"Language-Team: Russian (https://app.transifex.com/odoo/teams/41243/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ru\n" +"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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Параметры конфигурации" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Имя пользователя OnSIP Auth" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Домен OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL вашего WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Пользователь" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Настройки пользователя" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/sk.po b/voip_onsip/i18n/sk.po new file mode 100644 index 0000000..352edd4 --- /dev/null +++ b/voip_onsip/i18n/sk.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Slovak (https://app.transifex.com/odoo/teams/41243/sk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Nastavenia konfigurácie" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL vášho WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Užívateľ" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/sl.po b/voip_onsip/i18n/sl.po new file mode 100644 index 0000000..59a6e77 --- /dev/null +++ b/voip_onsip/i18n/sl.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Grega Vavtar , 2023 +# Matjaz Mozetic , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Matjaz Mozetic , 2023\n" +"Language-Team: Slovenian (https://app.transifex.com/odoo/teams/41243/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Uredi nastavitve" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Uporabnik" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/sq.po b/voip_onsip/i18n/sq.po new file mode 100644 index 0000000..14a4d89 --- /dev/null +++ b/voip_onsip/i18n/sq.po @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Language-Team: Albanian (https://www.transifex.com/odoo/teams/41243/sq/)\n" +"Language: sq\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/sr.po b/voip_onsip/i18n/sr.po new file mode 100644 index 0000000..a82f59a --- /dev/null +++ b/voip_onsip/i18n/sr.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Milan Bojovic , 2023 +# Dragan Vukosavljevic , 2023 +# コフスタジオ, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: コフスタジオ, 2024\n" +"Language-Team: Serbian (https://app.transifex.com/odoo/teams/41243/sr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sr\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Podešavanje konfiguracije" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP Auth Username" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP Domain" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "The URL of your WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Korisnik" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Podešavanja korisnika" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/sr@latin.po b/voip_onsip/i18n/sr@latin.po new file mode 100644 index 0000000..6071312 --- /dev/null +++ b/voip_onsip/i18n/sr@latin.po @@ -0,0 +1,55 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 10.saas~18+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 10:16+0000\n" +"PO-Revision-Date: 2017-09-20 11:33+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/odoo/teams/41243/sr%40latin/)\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" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/sv.po b/voip_onsip/i18n/sv.po new file mode 100644 index 0000000..822fa4d --- /dev/null +++ b/voip_onsip/i18n/sv.po @@ -0,0 +1,58 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Chrille Hedberg , 2023 +# Anders Wallenquist , 2023 +# Kim Asplund , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Kim Asplund , 2023\n" +"Language-Team: Swedish (https://app.transifex.com/odoo/teams/41243/sv/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sv\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Inställningar" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Användare" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Användarinställningar" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/th.po b/voip_onsip/i18n/th.po new file mode 100644 index 0000000..92c8723 --- /dev/null +++ b/voip_onsip/i18n/th.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# Rasareeyar Lappiam, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Rasareeyar Lappiam, 2024\n" +"Language-Team: Thai (https://app.transifex.com/odoo/teams/41243/th/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: th\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "ตั้งค่าการกำหนดค่า" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "ชื่อผู้ใช้การตรวจสอบสิทธิ์ OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "โดเมน OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL ของ WebSocket ของคุณ" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "ผู้ใช้" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "การตั้งค่าผู้ใช้" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/tr.po b/voip_onsip/i18n/tr.po new file mode 100644 index 0000000..470a6ac --- /dev/null +++ b/voip_onsip/i18n/tr.po @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# abc Def , 2023 +# Umur Akın , 2023 +# Murat Kaplan , 2023 +# Ertuğrul Güreş , 2023 +# Fırat Kaya , 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Fırat Kaya , 2023\n" +"Language-Team: Turkish (https://app.transifex.com/odoo/teams/41243/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Yapılandırma Ayarları" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP Domain" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "WebSocket URL Adresiniz" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Kullanıcı" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Kullanıcı ayarları" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/uk.po b/voip_onsip/i18n/uk.po new file mode 100644 index 0000000..3e0c319 --- /dev/null +++ b/voip_onsip/i18n/uk.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Ukrainian (https://app.transifex.com/odoo/teams/41243/uk/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Налаштування" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Ім'я користувача OnSIP Auth" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Домен OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL вашого WebSocket" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Користувач" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Налаштування користувача" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/vi.po b/voip_onsip/i18n/vi.po new file mode 100644 index 0000000..c08b753 --- /dev/null +++ b/voip_onsip/i18n/vi.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# Thi Huong Nguyen, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Thi Huong Nguyen, 2024\n" +"Language-Team: Vietnamese (https://app.transifex.com/odoo/teams/41243/vi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: vi\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "Cài đặt cấu hình" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "Tên người dùng xác minh OnSIP" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "Miền OnSIP" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "URL của WebSocket của bạn" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "Người dùng" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "Cài đặt người dùng" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/voip_onsip.pot b/voip_onsip/i18n/voip_onsip.pot new file mode 100644 index 0000000..828acee --- /dev/null +++ b/voip_onsip/i18n/voip_onsip.pot @@ -0,0 +1,52 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 22:21+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "" diff --git a/voip_onsip/i18n/zh_CN.po b/voip_onsip/i18n/zh_CN.po new file mode 100644 index 0000000..0fe011e --- /dev/null +++ b/voip_onsip/i18n/zh_CN.po @@ -0,0 +1,56 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Wil Odoo, 2023\n" +"Language-Team: Chinese (China) (https://app.transifex.com/odoo/teams/41243/zh_CN/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_CN\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "配置设置" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP认证用户名" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP 域" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "你的WebSocket的网址" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "用户" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "用户设置" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/i18n/zh_TW.po b/voip_onsip/i18n/zh_TW.po new file mode 100644 index 0000000..1fe12e9 --- /dev/null +++ b/voip_onsip/i18n/zh_TW.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * voip_onsip +# +# Translators: +# Wil Odoo, 2023 +# Tony Ng, 2024 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-26 22:21+0000\n" +"PO-Revision-Date: 2023-10-26 23:10+0000\n" +"Last-Translator: Tony Ng, 2024\n" +"Language-Team: Chinese (Taiwan) (https://app.transifex.com/odoo/teams/41243/zh_TW/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: zh_TW\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_config_settings +msgid "Config Settings" +msgstr "配置設定" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_users__onsip_auth_username +#: model:ir.model.fields,field_description:voip_onsip.field_res_users_settings__onsip_auth_username +msgid "OnSIP Auth Username" +msgstr "OnSIP 驗證用戶名" + +#. module: voip_onsip +#: model_terms:ir.ui.view,arch_db:voip_onsip.res_config_settings_view_form +msgid "OnSIP Domain" +msgstr "OnSIP 網域" + +#. module: voip_onsip +#: model:ir.model.fields,help:voip_onsip.field_res_config_settings__wsServer +msgid "The URL of your WebSocket" +msgstr "你的 WebSocket 的網址" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users +msgid "User" +msgstr "使用者" + +#. module: voip_onsip +#: model:ir.model,name:voip_onsip.model_res_users_settings +msgid "User Settings" +msgstr "使用者設定" + +#. module: voip_onsip +#: model:ir.model.fields,field_description:voip_onsip.field_res_config_settings__wsServer +msgid "WebSocket" +msgstr "WebSocket" diff --git a/voip_onsip/models/__init__.py b/voip_onsip/models/__init__.py new file mode 100644 index 0000000..df23a28 --- /dev/null +++ b/voip_onsip/models/__init__.py @@ -0,0 +1,5 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import res_config_settings +from . import res_users_settings +from . import res_users diff --git a/voip_onsip/models/res_config_settings.py b/voip_onsip/models/res_config_settings.py new file mode 100644 index 0000000..55bf346 --- /dev/null +++ b/voip_onsip/models/res_config_settings.py @@ -0,0 +1,9 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + wsServer = fields.Char(default="wss://edge.sip.onsip.com", config_parameter="voip.wsServer") diff --git a/voip_onsip/models/res_users.py b/voip_onsip/models/res_users.py new file mode 100644 index 0000000..cd893e0 --- /dev/null +++ b/voip_onsip/models/res_users.py @@ -0,0 +1,24 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models, fields + + +class ResUsers(models.Model): + _inherit = "res.users" + + onsip_auth_username = fields.Char( + related="res_users_settings_id.onsip_auth_username", inverse="_inverse_onsip_auth_username", related_sudo=False + ) + + @property + def SELF_READABLE_FIELDS(self): + return super().SELF_READABLE_FIELDS + ["onsip_auth_username"] + + @property + def SELF_WRITEABLE_FIELDS(self): + return super().SELF_WRITEABLE_FIELDS + ["onsip_auth_username"] + + def _inverse_onsip_auth_username(self): + for user in self: + res_users_settings_record = self.env["res.users.settings"]._find_or_create_for_user(user) + res_users_settings_record.onsip_auth_username = user.onsip_auth_username diff --git a/voip_onsip/models/res_users_settings.py b/voip_onsip/models/res_users_settings.py new file mode 100644 index 0000000..be921b6 --- /dev/null +++ b/voip_onsip/models/res_users_settings.py @@ -0,0 +1,9 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResUsersSettings(models.Model): + _inherit = "res.users.settings" + + onsip_auth_username = fields.Char("OnSIP Auth Username") diff --git a/voip_onsip/static/description/icon.png b/voip_onsip/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d664de59d780d0ae8c9667ad362a983ccac0b5 GIT binary patch literal 631 zcmV--0*L*IP)OZ~r}Q{L$6h58To~0000UbW%=J z0APT>-$3ucAP_;2pCEuxub*!)@88dmaA2=buMkJk%LV`d0jNntK~!ko?bhv*f*=%t z;e!Vd#7*t{V^{9~F4w>fj7FO#ezbF*UwQ)GshKRu!8)hP+An~UwU9&CZS8kg4UrW< z=_47G*Y_|)O8Bz5Bc-iQ+cI-xwOf^4_Q+~$tL%}=?jU;vcHK2X2qAZH=jekr74nyYxF~6~J8;gF5yD9TG!;$E(HkxobrvJNF(V+>=PnHlH(5dQ=UfBjeY9)II@QUCgbG@LU?(=eL0Ru(+D1p z!)W&h`66w9BU`5PL_|MP zs~iz%c=CLBbHr!rxPuuYo-q4cWs@c1DR%Z#@%~7|t~PF*ErNc5UfAY6Z@QIVwbObT$IsEJPqi5sG|R1lJm}S|igy2qA diff --git a/voip_onsip/static/src/user_settings_service_patch.js b/voip_onsip/static/src/user_settings_service_patch.js new file mode 100644 index 0000000..d49965f --- /dev/null +++ b/voip_onsip/static/src/user_settings_service_patch.js @@ -0,0 +1,14 @@ +/* @odoo-module */ + +import { UserSettings } from "@mail/core/common/user_settings_service"; + +import { patch } from "@web/core/utils/patch"; + +patch(UserSettings.prototype, { + updateFromCommands(settings) { + super.updateFromCommands(settings); + if ("onsip_auth_username" in settings) { + this.onsip_auth_username = settings.onsip_auth_username; + } + }, +}); diff --git a/voip_onsip/static/src/voip_service_patch.js b/voip_onsip/static/src/voip_service_patch.js new file mode 100644 index 0000000..a48a022 --- /dev/null +++ b/voip_onsip/static/src/voip_service_patch.js @@ -0,0 +1,14 @@ +/* @odoo-module */ + +import { Voip } from "@voip/core/voip_service"; + +import { patch } from "@web/core/utils/patch"; + +patch(Voip.prototype, { + get areCredentialsSet() { + return Boolean(this.settings.onsip_auth_username) && super.areCredentialsSet; + }, + get authorizationUsername() { + return this.settings.onsip_auth_username || ""; + }, +}); diff --git a/voip_onsip/views/res_config_settings_views.xml b/voip_onsip/views/res_config_settings_views.xml new file mode 100644 index 0000000..ead2a17 --- /dev/null +++ b/voip_onsip/views/res_config_settings_views.xml @@ -0,0 +1,15 @@ + + + + + res.config.settings.inherit.onsip + res.config.settings + + + + + + + + diff --git a/voip_onsip/views/res_users_views.xml b/voip_onsip/views/res_users_views.xml new file mode 100644 index 0000000..76f0359 --- /dev/null +++ b/voip_onsip/views/res_users_views.xml @@ -0,0 +1,23 @@ + + + + VOIP OnSIP in User Form + res.users + + + + + + + + + VOIP OnSIP in Preferences Form + res.users + + + + + + + +