From 3751379f1e9a4c215fb6eb898b4ccc67659b9ace Mon Sep 17 00:00:00 2001 From: stephanchrst Date: Tue, 10 May 2022 21:51:50 +0700 Subject: initial commit 2 --- addons/sms/__init__.py | 5 + addons/sms/__manifest__.py | 49 + addons/sms/data/ir_cron_data.xml | 14 + addons/sms/data/mail_demo.xml | 86 ++ addons/sms/data/sms_demo.xml | 8 + addons/sms/i18n/ar.po | 1327 +++++++++++++++++++ addons/sms/i18n/az.po | 140 ++ addons/sms/i18n/bg.po | 1345 +++++++++++++++++++ addons/sms/i18n/bn.po | 1317 ++++++++++++++++++ addons/sms/i18n/bs.po | 145 ++ addons/sms/i18n/ca.po | 1341 +++++++++++++++++++ addons/sms/i18n/ckb.po | 1298 ++++++++++++++++++ addons/sms/i18n/cs.po | 1366 +++++++++++++++++++ addons/sms/i18n/da.po | 1366 +++++++++++++++++++ addons/sms/i18n/de.po | 1369 +++++++++++++++++++ addons/sms/i18n/el.po | 1337 +++++++++++++++++++ addons/sms/i18n/eo.po | 1283 ++++++++++++++++++ addons/sms/i18n/es.po | 1374 +++++++++++++++++++ addons/sms/i18n/es_MX.po | 1384 +++++++++++++++++++ addons/sms/i18n/et.po | 1336 +++++++++++++++++++ addons/sms/i18n/eu.po | 1328 +++++++++++++++++++ addons/sms/i18n/fa.po | 1323 +++++++++++++++++++ addons/sms/i18n/fi.po | 1332 +++++++++++++++++++ addons/sms/i18n/fr.po | 1395 ++++++++++++++++++++ addons/sms/i18n/gu.po | 147 +++ addons/sms/i18n/he.po | 1339 +++++++++++++++++++ addons/sms/i18n/hi.po | 1316 ++++++++++++++++++ addons/sms/i18n/hr.po | 1340 +++++++++++++++++++ addons/sms/i18n/hu.po | 1339 +++++++++++++++++++ addons/sms/i18n/id.po | 1342 +++++++++++++++++++ addons/sms/i18n/is.po | 146 ++ addons/sms/i18n/it.po | 1376 +++++++++++++++++++ addons/sms/i18n/ja.po | 1319 ++++++++++++++++++ addons/sms/i18n/ka.po | 1322 +++++++++++++++++++ addons/sms/i18n/km.po | 143 ++ addons/sms/i18n/ko.po | 1338 +++++++++++++++++++ addons/sms/i18n/lb.po | 1084 +++++++++++++++ addons/sms/i18n/lt.po | 1345 +++++++++++++++++++ addons/sms/i18n/lv.po | 1294 ++++++++++++++++++ addons/sms/i18n/mn.po | 1328 +++++++++++++++++++ addons/sms/i18n/nb.po | 1310 ++++++++++++++++++ addons/sms/i18n/nl.po | 1378 +++++++++++++++++++ addons/sms/i18n/pl.po | 1361 +++++++++++++++++++ addons/sms/i18n/pt.po | 1325 +++++++++++++++++++ addons/sms/i18n/pt_BR.po | 1355 +++++++++++++++++++ addons/sms/i18n/ro.po | 1371 +++++++++++++++++++ addons/sms/i18n/ru.po | 1349 +++++++++++++++++++ addons/sms/i18n/si.po | 1294 ++++++++++++++++++ addons/sms/i18n/sk.po | 1343 +++++++++++++++++++ addons/sms/i18n/sl.po | 1339 +++++++++++++++++++ addons/sms/i18n/sms.pot | 1312 ++++++++++++++++++ addons/sms/i18n/sr.po | 143 ++ addons/sms/i18n/sr@latin.po | 134 ++ addons/sms/i18n/sv.po | 1337 +++++++++++++++++++ addons/sms/i18n/th.po | 145 ++ addons/sms/i18n/tr.po | 1378 +++++++++++++++++++ addons/sms/i18n/uk.po | 1367 +++++++++++++++++++ addons/sms/i18n/ur.po | 1312 ++++++++++++++++++ addons/sms/i18n/vi.po | 1377 +++++++++++++++++++ addons/sms/i18n/zh_CN.po | 1348 +++++++++++++++++++ addons/sms/i18n/zh_TW.po | 1316 ++++++++++++++++++ addons/sms/models/__init__.py | 14 + addons/sms/models/ir_actions.py | 46 + addons/sms/models/ir_model.py | 41 + addons/sms/models/mail_followers.py | 24 + addons/sms/models/mail_message.py | 55 + addons/sms/models/mail_notification.py | 21 + addons/sms/models/mail_thread.py | 349 +++++ addons/sms/models/mail_thread_phone.py | 16 + addons/sms/models/res_partner.py | 21 + addons/sms/models/sms_api.py | 58 + addons/sms/models/sms_sms.py | 143 ++ addons/sms/models/sms_template.py | 66 + addons/sms/security/ir.model.access.csv | 11 + addons/sms/security/sms_security.xml | 9 + addons/sms/static/img/sms_failure.svg | 1 + addons/sms/static/src/bugfix/bugfix.js | 10 + addons/sms/static/src/bugfix/bugfix.scss | 6 + addons/sms/static/src/bugfix/bugfix.xml | 11 + addons/sms/static/src/bugfix/bugfix_tests.js | 18 + .../sms/static/src/components/message/message.xml | 20 + .../static/src/components/message/message_tests.js | 197 +++ .../notification_group/notification_group.js | 27 + .../notification_group/notification_group.xml | 12 + .../notification_list_notification_group_tests.js | 309 +++++ addons/sms/static/src/js/fields_phone_widget.js | 100 ++ addons/sms/static/src/js/fields_sms_widget.js | 185 +++ addons/sms/static/src/models/message/message.js | 33 + .../notification_group/notification_group.js | 62 + addons/sms/static/tests/sms_widget_test.js | 229 ++++ addons/sms/tests/__init__.py | 5 + addons/sms/tests/common.py | 277 ++++ addons/sms/tests/test_sms_template.py | 63 + addons/sms/views/assets.xml | 28 + addons/sms/views/ir_actions_views.xml | 20 + addons/sms/views/mail_notification_views.xml | 27 + addons/sms/views/res_config_settings_views.xml | 13 + addons/sms/views/res_partner_views.xml | 68 + addons/sms/views/sms_sms_views.xml | 68 + addons/sms/views/sms_template_views.xml | 100 ++ addons/sms/wizard/__init__.py | 6 + addons/sms/wizard/sms_cancel.py | 38 + addons/sms/wizard/sms_cancel_views.xml | 27 + addons/sms/wizard/sms_composer.py | 380 ++++++ addons/sms/wizard/sms_composer_views.xml | 78 ++ addons/sms/wizard/sms_resend.py | 115 ++ addons/sms/wizard/sms_resend_views.xml | 45 + addons/sms/wizard/sms_template_preview.py | 50 + addons/sms/wizard/sms_template_preview_views.xml | 42 + 109 files changed, 68924 insertions(+) create mode 100644 addons/sms/__init__.py create mode 100644 addons/sms/__manifest__.py create mode 100644 addons/sms/data/ir_cron_data.xml create mode 100644 addons/sms/data/mail_demo.xml create mode 100644 addons/sms/data/sms_demo.xml create mode 100644 addons/sms/i18n/ar.po create mode 100644 addons/sms/i18n/az.po create mode 100644 addons/sms/i18n/bg.po create mode 100644 addons/sms/i18n/bn.po create mode 100644 addons/sms/i18n/bs.po create mode 100644 addons/sms/i18n/ca.po create mode 100644 addons/sms/i18n/ckb.po create mode 100644 addons/sms/i18n/cs.po create mode 100644 addons/sms/i18n/da.po create mode 100644 addons/sms/i18n/de.po create mode 100644 addons/sms/i18n/el.po create mode 100644 addons/sms/i18n/eo.po create mode 100644 addons/sms/i18n/es.po create mode 100644 addons/sms/i18n/es_MX.po create mode 100644 addons/sms/i18n/et.po create mode 100644 addons/sms/i18n/eu.po create mode 100644 addons/sms/i18n/fa.po create mode 100644 addons/sms/i18n/fi.po create mode 100644 addons/sms/i18n/fr.po create mode 100644 addons/sms/i18n/gu.po create mode 100644 addons/sms/i18n/he.po create mode 100644 addons/sms/i18n/hi.po create mode 100644 addons/sms/i18n/hr.po create mode 100644 addons/sms/i18n/hu.po create mode 100644 addons/sms/i18n/id.po create mode 100644 addons/sms/i18n/is.po create mode 100644 addons/sms/i18n/it.po create mode 100644 addons/sms/i18n/ja.po create mode 100644 addons/sms/i18n/ka.po create mode 100644 addons/sms/i18n/km.po create mode 100644 addons/sms/i18n/ko.po create mode 100644 addons/sms/i18n/lb.po create mode 100644 addons/sms/i18n/lt.po create mode 100644 addons/sms/i18n/lv.po create mode 100644 addons/sms/i18n/mn.po create mode 100644 addons/sms/i18n/nb.po create mode 100644 addons/sms/i18n/nl.po create mode 100644 addons/sms/i18n/pl.po create mode 100644 addons/sms/i18n/pt.po create mode 100644 addons/sms/i18n/pt_BR.po create mode 100644 addons/sms/i18n/ro.po create mode 100644 addons/sms/i18n/ru.po create mode 100644 addons/sms/i18n/si.po create mode 100644 addons/sms/i18n/sk.po create mode 100644 addons/sms/i18n/sl.po create mode 100644 addons/sms/i18n/sms.pot create mode 100644 addons/sms/i18n/sr.po create mode 100644 addons/sms/i18n/sr@latin.po create mode 100644 addons/sms/i18n/sv.po create mode 100644 addons/sms/i18n/th.po create mode 100644 addons/sms/i18n/tr.po create mode 100644 addons/sms/i18n/uk.po create mode 100644 addons/sms/i18n/ur.po create mode 100644 addons/sms/i18n/vi.po create mode 100644 addons/sms/i18n/zh_CN.po create mode 100644 addons/sms/i18n/zh_TW.po create mode 100644 addons/sms/models/__init__.py create mode 100644 addons/sms/models/ir_actions.py create mode 100644 addons/sms/models/ir_model.py create mode 100644 addons/sms/models/mail_followers.py create mode 100644 addons/sms/models/mail_message.py create mode 100644 addons/sms/models/mail_notification.py create mode 100644 addons/sms/models/mail_thread.py create mode 100644 addons/sms/models/mail_thread_phone.py create mode 100644 addons/sms/models/res_partner.py create mode 100644 addons/sms/models/sms_api.py create mode 100644 addons/sms/models/sms_sms.py create mode 100644 addons/sms/models/sms_template.py create mode 100644 addons/sms/security/ir.model.access.csv create mode 100644 addons/sms/security/sms_security.xml create mode 100644 addons/sms/static/img/sms_failure.svg create mode 100644 addons/sms/static/src/bugfix/bugfix.js create mode 100644 addons/sms/static/src/bugfix/bugfix.scss create mode 100644 addons/sms/static/src/bugfix/bugfix.xml create mode 100644 addons/sms/static/src/bugfix/bugfix_tests.js create mode 100644 addons/sms/static/src/components/message/message.xml create mode 100644 addons/sms/static/src/components/message/message_tests.js create mode 100644 addons/sms/static/src/components/notification_group/notification_group.js create mode 100644 addons/sms/static/src/components/notification_group/notification_group.xml create mode 100644 addons/sms/static/src/components/notification_list/notification_list_notification_group_tests.js create mode 100644 addons/sms/static/src/js/fields_phone_widget.js create mode 100644 addons/sms/static/src/js/fields_sms_widget.js create mode 100644 addons/sms/static/src/models/message/message.js create mode 100644 addons/sms/static/src/models/notification_group/notification_group.js create mode 100644 addons/sms/static/tests/sms_widget_test.js create mode 100644 addons/sms/tests/__init__.py create mode 100644 addons/sms/tests/common.py create mode 100644 addons/sms/tests/test_sms_template.py create mode 100644 addons/sms/views/assets.xml create mode 100644 addons/sms/views/ir_actions_views.xml create mode 100644 addons/sms/views/mail_notification_views.xml create mode 100644 addons/sms/views/res_config_settings_views.xml create mode 100644 addons/sms/views/res_partner_views.xml create mode 100644 addons/sms/views/sms_sms_views.xml create mode 100644 addons/sms/views/sms_template_views.xml create mode 100644 addons/sms/wizard/__init__.py create mode 100644 addons/sms/wizard/sms_cancel.py create mode 100644 addons/sms/wizard/sms_cancel_views.xml create mode 100644 addons/sms/wizard/sms_composer.py create mode 100644 addons/sms/wizard/sms_composer_views.xml create mode 100644 addons/sms/wizard/sms_resend.py create mode 100644 addons/sms/wizard/sms_resend_views.xml create mode 100644 addons/sms/wizard/sms_template_preview.py create mode 100644 addons/sms/wizard/sms_template_preview_views.xml (limited to 'addons/sms') diff --git a/addons/sms/__init__.py b/addons/sms/__init__.py new file mode 100644 index 00000000..2ae6446f --- /dev/null +++ b/addons/sms/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import models +from . import wizard diff --git a/addons/sms/__manifest__.py b/addons/sms/__manifest__.py new file mode 100644 index 00000000..ca92e004 --- /dev/null +++ b/addons/sms/__manifest__.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +{ + 'name': 'SMS gateway', + 'version': '2.1', + 'category': 'Hidden/Tools', + 'summary': 'SMS Text Messaging', + 'description': """ +This module gives a framework for SMS text messaging +---------------------------------------------------- + +The service is provided by the In App Purchase Odoo platform. +""", + 'depends': [ + 'base', + 'iap_mail', + 'mail', + 'phone_validation' + ], + 'data': [ + 'data/ir_cron_data.xml', + 'wizard/sms_cancel_views.xml', + 'wizard/sms_composer_views.xml', + 'wizard/sms_template_preview_views.xml', + 'wizard/sms_resend_views.xml', + 'views/ir_actions_views.xml', + 'views/mail_notification_views.xml', + 'views/res_config_settings_views.xml', + 'views/res_partner_views.xml', + 'views/assets.xml', + 'views/sms_sms_views.xml', + 'views/sms_template_views.xml', + 'security/ir.model.access.csv', + 'security/sms_security.xml', + ], + 'demo': [ + 'data/sms_demo.xml', + 'data/mail_demo.xml', + ], + 'qweb': [ + 'static/src/bugfix/bugfix.xml', + 'static/src/components/notification_group/notification_group.xml', + 'static/src/components/message/message.xml', + ], + 'installable': True, + 'auto_install': True, + 'license': 'LGPL-3', +} diff --git a/addons/sms/data/ir_cron_data.xml b/addons/sms/data/ir_cron_data.xml new file mode 100644 index 00000000..e8a5d771 --- /dev/null +++ b/addons/sms/data/ir_cron_data.xml @@ -0,0 +1,14 @@ + + + + SMS: SMS Queue Manager + + code + model._process_queue() + + 1 + hours + -1 + + + \ No newline at end of file diff --git a/addons/sms/data/mail_demo.xml b/addons/sms/data/mail_demo.xml new file mode 100644 index 00000000..3f5e12ab --- /dev/null +++ b/addons/sms/data/mail_demo.xml @@ -0,0 +1,86 @@ + + + + res.partner + +

Hello! This is an example of incoming email.

+ email + + + +
+ + res.partner + +

Hello! This is an example of user comment.

+ comment + + + +
+ + + + email + exception + SMTP + + + + res.partner + +

Hello! This is an example of SMS.

+ sms + + + +
+ + res.partner + +

Hello! This is an example of another SMS with notifications and an unregistered account.

+ sms + + + +
+ + + + sms + exception + sms_acc + + + res.partner + +

Hello! This is an example of a sent SMS with notifications.

+ sms + + + +
+ + + + sms + sent + + + res.partner + +

Hello! This is an example of another SMS with notifications without credits.

+ sms + + + +
+ + + + sms + exception + sms_credit + + +
diff --git a/addons/sms/data/sms_demo.xml b/addons/sms/data/sms_demo.xml new file mode 100644 index 00000000..b3d252c1 --- /dev/null +++ b/addons/sms/data/sms_demo.xml @@ -0,0 +1,8 @@ + + + + Customer: automated SMS + + Dear ${object.display_name} this is an automated SMS. + + diff --git a/addons/sms/i18n/ar.po b/addons/sms/i18n/ar.po new file mode 100644 index 00000000..2cfc280d --- /dev/null +++ b/addons/sms/i18n/ar.po @@ -0,0 +1,1327 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Sherif Abd Ekmoniem , 2020 +# Mustafa Rawi , 2020 +# Mustafa J. Kadhem , 2020 +# Sadig Adam , 2020 +# Akram Alfusayal , 2020 +# amrnegm , 2020 +# Martin Trigaux, 2020 +# hoxhe Aits , 2020 +# Fahad Alqahtani , 2020 +# Ghaith Gammar , 2020 +# Osama Ahmaro , 2020 +# amal ahmed , 2020 +# Shaima Safar , 2020 +# Yihya Hugirat , 2020 +# Amer Hazaa , 2020 +# Mostafa Hanafy , 2020 +# Nisrine Tagri , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Nisrine Tagri , 2020\n" +"Language-Team: Arabic (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (نسخة)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/az.po b/addons/sms/i18n/az.po new file mode 100644 index 00000000..9825ebf7 --- /dev/null +++ b/addons/sms/i18n/az.po @@ -0,0 +1,140 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-08-24 09:25+0000\n" +"Language-Team: Azerbaijani (https://www.transifex.com/odoo/teams/41243/az/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: az\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/bg.po b/addons/sms/i18n/bg.po new file mode 100644 index 00000000..26e00df0 --- /dev/null +++ b/addons/sms/i18n/bg.po @@ -0,0 +1,1345 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# kalatchev, 2020 +# Martin Trigaux, 2020 +# Rosen Vladimirov , 2020 +# Kaloyan Naumov , 2020 +# Anton Vassilev, 2020 +# Igor Sheludko , 2020 +# aleksandar ivanov, 2020 +# Albena Mincheva , 2020 +# Maria Boyadjieva , 2020 +# Ivan Goychev , 2020 +# Александра Николова , 2020 +# Ивайло Малинов , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Ивайло Малинов , 2021\n" +"Language-Team: Bulgarian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (копие)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/bn.po b/addons/sms/i18n/bn.po new file mode 100644 index 00000000..f07ad9c3 --- /dev/null +++ b/addons/sms/i18n/bn.po @@ -0,0 +1,1317 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2021 +# Abu Zafar , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Abu Zafar , 2021\n" +"Language-Team: Bengali (https://www.transifex.com/odoo/teams/41243/bn/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: bn\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s(অনুলিপি)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/bs.po b/addons/sms/i18n/bs.po new file mode 100644 index 00000000..d10c044c --- /dev/null +++ b/addons/sms/i18n/bs.po @@ -0,0 +1,145 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2018 +# Boško Stojaković , 2018 +# Bole , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-09-21 13:17+0000\n" +"Last-Translator: Bole , 2018\n" +"Language-Team: Bosnian (https://www.transifex.com/odoo/teams/41243/bs/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: bs\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: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "Otkaži" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "Kreirano" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "Prikazani naziv" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "Nit e-pošte" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "ID" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "Zadnje mijenjano" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "Zadnji ažurirao" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "Zadnje ažurirano" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "Poruka" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "Primaoci" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "Pošalji" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/ca.po b/addons/sms/i18n/ca.po new file mode 100644 index 00000000..91419768 --- /dev/null +++ b/addons/sms/i18n/ca.po @@ -0,0 +1,1341 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Carles Antoli , 2020 +# RGB Consulting , 2020 +# Quim - eccit , 2020 +# Manel Fernandez Ramirez , 2020 +# Arnau Ros, 2020 +# Susanna Pujol, 2020 +# Josep Anton Belchi, 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Josep Anton Belchi, 2021\n" +"Language-Team: Catalan (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (còpia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/ckb.po b/addons/sms/i18n/ckb.po new file mode 100644 index 00000000..1c1d6e0c --- /dev/null +++ b/addons/sms/i18n/ckb.po @@ -0,0 +1,1298 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Haval Abdulkarim , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Haval Abdulkarim , 2020\n" +"Language-Team: Central Kurdish (https://www.transifex.com/odoo/teams/41243/ckb/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ckb\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (لەبەرگیراوە)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/cs.po b/addons/sms/i18n/cs.po new file mode 100644 index 00000000..b3d96d91 --- /dev/null +++ b/addons/sms/i18n/cs.po @@ -0,0 +1,1366 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Jakub Lohnisky , 2020 +# Jan Horzinka , 2020 +# Michal Veselý , 2020 +# Rastislav Brencic , 2021 +# karolína schusterová , 2021 +# trendspotter, 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: trendspotter, 2021\n" +"Language-Team: Czech (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "Počet neplatných příjemců" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "Počet platných příjemců" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopie)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%sneplatní příjemci " + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +"Upozornění: Tuto SMS nebude možné znovu " +"odeslat příjemcům, které jste nevybrali." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/da.po b/addons/sms/i18n/da.po new file mode 100644 index 00000000..c964b0c4 --- /dev/null +++ b/addons/sms/i18n/da.po @@ -0,0 +1,1366 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Joe Hansen , 2020 +# Martin Trigaux, 2020 +# Hans Henrik Gabelgaard , 2020 +# jonas jensen , 2020 +# Per Rasmussen , 2020 +# Morten Schou , 2020 +# Jesper Carstensen , 2020 +# Pernille Kristensen , 2020 +# Sanne Kristensen , 2020 +# Ejner Sønniksen , 2020 +# lhmflexerp , 2020 +# walther_b , 2020 +# Mads Søndergaard, 2020 +# Mads Søndergaard , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Mads Søndergaard , 2020\n" +"Language-Team: Danish (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Ugyldige modtagere" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Gyldige modtagere" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopi)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s tegn, passer i %s SMS (%s)" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s ugyldig modtagere" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" Advarsel: Det vil ikke være muligt at " +"sende denne SMS igen, til modtagere du ikke valgte." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Tilføj\n" +" Kontekst handling" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Fjern\n" +" Kontekst handling" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "datasæt istedet.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "valgte datasæt." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "at sende til alle" diff --git a/addons/sms/i18n/de.po b/addons/sms/i18n/de.po new file mode 100644 index 00000000..f3c6495a --- /dev/null +++ b/addons/sms/i18n/de.po @@ -0,0 +1,1369 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Andreas Stauder , 2020 +# Martin Trigaux, 2020 +# Ermin Trevisan , 2020 +# Andi, 2020 +# Bettina Pfeifer , 2020 +# Andreas Perhab , 2020 +# Johannes Croe , 2020 +# Marco Tarsia , 2020 +# Leon Grill , 2020 +# Caroline Renson , 2020 +# Max-Milan Stoyanov, 2020 +# Andreas Jonderko , 2020 +# Chris Egal , 2021 +# Andreas Schmidt , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Andreas Schmidt , 2021\n" +"Language-Team: German (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Ungültige Empfänger" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Gültige Empfänger" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (Kopie)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s ungültige Empfänger" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/el.po b/addons/sms/i18n/el.po new file mode 100644 index 00000000..e3cf43a4 --- /dev/null +++ b/addons/sms/i18n/el.po @@ -0,0 +1,1337 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Kostas Goutoudis , 2020 +# Nikos Gkountras , 2020 +# George Tarasidis , 2020 +# Alexandros Kapetanios , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Alexandros Kapetanios , 2021\n" +"Language-Team: Greek (https://www.transifex.com/odoo/teams/41243/el/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: el\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (αντίγραφο)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/eo.po b/addons/sms/i18n/eo.po new file mode 100644 index 00000000..c30112a9 --- /dev/null +++ b/addons/sms/i18n/eo.po @@ -0,0 +1,1283 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-09-29 13:46+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Language-Team: Esperanto (https://www.transifex.com/odoo/teams/41243/eo/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: eo\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/es.po b/addons/sms/i18n/es.po new file mode 100644 index 00000000..4b99e8ce --- /dev/null +++ b/addons/sms/i18n/es.po @@ -0,0 +1,1374 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Jon Perez , 2020 +# Jesús Alan Ramos Rodríguez , 2020 +# José Cabrera Lozano , 2021 +# Lucia Pacheco , 2021 +# Braulio D. López Vázquez , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Braulio D. López Vázquez , 2021\n" +"Language-Team: Spanish (https://www.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=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Destinatarios inválidos" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Destinatarios válidos" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (copia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%sDestinatarios inválidos" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +"Precaución: no será posible enviar este " +"SMS nuevamente a los destinatarios que no seleccionó." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Agregar\n" +"Acción de contexto" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Eliminar\n" +"Acción de contexto" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "registros seleccionados." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/es_MX.po b/addons/sms/i18n/es_MX.po new file mode 100644 index 00000000..a0712e0d --- /dev/null +++ b/addons/sms/i18n/es_MX.po @@ -0,0 +1,1384 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Cécile Collart , 2021 +# Lucia Pacheco , 2021 +# Patricia Gutiérrez Capetillo , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Patricia Gutiérrez Capetillo , 2021\n" +"Language-Team: Spanish (Mexico) (https://www.transifex.com/odoo/teams/41243/es_MX/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es_MX\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Destinatarios no válidos" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Destinatarios válidos" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (copia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s caracteres, cabe en %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%sDestinatarios no válidos" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +"Precaución: no será posible enviar este " +"SMS nuevamente a los destinatarios que no seleccionó." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Agregar\n" +"Acción de contexto" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Eliminar\n" +"Acción de contexto" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "registros en su lugar.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "registros seleccionados." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "enviar a todos" diff --git a/addons/sms/i18n/et.po b/addons/sms/i18n/et.po new file mode 100644 index 00000000..e30a4ff7 --- /dev/null +++ b/addons/sms/i18n/et.po @@ -0,0 +1,1336 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Rivo Zängov , 2020 +# Martin Trigaux, 2020 +# Arma Gedonsky , 2020 +# Egon Raamat , 2020 +# Marek Pontus, 2020 +# Martin Aavastik , 2020 +# Algo Kärp , 2020 +# Triine Aavik , 2021 +# Andre Roomet , 2021 +# Eneli Õigus , 2021 +# Piia Paurson , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Piia Paurson , 2021\n" +"Language-Team: Estonian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (koopia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/eu.po b/addons/sms/i18n/eu.po new file mode 100644 index 00000000..f539a80f --- /dev/null +++ b/addons/sms/i18n/eu.po @@ -0,0 +1,1328 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2021 +# José Miguel Andonegi , 2021 +# oihane , 2021 +# Esther Martín Menéndez , 2021 +# ibinka lete , 2021 +# Gorka Toledo , 2021 +# Eneko , 2021 +# Mikel Lizarralde , 2021 +# 61590936fa9bf290362ee306eeabf363_944dd10 , 2021 +# Iñaki Ibarrola , 2021 +# Victor Laskurain , 2021 +# Maialen Rodriguez , 2021 +# mgalarza005 , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: mgalarza005 , 2021\n" +"Language-Team: Basque (https://www.transifex.com/odoo/teams/41243/eu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: eu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/fa.po b/addons/sms/i18n/fa.po new file mode 100644 index 00000000..ffc3b0e2 --- /dev/null +++ b/addons/sms/i18n/fa.po @@ -0,0 +1,1323 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Hamid Darabi, 2020 +# arya sadeghi , 2020 +# Arash Sardari , 2020 +# Hamid Reza Kaveh , 2020 +# Hamed Mohammadi , 2021 +# fardin fa , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: fardin fa , 2021\n" +"Language-Team: Persian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (کپی)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/fi.po b/addons/sms/i18n/fi.po new file mode 100644 index 00000000..a1e11691 --- /dev/null +++ b/addons/sms/i18n/fi.po @@ -0,0 +1,1332 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Kari Lindgren , 2020 +# Miku Laitinen , 2020 +# Jussi Lehto , 2020 +# Svante Suominen , 2020 +# Jarmo Kortetjärvi , 2020 +# Jukka Paulin , 2020 +# Tuomo Aura , 2020 +# Veikko Väätäjä , 2020 +# Timo Koukkari , 2020 +# Pekko Tuomisto , 2020 +# Tuomas Lyyra , 2020 +# Sari Mäyrä , 2020 +# Johanna Valkonen , 2020 +# Jenni Heikkilä , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Jenni Heikkilä , 2020\n" +"Language-Team: Finnish (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopio)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/fr.po b/addons/sms/i18n/fr.po new file mode 100644 index 00000000..4353dbb7 --- /dev/null +++ b/addons/sms/i18n/fr.po @@ -0,0 +1,1395 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Florian , 2020 +# e2f , 2020 +# Moka Tourisme , 2020 +# Martin Trigaux, 2020 +# Nicolas Roussey , 2020 +# Aurélien Pillevesse , 2020 +# Fred Gilson , 2020 +# Eloïse Stilmant , 2020 +# Laura Piraux , 2020 +# Jonathan Castillo , 2020 +# Celia Tydgat , 2020 +# Gilles Mangin , 2020 +# Jonathan Quique , 2020 +# Cécile Collart , 2020 +# khalid chamakh , 2021 +# Alexandra Jubert , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Alexandra Jubert , 2021\n" +"Language-Team: French (https://www.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=2; plural=(n > 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Destinataires invalides" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Destinataires valides" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (copie)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s caractères, rentre dans %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s destinataires invalides" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" Attention: il ne sera plus possible de " +"renvoyer ce SMS aux destinataires que vous n'avez pas sélectionnés." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Ajouter\n" +" Action Contextuelle" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Enlever\n" +" Action Contextuelle" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "enregistrements à la place.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "enregistrements sélectionnés." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "pour envoyer à tous" diff --git a/addons/sms/i18n/gu.po b/addons/sms/i18n/gu.po new file mode 100644 index 00000000..eeee2143 --- /dev/null +++ b/addons/sms/i18n/gu.po @@ -0,0 +1,147 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2018 +# Ranjit Pillai , 2018 +# Turkesh Patel , 2018 +# Dharmraj Jhala , 2018 +# Divya Pandya , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-09-21 13:17+0000\n" +"Last-Translator: Divya Pandya , 2018\n" +"Language-Team: Gujarati (https://www.transifex.com/odoo/teams/41243/gu/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: gu\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "રદ કરો" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "સંપર્ક" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "બનાવનાર" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "પ્રદર્શન નામ" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "ઓળખ" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "સંદેશ" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/he.po b/addons/sms/i18n/he.po new file mode 100644 index 00000000..db8fc5d4 --- /dev/null +++ b/addons/sms/i18n/he.po @@ -0,0 +1,1339 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Fishfur A Banter , 2020 +# ExcaliberX , 2020 +# Yihya Hugirat , 2020 +# שהאב חוסיין , 2020 +# דודי מלכה , 2020 +# Amit Spilman , 2020 +# ZVI BLONDER , 2020 +# Lilach Gilliam , 2021 +# Lilach Gilliam , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Lilach Gilliam , 2021\n" +"Language-Team: Hebrew (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (העתק)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s תווים, נכנסים ב- %s הודעות SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/hi.po b/addons/sms/i18n/hi.po new file mode 100644 index 00000000..4e8096be --- /dev/null +++ b/addons/sms/i18n/hi.po @@ -0,0 +1,1316 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Martin Trigaux, 2021\n" +"Language-Team: Hindi (https://www.transifex.com/odoo/teams/41243/hi/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: hi\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/hr.po b/addons/sms/i18n/hr.po new file mode 100644 index 00000000..5eb89837 --- /dev/null +++ b/addons/sms/i18n/hr.po @@ -0,0 +1,1340 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Davor Bojkić , 2020 +# Vladimir Olujić , 2020 +# Đurđica Žarković , 2020 +# Karolina Tonković , 2020 +# Tina Milas, 2020 +# Stjepan Lovasić , 2020 +# Milan Tribuson , 2020 +# Vojislav Opačić , 2020 +# Bole , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Bole , 2021\n" +"Language-Team: Croatian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopija)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/hu.po b/addons/sms/i18n/hu.po new file mode 100644 index 00000000..4ab2d200 --- /dev/null +++ b/addons/sms/i18n/hu.po @@ -0,0 +1,1339 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2021 +# krnkris, 2021 +# gezza , 2021 +# Kovács Tibor , 2021 +# Ákos Nagy , 2021 +# Tibor Kőnig , 2021 +# Tamás Németh , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Tamás Németh , 2021\n" +"Language-Team: Hungarian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (másolat)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/id.po b/addons/sms/i18n/id.po new file mode 100644 index 00000000..7fd8c25e --- /dev/null +++ b/addons/sms/i18n/id.po @@ -0,0 +1,1342 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# William Surya Permana , 2020 +# Martin Trigaux, 2020 +# Wahyu Setiawan , 2020 +# oon arfiandwi , 2020 +# Bonny Useful , 2020 +# Febrasari Almania , 2020 +# Muhammad Syarif , 2020 +# Ryanto The , 2020 +# Gusti Rini , 2020 +# Ikhsanul Wirsa , 2020 +# whenwesober, 2020 +# Abdul Munif Hanafi , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Abdul Munif Hanafi , 2021\n" +"Language-Team: Indonesian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (salinan)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/is.po b/addons/sms/i18n/is.po new file mode 100644 index 00000000..ef32625d --- /dev/null +++ b/addons/sms/i18n/is.po @@ -0,0 +1,146 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2018 +# Birgir Steinarsson , 2018 +# Bjorn Ingvarsson , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-08-24 09:25+0000\n" +"Last-Translator: Bjorn Ingvarsson , 2018\n" +"Language-Team: Icelandic (https://www.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: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "Hætta við" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "Tengiliður" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "Búið til af" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "Stofnað þann" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "Nafn" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "Email Thread" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "Auðkenni" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "Síðast breytt þann" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "Síðast uppfært af" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "Síðast uppfært þann" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "Skilaboð" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "Viðtakendurf" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/it.po b/addons/sms/i18n/it.po new file mode 100644 index 00000000..ceb8647e --- /dev/null +++ b/addons/sms/i18n/it.po @@ -0,0 +1,1376 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Simone Bernini , 2020 +# Giacomo Grasso , 2020 +# Paolo Valier, 2020 +# Léonie Bouchat , 2020 +# Luigia Cimmino Caserta , 2020 +# Sergio Zanchetta , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Sergio Zanchetta , 2021\n" +"Language-Team: Italian (https://www.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=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "N. destinatari non validi" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "N. destinatari validi" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (copia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s caratteri, pari a %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s destinatari non validi" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" Attenzione: impossibile inviare " +"nuovamente questo SMS ai destinatari non selezionati." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Aggiungi azione\n" +" contestuale" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Rimuovi azione\n" +" contestuale" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "record selezionati." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/ja.po b/addons/sms/i18n/ja.po new file mode 100644 index 00000000..50d5c232 --- /dev/null +++ b/addons/sms/i18n/ja.po @@ -0,0 +1,1319 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Shunho Kin , 2020 +# SHIMIZU Taku , 2020 +# Martin Trigaux, 2020 +# Yoshi Tashiro , 2020 +# 高木正勝 , 2020 +# kent_ocean , 2020 +# Norimichi Sugimoto , 2020 +# Tim Siu Lai , 2020 +# NANIWA Masahiro , 2020 +# Noma Yuki, 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Noma Yuki, 2020\n" +"Language-Team: Japanese (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (コピー)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/ka.po b/addons/sms/i18n/ka.po new file mode 100644 index 00000000..b1798285 --- /dev/null +++ b/addons/sms/i18n/ka.po @@ -0,0 +1,1322 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Mari Khomeriki , 2021 +# Saba Khmaladze , 2021 +# Martin Trigaux, 2021 +# Temur, 2021 +# Giorgi Melitauri , 2021 +# Gvantsa Gvinianidze , 2021 +# Vasil Grigalashvili , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Vasil Grigalashvili , 2021\n" +"Language-Team: Georgian (https://www.transifex.com/odoo/teams/41243/ka/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ka\n" +"Plural-Forms: nplurals=2; plural=(n!=1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (ასლი)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/km.po b/addons/sms/i18n/km.po new file mode 100644 index 00000000..0a4fc14b --- /dev/null +++ b/addons/sms/i18n/km.po @@ -0,0 +1,143 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Sengtha Chay , 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-09-21 13:17+0000\n" +"Last-Translator: Sengtha Chay , 2018\n" +"Language-Team: Khmer (https://www.transifex.com/odoo/teams/41243/km/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: km\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "លុបចោល" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "ទំនាក់ទំនង" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "បង្កើតដោយ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "បង្កើតនៅ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "ឈ្មោះសំរាប់បង្ហាញ" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "ID" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "កាលបរិច្ឆេតកែប្រែចុងក្រោយ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "ផ្លាស់ប្តូរចុងក្រោយ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "ផ្លាស់ប្តូរចុងក្រោយ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "អ្នកទទួល" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "បញ្ជូន" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/ko.po b/addons/sms/i18n/ko.po new file mode 100644 index 00000000..1a33b30b --- /dev/null +++ b/addons/sms/i18n/ko.po @@ -0,0 +1,1338 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Seongseok Shin , 2020 +# JH CHOI , 2020 +# Linkup , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Linkup , 2021\n" +"Language-Team: Korean (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# 잘못된 수신자" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# 유효한 수신자" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (사본)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s 글자. %s SMS (%s)에 적합함" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s 잘못된 수신자" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" 주의 : 선택하지 않은 수신자에게 이 SMS를 다시 보낼 수 없습니다." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"추가하기\n" +" 상황별 작업" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"제거하기\n" +" 상황별 작업" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "대신해서 기록.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "선택된 레코드." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "모두에게 보내기" diff --git a/addons/sms/i18n/lb.po b/addons/sms/i18n/lb.po new file mode 100644 index 00000000..ca1006ee --- /dev/null +++ b/addons/sms/i18n/lb.po @@ -0,0 +1,1084 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~12.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-09-27 09:11+0000\n" +"PO-Revision-Date: 2019-08-26 09:14+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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"No records" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_ir_actions_server__state +msgid "Action To Do" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__active_domain +msgid "Active domain" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__active_domain_count +msgid "Active records count" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add a contextual action on the related model to open a sms composer with " +"this template" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/mail_failure.js:0 +#, python-format +msgid "An error occurred when sending an SMS" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__model_id +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__model_id +msgid "Applies to" +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_cancel.py:0 +#, python-format +msgid "" +"Are you sure you want to discard %s SMS delivery failures. You won't be able" +" to re-send these SMS later!" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/thread.xml:0 +#, python-format +msgid "Awaiting Dispatch" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__error_code__sms_blacklist +msgid "Blacklisted" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_sms__body +#: model:ir.model.fields,field_description:sms.field_sms_template__body +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__body +msgid "Body" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "Buy credits" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +#: model_terms:ir.ui.view,arch_db:sms.sms_cancel +#: model_terms:ir.ui.view,arch_db:sms.sms_tsms_view_form +msgid "Cancel" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_cancel +msgid "Cancel notification in failure" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/thread.xml:0 +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__state__canceled +#, python-format +msgid "Canceled" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "Check" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "Choose a language:" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "Choose an example" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "Close" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__composition_mode +msgid "Composition Mode" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "Content" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_cancel__create_uid +#: model:ir.model.fields,field_description:sms.field_sms_composer__create_uid +#: model:ir.model.fields,field_description:sms.field_sms_resend__create_uid +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__create_uid +#: model:ir.model.fields,field_description:sms.field_sms_sms__create_uid +#: model:ir.model.fields,field_description:sms.field_sms_template__create_uid +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__create_uid +msgid "Created by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_cancel__create_date +#: model:ir.model.fields,field_description:sms.field_sms_composer__create_date +#: model:ir.model.fields,field_description:sms.field_sms_resend__create_date +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__create_date +#: model:ir.model.fields,field_description:sms.field_sms_sms__create_date +#: model:ir.model.fields,field_description:sms.field_sms_template__create_date +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__create_date +msgid "Created on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_sms__partner_id +msgid "Customer" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__null_value +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__null_value +msgid "Default Value" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "Discard" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.sms_cancel_action +msgid "Discard SMS delivery failures" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_cancel +msgid "Discard delivery failures" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_cancel +msgid "Dismiss notification for resend by model" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_cancel__display_name +#: model:ir.model.fields,field_description:sms.field_sms_composer__display_name +#: model:ir.model.fields,field_description:sms.field_sms_resend__display_name +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__display_name +#: model:ir.model.fields,field_description:sms.field_sms_sms__display_name +#: model:ir.model.fields,field_description:sms.field_sms_template__display_name +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__display_name +msgid "Display Name" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_followers +msgid "Document Followers" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__res_id +msgid "Document ID" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__res_ids +msgid "Document IDs" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__res_model +msgid "Document Model Name" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__error_code__sms_duplicate +msgid "Duplicate" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "Dynamic Placeholder Generator" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "Edit Partners" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/thread.xml:0 +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__state__error +#, python-format +msgid "Error" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_sms__error_code +msgid "Error Code" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_mail_notification__failure_type +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__failure_type +msgid "Failure type" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__model_object_field +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__model_object_field +msgid "Field" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__number_field_name +msgid "Field holding number" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__copyvalue +#: model:ir.model.fields,help:sms.field_sms_template_preview__copyvalue +msgid "" +"Final placeholder expression, to be copy-pasted in the desired template " +"field." +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "Following numbers are not correctly encoded: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend__has_cancel +msgid "Has Cancel" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend__has_insufficient_credit +msgid "Has Insufficient Credit" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_mail_mail__has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_message__has_sms_error +msgid "Has SMS error" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_mail_mail__has_sms_error +#: model:ir.model.fields,help:sms.field_mail_message__has_sms_error +msgid "Has error" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_cancel__help_message +msgid "Help message" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_cancel__id +#: model:ir.model.fields,field_description:sms.field_sms_composer__id +#: model:ir.model.fields,field_description:sms.field_sms_resend__id +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__id +#: model:ir.model.fields,field_description:sms.field_sms_sms__id +#: model:ir.model.fields,field_description:sms.field_sms_template__id +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__id +msgid "ID" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_account_analytic_account__message_has_sms_error +#: model:ir.model.fields,help:sms.field_calendar_event__message_has_sms_error +#: model:ir.model.fields,help:sms.field_crm_team__message_has_sms_error +#: model:ir.model.fields,help:sms.field_fleet_vehicle__message_has_sms_error +#: model:ir.model.fields,help:sms.field_fleet_vehicle_log_contract__message_has_sms_error +#: model:ir.model.fields,help:sms.field_gamification_badge__message_has_sms_error +#: model:ir.model.fields,help:sms.field_gamification_challenge__message_has_sms_error +#: model:ir.model.fields,help:sms.field_hr_department__message_has_sms_error +#: model:ir.model.fields,help:sms.field_hr_employee__message_has_sms_error +#: model:ir.model.fields,help:sms.field_hr_job__message_has_sms_error +#: model:ir.model.fields,help:sms.field_lunch_supplier__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mail_blacklist__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mail_channel__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mail_thread__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mail_thread_blacklist__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mail_thread_cc__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mail_thread_phone__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mailing_contact__message_has_sms_error +#: model:ir.model.fields,help:sms.field_mailing_mailing__message_has_sms_error +#: model:ir.model.fields,help:sms.field_maintenance_equipment__message_has_sms_error +#: model:ir.model.fields,help:sms.field_maintenance_equipment_category__message_has_sms_error +#: model:ir.model.fields,help:sms.field_maintenance_request__message_has_sms_error +#: model:ir.model.fields,help:sms.field_note_note__message_has_sms_error +#: model:ir.model.fields,help:sms.field_phone_blacklist__message_has_sms_error +#: model:ir.model.fields,help:sms.field_product_product__message_has_sms_error +#: model:ir.model.fields,help:sms.field_product_template__message_has_sms_error +#: model:ir.model.fields,help:sms.field_res_partner__message_has_sms_error +#: model:ir.model.fields,help:sms.field_res_users__message_has_sms_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_cancel +msgid "" +"If you want to re-send them, click Cancel now, then click on the " +"notification and review them one by one by clicking on the red icon next to " +"each message." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "Ignore all" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__state__outgoing +msgid "In Queue" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__mail_notification__failure_type__sms_credit +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__error_code__sms_credit +msgid "Insufficient Credit" +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "Invalid number" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__mass_keep_log +msgid "Keep a note on document" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__lang +msgid "Language" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_cancel____last_update +#: model:ir.model.fields,field_description:sms.field_sms_composer____last_update +#: model:ir.model.fields,field_description:sms.field_sms_resend____last_update +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient____last_update +#: model:ir.model.fields,field_description:sms.field_sms_sms____last_update +#: model:ir.model.fields,field_description:sms.field_sms_template____last_update +#: model:ir.model.fields,field_description:sms.field_sms_template_preview____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_cancel__write_uid +#: model:ir.model.fields,field_description:sms.field_sms_composer__write_uid +#: model:ir.model.fields,field_description:sms.field_sms_resend__write_uid +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__write_uid +#: model:ir.model.fields,field_description:sms.field_sms_sms__write_uid +#: model:ir.model.fields,field_description:sms.field_sms_template__write_uid +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_cancel__write_date +#: model:ir.model.fields,field_description:sms.field_sms_composer__write_date +#: model:ir.model.fields,field_description:sms.field_sms_resend__write_date +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__write_date +#: model:ir.model.fields,field_description:sms.field_sms_sms__write_date +#: model:ir.model.fields,field_description:sms.field_sms_template__write_date +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_ir_actions_server__sms_mass_keep_log +msgid "Log a note" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_sms__mail_message_id +msgid "Mail Message" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_ir_model__is_mail_thread_sms +msgid "Mail Thread SMS" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_message +#: model:ir.model.fields,field_description:sms.field_sms_composer__body +#: model:ir.model.fields,field_description:sms.field_sms_resend__mail_message_id +msgid "Message" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_notification +msgid "Message Notifications" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_mail_mail__message_type +#: model:ir.model.fields,help:sms.field_mail_message__message_type +msgid "" +"Message type: email for email message, notification for system message, " +"comment for other messages such as user replies" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__mail_notification__failure_type__sms_number_missing +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__error_code__sms_number_missing +msgid "Missing Number" +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "Missing number" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_cancel__model +msgid "Model" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_ir_model +msgid "Models" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__name +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__name +msgid "Name" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__notification_id +msgid "Notification" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_mail_notification__notification_type +msgid "Notification Type" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__sms_number +#: model:ir.model.fields,field_description:sms.field_sms_sms__number +msgid "Number" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__null_value +#: model:ir.model.fields,help:sms.field_sms_template_preview__null_value +msgid "Optional value to use if the target field is empty" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_sms +msgid "Outgoing SMS" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__partner_ids +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__partner_id +msgid "Partner" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread_phone +msgid "Phone Blacklist Mixin" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__copyvalue +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__copyvalue +msgid "Placeholder Expression" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__sms_composer__composition_mode__comment +msgid "Post on a document" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "Preview" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "Preview of" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "Put in queue" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "Reason" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__partner_name +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "Recipient" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend__recipient_ids +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "Recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__numbers +msgid "Recipients (Numbers)" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_description +msgid "Recipients (Partners)" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__res_id +msgid "Record ID" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__resource_ref +msgid "Record reference" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__model +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__model +msgid "Related Document Model" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "Remove the contextual action of the related model" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__resend +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "Resend" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_resend_recipient +msgid "Resend Notification" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/thread.xml:0 +#: model:ir.actions.act_window,name:sms.sms_sms_action +#: model:ir.model.fields,field_description:sms.field_mail_notification__sms_id +#: model:ir.model.fields.selection,name:sms.selection__mail_message__message_type__sms +#: model:ir.model.fields.selection,name:sms.selection__mail_notification__notification_type__sms +#: model:ir.ui.menu,name:sms.sms_sms_menu +#: model_terms:ir.ui.view,arch_db:sms.sms_tsms_view_form +#, python-format +msgid "SMS" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_account_analytic_account__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_calendar_event__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_crm_team__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_fleet_vehicle__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_fleet_vehicle_log_contract__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_gamification_badge__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_gamification_challenge__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_hr_department__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_hr_employee__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_hr_job__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_lunch_supplier__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_blacklist__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_channel__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_thread__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_thread_blacklist__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_thread_cc__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mail_thread_phone__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mailing_contact__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_mailing_mailing__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_maintenance_equipment__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_maintenance_equipment_category__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_maintenance_request__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_note_note__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_phone_blacklist__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_product_product__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_product_template__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_res_partner__message_has_sms_error +#: model:ir.model.fields,field_description:sms.field_res_users__message_has_sms_error +msgid "SMS Delivery error" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/systray_messaging_menu.js:0 +#, python-format +msgid "SMS Failures" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_mail_notification__sms_number +msgid "SMS Number" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "SMS Preview" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_resend +msgid "SMS Resend" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_sms__state +msgid "SMS Status" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_ir_actions_server__sms_template_id +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "SMS Template" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_template_preview +msgid "SMS Template Preview" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_template +#: model:ir.ui.menu,name:sms.sms_template_menu +#: model_terms:ir.ui.view,arch_db:sms.sms_sms_view_tree +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_tree +msgid "SMS Templates" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "SMS content" +msgstr "" + +#. module: sms +#: model:ir.actions.server,name:sms.ir_cron_sms_scheduler_action_ir_actions_server +#: model:ir.cron,cron_name:sms.ir_cron_sms_scheduler_action +#: model:ir.cron,name:sms.ir_cron_sms_scheduler_action +msgid "SMS: SMS Queue Manager" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__sanitized_numbers +msgid "Sanitized Number" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_sms_view_search +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_search +msgid "Search SMS Templates" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__model_object_field +#: model:ir.model.fields,help:sms.field_sms_template_preview__model_object_field +msgid "" +"Select target field from the related document model.\n" +"If it is a relationship field you will be able to select a target field at the destination of the relationship." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +#: model_terms:ir.ui.view,arch_db:sms.sms_tsms_view_form +msgid "Send Now" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "Send SMS" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "Send SMS (%s)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_phone_widget.js:0 +#: code:addons/sms/static/src/js/fields_phone_widget.js:0 +#: model:ir.actions.act_window,name:sms.res_partner_act_window_sms_composer_multi +#: model:ir.actions.act_window,name:sms.res_partner_act_window_sms_composer_single +#: model:ir.actions.act_window,name:sms.sms_composer_action_form +#: model:ir.model.fields.selection,name:sms.selection__ir_actions_server__state__sms +#, python-format +msgid "Send SMS Text Message" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_composer +msgid "Send SMS Wizard" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__sms_composer__composition_mode__mass +msgid "Send SMS in batch" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "Send an SMS" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__mass_force_send +msgid "Send directly" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__sms_composer__composition_mode__numbers +msgid "Send to numbers" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.sms_resend_action +msgid "Sending Failures" +msgstr "" + +#. module: sms +#: code:addons/sms/models/ir_actions.py:0 +#, python-format +msgid "Sending SMS can only be done on a mail.thread model" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/thread.xml:0 +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__state__sent +#, python-format +msgid "Sent" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_ir_actions_server +msgid "Server Action" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__mail_notification__failure_type__sms_server +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__error_code__sms_server +msgid "Server Error" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__sidebar_action_id +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__sidebar_action_id +msgid "Sidebar action" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__sidebar_action_id +#: model:ir.model.fields,help:sms.field_sms_template_preview__sidebar_action_id +msgid "" +"Sidebar action to make this template available on records of the related " +"document model" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_resend_recipient__sms_resend_id +msgid "Sms Resend" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__sms_template_id +msgid "Sms Template" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__sub_model_object_field +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__sub_model_object_field +msgid "Sub-field" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template__sub_object +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__sub_object +msgid "Sub-model" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.sms_template_preview_action +msgid "Template Preview" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_template_preview__lang +msgid "Template Preview Language" +msgstr "" + +#. module: sms +#: model:ir.actions.act_window,name:sms.sms_template_action +msgid "Templates" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__model_id +#: model:ir.model.fields,help:sms.field_sms_template_preview__model_id +msgid "The type of document this template can be used with" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_mail_mail__message_type +#: model:ir.model.fields,field_description:sms.field_mail_message__message_type +msgid "Type" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_ir_actions_server__state +msgid "" +"Type of server action. The following values are available:\n" +"- 'Execute Python Code': a block of python code that will be executed\n" +"- 'Create': create a new record with new values\n" +"- 'Update a Record': update the values of a record\n" +"- 'Execute several actions': define an action that triggers several other server actions\n" +"- 'Send Email': automatically send an email (Discuss)\n" +"- 'Add Followers': add followers to a record (Discuss)\n" +"- 'Create Next Activity': create an activity (Discuss)" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_composer__active_domain_count +msgid "" +"UX field computing the number of recipients in mass mode based on given " +"active domain" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_composer__res_ids_count +msgid "" +"UX field computing the number of recipients in mass mode without active " +"domain" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__template_id +msgid "Use Template" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__use_active_domain +msgid "Use active domain" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__mass_use_blacklist +msgid "Use blacklist" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__lang +msgid "" +"Use this field to either force a specific language (ISO code) or dynamically" +" detect the language of your recipient by a placeholder expression (e.g. " +"${object.partner_id.lang})" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__res_ids_count +msgid "Visible records count" +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__sub_model_object_field +#: model:ir.model.fields,help:sms.field_sms_template_preview__sub_model_object_field +msgid "" +"When a relationship field is selected as first field, this field lets you " +"select the target field within the destination document model (sub-model)." +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_sms_template__sub_object +#: model:ir.model.fields,help:sms.field_sms_template_preview__sub_object +msgid "" +"When a relationship field is selected as first field, this field shows the " +"document model the relationship goes to." +msgstr "" + +#. module: sms +#: model:ir.model.fields,help:sms.field_ir_model__is_mail_thread_sms +msgid "Whether this model supports messages and notifications through SMS" +msgstr "" + +#. module: sms +#: model:ir.model.fields.selection,name:sms.selection__mail_notification__failure_type__sms_number_format +#: model:ir.model.fields.selection,name:sms.selection__sms_sms__error_code__sms_number_format +msgid "Wrong Number Format" +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_resend.py:0 +#, python-format +msgid "You do not have access to the message and/or related document." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "are invalid." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "e.g. en_US or ${object.partner_id.lang}" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "" +"recipients are valid\n" +" and" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "record:" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records instead.
" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/lt.po b/addons/sms/i18n/lt.po new file mode 100644 index 00000000..ba7eb62d --- /dev/null +++ b/addons/sms/i18n/lt.po @@ -0,0 +1,1345 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Aleksandr Jadov , 2021 +# Martin Trigaux, 2021 +# Arminas Grigonis , 2021 +# UAB "Draugiški sprendimai" , 2021 +# Anatolij, 2021 +# Silvija Butko , 2021 +# Audrius Palenskis , 2021 +# Rolandas , 2021 +# Monika Raciunaite , 2021 +# digitouch UAB , 2021 +# Linas Versada , 2021 +# Arunas Vaitekunas , 2021 +# grupoda2 , 2021 +# Jonas Zinkevicius , 2021 +# Naglis Jonaitis, 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Naglis Jonaitis, 2021\n" +"Language-Team: Lithuanian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopija)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/lv.po b/addons/sms/i18n/lv.po new file mode 100644 index 00000000..e50a2bb6 --- /dev/null +++ b/addons/sms/i18n/lv.po @@ -0,0 +1,1294 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Language-Team: Latvian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/mn.po b/addons/sms/i18n/mn.po new file mode 100644 index 00000000..b7f72f79 --- /dev/null +++ b/addons/sms/i18n/mn.po @@ -0,0 +1,1328 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Baskhuu Lodoikhuu , 2020 +# Martin Trigaux, 2020 +# Minj P , 2020 +# Batmunkh Ganbat , 2020 +# tserendavaa tsogtoo , 2020 +# Nurbahyt Kh , 2020 +# Uuganbayar Batbaatar , 2020 +# Cheemee Bumtsend , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Cheemee Bumtsend , 2020\n" +"Language-Team: Mongolian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (хуулбар)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/nb.po b/addons/sms/i18n/nb.po new file mode 100644 index 00000000..df03f9c0 --- /dev/null +++ b/addons/sms/i18n/nb.po @@ -0,0 +1,1310 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Jorunn D. Newth, 2020 +# Marius Stedjan , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Marius Stedjan , 2020\n" +"Language-Team: Norwegian Bokmål (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopi)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/nl.po b/addons/sms/i18n/nl.po new file mode 100644 index 00000000..e8e6811a --- /dev/null +++ b/addons/sms/i18n/nl.po @@ -0,0 +1,1378 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Gunther Clauwaert , 2020 +# Yenthe Van Ginneken , 2020 +# Odoo Experts Consultants , 2020 +# Erwin van der Ploeg (Odoo Experts) , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Erwin van der Ploeg (Odoo Experts) , 2021\n" +"Language-Team: Dutch (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Foutieve ontvangers" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Geldige ontvangers" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopie)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s karakters, past in %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s foutieve ontvangers" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +"Let op: het is niet mogelijk om deze SMS " +"opnieuw te versturen naar de ontvangers die u niet heeft geselecteerd." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Toevoegen\n" +" Context actie" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Verwijder\n" +" Contextuele actie" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "records in de plaats.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "records aangeduid." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "om naar iedereen te versturen." diff --git a/addons/sms/i18n/pl.po b/addons/sms/i18n/pl.po new file mode 100644 index 00000000..44beb7a0 --- /dev/null +++ b/addons/sms/i18n/pl.po @@ -0,0 +1,1361 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Jan Dziurz , 2020 +# Martin Trigaux, 2020 +# Dariusz Żbikowski , 2020 +# Grzegorz Grzelak , 2020 +# Judyta Kaźmierczak , 2020 +# Tomasz Leppich , 2020 +# Jaroslaw Kaczmarski, 2020 +# Piotr Szlązak , 2020 +# Marcin Młynarczyk , 2020 +# Karol Rybak , 2020 +# Andrzej Donczew , 2020 +# Piotr Cierkosz , 2020 +# Radosław Biegalski , 2020 +# Paweł Wodyński , 2020 +# Wiktor Kaźmierczak , 2020 +# Maksym , 2020 +# Natalia Gros , 2020 +# Piotr Strębski , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Piotr Strębski , 2021\n" +"Language-Team: Polish (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopiuj)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Usuń\n" +" Kontekst akcji" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/pt.po b/addons/sms/i18n/pt.po new file mode 100644 index 00000000..d139a501 --- /dev/null +++ b/addons/sms/i18n/pt.po @@ -0,0 +1,1325 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# 425fe09b3064b9f906f637fff94056ae_a00ea56 <0fa3588fa89906bfcb3a354600956e0e_308047>, 2020 +# Ricardo Martins , 2020 +# Vitor Fernandes , 2020 +# Manuela Silva , 2020 +# Pedro Castro Silva , 2020 +# Nuno Silva , 2020 +# Diogo Fonseca , 2020 +# Pedro Filipe , 2020 +# Reinaldo Ramos , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Reinaldo Ramos , 2020\n" +"Language-Team: Portuguese (https://www.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=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (cópia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/pt_BR.po b/addons/sms/i18n/pt_BR.po new file mode 100644 index 00000000..23efb222 --- /dev/null +++ b/addons/sms/i18n/pt_BR.po @@ -0,0 +1,1355 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Rodrigo de Almeida Sottomaior Macedo , 2020 +# Rafael H L Moretti , 2020 +# danimaribeiro , 2020 +# Martin Trigaux, 2020 +# Marcel Savegnago , 2020 +# Emanuel Martins , 2020 +# Clemilton Clementino , 2020 +# Mateus Lopes , 2020 +# Adriel Kotviski , 2020 +# Caio Leonardo Mendes de Sousa , 2020 +# falexandresilva , 2020 +# grazziano , 2020 +# André Augusto Firmino Cordeiro , 2020 +# Silmar , 2020 +# Marcelo Costa , 2020 +# rogeriojlle , 2020 +# Luiz Fernando , 2020 +# André Carvalho , 2020 +# PopSolutions Cooperativa Digital , 2020 +# Éder Brito , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Éder Brito , 2020\n" +"Language-Team: Portuguese (Brazil) (https://www.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=2; plural=(n > 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (cópia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/ro.po b/addons/sms/i18n/ro.po new file mode 100644 index 00000000..af4022bb --- /dev/null +++ b/addons/sms/i18n/ro.po @@ -0,0 +1,1371 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Fekete Mihai , 2020 +# Dorin Hongu , 2020 +# Hongu Cosmin , 2020 +# Foldi Robert , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Foldi Robert , 2021\n" +"Language-Team: Romanian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Destinatari nevalizi" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Destinatari Valizi" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (copie)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s caractere care încap în %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s destinatari nevalizi" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" Atenție: nu va fi posibil să trimiteți " +"din nou acest SMS destinatarilor pe care nu i-ați selectat" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Adăugare\n" +" Acțiune Context" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Eliminare\n" +" Actiune Context" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "înregistrări selectate." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "a trimite tuturor" diff --git a/addons/sms/i18n/ru.po b/addons/sms/i18n/ru.po new file mode 100644 index 00000000..cd5c7b7f --- /dev/null +++ b/addons/sms/i18n/ru.po @@ -0,0 +1,1349 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Андрей Гусев , 2020 +# Ivan Yelizariev // IEL , 2020 +# Vasiliy Korobatov , 2020 +# Irina Fedulova , 2020 +# Ekaterina , 2020 +# Сергей Шебанин , 2020 +# ILMIR , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: ILMIR , 2021\n" +"Language-Team: Russian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (копия)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/si.po b/addons/sms/i18n/si.po new file mode 100644 index 00000000..77c65371 --- /dev/null +++ b/addons/sms/i18n/si.po @@ -0,0 +1,1294 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Language-Team: Sinhala (https://www.transifex.com/odoo/teams/41243/si/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: si\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/sk.po b/addons/sms/i18n/sk.po new file mode 100644 index 00000000..088df14e --- /dev/null +++ b/addons/sms/i18n/sk.po @@ -0,0 +1,1343 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Matus Krnac , 2020 +# Pavol Krnáč , 2020 +# Jaroslav Bosansky , 2020 +# gebri , 2020 +# Michal Matus , 2020 +# Jan Prokop, 2020 +# Adam Levrinc , 2020 +# Alexandra Brencicova , 2020 +# karolína schusterová , 2020 +# Rastislav Brencic , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Rastislav Brencic , 2020\n" +"Language-Team: Slovak (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kópia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/sl.po b/addons/sms/i18n/sl.po new file mode 100644 index 00000000..6e108772 --- /dev/null +++ b/addons/sms/i18n/sl.po @@ -0,0 +1,1339 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2021 +# Matjaz Mozetic , 2021 +# Vida Potočnik , 2021 +# laznikd , 2021 +# matjaz k , 2021 +# Boris Kodelja , 2021 +# Tadej Lupšina , 2021 +# Jasmina Macur , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Jasmina Macur , 2021\n" +"Language-Team: Slovenian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopija)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/sms.pot b/addons/sms/i18n/sms.pot new file mode 100644 index 00000000..0d95b037 --- /dev/null +++ b/addons/sms/i18n/sms.pot @@ -0,0 +1,1312 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-11-27 14:12+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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/sr.po b/addons/sms/i18n/sr.po new file mode 100644 index 00000000..0604966b --- /dev/null +++ b/addons/sms/i18n/sr.po @@ -0,0 +1,143 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2018 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-09-21 13:17+0000\n" +"Last-Translator: Martin Trigaux, 2018\n" +"Language-Team: Serbian (https://www.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: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "Otkaži" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "Kreiran" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "ID" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "Poruka" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "Pošalji" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/sr@latin.po b/addons/sms/i18n/sr@latin.po new file mode 100644 index 00000000..818bb1c9 --- /dev/null +++ b/addons/sms/i18n/sr@latin.po @@ -0,0 +1,134 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Djordje Marjanovic , 2017 +# Ljubisa Jovev , 2017 +# Martin Trigaux , 2017 +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-10-10 11:35+0000\n" +"PO-Revision-Date: 2017-10-10 11:35+0000\n" +"Last-Translator: Martin Trigaux , 2017\n" +"Language-Team: Serbian (Latin) (https://www.transifex.com/odoo/teams/41243/sr%40latin/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sr@latin\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: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "Odustani" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "Kontakt" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_create_uid +msgid "Created by" +msgstr "Kreirao" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_create_date +msgid "Created on" +msgstr "Datum kreiranja" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api_display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_display_name +msgid "Display Name" +msgstr "Naziv za prikaz" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api_id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_id +msgid "ID" +msgstr "ID" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api___last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms___last_update +msgid "Last Modified on" +msgstr "Zadnja promena" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_write_uid +msgid "Last Updated by" +msgstr "Promenio" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_write_date +msgid "Last Updated on" +msgstr "Vreme promene" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_message +msgid "Message" +msgstr "Poruka" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:48 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms_recipients +msgid "Recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "Pošalji" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "sms.api" +msgstr "" + +#. module: sms +#: model:ir.model,name:sms.model_sms_send_sms +msgid "sms.send_sms" +msgstr "" diff --git a/addons/sms/i18n/sv.po b/addons/sms/i18n/sv.po new file mode 100644 index 00000000..877fe24a --- /dev/null +++ b/addons/sms/i18n/sv.po @@ -0,0 +1,1337 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Kristoffer Grundström , 2021 +# Martin Trigaux, 2021 +# Haojun Zou , 2021 +# Martin Wilderoth , 2021 +# Robert Frykelius , 2021 +# Kim Asplund , 2021 +# Chrille Hedberg , 2021 +# Jakob Krabbe , 2021 +# Mikael Holm , 2021 +# Anders Wallenquist , 2021 +# Simon Strömberg , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Simon Strömberg , 2021\n" +"Language-Team: Swedish (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopia)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/th.po b/addons/sms/i18n/th.po new file mode 100644 index 00000000..2c169dab --- /dev/null +++ b/addons/sms/i18n/th.po @@ -0,0 +1,145 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2018 +# Khwunchai Jaengsawang , 2018 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server saas~11.5\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-09-21 13:17+0000\n" +"PO-Revision-Date: 2018-08-24 09:25+0000\n" +"Last-Translator: Khwunchai Jaengsawang , 2018\n" +"Language-Team: Thai (https://www.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: sms +#. openerp-web +#: code:addons/sms/static/src/js/sms_widget.js:93 +#, python-format +msgid "%s chars, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Cancel" +msgstr "ยกเลิก" + +#. module: sms +#: model:ir.model,name:sms.model_res_partner +msgid "Contact" +msgstr "ผู้ติดต่อ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_uid +msgid "Created by" +msgstr "สร้างโดย" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__create_date +msgid "Created on" +msgstr "สร้างเมื่อ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__display_name +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__display_name +msgid "Display Name" +msgstr "ชื่อที่ใช้แสดง" + +#. module: sms +#: model:ir.model,name:sms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api__id +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__id +msgid "ID" +msgstr "รหัส" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:53 +#, python-format +msgid "Insufficient credit, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_api____last_update +#: model:ir.model.fields,field_description:sms.field_sms_send_sms____last_update +msgid "Last Modified on" +msgstr "แก้ไขครั้งสุดท้ายเมื่อ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_uid +msgid "Last Updated by" +msgstr "อัพเดทครั้งสุดท้ายโดย" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__write_date +msgid "Last Updated on" +msgstr "อัพเดทครั้งสุดท้ายเมื่อ" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__message +msgid "Message" +msgstr "ข้อความ" + +#. module: sms +#: code:addons/sms/wizard/send_sms.py:82 +#, python-format +msgid "Missing mobile number for %s." +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:55 +#, python-format +msgid "No mobile number defined, unable to send SMS message: %s" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients +msgid "Recipients" +msgstr "ผู้รับ" + +#. module: sms +#: model:ir.model,name:sms.model_sms_api +msgid "SMS API" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/xml/sms_widget.xml:4 +#, python-format +msgid "SMS Pricing" +msgstr "" + +#. module: sms +#: code:addons/sms/models/mail_thread.py:48 +#, python-format +msgid "SMS message sent: %s" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send" +msgstr "ส่ง" + +#. module: sms +#: model:ir.actions.act_window,name:sms.send_sms_action +#: model:ir.actions.act_window,name:sms.send_sms_form_action +#: model:ir.model,name:sms.model_sms_send_sms +#: model_terms:ir.ui.view,arch_db:sms.partner_form_send_sms_form_view +msgid "Send SMS" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.send_sms_view_form +msgid "Send an SMS" +msgstr "" diff --git a/addons/sms/i18n/tr.po b/addons/sms/i18n/tr.po new file mode 100644 index 00000000..48dc0e8c --- /dev/null +++ b/addons/sms/i18n/tr.po @@ -0,0 +1,1378 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Ayhan KIZILTAN , 2020 +# Martin Trigaux, 2020 +# Levent Karakaş , 2020 +# Murat Kaplan , 2020 +# Ahmet Altinisik , 2020 +# Ertuğrul Güreş , 2020 +# Mehmet Demirel , 2020 +# Ramiz Deniz Öner , 2020 +# Abdullah Onur Uğur , 2020 +# Buket Şeker , 2020 +# Yedigen, 2020 +# abc Def , 2020 +# Murat Durmuş , 2020 +# Ediz Duman , 2020 +# Tugay Hatıl , 2020 +# Nadir Gazioglu , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Nadir Gazioglu , 2021\n" +"Language-Team: Turkish (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Geçersiz alıcılar" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Geçerli alıcılar" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (kopya)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%skarakter, %sSMS'e sığar (%s)" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s geçersiz alıcı" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +"Dikkat: Seçtiğiniz alıcılara bu SMS'i " +"tekrar göndermek mümkün olmayacaktır." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Ekle\n" +" Bağlam Eylemi" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Kaldır\n" +" Bağlam Eylemi" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "yerine kaydedildi.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "seçilen kayıtlar." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "herkese gönder" diff --git a/addons/sms/i18n/uk.po b/addons/sms/i18n/uk.po new file mode 100644 index 00000000..843ef2ff --- /dev/null +++ b/addons/sms/i18n/uk.po @@ -0,0 +1,1367 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Alina Lisnenko , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Alina Lisnenko , 2021\n" +"Language-Team: Ukrainian (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "К-сть недійсних одержувачів" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "К-сть дійсних одержувачів" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (копія)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s знаків, вписуються в %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s недійсних одержувачів" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" Попередження: Не вдасться знову " +"надіслати це SMS тим, кого ви не вибрали." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Додати\n" +" Дія змісту" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Видалити\n" +" Дія змісту" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "записи замість цього.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "обрано записи." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "щоб відправити всім" diff --git a/addons/sms/i18n/ur.po b/addons/sms/i18n/ur.po new file mode 100644 index 00000000..391b17ca --- /dev/null +++ b/addons/sms/i18n/ur.po @@ -0,0 +1,1312 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Language-Team: Urdu (https://www.transifex.com/odoo/teams/41243/ur/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ur\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "" + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "" diff --git a/addons/sms/i18n/vi.po b/addons/sms/i18n/vi.po new file mode 100644 index 00000000..1528ad9e --- /dev/null +++ b/addons/sms/i18n/vi.po @@ -0,0 +1,1377 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# fanha99 , 2020 +# son dang , 2020 +# Duy BQ , 2020 +# Minh Nguyen , 2020 +# Trinh Tran Thi Phuong , 2020 +# Dung Nguyen Thi , 2020 +# Dao Nguyen , 2020 +# Phuc Tran Thanh , 2020 +# Nancy Momoland , 2020 +# Trần Hà , 2021 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Trần Hà , 2021\n" +"Language-Team: Vietnamese (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# Invalid recipients" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "# Valid recipients" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (sao chép)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s characters, fits in %s SMS (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s invalid recipients" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"Add\n" +" Context Action" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"Remove\n" +" Context Action" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "records instead.
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "records selected." + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "to send to all" diff --git a/addons/sms/i18n/zh_CN.po b/addons/sms/i18n/zh_CN.po new file mode 100644 index 00000000..107d4846 --- /dev/null +++ b/addons/sms/i18n/zh_CN.po @@ -0,0 +1,1348 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# Martin Trigaux, 2020 +# Jeffery CHEN Fan , 2020 +# liAnGjiA , 2020 +# 苏州远鼎 , 2020 +# keecome <7017511@qq.com>, 2020 +# 敬雲 林 , 2020 +# Emily Jia , 2020 +# gary chk , 2020 +# snow wang <147156565@qq.com>, 2020 +# inspur qiuguodong , 2020 +# Jeanphy , 2020 +# Felix Yang - Elico Corp , 2020 +# as co02 , 2020 +# 稀饭~~ , 2020 +# Felix Yuen , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-27 14:12+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: Felix Yuen , 2020\n" +"Language-Team: Chinese (China) (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# 无效的收件人" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "#有效的收件人" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (副本)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s 字符, 适合 %s 短信 (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s无效的收件人" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr " 提示:这不会将邮件发送给未选中的收件者。" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"添加\n" +" 上下文操作" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"移除\n" +" 上下文操作" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "而是记录。
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "所选记录。" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "发送给所有人" diff --git a/addons/sms/i18n/zh_TW.po b/addons/sms/i18n/zh_TW.po new file mode 100644 index 00000000..8a47cfdf --- /dev/null +++ b/addons/sms/i18n/zh_TW.po @@ -0,0 +1,1316 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sms +# +# Translators: +# 敬雲 林 , 2020 +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-11-16 14:34+0000\n" +"PO-Revision-Date: 2020-09-07 08:18+0000\n" +"Last-Translator: 敬雲 林 , 2020\n" +"Language-Team: Chinese (Taiwan) (https://www.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: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_invalid_count +msgid "# Invalid recipients" +msgstr "# 無效的收件人" + +#. module: sms +#: model:ir.model.fields,field_description:sms.field_sms_composer__recipient_valid_count +msgid "# Valid recipients" +msgstr "#有效的收件人" + +#. module: sms +#: code:addons/sms/models/sms_template.py:0 +#, python-format +msgid "%s (copy)" +msgstr "%s (副本)" + +#. module: sms +#. openerp-web +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#: code:addons/sms/static/src/js/fields_sms_widget.js:0 +#, python-format +msgid "%s characters, fits in %s SMS (%s) " +msgstr "%s 字元, 適合 %s SMS簡訊 (%s) " + +#. module: sms +#: code:addons/sms/wizard/sms_composer.py:0 +#, python-format +msgid "%s invalid recipients" +msgstr "%s無效的收件人" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.mail_resend_message_view_form +msgid "" +" Caution: It won't be possible to send " +"this SMS again to the recipients you did not select." +msgstr " 提示:這不會將信件發送給未選中的收件者。" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Add\n" +" Context Action" +msgstr "" +"添加\n" +" 上下文動作" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_view_form +msgid "" +"Remove\n" +" Context Action" +msgstr "" +"移除\n" +" 上下文動作" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_template_preview_form +msgid "" +"" +msgstr "而是記錄。
" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "records selected." +msgstr "所選記錄。" + +#. module: sms +#: model_terms:ir.ui.view,arch_db:sms.sms_composer_view_form +msgid "to send to all" +msgstr "發送給所有人" diff --git a/addons/sms/models/__init__.py b/addons/sms/models/__init__.py new file mode 100644 index 00000000..d7153098 --- /dev/null +++ b/addons/sms/models/__init__.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import ir_actions +from . import ir_model +from . import mail_followers +from . import mail_message +from . import mail_notification +from . import mail_thread +from . import mail_thread_phone +from . import res_partner +from . import sms_api +from . import sms_sms +from . import sms_template diff --git a/addons/sms/models/ir_actions.py b/addons/sms/models/ir_actions.py new file mode 100644 index 00000000..48c71a9d --- /dev/null +++ b/addons/sms/models/ir_actions.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class ServerActions(models.Model): + """ Add SMS option in server actions. """ + _name = 'ir.actions.server' + _inherit = ['ir.actions.server'] + + state = fields.Selection(selection_add=[ + ('sms', 'Send SMS Text Message'), + ], ondelete={'sms': 'cascade'}) + # SMS + sms_template_id = fields.Many2one( + 'sms.template', 'SMS Template', ondelete='set null', + domain="[('model_id', '=', model_id)]", + ) + sms_mass_keep_log = fields.Boolean('Log as Note', default=True) + + @api.constrains('state', 'model_id') + def _check_sms_capability(self): + for action in self: + if action.state == 'sms' and not action.model_id.is_mail_thread: + raise ValidationError(_("Sending SMS can only be done on a mail.thread model")) + + def _run_action_sms_multi(self, eval_context=None): + # TDE CLEANME: when going to new api with server action, remove action + if not self.sms_template_id or self._is_recompute(): + return False + + records = eval_context.get('records') or eval_context.get('record') + if not records: + return False + + composer = self.env['sms.composer'].with_context( + default_res_model=records._name, + default_res_ids=records.ids, + default_composition_mode='mass', + default_template_id=self.sms_template_id.id, + default_mass_keep_log=self.sms_mass_keep_log, + ).create({}) + composer.action_send_sms() + return False diff --git a/addons/sms/models/ir_model.py b/addons/sms/models/ir_model.py new file mode 100644 index 00000000..1b1db6a9 --- /dev/null +++ b/addons/sms/models/ir_model.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models + + +class IrModel(models.Model): + _inherit = 'ir.model' + + is_mail_thread_sms = fields.Boolean( + string="Mail Thread SMS", default=False, + store=False, compute='_compute_is_mail_thread_sms', search='_search_is_mail_thread_sms', + help="Whether this model supports messages and notifications through SMS", + ) + + @api.depends('is_mail_thread') + def _compute_is_mail_thread_sms(self): + for model in self: + if model.is_mail_thread: + ModelObject = self.env[model.model] + potential_fields = ModelObject._sms_get_number_fields() + ModelObject._sms_get_partner_fields() + if any(fname in ModelObject._fields for fname in potential_fields): + model.is_mail_thread_sms = True + continue + model.is_mail_thread_sms = False + + def _search_is_mail_thread_sms(self, operator, value): + thread_models = self.search([('is_mail_thread', '=', True)]) + valid_models = self.env['ir.model'] + for model in thread_models: + if model.model not in self.env: + continue + ModelObject = self.env[model.model] + potential_fields = ModelObject._sms_get_number_fields() + ModelObject._sms_get_partner_fields() + if any(fname in ModelObject._fields for fname in potential_fields): + valid_models |= model + + search_sms = (operator == '=' and value) or (operator == '!=' and not value) + if search_sms: + return [('id', 'in', valid_models.ids)] + return [('id', 'not in', valid_models.ids)] diff --git a/addons/sms/models/mail_followers.py b/addons/sms/models/mail_followers.py new file mode 100644 index 00000000..76be79b6 --- /dev/null +++ b/addons/sms/models/mail_followers.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models + + +class Followers(models.Model): + _inherit = ['mail.followers'] + + def _get_recipient_data(self, records, message_type, subtype_id, pids=None, cids=None): + if message_type == 'sms': + if pids is None: + sms_pids = records._sms_get_default_partners().ids + else: + sms_pids = pids + res = super(Followers, self)._get_recipient_data(records, message_type, subtype_id, pids=pids, cids=cids) + new_res = [] + for pid, cid, pactive, pshare, ctype, notif, groups in res: + if pid and pid in sms_pids: + notif = 'sms' + new_res.append((pid, cid, pactive, pshare, ctype, notif, groups)) + return new_res + else: + return super(Followers, self)._get_recipient_data(records, message_type, subtype_id, pids=pids, cids=cids) diff --git a/addons/sms/models/mail_message.py b/addons/sms/models/mail_message.py new file mode 100644 index 00000000..cd827d67 --- /dev/null +++ b/addons/sms/models/mail_message.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from collections import defaultdict +from operator import itemgetter + +from odoo import exceptions, fields, models +from odoo.tools import groupby + + +class MailMessage(models.Model): + """ Override MailMessage class in order to add a new type: SMS messages. + Those messages comes with their own notification method, using SMS + gateway. """ + _inherit = 'mail.message' + + message_type = fields.Selection(selection_add=[ + ('sms', 'SMS') + ], ondelete={'sms': lambda recs: recs.write({'message_type': 'email'})}) + has_sms_error = fields.Boolean( + 'Has SMS error', compute='_compute_has_sms_error', search='_search_has_sms_error', + help='Has error') + + def _compute_has_sms_error(self): + sms_error_from_notification = self.env['mail.notification'].sudo().search([ + ('notification_type', '=', 'sms'), + ('mail_message_id', 'in', self.ids), + ('notification_status', '=', 'exception')]).mapped('mail_message_id') + for message in self: + message.has_sms_error = message in sms_error_from_notification + + def _search_has_sms_error(self, operator, operand): + if operator == '=' and operand: + return ['&', ('notification_ids.notification_status', '=', 'exception'), ('notification_ids.notification_type', '=', 'sms')] + raise NotImplementedError() + + def message_format(self): + """ Override in order to retrieves data about SMS (recipient name and + SMS status) + + TDE FIXME: clean the overall message_format thingy + """ + message_values = super(MailMessage, self).message_format() + all_sms_notifications = self.env['mail.notification'].sudo().search([ + ('mail_message_id', 'in', [r['id'] for r in message_values]), + ('notification_type', '=', 'sms') + ]) + msgid_to_notif = defaultdict(lambda: self.env['mail.notification'].sudo()) + for notif in all_sms_notifications: + msgid_to_notif[notif.mail_message_id.id] += notif + + for message in message_values: + customer_sms_data = [(notif.id, notif.res_partner_id.display_name or notif.sms_number, notif.notification_status) for notif in msgid_to_notif.get(message['id'], [])] + message['sms_ids'] = customer_sms_data + return message_values diff --git a/addons/sms/models/mail_notification.py b/addons/sms/models/mail_notification.py new file mode 100644 index 00000000..9c397e2f --- /dev/null +++ b/addons/sms/models/mail_notification.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class MailNotification(models.Model): + _inherit = 'mail.notification' + + notification_type = fields.Selection(selection_add=[ + ('sms', 'SMS') + ], ondelete={'sms': 'set default'}) + sms_id = fields.Many2one('sms.sms', string='SMS', index=True, ondelete='set null') + sms_number = fields.Char('SMS Number') + failure_type = fields.Selection(selection_add=[ + ('sms_number_missing', 'Missing Number'), + ('sms_number_format', 'Wrong Number Format'), + ('sms_credit', 'Insufficient Credit'), + ('sms_server', 'Server Error'), + ('sms_acc', 'Unregistered Account') + ]) diff --git a/addons/sms/models/mail_thread.py b/addons/sms/models/mail_thread.py new file mode 100644 index 00000000..45bd8643 --- /dev/null +++ b/addons/sms/models/mail_thread.py @@ -0,0 +1,349 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging + +from odoo import api, models, fields +from odoo.addons.phone_validation.tools import phone_validation +from odoo.tools import html2plaintext, plaintext2html + +_logger = logging.getLogger(__name__) + + +class MailThread(models.AbstractModel): + _inherit = 'mail.thread' + + message_has_sms_error = fields.Boolean( + 'SMS Delivery error', compute='_compute_message_has_sms_error', search='_search_message_has_sms_error', + help="If checked, some messages have a delivery error.") + + def _compute_message_has_sms_error(self): + res = {} + if self.ids: + self._cr.execute(""" SELECT msg.res_id, COUNT(msg.res_id) FROM mail_message msg + RIGHT JOIN mail_message_res_partner_needaction_rel rel + ON rel.mail_message_id = msg.id AND rel.notification_type = 'sms' AND rel.notification_status in ('exception') + WHERE msg.author_id = %s AND msg.model = %s AND msg.res_id in %s AND msg.message_type != 'user_notification' + GROUP BY msg.res_id""", + (self.env.user.partner_id.id, self._name, tuple(self.ids),)) + res.update(self._cr.fetchall()) + + for record in self: + record.message_has_sms_error = bool(res.get(record._origin.id, 0)) + + @api.model + def _search_message_has_sms_error(self, operator, operand): + return ['&', ('message_ids.has_sms_error', operator, operand), ('message_ids.author_id', '=', self.env.user.partner_id.id)] + + def _sms_get_partner_fields(self): + """ This method returns the fields to use to find the contact to link + whensending an SMS. Having partner is not necessary, having only phone + number fields is possible. However it gives more flexibility to + notifications management when having partners. """ + fields = [] + if hasattr(self, 'partner_id'): + fields.append('partner_id') + if hasattr(self, 'partner_ids'): + fields.append('partner_ids') + return fields + + def _sms_get_default_partners(self): + """ This method will likely need to be overridden by inherited models. + :returns partners: recordset of res.partner + """ + partners = self.env['res.partner'] + for fname in self._sms_get_partner_fields(): + partners = partners.union(*self.mapped(fname)) # ensure ordering + return partners + + def _sms_get_number_fields(self): + """ This method returns the fields to use to find the number to use to + send an SMS on a record. """ + if 'mobile' in self: + return ['mobile'] + return [] + + def _sms_get_recipients_info(self, force_field=False, partner_fallback=True): + """" Get SMS recipient information on current record set. This method + checks for numbers and sanitation in order to centralize computation. + + Example of use cases + + * click on a field -> number is actually forced from field, find customer + linked to record, force its number to field or fallback on customer fields; + * contact -> find numbers from all possible phone fields on record, find + customer, force its number to found field number or fallback on customer fields; + + :param force_field: either give a specific field to find phone number, either + generic heuristic is used to find one based on ``_sms_get_number_fields``; + :param partner_fallback: if no value found in the record, check its customer + values based on ``_sms_get_default_partners``; + + :return dict: record.id: { + 'partner': a res.partner recordset that is the customer (void or singleton) + linked to the recipient. See ``_sms_get_default_partners``; + 'sanitized': sanitized number to use (coming from record's field or partner's + phone fields). Set to False is number impossible to parse and format; + 'number': original number before sanitation; + 'partner_store': whether the number comes from the customer phone fields. If + False it means number comes from the record itself, even if linked to a + customer; + 'field_store': field in which the number has been found (generally mobile or + phone, see ``_sms_get_number_fields``); + } for each record in self + """ + result = dict.fromkeys(self.ids, False) + tocheck_fields = [force_field] if force_field else self._sms_get_number_fields() + for record in self: + all_numbers = [record[fname] for fname in tocheck_fields if fname in record] + all_partners = record._sms_get_default_partners() + + valid_number = False + for fname in [f for f in tocheck_fields if f in record]: + valid_number = phone_validation.phone_sanitize_numbers_w_record([record[fname]], record)[record[fname]]['sanitized'] + if valid_number: + break + + if valid_number: + result[record.id] = { + 'partner': all_partners[0] if all_partners else self.env['res.partner'], + 'sanitized': valid_number, + 'number': record[fname], + 'partner_store': False, + 'field_store': fname, + } + elif all_partners and partner_fallback: + partner = self.env['res.partner'] + for partner in all_partners: + for fname in self.env['res.partner']._sms_get_number_fields(): + valid_number = phone_validation.phone_sanitize_numbers_w_record([partner[fname]], record)[partner[fname]]['sanitized'] + if valid_number: + break + + if not valid_number: + fname = 'mobile' if partner.mobile else ('phone' if partner.phone else 'mobile') + + result[record.id] = { + 'partner': partner, + 'sanitized': valid_number if valid_number else False, + 'number': partner[fname], + 'partner_store': True, + 'field_store': fname, + } + else: + # did not find any sanitized number -> take first set value as fallback; + # if none, just assign False to the first available number field + value, fname = next( + ((value, fname) for value, fname in zip(all_numbers, tocheck_fields) if value), + (False, tocheck_fields[0] if tocheck_fields else False) + ) + result[record.id] = { + 'partner': self.env['res.partner'], + 'sanitized': False, + 'number': value, + 'partner_store': False, + 'field_store': fname + } + return result + + def _message_sms_schedule_mass(self, body='', template=False, active_domain=None, **composer_values): + """ Shortcut method to schedule a mass sms sending on a recordset. + + :param template: an optional sms.template record; + :param active_domain: bypass self.ids and apply composer on active_domain + instead; + """ + composer_context = { + 'default_res_model': self._name, + 'default_composition_mode': 'mass', + 'default_template_id': template.id if template else False, + 'default_body': body if body and not template else False, + } + if active_domain is not None: + composer_context['default_use_active_domain'] = True + composer_context['default_active_domain'] = repr(active_domain) + else: + composer_context['default_res_ids'] = self.ids + + create_vals = { + 'mass_force_send': False, + 'mass_keep_log': True, + } + if composer_values: + create_vals.update(composer_values) + + composer = self.env['sms.composer'].with_context(**composer_context).create(create_vals) + return composer._action_send_sms() + + def _message_sms_with_template(self, template=False, template_xmlid=False, template_fallback='', partner_ids=False, **kwargs): + """ Shortcut method to perform a _message_sms with an sms.template. + + :param template: a valid sms.template record; + :param template_xmlid: XML ID of an sms.template (if no template given); + :param template_fallback: plaintext (jinja-enabled) in case template + and template xml id are falsy (for example due to deleted data); + """ + self.ensure_one() + if not template and template_xmlid: + template = self.env.ref(template_xmlid, raise_if_not_found=False) + if template: + body = template._render_field('body', self.ids, compute_lang=True)[self.id] + else: + body = self.env['sms.template']._render_template(template_fallback, self._name, self.ids)[self.id] + return self._message_sms(body, partner_ids=partner_ids, **kwargs) + + def _message_sms(self, body, subtype_id=False, partner_ids=False, number_field=False, + sms_numbers=None, sms_pid_to_number=None, **kwargs): + """ Main method to post a message on a record using SMS-based notification + method. + + :param body: content of SMS; + :param subtype_id: mail.message.subtype used in mail.message associated + to the sms notification process; + :param partner_ids: if set is a record set of partners to notify; + :param number_field: if set is a name of field to use on current record + to compute a number to notify; + :param sms_numbers: see ``_notify_record_by_sms``; + :param sms_pid_to_number: see ``_notify_record_by_sms``; + """ + self.ensure_one() + sms_pid_to_number = sms_pid_to_number if sms_pid_to_number is not None else {} + + if number_field or (partner_ids is False and sms_numbers is None): + info = self._sms_get_recipients_info(force_field=number_field)[self.id] + info_partner_ids = info['partner'].ids if info['partner'] else False + info_number = info['sanitized'] if info['sanitized'] else info['number'] + if info_partner_ids and info_number: + sms_pid_to_number[info_partner_ids[0]] = info_number + if info_partner_ids: + partner_ids = info_partner_ids + (partner_ids or []) + if not info_partner_ids: + if info_number: + sms_numbers = [info_number] + (sms_numbers or []) + # will send a falsy notification allowing to fix it through SMS wizards + elif not sms_numbers: + sms_numbers = [False] + + if subtype_id is False: + subtype_id = self.env['ir.model.data'].xmlid_to_res_id('mail.mt_note') + + return self.message_post( + body=plaintext2html(html2plaintext(body)), partner_ids=partner_ids or [], # TDE FIXME: temp fix otherwise crash mail_thread.py + message_type='sms', subtype_id=subtype_id, + sms_numbers=sms_numbers, sms_pid_to_number=sms_pid_to_number, + **kwargs + ) + + def _notify_thread(self, message, msg_vals=False, **kwargs): + recipients_data = super(MailThread, self)._notify_thread(message, msg_vals=msg_vals, **kwargs) + self._notify_record_by_sms(message, recipients_data, msg_vals=msg_vals, **kwargs) + return recipients_data + + def _notify_record_by_sms(self, message, recipients_data, msg_vals=False, + sms_numbers=None, sms_pid_to_number=None, + check_existing=False, put_in_queue=False, **kwargs): + """ Notification method: by SMS. + + :param message: mail.message record to notify; + :param recipients_data: see ``_notify_thread``; + :param msg_vals: see ``_notify_thread``; + + :param sms_numbers: additional numbers to notify in addition to partners + and classic recipients; + :param pid_to_number: force a number to notify for a given partner ID + instead of taking its mobile / phone number; + :param check_existing: check for existing notifications to update based on + mailed recipient, otherwise create new notifications; + :param put_in_queue: use cron to send queued SMS instead of sending them + directly; + """ + sms_pid_to_number = sms_pid_to_number if sms_pid_to_number is not None else {} + sms_numbers = sms_numbers if sms_numbers is not None else [] + sms_create_vals = [] + sms_all = self.env['sms.sms'].sudo() + + # pre-compute SMS data + body = msg_vals['body'] if msg_vals and msg_vals.get('body') else message.body + sms_base_vals = { + 'body': html2plaintext(body), + 'mail_message_id': message.id, + 'state': 'outgoing', + } + + # notify from computed recipients_data (followers, specific recipients) + partners_data = [r for r in recipients_data['partners'] if r['notif'] == 'sms'] + partner_ids = [r['id'] for r in partners_data] + if partner_ids: + for partner in self.env['res.partner'].sudo().browse(partner_ids): + number = sms_pid_to_number.get(partner.id) or partner.mobile or partner.phone + sanitize_res = phone_validation.phone_sanitize_numbers_w_record([number], partner)[number] + number = sanitize_res['sanitized'] or number + sms_create_vals.append(dict( + sms_base_vals, + partner_id=partner.id, + number=number + )) + + # notify from additional numbers + if sms_numbers: + sanitized = phone_validation.phone_sanitize_numbers_w_record(sms_numbers, self) + tocreate_numbers = [ + value['sanitized'] or original + for original, value in sanitized.items() + ] + sms_create_vals += [dict( + sms_base_vals, + partner_id=False, + number=n, + state='outgoing' if n else 'error', + error_code='' if n else 'sms_number_missing', + ) for n in tocreate_numbers] + + # create sms and notification + existing_pids, existing_numbers = [], [] + if sms_create_vals: + sms_all |= self.env['sms.sms'].sudo().create(sms_create_vals) + + if check_existing: + existing = self.env['mail.notification'].sudo().search([ + '|', ('res_partner_id', 'in', partner_ids), + '&', ('res_partner_id', '=', False), ('sms_number', 'in', sms_numbers), + ('notification_type', '=', 'sms'), + ('mail_message_id', '=', message.id) + ]) + for n in existing: + if n.res_partner_id.id in partner_ids and n.mail_message_id == message: + existing_pids.append(n.res_partner_id.id) + if not n.res_partner_id and n.sms_number in sms_numbers and n.mail_message_id == message: + existing_numbers.append(n.sms_number) + + notif_create_values = [{ + 'mail_message_id': message.id, + 'res_partner_id': sms.partner_id.id, + 'sms_number': sms.number, + 'notification_type': 'sms', + 'sms_id': sms.id, + 'is_read': True, # discard Inbox notification + 'notification_status': 'ready' if sms.state == 'outgoing' else 'exception', + 'failure_type': '' if sms.state == 'outgoing' else sms.error_code, + } for sms in sms_all if (sms.partner_id and sms.partner_id.id not in existing_pids) or (not sms.partner_id and sms.number not in existing_numbers)] + if notif_create_values: + self.env['mail.notification'].sudo().create(notif_create_values) + + if existing_pids or existing_numbers: + for sms in sms_all: + notif = next((n for n in existing if + (n.res_partner_id.id in existing_pids and n.res_partner_id.id == sms.partner_id.id) or + (not n.res_partner_id and n.sms_number in existing_numbers and n.sms_number == sms.number)), False) + if notif: + notif.write({ + 'notification_type': 'sms', + 'notification_status': 'ready', + 'sms_id': sms.id, + 'sms_number': sms.number, + }) + + if sms_all and not put_in_queue: + sms_all.filtered(lambda sms: sms.state == 'outgoing').send(auto_commit=False, raise_exception=False) + + return True diff --git a/addons/sms/models/mail_thread_phone.py b/addons/sms/models/mail_thread_phone.py new file mode 100644 index 00000000..b886a0f1 --- /dev/null +++ b/addons/sms/models/mail_thread_phone.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class PhoneMixin(models.AbstractModel): + _inherit = 'mail.thread.phone' + + def _phone_get_number_fields(self): + """ Add fields coming from sms implementation. """ + sms_fields = self._sms_get_number_fields() + res = super(PhoneMixin, self)._phone_get_number_fields() + for fname in (f for f in res if f not in sms_fields): + sms_fields.append(fname) + return sms_fields diff --git a/addons/sms/models/res_partner.py b/addons/sms/models/res_partner.py new file mode 100644 index 00000000..3159cb98 --- /dev/null +++ b/addons/sms/models/res_partner.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import models + + +class ResPartner(models.Model): + _name = 'res.partner' + _inherit = ['res.partner', 'mail.thread.phone'] + + def _sms_get_default_partners(self): + """ Override of mail.thread method. + SMS recipients on partners are the partners themselves. + """ + return self + + def _sms_get_number_fields(self): + """ This method returns the fields to use to find the number to use to + send an SMS on a record. """ + # TDE note: should override _phone_get_number_fields but ok as sms override it + return ['mobile', 'phone'] diff --git a/addons/sms/models/sms_api.py b/addons/sms/models/sms_api.py new file mode 100644 index 00000000..b1fa69da --- /dev/null +++ b/addons/sms/models/sms_api.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, models +from odoo.addons.iap.tools import iap_tools + +DEFAULT_ENDPOINT = 'https://iap-sms.odoo.com' + + +class SmsApi(models.AbstractModel): + _name = 'sms.api' + _description = 'SMS API' + + @api.model + def _contact_iap(self, local_endpoint, params): + account = self.env['iap.account'].get('sms') + params['account_token'] = account.account_token + endpoint = self.env['ir.config_parameter'].sudo().get_param('sms.endpoint', DEFAULT_ENDPOINT) + # TODO PRO, the default timeout is 15, do we have to increase it ? + return iap_tools.iap_jsonrpc(endpoint + local_endpoint, params=params) + + @api.model + def _send_sms(self, numbers, message): + """ Send a single message to several numbers + + :param numbers: list of E164 formatted phone numbers + :param message: content to send + + :raises ? TDE FIXME + """ + params = { + 'numbers': numbers, + 'message': message, + } + return self._contact_iap('/iap/message_send', params) + + @api.model + def _send_sms_batch(self, messages): + """ Send SMS using IAP in batch mode + + :param messages: list of SMS to send, structured as dict [{ + 'res_id': integer: ID of sms.sms, + 'number': string: E164 formatted phone number, + 'content': string: content to send + }] + + :return: return of /iap/sms/1/send controller which is a list of dict [{ + 'res_id': integer: ID of sms.sms, + 'state': string: 'insufficient_credit' or 'wrong_number_format' or 'success', + 'credit': integer: number of credits spent to send this SMS, + }] + + :raises: normally none + """ + params = { + 'messages': messages + } + return self._contact_iap('/iap/sms/2/send', params) diff --git a/addons/sms/models/sms_sms.py b/addons/sms/models/sms_sms.py new file mode 100644 index 00000000..a1c197a6 --- /dev/null +++ b/addons/sms/models/sms_sms.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +import logging +import threading + +from odoo import api, fields, models, tools + +_logger = logging.getLogger(__name__) + + +class SmsSms(models.Model): + _name = 'sms.sms' + _description = 'Outgoing SMS' + _rec_name = 'number' + _order = 'id DESC' + + IAP_TO_SMS_STATE = { + 'success': 'sent', + 'insufficient_credit': 'sms_credit', + 'wrong_number_format': 'sms_number_format', + 'server_error': 'sms_server', + 'unregistered': 'sms_acc' + } + + number = fields.Char('Number') + body = fields.Text() + partner_id = fields.Many2one('res.partner', 'Customer') + mail_message_id = fields.Many2one('mail.message', index=True) + state = fields.Selection([ + ('outgoing', 'In Queue'), + ('sent', 'Sent'), + ('error', 'Error'), + ('canceled', 'Canceled') + ], 'SMS Status', readonly=True, copy=False, default='outgoing', required=True) + error_code = fields.Selection([ + ('sms_number_missing', 'Missing Number'), + ('sms_number_format', 'Wrong Number Format'), + ('sms_credit', 'Insufficient Credit'), + ('sms_server', 'Server Error'), + ('sms_acc', 'Unregistered Account'), + # mass mode specific codes + ('sms_blacklist', 'Blacklisted'), + ('sms_duplicate', 'Duplicate'), + ], copy=False) + + def send(self, delete_all=False, auto_commit=False, raise_exception=False): + """ Main API method to send SMS. + + :param delete_all: delete all SMS (sent or not); otherwise delete only + sent SMS; + :param auto_commit: commit after each batch of SMS; + :param raise_exception: raise if there is an issue contacting IAP; + """ + for batch_ids in self._split_batch(): + self.browse(batch_ids)._send(delete_all=delete_all, raise_exception=raise_exception) + # auto-commit if asked except in testing mode + if auto_commit is True and not getattr(threading.currentThread(), 'testing', False): + self._cr.commit() + + def cancel(self): + self.state = 'canceled' + + @api.model + def _process_queue(self, ids=None): + """ Send immediately queued messages, committing after each message is sent. + This is not transactional and should not be called during another transaction! + + :param list ids: optional list of emails ids to send. If passed no search + is performed, and these ids are used instead. + """ + domain = [('state', '=', 'outgoing')] + + filtered_ids = self.search(domain, limit=10000).ids # TDE note: arbitrary limit we might have to update + if ids: + ids = list(set(filtered_ids) & set(ids)) + else: + ids = filtered_ids + ids.sort() + + res = None + try: + # auto-commit except in testing mode + auto_commit = not getattr(threading.currentThread(), 'testing', False) + res = self.browse(ids).send(delete_all=False, auto_commit=auto_commit, raise_exception=False) + except Exception: + _logger.exception("Failed processing SMS queue") + return res + + def _split_batch(self): + batch_size = int(self.env['ir.config_parameter'].sudo().get_param('sms.session.batch.size', 500)) + for sms_batch in tools.split_every(batch_size, self.ids): + yield sms_batch + + def _send(self, delete_all=False, raise_exception=False): + """ This method tries to send SMS after checking the number (presence and + formatting). """ + iap_data = [{ + 'res_id': record.id, + 'number': record.number, + 'content': record.body, + } for record in self] + + try: + iap_results = self.env['sms.api']._send_sms_batch(iap_data) + except Exception as e: + _logger.info('Sent batch %s SMS: %s: failed with exception %s', len(self.ids), self.ids, e) + if raise_exception: + raise + self._postprocess_iap_sent_sms([{'res_id': sms.id, 'state': 'server_error'} for sms in self], delete_all=delete_all) + else: + _logger.info('Send batch %s SMS: %s: gave %s', len(self.ids), self.ids, iap_results) + self._postprocess_iap_sent_sms(iap_results, delete_all=delete_all) + + def _postprocess_iap_sent_sms(self, iap_results, failure_reason=None, delete_all=False): + if delete_all: + todelete_sms_ids = [item['res_id'] for item in iap_results] + else: + todelete_sms_ids = [item['res_id'] for item in iap_results if item['state'] == 'success'] + + for state in self.IAP_TO_SMS_STATE.keys(): + sms_ids = [item['res_id'] for item in iap_results if item['state'] == state] + if sms_ids: + if state != 'success' and not delete_all: + self.env['sms.sms'].sudo().browse(sms_ids).write({ + 'state': 'error', + 'error_code': self.IAP_TO_SMS_STATE[state], + }) + notifications = self.env['mail.notification'].sudo().search([ + ('notification_type', '=', 'sms'), + ('sms_id', 'in', sms_ids), + ('notification_status', 'not in', ('sent', 'canceled'))] + ) + if notifications: + notifications.write({ + 'notification_status': 'sent' if state == 'success' else 'exception', + 'failure_type': self.IAP_TO_SMS_STATE[state] if state != 'success' else False, + 'failure_reason': failure_reason if failure_reason else False, + }) + self.mail_message_id._notify_message_notification_update() + + if todelete_sms_ids: + self.browse(todelete_sms_ids).sudo().unlink() diff --git a/addons/sms/models/sms_template.py b/addons/sms/models/sms_template.py new file mode 100644 index 00000000..be402f02 --- /dev/null +++ b/addons/sms/models/sms_template.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import api, fields, models, _ + + +class SMSTemplate(models.Model): + "Templates for sending SMS" + _name = "sms.template" + _inherit = ['mail.render.mixin'] + _description = 'SMS Templates' + + @api.model + def default_get(self, fields): + res = super(SMSTemplate, self).default_get(fields) + if not fields or 'model_id' in fields and not res.get('model_id') and res.get('model'): + res['model_id'] = self.env['ir.model']._get(res['model']).id + return res + + name = fields.Char('Name', translate=True) + model_id = fields.Many2one( + 'ir.model', string='Applies to', required=True, + domain=['&', ('is_mail_thread_sms', '=', True), ('transient', '=', False)], + help="The type of document this template can be used with", ondelete='cascade') + model = fields.Char('Related Document Model', related='model_id.model', index=True, store=True, readonly=True) + body = fields.Char('Body', translate=True, required=True) + # Use to create contextual action (same as for email template) + sidebar_action_id = fields.Many2one('ir.actions.act_window', 'Sidebar action', readonly=True, copy=False, + help="Sidebar action to make this template available on records " + "of the related document model") + + @api.returns('self', lambda value: value.id) + def copy(self, default=None): + default = dict(default or {}, + name=_("%s (copy)", self.name)) + return super(SMSTemplate, self).copy(default=default) + + def unlink(self): + self.sudo().mapped('sidebar_action_id').unlink() + return super(SMSTemplate, self).unlink() + + def action_create_sidebar_action(self): + ActWindow = self.env['ir.actions.act_window'] + view = self.env.ref('sms.sms_composer_view_form') + + for template in self: + button_name = _('Send SMS (%s)', template.name) + action = ActWindow.create({ + 'name': button_name, + 'type': 'ir.actions.act_window', + 'res_model': 'sms.composer', + # Add default_composition_mode to guess to determine if need to use mass or comment composer + 'context': "{'default_template_id' : %d, 'sms_composition_mode': 'guess', 'default_res_ids': active_ids, 'default_res_id': active_id}" % (template.id), + 'view_mode': 'form', + 'view_id': view.id, + 'target': 'new', + 'binding_model_id': template.model_id.id, + }) + template.write({'sidebar_action_id': action.id}) + return True + + def action_unlink_sidebar_action(self): + for template in self: + if template.sidebar_action_id: + template.sidebar_action_id.unlink() + return True diff --git a/addons/sms/security/ir.model.access.csv b/addons/sms/security/ir.model.access.csv new file mode 100644 index 00000000..bf543480 --- /dev/null +++ b/addons/sms/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_sms_sms_all,access.sms.sms.all,model_sms_sms,,0,0,0,0 +access_sms_sms_system,access.sms.sms.system,model_sms_sms,base.group_system,1,1,1,1 +access_sms_template_all,access.sms.template.all,model_sms_template,,0,0,0,0 +access_sms_template_user,access.sms.template.user,model_sms_template,base.group_user,1,0,0,0 +access_sms_template_system,access.sms.template.system,model_sms_template,base.group_system,1,1,1,1 +access_sms_cancel,access.sms.cancel,model_sms_cancel,base.group_user,1,1,1,0 +access_sms_composer,access.sms.composer,model_sms_composer,base.group_user,1,1,1,0 +access_sms_resend_recipient,access.sms.resend.recipient,model_sms_resend_recipient,base.group_user,1,1,1,0 +access_sms_resend,access.sms.resend,model_sms_resend,base.group_user,1,1,1,0 +access_sms_template_preview,access.sms.template.preview,model_sms_template_preview,base.group_user,1,1,1,0 diff --git a/addons/sms/security/sms_security.xml b/addons/sms/security/sms_security.xml new file mode 100644 index 00000000..8345189a --- /dev/null +++ b/addons/sms/security/sms_security.xml @@ -0,0 +1,9 @@ + + + + SMS Template: system group granted all + + + [(1, '=', 1)] + + diff --git a/addons/sms/static/img/sms_failure.svg b/addons/sms/static/img/sms_failure.svg new file mode 100644 index 00000000..d03ee04b --- /dev/null +++ b/addons/sms/static/img/sms_failure.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/addons/sms/static/src/bugfix/bugfix.js b/addons/sms/static/src/bugfix/bugfix.js new file mode 100644 index 00000000..ee604b8b --- /dev/null +++ b/addons/sms/static/src/bugfix/bugfix.js @@ -0,0 +1,10 @@ +/** + * This file allows introducing new JS modules without contaminating other files. + * This is useful when bug fixing requires adding such JS modules in stable + * versions of Odoo. Any module that is defined in this file should be isolated + * in its own file in master. + */ +odoo.define('sms/static/src/bugfix/bugfix.js', function (require) { +'use strict'; + +}); diff --git a/addons/sms/static/src/bugfix/bugfix.scss b/addons/sms/static/src/bugfix/bugfix.scss new file mode 100644 index 00000000..c4272e52 --- /dev/null +++ b/addons/sms/static/src/bugfix/bugfix.scss @@ -0,0 +1,6 @@ +/** +* This file allows introducing new styles without contaminating other files. +* This is useful when bug fixing requires adding new components for instance in +* stable versions of Odoo. Any style that is defined in this file should be isolated +* in its own file in master. +*/ diff --git a/addons/sms/static/src/bugfix/bugfix.xml b/addons/sms/static/src/bugfix/bugfix.xml new file mode 100644 index 00000000..c17906f7 --- /dev/null +++ b/addons/sms/static/src/bugfix/bugfix.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/addons/sms/static/src/bugfix/bugfix_tests.js b/addons/sms/static/src/bugfix/bugfix_tests.js new file mode 100644 index 00000000..938426c6 --- /dev/null +++ b/addons/sms/static/src/bugfix/bugfix_tests.js @@ -0,0 +1,18 @@ +odoo.define('sms/static/src/bugfix/bugfix_tests.js', function (require) { +'use strict'; + +/** + * This file allows introducing new QUnit test modules without contaminating + * other test files. This is useful when bug fixing requires adding new + * components for instance in stable versions of Odoo. Any test that is defined + * in this file should be isolated in its own file in master. + */ +QUnit.module('sms', {}, function () { +QUnit.module('bugfix', {}, function () { +QUnit.module('bugfix_tests.js', { + +}); +}); +}); + +}); diff --git a/addons/sms/static/src/components/message/message.xml b/addons/sms/static/src/components/message/message.xml new file mode 100644 index 00000000..b8b6a18d --- /dev/null +++ b/addons/sms/static/src/components/message/message.xml @@ -0,0 +1,20 @@ + + + + + + + SMS + + $0 + + + + + SMS + + $0 + + + + diff --git a/addons/sms/static/src/components/message/message_tests.js b/addons/sms/static/src/components/message/message_tests.js new file mode 100644 index 00000000..57bc21ab --- /dev/null +++ b/addons/sms/static/src/components/message/message_tests.js @@ -0,0 +1,197 @@ +odoo.define('sms/static/src/components/message/message_tests.js', function (require) { +'use strict'; + +const components = { + Message: require('mail/static/src/components/message/message.js'), +}; +const { makeDeferred } = require('mail/static/src/utils/deferred/deferred.js'); +const { + afterEach, + afterNextRender, + beforeEach, + createRootComponent, + start, +} = require('mail/static/src/utils/test_utils.js'); + +const Bus = require('web.Bus'); + +QUnit.module('sms', {}, function () { +QUnit.module('components', {}, function () { +QUnit.module('message', {}, function () { +QUnit.module('message_tests.js', { + beforeEach() { + beforeEach(this); + + this.createMessageComponent = async (message, otherProps) => { + const props = Object.assign({ messageLocalId: message.localId }, otherProps); + await createRootComponent(this, components.Message, { + props, + target: this.widget.el, + }); + }; + + this.start = async params => { + const { env, widget } = await start(Object.assign({}, params, { + data: this.data, + })); + this.env = env; + this.widget = widget; + }; + }, + afterEach() { + afterEach(this); + }, +}); + +QUnit.test('Notification Sent', async function (assert) { + assert.expect(9); + + await this.start(); + const threadViewer = this.env.models['mail.thread_viewer'].create({ + hasThreadView: true, + thread: [['create', { + id: 11, + model: 'mail.channel', + }]], + }); + const message = this.env.models['mail.message'].create({ + id: 10, + message_type: 'sms', + notifications: [['insert', { + id: 11, + notification_status: 'sent', + notification_type: 'sms', + partner: [['insert', { id: 12, name: "Someone" }]], + }]], + originThread: [['link', threadViewer.thread]] + }); + await this.createMessageComponent(message, { + threadViewLocalId: threadViewer.threadView.localId + }); + + assert.containsOnce( + document.body, + '.o_Message', + "should display a message component" + ); + assert.containsOnce( + document.body, + '.o_Message_notificationIconClickable', + "should display the notification icon container" + ); + assert.containsOnce( + document.body, + '.o_Message_notificationIcon', + "should display the notification icon" + ); + assert.hasClass( + document.querySelector('.o_Message_notificationIcon'), + 'fa-mobile', + "icon should represent sms" + ); + + await afterNextRender(() => { + document.querySelector('.o_Message_notificationIconClickable').click(); + }); + assert.containsOnce( + document.body, + '.o_NotificationPopover', + "notification popover should be open" + ); + assert.containsOnce( + document.body, + '.o_NotificationPopover_notificationIcon', + "popover should have one icon" + ); + assert.hasClass( + document.querySelector('.o_NotificationPopover_notificationIcon'), + 'fa-check', + "popover should have the sent icon" + ); + assert.containsOnce( + document.body, + '.o_NotificationPopover_notificationPartnerName', + "popover should have the partner name" + ); + assert.strictEqual( + document.querySelector('.o_NotificationPopover_notificationPartnerName').textContent.trim(), + "Someone", + "partner name should be correct" + ); +}); + +QUnit.test('Notification Error', async function (assert) { + assert.expect(8); + + const openResendActionDef = makeDeferred(); + const bus = new Bus(); + bus.on('do-action', null, payload => { + assert.step('do_action'); + assert.strictEqual( + payload.action, + 'sms.sms_resend_action', + "action should be the one to resend sms" + ); + assert.strictEqual( + payload.options.additional_context.default_mail_message_id, + 10, + "action should have correct message id" + ); + openResendActionDef.resolve(); + }); + + await this.start({ env: { bus } }); + const threadViewer = this.env.models['mail.thread_viewer'].create({ + hasThreadView: true, + thread: [['create', { + id: 11, + model: 'mail.channel', + }]], + }); + const message = this.env.models['mail.message'].create({ + id: 10, + message_type: 'sms', + notifications: [['insert', { + id: 11, + notification_status: 'exception', + notification_type: 'sms', + }]], + originThread: [['link', threadViewer.thread]] + }); + await this.createMessageComponent(message, { + threadViewLocalId: threadViewer.threadView.localId + }); + + assert.containsOnce( + document.body, + '.o_Message', + "should display a message component" + ); + assert.containsOnce( + document.body, + '.o_Message_notificationIconClickable', + "should display the notification icon container" + ); + assert.containsOnce( + document.body, + '.o_Message_notificationIcon', + "should display the notification icon" + ); + assert.hasClass( + document.querySelector('.o_Message_notificationIcon'), + 'fa-mobile', + "icon should represent sms" + ); + document.querySelector('.o_Message_notificationIconClickable').click(); + await openResendActionDef; + assert.verifySteps( + ['do_action'], + "should do an action to display the resend sms dialog" + ); +}); + +}); +}); +}); + +}); diff --git a/addons/sms/static/src/components/notification_group/notification_group.js b/addons/sms/static/src/components/notification_group/notification_group.js new file mode 100644 index 00000000..053fedc5 --- /dev/null +++ b/addons/sms/static/src/components/notification_group/notification_group.js @@ -0,0 +1,27 @@ +odoo.define('sms/static/src/components/notification_group/notification_group.js', function (require) { +'use strict'; + +const components = { + NotificationGroup: require('mail/static/src/components/notification_group/notification_group.js'), +}; + +const { patch } = require('web.utils'); + +patch(components.NotificationGroup, 'sms/static/src/components/notification_group/notification_group.js', { + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + */ + image() { + if (this.group.notification_type === 'sms') { + return '/sms/static/img/sms_failure.svg'; + } + return this._super(...arguments); + }, +}); + +}); diff --git a/addons/sms/static/src/components/notification_group/notification_group.xml b/addons/sms/static/src/components/notification_group/notification_group.xml new file mode 100644 index 00000000..c5f5a8db --- /dev/null +++ b/addons/sms/static/src/components/notification_group/notification_group.xml @@ -0,0 +1,12 @@ + + + + + + + An error occurred when sending an SMS. + + + + + diff --git a/addons/sms/static/src/components/notification_list/notification_list_notification_group_tests.js b/addons/sms/static/src/components/notification_list/notification_list_notification_group_tests.js new file mode 100644 index 00000000..bd5d8402 --- /dev/null +++ b/addons/sms/static/src/components/notification_list/notification_list_notification_group_tests.js @@ -0,0 +1,309 @@ +odoo.define('sms/static/src/components/notification_list/notification_list_notification_group_tests.js', function (require) { +'use strict'; + +const components = { + NotificationList: require('mail/static/src/components/notification_list/notification_list.js'), +}; + +const { + afterEach, + beforeEach, + createRootComponent, + start, +} = require('mail/static/src/utils/test_utils.js'); + +const Bus = require('web.Bus'); + +QUnit.module('sms', {}, function () { +QUnit.module('components', {}, function () { +QUnit.module('notification_list', {}, function () { +QUnit.module('notification_list_notification_group_tests.js', { + beforeEach() { + beforeEach(this); + + /** + * @param {Object} param0 + * @param {string} [param0.filter='all'] + */ + this.createNotificationListComponent = async ({ filter = 'all' } = {}) => { + await createRootComponent(this, components.NotificationList, { + props: { filter }, + target: this.widget.el, + }); + }; + + this.start = async params => { + const { env, widget } = await start(Object.assign({}, params, { + data: this.data, + })); + this.env = env; + this.widget = widget; + }; + }, + afterEach() { + afterEach(this); + }, +}); + +QUnit.test('mark as read', async function (assert) { + assert.expect(6); + + this.data['mail.message'].records.push( + // message that is expected to have a failure + { + id: 11, // random unique id, will be used to link failure to message + message_type: 'sms', // message must be sms (goal of the test) + model: 'mail.channel', // expected value to link message to channel + res_id: 31, // id of a random channel + } + ); + this.data['mail.notification'].records.push( + // failure that is expected to be used in the test + { + mail_message_id: 11, // id of the related message + notification_status: 'exception', // necessary value to have a failure + notification_type: 'sms', // expected failure type for sms message + } + ); + const bus = new Bus(); + bus.on('do-action', null, payload => { + assert.step('do_action'); + assert.strictEqual( + payload.action, + 'sms.sms_cancel_action', + "action should be the one to cancel sms" + ); + assert.strictEqual( + payload.options.additional_context.default_model, + 'mail.channel', + "action should have the group model as default_model" + ); + assert.strictEqual( + payload.options.additional_context.unread_counter, + 1, + "action should have the group notification length as unread_counter" + ); + }); + + await this.start({ env: { bus } }); + await this.createNotificationListComponent(); + + assert.containsOnce( + document.body, + '.o_NotificationGroup_markAsRead', + "should have 1 mark as read button" + ); + + document.querySelector('.o_NotificationGroup_markAsRead').click(); + assert.verifySteps( + ['do_action'], + "should do an action to display the cancel sms dialog" + ); +}); + +QUnit.test('notifications grouped by notification_type', async function (assert) { + assert.expect(11); + + this.data['mail.message'].records.push( + // first message that is expected to have a failure + { + id: 11, // random unique id, will be used to link failure to message + message_type: 'email', // different type from second message + model: 'res.partner', // same model as second message (and not `mail.channel`) + res_id: 31, // same res_id as second message + res_model_name: "Partner", // random related model name + }, + // second message that is expected to have a failure + { + id: 12, // random unique id, will be used to link failure to message + message_type: 'sms', // different type from first message + model: 'res.partner', // same model as first message (and not `mail.channel`) + res_id: 31, // same res_id as first message + res_model_name: "Partner", // same related model name for consistency + } + ); + this.data['mail.notification'].records.push( + // first failure that is expected to be used in the test + { + mail_message_id: 11, // id of the related first message + notification_status: 'exception', // necessary value to have a failure + notification_type: 'email', // different type from second failure + }, + // second failure that is expected to be used in the test + { + mail_message_id: 12, // id of the related second message + notification_status: 'exception', // necessary value to have a failure + notification_type: 'sms', // different type from first failure + } + ); + await this.start(); + await this.createNotificationListComponent(); + + assert.containsN( + document.body, + '.o_NotificationGroup', + 2, + "should have 2 notifications group" + ); + const groups = document.querySelectorAll('.o_NotificationGroup'); + assert.containsOnce( + groups[0], + '.o_NotificationGroup_name', + "should have 1 group name in first group" + ); + assert.strictEqual( + groups[0].querySelector('.o_NotificationGroup_name').textContent, + "Partner", + "should have model name as group name" + ); + assert.containsOnce( + groups[0], + '.o_NotificationGroup_counter', + "should have 1 group counter in first group" + ); + assert.strictEqual( + groups[0].querySelector('.o_NotificationGroup_counter').textContent.trim(), + "(1)", + "should have 1 notification in first group" + ); + assert.strictEqual( + groups[0].querySelector('.o_NotificationGroup_inlineText').textContent.trim(), + "An error occurred when sending an email.", + "should have the group text corresponding to email" + ); + assert.containsOnce( + groups[1], + '.o_NotificationGroup_name', + "should have 1 group name in second group" + ); + assert.strictEqual( + groups[1].querySelector('.o_NotificationGroup_name').textContent, + "Partner", + "should have second model name as group name" + ); + assert.containsOnce( + groups[1], + '.o_NotificationGroup_counter', + "should have 1 group counter in second group" + ); + assert.strictEqual( + groups[1].querySelector('.o_NotificationGroup_counter').textContent.trim(), + "(1)", + "should have 1 notification in second group" + ); + assert.strictEqual( + groups[1].querySelector('.o_NotificationGroup_inlineText').textContent.trim(), + "An error occurred when sending an SMS.", + "should have the group text corresponding to sms" + ); +}); + +QUnit.test('grouped notifications by document model', async function (assert) { + // If all failures linked to a document model refers to different documents, + // a single notification should group all failures that are linked to this + // document model. + assert.expect(12); + + this.data['mail.message'].records.push( + // first message that is expected to have a failure + { + id: 11, // random unique id, will be used to link failure to message + message_type: 'sms', // message must be sms (goal of the test) + model: 'res.partner', // same model as second message (and not `mail.channel`) + res_id: 31, // different res_id from second message + res_model_name: "Partner", // random related model name + }, + // second message that is expected to have a failure + { + id: 12, // random unique id, will be used to link failure to message + message_type: 'sms', // message must be sms (goal of the test) + model: 'res.partner', // same model as first message (and not `mail.channel`) + res_id: 32, // different res_id from first message + res_model_name: "Partner", // same related model name for consistency + } + ); + this.data['mail.notification'].records.push( + // first failure that is expected to be used in the test + { + mail_message_id: 11, // id of the related first message + notification_status: 'exception', // necessary value to have a failure + notification_type: 'sms', // expected failure type for sms message + }, + // second failure that is expected to be used in the test + { + mail_message_id: 12, // id of the related second message + notification_status: 'exception', // necessary value to have a failure + notification_type: 'sms', // expected failure type for sms message + } + ); + const bus = new Bus(); + bus.on('do-action', null, payload => { + assert.step('do_action'); + assert.strictEqual( + payload.action.name, + "SMS Failures", + "action should have 'SMS Failures' as name", + ); + assert.strictEqual( + payload.action.type, + 'ir.actions.act_window', + "action should have the type act_window" + ); + assert.strictEqual( + payload.action.view_mode, + 'kanban,list,form', + "action should have 'kanban,list,form' as view_mode" + ); + assert.strictEqual( + JSON.stringify(payload.action.views), + JSON.stringify([[false, 'kanban'], [false, 'list'], [false, 'form']]), + "action should have correct views" + ); + assert.strictEqual( + payload.action.target, + 'current', + "action should have 'current' as target" + ); + assert.strictEqual( + payload.action.res_model, + 'res.partner', + "action should have the group model as res_model" + ); + assert.strictEqual( + JSON.stringify(payload.action.domain), + JSON.stringify([['message_has_sms_error', '=', true]]), + "action should have 'message_has_sms_error' as domain" + ); + }); + + await this.start({ env: { bus } }); + await this.createNotificationListComponent(); + + assert.containsOnce( + document.body, + '.o_NotificationGroup', + "should have 1 notification group" + ); + assert.containsOnce( + document.body, + '.o_NotificationGroup_counter', + "should have 1 group counter" + ); + assert.strictEqual( + document.querySelector('.o_NotificationGroup_counter').textContent.trim(), + "(2)", + "should have 2 notifications in the group" + ); + + document.querySelector('.o_NotificationGroup').click(); + assert.verifySteps( + ['do_action'], + "should do an action to display the related records" + ); +}); + +}); +}); +}); + +}); diff --git a/addons/sms/static/src/js/fields_phone_widget.js b/addons/sms/static/src/js/fields_phone_widget.js new file mode 100644 index 00000000..82b8e5b3 --- /dev/null +++ b/addons/sms/static/src/js/fields_phone_widget.js @@ -0,0 +1,100 @@ +odoo.define('sms.fields', function (require) { +"use strict"; + +var basic_fields = require('web.basic_fields'); +var core = require('web.core'); +var session = require('web.session'); + +var _t = core._t; + +/** + * Override of FieldPhone to add a button calling SMS composer if option activated (default) + */ + +var Phone = basic_fields.FieldPhone; +Phone.include({ + /** + * By default, enable_sms is activated + * + * @override + */ + init() { + this._super.apply(this, arguments); + this.enableSMS = 'enable_sms' in this.attrs.options ? this.attrs.options.enable_sms : true; + // reinject in nodeOptions (and thus in this.attrs) to signal the property + this.attrs.options.enable_sms = this.enableSMS; + }, + /** + * When the send SMS button is displayed, $el becomes a div wrapping + * the original links. + * This method makes sure we always focus the phone number + * + * @override + */ + getFocusableElement() { + if (this.enableSMS && this.mode === 'readonly') { + return this.$el.filter('.' + this.className); + } + return this._super.apply(this, arguments); + }, + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Open SMS composer wizard + * + * @private + */ + _onClickSMS: function (ev) { + ev.preventDefault(); + ev.stopPropagation(); + + var context = session.user_context; + context = _.extend({}, context, { + default_res_model: this.model, + default_res_id: parseInt(this.res_id), + default_number_field_name: this.name, + default_composition_mode: 'comment', + }); + var self = this; + return this.do_action({ + title: _t('Send SMS Text Message'), + type: 'ir.actions.act_window', + res_model: 'sms.composer', + target: 'new', + views: [[false, 'form']], + context: context, + }, { + on_close: function () { + self.trigger_up('reload'); + }}); + }, + + /** + * Add a button to call the composer wizard + * + * @override + * @private + */ + _renderReadonly: function () { + var def = this._super.apply(this, arguments); + if (this.enableSMS && this.value) { + var $composerButton = $('', { + title: _t('Send SMS Text Message'), + href: '', + class: 'ml-3 d-inline-flex align-items-center o_field_phone_sms', + html: $('', {class: 'font-weight-bold ml-1', html: 'SMS'}), + }); + $composerButton.prepend($('', {class: 'fa fa-mobile'})); + $composerButton.on('click', this._onClickSMS.bind(this)); + this.$el = this.$el.add($composerButton); + } + + return def; + }, +}); + +return Phone; + +}); diff --git a/addons/sms/static/src/js/fields_sms_widget.js b/addons/sms/static/src/js/fields_sms_widget.js new file mode 100644 index 00000000..5a52d68e --- /dev/null +++ b/addons/sms/static/src/js/fields_sms_widget.js @@ -0,0 +1,185 @@ +odoo.define('sms.sms_widget', function (require) { +"use strict"; + +var core = require('web.core'); +var fieldRegistry = require('web.field_registry'); +var FieldTextEmojis = require('mail.field_text_emojis'); + +var _t = core._t; +/** + * SmsWidget is a widget to display a textarea (the body) and a text representing + * the number of SMS and the number of characters. This text is computed every + * time the user changes the body. + */ +var SmsWidget = FieldTextEmojis.extend({ + className: 'o_field_text', + enableEmojis: false, + /** + * @constructor + */ + init: function () { + this._super.apply(this, arguments); + this.nbrChar = 0; + this.nbrSMS = 0; + this.encoding = 'GSM7'; + this.enableEmojis = !!this.nodeOptions.enable_emojis; + }, + + /** + * @override + *"This will add the emoji dropdown to a target field (controlled by the "enableEmojis" attribute) + */ + on_attach_callback: function () { + if (this.enableEmojis) { + this._super.apply(this, arguments); + } + }, + + //-------------------------------------------------------------------------- + // Private: override widget + //-------------------------------------------------------------------------- + + /** + * @private + * @override + */ + _renderEdit: function () { + var def = this._super.apply(this, arguments); + + this._compute(); + $('.o_sms_container').remove(); + var $sms_container = $('
'); + $sms_container.append(this._renderSMSInfo()); + $sms_container.append(this._renderIAPButton()); + this.$el = this.$el.add($sms_container); + + return def; + }, + + //-------------------------------------------------------------------------- + // Private: SMS + //-------------------------------------------------------------------------- + + /** + * Compute the number of characters and sms + * @private + */ + _compute: function () { + var content = this._getValue(); + this.encoding = this._extractEncoding(content); + this.nbrChar = content.length; + this.nbrChar += (content.match(/\n/g) || []).length; + this.nbrSMS = this._countSMS(this.nbrChar, this.encoding); + }, + + /** + * Count the number of SMS of the content + * @private + * @returns {integer} Number of SMS + */ + _countSMS: function () { + if (this.nbrChar === 0) { + return 0; + } + if (this.encoding === 'UNICODE') { + if (this.nbrChar <= 70) { + return 1; + } + return Math.ceil(this.nbrChar / 67); + } + if (this.nbrChar <= 160) { + return 1; + } + return Math.ceil(this.nbrChar / 153); + }, + + /** + * Extract the encoding depending on the characters in the content + * @private + * @param {String} content Content of the SMS + * @returns {String} Encoding of the content (GSM7 or UNICODE) + */ + _extractEncoding: function (content) { + if (String(content).match(RegExp("^[@£$¥èéùìòÇ\\nØø\\rÅåΔ_ΦΓΛΩΠΨΣΘΞÆæßÉ !\\\"#¤%&'()*+,-./0123456789:;<=>?¡ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÑܧ¿abcdefghijklmnopqrstuvwxyzäöñüà]*$"))) { + return 'GSM7'; + } + return 'UNICODE'; + }, + + /** + * Render the IAP button to redirect to IAP pricing + * @private + */ + _renderIAPButton: function () { + return $('', { + 'href': 'https://iap-services.odoo.com/iap/sms/pricing', + 'target': '_blank', + 'title': _t('SMS Pricing'), + 'aria-label': _t('SMS Pricing'), + 'class': 'fa fa-lg fa-info-circle', + }); + }, + + /** + * Render the number of characters, sms and the encoding. + * @private + */ + _renderSMSInfo: function () { + var string = _.str.sprintf(_t('%s characters, fits in %s SMS (%s) '), this.nbrChar, this.nbrSMS, this.encoding); + var $span = $('', { + 'class': 'text-muted o_sms_count', + }); + $span.text(string); + return $span; + }, + + /** + * Update widget SMS information with re-computed info about length, ... + * @private + */ + _updateSMSInfo: function () { + this._compute(); + var string = _.str.sprintf(_t('%s characters, fits in %s SMS (%s) '), this.nbrChar, this.nbrSMS, this.encoding); + this.$('.o_sms_count').text(string); + }, + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @override + * @private + */ + _onBlur: function () { + var content = this._getValue(); + if( !content.trim().length && content.length > 0) { + this.do_warn(_t("Your SMS Text Message must include at least one non-whitespace character")); + this.$input.val(content.trim()); + this._updateSMSInfo(); + } + }, + + /** + * @override + * @private + */ + _onChange: function () { + this._super.apply(this, arguments); + this._updateSMSInfo(); + }, + + /** + * @override + * @private + */ + _onInput: function () { + this._super.apply(this, arguments); + this._updateSMSInfo(); + }, +}); + +fieldRegistry.add('sms_widget', SmsWidget); + +return SmsWidget; +}); diff --git a/addons/sms/static/src/models/message/message.js b/addons/sms/static/src/models/message/message.js new file mode 100644 index 00000000..2f468cc0 --- /dev/null +++ b/addons/sms/static/src/models/message/message.js @@ -0,0 +1,33 @@ +odoo.define('sms/static/src/models/message/message.js', function (require) { +'use strict'; + +const { + registerInstancePatchModel, +} = require('mail/static/src/model/model_core.js'); + +registerInstancePatchModel('mail.message', 'sms/static/src/models/message/message.js', { + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + */ + openResendAction() { + if (this.message_type === 'sms') { + this.env.bus.trigger('do-action', { + action: 'sms.sms_resend_action', + options: { + additional_context: { + default_mail_message_id: this.id, + }, + }, + }); + } else { + this._super(...arguments); + } + }, +}); + +}); diff --git a/addons/sms/static/src/models/notification_group/notification_group.js b/addons/sms/static/src/models/notification_group/notification_group.js new file mode 100644 index 00000000..887d9a7d --- /dev/null +++ b/addons/sms/static/src/models/notification_group/notification_group.js @@ -0,0 +1,62 @@ +odoo.define('sms/static/src/models/notification_group/notification_group.js', function (require) { +'use strict'; + +const { + registerInstancePatchModel, +} = require('mail/static/src/model/model_core.js'); + +registerInstancePatchModel('mail.notification_group', 'sms/static/src/models/notification_group/notification_group.js', { + + //-------------------------------------------------------------------------- + // Public + //-------------------------------------------------------------------------- + + /** + * @override + */ + openCancelAction() { + if (this.notification_type !== 'sms') { + return this._super(...arguments); + } + this.env.bus.trigger('do-action', { + action: 'sms.sms_cancel_action', + options: { + additional_context: { + default_model: this.res_model, + unread_counter: this.notifications.length, + }, + }, + }); + }, + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * @override + */ + _openDocuments() { + if (this.notification_type !== 'sms') { + return this._super(...arguments); + } + this.env.bus.trigger('do-action', { + action: { + name: this.env._t("SMS Failures"), + type: 'ir.actions.act_window', + view_mode: 'kanban,list,form', + views: [[false, 'kanban'], [false, 'list'], [false, 'form']], + target: 'current', + res_model: this.res_model, + domain: [['message_has_sms_error', '=', true]], + }, + }); + if (this.env.messaging.device.isMobile) { + // messaging menu has a higher z-index than views so it must + // be closed to ensure the visibility of the view + this.env.messaging.messagingMenu.close(); + } + }, +}); + +}); diff --git a/addons/sms/static/tests/sms_widget_test.js b/addons/sms/static/tests/sms_widget_test.js new file mode 100644 index 00000000..3da34dcd --- /dev/null +++ b/addons/sms/static/tests/sms_widget_test.js @@ -0,0 +1,229 @@ +odoo.define('sms.sms_widget_tests', function (require) { +"use strict"; + +var config = require('web.config'); +var FormView = require('web.FormView'); +var ListView = require('web.ListView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; + +QUnit.module('fields', { + beforeEach: function () { + this.data = { + partner: { + fields: { + message: {string: "message", type: "text"}, + foo: {string: "Foo", type: "char", default: "My little Foo Value"}, + mobile: {string: "mobile", type: "text"}, + }, + records: [{ + id: 1, + message: "", + foo: 'yop', + mobile: "+32494444444", + }, { + id: 2, + message: "", + foo: 'bayou', + }] + }, + visitor: { + fields: { + mobile: {string: "mobile", type: "text"}, + }, + records: [{ + id: 1, + mobile: "+32494444444", + }] + }, + }; + } +}, function () { + + QUnit.module('SmsWidget'); + + QUnit.test('Sms widgets are correctly rendered', async function (assert) { + assert.expect(9); + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + }); + + assert.containsOnce(form, '.o_sms_count', "Should have a sms counter"); + assert.strictEqual(form.$('.o_sms_count').text(), '0 characters, fits in 0 SMS (GSM7) ', + 'Should be "0 characters, fits in 0 SMS (GSM7) " by default'); + // GSM-7 + await testUtils.fields.editAndTrigger(form.$('.o_input'), "Hello from Odoo", 'input'); + assert.strictEqual(form.$('.o_sms_count').text(), '15 characters, fits in 1 SMS (GSM7) ', + 'Should be "15 characters, fits in 1 SMS (GSM7) " for "Hello from Odoo"'); + // GSM-7 with \n => this one count as 2 characters + form.$('.o_input').val("Hello from Odoo\n").trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '17 characters, fits in 1 SMS (GSM7) ', + 'Should be "17 characters, fits in 1 SMS (GSM7) " for "Hello from Odoo\\n"'); + // Unicode => ê + form.$('.o_input').val("Hêllo from Odoo").trigger('input'); + assert.strictEqual(form.$('.o_sms_count').text(), '15 characters, fits in 1 SMS (UNICODE) ', + 'Should be "15 characters, fits in 1 SMS (UNICODE) " for "Hêllo from Odoo"'); + // GSM-7 with 160c + var text = Array(161).join('a'); + await testUtils.fields.editAndTrigger(form.$('.o_input'), text, 'input'); + assert.strictEqual(form.$('.o_sms_count').text(), '160 characters, fits in 1 SMS (GSM7) ', + 'Should be "160 characters, fits in 1 SMS (GSM7) " for 160 x "a"'); + // GSM-7 with 161c + text = Array(162).join('a'); + await testUtils.fields.editAndTrigger(form.$('.o_input'), text, 'input'); + assert.strictEqual(form.$('.o_sms_count').text(), '161 characters, fits in 2 SMS (GSM7) ', + 'Should be "161 characters, fits in 2 SMS (GSM7) " for 161 x "a"'); + // Unicode with 70c + text = Array(71).join('ê'); + await testUtils.fields.editAndTrigger(form.$('.o_input'), text, 'input'); + assert.strictEqual(form.$('.o_sms_count').text(), '70 characters, fits in 1 SMS (UNICODE) ', + 'Should be "70 characters, fits in 1 SMS (UNICODE) " for 70 x "ê"'); + // Unicode with 71c + text = Array(72).join('ê'); + await testUtils.fields.editAndTrigger(form.$('.o_input'), text, 'input'); + assert.strictEqual(form.$('.o_sms_count').text(), '71 characters, fits in 2 SMS (UNICODE) ', + 'Should be "71 characters, fits in 2 SMS (UNICODE) " for 71 x "ê"'); + + form.destroy(); + }); + + QUnit.test('Sms widgets with non-empty initial value', async function (assert) { + assert.expect(1); + var form = await createView({ + View: FormView, + model: 'visitor', + data: this.data, + arch: `
`, + res_id: 1, + res_ids: [1], + }); + + assert.strictEqual(form.$('.o_field_text').text(), '+32494444444', + 'Should have the initial value'); + + form.destroy(); + }); + + QUnit.test('Sms widgets with empty initial value', async function (assert) { + assert.expect(1); + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: `
`, + res_id: 1, + res_ids: [1], + }); + + assert.strictEqual(form.$('.o_field_text').text(), '', + 'Should have the empty initial value'); + + form.destroy(); + }); + + QUnit.module('PhoneWidget'); + + QUnit.test('phone field in editable list view on normal screens', async function (assert) { + assert.expect(11); + var doActionCount = 0; + + var list = await createView({ + View: ListView, + model: 'partner', + data: this.data, + debug:true, + arch: '', + intercepts: { + do_action(ev) { + assert.equal(ev.data.action.res_model, 'sms.composer', + 'The action to send an SMS should have been executed'); + doActionCount += 1; + } + } + }); + + assert.containsN(list, 'tbody td:not(.o_list_record_selector)', 4); + assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'yopSMS', + "value should be displayed properly with a link to send SMS"); + + assert.containsN(list, 'a.o_field_widget.o_form_uri', 2, + "should have the correct classnames"); + + // Edit a line and check the result + var $cell = list.$('tbody td:not(.o_list_record_selector)').first(); + await testUtils.dom.click($cell); + assert.hasClass($cell.parent(),'o_selected_row', 'should be set as edit mode'); + assert.strictEqual($cell.find('input').val(), 'yop', + 'should have the corect value in internal input'); + await testUtils.fields.editInput($cell.find('input'), 'new'); + + // save + await testUtils.dom.click(list.$buttons.find('.o_list_button_save')); + $cell = list.$('tbody td:not(.o_list_record_selector)').first(); + assert.doesNotHaveClass($cell.parent(), 'o_selected_row', 'should not be in edit mode anymore'); + assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'newSMS', + "value should be properly updated"); + assert.containsN(list, 'a.o_field_widget.o_form_uri', 2, + "should still have links with correct classes"); + + await testUtils.dom.click(list.$('tbody td:not(.o_list_record_selector) .o_field_phone_sms').first()); + assert.equal(doActionCount, 1, 'Only one action should have been executed'); + assert.containsNone(list, '.o_selected_row', + 'None of the list element should have been activated'); + + list.destroy(); + }); + + QUnit.test('readonly sms phone field is properly rerendered after been changed by onchange', async function (assert) { + assert.expect(4); + + const NEW_PHONE = '+32595555555'; + + const form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + // onchange to update mobile in readonly mode directly + '' + // readonly only, we don't want to go through write mode + '' + + '' + + '
', + res_id: 1, + viewOptions: {mode: 'edit'}, + mockRPC: function (route, args) { + if (args.method === 'onchange') { + return Promise.resolve({ + value: { + mobile: NEW_PHONE, // onchange to update mobile in readonly mode directly + }, + }); + } + return this._super.apply(this, arguments); + }, + }); + // check initial rendering + assert.strictEqual(form.$('.o_field_phone').text(), "+32494444444", + 'Initial Phone text should be set'); + assert.strictEqual(form.$('.o_field_phone_sms').text(), 'SMS', + 'SMS button label should be rendered'); + + // trigger the onchange to update phone field, but still in readonly mode + await testUtils.fields.editInput($('input[name="foo"]'), 'someOtherFoo'); + + // check rendering after changes + assert.strictEqual(form.$('.o_field_phone').text(), NEW_PHONE, + 'Phone text should be updated'); + assert.strictEqual(form.$('.o_field_phone_sms').text(), 'SMS', + 'SMS button label should not be changed'); + + form.destroy(); + }); +}); +}); diff --git a/addons/sms/tests/__init__.py b/addons/sms/tests/__init__.py new file mode 100644 index 00000000..609586be --- /dev/null +++ b/addons/sms/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import common +from . import test_sms_template diff --git a/addons/sms/tests/common.py b/addons/sms/tests/common.py new file mode 100644 index 00000000..03b31dd8 --- /dev/null +++ b/addons/sms/tests/common.py @@ -0,0 +1,277 @@ +# -*- coding: utf-8 -*- + +from contextlib import contextmanager +from unittest.mock import patch + +from odoo import exceptions, tools +from odoo.tests import common +from odoo.addons.mail.tests.common import MailCommon +from odoo.addons.phone_validation.tools import phone_validation +from odoo.addons.sms.models.sms_api import SmsApi +from odoo.addons.sms.models.sms_sms import SmsSms + + +class MockSMS(common.BaseCase): + + def tearDown(self): + super(MockSMS, self).tearDown() + self._clear_sms_sent() + + @contextmanager + def mockSMSGateway(self, sms_allow_unlink=False, sim_error=None, nbr_t_error=None): + self._clear_sms_sent() + sms_create_origin = SmsSms.create + sms_unlink_origin = SmsSms.unlink + + def _contact_iap(local_endpoint, params): + # mock single sms sending + if local_endpoint == '/iap/message_send': + self._sms += [{ + 'number': number, + 'body': params['message'], + } for number in params['numbers']] + return True # send_message v0 API returns always True + # mock batch sending + if local_endpoint == '/iap/sms/2/send': + result = [] + for to_send in params['messages']: + res = {'res_id': to_send['res_id'], 'state': 'success', 'credit': 1} + error = sim_error or (nbr_t_error and nbr_t_error.get(to_send['number'])) + if error and error == 'credit': + res.update(credit=0, state='insufficient_credit') + elif error and error == 'wrong_number_format': + res.update(state='wrong_number_format') + elif error and error == 'unregistered': + res.update(state='unregistered') + elif error and error == 'jsonrpc_exception': + raise exceptions.AccessError( + 'The url that this service requested returned an error. Please contact the author of the app. The url it tried to contact was ' + local_endpoint + ) + result.append(res) + if res['state'] == 'success': + self._sms.append({ + 'number': to_send['number'], + 'body': to_send['content'], + }) + return result + + def _sms_sms_create(model, *args, **kwargs): + res = sms_create_origin(model, *args, **kwargs) + self._new_sms += res.sudo() + return res + + def _sms_sms_unlink(records, *args, **kwargs): + if sms_allow_unlink: + return sms_unlink_origin(records, *args, **kwargs) + # hack: instead of unlink, update state to sent for tests + else: + records.filtered(lambda sms: sms.id in self._new_sms.ids).state = 'sent' + return True + + try: + with patch.object(SmsApi, '_contact_iap', side_effect=_contact_iap), \ + patch.object(SmsSms, 'create', autospec=True, wraps=SmsSms, side_effect=_sms_sms_create), \ + patch.object(SmsSms, 'unlink', autospec=True, wraps=SmsSms, side_effect=_sms_sms_unlink): + yield + finally: + pass + + def _clear_sms_sent(self): + self._sms = [] + self._new_sms = self.env['sms.sms'].sudo() + + def _clear_outoing_sms(self): + """ As SMS gateway mock keeps SMS, we may need to remove them manually + if there are several tests in the same tx. """ + self.env['sms.sms'].sudo().search([('state', '=', 'outgoing')]).unlink() + + +class SMSCase(MockSMS): + """ Main test class to use when testing SMS integrations. Contains helpers and tools related + to notification sent by SMS. """ + + def _find_sms_sent(self, partner, number): + if number is None and partner: + number = partner.phone_get_sanitized_number() + sent_sms = next((sms for sms in self._sms if sms['number'] == number), None) + if not sent_sms: + raise AssertionError('sent sms not found for %s (number: %s)' % (partner, number)) + return sent_sms + + def _find_sms_sms(self, partner, number, status): + if number is None and partner: + number = partner.phone_get_sanitized_number() + domain = [('id', 'in', self._new_sms.ids), + ('partner_id', '=', partner.id), + ('number', '=', number)] + if status: + domain += [('state', '=', status)] + + sms = self.env['sms.sms'].sudo().search(domain) + if not sms: + raise AssertionError('sms.sms not found for %s (number: %s / status %s)' % (partner, number, status)) + if len(sms) > 1: + raise NotImplementedError() + return sms + + def assertNoSMS(self): + """ Check no sms went through gateway during mock. """ + self.assertTrue(len(self._new_sms) == 0) + + def assertSMSIapSent(self, numbers, content=None): + """ Check sent SMS. Order is not checked. Each number should have received + the same content. Useful to check batch sending. + + :param numbers: list of numbers; + :param content: content to check for each number; + """ + for number in numbers: + sent_sms = next((sms for sms in self._sms if sms['number'] == number), None) + self.assertTrue(bool(sent_sms), 'Number %s not found in %s' % (number, repr([s['number'] for s in self._sms]))) + if content is not None: + self.assertIn(content, sent_sms['body']) + + def assertSMSSent(self, numbers, content=None): + """ Deprecated. Remove in 14.4 """ + return self.assertSMSIapSent(numbers, content=content) + + def assertSMS(self, partner, number, status, error_code=None, + content=None, fields_values=None): + """ Find a ``sms.sms`` record, based on given partner, number and status. + + :param partner: optional partner, used to find a ``sms.sms`` and a number + if not given; + :param number: optional number, used to find a ``sms.sms``, notably if + partner is not given; + :param error_code: check error code if SMS is not sent or outgoing; + :param content: if given, should be contained in sms body; + :param fields_values: optional values allowing to check directly some + values on ``sms.sms`` record; + """ + sms_sms = self._find_sms_sms(partner, number, status) + if error_code: + self.assertEqual(sms_sms.error_code, error_code) + if content is not None: + self.assertIn(content, sms_sms.body) + for fname, fvalue in (fields_values or {}).items(): + self.assertEqual( + sms_sms[fname], fvalue, + 'SMS: expected %s for %s, got %s' % (fvalue, fname, sms_sms[fname])) + if status == 'sent': + self.assertSMSIapSent([sms_sms.number], content=content) + + def assertSMSCanceled(self, partner, number, error_code, content=None, fields_values=None): + """ Check canceled SMS. Search is done for a pair partner / number where + partner can be an empty recordset. """ + self.assertSMS(partner, number, 'canceled', error_code=error_code, content=content, fields_values=fields_values) + + def assertSMSFailed(self, partner, number, error_code, content=None, fields_values=None): + """ Check failed SMS. Search is done for a pair partner / number where + partner can be an empty recordset. """ + self.assertSMS(partner, number, 'error', error_code=error_code, content=content, fields_values=fields_values) + + def assertSMSOutgoing(self, partner, number, content=None, fields_values=None): + """ Check outgoing SMS. Search is done for a pair partner / number where + partner can be an empty recordset. """ + self.assertSMS(partner, number, 'outgoing', content=content, fields_values=fields_values) + + def assertNoSMSNotification(self, messages=None): + base_domain = [('notification_type', '=', 'sms')] + if messages is not None: + base_domain += [('mail_message_id', 'in', messages.ids)] + self.assertEqual(self.env['mail.notification'].search(base_domain), self.env['mail.notification']) + self.assertEqual(self._sms, []) + + def assertSMSNotification(self, recipients_info, content, messages=None, check_sms=True, sent_unlink=False): + """ Check content of notifications. + + :param recipients_info: list[{ + 'partner': res.partner record (may be empty), + 'number': number used for notification (may be empty, computed based on partner), + 'state': ready / sent / exception / canceled (sent by default), + 'failure_type': optional: sms_number_missing / sms_number_format / sms_credit / sms_server + }, { ... }] + """ + partners = self.env['res.partner'].concat(*list(p['partner'] for p in recipients_info if p.get('partner'))) + numbers = [p['number'] for p in recipients_info if p.get('number')] + # special case of void notifications: check for False / False notifications + if not partners and not numbers: + numbers = [False] + base_domain = [ + '|', ('res_partner_id', 'in', partners.ids), + '&', ('res_partner_id', '=', False), ('sms_number', 'in', numbers), + ('notification_type', '=', 'sms') + ] + if messages is not None: + base_domain += [('mail_message_id', 'in', messages.ids)] + notifications = self.env['mail.notification'].search(base_domain) + + self.assertEqual(notifications.mapped('res_partner_id'), partners) + + for recipient_info in recipients_info: + partner = recipient_info.get('partner', self.env['res.partner']) + number = recipient_info.get('number') + state = recipient_info.get('state', 'sent') + if number is None and partner: + number = partner.phone_get_sanitized_number() + + notif = notifications.filtered(lambda n: n.res_partner_id == partner and n.sms_number == number and n.notification_status == state) + self.assertTrue(notif, 'SMS: not found notification for %s (number: %s, state: %s)' % (partner, number, state)) + + if state not in ('sent', 'ready', 'canceled'): + self.assertEqual(notif.failure_type, recipient_info['failure_type']) + if check_sms: + if state == 'sent': + if sent_unlink: + self.assertSMSIapSent([number], content=content) + else: + self.assertSMS(partner, number, 'sent', content=content) + elif state == 'ready': + self.assertSMS(partner, number, 'outgoing', content=content) + elif state == 'exception': + self.assertSMS(partner, number, 'error', error_code=recipient_info['failure_type'], content=content) + elif state == 'canceled': + self.assertSMS(partner, number, 'canceled', error_code=recipient_info['failure_type'], content=content) + else: + raise NotImplementedError('Not implemented') + + if messages is not None: + for message in messages: + self.assertEqual(content, tools.html2plaintext(message.body).rstrip('\n')) + + def assertSMSLogged(self, records, body): + for record in records: + message = record.message_ids[-1] + self.assertEqual(message.subtype_id, self.env.ref('mail.mt_note')) + self.assertEqual(message.message_type, 'sms') + self.assertEqual(tools.html2plaintext(message.body).rstrip('\n'), body) + + +class SMSCommon(MailCommon, MockSMS): + + @classmethod + def setUpClass(cls): + super(SMSCommon, cls).setUpClass() + cls.user_employee.write({'login': 'employee'}) + + # update country to belgium in order to test sanitization of numbers + cls.user_employee.company_id.write({'country_id': cls.env.ref('base.be').id}) + + # some numbers for testing + cls.random_numbers_str = '+32456998877, 0456665544' + cls.random_numbers = cls.random_numbers_str.split(', ') + cls.random_numbers_san = [phone_validation.phone_format(number, 'BE', '32', force_format='E164') for number in cls.random_numbers] + cls.test_numbers = ['+32456010203', '0456 04 05 06', '0032456070809'] + cls.test_numbers_san = [phone_validation.phone_format(number, 'BE', '32', force_format='E164') for number in cls.test_numbers] + + # some numbers for mass testing + cls.mass_numbers = ['04561%s2%s3%s' % (x, x, x) for x in range(0, 10)] + cls.mass_numbers_san = [phone_validation.phone_format(number, 'BE', '32', force_format='E164') for number in cls.mass_numbers] + + @classmethod + def _create_sms_template(cls, model, body=False): + return cls.env['sms.template'].create({ + 'name': 'Test Template', + 'model_id': cls.env['ir.model']._get(model).id, + 'body': body if body else 'Dear ${object.display_name} this is an SMS.' + }) diff --git a/addons/sms/tests/test_sms_template.py b/addons/sms/tests/test_sms_template.py new file mode 100644 index 00000000..9483ecaf --- /dev/null +++ b/addons/sms/tests/test_sms_template.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests.common import SavepointCase, users +from odoo.addons.mail.tests.common import mail_new_test_user +from odoo.exceptions import AccessError +from odoo.tests import tagged +from odoo.tools import mute_logger + + +@tagged('post_install') +class TestSmsTemplateAccessRights(SavepointCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_admin = mail_new_test_user(cls.env, login='user_system', groups='base.group_system') + cls.basic_user = mail_new_test_user(cls.env, login='user_employee', groups='base.group_user') + sms_enabled_models = cls.env['ir.model'].search([('is_mail_thread', '=', True), ('transient', '=', False)]) + vals = [] + for model in sms_enabled_models: + vals.append({ + 'name': 'SMS Template ' + model.name, + 'body': 'Body Test', + 'model_id': model.id, + }) + cls.sms_templates = cls.env['sms.template'].create(vals) + + @users('user_employee') + @mute_logger('odoo.models.unlink') + def test_access_rights_user(self): + # Check if a member of group_user can only read on sms.template + for sms_template in self.env['sms.template'].browse(self.sms_templates.ids): + self.assertTrue(bool(sms_template.name)) + with self.assertRaises(AccessError): + sms_template.write({'name': 'Update Template'}) + with self.assertRaises(AccessError): + self.env['sms.template'].create({ + 'name': 'New SMS Template ' + sms_template.model_id.name, + 'body': 'Body Test', + 'model_id': sms_template.model_id.id, + }) + with self.assertRaises(AccessError): + sms_template.unlink() + + @users('user_system') + @mute_logger('odoo.models.unlink', 'odoo.addons.base.models.ir_model') + def test_access_rights_system(self): + admin = self.env.ref('base.user_admin') + for sms_template in self.env['sms.template'].browse(self.sms_templates.ids): + self.assertTrue(bool(sms_template.name)) + sms_template.write({'body': 'New body from admin'}) + self.env['sms.template'].create({ + 'name': 'New SMS Template ' + sms_template.model_id.name, + 'body': 'Body Test', + 'model_id': sms_template.model_id.id, + }) + + # check admin is allowed to read all templates since he can be a member of + # other groups applying restrictions based on the model + self.assertTrue(bool(self.env['sms.template'].with_user(admin).browse(sms_template.ids).name)) + + sms_template.unlink() diff --git a/addons/sms/views/assets.xml b/addons/sms/views/assets.xml new file mode 100644 index 00000000..aa255324 --- /dev/null +++ b/addons/sms/views/assets.xml @@ -0,0 +1,28 @@ + + + +