diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-07-26 15:12:29 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-07-26 15:12:29 +0200 |
| commit | bfd34e14b1be97465e135d85c76b9e626a219e7a (patch) | |
| tree | 8de54ec8f504158e965ab92e21658cab539024ee /addons | |
| parent | 26b5b446b3dab3d66b7db054ca77e7b1a811c28a (diff) | |
| parent | 40e8b67179f212551a176d72b3851671febc1fba (diff) | |
[MERGE] forward port branch saas-12.3 up to 40e8b67179f
Diffstat (limited to 'addons')
231 files changed, 3041 insertions, 1307 deletions
diff --git a/addons/account/i18n/cs.po b/addons/account/i18n/cs.po index 61a1987d143..1de6c201372 100644 --- a/addons/account/i18n/cs.po +++ b/addons/account/i18n/cs.po @@ -2658,7 +2658,7 @@ msgstr "Šablona grafu" #. module: account #: model:ir.actions.act_window,name:account.open_account_charts_modules msgid "Chart Templates" -msgstr "" +msgstr "Šablony grafů" #. module: account #: code:addons/account/models/company.py:320 @@ -4476,7 +4476,7 @@ msgstr "Filtr..." #: model:ir.model.fields,field_description:account.field_account_analytic_line__general_account_id #: model_terms:ir.ui.view,arch_db:account.view_account_analytic_line_filter_inherit_account msgid "Financial Account" -msgstr "" +msgstr "Finanční účetnictví" #. module: account #: model_terms:ir.ui.view,arch_db:account.view_partner_property_form @@ -4577,7 +4577,7 @@ msgstr "Pevná částka" #. module: account #: model:account.account.type,name:account.data_account_type_fixed_assets msgid "Fixed Assets" -msgstr "" +msgstr "Dlouhodobý majetek" #. module: account #: model:ir.model.fields,help:account.field_account_reconcile_model__amount @@ -4861,7 +4861,7 @@ msgstr "" #. module: account #: model:ir.model.fields,field_description:account.field_account_payment__has_invoices msgid "Has Invoices" -msgstr "" +msgstr "Má faktury" #. module: account #: model:ir.model.fields,field_description:account.field_account_invoice__has_outstanding @@ -4871,7 +4871,7 @@ msgstr "" #. module: account #: model:ir.model.fields,field_description:account.field_res_partner__has_unreconciled_entries msgid "Has Unreconciled Entries" -msgstr "" +msgstr "Má nespárované položky" #. module: account #: model:ir.model.fields,field_description:account.field_account_setup_bank_manual_config__qr_code_valid @@ -4909,7 +4909,7 @@ msgstr "" #. module: account #: model_terms:ir.ui.view,arch_db:account.res_config_settings_view_form msgid "How total tax amount is computed in orders and invoices" -msgstr "" +msgstr "Jak se vypočítává celková částka daně v objednávkách a fakturách" #. module: account #: model:ir.model.fields,field_description:account.field_account_abstract_payment__id @@ -6426,6 +6426,9 @@ msgid "" "Electronic: Get paid automatically through a payment acquirer by requesting a transaction on a card saved by the customer when buying or subscribing online (payment token).\n" "Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo,you are suggested to reconcile the transaction with the batch deposit. Enable this option from the settings." msgstr "" +"Ruční: Zaplaťte v hotovosti, šekem nebo jinou metodou mimo Odoo.\n" +"Elektronické: Platba automaticky probíhá prostřednictvím příjemce plateb žádostí o transakci na kartě uloženou zákazníkem při nákupu nebo objednání online (platební token).\n" +"Dávkový vklad: Zapíše několik zákaznických šeků najednou vygenerováním dávkového vkladu, který odešle do banky. Při kódování výpisu z banky v Odoo vám doporučujeme transakci spárovat s vkladem dávky. Aktivujte tuto možnost z nastavení." #. module: account #: model:ir.model.fields,help:account.field_account_abstract_payment__payment_method_id @@ -6670,7 +6673,7 @@ msgstr "" #. module: account #: selection:account.cash.rounding,strategy:0 msgid "Modify tax amount" -msgstr "" +msgstr "Změnit výši daně" #. module: account #: selection:account.invoice.refund,filter_refund:0 @@ -7108,7 +7111,7 @@ msgstr "" #: code:addons/account/models/chart_template.py:185 #, python-format msgid "Only administrators can load a charf of accounts" -msgstr "" +msgstr "Pouze správci mohou načíst graf účtů" #. module: account #: model:ir.model.fields,help:account.field_res_company__period_lock_date @@ -7562,7 +7565,7 @@ msgstr "Způsob platby" #: model_terms:ir.ui.view,arch_db:account.view_account_bank_journal_form #: model_terms:ir.ui.view,arch_db:account.view_account_journal_form msgid "Payment Method Types" -msgstr "" +msgstr "Druhy platebních metod" #. module: account #. openerp-web @@ -7968,7 +7971,7 @@ msgstr "" #. module: account #: model:ir.model.fields,field_description:account.field_res_company__invoice_is_print msgid "Print by default" -msgstr "" +msgstr "Tisk ve výchozím nastavení" #. module: account #: model_terms:ir.ui.view,arch_db:account.res_config_settings_view_form @@ -7995,7 +7998,7 @@ msgstr "Kategorie výrobku" #. module: account #: model:ir.model.fields,field_description:account.field_account_invoice_line__product_image msgid "Product Image" -msgstr "" +msgstr "Obrázek produktu" #. module: account #: model:ir.model.fields,field_description:account.field_account_invoice_report__product_qty @@ -9132,7 +9135,7 @@ msgstr "Zdrojový dokument" #. module: account #: model:ir.model.fields,field_description:account.field_account_invoice__source_email msgid "Source Email" -msgstr "" +msgstr "Zdrojový e-mail" #. module: account #: model:ir.model.fields,help:account.field_account_cash_rounding__strategy @@ -9473,7 +9476,7 @@ msgstr "" #: model:ir.model.fields,field_description:account.field_account_tax__tax_group_id #: model:ir.model.fields,field_description:account.field_account_tax_template__tax_group_id msgid "Tax Group" -msgstr "" +msgstr "Daňová skupina" #. module: account #. openerp-web @@ -10793,6 +10796,8 @@ msgid "" "Tracked values are stored in a separate model. This field allow to " "reconstruct the tracking and to generate statistics on the model." msgstr "" +"Sledované hodnoty jsou uloženy v samostatném modelu. Toto pole umožňuje " +"rekonstruovat sledování a generovat statistiky modelu." #. module: account #: model:ir.model.fields,field_description:account.field_account_invoice_send__tracking_value_ids @@ -10858,7 +10863,7 @@ msgstr "Typ" #. module: account #: selection:account.cash.rounding,rounding_method:0 msgid "UP" -msgstr "" +msgstr "NAHORU" #. module: account #: code:addons/account/models/account.py:398 @@ -11357,7 +11362,7 @@ msgstr "" #. module: account #: model:ir.model.fields,help:account.field_account_invoice_send__is_log msgid "Whether the message is an internal note (comment mode only)" -msgstr "" +msgstr "Zda je zpráva interní poznámkou (pouze režim poznámek)" #. module: account #: model:ir.model.fields,help:account.field_account_journal__show_on_dashboard @@ -11368,6 +11373,7 @@ msgstr "Zda se tento účetní deník zobrazuje na dashboardu nebo ne" #: model:ir.model.fields,help:account.field_account_setup_bank_manual_config__new_journal_name msgid "Will be used to name the Journal related to this bank account" msgstr "" +"Bude použito k pojmenování deníku týkajícího se tohoto bankovního účtu" #. module: account #: model:ir.model.fields,field_description:account.field_account_common_journal_report__amount_currency @@ -11743,6 +11749,9 @@ msgid "" " to manage automatically the booking of accounting entries related to " "differences between exchange rates." msgstr "" +"Měli byste v nastavení účetnictví nakonfigurovat „Deník pro směnný kurz“, " +"který bude automaticky spravovat zaúčtování účetních položek souvisejících s" +" rozdíly mezi směnnými kurzy." #. module: account #: code:addons/account/models/account_move.py:1626 @@ -11845,7 +11854,7 @@ msgstr "" #. module: account #: model_terms:ir.ui.view,arch_db:account.setup_bank_account_wizard msgid "e.g Checking account" -msgstr "" +msgstr "např. Kontrola účtu" #. module: account #: model_terms:ir.ui.view,arch_db:account.view_account_reconcile_model_form diff --git a/addons/account/i18n/it.po b/addons/account/i18n/it.po index c1e4efccfbb..d35d8a69859 100644 --- a/addons/account/i18n/it.po +++ b/addons/account/i18n/it.po @@ -7,7 +7,7 @@ # Alessandro Camilli <alessandrocamilli@openforce.it>, 2018 # Daniele Faraglia <daniele.faraglia@gmail.com>, 2018 # Davide Corio <enlightx@gmail.com>, 2018 -# Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>, 2018 +# SebastianoPistore <SebastianoPistore.info@protonmail.ch>, 2018 # Manuela Feliciani <mfeliciani@alice.it>, 2018 # Luigi Di Naro <gigidn@gmail.com>, 2018 # Marco Calcagni <mcalcagni@dinamicheaziendali.it>, 2018 @@ -8663,7 +8663,7 @@ msgstr "Modello documento collegato" #. module: account #: model:ir.model.fields,field_description:account.field_account_invoice_send__rating_ids msgid "Related ratings" -msgstr "" +msgstr "Valutazioni collegate" #. module: account #: model:ir.model.fields,help:account.field_account_invoice__residual_company_signed diff --git a/addons/account/i18n/ja.po b/addons/account/i18n/ja.po index 5d615f4f048..ed537005a33 100644 --- a/addons/account/i18n/ja.po +++ b/addons/account/i18n/ja.po @@ -328,6 +328,8 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:account.res_config_settings_view_form msgid "<span class=\"o_form_label\">Rounding Method</span>" msgstr "" +"<span class=\"o_form_label\">丸め方法</span>\n" +" <span class=\"fa fa-lg fa-building-o\" title=\"ここに設定する値は会社依存。\" aria-label=\"ここに設定する値は会社依存。\" groups=\"base.group_multi_company\" role=\"img\"/>" #. module: account #: model_terms:ir.ui.view,arch_db:account.view_payment_term_line_form @@ -3132,7 +3134,7 @@ msgstr "" #. module: account #: model_terms:ir.actions.act_window,help:account.action_invoice_tree1 msgid "Create a customer invoice" -msgstr "" +msgstr "顧客請求書を作成しましょう。" #. module: account #: selection:account.invoice.refund,filter_refund:0 diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py index 7d0a9e16926..4d04e31d86b 100644 --- a/addons/account/models/account_bank_statement.py +++ b/addons/account/models/account_bank_statement.py @@ -254,8 +254,6 @@ class AccountBankStatement(models.Model): @api.multi def button_journal_entries(self): - context = dict(self._context or {}) - context['journal_id'] = self.journal_id.id return { 'name': _('Journal Entries'), 'view_type': 'form', @@ -264,7 +262,9 @@ class AccountBankStatement(models.Model): 'view_id': False, 'type': 'ir.actions.act_window', 'domain': [('id', 'in', self.mapped('move_line_ids').mapped('move_id').ids)], - 'context': context, + 'context': { + 'journal_id': self.journal_id.id, + } } @api.multi diff --git a/addons/account/static/src/js/reconciliation/reconciliation_model.js b/addons/account/static/src/js/reconciliation/reconciliation_model.js index 2846e2d2e2f..985bcd15496 100644 --- a/addons/account/static/src/js/reconciliation/reconciliation_model.js +++ b/addons/account/static/src/js/reconciliation/reconciliation_model.js @@ -428,14 +428,7 @@ var StatementModel = BasicModel.extend({ if (self.context && self.context.active_model === 'account.journal' && self.context.active_ids) { domainReconcile.push(['journal_id', 'in', [false].concat(self.context.active_ids)]); } - var def_reconcileModel = this._rpc({ - model: 'account.reconcile.model', - method: 'search_read', - domain: domainReconcile, - }) - .then(function (reconcileModels) { - self.reconcileModels = reconcileModels; - }); + var def_reconcileModel = this._loadReconciliationModel({domainReconcile: domainReconcile}); var def_account = this._rpc({ model: 'account.account', method: 'search_read', @@ -455,7 +448,59 @@ var StatementModel = BasicModel.extend({ return self._formatLine(self.statement.lines); }); }, - + _readAnalyticTags: function (params) { + var self = this; + this.analyticTags = {}; + if (!params || !params.res_ids || !params.res_ids.length) { + return $.when(); + } + var fields = (params && params.fields || []).concat(['id', 'display_name']); + return this._rpc({ + model: 'account.analytic.tag', + method: 'read', + args: [ + params.res_ids, + fields, + ], + }).then(function (tags) { + for (var i=0; i<tags.length; i++) { + var tag = tags[i]; + self.analyticTags[tag.id] = tag; + } + }); + }, + _loadReconciliationModel: function (params) { + var self = this; + return this._rpc({ + model: 'account.reconcile.model', + method: 'search_read', + domain: params.domainReconcile || [], + }) + .then(function (reconcileModels) { + var analyticTagIds = []; + for (var i=0; i<reconcileModels.length; i++) { + var modelTags = reconcileModels[i].analytic_tag_ids || []; + for (var j=0; j<modelTags.length; j++) { + if (analyticTagIds.indexOf(modelTags[j]) === -1) { + analyticTagIds.push(modelTags[j]); + } + } + } + return self._readAnalyticTags({res_ids: analyticTagIds}).then(function () { + for (var i=0; i<reconcileModels.length; i++) { + var recModel = reconcileModels[i]; + var analyticTagData = []; + var modelTags = reconcileModels[i].analytic_tag_ids || []; + for (var j=0; j<modelTags.length; j++) { + var tagId = modelTags[j]; + analyticTagData.push([tagId, self.analyticTags[tagId].display_name]) + } + recModel.analytic_tag_ids = analyticTagData; + } + self.reconcileModels = reconcileModels; + }); + }); + }, _loadTaxes: function(){ var self = this; self.taxes = {}; @@ -984,7 +1029,7 @@ var StatementModel = BasicModel.extend({ _formatMany2ManyTags: function (value) { var res = []; for (var i=0, len=value.length; i<len; i++) { - res[i] = {data: {'id': value[i][0], 'display_name': value[i][1]}}; + res[i] = {'id': value[i][0], 'display_name': value[i][1]}; } return res; }, @@ -1345,15 +1390,7 @@ var ManualModel = StatementModel.extend({ if (company_ids) { domainReconcile.push(['company_id', 'in', company_ids]); } - var def_reconcileModel = this._rpc({ - model: 'account.reconcile.model', - method: 'search_read', - domain: domainReconcile, - }) - .then(function (reconcileModels) { - self.reconcileModels = reconcileModels; - }); - + var def_reconcileModel = this._loadReconciliationModel({domainReconcile: domainReconcile}); var def_taxes = this._loadTaxes(); return Promise.all([def_reconcileModel, def_account, def_taxes]).then(function () { diff --git a/addons/account/static/tests/reconciliation_tests.js b/addons/account/static/tests/reconciliation_tests.js index 5d8bb5dc490..4f83c10cc67 100644 --- a/addons/account/static/tests/reconciliation_tests.js +++ b/addons/account/static/tests/reconciliation_tests.js @@ -137,8 +137,14 @@ var db = { ] }, 'account.analytic.tag': { - fields: {}, - records: [] + fields: { + id: {string: 'id', type: 'integer'}, + display_name: {string: 'display_name', type: 'char'}, + }, + records: [ + {id: 1, display_name: 'Come together'}, + {id: 2, display_name: 'Right now'}, + ], }, 'account.bank.statement': { fields: {}, @@ -180,7 +186,8 @@ var db = { second_amount: {string: "Second Amount", type: 'float', digits:0, help:"Fixed amount will count as a debit if it is negative, as a credit if it is positive.", default:100.0}, second_tax_ids: {string: "Second Tax", type: 'many2many', relation: 'account.tax'}, second_analytic_account_id: {string: "Second Analytic Account", type: 'many2one', relation:'account.analytic.account'}, - match_journal_ids: {string: "Journal Ids", type: 'many2many', relation: 'account.journal'} + match_journal_ids: {string: "Journal Ids", type: 'many2many', relation: 'account.journal'}, + analytic_tag_ids: {string: 'Analytic tags', type: 'many2many', relation: 'account.analytic.tag'}, }, records: [ {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 4, 'analytic_account_id': false, 'display_name': "Int\u00e9rrets", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': false, 'journal_id': false, 'label': false, 'second_label': false, 'second_account_id': false, 'account_id': 282, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "fixed", 'name': "Int\u00e9rrets", 'amount': 0.0, 'second_amount': 100.0, 'match_journal_ids': []}, @@ -188,7 +195,7 @@ var db = { {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 5, 'analytic_account_id': false, 'display_name': "Fs bank", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': false, 'journal_id': false, 'label': false, 'second_label': false, 'second_account_id': false, 'account_id': 284, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Fs bank", 'amount': 100.0, 'second_amount': 100.0}, {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 8, 'analytic_account_id': false, 'display_name': "Caisse Sand.", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': false, 'journal_id': false, 'label': "Caisse Sand.", 'second_label': false, 'second_account_id': false, 'account_id': 308, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Caisse Sand.", 'amount': 100.0, 'second_amount': 100.0, 'match_journal_ids': []}, {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 3, 'analytic_account_id': false, 'display_name': "ATOS", 'rule_type': 'writeoff_button', 'second_tax_ids': [7], 'has_second_line': true, 'journal_id': false, 'label': "ATOS Banque", 'second_label': "ATOS Frais", 'second_account_id': 286, 'account_id': 285, 'company_id': [1, "Demo SPRL"], 'tax_ids': [6], 'amount_type': "percentage", 'name': "ATOS", 'amount': 97.5, 'second_amount': 2.5}, - {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 10, 'analytic_account_id': false, 'display_name': "Double", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': true, 'journal_id': false, 'label': "Double Banque", 'second_label': "Double Frais", 'second_account_id': 286, 'account_id': 285, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Double", 'amount': 97.5, 'second_amount': 2.5, 'match_journal_ids': []}, + {'second_analytic_account_id': false, 'second_amount_type': "percentage", 'second_journal_id': false, 'id': 10, 'analytic_account_id': false, 'display_name': "Double", 'rule_type': 'writeoff_button', 'second_tax_ids': [], 'has_second_line': true, 'journal_id': false, 'label': "Double Banque", 'second_label': "Double Frais", 'second_account_id': 286, 'account_id': 285, 'company_id': [1, "Demo SPRL"], 'tax_ids': [], 'amount_type': "percentage", 'name': "Double", 'amount': 97.5, 'second_amount': 2.5, 'match_journal_ids': [], 'analytic_tag_ids': [1,2]}, ] }, 'account.reconciliation.widget': { @@ -589,6 +596,7 @@ var ReconciliationRenderer = require('account.ReconciliationRenderer'); var demoData = require('account.reconciliation_tests.data'); var testUtils = require('web.test_utils'); +var testUtilsDom = require('web.test_utils_dom'); QUnit.module('account', { beforeEach: function () { @@ -1965,5 +1973,54 @@ QUnit.module('account', { clientAction.destroy(); }); + + QUnit.test('Reconciliation Models handle analytic tags', async function (assert) { + assert.expect(6); + + var clientAction = new ReconciliationClientAction.StatementAction(null, this.params.options); + testUtils.addMockEnvironment(clientAction, { + data: this.params.data, + mockRPC: function (route, args) { + if (args.method === 'process_bank_statement_line') { + var new_aml_dicts = args.args[1][0].new_aml_dicts; + assert.strictEqual(new_aml_dicts.length, 2); + // I personnally judge the following use case rotten, since + // the first and the second line wouldn't have the same tags + assert.deepEqual(new_aml_dicts[0].analytic_tag_ids, [[6, null, [1, 2]]]); + assert.deepEqual(new_aml_dicts[1].analytic_tag_ids, [[6, null, [2]]]); + } + return this._super(route, args); + }, + session: { + currencies: { + 3: { + digits: [69, 2], + position: "before", + symbol: "$" + } + } + }, + }); + + await clientAction.appendTo($('#qunit-fixture')); + + // The first reconciliation "line" is where it happens + var widget = clientAction.widgets[0]; + + await testUtilsDom.click(widget.$('.toggle_create')); + await testUtilsDom.click(widget.$('.quick_add button:contains("Double")')); + assert.containsN(widget, '.create_analytic_tag_ids .o_field_many2manytags .badge', 2, + 'Two tags are loaded'); + assert.containsOnce(widget, '.create_analytic_tag_ids .o_field_many2manytags .badge:contains("Come together")', + 'Tags should have a name'); + assert.containsOnce(widget, '.create_analytic_tag_ids .o_field_many2manytags .badge:contains("Right now")', + 'Tags should have a name'); + + await testUtilsDom.click(widget.$('.create_analytic_tag_ids .o_field_many2manytags .badge a.o_delete:first()')); + + await testUtilsDom.click(widget.$('.o_reconcile')); + + clientAction.destroy(); + }); }); }); diff --git a/addons/account/wizard/account_invoice_send.py b/addons/account/wizard/account_invoice_send.py index 812ed0ec297..18701888538 100644 --- a/addons/account/wizard/account_invoice_send.py +++ b/addons/account/wizard/account_invoice_send.py @@ -86,7 +86,22 @@ class AccountInvoiceSend(models.TransientModel): @api.multi def send_and_print_action(self): self.ensure_one() - self._send_email() + # Send the mails in the correct language by splitting the ids per lang. + # This should ideally be fixed in mail_compose_message, so when a fix is made there this whole commit should be reverted. + # basically self.body (which could be manually edited) extracts self.template_id, + # which is then not translated for each customer. + if self.composition_mode == 'mass_mail' and self.template_id: + active_ids = self.env.context.get('active_ids', self.res_id) + active_records = self.env[self.model].browse(active_ids) + langs = active_records.mapped('partner_id.lang') + default_lang = self.env.context.get('lang', 'en_US') + for lang in (set(langs) or [default_lang]): + active_ids_lang = active_records.filtered(lambda r: r.partner_id.lang == lang).ids + self_lang = self.with_context(active_ids=active_ids_lang, lang=lang) + self_lang.onchange_template_id() + self_lang._send_email() + else: + self._send_email() if self.is_print: return self._print_document() return {'type': 'ir.actions.act_window_close'} diff --git a/addons/account/wizard/account_invoice_send_views.xml b/addons/account/wizard/account_invoice_send_views.xml index 79378ed9a7a..79aed600eaf 100644 --- a/addons/account/wizard/account_invoice_send_views.xml +++ b/addons/account/wizard/account_invoice_send_views.xml @@ -14,6 +14,7 @@ <field name="invoice_ids" invisible="1"/> <field name="email_from" invisible="1" /> <field name="mail_server_id" invisible="1"/> + <field name="reply_to" invisible="1"/> <div name="option_print"> <field name="is_print" /> <b><label for="is_print"/></b> diff --git a/addons/account_bank_statement_import/i18n/cs.po b/addons/account_bank_statement_import/i18n/cs.po index 7c937e76dfe..bb8bbe76699 100644 --- a/addons/account_bank_statement_import/i18n/cs.po +++ b/addons/account_bank_statement_import/i18n/cs.po @@ -435,6 +435,9 @@ msgid "" "Electronic: Get paid automatically through a payment acquirer by requesting a transaction on a card saved by the customer when buying or subscribing online (payment token).\n" "Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo,you are suggested to reconcile the transaction with the batch deposit. Enable this option from the settings." msgstr "" +"Ruční: Zaplaťte v hotovosti, šekem nebo jinou metodou mimo Odoo.\n" +"Elektronické: Platba automaticky probíhá prostřednictvím příjemce plateb žádostí o transakci na kartě uloženou zákazníkem při nákupu nebo objednání online (platební token).\n" +"Dávkový vklad: Zapíše několik zákaznických šeků najednou vygenerováním dávkového vkladu, který odešle do banky. Při kódování výpisu z banky v Odoo vám doporučujeme transakci spárovat s vkladem dávky. Aktivujte tuto možnost z nastavení." #. module: account_bank_statement_import #: model:ir.model.fields,help:account_bank_statement_import.field_account_bank_statement_import_journal_creation__outbound_payment_method_ids diff --git a/addons/account_payment/views/account_portal_templates.xml b/addons/account_payment/views/account_portal_templates.xml index 53c126e1bfc..9bb739202bd 100644 --- a/addons/account_payment/views/account_portal_templates.xml +++ b/addons/account_payment/views/account_portal_templates.xml @@ -48,7 +48,7 @@ <div t-if="pms or acquirers" id="payment_method" class="text-left col-md-13"> <t t-call="payment.payment_tokens_list"> <t t-set="mode" t-value="'payment'"/> - <t t-set="partner_id" t-value="request.env.user.partner_id.id"/> + <t t-set="partner_id" t-value="invoice.partner_id.id if request.env.user._is_public() else request.env.user.partner_id.id"/> <t t-set="success_url" t-value="invoice.get_portal_url()"/> <t t-set="error_url" t-value="invoice.get_portal_url()"/> <t t-set="access_token" t-value="access_token or ''"/> diff --git a/addons/base_vat/models/res_partner.py b/addons/base_vat/models/res_partner.py index c747452526f..44b039a06f8 100644 --- a/addons/base_vat/models/res_partner.py +++ b/addons/base_vat/models/res_partner.py @@ -150,7 +150,7 @@ class ResPartner(models.Model): vat = country_code + vat return vat - @api.constrains('vat') + @api.constrains('vat', 'country_id') def check_vat(self): if self.env.context.get('company_id'): company = self.env['res.company'].browse(self.env.context['company_id']) diff --git a/addons/board/i18n/ar.po b/addons/board/i18n/ar.po index 8935ee83f2a..04b6de7f0f6 100644 --- a/addons/board/i18n/ar.po +++ b/addons/board/i18n/ar.po @@ -5,7 +5,6 @@ # Translators: # Mustafa Rawi <mustafa@cubexco.com>, 2018 # Martin Trigaux, 2018 -# Osoul <baruni@osoul.ly>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Zuhair Hammadi <zuhair12@gmail.com>, 2018 # Abdulmajeed Alomar <majeeed87@gmail.com>, 2018 @@ -31,6 +30,8 @@ msgid "" "\"Add to\n" " Dashboard\"" msgstr "" +"\"إضافة إلى\n" +" لوحة المعلومات\"" #. module: board #. openerp-web @@ -44,7 +45,7 @@ msgstr " " #: code:addons/board/static/src/js/favorite_menu.js:103 #, python-format msgid "'%s' added to dashboard" -msgstr "تم إضافة '%s' إلى اللوحة" +msgstr "تم إضافة '%s' للوحة المعلومات" #. module: board #. openerp-web @@ -80,21 +81,21 @@ msgstr "لوحة" #: code:addons/board/static/src/xml/board.xml:7 #, python-format msgid "Change Layout" -msgstr "تغيير النسق" +msgstr "تغيير المخطط" #. module: board #. openerp-web #: code:addons/board/static/src/xml/board.xml:5 #, python-format msgid "Change Layout.." -msgstr "تغيير النسق..." +msgstr "تغيير المخطط..." #. module: board #. openerp-web #: code:addons/board/static/src/xml/board.xml:36 #, python-format msgid "Choose dashboard layout" -msgstr "اختيار تصميم لوحة المعلومات" +msgstr "اختيار مخطط لوحة المعلومات" #. module: board #. openerp-web @@ -106,14 +107,14 @@ msgstr "لم يمكن إضافة الفلتر إلى لوحة المعلومات #. module: board #: model:ir.model.fields,field_description:board.field_board_board__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: board #. openerp-web #: code:addons/board/static/src/js/board_view.js:80 #, python-format msgid "Edit Layout" -msgstr "تعديل التنسق" +msgstr "تحرير المخطط" #. module: board #: model:ir.model.fields,field_description:board.field_board_board__id @@ -147,7 +148,7 @@ msgstr "لوحة معلوماتي" #: code:addons/board/static/src/js/favorite_menu.js:104 #, python-format msgid "Please refresh your browser for the changes to take effect." -msgstr "الرجاء تحديث المتصفح الخاص بك حتى تصبح التغييرات سارية المفعول." +msgstr "الرجاء تحديث متصفحك حتى تصبح التغييرات سارية المفعول." #. module: board #. openerp-web @@ -157,6 +158,8 @@ msgid "" "To add your first report into this dashboard, go to any\n" " menu, switch to list or graph view, and click" msgstr "" +"لإضافة تقريرك الأول في لوحة المعلومات هذه، افتح أي\n" +" قائمة، انتقل لطريقة العرض بالقائمة أو بالرسم البياني، واضغط" #. module: board #. openerp-web @@ -166,17 +169,19 @@ msgid "" "You can filter and group data before inserting into the\n" " dashboard using the search options." msgstr "" +"يمكنك تصفية وتجميع البيانات قبل إدراجها في\n" +" لوحة معلوماتك باستخدام خيارات البحث." #. module: board #. openerp-web #: code:addons/board/static/src/xml/board.xml:49 #, python-format msgid "Your personal dashboard is empty" -msgstr "" +msgstr "لوحة معلوماتك فارغة" #. module: board #. openerp-web #: code:addons/board/static/src/xml/board.xml:53 #, python-format msgid "in the extended search options." -msgstr "" +msgstr "في خيارات البحث الممتد." diff --git a/addons/contacts/i18n/ar.po b/addons/contacts/i18n/ar.po index fba40b5358f..c1c86c5ad67 100644 --- a/addons/contacts/i18n/ar.po +++ b/addons/contacts/i18n/ar.po @@ -3,19 +3,19 @@ # * contacts # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 -# amrnegm <amrnegm.01@gmail.com>, 2018 # Martin Trigaux, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Abdulmajeed Alomar <majeeed87@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" -"PO-Revision-Date: 2018-09-18 09:49+0000\n" -"Last-Translator: Abdulmajeed Alomar <majeeed87@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:17+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -32,7 +32,7 @@ msgstr "الحسابات البنكية" #. module: contacts #: model:ir.ui.menu,name:contacts.menu_action_res_bank_form msgid "Banks" -msgstr "المصارف" +msgstr "البنوك" #. module: contacts #: model:ir.ui.menu,name:contacts.res_partner_menu_config @@ -42,7 +42,7 @@ msgstr "الإعدادات" #. module: contacts #: model:ir.ui.menu,name:contacts.menu_partner_category_form msgid "Contact Tags" -msgstr "علامات الاتصال" +msgstr "وسوم جهة الاتصال" #. module: contacts #: model:ir.ui.menu,name:contacts.menu_partner_title_contact @@ -65,18 +65,18 @@ msgstr "الدول" #. module: contacts #: model:ir.ui.menu,name:contacts.menu_country_group msgid "Country Group" -msgstr "مجموعة الدولة" +msgstr "مجموعات الدول" #. module: contacts #: model_terms:ir.actions.act_window,help:contacts.action_contacts #: model_terms:ir.actions.act_window,help:contacts.action_contacts_summary msgid "Create a contact in your address book" -msgstr "" +msgstr "إنشاء جهة اتصال في دفتر العناوين" #. module: contacts #: model:ir.ui.menu,name:contacts.menu_country_state_partner msgid "Fed. States" -msgstr "Fed. States" +msgstr "الولايات الفيدرالية" #. module: contacts #: model:ir.ui.menu,name:contacts.menu_localisation @@ -87,7 +87,7 @@ msgstr "التوطين" #: model_terms:ir.actions.act_window,help:contacts.action_contacts #: model_terms:ir.actions.act_window,help:contacts.action_contacts_summary msgid "Odoo helps you to easily track all activities related to a customer." -msgstr "" +msgstr "يساعدك أودو على تتبع كل الأنشطة المتعلقة بالعملاء بسهولة." #. module: contacts #: model:ir.ui.menu,name:contacts.res_partner_industry_menu diff --git a/addons/crm/i18n/km.po b/addons/crm/i18n/km.po index 614e6a8fa21..a947ac6103d 100644 --- a/addons/crm/i18n/km.po +++ b/addons/crm/i18n/km.po @@ -1921,7 +1921,7 @@ msgstr "" #. module: crm #: model:ir.model,name:crm.model_crm_team msgid "Sales Channels" -msgstr "" +msgstr "លក់" #. module: crm #: model:ir.model.fields,field_description:crm.field_crm_activity_report__team_id @@ -1935,13 +1935,13 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:crm.crm_opportunity_report_view_search #: model_terms:ir.ui.view,arch_db:crm.view_crm_case_opportunities_filter msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: crm #: code:addons/crm/models/crm_lead.py:1125 #, python-format msgid "Sales Team Settings" -msgstr "" +msgstr "កំណត់ការលក់" #. module: crm #: model:ir.ui.menu,name:crm.crm_team_config @@ -1969,7 +1969,7 @@ msgstr "" #. module: crm #: model_terms:ir.ui.view,arch_db:crm.view_crm_case_leads_filter msgid "Search Leads" -msgstr "" +msgstr "ស្រាវជ្រាវ" #. module: crm #: model_terms:ir.ui.view,arch_db:crm.crm_lost_reason_view_search @@ -1980,7 +1980,7 @@ msgstr "" #. module: crm #: model_terms:ir.ui.view,arch_db:crm.merge_opportunity_form msgid "Select Leads/Opportunities" -msgstr "" +msgstr "ឧកាស" #. module: crm #: model:ir.actions.act_window,name:crm.action_lead_mass_mail @@ -2000,7 +2000,7 @@ msgstr "សេវាកម្ម" #. module: crm #: model_terms:ir.actions.act_window,help:crm.crm_stage_action msgid "Set a new stage in your opportunity pipeline" -msgstr "" +msgstr "ការកំណត់យុទ្ឋសាស្រ្តនៅក្នុងអាកាស" #. module: crm #: model:ir.model.fields,help:crm.field_crm_stage__on_change diff --git a/addons/crm/i18n/vi.po b/addons/crm/i18n/vi.po index 36b7529f560..2bcb4a54903 100644 --- a/addons/crm/i18n/vi.po +++ b/addons/crm/i18n/vi.po @@ -719,7 +719,7 @@ msgstr "Thiết kế" #. module: crm #: model:ir.model,name:crm.model_digest_digest msgid "Digest" -msgstr "" +msgstr "Tiêu" #. module: crm #: model_terms:ir.ui.view,arch_db:crm.view_create_opportunity_simplified diff --git a/addons/crm_iap_lead_website/models/crm_reveal_rule.py b/addons/crm_iap_lead_website/models/crm_reveal_rule.py index 3300b63f09b..b1d6fd23cfb 100644 --- a/addons/crm_iap_lead_website/models/crm_reveal_rule.py +++ b/addons/crm_iap_lead_website/models/crm_reveal_rule.py @@ -7,7 +7,7 @@ import logging import re from dateutil.relativedelta import relativedelta -from odoo import api, fields, models, tools, _ +from odoo import api, fields, models, tools, _, _geoip_resolver from odoo.addons.iap import jsonrpc from odoo.addons.crm.models import crm_stage from odoo.exceptions import ValidationError @@ -74,8 +74,17 @@ class CRMRevealRule(models.Model): raise ValidationError(_('Enter Valid Regex.')) @api.model + def _assert_geoip(self): + if not _geoip_resolver: + message = _('Lead Generation requires a GeoIP resolver which could not be found on your system. Please consult https://pypi.org/project/GeoIP/.') + self.env['bus.bus'].sendone( + (self._cr.dbname, 'res.partner', self.env.user.partner_id.id), + {'type': 'simple_notification', 'title': _('Missing Library'), 'message': message, 'sticky': True, 'warning': True}) + + @api.model def create(self, vals): self.clear_caches() # Clear the cache in order to recompute _get_active_rules + self._assert_geoip() return super(CRMRevealRule, self).create(vals) def write(self, vals): @@ -84,6 +93,7 @@ class CRMRevealRule(models.Model): } if set(vals.keys()) & fields_set: self.clear_caches() # Clear the cache in order to recompute _get_active_rules + self._assert_geoip() return super(CRMRevealRule, self).write(vals) def unlink(self): diff --git a/addons/decimal_precision/i18n/ar.po b/addons/decimal_precision/i18n/ar.po index 13a1976886e..53a43c537c6 100644 --- a/addons/decimal_precision/i18n/ar.po +++ b/addons/decimal_precision/i18n/ar.po @@ -3,19 +3,19 @@ # * decimal_precision # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # Martin Trigaux, 2018 -# Osoul <baruni@osoul.ly>, 2018 # Mohammed Albasha <m.albasha.ma@gmail.com>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Osama Ahmaro <osamaahmaro@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:17+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -51,18 +51,18 @@ msgstr "الدقة العشرية" #. module: decimal_precision #: model:ir.model,name:decimal_precision.model_decimal_precision_test msgid "Decimal Precision Test" -msgstr "" +msgstr "اختبار الدقة العشرية" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision__digits msgid "Digits" -msgstr "وحدات الأرقام" +msgstr "خانات الأرقام" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision__display_name #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision_test__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision_test__float @@ -72,12 +72,12 @@ msgstr "عشري" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision_test__float_2 msgid "Float 2" -msgstr "" +msgstr "رقم عشري 2" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision_test__float_4 msgid "Float 4" -msgstr "" +msgstr "رقم عشري 4" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision__id @@ -106,14 +106,14 @@ msgstr "آخر تحديث في" #. module: decimal_precision #: sql_constraint:decimal.precision:0 msgid "Only one value can be defined for each given usage!" -msgstr "يمكن لقيمة واحدة فقط ان تُعرّف لكل استخدام مُعطى!" +msgstr "يمكن تعريف قيمة واحدة فقط لكل استخدام مُعطى!" #. module: decimal_precision #: model:ir.model,name:decimal_precision.model_ir_qweb_field_float msgid "Qweb Field Float" -msgstr "" +msgstr "قيمة عشرية لحقل Qweb" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision__name msgid "Usage" -msgstr "إستخدام" +msgstr "استخدام" diff --git a/addons/decimal_precision/i18n/vi.po b/addons/decimal_precision/i18n/vi.po index 3ebc59a7004..c51fc3ecfd8 100644 --- a/addons/decimal_precision/i18n/vi.po +++ b/addons/decimal_precision/i18n/vi.po @@ -3,15 +3,16 @@ # * decimal_precision # # Translators: -# thanh nguyen <thanhnguyen.icsc@gmail.com>, 2018 # Martin Trigaux, 2018 +# Nancy Momoland <thanhnguyen.icsc@gmail.com>, 2019 +# 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" +"PO-Revision-Date: 2018-08-24 09:17+0000\n" +"Last-Translator: Nancy Momoland <thanhnguyen.icsc@gmail.com>, 2019\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" @@ -107,7 +108,7 @@ msgstr "Chỉ một giá trị duy nhất có thể được định nghĩa cho #. module: decimal_precision #: model:ir.model,name:decimal_precision.model_ir_qweb_field_float msgid "Qweb Field Float" -msgstr "" +msgstr "Qweb Field Float" #. module: decimal_precision #: model:ir.model.fields,field_description:decimal_precision.field_decimal_precision__name diff --git a/addons/delivery/__manifest__.py b/addons/delivery/__manifest__.py index 22cb78e9af5..684395775b2 100644 --- a/addons/delivery/__manifest__.py +++ b/addons/delivery/__manifest__.py @@ -30,6 +30,7 @@ invoices from picking, the system is able to add and compute the shipping line. 'views/res_config_settings_views.xml', 'wizard/choose_delivery_package_views.xml', 'wizard/choose_delivery_carrier_views.xml', + 'views/assets.xml', ], 'demo': ['data/delivery_demo.xml'], 'installable': True, diff --git a/addons/delivery/i18n/km.po b/addons/delivery/i18n/km.po index 6a8cf9fce12..b2bc7ad4140 100644 --- a/addons/delivery/i18n/km.po +++ b/addons/delivery/i18n/km.po @@ -549,7 +549,7 @@ msgstr "" #. module: delivery #: model:ir.model.fields,field_description:delivery.field_delivery_price_rule__operator msgid "Operator" -msgstr "" +msgstr "ប្រតិបត្តការណ៌" #. module: delivery #: model_terms:ir.ui.view,arch_db:delivery.choose_delivery_package_view_form diff --git a/addons/delivery/models/sale_order.py b/addons/delivery/models/sale_order.py index bf2e1f0cbee..4310985c54a 100644 --- a/addons/delivery/models/sale_order.py +++ b/addons/delivery/models/sale_order.py @@ -154,7 +154,7 @@ class SaleOrderLine(models.Model): def _compute_product_qty(self): for line in self: if not line.product_id or not line.product_uom or not line.product_uom_qty: - return 0.0 + continue line.product_qty = line.product_uom._compute_quantity(line.product_uom_qty, line.product_id.uom_id) @api.multi diff --git a/addons/delivery/static/src/js/delivery_translations.js b/addons/delivery/static/src/js/delivery_translations.js new file mode 100644 index 00000000000..565adbcb69f --- /dev/null +++ b/addons/delivery/static/src/js/delivery_translations.js @@ -0,0 +1,16 @@ +// TODO Remove me >=saas-12.5, this is a disgrace +// This is an hack to get the string_* and hover_* options translated on the +// boolean_button terminology widget. The terms are translated through +// _t(opt_terms.string_true) which will only work if the terms are already +// present in the translation map. +// This code does nothing but marks the strings as translatable +var _t = function(x) { return x; }; + +_t("Production Environment"); +_t("Switch to test environment"); +_t("Test Environment"); +_t("Switch to production environment"); +_t("Debug requests"); +_t("Disable debug"); +_t("No debug"); +_t("Enable debug"); diff --git a/addons/delivery/views/assets.xml b/addons/delivery/views/assets.xml new file mode 100644 index 00000000000..851aaca55c9 --- /dev/null +++ b/addons/delivery/views/assets.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + + <template id="assets_backend" name="delivery_assets_backend" inherit_id="web.assets_backend"> + <xpath expr="." position="inside"> + <script type="text/javascript" src="/delivery/static/src/js/delivery_translations.js"></script> + </xpath> + </template> + +</odoo> diff --git a/addons/digest/i18n/ar.po b/addons/digest/i18n/ar.po index b00d2a6647c..b720c2c87a7 100644 --- a/addons/digest/i18n/ar.po +++ b/addons/digest/i18n/ar.po @@ -12,7 +12,7 @@ # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 # Ali Alrehawi <alrehawi@hotmail.com>, 2018 -# Mustafa Rawi <mustafa@cubexco.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 # msgid "" msgstr "" @@ -20,7 +20,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-02 10:05+0000\n" "PO-Revision-Date: 2018-08-24 09:17+0000\n" -"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2018\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -186,7 +186,7 @@ msgstr "" #. module: digest #: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0 msgid "${', '.join(users.mapped('name'))} signed up. Say hello in the" -msgstr "" +msgstr "قام ${', '.join(users.mapped('name'))} بالاشتراك. رحب به في" #. module: digest #: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0 @@ -195,12 +195,15 @@ msgid "" " % set channel_id = object.env.ref('mail.channel_all_employees').id\n" " <strong style=\"font-size: 16px;\">Did you know...?</strong>" msgstr "" +"% set users = object.env['res.users'].search([], limit=10, order='id desc')\n" +" % set channel_id = object.env.ref('mail.channel_all_employees').id\n" +" <strong style=\"font-size: 16px;\">هل تعلم...؟</strong>" #. module: digest #: model_terms:digest.tip,tip_description:digest.digest_tip_mail_1 msgid "" "<strong style=\"font-size: 16px;\">Get things done with activities</strong>" -msgstr "" +msgstr "<strong style=\"font-size: 16px;\">أنجز مشروعاتك من خلال الأنشطة</strong>" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form @@ -216,16 +219,17 @@ msgstr "مفعل" #: model_terms:ir.ui.view,arch_db:digest.res_config_settings_view_form msgid "Add new users as recipient of a periodic email with key metrics" msgstr "" +"إدراج المستخدمين الجدد في قائمة استلام رسالة البريد الدورية بمقاييس رئيسية" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_tip__group_id msgid "Authorized Group" -msgstr "" +msgstr "المجموعة المعتمدة" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__available_fields msgid "Available Fields" -msgstr "" +msgstr "الحقول المتاحة" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__company_id @@ -240,12 +244,12 @@ msgstr "ضبط الإعدادات" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.res_config_settings_view_form msgid "Configure Digest Emails" -msgstr "" +msgstr "إعداد رسائل البريد التلخيصية" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__kpi_res_users_connected msgid "Connected Users" -msgstr "" +msgstr "المستخدمون المتصلون" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form @@ -253,6 +257,8 @@ msgid "" "Create or edit the mail template: you may get computed KPI's value using " "these fields:" msgstr "" +"إنشاء أو تحرير قالب رسالة البريد الإلكتروني: قد تحصل على قيمة المؤشر الرئيسي" +" المحسوبة باستخدام هذه الحقول:" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__create_uid @@ -274,12 +280,12 @@ msgstr "العملة" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "Deactivate for everyone" -msgstr "" +msgstr "تعطيل للجميع" #. module: digest #: selection:digest.digest,state:0 msgid "Deactivated" -msgstr "" +msgstr "معطل" #. module: digest #: model:ir.model,name:digest.model_digest_digest @@ -290,7 +296,7 @@ msgstr "الملخص" #: model:ir.model.fields,field_description:digest.field_res_config_settings__digest_id #: model_terms:ir.ui.view,arch_db:digest.res_config_settings_view_form msgid "Digest Email" -msgstr "" +msgstr "رسالة البريد التلخيصية" #. module: digest #: model:ir.actions.act_window,name:digest.digest_digest_action @@ -300,23 +306,23 @@ msgstr "" #: model:ir.model.fields,field_description:digest.field_res_config_settings__digest_emails #: model:ir.ui.menu,name:digest.digest_menu msgid "Digest Emails" -msgstr "" +msgstr "رسائل البريد التلخيصية" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.portal_digest_unsubscribed msgid "Digest Subscriptions" -msgstr "" +msgstr "اشتراكات الرسائل التلخيصية" #. module: digest #: model:ir.model,name:digest.model_digest_tip msgid "Digest Tips" -msgstr "" +msgstr "ملاحظات الملخص" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__display_name #: model:ir.model.fields,field_description:digest.field_digest_tip__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__template_id @@ -336,44 +342,44 @@ msgstr "تجميع حسب" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "How to customize your digest?" -msgstr "" +msgstr "كيف تعدل رسالتك التلخيصية؟" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__id #: model:ir.model.fields,field_description:digest.field_digest_tip__id msgid "ID" -msgstr "المعرف" +msgstr "المُعرف" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "In order to build your customized digest, follow these steps:" -msgstr "" +msgstr "اتبع هذه الخطوات لتكوين رسالتك التلخيصية المعدلة:" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__is_subscribed msgid "Is user subscribed" -msgstr "" +msgstr "هو مستخدم مشترك" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_tree msgid "KPI Digest" -msgstr "" +msgstr "ملخص مؤشرات الأداء" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "KPIs" -msgstr "" +msgstr "مؤشرات الأداء الرئيسية" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__kpi_mail_message_total_value msgid "Kpi Mail Message Total Value" -msgstr "" +msgstr "قيمة مؤشر الأداء لعدد الرسائل" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__kpi_res_users_connected_value msgid "Kpi Res Users Connected Value" -msgstr "" +msgstr "مؤشر الأداء لعدد المستخدمين المتصلين" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest____last_update @@ -401,7 +407,7 @@ msgstr "الرسائل" #. module: digest #: selection:digest.digest,periodicity:0 msgid "Monthly" -msgstr "شهريًا" +msgstr "شهرياً" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__name @@ -414,11 +420,13 @@ msgid "" "New users are automatically added as recipient of the following digest " "email." msgstr "" +"تلقائيًا، يتم إدراج المستخدمين الجدد في قائمة استلام الرسائل التلخيصية " +"التالية." #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__next_run_date msgid "Next Send Date" -msgstr "" +msgstr "تاريخ الإرسال التالي" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_digest__periodicity @@ -440,7 +448,7 @@ msgstr "المستلمون" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "Select your KPIs in the KPI's tab." -msgstr "" +msgstr "اختر مؤشراتك الرئيسية في تبويب المؤشر الرئيسي." #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form @@ -465,17 +473,17 @@ msgstr "اشتراك" #. module: digest #: model:ir.model.fields,field_description:digest.field_digest_tip__tip_description msgid "Tip description" -msgstr "" +msgstr "وصف تلميحي" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "Unsubscribe me" -msgstr "" +msgstr "إلغاء اشتراكي" #. module: digest #: model:ir.model.fields,help:digest.field_digest_tip__sequence msgid "Used to display digest tip in email template base on order" -msgstr "" +msgstr "تستخدم لعرض ملاحظة تلخيصية في قالب البريد حسب الطلب" #. module: digest #: model:ir.model,name:digest.model_res_users @@ -485,7 +493,7 @@ msgstr "المستخدمون" #. module: digest #: model:ir.model.fields,help:digest.field_digest_tip__user_ids msgid "Users having already received this tip" -msgstr "" +msgstr "المستخدمون الذين استلموا بالفعل هذه الملحوظة" #. module: digest #: selection:digest.digest,periodicity:0 @@ -495,7 +503,7 @@ msgstr "أسبوعيًا" #. module: digest #: model:digest.digest,name:digest.digest_digest_default msgid "Weekly Digest" -msgstr "" +msgstr "الملخص الأسبوعي" #. module: digest #: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0 @@ -503,6 +511,8 @@ msgid "" "You can ping colleagues by tagging them in your messages using \"@\". They " "will be instantly notified.<br>" msgstr "" +"يمكنك إشعار زملاءك من خلال الإشارة إليهم في رسالتك باستخدام علامة \"@\". " +"سيتم إخطارهم فورًا.<br>" #. module: digest #: model_terms:digest.tip,tip_description:digest.digest_tip_mail_1 @@ -510,21 +520,23 @@ msgid "" "You don't have any activity scheduled. Use activities on any business " "document to schedule meetings, calls and todos." msgstr "" +"ليس لديك نشاطات مجدولة. استخدم الأنشطة في أي مستند عمل لجدولة الاجتماعات " +"والمكالمات والإجراءات المطلوبة." #. module: digest #: model_terms:ir.ui.view,arch_db:digest.portal_digest_unsubscribed msgid "You have been successfully unsubscribed from" -msgstr "" +msgstr "ألغيت بنجاح اشتراكك من" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form msgid "You may want to add new computed fields with Odoo Studio:" -msgstr "" +msgstr "ربما تحتاج لإضافة حقول محسوبة جديدة باستديو أودو:" #. module: digest #: model_terms:digest.tip,tip_description:digest.digest_tip_mail_0 msgid "company's discussion channel." -msgstr "" +msgstr "قناة النقاش الخاصة بالمؤسسة." #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form @@ -533,6 +545,9 @@ msgid "" " <code>kpi_myfield</code>\n" " and display it in the KPI's tab;" msgstr "" +"قم أولًا بإنشاء حقل منطقي يُسمى\n" +" <code>kpi_myfield</code>\n" +" واعرضه في تبويب المؤشر الرئيسي؛" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form @@ -541,6 +556,9 @@ msgid "" " <code>kpi_myfield_value</code>\n" " that will compute your customized KPI." msgstr "" +"ثم أنشئ حقل محسوب يُسمى\n" +" <code>kpi_myfield_value</code>\n" +" ليحسب قيمة مؤشرك الرئيسي المعدلة." #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form @@ -549,3 +567,6 @@ msgid "" " <code>digest</code>\n" " object:" msgstr "" +"يجب إنشاء حقلين في\n" +" الكائن\n" +" التلخيصي:" diff --git a/addons/digest/i18n/km.po b/addons/digest/i18n/km.po index d0109d5f0ea..a3fb03aa077 100644 --- a/addons/digest/i18n/km.po +++ b/addons/digest/i18n/km.po @@ -427,7 +427,7 @@ msgstr "" #: model:ir.model.fields,field_description:digest.field_digest_digest__user_ids #: model:ir.model.fields,field_description:digest.field_digest_tip__user_ids msgid "Recipients" -msgstr "" +msgstr "អ្នកទទួល" #. module: digest #: model_terms:ir.ui.view,arch_db:digest.digest_digest_view_form diff --git a/addons/event/i18n/km.po b/addons/event/i18n/km.po index 10336cfe296..be514d025a8 100644 --- a/addons/event/i18n/km.po +++ b/addons/event/i18n/km.po @@ -1852,7 +1852,7 @@ msgstr "" #. module: event #: model_terms:ir.ui.view,arch_db:event.view_event_form msgid "Set To Draft" -msgstr "" +msgstr "កំណត់ជាសេចក្ដីព្រាង" #. module: event #: model_terms:ir.ui.view,arch_db:event.view_event_registration_form diff --git a/addons/event_sale/i18n/ar.po b/addons/event_sale/i18n/ar.po index 51f9d28ffb4..ca9aa94e231 100644 --- a/addons/event_sale/i18n/ar.po +++ b/addons/event_sale/i18n/ar.po @@ -37,7 +37,7 @@ msgstr "تطبيق" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_availability msgid "Available Seat" -msgstr "" +msgstr "المقاعد المتوفرة" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_available @@ -54,14 +54,14 @@ msgstr "قبل التأكيد" msgid "" "Choose an event and it will automatically create a registration for this " "event." -msgstr "اختر حدث وسيتم إنشاء تسجيل لهذا الحدث تلقائيا." +msgstr "اختر فعالية وسيتم إنشاء تسجيل لها تلقائيًا." #. module: event_sale #: model:ir.model.fields,help:event_sale.field_sale_order_line__event_ticket_id msgid "" "Choose an event ticket and it will automatically create a registration for " "this event ticket." -msgstr "اختر تذكرة حدث وسيتم إنشاء تسجيل لتذكرة هذا الحدث تلقائيا." +msgstr "اختر تذكرة فعالية وسيتم إنشاء تسجيل لها تلقائيًا." #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__create_uid @@ -84,23 +84,25 @@ msgid "" "you will not be able to sell tickets anymore. Set 0 to ignore this rule set " "as unlimited." msgstr "" +"حدد عدد التذاكر المتوفرة. في حال وجود عدد كبير من التسجيلات لن تتمكن من بيع " +"التذاكر. اجعل هذه القيمة 0 لتجاهل هذه القاعدة وتعيين عدد غير محدود للتذاكر." #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__display_name #: model:ir.model.fields,field_description:event_sale.field_registration_editor__display_name #: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: event_sale #: model:ir.model,name:event_sale.model_registration_editor msgid "Edit Attendee Details on Sales Confirmation" -msgstr "" +msgstr "تحرير بيانات الحاضر عند تأكيد عملية البيع" #. module: event_sale #: model:ir.model,name:event_sale.model_registration_editor_line msgid "Edit Attendee Line on Sales Confirmation" -msgstr "" +msgstr "تحرير بند الحاضر عند تأكيد عملية البيع" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__editor_id @@ -118,18 +120,18 @@ msgstr "البريد الإلكتروني" #: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__event_id #: model:ir.model.fields,field_description:event_sale.field_sale_order_line__event_id msgid "Event" -msgstr "الحدث" +msgstr "الفعالية" #. module: event_sale #: model:ir.model,name:event_sale.model_event_type #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__event_type_id msgid "Event Category" -msgstr "فئة الحدث" +msgstr "فئة الفعالية" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.event_ticket_form_view msgid "Event Name" -msgstr "اسم الحدث" +msgstr "اسم الفعالية" #. module: event_sale #: model:ir.model,name:event_sale.model_event_registration @@ -141,7 +143,7 @@ msgstr "تسجيل التنفيذ" #. module: event_sale #: model:ir.actions.act_window,name:event_sale.action_sale_order_event_registration msgid "Event Registrations" -msgstr "" +msgstr "تسجيلات الفعالية" #. module: event_sale #: model:ir.model,name:event_sale.model_event_event_ticket @@ -150,17 +152,17 @@ msgstr "" #: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__event_ticket_id #: model:ir.model.fields,field_description:event_sale.field_sale_order_line__event_ticket_id msgid "Event Ticket" -msgstr "تذكرة الحدث" +msgstr "تذكرة الفعالية" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_product_product__event_ticket_ids msgid "Event Tickets" -msgstr "تذاكر الحدث" +msgstr "تذاكر الفعالية" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.event_ticket_form_view msgid "Event's Ticket" -msgstr "" +msgstr "تذكرة الفعالية" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.event_sale_product_template_form @@ -172,7 +174,7 @@ msgstr "المناسبات" #: code:addons/event_sale/models/event.py:254 #, python-format msgid "Free" -msgstr "حرّ" +msgstr "مجاني" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__id @@ -188,6 +190,8 @@ msgid "" "If checked this product automatically creates an event registration at the " "sales order confirmation." msgstr "" +"إذا كان هذا الخيار محددًا، ينشئ هذا المنتج تسجيلًا تلقائيًا بالفعالية عند " +"تأكيد عملية البيع." #. module: event_sale #: model:ir.model,name:event_sale.model_account_invoice @@ -203,7 +207,7 @@ msgstr "هو منتهي" #: model:ir.model.fields,field_description:event_sale.field_product_template__event_ok #: model:ir.model.fields,field_description:event_sale.field_sale_order_line__event_ok msgid "Is an Event Ticket" -msgstr "" +msgstr "هي تذكرة فعالية" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket____last_update @@ -229,7 +233,7 @@ msgstr "آخر تحديث في" #. module: event_sale #: selection:event.event.ticket,seats_availability:0 msgid "Limited" -msgstr "" +msgstr "محدود" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_max @@ -248,13 +252,13 @@ msgstr "الاسم" #: code:addons/event_sale/models/event.py:205 #, python-format msgid "No more available seats for this ticket" -msgstr "" +msgstr "لا توجد مقاعد متاحة لهذه التذكرة" #. module: event_sale #: code:addons/event_sale/models/event.py:152 #, python-format msgid "No more available seats for this ticket type." -msgstr "" +msgstr "لا توجد مقاعد متاحة لهذا النوع من التذاكر." #. module: event_sale #: code:addons/event_sale/models/event.py:250 @@ -270,7 +274,7 @@ msgstr "المصدر" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_registration_editor_line__registration_id msgid "Original Registration" -msgstr "" +msgstr "التسجيل الأصلي" #. module: event_sale #: code:addons/event_sale/models/event.py:259 @@ -302,7 +306,7 @@ msgstr "تخفيض السعر" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__price_reduce_taxinc msgid "Price Reduce Tax inc" -msgstr "" +msgstr "الخصم بإضافة الضريبة" #. module: event_sale #: model:ir.model,name:event_sale.model_product_product @@ -328,7 +332,7 @@ msgstr "التسجيل" #: code:addons/event_sale/models/event.py:51 #, python-format msgid "Registration for %s" -msgstr "" +msgstr "تسجيل لـ%s" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__registration_ids @@ -338,7 +342,7 @@ msgstr "التسجيلات" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_registration_editor__event_registration_ids msgid "Registrations to Edit" -msgstr "" +msgstr "التسجيلات المراد تحريرها" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_reserved @@ -370,12 +374,12 @@ msgstr "سطر أمر المبيعات" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_event_ticket__seats_used msgid "Seats Used" -msgstr "" +msgstr "المقاعد المستخدمة" #. module: event_sale #: model:event.type,name:event_sale.event_type_data_sale msgid "Sell Online" -msgstr "" +msgstr "بع أونلاين" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.view_event_registration_editor_form @@ -385,7 +389,7 @@ msgstr "تجاوز" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_registration__sale_order_id msgid "Source Sales Order" -msgstr "" +msgstr "أمر البيع المصدر" #. module: event_sale #: model:event.event.ticket,name:event_sale.event_0_ticket_1 @@ -397,7 +401,7 @@ msgstr "قياسي" #: code:addons/event_sale/models/event.py:257 #, python-format msgid "The registration must be paid" -msgstr "" +msgstr "يجب سداد قيمة التسجيل" #. module: event_sale #: code:addons/event_sale/models/event.py:250 @@ -415,12 +419,12 @@ msgstr "نوع التذكرة" #: code:addons/event_sale/models/event.py:157 #, python-format msgid "Ticket cannot belong to both the event category and the event itself." -msgstr "" +msgstr "لا يمكن أن تنتمي التذكرة لفئة الفعالية وللفعالية نفسها." #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_type__use_ticketing msgid "Ticketing" -msgstr "" +msgstr "بيع التذاكر" #. module: event_sale #: model:ir.model.fields,field_description:event_sale.field_event_type__event_ticket_ids @@ -444,7 +448,7 @@ msgstr "الحجوزات غير المؤكدة" #: model:product.product,uom_name:event_sale.product_product_event #: model:product.template,uom_name:event_sale.product_product_event_product_template msgid "Unit(s)" -msgstr "وحدة(ات)" +msgstr "وحدة" #. module: event_sale #: selection:event.event.ticket,seats_availability:0 @@ -466,14 +470,14 @@ msgstr "كجم" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.view_event_registration_editor_form msgid "please give details about the registrations" -msgstr "" +msgstr "برجاء توفير تفاصيل عن التسجيلات" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.view_event_form_inherit_ticket msgid "reserved +" -msgstr "" +msgstr "محجوز +" #. module: event_sale #: model_terms:ir.ui.view,arch_db:event_sale.view_event_form_inherit_ticket msgid "unconfirmed" -msgstr "" +msgstr "غير مؤكد" diff --git a/addons/fetchmail/i18n/ar.po b/addons/fetchmail/i18n/ar.po index 905f8266bec..1b23eee1a0c 100644 --- a/addons/fetchmail/i18n/ar.po +++ b/addons/fetchmail/i18n/ar.po @@ -3,7 +3,6 @@ # * fetchmail # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Mustafa J. Kadhem <safi2266@gmail.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 @@ -13,13 +12,15 @@ # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Zuhair Hammadi <zuhair12@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" -"PO-Revision-Date: 2018-09-18 09:49+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:17+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -30,7 +31,7 @@ msgstr "" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form msgid "Actions to Perform on Incoming Mails" -msgstr "إجراءات لتنفيذها على الرسائل الواردة" +msgstr "الإجراءات المراد تنفيذها على الرسائل الواردة" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__active @@ -70,7 +71,7 @@ msgid "" "Connections are encrypted with SSL/TLS through a dedicated port (default: " "IMAPS=993, POP3S=995)" msgstr "" -"الإتصالات مشفرة بـ SSL/TLS من خلال منفذ مخصص (افتراضياً: IMPAS=993 " +"الإتصالات مشفرة بـ SSL/TLS من خلال منفذ مخصص (افتراضيًا: IMPAS=993 " ",POP35=995 )" #. module: fetchmail @@ -91,17 +92,17 @@ msgstr "أنشئ في" #. module: fetchmail #: model:ir.model.fields,help:fetchmail.field_fetchmail_server__priority msgid "Defines the order of processing, lower values mean higher priority" -msgstr "تحديد ترتيب المعالجة, القيم الأقل تعني أولوية أعلى" +msgstr "تحديد ترتيب عمليات المعالجة, القيم الأقل تعني أولوية أعلى" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_tree msgid "Email Count" -msgstr "" +msgstr "عدد الرسائل" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form @@ -111,7 +112,7 @@ msgstr "جلب الآن" #. module: fetchmail #: model:ir.model.fields,help:fetchmail.field_fetchmail_server__server msgid "Hostname or IP of the mail server" -msgstr "اسم الجهاز أو رقم الآي بي لخادم البريد" +msgstr "اسم الجهاز أو رقم IP سيرفر البريد" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__id @@ -126,44 +127,44 @@ msgstr "بروتوكول IMAP" #. module: fetchmail #: selection:fetchmail.server,type:0 msgid "IMAP Server" -msgstr "خادم IMAP" +msgstr "سيرفر IMAP" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search msgid "If SSL required." -msgstr "إذا SSL مطلوبة." +msgstr "إذا كانت SSL مطلوبة." #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_mail_mail__fetchmail_server_id msgid "Inbound Mail Server" -msgstr "خادم البريد الوارد" +msgstr "سيرفر البريد الوارد" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.res_config_settings_view_form msgid "Incoming Email Servers" -msgstr "" +msgstr "سيرفرات الرسائل الواردة" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search msgid "Incoming Mail Server" -msgstr "خادم الرسائل الواردة" +msgstr "سيرفر البريد الوارد" #. module: fetchmail #: model:ir.actions.act_window,name:fetchmail.action_email_server_tree #: model:ir.ui.menu,name:fetchmail.menu_action_fetchmail_server_tree msgid "Incoming Mail Servers" -msgstr "خوادم الرسائل الواردة" +msgstr "سيرفرات البريد الوارد" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__attach msgid "Keep Attachments" -msgstr "حفظ المرفقات" +msgstr "الاحتفاظ بالمرفقات" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__original msgid "Keep Original" -msgstr "حفظ الأصل" +msgstr "الاحتفاظ بالأصل" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__date @@ -188,19 +189,19 @@ msgstr "آخر تحديث في" #. module: fetchmail #: selection:fetchmail.server,type:0 msgid "Local Server" -msgstr "الخادم المحلي" +msgstr "السيرفر المحلي" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form msgid "Login Information" -msgstr "معلومات تسجيل الدخول" +msgstr "بيانات تسجيل الدخول" #. module: fetchmail #: model:ir.actions.server,name:fetchmail.ir_cron_mail_gateway_action_ir_actions_server #: model:ir.cron,cron_name:fetchmail.ir_cron_mail_gateway_action #: model:ir.cron,name:fetchmail.ir_cron_mail_gateway_action msgid "Mail: Fetchmail Service" -msgstr "" +msgstr "البريد: خدمة جلب الرسائل" #. module: fetchmail #: model:ir.actions.act_window,name:fetchmail.act_server_history @@ -221,7 +222,7 @@ msgstr "غير مؤكد" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.res_config_settings_view_form msgid "Outgoing Email Servers" -msgstr "" +msgstr "سيرفرات الرسائل الصادرة" #. module: fetchmail #: model:ir.model,name:fetchmail.model_mail_mail @@ -236,17 +237,17 @@ msgstr "بروتوكول POP" #. module: fetchmail #: selection:fetchmail.server,type:0 msgid "POP Server" -msgstr "خادم POP" +msgstr "سيرفر POP" #. module: fetchmail #: model:ir.model,name:fetchmail.model_fetchmail_server msgid "POP/IMAP Server" -msgstr "خادم POP/IMAP" +msgstr "سيرفر POP/IMAP" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_tree msgid "POP/IMAP Servers" -msgstr "خوادم POP/IMAP" +msgstr "سيرفات POP/IMAP" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__password @@ -265,9 +266,9 @@ msgid "" "document type. This will create new documents for new conversations, or " "attach follow-up emails to the existing conversations (documents)." msgstr "" -"معالجة كل الرسائل الواردة كجزء من المحادثة وفقاً لنوع المستند. هذا سوف ينشأ " -"مستندات جديدة لمحادثات جديدة، أو إرفاق رسائل بريد المتابعة الإلكترونية " -"للمحادثات الموجودة (مستندات)." +"معالجة كل الرسائل الواردة كجزء من المحادثة وفقًا لنوع هذا المستند. سوف ينشأ " +"هذا مستندات جديدة لمحادثات جديدة، أو إرفاق رسائل بريد المتابعة الإلكترونية " +"بالمحادثات (المستندات) الموجودة." #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form @@ -292,42 +293,42 @@ msgstr "نص برمجي" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search msgid "Search Incoming Mail Servers" -msgstr "بحث خاودم البريد الوارد" +msgstr "بحث سيرفرات البريد الوارد" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form msgid "Server & Login" -msgstr "الخادم و تسجيل الدخول" +msgstr "السيرفر وتسجيل الدخول" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_form msgid "Server Information" -msgstr "معلومات الخادم" +msgstr "معلومات السيرفر" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__server msgid "Server Name" -msgstr "اسم الخادم" +msgstr "اسم السيرفر" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__priority msgid "Server Priority" -msgstr "أولوية الخادم" +msgstr "أولوية السيرفر" #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__type msgid "Server Type" -msgstr "نوع الخادم" +msgstr "نوع السيرفر" #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search msgid "Server type IMAP." -msgstr "نوع خادم IMAP." +msgstr "نوع سيرفر IMAP." #. module: fetchmail #: model_terms:ir.ui.view,arch_db:fetchmail.view_email_server_search msgid "Server type POP." -msgstr "نوع خادم POP." +msgstr "نوع سيرفر POP." #. module: fetchmail #: model:ir.model.fields,field_description:fetchmail.field_fetchmail_server__state @@ -351,8 +352,8 @@ msgid "" "attached to each processed message. This will usually double the size of " "your message database." msgstr "" -"إذا كان يتوجب الاحتفاظ بنسخة اصلية كاملة من كل رسائل البريد كمرجع وارفاقها " -"بكل الرسائل التي يم معالجتها. سيضاعف هذا عادة حجم الرسالة في قاعدة البيانات." +"ما إن كان ينبغي الاحتفاظ بنسخة أصلية كاملة من كل رسائل البريد كمرجع وإرفاقها" +" بكل الرسائل التي يتم معالجتها. عادةً، سيضاعف هذا حجم قاعدة بيانات رسائلك." #. module: fetchmail #: model:ir.model.fields,help:fetchmail.field_fetchmail_server__attach @@ -360,5 +361,5 @@ msgid "" "Whether attachments should be downloaded. If not enabled, incoming emails " "will be stripped of any attachments before being processed" msgstr "" -"إذا كان يتوجب تنزيل المرفقات. إن لم تكن ممكنة، فإن الرسائل المستقبلة سوف يتم" -" تجريدها من اي مرفقات قبل معالجتها" +"ما إن كان ينبغي تحميل المرفقات. إن لم تكن مفعلة، سيتم تجريد الرسائل الواردة " +"من أية مرفقات قبل معالجتها" diff --git a/addons/fleet/i18n/km.po b/addons/fleet/i18n/km.po index 78e7615a996..6d73c1d4af4 100644 --- a/addons/fleet/i18n/km.po +++ b/addons/fleet/i18n/km.po @@ -1068,7 +1068,7 @@ msgstr "" #. module: fleet #: model_terms:ir.ui.view,arch_db:fleet.fleet_vehicle_log_contract_view_form msgid "Invoice Date" -msgstr "" +msgstr "កាលបរិច្ចេទវិកយបត្រ" #. module: fleet #: model:ir.model.fields,field_description:fleet.field_fleet_vehicle_log_fuel__inv_ref @@ -1840,7 +1840,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:fleet.fleet_vehicle_log_contract_view_search #: model_terms:ir.ui.view,arch_db:fleet.fleet_vehicle_view_search msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: fleet #: model:ir.model.fields,field_description:fleet.field_fleet_vehicle_model_brand__image_small diff --git a/addons/fleet/views/fleet_vehicle_cost_views.xml b/addons/fleet/views/fleet_vehicle_cost_views.xml index d8c3ffccad9..09bb03b8307 100644 --- a/addons/fleet/views/fleet_vehicle_cost_views.xml +++ b/addons/fleet/views/fleet_vehicle_cost_views.xml @@ -216,7 +216,7 @@ <group> <field name="date" string="Invoice Date"/> <field name="start_date"/> - <field name="expiration_date"/> + <field name="expiration_date" attrs="{'required': [('cost_frequency', '!=', 'no')]}"/> </group> </group> <notebook> diff --git a/addons/gamification/i18n/cs.po b/addons/gamification/i18n/cs.po index 6f37d037a24..c032b348152 100644 --- a/addons/gamification/i18n/cs.po +++ b/addons/gamification/i18n/cs.po @@ -153,6 +153,8 @@ msgid "" "<br/>Nobody has succeeded to reach every goal, no badge is rewarded for this" " challenge." msgstr "" +"<br/>Nikomu se nepodařilo dosáhnout jakéhokoliv cíle, za tuto výzvu není " +"odměněn žádný odznak." #. module: gamification #: code:addons/gamification/models/challenge.py:655 @@ -189,6 +191,8 @@ msgid "" "<span class=\"o_stat_text\">Related</span>\n" " <span class=\"o_stat_text\">Goals</span>" msgstr "" +"<span class=\"o_stat_text\">Související</span>\n" +" <span class=\"o_stat_text\">Cíle</span>" #. module: gamification #: model:mail.template,body_html:gamification.simple_report_template @@ -398,6 +402,9 @@ msgid "" " It can be deserved automatically when some conditions are met or manually by users.\n" " Some badges are harder than others to get with specific conditions." msgstr "" +"Odznak je symbol udělený uživateli jako znak odměny.\n" +"To může být zaslouženo automaticky, když jsou splněny některé podmínky, nebo ručně uživateli.\n" +"Některé odznaky je těžší získat než jiné v závislosti na specifickýxch podmákách." #. module: gamification #: model_terms:ir.actions.act_window,help:gamification.goal_definition_list_action @@ -405,6 +412,8 @@ msgid "" "A goal definition is a technical model of goal defining a condition to reach.\n" " The dates, values to reach or users are defined in goal instance." msgstr "" +"Definice cíle je technický model cíle, který definuje podmínku pro dosažení cíle.\n" +"Data, hodnoty k dosažení nebo uživatelé jsou definováni v instanci cíle." #. module: gamification #: model:ir.model.fields,help:gamification.field_gamification_challenge_line__condition @@ -414,6 +423,8 @@ msgid "" "A goal is considered as completed when the current value is compared to the " "value to reach" msgstr "" +"Cíl je považován za dokončený, když je aktuální hodnota porovnána s " +"hodnotou, která má být dosažena" #. module: gamification #: model_terms:ir.actions.act_window,help:gamification.goal_list_action @@ -421,6 +432,8 @@ msgid "" "A goal is defined by a user and a goal definition.\n" " Goals can be created automatically by using challenges." msgstr "" +"Cíl je definován uživatelem a definicí cíle.\n" +"Cíle lze vytvářet automaticky pomocí výzev." #. module: gamification #: selection:gamification.badge,rule_auth:0 @@ -972,7 +985,7 @@ msgstr "" #. module: gamification #: model:ir.model,name:gamification.model_gamification_badge_user_wizard msgid "Gamification User Badge Wizard" -msgstr "" +msgstr "Průvodce odznakem uživatele Gamifikace" #. module: gamification #: model:ir.model,name:gamification.model_gamification_challenge_line diff --git a/addons/gamification/models/gamification_karma_rank.py b/addons/gamification/models/gamification_karma_rank.py index 78b8e40ac50..1d930fefa4d 100644 --- a/addons/gamification/models/gamification_karma_rank.py +++ b/addons/gamification/models/gamification_karma_rank.py @@ -47,8 +47,19 @@ class KarmaRank(models.Model): @api.multi def write(self, vals): + if 'karma_min' in vals: + previous_ranks = self.env['gamification.karma.rank'].search([], order="karma_min DESC").ids + low = min(vals['karma_min'], self.karma_min) + high = max(vals['karma_min'], self.karma_min) + tools.image_resize_images(vals) res = super(KarmaRank, self).write(vals) - users = self.env['res.users'].sudo().search([('karma', '>', 0)]) - users._recompute_rank() + + if 'karma_min' in vals: + after_ranks = self.env['gamification.karma.rank'].search([], order="karma_min DESC").ids + if previous_ranks != after_ranks: + users = self.env['res.users'].sudo().search([('karma', '>', 0)]) + else: + users = self.env['res.users'].sudo().search([('karma', '>=', low), ('karma', '<=', high)]) + users._recompute_rank() return res diff --git a/addons/gamification/models/res_users.py b/addons/gamification/models/res_users.py index a0ca65ced45..4f9319a4001 100644 --- a/addons/gamification/models/res_users.py +++ b/addons/gamification/models/res_users.py @@ -7,9 +7,11 @@ import logging _logger = logging.getLogger(__name__) + class Users(models.Model): _inherit = 'res.users' + karma = fields.Integer('Karma', default=0) karma_position = fields.Integer('Karma position', compute="_compute_karma_position", store=False) badge_ids = fields.One2many('gamification.badge.user', 'user_id', string='Badges', copy=False) @@ -69,18 +71,32 @@ class Users(models.Model): return True def _rank_changed(self): - if self.rank_id.karma_min > 0: - template = self.env.ref('gamification.mail_template_data_new_rank_reached', raise_if_not_found=False) - if template: - template.send_mail(self.id, force_send=True, notif_layout='mail.mail_notification_light') + """ + Method that can be called on a batch of users with the same new rank + """ + template = self.env.ref('gamification.mail_template_data_new_rank_reached', raise_if_not_found=False) + if template: + for u in self: + if u.rank_id.karma_min > 0: + template.send_mail(u.id, force_send=len(self) == 1, notif_layout='mail.mail_notification_light') def _recompute_rank(self): """ The caller should filter the users on karma > 0 before calling this method to avoid looping on every single users + + Compute rank of each user by user. + For each user, check the rank of this user """ + ranks = [{'rank': rank, 'karma_min': rank.karma_min} for rank in self.env['gamification.karma.rank'].search([], order="karma_min DESC")] + + # 3 is the number of search/requests used by rank in _recompute_rank_bulk() + if len(self) > len(ranks) * 3: + self._recompute_rank_bulk() + return + for user in self: old_rank = user.rank_id if user.karma == 0 and ranks: @@ -96,6 +112,66 @@ class Users(models.Model): if old_rank != user.rank_id: user._rank_changed() + def _recompute_rank_bulk(self): + """ + Compute rank of each user by rank. + For each rank, check which users need to be ranked + + """ + ranks = [{'rank': rank, 'karma_min': rank.karma_min} for rank in + self.env['gamification.karma.rank'].search([], order="karma_min DESC")] + + users_todo = self + + next_rank_id = False + # wtf, next_rank_id should be a related on rank_id.next_rank_id and life might get easier. + # And we only need to recompute next_rank_id on write with min_karma or in the create on rank model. + for r in ranks: + rank_id = r['rank'].id + dom = [ + ('karma', '>=', r['karma_min']), + ('id', 'in', users_todo.ids), + '|', # noqa + '|', ('rank_id', '!=', rank_id), ('rank_id', '=', False), + '|', ('next_rank_id', '!=', next_rank_id), ('next_rank_id', '=', False if next_rank_id else -1), + ] + users = self.env['res.users'].search(dom) + if users: + users_to_notify = self.env['res.users'].search([ + ('karma', '>=', r['karma_min']), + '|', ('rank_id', '!=', rank_id), ('rank_id', '=', False), + ('id', 'in', users.ids), + ]) + users.write({ + 'rank_id': rank_id, + 'next_rank_id': next_rank_id, + }) + users_to_notify._rank_changed() + users_todo -= users + + nothing_to_do_users = self.env['res.users'].search([ + ('karma', '>=', r['karma_min']), + '|', ('rank_id', '=', rank_id), ('next_rank_id', '=', next_rank_id), + ('id', 'in', users_todo.ids), + ]) + users_todo -= nothing_to_do_users + next_rank_id = r['rank'].id + + if ranks: + lower_rank = ranks[-1]['rank'] + users = self.env['res.users'].search([ + ('karma', '>=', 0), + ('karma', '<', lower_rank.karma_min), + '|', ('rank_id', '!=', False), ('next_rank_id', '!=', lower_rank.id), + ('id', 'in', users_todo.ids), + ]) + if users: + users.write({ + 'rank_id': False, + 'next_rank_id': lower_rank.id, + }) + + def _get_next_rank(self): """ For fresh users with 0 karma that don't have a rank_id and next_rank_id yet this method returns the first karma rank (by karma ascending). This acts as a diff --git a/addons/gamification/tests/__init__.py b/addons/gamification/tests/__init__.py index 0219f6754d0..a6a599bf6c8 100644 --- a/addons/gamification/tests/__init__.py +++ b/addons/gamification/tests/__init__.py @@ -2,3 +2,4 @@ # Part of Odoo. See LICENSE file for full copyright and licensing details. from . import test_challenge +from . import test_recompute_rank diff --git a/addons/gamification/tests/test_recompute_rank.py b/addons/gamification/tests/test_recompute_rank.py new file mode 100644 index 00000000000..c82fb4759fd --- /dev/null +++ b/addons/gamification/tests/test_recompute_rank.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests import common +from unittest.mock import patch + + +class TestComputeRankCommon(common.TransactionCase): + + def setUp(self): + super(TestComputeRankCommon, self).setUp() + + def _patched_send_mail(*args, **kwargs): + pass + + self.User = self.env['res.users'].with_context(no_reset_password=True, mail_create_nosubscribe=True) + self.users = self.User + + patch_email = patch('odoo.addons.mail.models.mail_template.MailTemplate.send_mail', _patched_send_mail) + patch_email.start() + for k in range(-5, 1030, 30): + self.users += self.User.create({ + 'name': str(k), + 'login': "test_recompute_rank_%s" % k, + 'karma': k, + }) + + self.env['gamification.karma.rank'].search([]).unlink() + + self.rank_1 = self.env['gamification.karma.rank'].create({ + 'name': 'rank 1', + 'karma_min': 0, + }) + + self.rank_2 = self.env['gamification.karma.rank'].create({ + 'name': 'rank 2', + 'karma_min': 250, + }) + + self.rank_3 = self.env['gamification.karma.rank'].create({ + 'name': 'rank 3', + 'karma_min': 500, + }) + self.rank_4 = self.env['gamification.karma.rank'].create({ + 'name': 'rank 4', + 'karma_min': 1000, + }) + + patch_email.stop() + + +class test_recompute(TestComputeRankCommon): + + def test_00_initial_compute(self): + + self.assertEqual(len(self.users), 35) + + self.assertEqual( + len(self.rank_1.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_1.karma_min and u.karma < self.rank_2.karma_min]) + ) + self.assertEqual( + len(self.rank_2.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_2.karma_min and u.karma < self.rank_3.karma_min]) + ) + self.assertEqual( + len(self.rank_3.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_3.karma_min and u.karma < self.rank_4.karma_min]) + ) + self.assertEqual( + len(self.rank_4.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_4.karma_min]) + ) + + def test_01_switch_rank(self): + + self.assertEqual(len(self.users), 35) + + self.rank_3.karma_min = 100 + # rank_1 -> rank_3 -> rank_2 -> rank_4 + + self.assertEqual( + len(self.rank_1.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_1.karma_min and u.karma < self.rank_3.karma_min]) + ) + self.assertEqual( + len(self.rank_3.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_3.karma_min and u.karma < self.rank_2.karma_min]) + ) + self.assertEqual( + len(self.rank_2.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_2.karma_min and u.karma < self.rank_4.karma_min]) + ) + self.assertEqual( + len(self.rank_4.user_ids & self.users), + len([u for u in self.users if u.karma >= self.rank_4.karma_min]) + ) + + def test_02_update_rank_without_switch(self): + number_of_users = False + + def _patched_recompute_rank(_self, *args, **kwargs): + nonlocal number_of_users + number_of_users = len(_self & self.users) + + patch_bulk = patch('odoo.addons.gamification.models.res_users.Users._recompute_rank', _patched_recompute_rank) + patch_bulk.start() + self.rank_3.karma_min = 700 + self.assertEqual(number_of_users, 7, "Should just recompute for the 7 users between 500 and 700") + patch_bulk.stop() + + def test_03_test_bulk_call(self): + self.assertEqual(len(self.users), 35) + + def _patched_check_in_bulk(*args, **kwargs): + raise + + patch_bulk = patch('odoo.addons.gamification.models.res_users.Users._recompute_rank_bulk', _patched_check_in_bulk) + patch_bulk.start() + + # call on 5 users should not trigger the bulk function + self.users[0:5]._recompute_rank() + + # call on 50 users should trigger the bulk function + with self.assertRaises(Exception): + self.users[0:50]._recompute_rank() + + patch_bulk.stop() diff --git a/addons/google_calendar/i18n/ar.po b/addons/google_calendar/i18n/ar.po index f1bff040aed..0e501e1013f 100644 --- a/addons/google_calendar/i18n/ar.po +++ b/addons/google_calendar/i18n/ar.po @@ -7,7 +7,6 @@ # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Martin Trigaux, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 -# Osoul <baruni@osoul.ly>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Ahmed AL-Haddad <ahmed@utech-sa.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 @@ -45,7 +44,7 @@ msgstr "الحسابات" msgid "" "All events have been disconnected from your previous account. You can now " "restart the synchronization" -msgstr "" +msgstr "تم فصل كافة الفعاليات عن حسابك السابق. يمكنك الآن إعادة بدء المزامنة" #. module: google_calendar #. openerp-web @@ -55,6 +54,7 @@ msgid "" "An administrator needs to configure Google Synchronization before you can " "use it!" msgstr "" +"يجب أن يقوم أحد المشرفين بإعداد مزامنة جوجل قبل أن تتمكن من استخدامها!" #. module: google_calendar #. openerp-web @@ -64,6 +64,8 @@ msgid "" "An error occured while disconnecting events from your previous account. " "Please retry or contact your administrator." msgstr "" +"حدث خطأ أثناء فصل الفعاليات عن حسابك السابق. برجاء إعادة المحاولة أو التواصل" +" مع المشرف." #. module: google_calendar #: model_terms:ir.ui.view,arch_db:google_calendar.view_users_form @@ -93,12 +95,12 @@ msgstr "سرية العميل" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_res_config_settings__cal_client_id msgid "Client_id" -msgstr "رقم العميل" +msgstr "Client_id" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_res_config_settings__cal_client_secret msgid "Client_key" -msgstr "" +msgstr "Client_key" #. module: google_calendar #: model:ir.model,name:google_calendar.model_res_config_settings @@ -116,7 +118,7 @@ msgstr "الإعدادات" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_google_calendar__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: google_calendar #. openerp-web @@ -135,36 +137,36 @@ msgstr "الحدث" #: code:addons/google_calendar/static/src/js/google_calendar.js:84 #, python-format msgid "Event disconnection error" -msgstr "" +msgstr "خطأ في فصل الفعالية" #. module: google_calendar #. openerp-web #: code:addons/google_calendar/static/src/js/google_calendar.js:80 #, python-format msgid "Event disconnection success" -msgstr "" +msgstr "نجاح فصل الفعالية" #. module: google_calendar #: model:ir.model,name:google_calendar.model_google_calendar msgid "Google Calendar" -msgstr "تقويم غوغل" +msgstr "تقويم جوجل" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_calendar_attendee__google_internal_event_id msgid "Google Calendar Event Id" -msgstr "" +msgstr "معرف فعالية تقويم جوجل" #. module: google_calendar #: model:ir.actions.server,name:google_calendar.ir_cron_sync_all_cals_ir_actions_server #: model:ir.cron,cron_name:google_calendar.ir_cron_sync_all_cals #: model:ir.cron,name:google_calendar.ir_cron_sync_all_cals msgid "Google Calendar: synchronization" -msgstr "" +msgstr "تقويم جوجل: المزامنة" #. module: google_calendar #: sql_constraint:calendar.attendee:0 msgid "Google ID should be unique!" -msgstr "" +msgstr "يجب أن يكون معرف جوجل فريدًا!" #. module: google_calendar #: code:addons/google_calendar/models/google_calendar.py:688 @@ -174,6 +176,9 @@ msgid "" "\n" " %s" msgstr "" +"فقدت الاتصال بجوجل... المزامنة القادمة ستكون مزامنة كاملة. \n" +"\n" +" %s" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_google_calendar__id @@ -188,6 +193,7 @@ msgid "" "In order to do this, you first need to disconnect all existing events from " "the old account." msgstr "" +"لتتمكن من فعل هذا، عليك أولًا فصل كافة الفعاليات الموجودة من حسابك القديم." #. module: google_calendar #: model:ir.model.fields,help:google_calendar.field_res_users__google_calendar_cal_id @@ -195,6 +201,8 @@ msgid "" "Last Calendar ID who has been synchronized. If it is changed, we remove all " "links between GoogleID and Odoo Google Internal ID" msgstr "" +"معرف آخر تقويم تمت مزامنته. إذا تغير، نزيل كافة الروابط بين GoogleID والمعرف" +" الداخلي ما بين جوجل وأودو" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_google_calendar____last_update @@ -204,12 +212,12 @@ msgstr "آخر تعديل في" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_res_users__google_calendar_last_sync_date msgid "Last synchro date" -msgstr "" +msgstr "تاريخ آخر مزامنة" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_calendar_attendee__oe_synchro_date msgid "Odoo Synchro Date" -msgstr "تاريخ تزامن أودو" +msgstr "تاريخ مزامنة أودو" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_calendar_event__oe_update_date @@ -233,7 +241,7 @@ msgstr "تحديث الرمز" #: code:addons/google_calendar/static/src/js/google_calendar.js:117 #, python-format msgid "Sync with <b>Google</b>" -msgstr "" +msgstr "المزامنة مع <b>جوجل</b>" #. module: google_calendar #. openerp-web @@ -243,6 +251,7 @@ msgid "" "The Google Synchronization needs to be configured before you can use it, do " "you want to do it now?" msgstr "" +"يجب إعداد مزامنة جوجل قبل أن تتمكن من استخدامها، هل تريد فعل هذا الآن؟" #. module: google_calendar #. openerp-web @@ -251,17 +260,17 @@ msgstr "" msgid "" "The account you are trying to synchronize (%s) is not the same as the last " "one used (%s)!" -msgstr "" +msgstr "الحساب الذي تحاول مزامنته (%s) مختلف عن آخر حساب استخدمته (%s)!" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_res_users__google_calendar_token_validity msgid "Token Validity" -msgstr "" +msgstr "صلاحية كلمة السر" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_res_config_settings__server_uri msgid "URI for tuto" -msgstr "" +msgstr "رابط الدرس التدريبي" #. module: google_calendar #: model:ir.model.fields,field_description:google_calendar.field_res_users__google_calendar_token @@ -278,10 +287,10 @@ msgstr "المستخدمون" #: code:addons/google_calendar/static/src/js/google_calendar.js:42 #, python-format msgid "You will be redirected to Google to authorize access to your calendar!" -msgstr "" +msgstr "سيتم إعادة توجيهك لجوجل للحصول على إذن الوصول لتقويمك!" #. module: google_calendar #: code:addons/google_calendar/models/google_calendar.py:296 #, python-format msgid "Your token is invalid or has been revoked !" -msgstr "" +msgstr "كلمة السر غير صالحة أو تم إلغاءها!" diff --git a/addons/google_drive/i18n/ar.po b/addons/google_drive/i18n/ar.po index d3560a60135..2e1c1005ed4 100644 --- a/addons/google_drive/i18n/ar.po +++ b/addons/google_drive/i18n/ar.po @@ -7,8 +7,6 @@ # Mosaab Alzoubi <moceap@hotmail.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # Martin Trigaux, 2018 -# Osoul <baruni@osoul.ly>, 2018 -# Ghaith Gammar <g.gammar@saharaifs.net>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Zuhair Hammadi <zuhair12@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 @@ -38,21 +36,27 @@ msgid "" " - If you don't select \"Share with all users\", link of google document in \"More\" options will not appear for other users in opportunities of Sales Department.<br/>\n" " - If filter is not specified, link of google document will appear in \"More\" option for all users for all opportunities." msgstr "" +"<b> لإنشاء فلتر جديد: </b> <br/>\n" +" - افتح مستند أودو الذي تريد تطبيق الفلتر عليه. مثلًا: انتقل إلى الفرص وابحث في قسم المبيعات.<br/>\n" +" - في واجهة العرض \"بحث\"، اختر الخيار \"حفظ الفلتر الحالي\"، وأدخل اسمًا (مثلًا: قسم المبيعات)<br/>\n" +" - إذا اخترت \"مشاركة مع كافة المستخدمين\"، سيظهر رابط مستند جوجل في خيارات \"المزيد\" لكافة المستخدمين في فرص قسم المبيعات.<br/>\n" +" - إذا لم تختر \"مشاركة مع كافة المستخدمين\"، فلن يظهر رابط مستند جوجل في خيارات \"المزيد\" للمستخدمين الآخرين في فرص قسم المبيعات.<br/>\n" +" - إذا لم يتم تحديد الفلتر، سيظهر رابط مستند جوجل خيار \"المزيد\" لكافة المستخدمين بكافة الفرص." #. module: google_drive #: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_kanban msgid "<strong>Active</strong>" -msgstr "" +msgstr "<strong>نشط</strong>" #. module: google_drive #: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_kanban msgid "<strong>Model</strong>" -msgstr "" +msgstr "<strong>كائن</strong>" #. module: google_drive #: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_kanban msgid "<strong>Template</strong>" -msgstr "" +msgstr "<strong>قالب</strong>" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__active @@ -62,13 +66,13 @@ msgstr "نشط" #. module: google_drive #: model_terms:ir.actions.act_window,help:google_drive.action_google_drive_users_config msgid "Add a new template" -msgstr "" +msgstr "إضافة قالب جديد" #. module: google_drive #: code:addons/google_drive/models/google_drive.py:42 #, python-format msgid "At least one key cannot be found in your Google Drive name pattern." -msgstr "" +msgstr "تعذّر العثور علي مفتاح واحد علي الأقل في نمط اسم جوجل درايف." #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_res_config_settings__google_drive_authorization_code @@ -81,6 +85,7 @@ msgid "" "Choose how the new google drive will be named, on google side. Eg. " "gdoc_%(field_name)s" msgstr "" +"اختر كيفية تسمية جوجل درايف الجديد، من ناحية جوجل. مثال: gdoc_%(field_name)s" #. module: google_drive #: model:ir.model,name:google_drive.model_res_config_settings @@ -101,7 +106,7 @@ msgstr "أنشئ في" #: code:addons/google_drive/models/google_drive.py:161 #, python-format msgid "Creating google drive may only be done by one at a time." -msgstr "" +msgstr "يتم إنشاء جوجل درايف مرة واحدة فقط." #. module: google_drive #: model:ir.filters,name:google_drive.filter_partner @@ -111,12 +116,12 @@ msgstr "العميل" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__filter_id msgid "Filter" -msgstr "الفرز" +msgstr "فلتر" #. module: google_drive #: code:addons/google_drive/models/google_drive.py:61 @@ -128,30 +133,30 @@ msgstr "انتقل إلى لوحة الإعدادات" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__google_drive_client_id msgid "Google Client" -msgstr "عميل غوغل" +msgstr "عميل جوجل" #. module: google_drive #: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_form #: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_tree msgid "Google Drive Configuration" -msgstr " اعدادات سواقة غوغل" +msgstr "إعدادات جوجل درايف" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__name_template msgid "Google Drive Name Pattern" -msgstr "" +msgstr "نمط اسم جوجل درايف" #. module: google_drive #: model_terms:ir.ui.view,arch_db:google_drive.res_config_settings_view_form msgid "Google Drive Templates" -msgstr "" +msgstr "قوالب جوجل درايف" #. module: google_drive #: code:addons/google_drive/models/google_drive.py:63 #: code:addons/google_drive/models/google_drive.py:84 #, python-format msgid "Google Drive is not yet configured. Please contact your administrator." -msgstr "" +msgstr "لم يتم إعداد جوجل درايف بعد. برجاء التوصل مع مشرفك." #. module: google_drive #: model:ir.model,name:google_drive.model_google_drive_config @@ -187,6 +192,10 @@ msgid "" "checklist for each order in a foreign country, ... Its very easy to manage " "them, link them to Odoo and use them to collaborate with your employees." msgstr "" +"اربط قوالب جوجل درايف الخاصة بك بأي سجل في أودو. إذا كان لديك مستندات معينة " +"تريد أن يملأها المتعاون، مثلًا: استخدم الجداول الممتدة للتحكم في جودة منتجك " +"أو لمراجعة قوائم الفحص لكل الأوامر الصادرة من دول أجنبية، من السهل إدارتهم، " +"وربطهم بأودو واستخدامهم للتعاون مع موظفيك." #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__model_id @@ -197,12 +206,12 @@ msgstr "النموذج" #: code:addons/google_drive/models/google_drive.py:203 #, python-format msgid "Please enter a valid Google Document URL." -msgstr "" +msgstr "برجاء إدخال رابط صالح لمستند جوجل." #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__model msgid "Related Model" -msgstr "" +msgstr "الكائن ذو الصلة" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__google_drive_resource_id @@ -215,7 +224,7 @@ msgstr "هوية المصدر" msgid "" "Something went wrong during the token generation. Please request again an " "authorization code ." -msgstr "" +msgstr "حدث خطأ أثناء إنشاء كلمة السر. الرجاء طلب رمز ترخيص مرة أخرى." #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__name @@ -236,7 +245,7 @@ msgstr "قوالب" #: code:addons/google_drive/models/google_drive.py:99 #, python-format msgid "The Google Template cannot be found. Maybe it has been deleted." -msgstr "قالب غوغل لم يوجد. لربما حذف." +msgstr "تعذّر إيجاد قالب جوجل. ربما يكون حُذف." #. module: google_drive #: model:ir.model.fields,help:google_drive.field_res_config_settings__google_drive_uri @@ -251,6 +260,10 @@ msgid "" " in the Google Drive name field, the document in your Google Drive and in Odoo attachment will be named\n" " 'Deco_Addict_SO0001_Sales'." msgstr "" +"يمكن لاسم المستند المرفق استخدام بيانات ثابتة أو متغيرة. للتمييز بين المستندات في\n" +" جوجل درايف، استخدم الكلمات والحقول الثابتة. فمثلًا، في المثال أعلاه، إذا كتبت Deco_Addict_%(name)s_Sales\n" +" في حقل اسم جوجل درايف، سيكون اسم المستند في جوجل درايف وفي مرفق أودو\n" +" 'Deco_Addict_SO0001_Sales'." #. module: google_drive #: code:addons/google_drive/models/google_drive.py:135 @@ -258,7 +271,7 @@ msgstr "" msgid "" "The permission 'reader' for 'anyone with the link' has not been written on " "the document" -msgstr "" +msgstr "لم يُمنح الإذن 'قارئ' لـ'أي شخص يملك الرابط' بهذا المستند" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_res_config_settings__google_drive_uri @@ -272,6 +285,7 @@ msgid "" "You haven't configured 'Authorization Code' generated from google, Please " "generate and configure it ." msgstr "" +"لم تقم بإعداد 'رمز الترخيص' الذي تم إنشاؤه من جوجل، الرجاء إنشاءه وإعداده." #. module: google_drive #: model_terms:ir.ui.view,arch_db:google_drive.view_google_drive_config_form diff --git a/addons/google_drive/i18n/km.po b/addons/google_drive/i18n/km.po index 56fe74bec40..06471e392fd 100644 --- a/addons/google_drive/i18n/km.po +++ b/addons/google_drive/i18n/km.po @@ -114,7 +114,7 @@ msgstr "" #: code:addons/google_drive/models/google_drive.py:82 #, python-format msgid "Go to the configuration panel" -msgstr "" +msgstr "ចូលទៅផ្ទាំងការតំឡើង" #. module: google_drive #: model:ir.model.fields,field_description:google_drive.field_google_drive_config__google_drive_client_id diff --git a/addons/hr/i18n/km.po b/addons/hr/i18n/km.po index 97ffc8d7d64..aab3840d85c 100644 --- a/addons/hr/i18n/km.po +++ b/addons/hr/i18n/km.po @@ -179,7 +179,7 @@ msgstr "" #. module: hr #: model:ir.model.fields,field_description:hr.field_mail_alias__alias_contact msgid "Alias Contact Security" -msgstr "" +msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន" #. module: hr #: model_terms:hr.job,website_description:hr.job_consultant diff --git a/addons/hr_attendance/i18n/cs.po b/addons/hr_attendance/i18n/cs.po index 36855ef34dc..b621383798a 100644 --- a/addons/hr_attendance/i18n/cs.po +++ b/addons/hr_attendance/i18n/cs.po @@ -181,7 +181,7 @@ msgstr "" #. module: hr_attendance #: model_terms:ir.ui.view,arch_db:hr_attendance.hr_attendance_view_filter msgid "Check Out Date" -msgstr "" +msgstr "Zkontrolovat datum" #. module: hr_attendance #: model_terms:ir.ui.view,arch_db:hr_attendance.res_config_settings_view_form diff --git a/addons/hr_expense/i18n/km.po b/addons/hr_expense/i18n/km.po index 137e7180019..e168829babb 100644 --- a/addons/hr_expense/i18n/km.po +++ b/addons/hr_expense/i18n/km.po @@ -691,7 +691,7 @@ msgstr "" #. module: hr_expense #: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet_register_payment_wizard__hide_payment_method msgid "Hide Payment Method" -msgstr "" +msgstr "លាក់វិធីសាស្ត្រទូទាត់" #. module: hr_expense #: model:ir.model.fields,field_description:hr_expense.field_hr_expense_refuse_wizard__hr_expense_ids @@ -1044,7 +1044,7 @@ msgstr "" #. module: hr_expense #: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet_register_payment_wizard__payment_method_id msgid "Payment Type" -msgstr "" +msgstr "ប្រភេទការទូទាត់" #. module: hr_expense #: selection:hr.expense,activity_state:0 @@ -1063,7 +1063,7 @@ msgstr "" #. module: hr_expense #: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_sheet_form msgid "Post Journal Entries" -msgstr "" +msgstr "បង្ហាញធាតុទិន្នានុប្បវតិ" #. module: hr_expense #: selection:hr.expense.sheet,state:0 @@ -1135,6 +1135,9 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:hr_expense.report_expense_sheet msgid "Ref." msgstr "" +"សេចក្តីយោង\n" +" \n" +" " #. module: hr_expense #: model_terms:ir.ui.view,arch_db:hr_expense.hr_expense_refuse_wizard_view_form @@ -1236,13 +1239,13 @@ msgstr "" #. module: hr_expense #: model:ir.model.fields,field_description:hr_expense.field_hr_expense_sheet_register_payment_wizard__show_partner_bank_account msgid "Show Partner Bank Account" -msgstr "" +msgstr "បង្ហាញគណនីធនាគារដៃគូ" #. module: hr_expense #: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_filter #: model_terms:ir.ui.view,arch_db:hr_expense.view_hr_expense_sheet_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: hr_expense #: model:ir.model.fields,help:hr_expense.field_product_template__can_be_expensed @@ -1294,7 +1297,7 @@ msgstr "" #. module: hr_expense #: model:ir.model.fields,field_description:hr_expense.field_hr_expense__untaxed_amount msgid "Subtotal" -msgstr "" +msgstr "សរុប" #. module: hr_expense #: model:ir.model.fields,field_description:hr_expense.field_hr_expense__tax_ids diff --git a/addons/hr_expense/i18n/vi.po b/addons/hr_expense/i18n/vi.po index b0976382098..5b93e039ef5 100644 --- a/addons/hr_expense/i18n/vi.po +++ b/addons/hr_expense/i18n/vi.po @@ -1347,6 +1347,8 @@ msgid "" "Technical field used to know whether the field `partner_bank_account_id` " "needs to be displayed or not in the payments form views" msgstr "" +"Technical field used to know whether the field `partner_bank_account_id` " +"needs to be displayed or not in the payments form views" #. module: hr_expense #. openerp-web diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index 7ad7ebde8f9..d2d68f018b0 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -65,7 +65,7 @@ class HrExpense(models.Model): payment_mode = fields.Selection([ ("own_account", "Employee (to reimburse)"), ("company_account", "Company") - ], default='own_account', states={'done': [('readonly', True)], 'post': [('readonly', True)], 'submitted': [('readonly', True)]}, string="Paid By") + ], default='own_account', states={'done': [('readonly', True)], 'approved': [('readonly', True)], 'reported': [('readonly', True)]}, string="Paid By") attachment_number = fields.Integer('Number of Attachments', compute='_compute_attachment_number') state = fields.Selection([ ('draft', 'To Submit'), @@ -317,8 +317,8 @@ class HrExpense(models.Model): 'currency_id': expense.currency_id.id if different_currency else False, } move_line_values.append(move_line_src) - total_amount -= move_line_src['debit'] - total_amount_currency -= move_line_src['amount_currency'] or move_line_src['debit'] + total_amount += -move_line_src['debit'] or move_line_src['credit'] + total_amount_currency += -move_line_src['amount_currency'] if move_line_src['currency_id'] else (-move_line_src['debit'] or move_line_src['credit']) # taxes move lines for tax in taxes['taxes']: diff --git a/addons/hr_expense_check/i18n/ar.po b/addons/hr_expense_check/i18n/ar.po index fa5c568e6b3..4546515c996 100644 --- a/addons/hr_expense_check/i18n/ar.po +++ b/addons/hr_expense_check/i18n/ar.po @@ -3,15 +3,16 @@ # * hr_expense_check # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Mustafa J. Kadhem <safi2266@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Mustafa J. Kadhem <safi2266@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:18+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -37,7 +38,7 @@ msgstr "حدد هذا الاختيار إذا كان دفتر شيكاتك غيØ #. module: hr_expense_check #: model:ir.model,name:hr_expense_check.model_hr_expense_sheet_register_payment_wizard msgid "Expense Register Payment Wizard" -msgstr "" +msgstr "معالج سداد سجل المصروفات" #. module: hr_expense_check #: model:ir.model.fields,field_description:hr_expense_check.field_hr_expense_sheet_register_payment_wizard__check_manual_sequencing @@ -57,10 +58,10 @@ msgstr "" #. module: hr_expense_check #: model:ir.model.fields,field_description:hr_expense_check.field_hr_expense_sheet_register_payment_wizard__payment_method_code_2 msgid "Payment Method Code 2" -msgstr "" +msgstr "كود طريقة السداد 2" #. module: hr_expense_check #: model:ir.model.fields,help:hr_expense_check.field_hr_expense_sheet_register_payment_wizard__payment_method_code_2 msgid "" "Technical field used to adapt the interface to the payment type selected." -msgstr "الحقل التقني يُستخدم لتهيئة الواجهة لنوع السداد المُختار" +msgstr "حقل تقني يُستخدم لتهيئة الواجهة لنوع السداد المُختار." diff --git a/addons/hr_gamification/i18n/ar.po b/addons/hr_gamification/i18n/ar.po index 2e1f9831145..4e2e6b9dead 100644 --- a/addons/hr_gamification/i18n/ar.po +++ b/addons/hr_gamification/i18n/ar.po @@ -3,18 +3,19 @@ # * hr_gamification # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Martin Trigaux, 2018 # Fahad Alqahtani <fahad@cloudland.sa>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:19+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -28,13 +29,15 @@ msgid "" "A goal is defined by a user and a goal type.\n" " Goals can be created automatically by using challenges." msgstr "" +"يُعرف الهدف بواسطة المستخدم والنوع التابع له.\n" +" يمكن إنشاء الأهداف تلقائيًا باستخدام التحديات." #. module: hr_gamification #: model:ir.model.fields,help:hr_gamification.field_hr_employee__badge_ids msgid "" "All employee badges, linked to the employee either directly or through the " "user" -msgstr "" +msgstr "كافة شارات الموظف، المرتبطة بالموظف إما مباشرة أو من خلال المستخدم" #. module: hr_gamification #: model_terms:ir.actions.act_window,help:hr_gamification.challenge_list_action2 @@ -43,6 +46,9 @@ msgid "" " The challenge can use a period (weekly, monthly...) for automatic creation of goals.\n" " The goals are created for the specified users or member of the group." msgstr "" +"قم بتعيين قائمة من الأهداف لمجموعة محددة من المستخدمين لتقييمهم.\n" +" قد يكون التحدي دوريًا (أسبوعيًا أو شهريًا) ليتم إنشاء الأهداف تلقائيًا.\n" +" يتم إنشاء الأهداف للمستخدمين المحددين أو لأعضاء مجموعة ما." #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_res_users__badge_ids @@ -55,13 +61,12 @@ msgstr "الشارات" msgid "" "Badges are rewards of good work. Give them to people you believe deserve it." msgstr "" -"الشارات هي مكافئات أو منح للدلالة على العمل الجيد. امنح الشارات لمن ترى أنهم" -" يستحقونها." +"الشارات هي مكافآت على العمل الجيد. امنح الشارات لمن ترى أنهم يستحقونها." #. module: hr_gamification #: model:ir.model.fields,help:hr_gamification.field_hr_employee__direct_badge_ids msgid "Badges directly linked to the employee" -msgstr "" +msgstr "الشارات المرتبطة مباشرةً بهذا الموظف" #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.view_badge_wizard_reward @@ -78,22 +83,22 @@ msgstr "التحديات" #. module: hr_gamification #: model_terms:ir.actions.act_window,help:hr_gamification.challenge_list_action2 msgid "Create a new challenge" -msgstr "" +msgstr "إنشاء تحدي جديد" #. module: hr_gamification #: model_terms:ir.actions.act_window,help:hr_gamification.goals_menu_groupby_action2 msgid "Create a new goal" -msgstr "" +msgstr "إنشاء هدف جديد" #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.view_badge_wizard_reward msgid "Describe what they did and why it matters (will be public)" -msgstr "صف مافعلوه وما أهميته (سيكون عاماً)" +msgstr "صف ما فعلوه وما أهميته (سيكون عامًا)" #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_hr_employee__direct_badge_ids msgid "Direct Badge" -msgstr "" +msgstr "الشارة المباشرة" #. module: hr_gamification #: model:ir.model,name:hr_gamification.model_hr_employee @@ -110,22 +115,22 @@ msgstr "شارات الموظف" #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_hr_employee__goal_ids msgid "Employee HR Goals" -msgstr "أهداف الموظفين" +msgstr "أهداف الموظف للموارد البشرية" #. module: hr_gamification #: model:ir.model,name:hr_gamification.model_gamification_badge msgid "Gamification Badge" -msgstr "" +msgstr "شارة التنافسية" #. module: hr_gamification #: model:ir.model,name:hr_gamification.model_gamification_badge_user msgid "Gamification User Badge" -msgstr "" +msgstr "شارة مستخدم التنافسية" #. module: hr_gamification #: model:ir.model,name:hr_gamification.model_gamification_badge_user_wizard msgid "Gamification User Badge Wizard" -msgstr "" +msgstr "معالج شارة مستخدم التنافسية" #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_res_users__goal_ids @@ -141,22 +146,22 @@ msgstr "تاريخ الأهداف" #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.hr_hr_employee_view_form msgid "Grant a Badge" -msgstr "امنح شارة" +msgstr "منح شارة" #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.hr_hr_employee_view_form msgid "Grant this employee his first badge" -msgstr "" +msgstr "منح هذا المستخدم شارته الأولى" #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.hr_badge_form_view msgid "Granted" -msgstr "" +msgstr "ممنوح" #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_gamification_badge__granted_employees_count msgid "Granted Employees Count" -msgstr "" +msgstr "عدد الموظفين الممنوحين شارات" #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_hr_employee__has_badges @@ -188,7 +193,7 @@ msgstr "مكافأة الموظف بـ" #: code:addons/hr_gamification/models/gamification.py:18 #, python-format msgid "The selected employee does not correspond to the selected user." -msgstr "الموظف المحدد لا يتفق مع المستخدم المحدد." +msgstr "الموظف المختار غير متوافق مع المستخدم المختار." #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_gamification_badge_user_wizard__user_id @@ -203,19 +208,19 @@ msgstr "المستخدمون" #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.view_badge_wizard_reward msgid "What are you thankful for?" -msgstr "" +msgstr "علام أنت ممتن؟" #. module: hr_gamification #: code:addons/hr_gamification/wizard/gamification_badge_user_wizard.py:22 #, python-format msgid "You can not send a badge to yourself." -msgstr "" +msgstr "لا يمكنك إرسال شارة لنفسك." #. module: hr_gamification #: code:addons/hr_gamification/wizard/gamification_badge_user_wizard.py:19 #, python-format msgid "You can send badges only to employees linked to a user." -msgstr "يمكنك ارسال الشارات فقط للموظفين المرتبطين بمستخدم." +msgstr "يمكنك إرسال الشارات للموظفين المرتبطين بمستخدم فقط." #. module: hr_gamification #: model_terms:ir.ui.view,arch_db:hr_gamification.hr_hr_employee_view_form diff --git a/addons/hr_gamification/i18n/cs.po b/addons/hr_gamification/i18n/cs.po index 2849c089a7f..604df512b16 100644 --- a/addons/hr_gamification/i18n/cs.po +++ b/addons/hr_gamification/i18n/cs.po @@ -124,7 +124,7 @@ msgstr "" #. module: hr_gamification #: model:ir.model,name:hr_gamification.model_gamification_badge_user_wizard msgid "Gamification User Badge Wizard" -msgstr "" +msgstr "Průvodce odznakem uživatele Gamifikace" #. module: hr_gamification #: model:ir.model.fields,field_description:hr_gamification.field_res_users__goal_ids diff --git a/addons/hr_holidays/i18n/km.po b/addons/hr_holidays/i18n/km.po index 749556a064e..04869b11cd8 100644 --- a/addons/hr_holidays/i18n/km.po +++ b/addons/hr_holidays/i18n/km.po @@ -1117,7 +1117,7 @@ msgstr "" #: code:addons/hr_holidays/report/holidays_summary_report.py:113 #, python-format msgid "Form content is missing, this report cannot be printed." -msgstr "" +msgstr "កំហុសទម្រង់សំណុំបែបបទរបាយការណ៍នេះមិនអាចបោះពុម្ពបានទេ" #. module: hr_holidays #: model:ir.model.fields,field_description:hr_holidays.field_hr_holidays_summary_dept__date_from @@ -2069,7 +2069,7 @@ msgstr "លំដាប់" #: model_terms:ir.ui.view,arch_db:hr_holidays.view_hr_holidays_filter #: model_terms:ir.ui.view,arch_db:hr_holidays.view_hr_leave_allocation_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: hr_holidays #: model:hr.leave.type,name:hr_holidays.holiday_status_sl diff --git a/addons/hr_recruitment/i18n/cs.po b/addons/hr_recruitment/i18n/cs.po index ead6456bba8..ee8176a556b 100644 --- a/addons/hr_recruitment/i18n/cs.po +++ b/addons/hr_recruitment/i18n/cs.po @@ -1335,7 +1335,7 @@ msgstr "" #. module: hr_recruitment #: model_terms:ir.ui.view,arch_db:hr_recruitment.hr_employee_view_search msgid "Newly Hired" -msgstr "" +msgstr "Nově přijat" #. module: hr_recruitment #: model:ir.actions.act_window,name:hr_recruitment.hr_employee_action_from_department diff --git a/addons/hr_recruitment/i18n/km.po b/addons/hr_recruitment/i18n/km.po index 6d9cf4734d8..c054012f11f 100644 --- a/addons/hr_recruitment/i18n/km.po +++ b/addons/hr_recruitment/i18n/km.po @@ -1721,7 +1721,7 @@ msgstr "" #. module: hr_recruitment #: model_terms:ir.ui.view,arch_db:hr_recruitment.view_crm_case_jobs_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: hr_recruitment #: model:ir.model.fields,field_description:hr_recruitment.field_hr_applicant__source_id diff --git a/addons/hr_recruitment/i18n/vi.po b/addons/hr_recruitment/i18n/vi.po index e22ed6d0054..80a066bb4a2 100644 --- a/addons/hr_recruitment/i18n/vi.po +++ b/addons/hr_recruitment/i18n/vi.po @@ -765,7 +765,7 @@ msgstr "Miêu tả" #. module: hr_recruitment #: model:ir.model,name:hr_recruitment.model_digest_digest msgid "Digest" -msgstr "" +msgstr "Tiêu" #. module: hr_recruitment #: model_terms:ir.ui.view,arch_db:hr_recruitment.hr_job_simple_form diff --git a/addons/hr_timesheet_attendance/i18n/ar.po b/addons/hr_timesheet_attendance/i18n/ar.po index 8644e0b8245..29fc197927a 100644 --- a/addons/hr_timesheet_attendance/i18n/ar.po +++ b/addons/hr_timesheet_attendance/i18n/ar.po @@ -3,18 +3,18 @@ # * hr_timesheet_attendance # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Martin Trigaux, 2018 -# Osoul <baruni@osoul.ly>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Osama Ahmaro <osamaahmaro@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:19+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -31,12 +31,12 @@ msgstr "التاريخ" #. module: hr_timesheet_attendance #: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: hr_timesheet_attendance #: model:ir.actions.act_window,name:hr_timesheet_attendance.action_hr_timesheet_attendance_report msgid "HR Timesheet/Attendance Report" -msgstr "" +msgstr "تقرير سجل النشاط/الحضور" #. module: hr_timesheet_attendance #: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__id @@ -51,12 +51,12 @@ msgstr "آخر تعديل في" #. module: hr_timesheet_attendance #: model:ir.ui.menu,name:hr_timesheet_attendance.menu_hr_timesheet_attendance_report msgid "Timesheet / Attendance" -msgstr "" +msgstr "سجل النشاط / الحضور" #. module: hr_timesheet_attendance #: model:ir.model,name:hr_timesheet_attendance.model_hr_timesheet_attendance_report msgid "Timesheet Attendance Report" -msgstr "" +msgstr "تقرير حضور سجل النشاط" #. module: hr_timesheet_attendance #: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__total_attendance @@ -71,7 +71,7 @@ msgstr "مجموع الاختلافات" #. module: hr_timesheet_attendance #: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__total_timesheet msgid "Total Timesheet" -msgstr "سجل الدوام الكلي" +msgstr "سجل النشاط الكلي" #. module: hr_timesheet_attendance #: model:ir.model.fields,field_description:hr_timesheet_attendance.field_hr_timesheet_attendance_report__user_id @@ -82,4 +82,4 @@ msgstr "المستخدم" #: model_terms:ir.ui.view,arch_db:hr_timesheet_attendance.view_hr_timesheet_attendance_report_pivot #: model_terms:ir.ui.view,arch_db:hr_timesheet_attendance.view_hr_timesheet_attendance_report_search msgid "timesheet attendance" -msgstr "" +msgstr "حضور سجل النشاط" diff --git a/addons/iap/i18n/ar.po b/addons/iap/i18n/ar.po index e495330ae8c..6e6afcc495d 100644 --- a/addons/iap/i18n/ar.po +++ b/addons/iap/i18n/ar.po @@ -3,18 +3,19 @@ # * iap # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # Martin Trigaux, 2018 # Osoul <baruni@osoul.ly>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-02 10:05+0000\n" -"PO-Revision-Date: 2018-10-02 10:05+0000\n" -"Last-Translator: Osama Ahmaro <osamaahmaro@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:19+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -25,26 +26,26 @@ msgstr "" #. module: iap #: model_terms:ir.ui.view,arch_db:iap.iap_account_view_form msgid "Account Information" -msgstr "" +msgstr "معلومات الحساب" #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account__account_token msgid "Account Token" -msgstr "" +msgstr "كلمة سر الحساب" #. module: iap #. openerp-web #: code:addons/iap/static/src/js/crash_manager.js:23 #, python-format msgid "Buy credits at Odoo" -msgstr "" +msgstr "شراء رصيد في أودو" #. module: iap #. openerp-web #: code:addons/iap/static/src/xml/iap_templates.xml:41 #, python-format msgid "Buy more credits" -msgstr "" +msgstr "شراء رصيد أكثر" #. module: iap #. openerp-web @@ -58,7 +59,7 @@ msgstr "إلغاء" #: code:addons/iap/static/src/xml/iap_templates.xml:28 #, python-format msgid "Checking remaining credit ..." -msgstr "" +msgstr "جارٍ التحقق من الرصيد المتبقي..." #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account__company_id @@ -78,25 +79,25 @@ msgstr "أنشئ في" #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: iap #: model:ir.ui.menu,name:iap.iap_root_menu msgid "IAP" -msgstr "" +msgstr "IAP" #. module: iap #: model:ir.actions.act_window,name:iap.iap_account_action #: model:ir.model,name:iap.model_iap_account #: model_terms:ir.ui.view,arch_db:iap.iap_account_view_form msgid "IAP Account" -msgstr "" +msgstr "حساب IAP" #. module: iap #: model:ir.ui.menu,name:iap.iap_account_menu #: model_terms:ir.ui.view,arch_db:iap.iap_account_view_tree msgid "IAP Accounts" -msgstr "" +msgstr "حسابات IAP" #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account__id @@ -108,28 +109,28 @@ msgstr "المعرف" #: code:addons/iap/static/src/xml/iap_templates.xml:21 #, python-format msgid "In-App Purchases" -msgstr "" +msgstr "عمليات شراء داخل التطبيق" #. module: iap #. openerp-web #: code:addons/iap/static/src/js/crash_manager.js:51 #, python-format msgid "Insufficient Balance" -msgstr "" +msgstr "رصيد غير كاف" #. module: iap #. openerp-web #: code:addons/iap/static/src/xml/iap_templates.xml:31 #, python-format msgid "Insufficient credit" -msgstr "" +msgstr "رصيد غير كاف" #. module: iap #. openerp-web #: code:addons/iap/static/src/xml/iap_templates.xml:14 #, python-format msgid "Insufficient credit to perform this service." -msgstr "" +msgstr "الرصيد غير كافٍ لإجراء هذه الخدمة." #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account____last_update @@ -151,30 +152,30 @@ msgstr "آخر تحديث في" #: code:addons/iap/static/src/xml/iap_templates.xml:34 #, python-format msgid "Remaining :" -msgstr "" +msgstr "المتبقي:" #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account__service_name msgid "Service Name" -msgstr "" +msgstr "اسم الخدمة" #. module: iap #. openerp-web #: code:addons/iap/static/src/js/crash_manager.js:23 #, python-format msgid "Start a Trial at Odoo" -msgstr "" +msgstr "بدء نسخة تجريبية في أودو" #. module: iap #. openerp-web #: code:addons/iap/static/src/xml/iap_templates.xml:37 #, python-format msgid "Temporarily unavailable" -msgstr "" +msgstr "غير متاح مؤقتًا" #. module: iap #. openerp-web #: code:addons/iap/static/src/xml/iap_templates.xml:34 #, python-format msgid "credits" -msgstr "" +msgstr "رصيد" diff --git a/addons/iap/i18n/cs.po b/addons/iap/i18n/cs.po index 1f7625dff4c..07253cb86eb 100644 --- a/addons/iap/i18n/cs.po +++ b/addons/iap/i18n/cs.po @@ -42,7 +42,7 @@ msgstr "" #: code:addons/iap/static/src/xml/iap_templates.xml:41 #, python-format msgid "Buy more credits" -msgstr "" +msgstr "Koupit více kreditů" #. module: iap #. openerp-web @@ -149,7 +149,7 @@ msgstr "Naposled upraveno" #: code:addons/iap/static/src/xml/iap_templates.xml:34 #, python-format msgid "Remaining :" -msgstr "" +msgstr "Zbývající:" #. module: iap #: model:ir.model.fields,field_description:iap.field_iap_account__service_name @@ -168,11 +168,11 @@ msgstr "" #: code:addons/iap/static/src/xml/iap_templates.xml:37 #, python-format msgid "Temporarily unavailable" -msgstr "" +msgstr "dočasně nedostupné" #. module: iap #. openerp-web #: code:addons/iap/static/src/xml/iap_templates.xml:34 #, python-format msgid "credits" -msgstr "" +msgstr "kredity" diff --git a/addons/im_livechat/i18n/km.po b/addons/im_livechat/i18n/km.po index 6d7293dd29a..b784d9c7806 100644 --- a/addons/im_livechat/i18n/km.po +++ b/addons/im_livechat/i18n/km.po @@ -392,7 +392,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:im_livechat.mail_channel_view_form #: model_terms:ir.ui.view,arch_db:im_livechat.mail_channel_view_tree msgid "History" -msgstr "" +msgstr "ប្រវត្តិ" #. module: im_livechat #: model:ir.model.fields,field_description:im_livechat.field_im_livechat_report_channel__start_date_hour @@ -635,7 +635,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:im_livechat.im_livechat_report_channel_view_search #: model_terms:ir.ui.view,arch_db:im_livechat.im_livechat_report_operator_view_search msgid "Operator" -msgstr "" +msgstr "ប្រតិបត្តការណ៌" #. module: im_livechat #: model:ir.ui.menu,name:im_livechat.menu_reporting_livechat_operator diff --git a/addons/im_livechat_mail_bot/i18n/cs.po b/addons/im_livechat_mail_bot/i18n/cs.po index 6c45c056677..0a8f48020b6 100644 --- a/addons/im_livechat_mail_bot/i18n/cs.po +++ b/addons/im_livechat_mail_bot/i18n/cs.po @@ -40,7 +40,7 @@ msgstr "" #. module: im_livechat_mail_bot #: model:ir.model,name:im_livechat_mail_bot.model_mail_bot msgid "Mail Bot" -msgstr "" +msgstr "e-mailový robot" #. module: im_livechat_mail_bot #: selection:res.users,odoobot_state:0 diff --git a/addons/im_support/i18n/ar.po b/addons/im_support/i18n/ar.po index 8470af6b0de..94025fa6298 100644 --- a/addons/im_support/i18n/ar.po +++ b/addons/im_support/i18n/ar.po @@ -24,7 +24,7 @@ msgstr "" #: code:addons/im_support/static/src/js/support_channel.js:48 #, python-format msgid " (offline)" -msgstr "" +msgstr " (لا يوجد اتصال)" #. module: im_support #: model:ir.model,name:im_support.model_ir_http @@ -34,7 +34,7 @@ msgstr "" #. module: im_support #: model_terms:ir.ui.view,arch_db:im_support.support_qunit_suite msgid "IM Support Tests" -msgstr "" +msgstr "اختبارات دعم المحادثات الفورية" #. module: im_support #. openerp-web @@ -44,6 +44,8 @@ msgid "" "None of our operators are available. <a href='https://www.odoo.com/help' " "target='_blank'>Submit a ticket</a> to ask your question now." msgstr "" +"جميع ممثلينا مشغولون الآن. <a href='https://www.odoo.com/help' " +"target='_blank'>أرسل تذكرة</a> لطرح سؤالك الآن." #. module: im_support #. openerp-web @@ -65,4 +67,4 @@ msgstr "الدعم" #: code:addons/im_support/static/src/js/mail_manager.js:153 #, python-format msgid "The Support server can't be reached." -msgstr "" +msgstr "تعذّر الوصول لسيرفر الدعم." diff --git a/addons/l10n_ae/data/account_tax_template_data.xml b/addons/l10n_ae/data/account_tax_template_data.xml index 15ae5ae9869..5614c43941f 100644 --- a/addons/l10n_ae/data/account_tax_template_data.xml +++ b/addons/l10n_ae/data/account_tax_template_data.xml @@ -386,7 +386,7 @@ ]"/> </record> <record id="uae_sale_tax_reverse_charge_abu_dhabi" model="account.tax.template"> - <field name="name">Reverse Charge Provision (Abi Dhabi)</field> + <field name="name">Reverse Charge Provision (Abu Dhabi)</field> <field name="type_tax_use">sale</field> <field name="amount">5</field> <field name="amount_type">percent</field> @@ -829,6 +829,18 @@ }), ]"/> </record> + <record id="uae_purchase_tax_5_child_global" model="account.tax.template"> + <field name="name">TVA 5%</field> + <field name="type_tax_use">none</field> + <field name="amount">5</field> + <field name="amount_type">percent</field> + <field name="description">TVA 5%</field> + <field name="account_id" ref="uae_account_3726"/> + <field name="refund_account_id" ref="uae_account_3726"/> + <field name="tax_group_id" ref="ae_tax_group_5"/> + <field name="tag_ids" eval="[(6,0,[ref('tag_ae_02')])]"/> + <field name="chart_template_id" ref="uae_chart_template_standard"/> + </record> <record id="uae_purchase_tax_reverse_charge" model="account.tax.template"> <field name="name">Reverse Charge Provision</field> <field name="type_tax_use">purchase</field> diff --git a/addons/l10n_ch/models/account_invoice.py b/addons/l10n_ch/models/account_invoice.py index 1238d18bdd8..02af23c0f7c 100644 --- a/addons/l10n_ch/models/account_invoice.py +++ b/addons/l10n_ch/models/account_invoice.py @@ -26,7 +26,7 @@ class AccountMove(models.Model): l10n_ch_isr_valid = fields.Boolean(compute='_compute_l10n_ch_isr_valid', help='Boolean value. True iff all the data required to generate the ISR are present') l10n_ch_isr_sent = fields.Boolean(defaut=False, help="Boolean value telling whether or not the ISR corresponding to this invoice has already been printed or sent by mail.") - l10n_ch_currency_name = fields.Char(related='currency_id.name', readonly=False, string="Currency Name", help="The name of this invoice's currency") #This field is used in the "invisible" condition field of the 'Print ISR' button. + l10n_ch_currency_name = fields.Char(related='currency_id.name', readonly=True, string="Currency Name", help="The name of this invoice's currency") #This field is used in the "invisible" condition field of the 'Print ISR' button. @api.depends('invoice_partner_bank_id.bank_id.l10n_ch_postal_eur', 'invoice_partner_bank_id.bank_id.l10n_ch_postal_chf') def _compute_l10n_ch_isr_postal(self): diff --git a/addons/l10n_it_edi/data/account_invoice_demo.xml b/addons/l10n_it_edi/data/account_invoice_demo.xml index 81cef201c47..06be31a1ba3 100644 --- a/addons/l10n_it_edi/data/account_invoice_demo.xml +++ b/addons/l10n_it_edi/data/account_invoice_demo.xml @@ -3,7 +3,6 @@ <data noupdate="1"> <!-- add VAT, codice fiscal and tax system for main company --> <record id="base.main_company" model="res.company"> - <field name="country_id" ref="base.it"/> <field name="vat">IT00410128888</field> <field name="l10n_it_codice_fiscale">0123456789987654</field> <field name="l10n_it_tax_system">RF01</field> diff --git a/addons/l10n_multilang/i18n/km.po b/addons/l10n_multilang/i18n/km.po index f689587b847..06d456d37d4 100644 --- a/addons/l10n_multilang/i18n/km.po +++ b/addons/l10n_multilang/i18n/km.po @@ -65,7 +65,7 @@ msgstr "" #. module: l10n_multilang #: model:ir.model.fields,field_description:l10n_multilang.field_account_fiscal_position_template__name msgid "Fiscal Position Template" -msgstr "" +msgstr "គំរូទីតាំងថសារពើរពន្ធ" #. module: l10n_multilang #: model:ir.model,name:l10n_multilang.model_base_language_install @@ -90,7 +90,7 @@ msgstr "" #. module: l10n_multilang #: model:ir.model.fields,help:l10n_multilang.field_account_fiscal_position__note msgid "Legal mentions that have to be printed on the invoices." -msgstr "" +msgstr "ច្បាប់បានចែងថា ត្រូវតែព្រីនលើវិក័យប័ត្រ។" #. module: l10n_multilang #: model:ir.model.fields,field_description:l10n_multilang.field_account_account__name @@ -144,7 +144,7 @@ msgstr "" #. module: l10n_multilang #: model:ir.model,name:l10n_multilang.model_account_account_template msgid "Templates for Accounts" -msgstr "" +msgstr "គំរូសម្រាប់គណនី" #. module: l10n_multilang #: model:ir.model,name:l10n_multilang.model_account_tax_template diff --git a/addons/lunch/i18n/km.po b/addons/lunch/i18n/km.po index b09a03c0e0e..ce05c6544dd 100644 --- a/addons/lunch/i18n/km.po +++ b/addons/lunch/i18n/km.po @@ -787,6 +787,8 @@ msgid "" "Payments are used to register liquidity movements. You can process those " "payments by your own means or by using installed facilities." msgstr "" +"ការទូទាត់ត្រូវបានប្រើដើម្បីកត់ត្រាចលនាសាច់ប្រាក់។ " +"អ្នកអាចដំណើរការការទូទាត់ទាំងនោះដោយមធ្យោបាយរបស់អ្នកផ្ទាល់ឬដោយប្រើឧបករណ៍ដែលបានដំឡើង។" #. module: lunch #: model:ir.model.fields,field_description:lunch.field_lunch_order__previous_order_ids @@ -908,6 +910,9 @@ msgstr "" #: model_terms:ir.actions.act_window,help:lunch.lunch_cashmove_action_payment msgid "Register a payment" msgstr "" +"ចុះឈ្មោះការបង់ប្រាក់\n" +" \n" +" " #. module: lunch #: model:ir.model.fields,field_description:lunch.field_lunch_alert__saturday diff --git a/addons/mail/i18n/cs.po b/addons/mail/i18n/cs.po index a9cd7a68cbe..f7c66d5d02e 100644 --- a/addons/mail/i18n/cs.po +++ b/addons/mail/i18n/cs.po @@ -5220,6 +5220,8 @@ msgid "" "Tracked values are stored in a separate model. This field allow to " "reconstruct the tracking and to generate statistics on the model." msgstr "" +"Sledované hodnoty jsou uloženy v samostatném modelu. Toto pole umožňuje " +"rekonstruovat sledování a generovat statistiky modelu." #. module: mail #: model:ir.model.fields,field_description:mail.field_ir_model_fields__track_visibility @@ -5625,7 +5627,7 @@ msgstr "" #. module: mail #: model:ir.model.fields,help:mail.field_mail_compose_message__is_log msgid "Whether the message is an internal note (comment mode only)" -msgstr "" +msgstr "Zda je zpráva interní poznámkou (pouze režim poznámek)" #. module: mail #: model:ir.model.fields,help:mail.field_ir_model__is_mail_thread diff --git a/addons/mail/i18n/km.po b/addons/mail/i18n/km.po index 4d011c7803a..aaacbc66ea8 100644 --- a/addons/mail/i18n/km.po +++ b/addons/mail/i18n/km.po @@ -470,7 +470,7 @@ msgstr "" #: code:addons/mail/static/src/xml/activity.xml:37 #, python-format msgid "Activity type" -msgstr "" +msgstr "ប្រភេទឯកសារ" #. module: mail #. openerp-web @@ -619,7 +619,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_channel__alias_contact #: model:ir.model.fields,field_description:mail.field_res_users__alias_contact msgid "Alias Contact Security" -msgstr "" +msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន" #. module: mail #: model:ir.model.fields,field_description:mail.field_res_config_settings__alias_domain @@ -631,7 +631,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_alias_mixin__alias_name #: model:ir.model.fields,field_description:mail.field_mail_channel__alias_name msgid "Alias Name" -msgstr "" +msgstr "ឈ្មោះក្លែក្លាយ" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_alias__alias_domain @@ -645,7 +645,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_alias_mixin__alias_model_id #: model:ir.model.fields,field_description:mail.field_mail_channel__alias_model_id msgid "Aliased Model" -msgstr "" +msgstr "គំរូឈ្មោះក្លែងក្លាយ" #. module: mail #: model:ir.actions.act_window,name:mail.action_view_mail_alias @@ -713,6 +713,8 @@ msgid "" "Answers do not go in the original document discussion thread. This has an " "impact on the generated message-id." msgstr "" +"ចម្លើយមិនចូលទៅក្នុងខ្សែស្រឡាយការពិភាក្សាឯកសារដើមទេ។ " +"នេះមានផលប៉ះពាល់ដល់លេខសម្គាល់សារដែលបានបង្កើត " #. module: mail #: model:ir.model.fields,field_description:mail.field_email_template_preview__model_id @@ -1159,7 +1161,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__child_ids #: model:ir.model.fields,field_description:mail.field_mail_message__child_ids msgid "Child Messages" -msgstr "" +msgstr "សារកុមារ" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.email_template_preview_form @@ -1237,7 +1239,7 @@ msgstr "សរសេរអុីម៉ែល" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_compose_message__composition_mode msgid "Composition mode" -msgstr "" +msgstr "របៀបផ្សំ" #. module: mail #: model:ir.model,name:mail.model_res_config_settings @@ -1284,7 +1286,7 @@ msgstr "មាតិកា" #: model:ir.model.fields,field_description:mail.field_mail_mail__body #: model:ir.model.fields,field_description:mail.field_mail_message__body msgid "Contents" -msgstr "" +msgstr "មាតិកា" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_channel_partner__fold_state @@ -1429,7 +1431,7 @@ msgstr "កាលបរិច្ឆេត" #: code:addons/mail/static/src/xml/chatter.xml:93 #, python-format msgid "Dates" -msgstr "" +msgstr "កាលបរិច្ឆេទ" #. module: mail #: selection:ir.actions.server,activity_date_deadline_range_type:0 @@ -1668,6 +1670,7 @@ msgid "" "Do not keep a copy of the email in the document communication history (mass " "mailing only)" msgstr "" +"កុំរក្សាទុកច្បាប់ចំលងនៃអ៊ីមែលនៅក្នុងប្រវត្តិទំនាក់ទំនងឯកសារ (ផ្ញើរតាមមហាជន)" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.view_document_file_kanban @@ -1877,6 +1880,9 @@ msgid "" "Email address of the sender. This field is set when no matching partner is " "found and replaces the author_id field in the chatter." msgstr "" +"អាសយដ្ឋានអ៊ីមែលរបស់អ្នកផ្ញើ។ " +"កន្លែងនេះត្រូវបានកំណត់នៅពេលគ្មានដៃគូដែលផ្គូផ្គងត្រូវបានរកឃើញនិងជំនួសកន្លែង " +"author_id នៅក្នុង chatter ។" #. module: mail #: selection:mail.notification,failure_type:0 @@ -2045,7 +2051,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__starred_partner_ids #: model:ir.model.fields,field_description:mail.field_mail_message__starred_partner_ids msgid "Favorited By" -msgstr "" +msgstr "ចំណូលចិត្តដោយ" #. module: mail #. openerp-web @@ -2194,7 +2200,7 @@ msgstr "" #: code:addons/mail/static/src/xml/systray.xml:98 #, python-format msgid "Future" -msgstr "" +msgstr "អនាគត" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_search @@ -2222,7 +2228,7 @@ msgstr "" #: code:addons/mail/models/res_users.py:88 #, python-format msgid "Go to the configuration panel" -msgstr "" +msgstr "ចូលទៅផ្ទាំងការតំឡើង" #. module: mail #: selection:ir.actions.act_window.view,view_mode:0 @@ -2359,7 +2365,7 @@ msgstr "ID" msgid "" "ID of the parent record holding the alias (example: project holding the task" " creation alias)" -msgstr "" +msgstr "អត្ថសញ្ញាឯកសារអាណព្យាបាលដំកល់ដោយមិនមានភាពច្បាស់លាស់" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_activity__icon @@ -2485,7 +2491,7 @@ msgstr "" #: code:addons/mail/static/src/xml/discuss.xml:216 #, python-format msgid "Inbox" -msgstr "" +msgstr "សំបុត្រប្រអប់" #. module: mail #: model:ir.model.fields,help:mail.field_mail_activity__automated @@ -2498,7 +2504,7 @@ msgstr "" #: code:addons/mail/static/src/xml/activity.xml:33 #, python-format msgid "Info" -msgstr "" +msgstr "ពត៌មាន" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_activity_type__initial_res_model_id @@ -2847,7 +2853,7 @@ msgstr "" #: code:addons/mail/static/src/xml/thread.xml:55 #, python-format msgid "Loading" -msgstr "" +msgstr "ដំណើរការ" #. module: mail #. openerp-web @@ -2883,7 +2889,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_form_popup #: model_terms:ir.ui.view,arch_db:mail.view_server_action_form_template msgid "Log a note..." -msgstr "" +msgstr "កត់ចំណំា" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_form_popup @@ -3140,7 +3146,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__record_name #: model:ir.model.fields,field_description:mail.field_mail_message__record_name msgid "Message Record Name" -msgstr "" +msgstr "ឈ្មោះកំណត់ត្រាសារ" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_message_subtype__name @@ -3200,20 +3206,22 @@ msgid "" "Message type: email for email message, notification for system message, " "comment for other messages such as user replies" msgstr "" +"ប្រភេទសារ: សារអេឡិចត្រូនិចសម្រាប់សារអ៊ីម៉ែល, ការជូនដំណឹងសម្រាប់ប្រព័ន្ធសារ, " +"មតិយោបល់សម្រាប់សារផ្សេងទៀតដូចជាការឆ្លើយតបរបស់អ្នកប្រើ" #. module: mail #: model:ir.model.fields,help:mail.field_mail_compose_message__message_id #: model:ir.model.fields,help:mail.field_mail_mail__message_id #: model:ir.model.fields,help:mail.field_mail_message__message_id msgid "Message unique identifier" -msgstr "" +msgstr "អ្នកកំណត់អត្តសញ្ញាណតែមួយគត់សារ" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_compose_message__message_id #: model:ir.model.fields,field_description:mail.field_mail_mail__message_id #: model:ir.model.fields,field_description:mail.field_mail_message__message_id msgid "Message-Id" -msgstr "" +msgstr "សារលេខសម្គាល់" #. module: mail #: model:ir.actions.act_window,name:mail.action_view_mail_message @@ -3300,7 +3308,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__moderator_id #: model:ir.model.fields,field_description:mail.field_mail_message__moderator_id msgid "Moderated By" -msgstr "" +msgstr "សម្របសម្រួលដោយ" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_channel__moderation_ids @@ -3340,7 +3348,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__moderation_status #: model:ir.model.fields,field_description:mail.field_mail_message__moderation_status msgid "Moderation Status" -msgstr "" +msgstr "សម្របសម្រួលបច្ចុប្បន្នភាព" #. module: mail #: model:ir.model.fields,field_description:mail.field_res_users__moderation_counter @@ -3395,7 +3403,7 @@ msgstr "ឈ្មោះ" #: model:ir.model.fields,help:mail.field_mail_mail__record_name #: model:ir.model.fields,help:mail.field_mail_message__record_name msgid "Name get of the related document." -msgstr "" +msgstr "ឈ្មោះទទួលឯកសារពាក់ព័ន្ធ។" #. module: mail #: model:ir.model.fields,help:mail.field_email_template_preview__report_name @@ -3414,14 +3422,14 @@ msgstr "" #: model:ir.model.fields,help:mail.field_mail_message__needaction #: model_terms:ir.ui.view,arch_db:mail.view_message_search msgid "Need Action" -msgstr "" +msgstr "ត្រូវការសកម្មភាព" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_compose_message__need_moderation #: model:ir.model.fields,field_description:mail.field_mail_mail__need_moderation #: model:ir.model.fields,field_description:mail.field_mail_message__need_moderation msgid "Need moderation" -msgstr "" +msgstr "ត្រូវការល្មម" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_notification__res_partner_id @@ -3613,7 +3621,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__no_auto_thread #: model:ir.model.fields,field_description:mail.field_mail_message__no_auto_thread msgid "No threading for answers" -msgstr "" +msgstr "គ្មានខ្សែស្រឡាយសម្រាប់ចម្លើយ" #. module: mail #: model:ir.model.fields,field_description:mail.field_ir_actions_server__activity_note @@ -3650,17 +3658,17 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_message__notification_ids #: model:ir.model.fields,field_description:mail.field_mail_resend_message__notification_ids msgid "Notifications" -msgstr "" +msgstr "កំណត់សំគាល់" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_compose_message__notify msgid "Notify followers" -msgstr "" +msgstr "តាមដានកំណត់សំគាល់" #. module: mail #: model:ir.model.fields,help:mail.field_mail_compose_message__notify msgid "Notify followers of the document (mass post only)" -msgstr "" +msgstr "ជូនដំណឹងអ្នកតាមដានឯកសារ (ប្រកាសតែប៉ុណ្ណោះ)" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_blacklist__message_needaction_counter @@ -3834,6 +3842,9 @@ msgid "" "attached, even if they did not reply to it. If set, this will disable the " "creation of new records completely." msgstr "" +"លេខសម្គាល់ស្រេចចិត្តនៃខ្សែស្រឡាយ (កំណត់ត្រា) " +"ដែលសារទាំងអស់នឹងត្រូវបានភ្ជាប់ទោះបីជាពួកគេមិនឆ្លើយតបទៅវាក៏ដោយ។ " +"ប្រសិនបើបានកំណត់វានឹងបិទការបង្កើតកំណត់ត្រាថ្មីទាំងស្រុង។" #. module: mail #: model:ir.model.fields,help:mail.field_email_template_preview__mail_server_id @@ -3892,7 +3903,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__mail_server_id #: model:ir.model.fields,field_description:mail.field_mail_message__mail_server_id msgid "Outgoing mail server" -msgstr "" +msgstr "ម៉ាស៊ីនបម្រើសំបុត្រចេញ" #. module: mail #: selection:mail.activity,state:0 @@ -4149,7 +4160,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail.email_template_form #, python-format msgid "Preview" -msgstr "" +msgstr "ពីមុន" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.email_template_preview_form @@ -4252,7 +4263,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail.email_compose_message_wizard_form #: model_terms:ir.ui.view,arch_db:mail.view_message_form msgid "Recipients" -msgstr "" +msgstr "អ្នកទទួល" #. module: mail #: model:ir.model.fields,field_description:mail.field_mail_activity__recommended_activity_type_id @@ -4316,7 +4327,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_message__res_id #: model:ir.model.fields,field_description:mail.field_mail_wizard_invite__res_id msgid "Related Document ID" -msgstr "" +msgstr "លេខសម្គាល់ឯកសារដែលទាក់ទង" #. module: mail #: model:ir.model.fields,field_description:mail.field_email_template_preview__model @@ -4486,7 +4497,7 @@ msgstr "" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.email_compose_message_wizard_form msgid "Save as new template" -msgstr "" +msgstr "រក្សាទុកជាគំរូថ្មី" #. module: mail #. openerp-web @@ -4727,7 +4738,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mail.mail_activity_view_search #: model_terms:ir.ui.view,arch_db:mail.res_partner_view_search_inherit_mail msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: mail #: code:addons/mail/models/mail_channel.py:914 @@ -4861,7 +4872,7 @@ msgstr "" #. module: mail #: model_terms:ir.ui.view,arch_db:mail.email_compose_message_wizard_form msgid "Subject..." -msgstr "" +msgstr "ប្រធានបទ ..." #. module: mail #. openerp-web @@ -5127,6 +5138,8 @@ msgid "" "Tracked values are stored in a separate model. This field allow to " "reconstruct the tracking and to generate statistics on the model." msgstr "" +"តម្លៃដែលបានតាមដានត្រូវបានរក្សាទុកក្នុងគំរូដាច់ដោយឡែកមួយ។ " +"កន្លែងនេះអនុញ្ញាតឱ្យធ្វើការជួសជុលឡើងវិញនិងបង្កើតស្ថិតិលើគំរូ។" #. module: mail #: model:ir.model.fields,field_description:mail.field_ir_model_fields__track_visibility diff --git a/addons/mail/i18n/vi.po b/addons/mail/i18n/vi.po index 4bbf29e95d9..c5d554021e1 100644 --- a/addons/mail/i18n/vi.po +++ b/addons/mail/i18n/vi.po @@ -3471,7 +3471,7 @@ msgstr "" #: model:ir.model.fields,field_description:mail.field_mail_mail__moderation_status #: model:ir.model.fields,field_description:mail.field_mail_message__moderation_status msgid "Moderation Status" -msgstr "" +msgstr "Trạng thái kiểm duyệt" #. module: mail #: model:ir.model.fields,field_description:mail.field_res_users__moderation_counter diff --git a/addons/mail/static/src/js/activity.js b/addons/mail/static/src/js/activity.js index 607f1b8c553..77550f498f3 100644 --- a/addons/mail/static/src/js/activity.js +++ b/addons/mail/static/src/js/activity.js @@ -383,7 +383,7 @@ var BasicActivity = AbstractField.extend({ container: $markDoneBtn, title : _t("Feedback"), html: true, - trigger:'click', + trigger: 'manual', placement: 'right', // FIXME: this should work, maybe a bug in the popper lib content : function () { var $popover = $(QWeb.render('mail.activity_feedback_form', { @@ -400,6 +400,11 @@ var BasicActivity = AbstractField.extend({ $popover.find('#activity_feedback').focus(); self._bindPopoverFocusout($(this)); }).popover('show'); + } else { + var popover = $markDoneBtn.data('bs.popover'); + if ($('#' + popover.tip.id).length === 0) { + popover.show(); + } } }, /** diff --git a/addons/mail/static/src/js/models/threads/dm_chat.js b/addons/mail/static/src/js/models/threads/dm_chat.js index c0ba9c527b0..78cc01a7044 100644 --- a/addons/mail/static/src/js/models/threads/dm_chat.js +++ b/addons/mail/static/src/js/models/threads/dm_chat.js @@ -101,6 +101,19 @@ var DMChat = TwoUserChannel.extend(ChannelSeenMixin, { getStatus: function () { return this.call('mail_service', 'getImStatus', { partnerID: this._directPartnerID }); }, + + /** + * @param {Object} data + * @param {string} data.outOfOfficeMessage + * @param {string} data.outOfOfficeDateEnd + */ + updateOutOfOfficeInfo: function (data) { + this._outOfOfficeMessage = data.outOfOfficeMessage; + this._outOfOfficeDateEnd = data.outOfOfficeDateEnd; + this.call('mail_service', 'getMailBus').trigger('updated_out_of_office', { + threadID: this.getID(), + }); + } }); return DMChat; diff --git a/addons/mail/static/src/js/models/threads/document_thread.js b/addons/mail/static/src/js/models/threads/document_thread.js index 08e441610ee..b4f1df097cf 100644 --- a/addons/mail/static/src/js/models/threads/document_thread.js +++ b/addons/mail/static/src/js/models/threads/document_thread.js @@ -329,7 +329,9 @@ var DocumentThread = Thread.extend({ .then(function (messages) { messages[0].model = resModel; messages[0].res_id = resID; - self.call('mail_service', 'addMessage', messages[0]); + self.call('mail_service', 'addMessage', messages[0], { + postedFromDocumentThread: true, + }); return messages[0]; }); }); diff --git a/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js b/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js index 7d97538dbb9..3c98836dc70 100644 --- a/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js +++ b/addons/mail/static/src/js/models/threads/mixins/thread_typing_mixin.js @@ -171,11 +171,15 @@ var ThreadTypingMixin = { if (this._isTypingMyselfInfo(params)) { return; } + var partnerID = params.partnerID; this._othersTypingTimers.registerTimer({ - timeoutCallbackArguments: [params.partnerID], - timerID: params.partnerID, + timeoutCallbackArguments: [partnerID], + timerID: partnerID, }); - this._typingPartnerIDs.push(params.partnerID); + if (_.contains(this._typingPartnerIDs, partnerID)) { + return; + } + this._typingPartnerIDs.push(partnerID); this._warnUpdatedTypingPartners(); }, /** @@ -209,6 +213,9 @@ var ThreadTypingMixin = { unregisterTyping: function (params) { var partnerID = params.partnerID; this._othersTypingTimers.unregisterTimer({ timerID: partnerID }); + if (!_.contains(this._typingPartnerIDs, partnerID)) { + return; + } this._typingPartnerIDs = _.reject(this._typingPartnerIDs, function (id) { return id === partnerID; }); diff --git a/addons/mail/static/src/js/services/mail_document_thread_manager.js b/addons/mail/static/src/js/services/mail_document_thread_manager.js index f1d9eefb44a..acf06461a04 100644 --- a/addons/mail/static/src/js/services/mail_document_thread_manager.js +++ b/addons/mail/static/src/js/services/mail_document_thread_manager.js @@ -48,23 +48,16 @@ MailManager.include({ * * @override * @param {Object} data - * @param {Array} [data.author_id] [int, string] where int is server ID of - * the author, and string is the name of the author. * @param {integer} data.id server ID of the message - * @param {string} [data.model] the model name of the document that this - * message is related to. - * @param {integer} [data.res_id] the ID of the document that this message - * is related to. - * + * @param {Object} [options] + * @param {boolean} [options.postedFromDocumentThread=false] */ - addMessage: function (data) { + addMessage: function (data, options) { var message = this.getMessage(data.id); if ( !message && - data.res_id && - data.model && - data.author_id && - data.author_id[0] === session.partner_id + options && + options.postedFromDocumentThread ) { var key = this.DOCUMENT_THREAD_MESSAGE_KEY; this.call('local_storage', 'setItem', key, data); diff --git a/addons/mail/static/src/js/services/mail_notification_manager.js b/addons/mail/static/src/js/services/mail_notification_manager.js index caf0c3c4e12..c22276867b1 100644 --- a/addons/mail/static/src/js/services/mail_notification_manager.js +++ b/addons/mail/static/src/js/services/mail_notification_manager.js @@ -417,6 +417,9 @@ MailManager.include({ this._handlePartnerUserConnectionNotification(data); } else if (data.info === 'channel_seen') { this._handlePartnerChannnelSeenNotification(data); + } else if (data.type === 'simple_notification') { + var title = _.escape(data.title), message = _.escape(data.message); + data.warning ? this.do_warn(title, message, data.sticky) : this.do_notify(title, message, data.sticky); } else { this._handlePartnerChannelNotification(data); } diff --git a/addons/mail/static/src/js/services/mail_status_manager.js b/addons/mail/static/src/js/services/mail_status_manager.js index 7891461c9af..a40299a02d5 100644 --- a/addons/mail/static/src/js/services/mail_status_manager.js +++ b/addons/mail/static/src/js/services/mail_status_manager.js @@ -54,13 +54,45 @@ MailManager.include({ updateImStatus: function (statusList) { var updatedIDs = []; var self = this; + var dmChat; + var toUpdateOutOfOfficeChatIDs = []; _.each(statusList, function (status) { if (self._imStatus[status.id] === status.im_status) { return; } + if ( + status.im_status.indexOf('leave') !== -1 || + ( + self._imStatus[status.id] && + self._imStatus[status.id].indexOf('leave') !== -1 + ) + ) { + dmChat = self.getDMChatFromPartnerID(status.id); + if (dmChat) { + toUpdateOutOfOfficeChatIDs.push(dmChat.getID()); + } + } updatedIDs.push(status.id); self._imStatus[status.id] = status.im_status; }); + if (!_.isEmpty(toUpdateOutOfOfficeChatIDs)) { + this._rpc({ + model: 'mail.channel', + method: 'channel_info', + args: [toUpdateOutOfOfficeChatIDs], + }).then(function (channelsInfo) { + _.each(channelsInfo, function (channelInfo) { + dmChat = self.getChannel(channelInfo.id); + if (!dmChat) { + return; + } + dmChat.updateOutOfOfficeInfo({ + outOfOfficeMessage: channelInfo.direct_partner[0].out_of_office_message, + outOfOfficeDateEnd: channelInfo.direct_partner[0].out_of_office_date_end, + }); + }); + }); + } if (! _.isEmpty(updatedIDs)) { this._mailBus.trigger('updated_im_status', updatedIDs); // useful for thread window header this._renderImStatus(updatedIDs); diff --git a/addons/mail/static/src/js/services/mail_window_manager.js b/addons/mail/static/src/js/services/mail_window_manager.js index 6214fc8b5b7..81f0ef7e97c 100644 --- a/addons/mail/static/src/js/services/mail_window_manager.js +++ b/addons/mail/static/src/js/services/mail_window_manager.js @@ -344,6 +344,7 @@ MailManager.include({ .on('is_thread_bottom_visible', this, this._onIsThreadBottomVisible) .on('unsubscribe_from_channel', this, this._onUnsubscribeFromChannel) .on('updated_im_status', this, this._onUpdatedImStatus) + .on('updated_out_of_office', this, this._onUpdatedOutOfOffice) .on('update_thread_unread_counter', this, this._onUpdateThreadUnreadCounter); core.bus.on('resize', this, _.debounce(this._repositionThreadWindows.bind(this), 100)); @@ -701,6 +702,18 @@ MailManager.include({ }); }, /** + * @private + * @param {Object} data + * @param {integer} data.threadID + */ + _onUpdatedOutOfOffice: function (data) { + var threadWindow = this._getThreadWindow(data.threadID); + if (!threadWindow) { + return; + } + threadWindow.renderOutOfOffice(); + }, + /** * Called when a thread has its unread counter that has changed. * The unread counter on the thread windows should be updated. * diff --git a/addons/mail/static/src/js/thread_windows/thread_window.js b/addons/mail/static/src/js/thread_windows/thread_window.js index 9999014a08d..16d5cd31c86 100644 --- a/addons/mail/static/src/js/thread_windows/thread_window.js +++ b/addons/mail/static/src/js/thread_windows/thread_window.js @@ -6,6 +6,7 @@ var BasicComposer = require('mail.composer.Basic'); var core = require('web.core'); +var QWeb = core.qweb; var _t = core._t; /** @@ -153,6 +154,23 @@ var ThreadWindow = AbstractThreadWindow.extend({ removePassive: function () { this._passive = false; }, + renderOutOfOffice: function () { + var $outOfOffice = this.$('.o_out_of_office'); + if (!this.getOutOfOfficeInfo() && !this.getOutOfOfficeMessage()) { + if ($outOfOffice.length) { + $outOfOffice.remove(); + } + return; + } + var $newOutOfOffice = $(QWeb.render('mail.thread_window.OutOfOffice', { + widget: this, + })); + if ($outOfOffice.length) { + $outOfOffice.replaceWith($newOutOfOffice); + } else { + $newOutOfOffice.insertAfter(this.$('.o_thread_window_header')); + } + }, /** * Update this thread window * diff --git a/addons/mail/static/src/scss/abstract_thread_window.scss b/addons/mail/static/src/scss/abstract_thread_window.scss index f49797e928f..ab868b5dc18 100644 --- a/addons/mail/static/src/scss/abstract_thread_window.scss +++ b/addons/mail/static/src/scss/abstract_thread_window.scss @@ -39,8 +39,9 @@ $o-mail-thread-window-zindex: $zindex-modal + 1 !default; padding: 8px; @include media-breakpoint-down(sm) { + align-items: center; height: $o-mail-chat-header-height; - padding-top: 12px; + padding: 0; border-radius: 0px; .o_thread_window_title { font-size: 16px; @@ -48,7 +49,9 @@ $o-mail-thread-window-zindex: $zindex-modal + 1 !default; } .o_thread_window_close { - font-size: 17px; + $o-close-font-size: 17px; + padding: (($o-mail-chat-header-height - $o-close-font-size) / 2); + font-size: $o-close-font-size; color: white; } } diff --git a/addons/mail/static/src/scss/discuss.scss b/addons/mail/static/src/scss/discuss.scss index 8c5780a7185..6092ab733fc 100644 --- a/addons/mail/static/src/scss/discuss.scss +++ b/addons/mail/static/src/scss/discuss.scss @@ -287,7 +287,8 @@ } .o_mail_discuss_content { - flex: 1 0 0; + flex: 1 1 auto; + min-height: 0; margin-left: 10px; margin-right: 10px; background-color: transparent; diff --git a/addons/mail/static/src/xml/abstract_thread_window.xml b/addons/mail/static/src/xml/abstract_thread_window.xml index 89c45323c7a..9bc83b79242 100644 --- a/addons/mail/static/src/xml/abstract_thread_window.xml +++ b/addons/mail/static/src/xml/abstract_thread_window.xml @@ -66,7 +66,7 @@ --> <t t-name="mail.AbstractThreadWindow.HeaderContent"> <span t-if="widget.isMobile()"> - <a href="#" class="o_thread_window_close fa fa-1x fa-arrow-left mr4" aria-label="Close chat window" title="Close chat window"/> + <a href="#" class="o_thread_window_close fa fa-1x fa-arrow-left" aria-label="Close chat window" title="Close chat window"/> </span> <span class="o_thread_window_title"> <t t-if="status" t-call="mail.UserStatus"/> diff --git a/addons/mail/static/src/xml/thread_window.xml b/addons/mail/static/src/xml/thread_window.xml index 76a130d1ba2..a9e2131cbdb 100644 --- a/addons/mail/static/src/xml/thread_window.xml +++ b/addons/mail/static/src/xml/thread_window.xml @@ -6,13 +6,7 @@ --> <t t-name="mail.ThreadWindow" t-extend="mail.AbstractThreadWindow"> <t t-jquery=".o_thread_window_header" t-operation="after"> - <div class="o_out_of_office" t-if="widget.getOutOfOfficeInfo() or widget.getOutOfOfficeMessage()"> - <div class="o_out_of_office_info" t-if="widget.getOutOfOfficeInfo()" t-esc="widget.getOutOfOfficeInfo()"/> - <div class="o_out_of_office_text o_text_wrap" t-if="widget.getOutOfOfficeMessage()"> - <t t-esc="widget.getOutOfOfficeMessage()"/> - <a href="#" class="o_out_of_office_read_more_less_button">Read more</a> - </div> - </div> + <t t-call="mail.thread_window.OutOfOffice" t-if="widget.getOutOfOfficeInfo() or widget.getOutOfOfficeMessage()"/> <div t-if="!widget.hasThread()" class="o_thread_search_input"> <span> To: </span> <input type="text" placeholder="User name"/> @@ -21,6 +15,17 @@ </t> <!-- + @param {mail.ThreadWindow} widget + --> + <div class="o_out_of_office" t-name="mail.thread_window.OutOfOffice"> + <div class="o_out_of_office_info" t-if="widget.getOutOfOfficeInfo()" t-esc="widget.getOutOfOfficeInfo()"/> + <div class="o_out_of_office_text o_text_wrap" t-if="widget.getOutOfOfficeMessage()"> + <t t-esc="widget.getOutOfOfficeMessage()"/> + <a href="#" class="o_out_of_office_read_more_less_button">Read more</a> + </div> + </div> + + <!-- @param {string} expandTitle text to display on mouse hover (title attribute) --> <t t-extend="mail.AbstractThreadWindow.HeaderContent"> diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js index dd7078ec6f0..bed4d682d10 100644 --- a/addons/mail/static/tests/chatter_tests.js +++ b/addons/mail/static/tests/chatter_tests.js @@ -7,6 +7,7 @@ var core = require('web.core'); var FormView = require('web.FormView'); var KanbanView = require('web.KanbanView'); var testUtils = require('web.test_utils'); +var concurrency = require('web.concurrency'); var createView = testUtils.createView; @@ -1858,6 +1859,74 @@ QUnit.test('form activity widget: schedule next activity', async function (asser form.destroy(); }); +QUnit.test('form activity widget: do not close activity popover on click', async function (assert) { + assert.expect(3); + this.data.partner.records[0].activity_ids = [1]; + this.data.partner.records[0].activity_state = 'today'; + this.data['mail.activity'].records = [{ + id: 1, + display_name: "An activity", + date_deadline: moment().format("YYYY-MM-DD"), // now + can_write: true, + state: "today", + user_id: 2, + create_user_id: 2, + activity_type_id: 2, + }]; + + const form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + services: this.services, + arch: `<form string="Partners"> + <sheet> + <field name="foo"/> + </sheet> + <div class="oe_chatter"> + <field name="message_ids" widget="mail_thread"/> + <field name="activity_ids" widget="mail_activity"/> + </div> + </form>`, + res_id: 2, + mockRPC(route, args) { + if (route === '/web/dataset/call_kw/mail.activity/action_feedback_schedule_next') { + return Promise.resolve(); + } + return this._super.apply(this, arguments); + }, + intercepts: { + do_action(ev) { + ev.data.options.on_close(); + }, + }, + }); + + //Schedule next activity + await testUtils.dom.click(form.$('.o_mail_activity .o_mark_as_done[data-activity-id=1]')); + + for (let i = 0; i < 2; i++) { + // click twice in feedback area + await testUtils.dom.click(form.$('.o_mail_activity_feedback.popover textarea')); + const $popover = form.$('.o_mail_activity_feedback.popover'); + const $PopoverInDom = form.$(`#${$popover.attr('id')}`); + assert.isVisible( + $PopoverInDom, + "the feedback popover should still be visible on click"); + } + await concurrency.delay(250); // wait for popover transition + const $popover = form.$('.o_mail_activity_feedback.popover'); + if (!$popover) { + throw new Error("popover should be in DOM"); + } + const $PopoverInDom = form.$(`#${$popover.attr('id')}`); + assert.isVisible( + $PopoverInDom, + "the feedback popover should still be visible on click"); + + form.destroy(); +}); + QUnit.test('form activity widget: edit next activity', async function (assert) { assert.expect(3); diff --git a/addons/mail/static/tests/document_thread_window_tests.js b/addons/mail/static/tests/document_thread_window_tests.js index 51daf3a23b1..86d06ba36c4 100644 --- a/addons/mail/static/tests/document_thread_window_tests.js +++ b/addons/mail/static/tests/document_thread_window_tests.js @@ -48,7 +48,7 @@ QUnit.module('Document Thread', { }, records: [{ id: 1, - author_id: [1, 'Me'], + author_id: [partnerID, 'Me'], body: '<p>Some Message on a document</p>', channel_ids: [], model: 'some.res.model', diff --git a/addons/mail/static/tests/thread_window/basic_thread_window_tests.js b/addons/mail/static/tests/thread_window/basic_thread_window_tests.js index d5af9cf5357..7c3cfbdc793 100644 --- a/addons/mail/static/tests/thread_window/basic_thread_window_tests.js +++ b/addons/mail/static/tests/thread_window/basic_thread_window_tests.js @@ -726,6 +726,119 @@ QUnit.test('no out-of-office status in thread window', async function (assert) { parent.destroy(); }); +QUnit.test('auto-update out-of-office info on im_status change', async function (assert) { + assert.expect(5); + + var imStatusDefs = [testUtils.makeTestPromise(), testUtils.makeTestPromise()]; + var channelInfoDefs = [testUtils.makeTestPromise(), testUtils.makeTestPromise()]; + var timeoutMock = mailTestUtils.patchMailTimeouts(); + var step = 0; + + this.data = { + 'mail.message': { + fields: {}, + records: [], + }, + initMessaging: { + channel_slots: { + channel_channel: [{ + id: 1, + name: "DM", + channel_type: "chat", + message_unread_counter: 0, + direct_partner: [{ + id: 666, + name: 'DemoUser1', + im_status: 'online', + }], + }], + }, + }, + }; + + var parent = this.createParent({ + data: this.data, + services: this.services, + mockRPC: function (route, args) { + if (route === '/longpolling/im_status') { + step++; + if (step === 1) { + imStatusDefs[0].resolve(); + return Promise.resolve([ + { + id: 666, + im_status: 'leave', + }, + ]); + } else if (step === 2) { + imStatusDefs[1].resolve(); + return Promise.resolve([ + { + id: 666, + im_status: 'online', + }, + ]); + } + } + if (args.method === 'channel_info') { + if (step === 1) { + channelInfoDefs[0].resolve(); + return Promise.resolve([{ + id: 1, + direct_partner: [{ + out_of_office_message: "Leave me alone", + out_of_office_date_end: false, + }], + }]); + } + else if (step === 2) { + channelInfoDefs[1].resolve(); + return Promise.resolve([{ + id: 1, + direct_partner: [{ + out_of_office_message: false, + out_of_office_date_end: false, + }], + }]); + } + } + return this._super.apply(this, arguments); + }, + }); + await testUtils.nextTick(); + + // detach channel 1, so that it opens corresponding thread window. + parent.call('mail_service', 'getChannel', 1).detach(); + await testUtils.nextTick(); + + assert.containsNone($, '.o_out_of_office', + "should contain no out of office section on chat window initially"); + + timeoutMock.addTime(51*1000); // wait for next im status fetch + + await Promise.all([imStatusDefs[0], channelInfoDefs[0]]); + await testUtils.nextTick(); + assert.containsOnce($, '.o_out_of_office', + "should contain out of office section on chat window"); + assert.containsOnce($, '.o_out_of_office > .o_out_of_office_text', + "should contain out of office text on chat window"); + assert.ok( + $('.o_out_of_office > .o_out_of_office_text') + .text() + .replace(/\s/g, "") + .indexOf("Leavemealone") !== -1, + "should contain out of office text on chat window"); + timeoutMock.addTime(51*1000); // wait for next im status fetch + + await Promise.all([imStatusDefs[1], channelInfoDefs[1]]); + await testUtils.nextTick(); + assert.containsNone($, '.o_out_of_office', + "should no longer contain out of office section on chat window"); + + timeoutMock.runPendingTimeouts(); + parent.destroy(); +}); + }); }); }); diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index def7b58033b..cd0da38fbb0 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -328,6 +328,7 @@ class MailComposer(models.TransientModel): 'attachment_ids': [attach.id for attach in self.attachment_ids], 'author_id': self.author_id.id, 'email_from': self.email_from, + 'reply_to': self.reply_to, 'record_name': self.record_name, 'no_auto_thread': self.no_auto_thread, 'mail_server_id': self.mail_server_id.id, diff --git a/addons/mail_bot/i18n/cs.po b/addons/mail_bot/i18n/cs.po index 058f1da8015..b60684453f5 100644 --- a/addons/mail_bot/i18n/cs.po +++ b/addons/mail_bot/i18n/cs.po @@ -129,7 +129,7 @@ msgstr "Naposled změněno" #. module: mail_bot #: model:ir.model,name:mail_bot.model_mail_bot msgid "Mail Bot" -msgstr "" +msgstr "e-mailový robot" #. module: mail_bot #: code:addons/mail_bot/models/mail_bot.py:45 diff --git a/addons/maintenance/i18n/km.po b/addons/maintenance/i18n/km.po index 8dd3ab5d1ab..9d04fa7a7e2 100644 --- a/addons/maintenance/i18n/km.po +++ b/addons/maintenance/i18n/km.po @@ -154,12 +154,12 @@ msgstr "" #. module: maintenance #: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_contact msgid "Alias Contact Security" -msgstr "" +msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន" #. module: maintenance #: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_name msgid "Alias Name" -msgstr "" +msgstr "ឈ្មោះក្លែក្លាយ" #. module: maintenance #: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_domain @@ -169,7 +169,7 @@ msgstr "" #. module: maintenance #: model:ir.model.fields,field_description:maintenance.field_maintenance_equipment_category__alias_model_id msgid "Aliased Model" -msgstr "" +msgstr "គំរូឈ្មោះក្លែងក្លាយ" #. module: maintenance #: model_terms:ir.ui.view,arch_db:maintenance.maintenance_team_kanban @@ -184,7 +184,7 @@ msgstr "" #. module: maintenance #: model:ir.model.fields,field_description:maintenance.field_maintenance_request__archive msgid "Archive" -msgstr "" +msgstr "សម្រេចគោលដៅ" #. module: maintenance #: model_terms:ir.ui.view,arch_db:maintenance.hr_equipment_request_view_search @@ -565,7 +565,7 @@ msgstr "ID" msgid "" "ID of the parent record holding the alias (example: project holding the task" " creation alias)" -msgstr "" +msgstr "អត្ថសញ្ញាឯកសារអាណព្យាបាលដំកល់ដោយមិនមានភាពច្បាស់លាស់" #. module: maintenance #: model:ir.model.fields,help:maintenance.field_maintenance_equipment__message_unread @@ -950,6 +950,9 @@ msgid "" "attached, even if they did not reply to it. If set, this will disable the " "creation of new records completely." msgstr "" +"លេខសម្គាល់ស្រេចចិត្តនៃខ្សែស្រឡាយ (កំណត់ត្រា) " +"ដែលសារទាំងអស់នឹងត្រូវបានភ្ជាប់ទោះបីជាពួកគេមិនឆ្លើយតបទៅវាក៏ដោយ។ " +"ប្រសិនបើបានកំណត់វានឹងបិទការបង្កើតកំណត់ត្រាថ្មីទាំងស្រុង។" #. module: maintenance #: model:ir.ui.menu,name:maintenance.menu_m_reports_oee @@ -1185,7 +1188,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:maintenance.hr_equipment_request_view_search #: model_terms:ir.ui.view,arch_db:maintenance.hr_equipment_view_search msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: maintenance #: model:maintenance.equipment.category,name:maintenance.equipment_software diff --git a/addons/mass_mailing/i18n/km.po b/addons/mass_mailing/i18n/km.po index bc7a106267c..6127e001113 100644 --- a/addons/mass_mailing/i18n/km.po +++ b/addons/mass_mailing/i18n/km.po @@ -770,7 +770,7 @@ msgstr "" #. module: mass_mailing #: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_campaign_form msgid "Duplicate" -msgstr "" +msgstr "ត្រួត" #. module: mass_mailing #: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_list_kanban @@ -1162,7 +1162,7 @@ msgstr "" #: model:ir.model.fields,field_description:mass_mailing.field_mail_mass_mailing_list_contact_rel__list_id #: model:ir.model.fields,field_description:mass_mailing.field_survey_mail_compose_message__mailing_list_ids msgid "Mailing List" -msgstr "" +msgstr "តារាងសំបុត្រ" #. module: mass_mailing #: model:ir.actions.act_window,name:mass_mailing.action_view_mass_mailing_contacts @@ -1685,7 +1685,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_form #: model_terms:ir.ui.view,arch_db:mass_mailing.view_mail_mass_mailing_list_form msgid "Recipients" -msgstr "" +msgstr "អ្នកទទួល" #. module: mass_mailing #: model:ir.model.fields,field_description:mass_mailing.field_mail_mass_mailing__mailing_model_id diff --git a/addons/mass_mailing/i18n/vi.po b/addons/mass_mailing/i18n/vi.po index 88d904e8298..95afa1d6694 100644 --- a/addons/mass_mailing/i18n/vi.po +++ b/addons/mass_mailing/i18n/vi.po @@ -1326,7 +1326,7 @@ msgstr "Liên hệ gửi email hàng loạt" #: model:ir.model.fields,field_description:mass_mailing.field_mail_compose_message__mass_mailing_name #: model:ir.model.fields,field_description:mass_mailing.field_survey_mail_compose_message__mass_mailing_name msgid "Mass Mailing Name" -msgstr "" +msgstr "Tên gửi mail hàng loạt" #. module: mass_mailing #: model:ir.model,name:mass_mailing.model_mass_mailing_schedule_date diff --git a/addons/mass_mailing_crm/i18n/ar.po b/addons/mass_mailing_crm/i18n/ar.po index fc6d7c8b889..7154e190678 100644 --- a/addons/mass_mailing_crm/i18n/ar.po +++ b/addons/mass_mailing_crm/i18n/ar.po @@ -3,15 +3,15 @@ # * mass_mailing_crm # # Translators: -# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018 -# Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server 12.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-08 06:49+0000\n" -"PO-Revision-Date: 2018-10-08 06:49+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:20+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -22,35 +22,35 @@ msgstr "" #. module: mass_mailing_crm #: model:ir.model.fields,field_description:mass_mailing_crm.field_mail_mass_mailing__crm_lead_count msgid "Lead Count" -msgstr "" +msgstr "عدد الترشيحات" #. module: mass_mailing_crm #: model:mail.mass_mailing,name:mass_mailing_crm.mass_mail_lead_0 #: model:utm.source,name:mass_mailing_crm.mass_mail_lead_0_utm_source msgid "Lead Newsletter" -msgstr "" +msgstr "النشرة البريدية للترشيح" #. module: mass_mailing_crm #: model_terms:ir.ui.view,arch_db:mass_mailing_crm.mail_mass_mailing_view_form msgid "Leads" -msgstr "المرشحيين " +msgstr "الترشيحات" #. module: mass_mailing_crm #: model:ir.model,name:mass_mailing_crm.model_mail_mass_mailing msgid "Mass Mailing" -msgstr "المراسلات" +msgstr "المراسلات الجماعية" #. module: mass_mailing_crm #: model_terms:ir.ui.view,arch_db:mass_mailing_crm.mail_mass_mailing_view_form msgid "Opportunities" -msgstr "الفرص " +msgstr "الفرص" #. module: mass_mailing_crm #: model:ir.model.fields,field_description:mass_mailing_crm.field_mail_mass_mailing__crm_opportunities_count msgid "Opportunities Count" -msgstr "" +msgstr "عدد الفرص" #. module: mass_mailing_crm #: model:ir.model.fields,field_description:mass_mailing_crm.field_mail_mass_mailing__crm_lead_activated msgid "Use Leads" -msgstr "" +msgstr "استخدام الترشيحات" diff --git a/addons/mass_mailing_event/i18n/ar.po b/addons/mass_mailing_event/i18n/ar.po index 30b6033b7d7..861cd8c05d5 100644 --- a/addons/mass_mailing_event/i18n/ar.po +++ b/addons/mass_mailing_event/i18n/ar.po @@ -3,8 +3,7 @@ # * mass_mailing_event # # Translators: -# Martin Trigaux, 2018 -# Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 # msgid "" msgstr "" @@ -12,7 +11,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" "PO-Revision-Date: 2018-08-24 09:20+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -23,14 +22,14 @@ msgstr "" #. module: mass_mailing_event #: model_terms:ir.ui.view,arch_db:mass_mailing_event.event_event_view_form_inherit_mass_mailing msgid "<span class=\"o_stat_text\">Mail Attendees</span>" -msgstr "" +msgstr "<span class=\"o_stat_text\">إرسال رسالة للحضور</span>" #. module: mass_mailing_event #: model:ir.model,name:mass_mailing_event.model_event_event msgid "Event" -msgstr "الحدث" +msgstr "الفعالية" #. module: mass_mailing_event #: model:ir.model,name:mass_mailing_event.model_mail_mass_mailing msgid "Mass Mailing" -msgstr "المراسلات" +msgstr "المراسلات الجماعية" diff --git a/addons/mrp/i18n/km.po b/addons/mrp/i18n/km.po index ee0f635d6e1..9e19ca8aa31 100644 --- a/addons/mrp/i18n/km.po +++ b/addons/mrp/i18n/km.po @@ -1636,7 +1636,7 @@ msgstr "" #. module: mrp #: model_terms:ir.ui.view,arch_db:mrp.mrp_production_form_view msgid "Lock" -msgstr "" +msgstr "ចាក់សោរ" #. module: mrp #: model:ir.model.fields,field_description:mrp.field_mrp_workcenter_productivity__loss_id @@ -1914,7 +1914,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mrp.mrp_production_form_view #: model_terms:ir.ui.view,arch_db:mrp.mrp_production_workorder_form_view_inherit msgid "Miscellaneous" -msgstr "" +msgstr "ផ្សេងៗ" #. module: mrp #: model:ir.model.fields,field_description:mrp.field_mrp_product_produce_line__move_id @@ -2192,7 +2192,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mrp.workcenter_line_pivot #, python-format msgid "Operations" -msgstr "" +msgstr "ប្រតិបត្តិការ" #. module: mrp #: model_terms:ir.ui.view,arch_db:mrp.report_mrporder @@ -2733,7 +2733,7 @@ msgstr "" #: code:addons/mrp/static/src/xml/mrp.xml:10 #, python-format msgid "Quantity:" -msgstr "" +msgstr "បរិមាណ:" #. module: mrp #: model_terms:ir.ui.view,arch_db:mrp.view_mrp_production_filter @@ -3079,7 +3079,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mrp.mrp_unbuild_search_view #: model_terms:ir.ui.view,arch_db:mrp.view_mrp_production_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: mrp #: model:product.product,description:mrp.product_product_computer_desk_head diff --git a/addons/mrp_account/i18n/ar.po b/addons/mrp_account/i18n/ar.po index 09e8be7c35a..1deb88a1904 100644 --- a/addons/mrp_account/i18n/ar.po +++ b/addons/mrp_account/i18n/ar.po @@ -5,14 +5,15 @@ # Translators: # Mohammed Albasha <m.albasha.ma@gmail.com>, 2018 # Ghaith Gammar <g.gammar@saharaifs.net>, 2018 -# Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-02 10:06+0000\n" -"PO-Revision-Date: 2018-10-02 10:06+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:21+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -27,7 +28,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:mrp_bom_cost.product_product_view_form_normal_inherit_extended #: model_terms:ir.ui.view,arch_db:mrp_bom_cost.product_variant_easy_edit_view_bom_inherit msgid "Compute Price from BoM" -msgstr "" +msgstr "احتساب السعر من قائمة المواد" #. module: mrp_bom_cost #: model_terms:ir.ui.view,arch_db:mrp_bom_cost.product_product_ext_form_view2 @@ -37,8 +38,8 @@ msgid "" "Compute the price of the product using products and operations of related " "bill of materials, for manufactured products only." msgstr "" -"يحسب سعر المنتج باستخدام المنتجات والعمليات المقترن بفاتورة المواد " -"والمنتجات المصنعة فقط." +"يحتسب سعر المنتج باستخدام المنتجات والعمليات في قائمة المواد ذات الصلة، " +"للمنتجات المصنعة فقط." #. module: mrp_bom_cost #: model:ir.model,name:mrp_bom_cost.model_product_product @@ -57,3 +58,5 @@ msgid "" "The inventory valuation of some products %s is automated. You can only " "update their cost from the product form." msgstr "" +"تمت أتمتة تقييم المخزون لبعض المنتجات %s. لا يمكنك تحديث تكلفتهم إلا من خلال" +" نموذج المنتج." diff --git a/addons/note/i18n/km.po b/addons/note/i18n/km.po index ecfad101c71..c9b09a8a839 100644 --- a/addons/note/i18n/km.po +++ b/addons/note/i18n/km.po @@ -78,7 +78,7 @@ msgstr "" #. module: note #: model_terms:ir.ui.view,arch_db:note.view_note_note_filter msgid "Archive" -msgstr "" +msgstr "សម្រេចគោលដៅ" #. module: note #: model:ir.model.fields,field_description:note.field_note_note__message_attachment_count @@ -433,7 +433,7 @@ msgstr "" #. module: note #: model_terms:ir.ui.view,arch_db:note.view_note_note_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: note #: model:ir.model.fields,field_description:note.field_note_note__stage_id diff --git a/addons/pad/i18n/km.po b/addons/pad/i18n/km.po index ea1bd975ce2..091c768ed47 100644 --- a/addons/pad/i18n/km.po +++ b/addons/pad/i18n/km.po @@ -65,7 +65,7 @@ msgstr "កាលបរិច្ឆេតកែប្រែចុងក្រោ #: code:addons/pad/static/src/js/pad.js:147 #, python-format msgid "Loading" -msgstr "" +msgstr "ដំណើរការ" #. module: pad #: model:ir.model.fields,field_description:pad.field_res_company__pad_key diff --git a/addons/pad_project/i18n/ar.po b/addons/pad_project/i18n/ar.po index 8f64614bbbc..7ae96c2d9c3 100644 --- a/addons/pad_project/i18n/ar.po +++ b/addons/pad_project/i18n/ar.po @@ -3,15 +3,16 @@ # * pad_project # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" -"Project-Id-Version: Odoo Server saas~11.2\n" +"Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-03-22 14:10+0000\n" -"PO-Revision-Date: 2018-03-22 14:10+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:21+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -22,7 +23,7 @@ msgstr "" #. module: pad_project #: model:ir.model.fields,field_description:pad_project.field_project_task__description_pad msgid "Pad URL" -msgstr "" +msgstr "رابط باد" #. module: pad_project #: model:ir.model,name:pad_project.model_project_project @@ -37,15 +38,15 @@ msgstr "المهمة" #. module: pad_project #: model:ir.model.fields,field_description:pad_project.field_project_task__use_pad msgid "Use collaborative pad" -msgstr "" +msgstr "استخدام منصات تعاونية" #. module: pad_project #: model:ir.model.fields,help:pad_project.field_project_project__use_pads #: model:ir.model.fields,help:pad_project.field_project_task__use_pad msgid "Use collaborative pad for the tasks on this project." -msgstr "" +msgstr "استخدام منصات تعاونية لمهمات هذا المشروع." #. module: pad_project #: model:ir.model.fields,field_description:pad_project.field_project_project__use_pads msgid "Use collaborative pads" -msgstr "" +msgstr "استخدام منصات تعاونية" diff --git a/addons/partner_autocomplete/i18n/ar.po b/addons/partner_autocomplete/i18n/ar.po index ec558be1bc0..8637a950b78 100644 --- a/addons/partner_autocomplete/i18n/ar.po +++ b/addons/partner_autocomplete/i18n/ar.po @@ -26,7 +26,7 @@ msgstr "" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template msgid "(Time Now)" -msgstr "" +msgstr "(الوقت الآن)" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form @@ -34,6 +34,8 @@ msgid "" "<i class=\"fa fa-arrow-right\"/>\n" " Buy more credits" msgstr "" +"<i class=\"fa fa-arrow-right\"/>\n" +" شراء رصيد" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form @@ -41,6 +43,8 @@ msgid "" "<i class=\"fa fa-exclamation-triangle text-warning\"/> &nbsp; You don't " "have credits to auto-complete companies' data anymore." msgstr "" +"<i class=\"fa fa-exclamation-triangle text-warning\"/> &nbsp; لم تعد " +"تملك رصيدًا كافيًا لإكمال بيانات المؤسسات تلقائيًا." #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -48,6 +52,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-building text-primary\"/>\n" " <b>Company type:</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-building text-primary\"/>\n" +" <b>نوع المؤسسة:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -55,6 +61,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-calendar text-primary\"/>\n" " <b>Founded:</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-calendar text-primary\"/>\n" +" <b>أُسست:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -62,6 +70,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-cube text-primary\"/>\n" " <b>Technology Used :</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-cube text-primary\"/>\n" +" <b>التقنية المستخدمة:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -69,6 +79,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-envelope text-primary\"/>\n" " <b>Email :</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-envelope text-primary\"/>\n" +" <b>البريد الإلكتروني:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -76,6 +88,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-globe text-primary\"/>\n" " <b>Timezone :</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-globe text-primary\"/>\n" +" <b>المنطقة الزمنية:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -83,6 +97,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-industry text-primary\"/>\n" " <b>Sector:</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-industry text-primary\"/>\n" +" <b>القطاع:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -90,6 +106,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n" " <b>Annual revenue:</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n" +" <b>العائد السنوي:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -97,6 +115,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n" " <b>Estimated annual revenue:</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-money text-primary\"/>\n" +" <b>العائد السنوي المقدر:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -104,6 +124,8 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-phone text-primary\"/>\n" " <b>Phone :</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-phone text-primary\"/>\n" +" <b>الهاتف:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template @@ -111,16 +133,18 @@ msgid "" "<i class=\"fa fa-fw mr-2 fa-users text-primary\"/>\n" " <b>Employees:</b>" msgstr "" +"<i class=\"fa fa-fw mr-2 fa-users text-primary\"/>\n" +" <b>الموظفون:</b>" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form msgid "<span>&times;</span>" -msgstr "" +msgstr "<span>أوقات</span>" #. module: partner_autocomplete #: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner__additional_info msgid "Additional info" -msgstr "" +msgstr "معلومات إضافية" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.res_config_settings_view_form @@ -136,7 +160,7 @@ msgstr "المؤسسات" #: model:ir.model.fields,field_description:partner_autocomplete.field_res_company__partner_gid #: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner__partner_gid msgid "Company database ID" -msgstr "" +msgstr "معرف قاعدة بيانات المؤسسة" #. module: partner_autocomplete #: model:ir.model,name:partner_autocomplete.model_res_config_settings @@ -161,7 +185,7 @@ msgstr "أنشئ في" #. module: partner_autocomplete #: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: partner_autocomplete #: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync__id @@ -171,12 +195,12 @@ msgstr "المعرف" #. module: partner_autocomplete #: model:ir.model.fields,field_description:partner_autocomplete.field_res_config_settings__partner_autocomplete_insufficient_credit msgid "Insufficient credit" -msgstr "" +msgstr "رصيد غير كاف" #. module: partner_autocomplete #: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync__synched msgid "Is synched" -msgstr "" +msgstr "متزامن" #. module: partner_autocomplete #: model:ir.model.fields,field_description:partner_autocomplete.field_res_partner_autocomplete_sync____last_update @@ -203,17 +227,17 @@ msgstr "الشريك" #: model:ir.cron,cron_name:partner_autocomplete.ir_cron_partner_autocomplete #: model:ir.cron,name:partner_autocomplete.ir_cron_partner_autocomplete msgid "Partner Autocomplete : Sync with remote DB" -msgstr "" +msgstr "إكمال الشريك تلقائيًا: المزامنة مع قاعدة بيانات بعيدة" #. module: partner_autocomplete #: model:ir.model,name:partner_autocomplete.model_res_partner_autocomplete_sync msgid "Partner Autocomplete Sync" -msgstr "" +msgstr "مزامنة إكمال الشريك تلقائيًا" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template msgid "Partner created by Odoo Partner Autocomplete Service" -msgstr "" +msgstr "تم إنشاء الشريك من خلال خدمة إكمال الشريك تلقائيًا المقدمة من أودو" #. module: partner_autocomplete #. openerp-web @@ -227,14 +251,14 @@ msgstr "" #: code:addons/partner_autocomplete/static/src/js/partner_autocomplete_many2one.js:22 #, python-format msgid "Searching Autocomplete..." -msgstr "" +msgstr "البحث في الإكمال التلقائي..." #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template msgid "Twitter :" -msgstr "" +msgstr "تويتر:" #. module: partner_autocomplete #: model_terms:ir.ui.view,arch_db:partner_autocomplete.additional_info_template msgid "followers)" -msgstr "" +msgstr "المتابعون)" diff --git a/addons/payment/i18n/cs.po b/addons/payment/i18n/cs.po index 5ff07bdef66..ef01c997889 100644 --- a/addons/payment/i18n/cs.po +++ b/addons/payment/i18n/cs.po @@ -131,7 +131,7 @@ msgstr "" #. module: payment #: model_terms:ir.ui.view,arch_db:payment.view_partners_form_payment_defaultcreditcard msgid "<span class=\"o_stat_text\">Credit card(s)</span>" -msgstr "" +msgstr "<span class=\"o_stat_text\">Kreditní karta(y)</span>" #. module: payment #: model_terms:ir.ui.view,arch_db:payment.acquirer_form @@ -248,7 +248,7 @@ msgstr "" #: code:addons/payment/models/account_payment.py:57 #, python-format msgid "A token is required to create a new payment transaction." -msgstr "" +msgstr "K vytvoření nové platební transakce je vyžadován token." #. module: payment #: code:addons/payment/models/payment_acquirer.py:657 @@ -266,7 +266,7 @@ msgstr "" #: code:addons/payment/models/account_invoice.py:36 #, python-format msgid "A transaction can't be linked to invoices having different currencies." -msgstr "" +msgstr "Transakci nelze propojit s fakturami s různými měnami." #. module: payment #: code:addons/payment/models/account_invoice.py:41 @@ -383,7 +383,7 @@ msgstr "" #. module: payment #: model:ir.model.fields,field_description:payment.field_payment_acquirer__authorize_implemented msgid "Authorize Mechanism Supported" -msgstr "" +msgstr "Podporován mechanismus autorizace" #. module: payment #: model:payment.acquirer,name:payment.payment_acquirer_authorize @@ -480,7 +480,7 @@ msgstr "Platbu nelze nastavit" #: code:addons/payment/controllers/portal.py:225 #, python-format msgid "Cannot setup the payment." -msgstr "" +msgstr "Nelze nastavit platbu." #. module: payment #: model:ir.model.fields,field_description:payment.field_payment_acquirer__capture_manually @@ -496,7 +496,7 @@ msgstr "" #. module: payment #: model:ir.model.fields,help:payment.field_payment_acquirer__capture_manually msgid "Capture the amount from Odoo, when the delivery is completed." -msgstr "" +msgstr "Zachytit částku z Odoo, když je doručení dokončeno." #. module: payment #: model_terms:ir.ui.view,arch_db:payment.payment_acquirer_onboarding_wizard_form @@ -507,7 +507,7 @@ msgstr "" #: model:ir.actions.act_window,name:payment.action_open_payment_onboarding_payment_acquirer_wizard #: model_terms:ir.ui.view,arch_db:payment.payment_acquirer_onboarding_wizard_form msgid "Choose a payment method" -msgstr "" +msgstr "Zvolte způsob platby" #. module: payment #: model:ir.model.fields,field_description:payment.field_payment_transaction__partner_city @@ -688,7 +688,7 @@ msgstr "Hotovo" #. module: payment #: model:ir.model.fields,field_description:payment.field_payment_acquirer__done_msg msgid "Done Message" -msgstr "" +msgstr "Zpráva o dokončení" #. module: payment #: selection:payment.transaction,state:0 @@ -818,6 +818,8 @@ msgid "" "If you leave it empty, the payment acquirer will be available for all the " "countries." msgstr "" +"Pokud ji necháte prázdnou, bude příjemce platby k dispozici pro všechny " +"země." #. module: payment #. openerp-web @@ -939,12 +941,12 @@ msgstr "" #. module: payment #: model:ir.model.fields,help:payment.field_payment_icon__acquirer_ids msgid "List of Acquirers supporting this payment icon." -msgstr "" +msgstr "Seznam příjemců podporujících tuto ikonu platby." #. module: payment #: model:ir.model.fields,help:payment.field_payment_acquirer__website_published msgid "Make this payment acquirer available (Customer invoices, etc.)" -msgstr "" +msgstr "Zpřístupnit tohoto příjemce platby (faktury zákazníka atd.)" #. module: payment #: model_terms:ir.ui.view,arch_db:payment.pay_methods @@ -973,6 +975,9 @@ msgid "" "Electronic: Get paid automatically through a payment acquirer by requesting a transaction on a card saved by the customer when buying or subscribing online (payment token).\n" "Batch Deposit: Encase several customer checks at once by generating a batch deposit to submit to your bank. When encoding the bank statement in Odoo,you are suggested to reconcile the transaction with the batch deposit. Enable this option from the settings." msgstr "" +"Ruční: Zaplaťte v hotovosti, šekem nebo jinou metodou mimo Odoo.\n" +"Elektronické: Platba automaticky probíhá prostřednictvím příjemce plateb žádostí o transakci na kartě uloženou zákazníkem při nákupu nebo objednání online (platební token).\n" +"Dávkový vklad: Zapíše několik zákaznických šeků najednou vygenerováním dávkového vkladu, který odešle do banky. Při kódování výpisu z banky v Odoo vám doporučujeme transakci spárovat s vkladem dávky. Aktivujte tuto možnost z nastavení." #. module: payment #: model:ir.model.fields,field_description:payment.field_payment_acquirer__image_medium @@ -1001,12 +1006,12 @@ msgstr "" #. module: payment #: model:ir.model.fields,help:payment.field_payment_acquirer__pre_msg msgid "Message displayed to explain and help the payment process." -msgstr "" +msgstr "Zobrazí se zpráva, která vysvětluje a pomáhá platebnímu procesu." #. module: payment #: model:ir.model.fields,help:payment.field_payment_acquirer__error_msg msgid "Message displayed, if error is occur during the payment process." -msgstr "" +msgstr "Zobrazí se zpráva, pokud během procesu platby dojde k chybě." #. module: payment #: model:ir.model.fields,help:payment.field_payment_acquirer__cancel_msg @@ -1019,6 +1024,8 @@ msgid "" "Message displayed, if order is done successfully after having done the " "payment process." msgstr "" +"Zobrazí se zpráva, pokud je po úspěšném provedení platby úspěšně provedena " +"objednávka." #. module: payment #: model:ir.model.fields,help:payment.field_payment_acquirer__pending_msg @@ -1056,7 +1063,7 @@ msgstr "Název" #. module: payment #: model:ir.model.fields,help:payment.field_payment_token__name msgid "Name of the payment token" -msgstr "" +msgstr "Název tokenu platby" #. module: payment #: selection:payment.acquirer,save_token:0 diff --git a/addons/payment/i18n/km.po b/addons/payment/i18n/km.po index 6d58360ab21..5f29c4d94dc 100644 --- a/addons/payment/i18n/km.po +++ b/addons/payment/i18n/km.po @@ -1247,6 +1247,9 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:payment.pay_methods msgid "Payment Methods" msgstr "" +"វិធីទូទាត់លុយ\n" +" \n" +" " #. module: payment #: model:ir.model,name:payment.model_payment_token diff --git a/addons/payment/i18n/vi.po b/addons/payment/i18n/vi.po index dc7bdb9d8fd..9a291bce4a3 100644 --- a/addons/payment/i18n/vi.po +++ b/addons/payment/i18n/vi.po @@ -765,7 +765,7 @@ msgstr "Cố định phí quốc tế" #. module: payment #: model:ir.model.fields,field_description:payment.field_payment_acquirer__inbound_payment_method_ids msgid "For Incoming Payments" -msgstr "" +msgstr "Thanh toán doanh thu" #. module: payment #: selection:payment.transaction,type:0 diff --git a/addons/payment/static/src/js/payment_translations.js b/addons/payment/static/src/js/payment_translations.js new file mode 100644 index 00000000000..199dcc2a276 --- /dev/null +++ b/addons/payment/static/src/js/payment_translations.js @@ -0,0 +1,10 @@ +// TODO Remove me >=saas-12.5, this is a disgrace +// This is an hack to get the string_true and hover_false options translated on +// the boolean_button terminology widget. The terms are translated through +// _t(opt_terms.string_true) which will only work if the terms are already +// present in the translation map. +// This code does nothing but marks the strings as translatable +var _t = function(x) { return x; }; + +_t("Published"); +_t("Publish"); diff --git a/addons/payment/views/assets.xml b/addons/payment/views/assets.xml index 62fe9d2455f..49cc88c5536 100644 --- a/addons/payment/views/assets.xml +++ b/addons/payment/views/assets.xml @@ -13,4 +13,11 @@ <script type="text/javascript" src="/payment/static/src/js/payment_processing.js"></script> </xpath> </template> + + <template id="assets_backend" name="payment_assets_backend" inherit_id="web.assets_backend"> + <xpath expr="." position="inside"> + <script type="text/javascript" src="/payment/static/src/js/payment_translations.js"></script> + </xpath> + </template> + </odoo> diff --git a/addons/payment/views/res_partner_views.xml b/addons/payment/views/res_partner_views.xml index fa4d6e1ffaa..0585a43de5b 100644 --- a/addons/payment/views/res_partner_views.xml +++ b/addons/payment/views/res_partner_views.xml @@ -13,7 +13,8 @@ <button type="action" class="oe_stat_button" icon="fa-credit-card" name="%(payment.payment_token_action)d" - context="{'search_default_partner_id': active_id}"> + context="{'search_default_partner_id': active_id}" + attrs="{'invisible': [('payment_token_count', '=', 0)]}"> <div class="o_form_field o_stat_info"> <span class="o_stat_value"> <field name="payment_token_count" widget="statinfo" nolabel="1"/> diff --git a/addons/payment_adyen/i18n/ar.po b/addons/payment_adyen/i18n/ar.po index 3614a9197bf..3e05f79636c 100644 --- a/addons/payment_adyen/i18n/ar.po +++ b/addons/payment_adyen/i18n/ar.po @@ -3,18 +3,17 @@ # * payment_adyen # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 -# AMAAL RU <Fabu1410@yahoo.com>, 2018 -# Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" -"Project-Id-Version: Odoo Server saas~11.4\n" +"Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-02 09:56+0000\n" -"PO-Revision-Date: 2018-08-02 09:56+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:21+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -26,36 +25,36 @@ msgstr "" #: code:addons/payment_adyen/models/payment.py:187 #, python-format msgid "; multiple order found" -msgstr "تم ايجاد طلبات متعدده" +msgstr "؛ تم العثور على طلبات متعددة" #. module: payment_adyen #: code:addons/payment_adyen/models/payment.py:185 #, python-format msgid "; no order found" -msgstr "لايوجد طلبات" +msgstr "; لم يُعثر على طلبات" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Adyen" -msgstr "" +msgstr "Adyen" #. module: payment_adyen #: code:addons/payment_adyen/models/payment.py:229 #, python-format msgid "Adyen: feedback error" -msgstr "" +msgstr "Adyen: خطأ بالتغذية الرجعية" #. module: payment_adyen #: code:addons/payment_adyen/models/payment.py:197 #, python-format msgid "Adyen: invalid merchantSig, received %s, computed %s" -msgstr "" +msgstr "Adyen: merchantSig غير صالح، المستلم %s, المحسوب %s" #. module: payment_adyen #: code:addons/payment_adyen/models/payment.py:183 #, python-format msgid "Adyen: received data for reference %s" -msgstr "" +msgstr "Adyen: البيانات المستلمة لرقم الإشارة %s" #. module: payment_adyen #: code:addons/payment_adyen/models/payment.py:176 @@ -63,27 +62,27 @@ msgstr "" msgid "" "Adyen: received data with missing reference (%s) or missing pspReference " "(%s)" -msgstr "" +msgstr "Adyen: البيانات المستلمة ينقصها رقم إشارة (%s) أو pspReference (%s)" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Authorize.Net" -msgstr "" +msgstr "Authorize.Net" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Buckaroo" -msgstr "" +msgstr "Buckaroo" #. module: payment_adyen #: model_terms:ir.ui.view,arch_db:payment_adyen.acquirer_form_adyen msgid "How to configure your Adyen account?" -msgstr "" +msgstr "كيف تقوم بإعداد حسابك على Adyen؟" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Manual Configuration" -msgstr "" +msgstr "الإعدادات اليدوية" #. module: payment_adyen #: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__adyen_merchant_account @@ -93,17 +92,17 @@ msgstr "حساب التاجر" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Ogone" -msgstr "" +msgstr "Ogone" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "PayUmoney" -msgstr "" +msgstr "PayUmoney" #. module: payment_adyen #: model:ir.model,name:payment_adyen.model_payment_acquirer msgid "Payment Acquirer" -msgstr "طريقة السداد الإلكتروني" +msgstr "معالج السداد" #. module: payment_adyen #: model:ir.model,name:payment_adyen.model_payment_transaction @@ -113,7 +112,7 @@ msgstr "معاملة السداد" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Paypal" -msgstr "المستحق" +msgstr "Paypal" #. module: payment_adyen #: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__provider @@ -123,24 +122,24 @@ msgstr "المزود" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Sips" -msgstr "" +msgstr "Sips" #. module: payment_adyen #: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__adyen_skin_code msgid "Skin Code" -msgstr "" +msgstr "Skin Code" #. module: payment_adyen #: model:ir.model.fields,field_description:payment_adyen.field_payment_acquirer__adyen_skin_hmac_key msgid "Skin HMAC Key" -msgstr "" +msgstr "Skin HMAC Key" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Stripe" -msgstr "" +msgstr "Stripe" #. module: payment_adyen #: selection:payment.acquirer,provider:0 msgid "Wire Transfer" -msgstr "" +msgstr "تحويل بنكي" diff --git a/addons/payment_authorize/models/authorize_request.py b/addons/payment_authorize/models/authorize_request.py index 922d9df1bf1..e3e65648ee0 100644 --- a/addons/payment_authorize/models/authorize_request.py +++ b/addons/payment_authorize/models/authorize_request.py @@ -226,7 +226,7 @@ class AuthorizeAPI(): etree.SubElement(customer, "email").text = partner.email or '' response = self._authorize_request(root) res = dict() - if not response.find('customerProfileId'): + if response.find('customerProfileId') is None: # Warning: do not use bool(etree) as the semantics is very misleading _logger.warning( 'Unable to create customer payment profile, data missing from transaction. Transaction_id: %s - Partner_id: %s' % (transaction_id, partner) diff --git a/addons/payment_authorize/models/payment.py b/addons/payment_authorize/models/payment.py index 6361a211f16..b1d9a2e6a1e 100644 --- a/addons/payment_authorize/models/payment.py +++ b/addons/payment_authorize/models/payment.py @@ -25,6 +25,7 @@ class PaymentAcquirerAuthorize(models.Model): provider = fields.Selection(selection_add=[('authorize', 'Authorize.Net')]) authorize_login = fields.Char(string='API Login Id', required_if_provider='authorize', groups='base.group_user') authorize_transaction_key = fields.Char(string='API Transaction Key', required_if_provider='authorize', groups='base.group_user') + authorize_signature_key = fields.Char(string='API Signature Key', groups='base.group_user', compute="_compute_auth_signature_key", inverse="_inverse_auth_signature_key") def _get_feature_support(self): """Get advanced feature support by provider. @@ -42,6 +43,16 @@ class PaymentAcquirerAuthorize(models.Model): res['tokenize'].append('authorize') return res + def _compute_auth_signature_key(self): + ICP = self.env['ir.config_parameter'].sudo() + for acquirer in self.filtered(lambda a: a.provider == 'authorize'): + acquirer.authorize_signature_key = ICP.get_param('payment_authorize.signature_key_%s' % acquirer.id) + + def _inverse_auth_signature_key(self): + ICP = self.env['ir.config_parameter'].sudo() + for acquirer in self.filtered(lambda a: a.provider == 'authorize'): + ICP.set_param('payment_authorize.signature_key_%s' % acquirer.id, acquirer.authorize_signature_key) + def _get_authorize_urls(self, environment): """ Authorize URLs """ if environment == 'prod': @@ -57,13 +68,22 @@ class PaymentAcquirerAuthorize(models.Model): values['x_amount'], values['x_currency_code']]).encode('utf-8') - # [BACKWARD COMPATIBILITY] Check that the merchant did update his transaction - # key to signature key (end of MD5 support from Authorize.net) + # [BACKWARD COMPATIBILITY, 2nd edition] # The signature key is now '128-character hexadecimal format', while the # transaction key was only 16-character. - if len(values['x_trans_key']) == 128: - key = bytes.fromhex(values['x_trans_key']) - return hmac.new(key, data, hashlib.sha512).hexdigest().upper() + # One of 2 things should have happened: + # 1/ the Transaction Key has been replaced with the Signature Key value (patch from March 2019) + # => Use that to sign, but server-to-server won't work since it uses transaction key + # as its credentials + # 2/ the Signature key is a new field (patch from July 2019) + # => Use that field for the signature + + # FORWARD-PORT NOTE: forward part to saas-12.4 but no further + if len(values['x_trans_key']) == 128 and not self.authorize_signature_key: + self.authorize_signature_key = values['x_trans_key'] # store in the correct field + return hmac.new(bytes.fromhex(values['x_trans_key']), data, hashlib.sha512).hexdigest().upper() + elif self.authorize_signature_key: + return hmac.new(bytes.fromhex(self.authorize_signature_key), data, hashlib.sha512).hexdigest().upper() else: return hmac.new(values['x_trans_key'].encode('utf-8'), data, hashlib.md5).hexdigest() diff --git a/addons/payment_authorize/views/payment_views.xml b/addons/payment_authorize/views/payment_views.xml index 0237325e0c2..b60385ed9f0 100644 --- a/addons/payment_authorize/views/payment_views.xml +++ b/addons/payment_authorize/views/payment_views.xml @@ -9,6 +9,7 @@ <group attrs="{'invisible': [('provider', '!=', 'authorize')]}"> <field name="authorize_login"/> <field name="authorize_transaction_key" password="True"/> + <field name="authorize_signature_key" password="True"/> <a colspan="2" href="https://www.odoo.com/documentation/user/online/ecommerce/shopper_experience/authorize.html" target="_blank">How to get paid with Authorize.Net</a> </group> </xpath> diff --git a/addons/payment_buckaroo/i18n/ar.po b/addons/payment_buckaroo/i18n/ar.po index eecf6eb7694..2e9f8cfd04c 100644 --- a/addons/payment_buckaroo/i18n/ar.po +++ b/addons/payment_buckaroo/i18n/ar.po @@ -3,18 +3,18 @@ # * payment_buckaroo # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Fahad Alqahtani <fahad@cloudland.sa>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 -# AMAAL RU <Fabu1410@yahoo.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" -"Project-Id-Version: Odoo Server saas~11.4\n" +"Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-02 09:56+0000\n" -"PO-Revision-Date: 2018-08-02 09:56+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:22+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -26,40 +26,40 @@ msgstr "" #: code:addons/payment_buckaroo/models/payment.py:141 #, python-format msgid "; multiple order found" -msgstr "تم ايجاد طلبات متعدده" +msgstr "؛ تم العثور على طلبات متعددة" #. module: payment_buckaroo #: code:addons/payment_buckaroo/models/payment.py:139 #, python-format msgid "; no order found" -msgstr "لايوجد طلبات" +msgstr "; لم يُعثر على طلبات" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Adyen" -msgstr "" +msgstr "Adyen" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Authorize.Net" -msgstr "" +msgstr "Authorize.Net" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Buckaroo" -msgstr "" +msgstr "Buckaroo" #. module: payment_buckaroo #: code:addons/payment_buckaroo/models/payment.py:148 #, python-format msgid "Buckaroo: invalid shasign, received %s, computed %s, for data %s" -msgstr "" +msgstr "Buckaroo: shasign غير صالح، المستلم %s, المحسوب %s, للبيانات %s" #. module: payment_buckaroo #: code:addons/payment_buckaroo/models/payment.py:137 #, python-format msgid "Buckaroo: received data for reference %s" -msgstr "" +msgstr "Buckaroo: البيانات المستلمة لرقم الإشارة %s" #. module: payment_buckaroo #: code:addons/payment_buckaroo/models/payment.py:131 @@ -68,26 +68,28 @@ msgid "" "Buckaroo: received data with missing reference (%s) or pay_id (%s) or " "shasign (%s)" msgstr "" +"Buckaroo: البيانات المستلمة ينقصها رقم إشارة (%s) أو pay_id (%s) أو shasign " +"(%s)" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Manual Configuration" -msgstr "" +msgstr "الإعدادات اليدوية" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Ogone" -msgstr "" +msgstr "Ogone" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "PayUmoney" -msgstr "" +msgstr "PayUmoney" #. module: payment_buckaroo #: model:ir.model,name:payment_buckaroo.model_payment_acquirer msgid "Payment Acquirer" -msgstr "طريقة السداد الإلكتروني" +msgstr "معالج السداد" #. module: payment_buckaroo #: model:ir.model,name:payment_buckaroo.model_payment_transaction @@ -112,19 +114,19 @@ msgstr "المفتاح السري (SecretKey)" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Sips" -msgstr "" +msgstr "Sips" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Stripe" -msgstr "" +msgstr "Stripe" #. module: payment_buckaroo #: model:ir.model.fields,field_description:payment_buckaroo.field_payment_acquirer__brq_websitekey msgid "WebsiteKey" -msgstr "" +msgstr "مفتاح الموقع" #. module: payment_buckaroo #: selection:payment.acquirer,provider:0 msgid "Wire Transfer" -msgstr "" +msgstr "تحويل بنكي" diff --git a/addons/payment_ogone/i18n/ar.po b/addons/payment_ogone/i18n/ar.po index 0acbc1dee5f..7abf2750f57 100644 --- a/addons/payment_ogone/i18n/ar.po +++ b/addons/payment_ogone/i18n/ar.po @@ -3,19 +3,19 @@ # * payment_ogone # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Mustafa J. Kadhem <safi2266@gmail.com>, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 -# AMAAL RU <Fabu1410@yahoo.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:22+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -27,48 +27,48 @@ msgstr "" #: code:addons/payment_ogone/models/payment.py:242 #, python-format msgid "; multiple order found" -msgstr "تم ايجاد طلبات متعدده" +msgstr "؛ تم العثور على طلبات متعددة" #. module: payment_ogone #: code:addons/payment_ogone/models/payment.py:240 #, python-format msgid "; no order found" -msgstr "لايوجد طلبات" +msgstr "; لم يُعثر على طلبات" #. module: payment_ogone #: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_userid msgid "API User ID" -msgstr "معرف مستخدم واجهة برمجة التطبيقات API" +msgstr "معرف مستخدم واجهة برمجة التطبيقات" #. module: payment_ogone #: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_password msgid "API User Password" -msgstr "كلمة مرور المستخدم الخاصة بواجهة برمجة التطبيقات API" +msgstr "كلمة مرور المستخدم الخاصة بواجهة برمجة التطبيقات" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Adyen" -msgstr "" +msgstr "Adyen" #. module: payment_ogone #: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_alias_usage msgid "Alias Usage" -msgstr "" +msgstr "استخدام اللقب" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Authorize.Net" -msgstr "" +msgstr "Authorize.Net" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Buckaroo" -msgstr "" +msgstr "Buckaroo" #. module: payment_ogone #: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form msgid "CVC" -msgstr "" +msgstr "رمز التحقق من البطاقة" #. module: payment_ogone #: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form @@ -78,17 +78,17 @@ msgstr "رقم البطاقة" #. module: payment_ogone #: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form msgid "Cardholder name" -msgstr "" +msgstr "اسم حامل البطاقة" #. module: payment_ogone #: model_terms:ir.ui.view,arch_db:payment_ogone.ogone_s2s_form msgid "Expires (MM / YY)" -msgstr "" +msgstr "تنتهي صلاحيته في (MM / YY)" #. module: payment_ogone #: model_terms:ir.ui.view,arch_db:payment_ogone.acquirer_form_ogone msgid "How to configure your Ogone account?" -msgstr "" +msgstr "كيف تقوم بإعداد حسابك على Ogone؟" #. module: payment_ogone #: model:ir.model.fields,help:payment_ogone.field_payment_acquirer__ogone_alias_usage @@ -96,28 +96,30 @@ msgid "" "If you want to use Ogone Aliases, this default Alias Usage will be presented" " to the customer as the reason you want to keep his payment data" msgstr "" +"إذا أردت استخدام ألقاب Ogone، سيتم تقديم استخدام اللقب الافتراضي هذا للعميل " +"كسبب لرغبتك في الاحتفاظ ببيانات عمليات السداد التي يقوم بها" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Manual Configuration" -msgstr "" +msgstr "الإعدادات اليدوية" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Ogone" -msgstr "" +msgstr "Ogone" #. module: payment_ogone #: code:addons/payment_ogone/models/payment.py:249 #, python-format msgid "Ogone: invalid shasign, received %s, computed %s, for data %s" -msgstr "" +msgstr "Ogone: shasign غير صالح، المستلم %s, المحسوب %s, للبيانات %s" #. module: payment_ogone #: code:addons/payment_ogone/models/payment.py:238 #, python-format msgid "Ogone: received data for reference %s" -msgstr "" +msgstr "Ogone: البيانات المستلمة لرقم الإشارة %s" #. module: payment_ogone #: code:addons/payment_ogone/models/payment.py:231 @@ -126,6 +128,8 @@ msgid "" "Ogone: received data with missing reference (%s) or pay_id (%s) or shasign " "(%s)" msgstr "" +"Ogone: البيانات المستلمة ينقصها رقم إشارة (%s) أو pay_id (%s) أو shasign " +"(%s)" #. module: payment_ogone #: model:ir.model.fields,field_description:payment_ogone.field_payment_acquirer__ogone_pspid @@ -135,17 +139,17 @@ msgstr "PSPID" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "PayUmoney" -msgstr "" +msgstr "PayUmoney" #. module: payment_ogone #: model:ir.model,name:payment_ogone.model_payment_acquirer msgid "Payment Acquirer" -msgstr "طريقة السداد الإلكتروني" +msgstr "معالج السداد" #. module: payment_ogone #: model:ir.model,name:payment_ogone.model_payment_token msgid "Payment Token" -msgstr "" +msgstr "كلمة سر السداد" #. module: payment_ogone #: model:ir.model,name:payment_ogone.model_payment_transaction @@ -175,14 +179,14 @@ msgstr "SHA Key OUT" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Sips" -msgstr "" +msgstr "Sips" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Stripe" -msgstr "" +msgstr "Stripe" #. module: payment_ogone #: selection:payment.acquirer,provider:0 msgid "Wire Transfer" -msgstr "" +msgstr "تحويل بنكي" diff --git a/addons/payment_payumoney/i18n/ar.po b/addons/payment_payumoney/i18n/ar.po index fc7f9053f91..1036fb77525 100644 --- a/addons/payment_payumoney/i18n/ar.po +++ b/addons/payment_payumoney/i18n/ar.po @@ -3,16 +3,16 @@ # * payment_payumoney # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 -# Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" -"Project-Id-Version: Odoo Server saas~11.4\n" +"Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-02 09:56+0000\n" -"PO-Revision-Date: 2018-08-02 09:56+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:22+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -23,60 +23,61 @@ msgstr "" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Adyen" -msgstr "" +msgstr "Adyen" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Authorize.Net" -msgstr "" +msgstr "Authorize.Net" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Buckaroo" -msgstr "" +msgstr "Buckaroo" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Manual Configuration" -msgstr "" +msgstr "الإعدادات اليدوية" #. module: payment_payumoney #: model:ir.model.fields,field_description:payment_payumoney.field_payment_acquirer__payumoney_merchant_key msgid "Merchant Key" -msgstr "" +msgstr "معرف التاجر" #. module: payment_payumoney #: model:ir.model.fields,field_description:payment_payumoney.field_payment_acquirer__payumoney_merchant_salt msgid "Merchant Salt" -msgstr "" +msgstr "Merchant Salt" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Ogone" -msgstr "" +msgstr "Ogone" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "PayUmoney" -msgstr "" +msgstr "PayUmoney" #. module: payment_payumoney #: code:addons/payment_payumoney/models/payment.py:108 #, python-format msgid "PayUmoney: invalid shasign, received %s, computed %s, for data %s" -msgstr "" +msgstr "PayUmoney: shasign غير صالح، المستلم %s, المحسوب %s, للبيانات %s" #. module: payment_payumoney #: code:addons/payment_payumoney/models/payment.py:102 #, python-format msgid "PayUmoney: received data for reference %s; multiple orders found" msgstr "" +"PayUmoney: البيانات المستلمة لرقم الإشارة %s، تم العثور على طلبات متعددة" #. module: payment_payumoney #: code:addons/payment_payumoney/models/payment.py:99 #, python-format msgid "PayUmoney: received data for reference %s; no order found" -msgstr "" +msgstr "PayUmoney: البيانات المستلمة لرقم الإشارة %s، لم يُعثر على طلبات" #. module: payment_payumoney #: code:addons/payment_payumoney/models/payment.py:94 @@ -85,11 +86,13 @@ msgid "" "PayUmoney: received data with missing reference (%s) or pay_id (%s) or " "shashign (%s)" msgstr "" +"PayUmoney: البيانات المستلمة ينقصها رقم إشارة (%s) أو pay_id (%s) أو shasign" +" (%s)" #. module: payment_payumoney #: model:ir.model,name:payment_payumoney.model_payment_acquirer msgid "Payment Acquirer" -msgstr "طريقة السداد الإلكتروني" +msgstr "معالج السداد" #. module: payment_payumoney #: model:ir.model,name:payment_payumoney.model_payment_transaction @@ -99,7 +102,7 @@ msgstr "معاملة السداد" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Paypal" -msgstr "المستحق" +msgstr "Paypal" #. module: payment_payumoney #: model:ir.model.fields,field_description:payment_payumoney.field_payment_acquirer__provider @@ -109,14 +112,14 @@ msgstr "المزود" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Sips" -msgstr "" +msgstr "Sips" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Stripe" -msgstr "" +msgstr "Stripe" #. module: payment_payumoney #: selection:payment.acquirer,provider:0 msgid "Wire Transfer" -msgstr "" +msgstr "تحويل بنكي" diff --git a/addons/payment_sips/i18n/ar.po b/addons/payment_sips/i18n/ar.po index fb33092fe78..89e78748fac 100644 --- a/addons/payment_sips/i18n/ar.po +++ b/addons/payment_sips/i18n/ar.po @@ -3,17 +3,16 @@ # * payment_sips # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 -# AMAAL RU <Fabu1410@yahoo.com>, 2018 -# Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" -"Project-Id-Version: Odoo Server saas~11.4\n" +"Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-02 09:56+0000\n" -"PO-Revision-Date: 2018-08-02 09:56+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:22+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -25,70 +24,70 @@ msgstr "" #: code:addons/payment_sips/models/payment.py:164 #, python-format msgid "; multiple order found" -msgstr "تم ايجاد طلبات متعدده" +msgstr "؛ تم العثور على طلبات متعددة" #. module: payment_sips #: code:addons/payment_sips/models/payment.py:162 #, python-format msgid "; no order found" -msgstr "لايوجد طلبات" +msgstr "; لم يُعثر على طلبات" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Adyen" -msgstr "" +msgstr "Adyen" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Authorize.Net" -msgstr "" +msgstr "Authorize.Net" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Buckaroo" -msgstr "" +msgstr "Buckaroo" #. module: payment_sips #: code:addons/payment_sips/models/payment.py:75 #, python-format msgid "Currency not supported by Wordline" -msgstr "العمله غير معتمده في الخط الافقي" +msgstr "Wordline لا يدعم هذه العملة" #. module: payment_sips #: code:addons/payment_sips/models/payment.py:56 #, python-format msgid "Incorrect payment acquirer provider" -msgstr "" +msgstr "خطأ بمزود معالج السداد" #. module: payment_sips #: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_version msgid "Interface Version" -msgstr "" +msgstr "إصدار الواجهة" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Manual Configuration" -msgstr "" +msgstr "الإعدادات اليدوية" #. module: payment_sips #: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_merchant_id msgid "Merchant ID" -msgstr "" +msgstr "معرف التاجر" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Ogone" -msgstr "" +msgstr "Ogone" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "PayUmoney" -msgstr "" +msgstr "PayUmoney" #. module: payment_sips #: model:ir.model,name:payment_sips.model_payment_acquirer msgid "Payment Acquirer" -msgstr "طريقة السداد الإلكتروني" +msgstr "معالج السداد" #. module: payment_sips #: model:ir.model,name:payment_sips.model_payment_transaction @@ -98,12 +97,12 @@ msgstr "معاملة السداد" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Paypal" -msgstr "المستحق" +msgstr "Paypal" #. module: payment_sips #: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_prod_url msgid "Production url" -msgstr "" +msgstr "رابط الإنتاج" #. module: payment_sips #: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__provider @@ -113,35 +112,35 @@ msgstr "المزود" #. module: payment_sips #: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_secret msgid "Secret Key" -msgstr "" +msgstr "مفتاح سري" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Sips" -msgstr "" +msgstr "Sips" #. module: payment_sips #: code:addons/payment_sips/models/payment.py:160 #, python-format msgid "Sips: received data for reference %s" -msgstr "" +msgstr "Sips: البيانات المستلمة لرقم الإشارة %s" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Stripe" -msgstr "" +msgstr "Stripe" #. module: payment_sips #: model:ir.model.fields,field_description:payment_sips.field_payment_acquirer__sips_test_url msgid "Test url" -msgstr "" +msgstr "رابط الاختبار" #. module: payment_sips #: model:ir.model.fields,help:payment_sips.field_payment_acquirer__sips_merchant_id msgid "Used for production only" -msgstr "" +msgstr "يستخدم للإنتاج فقط" #. module: payment_sips #: selection:payment.acquirer,provider:0 msgid "Wire Transfer" -msgstr "" +msgstr "تحويل بنكي" diff --git a/addons/payment_transfer/i18n/ar.po b/addons/payment_transfer/i18n/ar.po index 60418a5f4ea..92a33df6c65 100644 --- a/addons/payment_transfer/i18n/ar.po +++ b/addons/payment_transfer/i18n/ar.po @@ -3,12 +3,12 @@ # * payment_transfer # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Mustafa J. Kadhem <safi2266@gmail.com>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # AMAAL RU <Fabu1410@yahoo.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 # Yihya Hugirat <hugirat@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 # msgid "" msgstr "" @@ -16,7 +16,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" "PO-Revision-Date: 2018-08-24 09:22+0000\n" -"Last-Translator: Yihya Hugirat <hugirat@gmail.com>, 2018\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -59,12 +59,12 @@ msgstr "" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Adyen" -msgstr "" +msgstr "Adyen" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Authorize.Net" -msgstr "" +msgstr "Authorize.Net" #. module: payment_transfer #: code:addons/payment_transfer/models/payment.py:39 @@ -81,22 +81,22 @@ msgstr "الحسابات البنكية" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Buckaroo" -msgstr "" +msgstr "Buckaroo" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Manual Configuration" -msgstr "" +msgstr "الإعدادات اليدوية" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Ogone" -msgstr "" +msgstr "Ogone" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "PayUmoney" -msgstr "" +msgstr "PayUmoney" #. module: payment_transfer #: model:ir.model,name:payment_transfer.model_payment_acquirer @@ -121,17 +121,17 @@ msgstr "المزود" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Sips" -msgstr "" +msgstr "Sips" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Stripe" -msgstr "" +msgstr "Stripe" #. module: payment_transfer #: selection:payment.acquirer,provider:0 msgid "Wire Transfer" -msgstr "" +msgstr "تحويل بنكي" #. module: payment_transfer #: code:addons/payment_transfer/models/payment.py:79 diff --git a/addons/phone_validation/i18n/ar.po b/addons/phone_validation/i18n/ar.po index 43b2bb6cafd..3074e17f095 100644 --- a/addons/phone_validation/i18n/ar.po +++ b/addons/phone_validation/i18n/ar.po @@ -24,7 +24,7 @@ msgstr "" #. module: phone_validation #: selection:res.company,phone_international_format:0 msgid "Add international prefix" -msgstr "" +msgstr "إضافة بادئة دولية" #. module: phone_validation #: model:ir.model.fields,help:phone_validation.field_res_company__phone_international_format @@ -42,7 +42,7 @@ msgstr "المؤسسات" #. module: phone_validation #: model:ir.model.fields,field_description:phone_validation.field_phone_validation_mixin__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: phone_validation #: model:ir.model.fields,field_description:phone_validation.field_phone_validation_mixin__id @@ -53,13 +53,13 @@ msgstr "المعرف" #: code:addons/phone_validation/tools/phone_validation.py:23 #, python-format msgid "Impossible number %s: probably invalid number of digits" -msgstr "" +msgstr "رقم مستحيل %s: ربما يكون عدد الأرقام غير صالح" #. module: phone_validation #: code:addons/phone_validation/tools/phone_validation.py:25 #, python-format msgid "Invalid number %s: probably incorrect prefix" -msgstr "" +msgstr "رقم مستحيل %s: ربما تكون البادئة غير صحيحة" #. module: phone_validation #: model:ir.model.fields,field_description:phone_validation.field_phone_validation_mixin____last_update @@ -74,12 +74,12 @@ msgstr "أرقام محلية" #. module: phone_validation #: selection:res.company,phone_international_format:0 msgid "No prefix" -msgstr "" +msgstr "لا توجد بادئة" #. module: phone_validation #: model:ir.model,name:phone_validation.model_phone_validation_mixin msgid "Phone Validation Mixin" -msgstr "" +msgstr "Phone Validation Mixin" #. module: phone_validation #: code:addons/phone_validation/tools/phone_validation.py:44 @@ -88,6 +88,8 @@ msgid "" "Unable to format %s:\n" "%s" msgstr "" +"تعذّر تنسيق %s:\n" +"%s" #. module: phone_validation #: code:addons/phone_validation/tools/phone_validation.py:20 @@ -96,3 +98,5 @@ msgid "" "Unable to parse %s:\n" "%s" msgstr "" +"تعذّر تحليل %s:\n" +"%s" diff --git a/addons/point_of_sale/i18n/km.po b/addons/point_of_sale/i18n/km.po index c27627ce62d..a5c589a93dd 100644 --- a/addons/point_of_sale/i18n/km.po +++ b/addons/point_of_sale/i18n/km.po @@ -555,7 +555,7 @@ msgstr "របាយការណ៍ធនាគារ" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_account_bank_statement_cashbox msgid "Bank Statement Cashbox" -msgstr "" +msgstr "របាយការណ៍ប័ណ្ណធនាគារ" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_account_bank_statement_line @@ -651,12 +651,12 @@ msgstr "" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_cash_box_in msgid "Cash Box In" -msgstr "" +msgstr "លុយក្នុងដៃ" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_cash_box_out msgid "Cash Box Out" -msgstr "" +msgstr "លុយក្រៅប្រអប់" #. module: point_of_sale #: code:addons/point_of_sale/models/pos_session.py:318 @@ -684,7 +684,7 @@ msgstr "" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_account_cashbox_line msgid "CashBox Line" -msgstr "" +msgstr "បន្ទាត់ CashBox" #. module: point_of_sale #: model_terms:ir.ui.view,arch_db:point_of_sale.account_cashbox_line_view_tree @@ -1427,7 +1427,7 @@ msgstr "" #: code:addons/point_of_sale/static/src/xml/pos.xml:550 #, python-format msgid "Due" -msgstr "" +msgstr "ទៅកាន់" #. module: point_of_sale #. openerp-web @@ -1501,7 +1501,7 @@ msgstr "" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_session__cash_register_balance_end_real msgid "Ending Balance" -msgstr "" +msgstr "សមតុល្យចុងក្រោយ" #. module: point_of_sale #: code:addons/point_of_sale/models/pos_category.py:13 @@ -1568,7 +1568,7 @@ msgstr "" #: model:ir.model.fields,field_description:point_of_sale.field_pos_config__fiscal_position_ids #: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form msgid "Fiscal Positions" -msgstr "" +msgstr "តំណែងសារពើពន្ធ" #. module: point_of_sale #: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form @@ -1809,7 +1809,7 @@ msgstr "" #: model:ir.model.fields,field_description:point_of_sale.field_pos_config__module_account #: model:ir.model.fields,field_description:point_of_sale.field_pos_order__invoice_group msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: point_of_sale #: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form @@ -1952,7 +1952,7 @@ msgstr "" #: code:addons/point_of_sale/static/src/xml/pos.xml:38 #, python-format msgid "Loading" -msgstr "" +msgstr "ដំណើរការ" #. module: point_of_sale #: selection:barcode.rule,type:0 @@ -2064,7 +2064,7 @@ msgstr "" #: model:product.product,name:point_of_sale.product_product_consumable #: model:product.template,name:point_of_sale.product_product_consumable_product_template msgid "Miscellaneous" -msgstr "" +msgstr "ផ្សេងៗ" #. module: point_of_sale #: model_terms:ir.ui.view,arch_db:point_of_sale.customer_facing_display_html @@ -2205,7 +2205,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:point_of_sale.customer_facing_display_html #: model_terms:pos.config,customer_facing_display_html:point_of_sale.pos_config_main msgid "Odoo Logo" -msgstr "" +msgstr "Odoo និមិត្តសញ្ញា" #. module: point_of_sale #. openerp-web @@ -2551,6 +2551,9 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:point_of_sale.pos_config_view_form msgid "Payment Methods" msgstr "" +"វិធីទូទាត់លុយ\n" +" \n" +" " #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__journal_id @@ -2560,7 +2563,7 @@ msgstr "" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_make_payment__payment_name msgid "Payment Reference" -msgstr "" +msgstr "សេចក្ដីយោងការបង់ប្រាក់" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_config__iface_payment_terminal @@ -3020,7 +3023,7 @@ msgstr "" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_report_pos_order__product_qty msgid "Product Quantity" -msgstr "" +msgstr "បរិមាណផលិតផល" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_product_template @@ -3094,7 +3097,7 @@ msgstr "" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_pos_box_in msgid "Put Money In" -msgstr "" +msgstr "ដាក់លុយចូល" #. module: point_of_sale #. openerp-web @@ -3583,13 +3586,13 @@ msgstr "" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_session__cash_register_balance_start msgid "Starting Balance" -msgstr "" +msgstr "សមតុល្យផ្តើម" #. module: point_of_sale #: model:ir.actions.report,name:point_of_sale.action_report_account_statement #: model_terms:ir.ui.view,arch_db:point_of_sale.report_statement msgid "Statement" -msgstr "" +msgstr "របាយការណ៍" #. module: point_of_sale #: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_pos_form @@ -3599,7 +3602,7 @@ msgstr "" #. module: point_of_sale #: model_terms:ir.ui.view,arch_db:point_of_sale.view_pos_session_form msgid "Statements" -msgstr "" +msgstr "របាយការណ៍" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_order__state @@ -3633,7 +3636,7 @@ msgstr "ផ្លូវ" #: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__price_subtotal_incl #, python-format msgid "Subtotal" -msgstr "" +msgstr "សរុប" #. module: point_of_sale #: model:ir.model.fields,field_description:point_of_sale.field_pos_order_line__price_subtotal @@ -3719,7 +3722,7 @@ msgstr "" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_pos_box_out msgid "Take Money Out" -msgstr "" +msgstr "យកប្រាក់ចេញ" #. module: point_of_sale #. openerp-web diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py index 0e083016c4b..ace571ffe39 100644 --- a/addons/point_of_sale/models/pos_config.py +++ b/addons/point_of_sale/models/pos_config.py @@ -417,6 +417,8 @@ class PosConfig(models.Model): def open_ui(self): """ open the pos interface """ self.ensure_one() + # check all constraints, raises if any is not met + self._validate_fields(self._fields) return { 'type': 'ir.actions.act_url', 'url': '/pos/web/', diff --git a/addons/point_of_sale/static/src/css/customer_facing_display.css b/addons/point_of_sale/static/src/css/customer_facing_display.css index 2d572060342..d9be0c89c35 100644 --- a/addons/point_of_sale/static/src/css/customer_facing_display.css +++ b/addons/point_of_sale/static/src/css/customer_facing_display.css @@ -451,19 +451,19 @@ body.editor_enable .pos-hidden { top: 35px; } } -body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul { +body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu { min-width: 100px; max-width: 100px; } -body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul > .o_main_header { +body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu > .o_main_header { display: none; } -body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul > li > a { +body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu > a { position: relative; padding: 14px 0!important; margin-bottom: 1px; } -body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > ul > li > a:before { +body.editor_enable #oe_manipulators .oe_overlay > .oe_overlay_options > .btn-group > .dropdown.oe_options.btn-group.snippet-option-pos_palette > .dropdown-menu > a:before { color: #05eb05; } body.editor_enable #oe_manipulators .no_parent_options .snippet-option-pos_palette, @@ -491,10 +491,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #3E3E3E; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_01 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_01 { background: #f6f6f6 !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_01:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_01:after { content: ""; position: absolute; top: 0; @@ -503,7 +503,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #3E3E3E; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_01:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_01:before { text-shadow: 0 0 1px #090909; } .pos-palette_02 .pos-payment_info { @@ -527,10 +527,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #364152; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_02 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_02 { background: #ecf2f6 !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_02:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_02:after { content: ""; position: absolute; top: 0; @@ -539,7 +539,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #364152; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_02:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_02:before { text-shadow: 0 0 1px #130d09; } .pos-palette_03 .pos-payment_info { @@ -563,10 +563,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #1BA39C; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_03 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_03 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_03:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_03:after { content: ""; position: absolute; top: 0; @@ -575,7 +575,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #1BA39C; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_03:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_03:before { text-shadow: 0 0 1px #131313; } .pos-palette_04 .pos-payment_info { @@ -599,10 +599,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #0b7b6c; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_04 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_04 { background: #efeeec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_04:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_04:after { content: ""; position: absolute; top: 0; @@ -611,7 +611,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #0b7b6c; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_04:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_04:before { text-shadow: 0 0 1px #101113; } .pos-palette_05 .pos-payment_info { @@ -635,10 +635,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #E26868; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_05 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_05 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_05:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_05:after { content: ""; position: absolute; top: 0; @@ -647,7 +647,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #E26868; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_05:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_05:before { text-shadow: 0 0 1px #131313; } .pos-palette_06 .pos-payment_info { @@ -671,10 +671,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #9E373B; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_06 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_06 { background: #f6f6f6 !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_06:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_06:after { content: ""; position: absolute; top: 0; @@ -683,7 +683,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #9E373B; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_06:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_06:before { text-shadow: 0 0 1px #090909; } .pos-palette_07 .pos-payment_info { @@ -707,10 +707,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #ce9934; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_07 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_07 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_07:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_07:after { content: ""; position: absolute; top: 0; @@ -719,7 +719,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #ce9934; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_07:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_07:before { text-shadow: 0 0 1px #131313; } .pos-palette_08 .pos-payment_info { @@ -743,10 +743,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #a48c77; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_08 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_08 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_08:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_08:after { content: ""; position: absolute; top: 0; @@ -755,7 +755,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #a48c77; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_08:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_08:before { text-shadow: 0 0 1px #131313; } .pos-palette_09 .pos-payment_info { @@ -779,10 +779,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: linear-gradient(30deg, #014d43, #127e71); } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_09 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_09 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_09:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_09:after { content: ""; position: absolute; top: 0; @@ -791,7 +791,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: linear-gradient(30deg, #014d43, #127e71); } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_09:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_09:before { text-shadow: 0 0 1px #131313; } .pos-palette_10 .pos-payment_info { @@ -815,10 +815,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: linear-gradient(30deg, #e2316c, #ea4c89); } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_10 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_10 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_10:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_10:after { content: ""; position: absolute; top: 0; @@ -827,7 +827,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: linear-gradient(30deg, #e2316c, #ea4c89); } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_10:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_10:before { text-shadow: 0 0 1px #131313; } .pos-palette_11 .pos-payment_info { @@ -851,10 +851,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: linear-gradient(30deg, #362b3d, #5b4a63); } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_11 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_11 { background: #ececec !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_11:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_11:after { content: ""; position: absolute; top: 0; @@ -863,7 +863,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: linear-gradient(30deg, #362b3d, #5b4a63); } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_11:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_11:before { text-shadow: 0 0 1px #131313; } .pos-palette_12 .pos-payment_info { @@ -887,10 +887,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: #434343; } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_12 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_12 { background: #5b5b5b !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_12:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_12:after { content: ""; position: absolute; top: 0; @@ -899,7 +899,7 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: #434343; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_12:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_12:before { text-shadow: 0 0 1px #a4a4a4; } .pos-palette_13 .pos-payment_info { @@ -923,10 +923,10 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { background: linear-gradient(30deg, #1a1b1f, #3d3f45); } } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_13 { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_13 { background: #a2a2ab !important; } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_13:after { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_13:after { content: ""; position: absolute; top: 0; @@ -935,6 +935,6 @@ body.editor_enable #oe_manipulators .no_parent_options .o_parent_editor_header { left: 50px; background: linear-gradient(30deg, #1a1b1f, #3d3f45); } -#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > ul > li > .pos-palette_13:before { +#oe_manipulators .oe_overlay > .oe_overlay_options .snippet-option-pos_palette > .dropdown-menu > .pos-palette_13:before { text-shadow: 0 0 1px #5d5d54; } diff --git a/addons/point_of_sale/views/pos_templates.xml b/addons/point_of_sale/views/pos_templates.xml index cb1a8a81a01..c78eb703c2e 100644 --- a/addons/point_of_sale/views/pos_templates.xml +++ b/addons/point_of_sale/views/pos_templates.xml @@ -111,7 +111,7 @@ </div> <div data-js='pos_background' data-selector=".pos-company_logo, .pos-adv"> - <a href="#" class="dropdown-item" data-choose-image="true" data-no-preview="true"><b>Set Custom Image...</b></a> + <a href="#" class="dropdown-item font-weight-bold" data-choose-image="true" data-no-preview="true">Set Custom Image...</a> <a href="#" class="dropdown-item d-none pos-use_default_logo" data-background="">Default company logo</a> <div class="dropdown-divider"/> <a href="#" class="dropdown-item" data-toggle-class="pos-hidden"><i class="fa fa-eye-slash"/>Hide</a> diff --git a/addons/portal/controllers/mail.py b/addons/portal/controllers/mail.py index 7376e17521b..d9d265c098e 100644 --- a/addons/portal/controllers/mail.py +++ b/addons/portal/controllers/mail.py @@ -75,19 +75,15 @@ def _message_post_helper(res_model, res_id, message, token='', nosubscribe=True, raise NotFound() # Signed Token Case: author_id is forced elif kw.get('hash') and kw.get('pid'): - author_id = kw.get('pid') + author_id = int(kw.get('pid')) kw.pop('csrf_token', None) kw.pop('attachment_ids', None) kw.pop('hash', None) kw.pop('pid', None) return record.with_context(mail_create_nosubscribe=nosubscribe).message_post( - body=message, - message_type=kw.pop('message_type', "comment"), - subtype=kw.pop('subtype', "mt_comment"), - author_id=author_id, - **kw - ) + body=message, message_type=kw.pop('message_type', "comment"), + subtype=kw.pop('subtype', "mt_comment"), author_id=author_id, **kw) class PortalChatter(http.Controller): diff --git a/addons/portal/i18n/km.po b/addons/portal/i18n/km.po index 51c96c312d5..ef5ef286f78 100644 --- a/addons/portal/i18n/km.po +++ b/addons/portal/i18n/km.po @@ -275,7 +275,7 @@ msgstr "បង្កើតនៅ" #. module: portal #: model:ir.model.fields,help:portal.field_portal_mixin__access_url msgid "Customer Portal URL" -msgstr "" +msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន" #. module: portal #: model_terms:ir.ui.view,arch_db:portal.portal_share_template @@ -438,7 +438,7 @@ msgstr "" #. module: portal #: model_terms:ir.ui.view,arch_db:portal.portal_record_sidebar msgid "Odoo Logo" -msgstr "" +msgstr "Odoo និមិត្តសញ្ញា" #. module: portal #. openerp-web @@ -455,7 +455,7 @@ msgstr "ទូរស័ព្ទ" #. module: portal #: model:ir.model.fields,field_description:portal.field_portal_mixin__access_url msgid "Portal Access URL" -msgstr "" +msgstr "URL ចូលដំណើរការវិបផតថល" #. module: portal #: model:ir.model,name:portal.model_portal_mixin @@ -500,12 +500,12 @@ msgstr "" #. module: portal #: model:ir.model.fields,field_description:portal.field_portal_share__partner_ids msgid "Recipients" -msgstr "" +msgstr "អ្នកទទួល" #. module: portal #: model:ir.model.fields,field_description:portal.field_portal_share__res_id msgid "Related Document ID" -msgstr "" +msgstr "លេខសម្គាល់ឯកសារដែលទាក់ទង" #. module: portal #: model:ir.model.fields,field_description:portal.field_portal_share__res_model diff --git a/addons/portal/static/src/scss/portal.scss b/addons/portal/static/src/scss/portal.scss index 001b2b3da33..545d204929c 100644 --- a/addons/portal/static/src/scss/portal.scss +++ b/addons/portal/static/src/scss/portal.scss @@ -264,14 +264,14 @@ img.o_we_custom_image { background-color: #169C78; color: white; .text-muted { - color: #ddd; + color: #ddd !important; } } .oe_blue_light { background-color: #41b6ab; color: white; .text-muted { - color: #ddd; + color: #ddd !important; } } .oe_blue { @@ -282,21 +282,21 @@ img.o_we_custom_image { background-color: #f05442; color: white; .text-muted { - color: #ddd; + color: #ddd !important; } } .oe_purple { background-color: #b163a3; color: white; .text-muted { - color: #ddd; + color: #ddd !important; } } .oe_red { background-color: #9C1b31; color: white; .text-muted { - color: #ddd; + color: #ddd !important; } } .oe_none { diff --git a/addons/pos_discount/i18n/ar.po b/addons/pos_discount/i18n/ar.po index 962d728dae4..86c5abc50c5 100644 --- a/addons/pos_discount/i18n/ar.po +++ b/addons/pos_discount/i18n/ar.po @@ -3,17 +3,18 @@ # * pos_discount # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Martin Trigaux, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 # mohamed eboda <m.eboda@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-21 13:16+0000\n" -"PO-Revision-Date: 2018-09-21 13:16+0000\n" -"Last-Translator: mohamed eboda <m.eboda@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:22+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -24,7 +25,7 @@ msgstr "" #. module: pos_discount #: model:ir.model.fields,help:pos_discount.field_pos_config__iface_discount msgid "Allow the cashier to give discounts on the whole order." -msgstr "السماح لأمين الصندوق بعمل تخفيض على امر البيع" +msgstr "السماح للكاشير بعمل خصومات على الأمر بالكامل." #. module: pos_discount #. openerp-web @@ -36,7 +37,7 @@ msgstr "الخصم" #. module: pos_discount #: model_terms:ir.ui.view,arch_db:pos_discount.pos_config_view_form_inherit_pos_discount msgid "Discount %" -msgstr "" +msgstr "خصم %" #. module: pos_discount #. openerp-web @@ -57,7 +58,7 @@ msgstr "منتج الخصم" #: code:addons/pos_discount/static/src/js/discount.js:28 #, python-format msgid "No discount product found" -msgstr "" +msgstr "لا يوجد منتج لتطبيق خصم عليه" #. module: pos_discount #: model:ir.model.fields,field_description:pos_discount.field_pos_config__iface_discount @@ -82,8 +83,10 @@ msgid "" "The discount product seems misconfigured. Make sure it is flagged as 'Can be" " Sold' and 'Available in Point of Sale'." msgstr "" +"يبدو أن منتج الخصم لم يتم ضبطه بشكل صحيح. تأكد من تفعيل خياري 'قابل للبيع' " +"و'متاح في نقطة البيع'." #. module: pos_discount #: model:ir.model.fields,help:pos_discount.field_pos_config__discount_product_id msgid "The product used to model the discount." -msgstr "" +msgstr "المنتج المستخدم كمثال على تطبيق الخصم." diff --git a/addons/pos_restaurant/i18n/km.po b/addons/pos_restaurant/i18n/km.po index bc04f86fca4..25933ead85d 100644 --- a/addons/pos_restaurant/i18n/km.po +++ b/addons/pos_restaurant/i18n/km.po @@ -330,7 +330,7 @@ msgstr "" #: code:addons/pos_restaurant/static/src/xml/floors.xml:116 #, python-format msgid "Duplicate" -msgstr "" +msgstr "ត្រួត" #. module: pos_restaurant #: model_terms:ir.actions.act_window,help:pos_restaurant.action_restaurant_printer_form @@ -532,7 +532,7 @@ msgstr "" #. module: pos_restaurant #: model_terms:pos.config,customer_facing_display_html:pos_restaurant.pos_config_restaurant msgid "Odoo Logo" -msgstr "" +msgstr "Odoo និមិត្តសញ្ញា" #. module: pos_restaurant #. openerp-web @@ -778,7 +778,7 @@ msgstr "" #: code:addons/pos_restaurant/static/src/xml/printbill.xml:118 #, python-format msgid "Subtotal" -msgstr "" +msgstr "សរុប" #. module: pos_restaurant #. openerp-web diff --git a/addons/pos_sale/i18n/km.po b/addons/pos_sale/i18n/km.po index d407ee871a8..3ed2b3711a3 100644 --- a/addons/pos_sale/i18n/km.po +++ b/addons/pos_sale/i18n/km.po @@ -141,7 +141,7 @@ msgstr "" #. module: pos_sale #: model:ir.model,name:pos_sale.model_crm_team msgid "Sales Channels" -msgstr "" +msgstr "លក់" #. module: pos_sale #: selection:sale.report,state:0 @@ -157,7 +157,7 @@ msgstr "" #: model:ir.model.fields,field_description:pos_sale.field_pos_config__crm_team_id #: model:ir.model.fields,field_description:pos_sale.field_pos_session__crm_team_id msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: pos_sale #: code:addons/pos_sale/models/crm_team.py:119 diff --git a/addons/product/i18n/km.po b/addons/product/i18n/km.po index 8c7def18878..2b4c0b2efda 100644 --- a/addons/product/i18n/km.po +++ b/addons/product/i18n/km.po @@ -1907,7 +1907,7 @@ msgstr "" #. module: product #: model_terms:ir.ui.view,arch_db:product.product_template_search_view msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: product #: model:ir.model.fields,field_description:product.field_res_config_settings__group_product_pricelist diff --git a/addons/product/i18n/vi.po b/addons/product/i18n/vi.po index 5c84543861e..7a5d2bf7658 100644 --- a/addons/product/i18n/vi.po +++ b/addons/product/i18n/vi.po @@ -1416,7 +1416,7 @@ msgstr "Danh mục cha" #. module: product #: model:ir.model.fields,field_description:product.field_product_category__parent_path msgid "Parent Path" -msgstr "" +msgstr "Parent Path" #. module: product #: model:product.product,name:product.product_product_9 diff --git a/addons/product/models/product_template.py b/addons/product/models/product_template.py index e35665d38ce..4d1db8a9a4f 100644 --- a/addons/product/models/product_template.py +++ b/addons/product/models/product_template.py @@ -543,10 +543,12 @@ class ProductTemplate(models.Model): # deleted valid_value_ids = tmpl_id.valid_product_attribute_value_wnva_ids valid_attribute_ids = tmpl_id.valid_product_attribute_wnva_ids + seen_attributes = set(p.attribute_value_ids for p in tmpl_id.product_variant_ids if p.active) for product_id in tmpl_id.product_variant_ids: if product_id._has_valid_attributes(valid_attribute_ids, valid_value_ids): - if not product_id.active: + if not product_id.active and product_id.attribute_value_ids not in seen_attributes: variants_to_activate += product_id + seen_attributes.add(product_id.attribute_value_ids) else: variants_to_unlink += product_id diff --git a/addons/product/tests/test_variants.py b/addons/product/tests/test_variants.py index ed7f1f777c5..40d95171449 100644 --- a/addons/product/tests/test_variants.py +++ b/addons/product/tests/test_variants.py @@ -534,3 +534,286 @@ class TestVariantsImages(common.TestProductCommon): self.assertEqual(self.template.image, self.images['red']) self.assertEqual(self.variants[0].image_raw_original, False) self.assertEqual(self.variants[0].image, self.images['red']) + + +class TestVariantsArchive(common.TestProductCommon): + """Once a variant is used on orders/invoices, etc, they can't be unlinked. + As a result, updating attributes on a product template would simply archive the variants instead. + We make sure that at each update, we have the correct number of active and inactive records. + + In these tests, we use the commands sent by the JS framework to the ORM when using the interface + (even though using 3 commands would simplify the code compared to 2 commands). + + Note that: we don't overly test the ids of archived / modified variants. + In some cases _create_product_variants reuse existing variants and in other create new ones, + in a way that is not very predictable (without reading the code). + We do not enshrine the current behaviour in the tests (yet) as it could change with only moderate functional impact. + Consequently, if it is intentional the number of archived variants could change, + in that case update the test; it is there to make sure that a fix is not going to break anything silently. + The most important is to keep correct numbers of active variants. + """ + def setUp(self): + res = super(TestVariantsArchive, self).setUp() + + attribute_values = { + 'color': ['white', 'black'], + 'size': ['s', 'm'], + } + + self.attributes = {} + for attr, attr_values in attribute_values.items(): + attribute = self.env['product.attribute'].create({'name': attr}) + values = [self.env['product.attribute.value'].create({'name': name, 'attribute_id': attribute.id}) + for name in attr_values] + self.attributes.update({attr: {'a': attribute, 'v': values}}) + + attribute_line_ids = [(0, 0, { + 'attribute_id': attr['a'].id, + 'value_ids': [(6, 0, [v.id for v in attr['v']])], + }) for attr in self.attributes.values()] + + self.template = self.env['product.template'].create({ + 'name': 'consume product', + 'attribute_line_ids': attribute_line_ids, + }) + + return res + + def test_update_variant_unlink(self): + """Variants are not used anywhere, so removing an attribute line would + unlink the variants and create new ones. Nothing too fancy here. + """ + lines = self.template.attribute_line_ids + self.assertEqual(len(self.template.product_variant_ids), 4) + # we keep lines[0], remove and copy lines[1] + line_copy_command = {'attribute_id': lines[1].attribute_id.id, 'value_ids': [(6, False, lines[1].value_ids.mapped('id'))]} + self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]}) + self.assertEqual(len(self.template.product_variant_ids), len(lines[0].value_ids), + "Since we only kept line[0], we should have as many variants as it has values") + archived_products = self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)]) + self.assertFalse(archived_products, + "Since they are used nowhere, there should not be any archived variant.") + # we re-add the line we just removed, so we should get new variants + self.template.write({ + 'attribute_line_ids': [ + (4, lines[0].id), + (0, 'virtual', line_copy_command), + ]}) + self.assertEqual(len(self.template.product_variant_ids), 4) + + def test_update_variant_archive_1_value(self): + """We do the same operations on the template as in test_update_variant_unlink, + except we simulate that the variants can't be unlinked. + It follows that variants should be archived instead, so the results should all be different from previous test. + In this test we have a line that have only one possible value: + this is handled differently than the case where we have more than one, + since in principle it does not add new variants. + """ + # we create a new template with a line with only one attribute. + # Since this does not create any additional variants, the behaviour is a little bit different: + # it tries to add the new attribute to existing variants if possible + attribute_line_ids = [(0, 0, { + 'attribute_id': attr['a'].id, + 'value_ids': [(6, 0, [v.id for v in (attr['v'] if attr['a'].display_name == 'color' else attr['v'][:1])])], + }) for attr in self.attributes.values()] + + template = self.env['product.template'].create({ + 'name': 'consume product', + 'attribute_line_ids': attribute_line_ids, + }) + + # create a patch to make as if one variant was undeletable + # (e.g. present in a field with ondelete=restrict) + Product = self.env['product.product'] + no_remove = template.product_variant_ids[0].id + def unlink(self): + if self.id == no_remove: + raise Exception('just') + else: + return super(Product.__class__, self).unlink() + Product._patch_method('unlink', unlink) + + variants_ids_history = [] + + self.assertEqual(len(template.product_variant_ids), 2) + variants_ids_history.append(template.product_variant_ids.ids) + + lines = template.attribute_line_ids + # we keep lines[0], remove and copy lines[1], which is the one with only one possible value + line_copy_command = {'attribute_id': lines[1].attribute_id.id, + 'value_ids': [(6, False, lines[1].value_ids.mapped('id'))]} + template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]}) + self.assertEqual(len(lines[0].value_ids), 2) + self.assertEqual(len(template.product_variant_ids), len(lines[0].value_ids), + "Since we only kept line[0], we should have as many variants as it has values") + variants_ids_history.append(template.product_variant_ids.ids) + + archived_products_1 = self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', template.id)]) + self.assertEqual(len(archived_products_1), 1, + "One variant should have been unlinked, not the other.") + # we re-add the line we just removed, so we should get new variants + template.write({ + 'attribute_line_ids': [ + (4, lines[0].id), + (0, 'virtual', line_copy_command), + ]}) + self.assertEqual(len(template.product_variant_ids), 2) + variants_ids_history.append(template.product_variant_ids.ids) + + archived_products_2 = self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', template.id)]) + self.assertEqual(len(archived_products_2), 1, + "We did not reactivate this variant.") + + # tests on ids, see the doc_string + self.assertEqual(archived_products_1, archived_products_2) + self.assertEqual(len(set(variants_ids_history[0] + variants_ids_history[1])), 4, + "After the first update, we have new active variants.") + self.assertEqual(len(set(variants_ids_history[1] + variants_ids_history[2])), 2, + "After the second update, we kept the same active variants.") + + Product._revert_method('unlink') + + def test_update_variant_archive_2_value(self): + """We do the same operations on the template as in test_update_variant_unlink, + except we simulate that the variants can't be unlinked. + It follows that variants should be archived instead, so the results should all be different from previous test. + """ + Product = self.env['product.product'] + def unlink(slef): + raise Exception('just') + Product._patch_method('unlink', unlink) + variants_ids_history = [] + + self.assertEqual(len(self.template.product_variant_ids), 4) + variants_ids_history.append(self.template.product_variant_ids.ids) + + lines = self.template.attribute_line_ids + # we keep lines[0], remove and copy lines[1] + line_copy_command = {'attribute_id': lines[1].attribute_id.id, + 'value_ids': [(6, False, lines[1].value_ids.mapped('id'))]} + line_second_copy_command = {'attribute_id': lines[1].attribute_id.id, + 'value_ids': [(6, False, lines[1].value_ids[:1].mapped('id'))]} + self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]}) + self.assertEqual(len(self.template.product_variant_ids), len(lines[0].value_ids), + "Since we only kept line[0], we should have as many variants as it has values") + variants_ids_history.append(self.template.product_variant_ids.ids) + + archived_products = [] + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])) + self.assertEqual(len(archived_products[0]), 4, + "Since they can't be unlinked, all variants should be archived.") + # we re-add the line we just removed, so we should get new variants + self.template.write({ + 'attribute_line_ids': [ + (4, lines[0].id), + (0, 'virtual', line_copy_command), + ]}) + self.assertEqual(len(self.template.product_variant_ids), 4) + variants_ids_history.append(self.template.product_variant_ids.ids) + + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])) + self.assertEqual(len(archived_products[1]), 2, + "Since they can't be unlinked, all previous variants should be archived.") + + # we redo the whole remove/readd to check + lines = self.template.attribute_line_ids + self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]}) + self.assertEqual(len(self.template.product_variant_ids), 2) + variants_ids_history.append(self.template.product_variant_ids.ids) + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])) + self.template.write({ + 'attribute_line_ids': [ + (4, lines[0].id), + (0, 'virtual', line_copy_command), + ]}) + self.assertEqual(len(self.template.product_variant_ids), 4) + variants_ids_history.append(self.template.product_variant_ids.ids) + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])) + self.assertEqual(len(archived_products[3]), 2) + + # now we test when we try to add the value back on existing products + lines = self.template.attribute_line_ids + self.template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]}) + self.assertEqual(len(self.template.product_variant_ids), 2) + variants_ids_history.append(self.template.product_variant_ids.ids) + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])) + self.assertEqual(len(archived_products[4]), 4) + # this time we only add one of the two attributes we've been removing + self.template.write({ + 'attribute_line_ids': [ + (4, lines[0].id), + (0, 'virtual', line_second_copy_command), + ]}) + self.assertEqual(len(self.template.product_variant_ids), 2) + variants_ids_history.append(self.template.product_variant_ids.ids) + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', self.template.id)])) + self.assertEqual(len(archived_products[5]), 4) + + Product._revert_method('unlink') + + def test_update_variant_archive_3_value(self): + """In this one, we have unique values for one lines, and one line with two values. + We first remove the unique line to populate archived variants, then remove the two values line. + Finally, we re-add athe two lines, bringing us back to the first situation: + we should not have any more than two variants (rest should be archived) + """ + attribute_line_ids = [(0, 0, { + 'attribute_id': attr['a'].id, + 'value_ids': [(6, 0, [v.id for v in (attr['v'] if attr['a'].display_name == 'color' else attr['v'][:1])])], + }) for attr in self.attributes.values()] + + template = self.env['product.template'].create({ + 'name': 'consume product', + 'attribute_line_ids': attribute_line_ids, + }) + + Product = self.env['product.product'] + def unlink(slef): + raise Exception('just') + Product._patch_method('unlink', unlink) + + variants_ids_history = [] + self.assertEqual(len(template.product_variant_ids), 2) + variants_ids_history.append(template.product_variant_ids.ids) + + lines = template.attribute_line_ids + + template.write({'attribute_line_ids': [(4, lines[0].id), (2, lines[1].id)]}) + self.assertEqual(len(template.product_variant_ids), len(lines[0].value_ids), + "Since we only kept line[0], we should have as many variants as it has values") + variants_ids_history.append(template.product_variant_ids.ids) + + archived_products = [] + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', template.id)])) + self.assertEqual(len(archived_products[0]), 2, + "Since they can't be unlinked, all variants should be archived.") + + template.write({'attribute_line_ids': [(2, lines[0].id)]}) + self.assertEqual(len(template.product_variant_ids), 1) + variants_ids_history.append(template.product_variant_ids.ids) + + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', template.id)])) + self.assertEqual(len(archived_products[1]), 4, + "Since they can't be unlinked, all previous variants should be archived.") + + # we re-add everything: + template.write({'attribute_line_ids': attribute_line_ids}) + + archived_products.append(self.env['product.product'].search( + [('active', '=', False), ('product_tmpl_id', '=', template.id)])) + self.assertEqual(len(template.product_variant_ids), 2) + self.assertEqual(len(archived_products[2]), 3, + "We should have re-activated one variant only.") + + Product._revert_method('unlink') diff --git a/addons/product_expiry/i18n/ar.po b/addons/product_expiry/i18n/ar.po index 0f41722b037..3598197d0e6 100644 --- a/addons/product_expiry/i18n/ar.po +++ b/addons/product_expiry/i18n/ar.po @@ -3,17 +3,17 @@ # * product_expiry # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Martin Trigaux, 2018 # Mohammed Albasha <m.albasha.ma@gmail.com>, 2018 -# Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:23+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -28,11 +28,13 @@ msgid "" "<span class=\"badge badge-danger\" attrs=\"{'invisible': " "[('product_expiry_alert', '=', False)]}\">Expiration Alert</span>" msgstr "" +"<span class=\"badge badge-danger\" attrs=\"{'invisible': " +"[('product_expiry_alert', '=', False)]}\">تنبيه انتهاء الصلاحية</span>" #. module: product_expiry #: model_terms:ir.ui.view,arch_db:product_expiry.view_product_form_expiry msgid "<span>days</span>" -msgstr "" +msgstr "<span>أيام</span>" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__alert_date @@ -42,12 +44,12 @@ msgstr "تاريخ التنبيه" #. module: product_expiry #: model:mail.activity.type,name:product_expiry.mail_activity_type_alert_date_reached msgid "Alert Date Reached" -msgstr "" +msgstr "تم الوصول لتاريخ التنبيه" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__use_date msgid "Best before Date" -msgstr "مثالي قبل التاريخ" +msgstr "مثالي قبل تاريخ" #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_stock_production_lot__alert_date @@ -55,6 +57,8 @@ msgid "" "Date to determine the expired lots and serial numbers using the filter " "\"Expiration Alerts\"." msgstr "" +"تاريخ تحديد أرقام اللوط والأرقام المسلسلة للمنتجات منتهية الصلاحية باستخدام " +"فلتر \"تنبيهات انتهاء الصلاحية\"." #. module: product_expiry #: model_terms:ir.ui.view,arch_db:product_expiry.view_move_form_expiry @@ -71,12 +75,12 @@ msgstr "تاريخ انتهاء الصلاحية" #. module: product_expiry #: model_terms:ir.ui.view,arch_db:product_expiry.search_product_lot_filter_inherit_product_expiry msgid "Expiration Alerts" -msgstr "" +msgstr "تنبيهات انتهاء الصلاحية" #. module: product_expiry #: model:ir.model,name:product_expiry.model_stock_production_lot msgid "Lot/Serial" -msgstr "اللوط/المسلسل" +msgstr "رقم اللوط/الرقم المسلسل" #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_product_product__alert_time @@ -84,6 +88,7 @@ msgstr "اللوط/المسلسل" msgid "" "Number of days before an alert should be raised on the lot/serial number." msgstr "" +"عدد الأيام المتبقية حتى يتوجب إصدار تنبيه على رقم اللوط/الرقم المسلسل." #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_product_product__life_time @@ -92,6 +97,8 @@ msgid "" "Number of days before the goods may become dangerous and must not be " "consumed. It will be computed on the lot/serial number." msgstr "" +"عدد الأيام المتبقية حتى تصبح البضاعة خطيرة وغير صالحة للاستهلاك الآدمي. سيتم" +" احتسابه من خلال رقم اللوط/الرقم المسلسل." #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_product_product__removal_time @@ -100,6 +107,8 @@ msgid "" "Number of days before the goods should be removed from the stock. It will be" " computed on the lot/serial number." msgstr "" +"عدد الأيام المتبقية حتى يتوجب إزالة البضاعة من المخزون. سيتم احتسابه من خلال" +" رقم اللوط/الرقم المسلسل." #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_product_product__use_time @@ -108,11 +117,13 @@ msgid "" "Number of days before the goods starts deteriorating, without being " "dangerous yet. It will be computed using the lot/serial number." msgstr "" +"عدد الأيام المتبقية حتى تبدأ البضاعة في التلف، لكنها تكون غير خطيرة بعد. " +"سيتم احتسابه من خلال رقم اللوط/الرقم المسلسل." #. module: product_expiry #: model:ir.model,name:product_expiry.model_procurement_group msgid "Procurement Group" -msgstr "مجموعه التوريدات " +msgstr "مجموعه التوريدات" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_product_product__alert_time @@ -123,13 +134,13 @@ msgstr "فترة التنبيه على المنتج" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__product_expiry_alert msgid "Product Expiry Alert" -msgstr "" +msgstr "تنبيه انتهاء صلاحية المنتج" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_product_product__life_time #: model:ir.model.fields,field_description:product_expiry.field_product_template__life_time msgid "Product Life Time" -msgstr "العمر الافتراضي" +msgstr "العمر الافتراضي للمنتج" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_product_product__removal_time @@ -162,13 +173,13 @@ msgstr "تاريخ الإزالة" #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_stock_production_lot__product_expiry_alert msgid "The Alert Date has been reached." -msgstr "" +msgstr "تم الوصول لتاريخ التنبيه." #. module: product_expiry #: code:addons/product_expiry/models/production_lot.py:84 #, python-format msgid "The alert date has been reached for this lot/serial number" -msgstr "" +msgstr "تم الوصول لتاريخ التنبيه لرقم اللوط/الرقم المسلسل هذا" #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_stock_production_lot__life_date @@ -176,8 +187,8 @@ msgid "" "This is the date on which the goods with this Serial Number may become " "dangerous and must not be consumed." msgstr "" -"هذا هو التاريخ التي ستصبح فيه المنتجات غير صالحة للاستهلاك الآدمي أو تصبح " -"خطرة فيه." +"هذا هو التاريخ التي قد تصبح فيه البضاعة التي تحمل هذا الرقم المسلسل خطيرة " +"وغير صالحة للاستهلاك الآدمي." #. module: product_expiry #: model:ir.model.fields,help:product_expiry.field_stock_production_lot__removal_date @@ -186,7 +197,7 @@ msgid "" "This is the date on which the goods with this Serial Number should be " "removed from the stock." msgstr "" -"هذا هو التاريخ الذي يجب إزالة المنتجات التي تحمل هذا الرقم المسلسل من " +"هذا هو التاريخ الذي يجب فيه إزالة البضاعة التي تحمل هذا الرقم المسلسل من " "المخزون." #. module: product_expiry @@ -195,5 +206,5 @@ msgid "" "This is the date on which the goods with this Serial Number start " "deteriorating, without being dangerous yet." msgstr "" -"هذا هو التاريخ الذي تبدأ فيه المنتجات التي تحمل هذا الرقم المسلسل في التلف، " -"ولكنها لن تصبح خطرة عند هذا التاريخ." +"هذا هو التاريخ الذي تبدأ فيه البضاعة التي تحمل هذا الرقم المسلسل في التلف، " +"لكنها تكون غير خطيرة بعد." diff --git a/addons/product_expiry/i18n/km.po b/addons/product_expiry/i18n/km.po index 42aac5e872d..ab52b4ce873 100644 --- a/addons/product_expiry/i18n/km.po +++ b/addons/product_expiry/i18n/km.po @@ -55,7 +55,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:product_expiry.view_move_form_expiry_simple #: model_terms:ir.ui.view,arch_db:product_expiry.view_product_form_expiry msgid "Dates" -msgstr "" +msgstr "កាលបរិច្ឆេទ" #. module: product_expiry #: model:ir.model.fields,field_description:product_expiry.field_stock_production_lot__life_date diff --git a/addons/product_margin/i18n/km.po b/addons/product_margin/i18n/km.po index f9f01236fda..1f34440a23d 100644 --- a/addons/product_margin/i18n/km.po +++ b/addons/product_margin/i18n/km.po @@ -237,7 +237,7 @@ msgstr "" #. module: product_margin #: model_terms:ir.ui.view,arch_db:product_margin.view_product_margin_form msgid "Purchases" -msgstr "" +msgstr "ការទិញ" #. module: product_margin #: model_terms:ir.ui.view,arch_db:product_margin.view_product_margin_form diff --git a/addons/product_margin/models/product_product.py b/addons/product_margin/models/product_product.py index 362fc1fbccb..8065dc32d27 100644 --- a/addons/product_margin/models/product_product.py +++ b/addons/product_margin/models/product_product.py @@ -107,8 +107,9 @@ class ProductProduct(models.Model): #Cost price is calculated afterwards as it is a property sqlstr = """ + WITH currency_rate AS ({}) SELECT - SUM(l.price_unit * l.quantity)/NULLIF(SUM(l.quantity),0) AS avg_unit_price, + SUM(l.price_unit / (CASE COALESCE(cr.rate, 0) WHEN 0 THEN 1.0 ELSE cr.rate END) * l.quantity) / NULLIF(SUM(l.quantity),0) AS avg_unit_price, SUM(l.quantity) AS num_qty, SUM(l.balance) AS total, SUM(l.quantity * pt.list_price) AS sale_expected @@ -116,6 +117,11 @@ class ProductProduct(models.Model): LEFT JOIN account_move i ON (l.move_id = i.id) LEFT JOIN product_product product ON (product.id=l.product_id) LEFT JOIN product_template pt ON (pt.id = product.product_tmpl_id) + left join currency_rate cr on + (cr.currency_id = i.currency_id and + cr.company_id = i.company_id and + cr.date_start <= COALESCE(i.invoice_date, NOW()) and + (cr.date_end IS NULL OR cr.date_end > COALESCE(i.invoice_date, NOW()))) WHERE l.product_id = %s AND i.state IN %s AND i.invoice_payment_state IN %s @@ -123,7 +129,7 @@ class ProductProduct(models.Model): AND i.invoice_date BETWEEN %s AND %s AND i.company_id = %s AND l.display_type IS NULL - """ + """.format(self.env['res.currency']._select_companies_rates()) invoice_types = ('out_invoice', 'in_refund') self.env.cr.execute(sqlstr, (val.id, states, invoice_payment_states, invoice_types, date_from, date_to, company_id)) result = self.env.cr.fetchall()[0] diff --git a/addons/project/i18n/km.po b/addons/project/i18n/km.po index b3913cf1961..5deb5839780 100644 --- a/addons/project/i18n/km.po +++ b/addons/project/i18n/km.po @@ -356,12 +356,12 @@ msgstr "" #. module: project #: model:ir.model.fields,field_description:project.field_project_project__alias_contact msgid "Alias Contact Security" -msgstr "" +msgstr "ការទំនាក់ទំនងដោយប្រុងប្រយ័ត្ន" #. module: project #: model:ir.model.fields,field_description:project.field_project_project__alias_name msgid "Alias Name" -msgstr "" +msgstr "ឈ្មោះក្លែក្លាយ" #. module: project #: model:ir.model.fields,field_description:project.field_project_project__alias_domain @@ -371,7 +371,7 @@ msgstr "" #. module: project #: model:ir.model.fields,field_description:project.field_project_project__alias_model_id msgid "Aliased Model" -msgstr "" +msgstr "គំរូឈ្មោះក្លែងក្លាយ" #. module: project #: code:addons/project/controllers/portal.py:111 @@ -798,7 +798,7 @@ msgstr "" #: model:ir.model.fields,help:project.field_project_project__access_url #: model:ir.model.fields,help:project.field_project_task__access_url msgid "Customer Portal URL" -msgstr "" +msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន" #. module: project #: model:ir.actions.act_window,name:project.rating_rating_action_project_report @@ -1243,7 +1243,7 @@ msgstr "ID" msgid "" "ID of the parent record holding the alias (example: project holding the task" " creation alias)" -msgstr "" +msgstr "អត្ថសញ្ញាឯកសារអាណព្យាបាលដំកល់ដោយមិនមានភាពច្បាស់លាស់" #. module: project #. openerp-web @@ -1352,7 +1352,7 @@ msgstr "" #: code:addons/project/static/src/js/project_task_kanban_examples.js:51 #, python-format msgid "Inbox" -msgstr "" +msgstr "សំបុត្រប្រអប់" #. module: project #: model:ir.model.fields,help:project.field_project_project__alias_id @@ -1514,7 +1514,7 @@ msgstr "" #: code:addons/project/static/src/js/project_task_kanban_examples.js:64 #, python-format msgid "Live" -msgstr "" +msgstr "រស់នៅ" #. module: project #: model_terms:ir.ui.view,arch_db:project.res_config_settings_view_form @@ -1582,7 +1582,7 @@ msgstr "" #. module: project #: model_terms:ir.ui.view,arch_db:project.view_project_project_filter msgid "My Favorites" -msgstr "" +msgstr "ចំណូលចិត្តរបស់ខ្ថុំ" #. module: project #: model_terms:ir.ui.view,arch_db:project.view_task_search_form @@ -1819,6 +1819,9 @@ msgid "" "attached, even if they did not reply to it. If set, this will disable the " "creation of new records completely." msgstr "" +"លេខសម្គាល់ស្រេចចិត្តនៃខ្សែស្រឡាយ (កំណត់ត្រា) " +"ដែលសារទាំងអស់នឹងត្រូវបានភ្ជាប់ទោះបីជាពួកគេមិនឆ្លើយតបទៅវាក៏ដោយ។ " +"ប្រសិនបើបានកំណត់វានឹងបិទការបង្កើតកំណត់ត្រាថ្មីទាំងស្រុង។" #. module: project #: model_terms:ir.actions.act_window,help:project.open_view_project_all @@ -1951,7 +1954,7 @@ msgstr "" #: model:ir.model.fields,field_description:project.field_project_project__access_url #: model:ir.model.fields,field_description:project.field_project_task__access_url msgid "Portal Access URL" -msgstr "" +msgstr "URL ចូលដំណើរការវិបផតថល" #. module: project #: model:ir.model.fields,field_description:project.field_project_task__priority @@ -2369,7 +2372,7 @@ msgstr "" #. module: project #: model_terms:ir.ui.view,arch_db:project.view_task_search_form msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: project #. openerp-web diff --git a/addons/project/i18n/vi.po b/addons/project/i18n/vi.po index 5612576901e..49893847088 100644 --- a/addons/project/i18n/vi.po +++ b/addons/project/i18n/vi.po @@ -924,7 +924,7 @@ msgstr "Phát triển" #. module: project #: model:ir.model,name:project.model_digest_digest msgid "Digest" -msgstr "" +msgstr "Tiêu" #. module: project #. openerp-web @@ -2617,7 +2617,7 @@ msgstr "" #. module: project #: model:ir.model.fields,field_description:project.field_res_config_settings__module_hr_timesheet msgid "Task Logs" -msgstr "" +msgstr "Nhật kí công việc" #. module: project #: model:ir.filters,name:project.filter_task_report_task_pipe diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 2da62547014..d1064e17896 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -271,7 +271,7 @@ class Project(models.Model): defaults = self._map_tasks_default_valeus(task) if task.parent_id: # set the parent to the duplicated task - defaults['parent_id'] = old_to_new_tasks[task.parent_id.id] + defaults['parent_id'] = old_to_new_tasks.get(task.parent_id.id, False) new_task = task.copy(defaults) old_to_new_tasks[task.id] = new_task.id tasks += new_task diff --git a/addons/project_timesheet_holidays/i18n/ar.po b/addons/project_timesheet_holidays/i18n/ar.po index 697c8c256d3..721407d60f9 100644 --- a/addons/project_timesheet_holidays/i18n/ar.po +++ b/addons/project_timesheet_holidays/i18n/ar.po @@ -3,19 +3,18 @@ # * project_timesheet_holidays # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 -# Martin Trigaux, 2018 # Osoul <baruni@osoul.ly>, 2018 -# Ghaith Gammar <g.gammar@saharaifs.net>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 # Ali Alrehawi <alrehawi@hotmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:23+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -26,7 +25,7 @@ msgstr "" #. module: project_timesheet_holidays #: model:ir.model,name:project_timesheet_holidays.model_account_analytic_line msgid "Analytic Line" -msgstr "البنود التحليلية" +msgstr "البند التحليلي" #. module: project_timesheet_holidays #: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave__timesheet_ids @@ -39,7 +38,7 @@ msgstr "البنود التحليلية" msgid "" "Both the internal project and task are required to generate timesheet for " "the leaves." -msgstr "" +msgstr "تحتاج للمشروع الداخلي والمهمة كليهما لإنشاء سجل نشاط للإجازات." #. module: project_timesheet_holidays #: model:ir.model,name:project_timesheet_holidays.model_res_company @@ -55,12 +54,12 @@ msgstr "ضبط الإعدادات" #: model:ir.model.fields,help:project_timesheet_holidays.field_res_company__leave_timesheet_project_id #: model:ir.model.fields,help:project_timesheet_holidays.field_res_config_settings__leave_timesheet_project_id msgid "Default project value for timesheet generated from leave type." -msgstr "" +msgstr "قيمة المشروع الافتراضية لسجل النشاط الناشئ من نوع الإجازة." #. module: project_timesheet_holidays #: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_generate msgid "Generate Timesheet" -msgstr "" +msgstr "إنشاء سجل نشاط" #. module: project_timesheet_holidays #: model:ir.model.fields,help:project_timesheet_holidays.field_hr_leave_type__timesheet_generate @@ -68,6 +67,8 @@ msgid "" "If checked, when validating a leave, timesheet will be generated in the " "Vacation Project of the company." msgstr "" +"إذا كان محددًا، عند اعتماد إجازة، سيتم إنشاء سجل نشاط في مشروع العطلة الخاص " +"بالمؤسسة." #. module: project_timesheet_holidays #: code:addons/project_timesheet_holidays/models/res_company.py:30 @@ -76,39 +77,39 @@ msgstr "" #: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_config_settings__leave_timesheet_project_id #, python-format msgid "Internal Project" -msgstr "" +msgstr "مشروع داخلي" #. module: project_timesheet_holidays #: model:ir.model.fields,field_description:project_timesheet_holidays.field_hr_leave_type__timesheet_task_id msgid "Internal Task for timesheet" -msgstr "" +msgstr "مهمة داخلية لسجل النشاط" #. module: project_timesheet_holidays #: model:ir.model,name:project_timesheet_holidays.model_hr_leave msgid "Leave" -msgstr "مغادرة" +msgstr "إجازة" #. module: project_timesheet_holidays #: model:ir.model.fields,field_description:project_timesheet_holidays.field_account_analytic_line__holiday_id msgid "Leave Request" -msgstr "طلب الاجازة" +msgstr "طلب الإجازة" #. module: project_timesheet_holidays #: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_company__leave_timesheet_task_id #: model:ir.model.fields,field_description:project_timesheet_holidays.field_res_config_settings__leave_timesheet_task_id msgid "Leave Task" -msgstr "" +msgstr "مهمة الإجازة" #. module: project_timesheet_holidays #: model:ir.model,name:project_timesheet_holidays.model_hr_leave_type msgid "Leave Type" -msgstr "نوع الاجازة" +msgstr "نوع الإجازة" #. module: project_timesheet_holidays #: code:addons/project_timesheet_holidays/models/res_company.py:40 #, python-format msgid "Leaves" -msgstr "مغادرات" +msgstr "الإجازات" #. module: project_timesheet_holidays #: model_terms:ir.ui.view,arch_db:project_timesheet_holidays.res_config_settings_view_form @@ -124,7 +125,7 @@ msgstr "المهمة" #: model:ir.model.fields,help:project_timesheet_holidays.field_hr_leave_type__timesheet_project_id msgid "" "The project will contain the timesheet generated when a leave is validated." -msgstr "" +msgstr "سيحتوي المشروع على سجل النشاط الناشئ عند اعتماد إجازة." #. module: project_timesheet_holidays #: code:addons/project_timesheet_holidays/models/account_analytic.py:16 @@ -132,4 +133,4 @@ msgstr "" msgid "" "You cannot delete timesheet lines attached to a leaves. Please cancel the " "leaves instead." -msgstr "" +msgstr "لا يمكنك حذف سجل نشاط مرتبط بإجازة. برجاء إلغاء الإجازة بدلًا من هذا." diff --git a/addons/purchase/i18n/cs.po b/addons/purchase/i18n/cs.po index 57d0150cdac..c711950c911 100644 --- a/addons/purchase/i18n/cs.po +++ b/addons/purchase/i18n/cs.po @@ -1178,7 +1178,7 @@ msgstr "Kategorie výrobku" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_order_line__product_image msgid "Product Image" -msgstr "" +msgstr "Obrázek produktu" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_report__unit_quantity diff --git a/addons/purchase/i18n/ja.po b/addons/purchase/i18n/ja.po index d3351ff4038..824de994fcd 100644 --- a/addons/purchase/i18n/ja.po +++ b/addons/purchase/i18n/ja.po @@ -1286,7 +1286,7 @@ msgstr "" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_res_config_settings__po_order_approval msgid "Purchase Order Approval" -msgstr "" +msgstr "購買オーダ承認" #. module: purchase #: model_terms:ir.ui.view,arch_db:purchase.report_purchaseorder_document diff --git a/addons/purchase/i18n/km.po b/addons/purchase/i18n/km.po index b62c7a4970a..c3c7e3e5fd4 100644 --- a/addons/purchase/i18n/km.po +++ b/addons/purchase/i18n/km.po @@ -533,7 +533,7 @@ msgstr "រូបិយវត្ថុ" #. module: purchase #: model:ir.model.fields,help:purchase.field_purchase_order__access_url msgid "Customer Portal URL" -msgstr "" +msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_bill_union__date @@ -763,7 +763,7 @@ msgstr "" #. module: purchase #: model_terms:ir.ui.view,arch_db:purchase.res_config_settings_view_form_purchase msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_order__message_is_follower @@ -820,7 +820,7 @@ msgstr "" #. module: purchase #: model_terms:ir.ui.view,arch_db:purchase.purchase_order_form msgid "Lock" -msgstr "" +msgstr "ចាក់សោរ" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_res_config_settings__lock_confirmed_po @@ -1114,7 +1114,7 @@ msgstr "" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_order__payment_term_id msgid "Payment Terms" -msgstr "" +msgstr "លក្ខ័ណការទូទាត់" #. module: purchase #: selection:purchase.order,activity_state:0 @@ -1124,7 +1124,7 @@ msgstr "" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_order__access_url msgid "Portal Access URL" -msgstr "" +msgstr "URL ចូលដំណើរការវិបផតថល" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_product_category__property_account_creditor_price_difference_categ @@ -1173,7 +1173,7 @@ msgstr "" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_report__unit_quantity msgid "Product Quantity" -msgstr "" +msgstr "បរិមាណផលិតផល" #. module: purchase #: model:ir.model,name:purchase.model_product_template @@ -1361,7 +1361,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:purchase.view_purchase_order_filter #: model_terms:ir.ui.view,arch_db:purchase.view_purchase_order_search msgid "Purchase Representative" -msgstr "" +msgstr "អ្នកតំណាងការទិញ" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_res_config_settings__group_warning_purchase @@ -1403,7 +1403,7 @@ msgstr "" #. module: purchase #: model_terms:ir.ui.view,arch_db:purchase.res_partner_view_purchase_buttons msgid "Purchases" -msgstr "" +msgstr "ការទិញ" #. module: purchase #: model:ir.model,name:purchase.model_purchase_bill_union @@ -1635,7 +1635,7 @@ msgstr "" #. module: purchase #: model_terms:ir.ui.view,arch_db:purchase.view_purchase_order_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_bill_union__reference @@ -1667,7 +1667,7 @@ msgstr "" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_purchase_order_line__price_subtotal msgid "Subtotal" -msgstr "" +msgstr "សរុប" #. module: purchase #: model:ir.model.fields,field_description:purchase.field_res_partner__property_purchase_currency_id diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml index 59d2076618a..761ccbc9367 100644 --- a/addons/purchase/views/purchase_views.xml +++ b/addons/purchase/views/purchase_views.xml @@ -172,7 +172,7 @@ placeholder="Name, TIN, Email, or Reference" /> <field name="partner_ref"/> - <field name="currency_id" groups="base.group_multi_currency"/> + <field name="currency_id" groups="base.group_multi_currency" force_save="1"/> </group> <group> <field name="date_order" attrs="{'invisible': [('state','=','purchase')]}"/> diff --git a/addons/purchase_requisition/i18n/km.po b/addons/purchase_requisition/i18n/km.po index a701faa172c..8d97a1cb5ce 100644 --- a/addons/purchase_requisition/i18n/km.po +++ b/addons/purchase_requisition/i18n/km.po @@ -557,7 +557,7 @@ msgstr "" #: model:ir.model.fields,field_description:purchase_requisition.field_purchase_requisition__user_id #: model_terms:ir.ui.view,arch_db:purchase_requisition.view_purchase_requisition_filter msgid "Purchase Representative" -msgstr "" +msgstr "អ្នកតំណាងការទិញ" #. module: purchase_requisition #: model:ir.model,name:purchase_requisition.model_purchase_requisition diff --git a/addons/repair/i18n/ar.po b/addons/repair/i18n/ar.po index 5a44e5b6d51..6d139f1c280 100644 --- a/addons/repair/i18n/ar.po +++ b/addons/repair/i18n/ar.po @@ -8,7 +8,6 @@ # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # Martin Trigaux, 2018 -# hoxhe Aits <hoxhe0@gmail.com>, 2018 # Osoul <baruni@osoul.ly>, 2018 # Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018 # Ghaith Gammar <g.gammar@saharaifs.net>, 2018 @@ -43,6 +42,8 @@ msgstr "" #: model:mail.template,subject:repair.mail_template_repair_quotation msgid "${object.partner_id.name} Repair Orders (Ref ${object.name or 'n/a' })" msgstr "" +"${object.partner_id.name} أوامر التصليح (رقم الإشارة ${object.name or 'n/a' " +"})" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -64,6 +65,12 @@ msgid "" "* The 'Done' status is set when repairing is completed.\n" "* The 'Cancelled' status is used when user cancel repair order." msgstr "" +"* تستخدم الحالة 'مسودة' عندما ينشئ المستخدم أمر تصليح جديد غير مؤكد.\n" +"* تستخدم الحالة 'مؤكد' عندما يقوم المستخدم بتأكيد أمر التصليح.\n" +"* تستخدم الحالة 'جاهز للتصليح' لبدء التصليح، لا يمكن للمستخدم بدء التصليح سوى بعد تأكيد أمر التصليح.\n" +"* تستخدم الحالة 'ينتظر الفوترة' لإنشاء الفاتورة قبل أو بعد انتهاء عملية التصليح.\n" +"* ينتقل أمر التصليح للحالة 'منتهي' عند إكتمال عملية التصليح.\n" +"* تستخدم الحالة 'ملغي' عندما يقوم المستخدم بإلغاء أمر التصليح." #. module: repair #: model:mail.template,body_html:repair.mail_template_repair_quotation @@ -87,6 +94,24 @@ msgid "" " </p>\n" "</div>" msgstr "" +"<?xml version=\"1.0\"?>\n" +"<div style=\"margin: 0px; padding: 0px;\">\n" +" <p style=\"margin: 0px; padding: 0px;font-size: 13px;\">\n" +" مرحبًا ${object.partner_id.name}،<br/>\n" +" إليك أمر الأصلاح الخاص بك ${doc_name} <strong>${object.name}</strong>\n" +" % if object.origin:\n" +" (برقم الإشارة: ${object.origin} )\n" +" % endif\n" +" % if object.invoice_method != 'none':\n" +" وقيمته <strong>${format_amount(object.amount_total, object.pricelist_id.currency_id)}.</strong><br/>\n" +" % else:\n" +" .<br/>\n" +" % endif\n" +" يمكنك الرد على هذه الرسالة إذا كان لديك أية أسئلة.\n" +" <br/><br/>\n" +" شكرًا لك،\n" +" </p>\n" +"</div>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -99,21 +124,23 @@ msgid "" "<span class=\"o_form_label\">This operation will cancel the Repair process, " "but will not cancel it's Invoice. Do you want to continue?</span>" msgstr "" +"<span class=\"o_form_label\">ستلغي هذه العملية عملية التصليح، لكنها لن تلغي " +"فاتورتها. هل تريد الاستمرار؟</span>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "<strong>Lot/Serial Number:</strong>" -msgstr "" +msgstr "<strong>رقم اللوط/الرقم المسلسل:</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "<strong>Operations</strong>" -msgstr "" +msgstr "</strong>العمليات</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "<strong>Parts</strong>" -msgstr "" +msgstr "<strong>الأجزاء</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -123,12 +150,12 @@ msgstr "<strong>تاريخ الطباعة:</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "<strong>Product to Repair:</strong>" -msgstr "<strong>منتج للتعديل:</strong>" +msgstr "<strong>المنتج المراد تصليحه:</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "<strong>Shipping address :</strong>" -msgstr "" +msgstr "<strong>عنوان الشحن:</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -143,12 +170,12 @@ msgstr "<strong>الإجمالي</strong>" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "<strong>Warranty:</strong>" -msgstr "" +msgstr "<strong>الضمان:</strong>" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__message_needaction msgid "Action Needed" -msgstr "الإجراء المطلوب" +msgstr "إجراء مطلوب" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__activity_ids @@ -168,12 +195,12 @@ msgstr "إضافة" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Add internal notes..." -msgstr "اضافه ملاحظات داخليه " +msgstr "إضافة ملاحظات داخلية..." #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Add quotation notes..." -msgstr "اضافه ملاحظات عروض الاسعار " +msgstr "إضافة ملاحظات عروض الأسعار..." #. module: repair #: selection:repair.order,invoice_method:0 @@ -200,13 +227,13 @@ msgstr "إلغاء" #: model:ir.model,name:repair.model_repair_cancel #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Cancel Repair" -msgstr "إلغي التصليح" +msgstr "إلغاء التصليح" #. module: repair #: model:ir.actions.act_window,name:repair.action_cancel_repair #: model_terms:ir.ui.view,arch_db:repair.view_cancel_repair msgid "Cancel Repair Order" -msgstr "الغاء امر التصليح" +msgstr "إلغاء أمر التصليح" #. module: repair #: selection:repair.line,state:0 selection:repair.order,state:0 @@ -217,7 +244,7 @@ msgstr "ملغي" #: code:addons/repair/models/repair.py:244 #, python-format msgid "Cannot cancel completed repairs." -msgstr "" +msgstr "لا يمكن إلغاء عملية تصليح مكتملة." #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__partner_id @@ -225,6 +252,9 @@ msgid "" "Choose partner for whom the order will be invoiced and delivered. You can " "find a partner by its Name, TIN, Email or Internal Reference." msgstr "" +"اختر الشريك الذي سيتم فوترة وتسليم أمر التصليح إليه. يمكنك إيجاد الشريك من " +"خلال الاسم أو الرقم التعريفي لدافع الضرائب (TIN)، أو البريد الالكتروني، أو " +"رقم الإشارة الداخلي." #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__company_id @@ -235,7 +265,7 @@ msgstr "المؤسسة" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Confirm Repair" -msgstr "اكد على التصليح" +msgstr "تأكيد التصليح" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter @@ -251,8 +281,8 @@ msgid "" "Couldn't find a pricelist line matching this product and quantity.\n" "You have to change either the product, the quantity or the pricelist." msgstr "" -"لا يمكن العثور على خط قائمة الأسعار مطابقة هذا المنتج وكميته.\n" -"لديك لتغيير أي من المنتجات، وكمية أو قائمة الأسعار. " +"لا يمكن العثور على بند قائمة أسعار مطابق لهذا المنتج والكمية.\n" +"عليك تغيير المنتج، أو الكمية أو قائمة الأسعار." #. module: repair #: model:ir.actions.act_window,name:repair.act_repair_invoice @@ -264,12 +294,12 @@ msgstr "إنشاء فاتورة" #. module: repair #: model:ir.model,name:repair.model_repair_order_make_invoice msgid "Create Mass Invoice (repair)" -msgstr "" +msgstr "إنشاء فاتورة جماعية (للتصليح)" #. module: repair #: model_terms:ir.actions.act_window,help:repair.action_repair_order_tree msgid "Create a new reparation order" -msgstr "" +msgstr "إنشاء أمر تصنيع جديد" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_make_invoice @@ -304,7 +334,7 @@ msgstr "العميل" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__default_address_id msgid "Default Address" -msgstr "" +msgstr "العنوان الافتراضي" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__address_id @@ -331,17 +361,17 @@ msgstr "مكان الوصول" #: model:ir.model.fields,field_description:repair.field_repair_order_make_invoice__display_name #: model:ir.model.fields,field_description:repair.field_stock_warn_insufficient_qty_repair__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_make_invoice msgid "Do you really want to create the invoice(s)?" -msgstr "هل تريد فعلاً إنشاء الفاتورة/الفواتبر؟" +msgstr "هل تريد فعلًا إنشاء هذه الفواتير؟" #. module: repair #: selection:repair.line,state:0 msgid "Done" -msgstr "تم" +msgstr "منتهي" #. module: repair #: selection:repair.line,state:0 @@ -351,12 +381,12 @@ msgstr "مسودة" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "End Repair" -msgstr "انهي التصليح" +msgstr "إنهاء التصليح" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__tracking msgid "Ensure the traceability of a storable product in your warehouse." -msgstr "" +msgstr "تأكد من إمكانية تتبع المنتج القابل للتخزين في مخزنك." #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form @@ -386,7 +416,7 @@ msgstr "المتابعون (الشركاء)" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Future Activities" -msgstr "الأنشطة القادمة" +msgstr "الأنشطة المستقبلية" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter @@ -396,7 +426,7 @@ msgstr "تجميع حسب" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order_make_invoice__group msgid "Group by partner invoice address" -msgstr "تجميع حسب عنوان ارسال الفواتير" +msgstr "تجميع حسب عنوان فواتير الشريك" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form @@ -416,17 +446,17 @@ msgstr "المعرف" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__message_unread msgid "If checked new messages require your attention." -msgstr "إذا حددته، سيتم إخطارك بالرسائل الجديدة." +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__message_needaction msgid "If checked, new messages require your attention." -msgstr "إذا حددته، سيتم إخطارك بالرسائل الجديدة." +msgstr "إذا كان محددًا، فهناك رسائل جديدة تحتاج لرؤيتها." #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__message_has_error msgid "If checked, some messages have a delivery error." -msgstr "إذا تم تحديده ، فإن بعض الرسائل بها خطأ في التسليم." +msgstr "إذا كان محددًا، فقد حدث خطأ في تسليم بعض الرسائل." #. module: repair #: model_terms:ir.actions.act_window,help:repair.action_repair_order_tree @@ -435,15 +465,15 @@ msgid "" " add or replace and record the time you spent on the different\n" " operations." msgstr "" -"في النظام الإصلاح، يمكنك التفصيل المكونات التي تزيل،\n" -"إضافة أو استبدال وتسجيل الوقت الذي قضيته على مختلف\n" -"عمليات." +"في أمر التصليح، يمكنك تفصيل المكونات التي تريد إزالتها،\n" +" أو إضافتها أو استبدالها، كما يمكنك تسجيل الوقت المستغرق على العمليات\n" +" المختلفة." #. module: repair #: code:addons/repair/models/repair.py:210 #, python-format msgid "Insufficient Quantity" -msgstr "" +msgstr "كمية غير كافية" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__internal_notes @@ -464,7 +494,7 @@ msgstr "الفاتورة" #. module: repair #: selection:repair.order,state:0 msgid "Invoice Exception" -msgstr "خلل في الفاتورة" +msgstr "خطأ في الفاتورة" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_fee__invoice_line_id @@ -480,7 +510,7 @@ msgstr "منهجية الفاتورة" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "Invoice address:" -msgstr "عنوان الفواتير:" +msgstr "عنوان الفاتورة:" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -504,7 +534,7 @@ msgstr "الكمية المفوترة" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__partner_invoice_id msgid "Invoicing Address" -msgstr "عنوان الفواتير" +msgstr "عنوان الفوترة" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__message_is_follower @@ -556,7 +586,7 @@ msgstr "المكان" #: model:ir.model.fields,field_description:repair.field_repair_line__lot_id #: model:ir.model.fields,field_description:repair.field_repair_order__lot_id msgid "Lot/Serial" -msgstr "اللوط/المسلسل" +msgstr "رقم اللوط/الرقم المسلسل" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__message_main_attachment_id @@ -581,7 +611,7 @@ msgstr "حركة" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__move_id msgid "Move created by the repair order" -msgstr "تحرك تم إنشاؤه بواسطه أمر التجهيز " +msgstr "تحرك تم إنشاؤه بواسطه أمر التصليح" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter @@ -591,12 +621,12 @@ msgstr "أنشطتي" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__activity_date_deadline msgid "Next Activity Deadline" -msgstr "الموعد النهائي للنشاط القادم" +msgstr "الموعد النهائي للنشاط التالي" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__activity_summary msgid "Next Activity Summary" -msgstr "ملخص النشاط القادم" +msgstr "ملخص النشاط التالي" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__activity_type_id @@ -626,20 +656,20 @@ msgstr "لا يوجد حساب محدد للمنتج \"%s\"." #: code:addons/repair/models/repair.py:658 #, python-format msgid "No pricelist found." -msgstr "" +msgstr "لم نتمكن من إيجاد أية قوائم أسعار." #. module: repair #: code:addons/repair/models/repair.py:355 #, python-format msgid "No product defined on fees." -msgstr "" +msgstr "لا يوجد منتج معرف للرسوم." #. module: repair #: code:addons/repair/models/repair.py:605 #: code:addons/repair/models/repair.py:665 #, python-format msgid "No valid pricelist line found." -msgstr "" +msgstr "لم نتمكن من إيجاد أية بنود صالحة بقائمة الأسعار." #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form @@ -654,17 +684,17 @@ msgstr "عدد الإجراءات" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__message_has_error_counter msgid "Number of error" -msgstr "عدد الاخطاء" +msgstr "عدد الأخطاء" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__message_needaction_counter msgid "Number of messages which requires an action" -msgstr "عدد الرسائل التي تتطلب اجراء" +msgstr "عدد الرسائل التي تتطلب إجراء" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__message_has_error_counter msgid "Number of messages with delivery error" -msgstr "عدد الرسائل مع خطأ في التسليم" +msgstr "عدد الرسائل الحادث بها خطأ في التسليم" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__message_unread_counter @@ -675,7 +705,7 @@ msgstr "عدد الرسائل الجديدة" #: code:addons/repair/models/repair.py:232 #, python-format msgid "Only draft repairs can be confirmed." -msgstr "" +msgstr "لا يمكن تأكيد أوامر التصليح إلا إذا كانت في حالة المسودة." #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__fees_lines @@ -697,7 +727,7 @@ msgstr "الشريك" #: model:ir.model.fields,field_description:repair.field_repair_order__operations #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Parts" -msgstr "" +msgstr "الأجزاء" #. module: repair #: selection:repair.order,activity_state:0 @@ -707,22 +737,22 @@ msgstr "مخطط" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "Price" -msgstr "سعر" +msgstr "السعر" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__pricelist_id msgid "Pricelist" -msgstr "قائمه الاسعار" +msgstr "قائمة الأسعار" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__pricelist_id msgid "Pricelist of the selected partner." -msgstr "لائحة الأسعار للشريك المحدد. " +msgstr "قائمة أسعار الشريك المحدد." #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Print Quotation" -msgstr "" +msgstr "طباعة عرض السعر" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_fee__product_id @@ -747,17 +777,17 @@ msgstr "وحدة قياس المنتج" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__product_id msgid "Product to Repair" -msgstr "منتج مطلوب تصليحه" +msgstr "المنتج المطلوب تصليحه" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__lot_id msgid "Products repaired are all belonging to this lot" -msgstr "المنتجات التى تم إصلاحها جميعهم ينتمون إلى هذا اللوت " +msgstr "تنتمي كافة المنتجات التى تم تصليحها لرقم اللوط هذا" #. module: repair #: model:ir.model.fields,field_description:repair.field_stock_warn_insufficient_qty_repair__quant_ids msgid "Quant" -msgstr "" +msgstr "الكمية" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_fee__product_uom_qty @@ -770,22 +800,22 @@ msgstr "الكمية" #. module: repair #: selection:repair.order,state:0 msgid "Quotation" -msgstr "عرض مبدئي" +msgstr "عرض سعر" #. module: repair #: model:ir.actions.report,name:repair.action_report_repair_order msgid "Quotation / Order" -msgstr "أمر المبيعات" +msgstr "عرض السعر/الأمر" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__quotation_notes msgid "Quotation Notes" -msgstr "ملاحظات عن التسعير" +msgstr "إضافة ملاحظات عروض الأسعار" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Quotations" -msgstr "طلب شراء مبدئي" +msgstr "عروض الأسعار" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter @@ -811,86 +841,86 @@ msgstr "التصليح" #. module: repair #: model:ir.model,name:repair.model_repair_fee msgid "Repair Fees" -msgstr "" +msgstr "رسوم التصليح" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Repair Line" -msgstr "خط التصليح" +msgstr "بند أمر التصليح" #. module: repair #: model:ir.model,name:repair.model_repair_line msgid "Repair Line (parts)" -msgstr "" +msgstr "بند أمر التصليح (الأجزاء)" #. module: repair #: model:ir.model,name:repair.model_repair_order #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Repair Order" -msgstr "امر التصليح" +msgstr "أمر التصليح" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "Repair Order #:" -msgstr "تعديل الطلب #:" +msgstr "أمر التصليح رقم:" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_fee__repair_id #: model:ir.model.fields,field_description:repair.field_repair_line__repair_id msgid "Repair Order Reference" -msgstr "مرجع امر التصليح" +msgstr "رقم إشارة أمر التصليح" #. module: repair #: model:ir.actions.act_window,name:repair.action_repair_order_tree #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Repair Orders" -msgstr "اوامر التصليح" +msgstr "أوامر التصليح" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder msgid "Repair Quotation #:" -msgstr "تعديل التسعيرة #:" +msgstr "عرض سعر التصليح رقم:" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__name msgid "Repair Reference" -msgstr "مرجع التصليح" +msgstr "رقم إشارة التصليح" #. module: repair #: code:addons/repair/models/repair.py:196 #, python-format msgid "Repair must be canceled in order to reset it to draft." -msgstr "" +msgstr "يجب أن يكون أمر التصليح ملغيًا لكي يُعين كمسودة." #. module: repair #: code:addons/repair/models/repair.py:404 #, python-format msgid "Repair must be confirmed before starting reparation." -msgstr "" +msgstr "يجب تأكيد أمر التصليح قبل بدء عملية التصليح." #. module: repair #: code:addons/repair/models/repair.py:432 #, python-format msgid "Repair must be repaired in order to make the product moves." -msgstr "" +msgstr "يجب تنفيذ أمر التصليح لتتمكن من إنشاء تحركات المنتج." #. module: repair #: code:addons/repair/models/repair.py:415 #, python-format msgid "Repair must be under repair in order to end reparation." -msgstr "" +msgstr "يجب أن يكون أمر التصليح قيد العمل لتتمكن من إنهاءه." #. module: repair #: code:addons/repair/wizard/repair_cancel.py:20 #, python-format msgid "Repair order is not invoiced." -msgstr "لم يتم انشاء الفاتورة لامر التصليح" +msgstr "أمر التصليح غير مفوتر." #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__repaired #: selection:repair.order,state:0 msgid "Repaired" -msgstr "تم اصلاحه" +msgstr "تم تصليحه" #. module: repair #: model:ir.ui.menu,name:repair.menu_repair_order @@ -901,7 +931,7 @@ msgstr "تعديلات" #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_tree msgid "Repairs order" -msgstr "امر التصليحات" +msgstr "أمر التصليحات" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__activity_user_id @@ -911,7 +941,7 @@ msgstr "المستخدم المسئول" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Search Repair Orders" -msgstr "" +msgstr "البحث في أوامر التصليح" #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__invoice_method @@ -920,20 +950,20 @@ msgid "" "invoice before or after the repair is done respectively. 'No invoice' means " "you don't want to generate invoice for this repair order." msgstr "" -"اختيار 'قبل إصلاح \"أو\" بعد إصلاح \"سوف تسمح لك لتوليد فاتورة قبل أو بعد " -"الانتهاء من إصلاح على التوالي. 'لا يوجد فاتورة' يعني أنك لا تريد أن تولد " -"الفواتير لهذا أمر ال اصلاح . " +"سيسمح لك اختيار 'قبل تصليح' أو 'بعد تصليح' بإنشاء فاتورة قبل أو بعد الانتهاء" +" من التصليح. 'لا يوجد فاتورة' يعني أنك لا تريد إنشاء فواتير لأمر التصليح " +"هذا." #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Send Quotation" -msgstr "" +msgstr "إرسال عرض السعر" #. module: repair #: code:addons/repair/models/repair.py:545 #, python-format msgid "Serial number is required for operation line with product '%s'" -msgstr "مطلوب رقم تسلسلي لخط العملية مع المنتج '%s'" +msgstr "مطلوب رقم مسلسل لبند عملية المنتج '%s'" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form @@ -943,8 +973,7 @@ msgstr "تعيين كمسودة" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Show all records which has next action date is before today" -msgstr "" -"عرض كافة السجلات التي تاريخ الإجراء التالي فيها يسبق تاريخ اليوم الجاري" +msgstr "عرض كافة السجلات المُعين لها تاريخ إجراء تالي يسبق تاريخ اليوم الجاري" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_line__location_id @@ -954,7 +983,7 @@ msgstr "مكان المورد" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Start Repair" -msgstr "ابدأ التصليح" +msgstr "بدء التصليح" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_line__state @@ -974,7 +1003,7 @@ msgstr "" "الحالة على أساس الأنشطة\n" "المتأخرة: تاريخ الاستحقاق مر\n" "اليوم: تاريخ النشاط هو اليوم\n" -"المخطط: الأنشطة المستقبلية" +"المخطط: الأنشطة المستقبلية." #. module: repair #: model:ir.model,name:repair.model_stock_move @@ -985,7 +1014,7 @@ msgstr "حركة المخزون" #: model:ir.model.fields,field_description:repair.field_repair_fee__price_subtotal #: model:ir.model.fields,field_description:repair.field_repair_line__price_subtotal msgid "Subtotal" -msgstr "المجموع" +msgstr "الإجمالي الفرعي" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -1003,7 +1032,7 @@ msgstr "الضرائب" #. module: repair #: sql_constraint:repair.order:0 msgid "The name of the Repair Order must be unique!" -msgstr "أسم أمر الاصلا لابد أن يكون فريدا .!" +msgstr "يجب أن يكون اسم أمر التصليح فريدًا!" #. module: repair #: code:addons/repair/models/repair.py:172 @@ -1011,13 +1040,13 @@ msgstr "أسم أمر الاصلا لابد أن يكون فريدا .!" msgid "" "The product unit of measure you chose has a different category than the " "product unit of measure." -msgstr "" +msgstr "فئة وحدة القياس التى اخترتها مختلفة عن وحدة قياس المنتج." #. module: repair #: code:addons/repair/models/repair.py:246 #, python-format msgid "The repair order is already invoiced." -msgstr "" +msgstr "تمت فوترة أمر التصليح بالفعل." #. module: repair #: model_terms:ir.actions.act_window,help:repair.action_repair_order_tree @@ -1026,9 +1055,9 @@ msgid "" " order to know if whether the repair should be invoiced to the\n" " customer or not." msgstr "" -"يستخدم النظام الإصلاح تاريخ الضمان على الرقم التسلسلي\n" -"لمعرفة ما إذا ما إذا كان ينبغي أعطى فواتير إصلاح \n" -"للعميل أم لا." +"تستخدم أوامر التصليح تاريخ الضمان على الرقم المسلسل\n" +" لمعرفة ما إذا كان ينبغي إنشاء فواتير للعميل مقابل التصليح\n" +" أم لا." #. module: repair #: model:ir.model.fields,help:repair.field_repair_line__state @@ -1036,16 +1065,17 @@ msgid "" "The status of a repair line is set automatically to the one of the linked " "repair order." msgstr "" +"تحدد حالة بند أمر التصليح تلقائيًا تبعًا لحالة أمر التصليح المرتبط به." #. module: repair #: model:ir.model.fields,help:repair.field_repair_order__location_id msgid "This is the location where the product to repair is located." -msgstr "" +msgstr "هذا هو موقع المنتج المراد تصليحه." #. module: repair #: selection:repair.order,state:0 msgid "To be Invoiced" -msgstr "ليتم عمل الفاتورة" +msgstr "مطلوب فوترته" #. module: repair #: selection:repair.order,activity_state:0 @@ -1070,7 +1100,7 @@ msgstr "المبلغ الإجمالي" #. module: repair #: model:ir.model,name:repair.model_stock_traceability_report msgid "Traceability Report" -msgstr "" +msgstr "تقرير التتبع" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__tracking @@ -1085,7 +1115,7 @@ msgstr "النوع" #. module: repair #: selection:repair.order,state:0 msgid "Under Repair" -msgstr "تحت التصليح" +msgstr "قيد التصليح" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_fee__price_unit @@ -1097,7 +1127,7 @@ msgstr "سعر الوحدة" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Unit of Measure" -msgstr "وحده القياس " +msgstr "وحدة القياس" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__message_unread @@ -1122,7 +1152,7 @@ msgstr "المبلغ بدون ضرائب" #. module: repair #: model:ir.model,name:repair.model_stock_warn_insufficient_qty_repair msgid "Warn Insufficient Repair Quantity" -msgstr "" +msgstr "التحذير من كمية تصليح غير كافية" #. module: repair #: code:addons/repair/models/repair.py:172 @@ -1134,7 +1164,7 @@ msgstr "تحذير" #: model:ir.model.fields,field_description:repair.field_repair_order__guarantee_limit #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Warranty Expiration" -msgstr "انتهاء الضمان " +msgstr "انتهاء فترة الضمان" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__website_message_ids @@ -1159,9 +1189,11 @@ msgid "" "You have to select a pricelist in the Repair form !\n" " Please set one before choosing a product." msgstr "" +"يجب اختيار قائمة أسعار فى نموذج التصليح!\n" +"برجاء تعيين واحدة قبل اختيار المنتج." #. module: repair #: code:addons/repair/models/repair.py:296 #, python-format msgid "You have to select an invoice address in the repair form." -msgstr "" +msgstr "يجب اختيار عنوان للفاتورة في نموذج التصليح." diff --git a/addons/repair/i18n/cs.po b/addons/repair/i18n/cs.po index aeac20bbfca..c689996a030 100644 --- a/addons/repair/i18n/cs.po +++ b/addons/repair/i18n/cs.po @@ -797,7 +797,7 @@ msgstr "" #. module: repair #: model:ir.model,name:repair.model_repair_fee msgid "Repair Fees" -msgstr "" +msgstr "Poplatky za opravy" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form diff --git a/addons/repair/i18n/it.po b/addons/repair/i18n/it.po index a147a70cddb..75b00321ff2 100644 --- a/addons/repair/i18n/it.po +++ b/addons/repair/i18n/it.po @@ -10,8 +10,7 @@ # Lorenzo Battistini <lorenzo.battistini@agilebg.com>, 2018 # Luigi Di Naro <gigidn@gmail.com>, 2018 # Simone Bernini <simone@aperturelabs.it>, 2018 -# Giacomo Grasso <giacomo.grasso.82@gmail.com>, 2018 -# Sebastiano Pistore <SebastianoPistore.info@protonmail.ch>, 2018 +# SebastianoPistore <SebastianoPistore.info@protonmail.ch>, 2018 # Christian <chris@effeci.info>, 2018 # Paolo Valier, 2018 # David Minneci <david@numeko.it>, 2018 @@ -681,7 +680,7 @@ msgstr "Operazioni" #. module: repair #: selection:repair.order,activity_state:0 msgid "Overdue" -msgstr "Scaduto" +msgstr "In ritardo" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter @@ -697,7 +696,7 @@ msgstr "Componenti" #. module: repair #: selection:repair.order,activity_state:0 msgid "Planned" -msgstr "Pianificato" +msgstr "Pianificata" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder @@ -967,10 +966,10 @@ msgid "" "Today: Activity date is today\n" "Planned: Future activities." msgstr "" -"Stato basato sulle attività:\n" -"In ritardo: la data pianificata è scaduta\n" -"Oggi: la data dell'attività è oggi\n" -"Pianificata: attività future." +"Stato basato sulle attività\n" +"In ritardo: data di scadenza già superata\n" +"Oggi: attività in data odierna\n" +"Pianificato: attività future." #. module: repair #: model:ir.model,name:repair.model_stock_move @@ -1048,7 +1047,7 @@ msgstr "Oggi" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Today Activities" -msgstr "Attività di Oggi" +msgstr "Attività odierne" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__amount_total diff --git a/addons/repair/i18n/km.po b/addons/repair/i18n/km.po index db1614e4c04..55632abafa3 100644 --- a/addons/repair/i18n/km.po +++ b/addons/repair/i18n/km.po @@ -386,7 +386,7 @@ msgstr "" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "History" -msgstr "" +msgstr "ប្រវត្តិ" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_cancel__id @@ -663,7 +663,7 @@ msgstr "" #: model:ir.model.fields,field_description:repair.field_repair_order__fees_lines #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form msgid "Operations" -msgstr "" +msgstr "ប្រតិបត្តិការ" #. module: repair #: selection:repair.order,activity_state:0 @@ -717,7 +717,7 @@ msgstr "ផលិតផល" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_order__product_qty msgid "Product Quantity" -msgstr "" +msgstr "បរិមាណផលិតផល" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_fee__product_uom @@ -922,7 +922,7 @@ msgstr "" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.view_repair_order_form_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: repair #: model:ir.model.fields,field_description:repair.field_repair_line__location_id @@ -959,7 +959,7 @@ msgstr "" #: model:ir.model.fields,field_description:repair.field_repair_fee__price_subtotal #: model:ir.model.fields,field_description:repair.field_repair_line__price_subtotal msgid "Subtotal" -msgstr "" +msgstr "សរុប" #. module: repair #: model_terms:ir.ui.view,arch_db:repair.report_repairorder diff --git a/addons/sale/i18n/ja.po b/addons/sale/i18n/ja.po index 68a1a75ebfd..0c006f85e25 100644 --- a/addons/sale/i18n/ja.po +++ b/addons/sale/i18n/ja.po @@ -1093,13 +1093,13 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_res_config_settings__use_quotation_validity_days msgid "Default Quotation Validity" -msgstr "" +msgstr "デフォルト見積有効期間" #. module: sale #: model:ir.model.fields,field_description:sale.field_res_company__quotation_validity_days #: model:ir.model.fields,field_description:sale.field_res_config_settings__quotation_validity_days msgid "Default Quotation Validity (Days)" -msgstr "" +msgstr "デフォルト見積有効期間(日)" #. module: sale #: model:ir.model.fields,field_description:sale.field_res_config_settings__use_sale_note @@ -3189,7 +3189,7 @@ msgstr "請求ターゲットを設定" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form msgid "Set a default validity on your quotations" -msgstr "" +msgstr "見積にデフォルトの有効期間を設定" #. module: sale #. openerp-web @@ -4014,7 +4014,7 @@ msgstr "" msgid "" "You must define a product for everything you purchase,\n" " whether it's a physical product, a consumable or services." -msgstr "" +msgstr "在庫管理対象、消耗品、サービスに関わらず、購買するもの全てにつきプロダクトを作成してください。" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template diff --git a/addons/sale/i18n/km.po b/addons/sale/i18n/km.po index 8d27ad1facd..f4dec487c6d 100644 --- a/addons/sale/i18n/km.po +++ b/addons/sale/i18n/km.po @@ -592,7 +592,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order_line__analytic_line_ids msgid "Analytic lines" -msgstr "" +msgstr "បន្ទាត់វិភាគ" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.sale_onboarding_quotation_layout_form @@ -851,12 +851,12 @@ msgstr "កំណត់ផ្លាស់ប្តូរ" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.view_order_form msgid "Configure a product" -msgstr "" +msgstr "កំណត់ផលិតផល" #. module: sale #: model:ir.actions.act_window,name:sale.action_open_sale_onboarding_quotation_layout msgid "Configure your document layout" -msgstr "" +msgstr "កំណត់ប្លង់ឯកសាររបស់អ្នក" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form @@ -1008,7 +1008,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,help:sale.field_sale_order__access_url msgid "Customer Portal URL" -msgstr "" +msgstr "អាសយដ្ឋានវិបផតថលរបស់អតិថិជន" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order__client_order_ref @@ -1018,7 +1018,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__deposit_taxes_id msgid "Customer Taxes" -msgstr "" +msgstr "ពន្ធអតិថិជន" #. module: sale #: model:ir.ui.menu,name:sale.res_partner_menu @@ -1035,7 +1035,7 @@ msgstr "" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.onboarding_quotation_layout_step msgid "Customize" -msgstr "" +msgstr "អតិថិជន" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.onboarding_quotation_layout_step @@ -1505,7 +1505,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_advance_payment_inv__deposit_account_id msgid "Income Account" -msgstr "" +msgstr "គណនីចំណូល" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form @@ -1569,7 +1569,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order_line__invoice_lines msgid "Invoice Lines" -msgstr "" +msgstr "វិកយបត្រខែ្ស" #. module: sale #: model:ir.actions.act_window,name:sale.action_view_sale_advance_payment_inv @@ -1585,7 +1585,7 @@ msgstr "" #: model:ir.model.fields,field_description:sale.field_sale_order__invoice_status #: model:ir.model.fields,field_description:sale.field_sale_order_line__invoice_status msgid "Invoice Status" -msgstr "" +msgstr "ស្ថានភាពវិក័យប័ត្រ" #. module: sale #: model:ir.model.fields,help:sale.field_sale_order__partner_invoice_id @@ -1650,12 +1650,12 @@ msgstr "វិកិយប័ត្រ" #. module: sale #: model:ir.actions.act_window,name:sale.action_account_invoice_report_salesteam msgid "Invoices Analysis" -msgstr "" +msgstr "វិភាគវិក័យប័ត្រ" #. module: sale #: model:ir.model,name:sale.model_account_invoice_report msgid "Invoices Statistics" -msgstr "" +msgstr "ស្ថិតិវិក្កយបត្រ" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.view_sale_advance_payment_inv @@ -1676,7 +1676,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form #: model_terms:ir.ui.view,arch_db:sale.view_order_form msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: sale #: model:ir.model.fields,field_description:sale.field_product_template__invoice_policy @@ -1812,7 +1812,7 @@ msgstr "" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.view_order_form msgid "Lock" -msgstr "" +msgstr "ចាក់សោរ" #. module: sale #: model:ir.model.fields,field_description:sale.field_res_config_settings__auto_done_setting @@ -2376,12 +2376,12 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order__reference msgid "Payment Ref." -msgstr "" +msgstr "សេចក្ដីយោងការបង់ប្រាក់" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order__payment_term_id msgid "Payment Terms" -msgstr "" +msgstr "លក្ខ័ណការទូទាត់" #. module: sale #: model:ir.model,name:sale.model_payment_transaction @@ -2425,7 +2425,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order__access_url msgid "Portal Access URL" -msgstr "" +msgstr "URL ចូលដំណើរការវិបផតថល" #. module: sale #: selection:sale.report,state:0 @@ -2440,7 +2440,7 @@ msgstr "" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.view_order_form msgid "Preview" -msgstr "" +msgstr "ពីមុន" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.product_configurator_configure_optional_products @@ -2572,7 +2572,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_report_all_channels_sales__product_qty msgid "Product Quantity" -msgstr "" +msgstr "បរិមាណផលិតផល" #. module: sale #: model:ir.model,name:sale.model_product_template @@ -2655,7 +2655,7 @@ msgstr "ចំនួន" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.view_order_form msgid "Quantity:" -msgstr "" +msgstr "បរិមាណ:" #. module: sale #: code:addons/sale/models/sale.py:262 @@ -2903,7 +2903,7 @@ msgstr "" #. module: sale #: model:ir.model,name:sale.model_crm_team msgid "Sales Channels" -msgstr "" +msgstr "លក់" #. module: sale #: selection:sale.report,state:0 @@ -3000,7 +3000,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:sale.view_order_product_search #: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: sale #: model:ir.ui.menu,name:sale.report_sales_team @@ -3229,7 +3229,7 @@ msgstr "" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.view_sales_order_filter msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: sale #: model_terms:ir.ui.view,arch_db:sale.res_config_settings_view_form @@ -3363,7 +3363,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order_line__price_subtotal msgid "Subtotal" -msgstr "" +msgstr "សរុប" #. module: sale #: model:ir.model.fields,help:sale.field_crm_team__invoiced_target @@ -3375,7 +3375,7 @@ msgstr "" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order__amount_by_group msgid "Tax amount by group" -msgstr "" +msgstr "ចំនួនពន្ធតាមក្រុម" #. module: sale #: model:ir.model.fields,field_description:sale.field_sale_order__amount_tax diff --git a/addons/sale/i18n/vi.po b/addons/sale/i18n/vi.po index 51c06ce54b2..a9046eef3ea 100644 --- a/addons/sale/i18n/vi.po +++ b/addons/sale/i18n/vi.po @@ -3459,7 +3459,7 @@ msgstr "Các thuế được dùng cho các khoản đặt cọc" #. module: sale #: model:ir.model.fields,help:sale.field_sale_order_line__display_type msgid "Technical field for UX purpose." -msgstr "" +msgstr "Trường kỹ thuật cho mục đích UX." #. module: sale #: model_terms:ir.ui.view,arch_db:sale.sale_order_portal_template diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index b879d397974..2fe56bb5fd9 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -208,7 +208,10 @@ class SaleOrder(models.Model): if not order.company_id: order.currency_rate = order.currency_id.with_context(date=order.date_order).rate or 1.0 continue - order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order) + elif order.company_id.currency_id and order.currency_id: # the following crashes if any one is undefined + order.currency_rate = self.env['res.currency']._get_conversion_rate(order.company_id.currency_id, order.currency_id, order.company_id, order.date_order) + else: + order.currency_rate = 1.0 def _compute_access_url(self): super(SaleOrder, self)._compute_access_url() diff --git a/addons/sale/security/sale_security.xml b/addons/sale/security/sale_security.xml index 129046dac20..d886e8580ca 100644 --- a/addons/sale/security/sale_security.xml +++ b/addons/sale/security/sale_security.xml @@ -59,6 +59,21 @@ <field name="domain_force">['|',('company_id','=',False),('company_id', 'in', company_ids)]</field> </record> + <!-- Payments --> + <record id="payment_transaction_salesman_rule" model="ir.rule"> + <field name="name">Access every payment transaction</field> + <field name="model_id" ref="payment.model_payment_transaction"/> + <field name="domain_force">[(1, '=', 1)]</field> + <field name="groups" eval="[(4, ref('sales_team.group_sale_salesman'))]"/> + </record> + + <record id="payment_token_salesman_rule" model="ir.rule"> + <field name="name">Access every payment token</field> + <field name="model_id" ref="payment.model_payment_token"/> + <field name="domain_force">[(1, '=', 1)]</field> + <field name="groups" eval="[(4, ref('sales_team.group_sale_salesman'))]"/> + </record> + <!-- Portal Access Rules --> <record id="sale_order_rule_portal" model="ir.rule"> <field name="name">Portal Personal Quotations/Sales Orders</field> diff --git a/addons/sale/tests/test_sale_signature.py b/addons/sale/tests/test_sale_signature.py index 076104cbf53..39e982279fd 100644 --- a/addons/sale/tests/test_sale_signature.py +++ b/addons/sale/tests/test_sale_signature.py @@ -15,6 +15,7 @@ class TestSaleSignature(odoo.tests.HttpCase): 'name': 'test SO', 'partner_id': portal_user.id, 'state': 'sent', + 'require_payment': False, }) self.env['sale.order.line'].create({ 'order_id': sales_order.id, diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index 8263eff54b7..c88d7a9f430 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -19,7 +19,7 @@ class SaleAdvancePaymentInv(models.TransientModel): @api.model def _default_product_id(self): product_id = self.env['ir.config_parameter'].sudo().get_param('sale.default_deposit_product_id') - return self.env['product.product'].browse(int(product_id)) + return self.env['product.product'].browse(int(product_id)).exists() @api.model def _default_deposit_account_id(self): diff --git a/addons/sale_crm/i18n/km.po b/addons/sale_crm/i18n/km.po index 8041a4dffd4..d03da4e97a8 100644 --- a/addons/sale_crm/i18n/km.po +++ b/addons/sale_crm/i18n/km.po @@ -120,7 +120,7 @@ msgstr "" #. module: sale_crm #: model:ir.model,name:sale_crm.model_crm_team msgid "Sales Channels" -msgstr "" +msgstr "លក់" #. module: sale_crm #: model:ir.model.fields,field_description:sale_crm.field_account_invoice__source_id diff --git a/addons/sale_expense/i18n/km.po b/addons/sale_expense/i18n/km.po index 499529764f7..17b4242965b 100644 --- a/addons/sale_expense/i18n/km.po +++ b/addons/sale_expense/i18n/km.po @@ -50,7 +50,7 @@ msgstr "" #. module: sale_expense #: model_terms:ir.ui.view,arch_db:sale_expense.product_product_view_form_inherit_sale_expense msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: sale_expense #: model:ir.model,name:sale_expense.model_sale_order diff --git a/addons/sale_management/i18n/ar.po b/addons/sale_management/i18n/ar.po index 8eb1509c2be..6ace68b5b06 100644 --- a/addons/sale_management/i18n/ar.po +++ b/addons/sale_management/i18n/ar.po @@ -5,13 +5,12 @@ # Translators: # hoxhe Aits <hoxhe0@gmail.com>, 2018 # Mohammed Ibrahim <m.ibrahim@mussder.com>, 2018 +# Ghaith Gammar <g.gammar@saharaifs.net>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 -# AMAAL RU <Fabu1410@yahoo.com>, 2018 # Zuhair Hammadi <zuhair12@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 # Martin Trigaux, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 -# Ghaith Gammar <g.gammar@saharaifs.net>, 2018 # Ali Alrehawi <alrehawi@hotmail.com>, 2018 # Osoul <baruni@osoul.ly>, 2018 # Mustafa Rawi <mustafa@cubexco.com>, 2018 @@ -39,7 +38,7 @@ msgstr "% خصم" #. module: sale_management #: model:sale.order.template.line,name:sale_management.sale_order_template_line_1 msgid "4 Person Desk" -msgstr "" +msgstr "مكتب لأربعة أشخاص" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form @@ -57,7 +56,7 @@ msgstr "<span>الخصم</span>" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.report_saleorder_document_inherit_sale_management msgid "<span>Optional Products</span>" -msgstr "" +msgstr "<span>منتجات اختيارية</span>" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__active @@ -67,7 +66,7 @@ msgstr "نشط" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form msgid "Add a note" -msgstr "أضف ملاحظة" +msgstr "إضافة ملاحظة" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_form_quote @@ -83,22 +82,22 @@ msgstr "إضافة قسم" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management msgid "Add one" -msgstr "" +msgstr "إضافة واحدة" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management msgid "Add to cart" -msgstr "" +msgstr "أضف إلى عربة التسوق" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_form_quote msgid "Add to order lines" -msgstr "" +msgstr "إضافته لبنود الأمر" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_digest_digest__kpi_all_sale_total msgid "All Sales" -msgstr "" +msgstr "كافة المبيعات" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_search @@ -108,12 +107,12 @@ msgstr "مؤرشف" #. module: sale_management #: model:ir.ui.menu,name:sale_management.menu_catalog_variants_action msgid "Attribute Values" -msgstr "قيم الصفات" +msgstr "قيم الخاصية" #. module: sale_management #: model:ir.ui.menu,name:sale_management.menu_product_attribute_action msgid "Attributes" -msgstr "الصفات" +msgstr "الخصائص" #. module: sale_management #: model:ir.model,name:sale_management.model_res_config_settings @@ -128,7 +127,7 @@ msgstr "تأكيد" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__mail_template_id msgid "Confirmation Mail" -msgstr "" +msgstr "رسالة التأكيد" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_view_form @@ -138,12 +137,12 @@ msgstr "إنشاء فاتورة" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form msgid "Create standardized offers with default products" -msgstr "" +msgstr "إنشاء عروض قياسية بالمنتجات الافتراضية" #. module: sale_management #: model_terms:ir.actions.act_window,help:sale_management.sale_order_template_action msgid "Create your quotation template" -msgstr "" +msgstr "إنشاء قالب عرض السعر" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__create_uid @@ -164,7 +163,7 @@ msgstr "أنشئ في" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_res_config_settings__default_sale_order_template_id msgid "Default Template" -msgstr "" +msgstr "القالب الافتراضي" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__name @@ -179,6 +178,8 @@ msgstr "الوصف" #: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form msgid "Design your quotation templates using building blocks<br/>" msgstr "" +"تصميم قوالب عروض أسعارك باستخدام بلوكات البناء<br/>\n" +" <em attrs=\"{'invisible': [('module_sale_quotation_builder','=',False)]}\">تحذير: هذا الخيار سيثبت تطبيق الموقع.</em>" #. module: sale_management #: model:ir.model,name:sale_management.model_digest_digest @@ -198,7 +199,7 @@ msgstr "الخصم (%)" #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__display_name #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_option__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__display_type @@ -216,17 +217,17 @@ msgstr "" msgid "" "Forbidden product, unit price, quantity, and UoM on non-accountable sale " "quote line" -msgstr "" +msgstr "المنتج أو سعر الوحدة أو الكمية أو وحدة القياس محظور في بند غير مقبول." #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_option__sequence msgid "Gives the sequence order when displaying a list of optional products." -msgstr "" +msgstr "يعرض ترتيب التسلسل عند عرض قائمة المنتجات الاختيارية." #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template_line__sequence msgid "Gives the sequence order when displaying a list of sale quote lines." -msgstr "" +msgstr "يعرض ترتيب التسلسل عند عرض قائمة بنود عروض أسعار المبيعات." #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__id @@ -241,12 +242,12 @@ msgstr "المعرف" msgid "" "If unchecked, it will allow you to hide the quotation template without " "removing it." -msgstr "" +msgstr "عند إلغاء اختياره، يمكنك إخفاء قالب عرض السعر دون حذفه." #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_digest_digest__kpi_all_sale_total_value msgid "Kpi All Sale Total Value" -msgstr "" +msgstr "القيمة الإجمالية للمؤشر الرئيسي لكافة المبيعات" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option____last_update @@ -286,7 +287,7 @@ msgstr "البنود" #. module: sale_management #: sql_constraint:sale.order.template.line:0 msgid "Missing required product and UoM on accountable sale quote line." -msgstr "" +msgstr "المنتج ووحدة القياس فارغين في بند أمر بيع سيتم إنشاء فاتورة له." #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form @@ -297,12 +298,12 @@ msgstr "ملاحظة" #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template__number_of_days msgid "Number of days for the validity date computation of the quotation" -msgstr "" +msgstr "عدد أيام احتساب تاريخ الصلاحية لعرض الأسعار" #. module: sale_management #: model:sale.order.template.option,name:sale_management.sale_order_template_option_1 msgid "Office Chair" -msgstr "" +msgstr "كرسي مكتب" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__require_payment @@ -312,7 +313,7 @@ msgstr "السداد عبر الإنترنت" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__require_signature msgid "Online Signature" -msgstr "" +msgstr "التوقيع الإلكتروني" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__sale_order_template_option_ids @@ -356,12 +357,12 @@ msgstr "الكمية" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_res_config_settings__module_sale_quotation_builder msgid "Quotation Builder" -msgstr "" +msgstr "مكوّن عرض السعر" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__number_of_days msgid "Quotation Duration" -msgstr "" +msgstr "مدة عرض السعر" #. module: sale_management #: model:ir.model,name:sale_management.model_sale_order_template @@ -375,23 +376,23 @@ msgstr "قالب عرض السعر" #. module: sale_management #: model:ir.model,name:sale_management.model_sale_order_template_line msgid "Quotation Template Line" -msgstr "" +msgstr "بند قالب عرض السعر" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form msgid "Quotation Template Lines" -msgstr "بنود قالب العرض" +msgstr "بنود قالب عرض السعر" #. module: sale_management #: model:ir.model,name:sale_management.model_sale_order_template_option msgid "Quotation Template Option" -msgstr "" +msgstr "خيار قالب عرض السعر" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__sale_order_template_id #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_option__sale_order_template_id msgid "Quotation Template Reference" -msgstr "" +msgstr "رقم إشارة قالب عرض السعر" #. module: sale_management #: model:ir.actions.act_window,name:sale_management.sale_order_template_action @@ -400,12 +401,12 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:sale_management.res_config_settings_view_form #: model:res.groups,name:sale_management.group_sale_order_template msgid "Quotation Templates" -msgstr "قوالب العرض" +msgstr "قوالب عرض السعر" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form msgid "Quotation expires after" -msgstr "" +msgstr "تنتهي صلاحية عرض السعر بعد" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management @@ -415,21 +416,21 @@ msgstr "إزالة" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_portal_content_inherit_sale_management msgid "Remove one" -msgstr "" +msgstr "إزالة واحدة" #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template__require_signature msgid "" "Request a online signature to the customer in order to confirm orders " "automatically." -msgstr "" +msgstr "طلب توقيع العميل إلكترونيًا لتأكيد الأوامر تلقائيًا." #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template__require_payment msgid "" "Request an online payment to the customer in order to confirm orders " "automatically." -msgstr "" +msgstr "طلب تسديد العميل للمستحقات إلكترونيًا لتأكيد الأوامر تلقائيًا." #. module: sale_management #: model:ir.model,name:sale_management.model_sale_order_option @@ -449,22 +450,22 @@ msgstr "المبيعات" #. module: sale_management #: model:ir.model,name:sale_management.model_sale_order_line msgid "Sales Order Line" -msgstr "سطر أمر المبيعات" +msgstr "بند أمر المبيعات" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__order_id msgid "Sales Order Reference" -msgstr "" +msgstr "رقم إشارة أمر المبيعات" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_form_quote msgid "Sales Quotation Template Lines" -msgstr "" +msgstr "بنود قالب عرض سعر المبيعات" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_search msgid "Search Quotation Template" -msgstr "" +msgstr "البحث في قوالب عروض الأسعار" #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form @@ -481,7 +482,7 @@ msgstr "التسلسل" #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template_line__display_type msgid "Technical field for UX purpose." -msgstr "حقل تقني لهدف خبرة المستخدم" +msgstr "حقل تقني يهدف لتحسين تجربة المستخدم." #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__note @@ -494,6 +495,8 @@ msgid "" "The Administrator can set default Terms & Conditions in Sales Settings. " "Terms set here will show up instead if you select this quotation template." msgstr "" +"يمكن للمسؤول تعيين الشروط والأحكام الافتراضية في إعدادات المبيعات. ستظهر " +"الشروط المعينة هنا بدلًا منها إذا اخترت قالب عرض الأسعار هذا." #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template__mail_template_id @@ -501,6 +504,8 @@ msgid "" "This e-mail template will be sent on confirmation. Leave empty to send " "nothing." msgstr "" +"سيتم إرسال هذا القالب البريدي عند التأكيد. اتركه خاليًا لكي لا يتم إرسال " +"شيء." #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__price_unit @@ -513,13 +518,13 @@ msgstr "سعر الوحدة" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_line__product_uom_id msgid "Unit of Measure" -msgstr "وحده القياس " +msgstr "وحدة القياس" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__uom_id #: model:ir.model.fields,field_description:sale_management.field_sale_order_template_option__uom_id msgid "Unit of Measure " -msgstr "وحدة قياس " +msgstr "وحده القياس " #. module: sale_management #: model_terms:ir.actions.act_window,help:sale_management.sale_order_template_action @@ -528,12 +533,15 @@ msgid "" " Send these quotes by email and let your customers sign online.\n" " Use cross-selling and discounts to push and boost your sales." msgstr "" +"استخدم القوالب لإنشاء عروض أسعار احترافية منقحة في دقائق.\n" +" يمكنك إرسال عروض الأسعار عن طريق البريد الكتروني والسماح للعملاء بتسجيل الدخول عبر الإنترنت.\n" +" استخدم نظام البيع المتقاطع والخصومات لدفع وتحسين مبيعاتك." #. module: sale_management #: code:addons/sale_management/models/sale_order.py:178 #, python-format msgid "You cannot add options to a confirmed order." -msgstr "لايمكن اضافه خيارات لامر موكد" +msgstr "لا يمكنك إضافة خيارات لأمر مؤكد." #. module: sale_management #: model_terms:ir.ui.view,arch_db:sale_management.sale_order_template_view_form diff --git a/addons/sale_management/i18n/vi.po b/addons/sale_management/i18n/vi.po index fa63f042566..556a45d0288 100644 --- a/addons/sale_management/i18n/vi.po +++ b/addons/sale_management/i18n/vi.po @@ -176,7 +176,7 @@ msgstr "" #. module: sale_management #: model:ir.model,name:sale_management.model_digest_digest msgid "Digest" -msgstr "" +msgstr "Tiêu" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_option__discount @@ -349,7 +349,7 @@ msgstr "Số lượng" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_res_config_settings__module_sale_quotation_builder msgid "Quotation Builder" -msgstr "" +msgstr "Xây dựng báo giá" #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__number_of_days @@ -474,7 +474,7 @@ msgstr "Trình tự" #. module: sale_management #: model:ir.model.fields,help:sale_management.field_sale_order_template_line__display_type msgid "Technical field for UX purpose." -msgstr "" +msgstr "Trường kỹ thuật cho mục đích UX." #. module: sale_management #: model:ir.model.fields,field_description:sale_management.field_sale_order_template__note diff --git a/addons/sale_management/models/sale_order.py b/addons/sale_management/models/sale_order.py index cbc245e6ba9..eb4f0eaf8f9 100644 --- a/addons/sale_management/models/sale_order.py +++ b/addons/sale_management/models/sale_order.py @@ -72,7 +72,11 @@ class SaleOrder(models.Model): price = self.pricelist_id.with_context(uom=line.product_uom_id.id).get_product_price(line.product_id, 1, False) if self.pricelist_id.discount_policy == 'without_discount' and line.price_unit: discount = (line.price_unit - price) / line.price_unit * 100 - price = line.price_unit + # negative discounts (= surcharge) are included in the display price + if discount < 0: + discount = 0 + else: + price = line.price_unit else: price = line.price_unit diff --git a/addons/sale_management/views/sale_order_template_views.xml b/addons/sale_management/views/sale_order_template_views.xml index 12d35b880b9..566fcbd6dc9 100644 --- a/addons/sale_management/views/sale_order_template_views.xml +++ b/addons/sale_management/views/sale_order_template_views.xml @@ -53,7 +53,7 @@ <div> <field name="product_uom_qty" class="oe_inline"/> </div> - <field name="price_unit" invisible="1"/> + <field name="price_unit"/> <label for="discount" groups="sale.group_discount_per_so_line"/> <div groups="sale.group_discount_per_so_line"> <field name="discount" class="oe_inline"/> %% @@ -90,7 +90,7 @@ attrs="{'required': [('display_type', '=', False)]}" /> <field name="discount" groups="sale.group_discount_per_so_line"/> - <field name="price_unit" invisible="1"/> + <field name="price_unit"/> </tree> </field> </page> @@ -101,7 +101,7 @@ <field name="name"/> <field name="quantity"/> <field name="uom_id" groups="uom.group_uom"/> - <field name="price_unit" invisible="1"/> + <field name="price_unit"/> <field name="discount" groups="sale.group_discount_per_so_line"/> </tree> </field> diff --git a/addons/sale_quotation_builder/i18n/cs.po b/addons/sale_quotation_builder/i18n/cs.po index f1cdbc51e90..bdb66656562 100644 --- a/addons/sale_quotation_builder/i18n/cs.po +++ b/addons/sale_quotation_builder/i18n/cs.po @@ -109,7 +109,7 @@ msgstr "Volitelný produkt:" #. module: sale_quotation_builder #: model_terms:sale.order.template,website_description:sale_quotation_builder.sale_order_template_default msgid "Our Offer" -msgstr "" +msgstr "Naše nabídka" #. module: sale_quotation_builder #: model_terms:sale.order.template,website_description:sale_quotation_builder.sale_order_template_default diff --git a/addons/sale_stock/i18n/cs.po b/addons/sale_stock/i18n/cs.po index a322ab65e9a..932b6f253c8 100644 --- a/addons/sale_stock/i18n/cs.po +++ b/addons/sale_stock/i18n/cs.po @@ -102,6 +102,11 @@ msgid "" " - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n" " - Stock Moves: the quantity comes from confirmed pickings\n" msgstr "" +"Podle konfigurace produktu může být dodané množství automaticky vypočítáno pomocí mechanismu:\n" +"- Ruční: množství je nastaveno ručně na lince\n" +"- Analytické z nákladů: množství je množství z účtovaných nákladů\n" +"- Časový rozvrh: množství je součtem hodin zaznamenaných na úkolech spojených s touto prodejní linkou\n" +"- Skladové pohyby: množství pochází z potvrzených vychystávání\n" #. module: sale_stock #: model:ir.ui.menu,name:sale_stock.menu_aftersale diff --git a/addons/sale_stock/i18n/km.po b/addons/sale_stock/i18n/km.po index f524f4bbbaa..248c9a4396e 100644 --- a/addons/sale_stock/i18n/km.po +++ b/addons/sale_stock/i18n/km.po @@ -248,7 +248,7 @@ msgstr "" #. module: sale_stock #: model:ir.ui.menu,name:sale_stock.menu_invoiced msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: sale_stock #: model:ir.model,name:sale_stock.model_stock_production_lot diff --git a/addons/sale_timesheet/i18n/cs.po b/addons/sale_timesheet/i18n/cs.po index da937dc9431..294d203ce97 100644 --- a/addons/sale_timesheet/i18n/cs.po +++ b/addons/sale_timesheet/i18n/cs.po @@ -86,6 +86,11 @@ msgid "" " - Timesheet: the quantity is the sum of hours recorded on tasks linked to this sale line\n" " - Stock Moves: the quantity comes from confirmed pickings\n" msgstr "" +"Podle konfigurace produktu může být dodané množství automaticky vypočítáno pomocí mechanismu:\n" +"- Ruční: množství je nastaveno ručně na lince\n" +"- Analytické z nákladů: množství je množství z účtovaných nákladů\n" +"- Časový rozvrh: množství je součtem hodin zaznamenaných na úkolech spojených s touto prodejní linkou\n" +"- Skladové pohyby: množství pochází z potvrzených vychystávání\n" #. module: sale_timesheet #: model:ir.model.fields,field_description:sale_timesheet.field_project_create_invoice__amount_to_invoice diff --git a/addons/sale_timesheet/i18n/km.po b/addons/sale_timesheet/i18n/km.po index ce0e94e6506..724518f367e 100644 --- a/addons/sale_timesheet/i18n/km.po +++ b/addons/sale_timesheet/i18n/km.po @@ -115,7 +115,7 @@ msgstr "" #. module: sale_timesheet #: model:ir.model.fields,field_description:sale_timesheet.field_sale_order_line__analytic_line_ids msgid "Analytic lines" -msgstr "" +msgstr "បន្ទាត់វិភាគ" #. module: sale_timesheet #: model_terms:ir.ui.view,arch_db:sale_timesheet.project_task_assign_so_line_view_form @@ -211,7 +211,7 @@ msgstr "" #. module: sale_timesheet #: model_terms:ir.ui.view,arch_db:sale_timesheet.res_config_settings_view_form msgid "Billing" -msgstr "" +msgstr "ការចេញវិក្កយបត្រ" #. module: sale_timesheet #: model:ir.filters,name:sale_timesheet.timesheet_filter_billing @@ -480,7 +480,7 @@ msgstr "វិកិយប័ត្រ" #. module: sale_timesheet #: model_terms:ir.ui.view,arch_db:sale_timesheet.project_project_view_form msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: sale_timesheet #: model:ir.model.fields,field_description:sale_timesheet.field_project_task__is_project_map_empty diff --git a/addons/sales_team/i18n/km.po b/addons/sales_team/i18n/km.po index 0708a92f69e..7d854e23182 100644 --- a/addons/sales_team/i18n/km.po +++ b/addons/sales_team/i18n/km.po @@ -322,7 +322,7 @@ msgstr "ខែ" #. module: sales_team #: model_terms:ir.ui.view,arch_db:sales_team.crm_team_salesteams_search msgid "My Favorites" -msgstr "" +msgstr "ចំណូលចិត្តរបស់ខ្ថុំ" #. module: sales_team #: code:addons/sales_team/models/crm_team.py:260 @@ -378,7 +378,7 @@ msgstr "" #. module: sales_team #: model:ir.model,name:sales_team.model_crm_team msgid "Sales Channels" -msgstr "" +msgstr "លក់" #. module: sales_team #: model:ir.model.fields,field_description:sales_team.field_crm_team__name @@ -386,7 +386,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:sales_team.crm_team_view_form #: model_terms:ir.ui.view,arch_db:sales_team.crm_team_view_tree msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: sales_team #: model:ir.model.fields,help:sales_team.field_res_users__sale_team_id diff --git a/addons/sms/i18n/km.po b/addons/sms/i18n/km.po index 39fd653aa91..0a4fc14bc8d 100644 --- a/addons/sms/i18n/km.po +++ b/addons/sms/i18n/km.po @@ -104,7 +104,7 @@ msgstr "" #. module: sms #: model:ir.model.fields,field_description:sms.field_sms_send_sms__recipients msgid "Recipients" -msgstr "" +msgstr "អ្នកទទួល" #. module: sms #: model:ir.model,name:sms.model_sms_api diff --git a/addons/social_media/i18n/ar.po b/addons/social_media/i18n/ar.po index de6837bba88..3fcb9738e2e 100644 --- a/addons/social_media/i18n/ar.po +++ b/addons/social_media/i18n/ar.po @@ -3,16 +3,17 @@ # * social_media # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Osoul <baruni@osoul.ly>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" -"PO-Revision-Date: 2018-09-18 09:49+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:25+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -43,7 +44,7 @@ msgstr "حساب جوجل+" #. module: social_media #: model:ir.model.fields,field_description:social_media.field_res_company__social_instagram msgid "Instagram Account" -msgstr "" +msgstr "حساب إنستجرام" #. module: social_media #: model:ir.model.fields,field_description:social_media.field_res_company__social_linkedin diff --git a/addons/stock/i18n/km.po b/addons/stock/i18n/km.po index 2a5581957a9..bd27f884d71 100644 --- a/addons/stock/i18n/km.po +++ b/addons/stock/i18n/km.po @@ -500,7 +500,7 @@ msgstr "" #. module: stock #: model_terms:ir.ui.view,arch_db:stock.view_stock_rule_form msgid "Applicability" -msgstr "" +msgstr "ការអនុវត្ត" #. module: stock #: model_terms:ir.ui.view,arch_db:stock.stock_location_route_form_view @@ -2836,7 +2836,7 @@ msgstr "" #. module: stock #: model_terms:ir.ui.view,arch_db:stock.view_picking_form msgid "Lock" -msgstr "" +msgstr "ចាក់សោរ" #. module: stock #: model_terms:ir.ui.view,arch_db:stock.product_category_form_view_inherit @@ -3112,7 +3112,7 @@ msgstr "" #: model:ir.model.fields,field_description:stock.field_stock_package_destination__move_line_ids #: model:ir.model.fields,field_description:stock.field_stock_package_level__move_line_ids msgid "Move Line" -msgstr "" +msgstr "ផ្លាស់ទីបន្ទាត់" #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_move__move_line_nosuggest_ids @@ -3457,7 +3457,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:stock.view_picking_form #: model_terms:ir.ui.view,arch_db:stock.view_template_property_form msgid "Operations" -msgstr "" +msgstr "ប្រតិបត្តិការ" #. module: stock #: model:ir.actions.act_window,name:stock.action_picking_type_list @@ -5088,7 +5088,7 @@ msgstr "" #. module: stock #: model_terms:ir.ui.view,arch_db:stock.view_picking_internal_search msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: stock #: model:ir.model.fields,help:stock.field_stock_rules_report__warehouse_ids diff --git a/addons/stock/i18n/sk.po b/addons/stock/i18n/sk.po index 299e58cc425..b5ba7bd1240 100644 --- a/addons/stock/i18n/sk.po +++ b/addons/stock/i18n/sk.po @@ -2315,7 +2315,7 @@ msgstr "Spracováva sa" #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_warehouse__in_type_id msgid "In Type" -msgstr "V Type" +msgstr "Typ vstupu" #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_inventory__exhausted @@ -3896,7 +3896,7 @@ msgstr "Vybrať" #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_warehouse__pick_type_id msgid "Pick Type" -msgstr "Vybrať typ" +msgstr "Typ výberu" #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_overprocessed_transfer__picking_id diff --git a/addons/stock/i18n/vi.po b/addons/stock/i18n/vi.po index aa52e40e661..5517846c353 100644 --- a/addons/stock/i18n/vi.po +++ b/addons/stock/i18n/vi.po @@ -3911,7 +3911,7 @@ msgstr "Địa điểm Cha" #. module: stock #: model:ir.model.fields,field_description:stock.field_stock_location__parent_path msgid "Parent Path" -msgstr "" +msgstr "Parent Path" #. module: stock #: selection:procurement.group,move_type:0 diff --git a/addons/stock/models/product.py b/addons/stock/models/product.py index c287ef9b4e9..7b0ae24677c 100644 --- a/addons/stock/models/product.py +++ b/addons/stock/models/product.py @@ -183,10 +183,23 @@ class Product(models.Model): company_id = self.env.company.id return ( [('location_id.company_id', '=', company_id), ('location_id.usage', 'in', ['internal', 'transit'])], - [('location_id.company_id', '=', False), ('location_dest_id.company_id', '=', company_id)], - [('location_id.company_id', '=', company_id), ('location_dest_id.company_id', '=', False), - ]) - + ['&', + ('location_dest_id.company_id', '=', company_id), + '|', + ('location_id.company_id', '=', False), + '&', + ('location_id.usage', 'in', ['inventory', 'production']), + ('location_id.company_id', '=', company_id), + ], + ['&', + ('location_id.company_id', '=', company_id), + '|', + ('location_dest_id.company_id', '=', False), + '&', + ('location_dest_id.usage', 'in', ['inventory', 'production']), + ('location_dest_id.company_id', '=', company_id), + ] + ) def _search_ids(model, values, force_company_id): ids = set() domain = [] @@ -411,6 +424,7 @@ class Product(models.Model): action['context'] = {'default_product_id': self.id} return action + # Be aware that the exact same function exists in product.template def action_open_quants(self): location_domain = self._get_domain_locations()[0] domain = expression.AND([[('product_id', 'in', self.ids)], location_domain]) @@ -641,6 +655,7 @@ class ProductTemplate(models.Model): raise UserError(_("You can not change the type of a product that is currently reserved on a stock move. If you need to change the type, you should first unreserve the stock move.")) return super(ProductTemplate, self).write(vals) + # Be aware that the exact same function exists in product.product def action_open_quants(self): return self.product_variant_ids.action_open_quants() diff --git a/addons/stock/models/stock_move.py b/addons/stock/models/stock_move.py index 7df6c05510b..d2ca45f7fb4 100644 --- a/addons/stock/models/stock_move.py +++ b/addons/stock/models/stock_move.py @@ -1013,7 +1013,7 @@ class StockMove(models.Model): self.mapped('picking_id')._check_entire_pack() def _action_cancel(self): - if any(move.state == 'done' for move in self): + if any(move.state == 'done' and not move.scrapped for move in self): raise UserError(_('You cannot cancel a stock move that has been set to \'Done\'.')) moves_to_cancel = self.filtered(lambda m: m.state != 'cancel') # self cannot contain moves that are either cancelled or done, therefore we can safely @@ -1035,6 +1035,7 @@ class StockMove(models.Model): def _prepare_extra_move_vals(self, qty): vals = { + 'procure_method': 'make_to_stock', 'origin_returned_move_id': self.origin_returned_move_id.id, 'product_uom_qty': qty, 'picking_id': self.picking_id.id, @@ -1061,13 +1062,17 @@ class StockMove(models.Model): rounding_method='HALF-UP') extra_move_vals = self._prepare_extra_move_vals(extra_move_quantity) extra_move = self.copy(default=extra_move_vals) - if extra_move.picking_id: + + merge_into_self = all(self[field] == extra_move[field] for field in self._prepare_merge_moves_distinct_fields()) + + if merge_into_self and extra_move.picking_id: extra_move = extra_move._action_confirm(merge_into=self) + return extra_move else: extra_move = extra_move._action_confirm() # link it to some move lines. We don't need to do it for move since they should be merged. - if self.exists() and not self.picking_id: + if not merge_into_self: for move_line in self.move_line_ids.filtered(lambda ml: ml.qty_done): if float_compare(move_line.qty_done, extra_move_quantity, precision_rounding=rounding) <= 0: # move this move line to our extra move @@ -1084,7 +1089,7 @@ class StockMove(models.Model): extra_move_quantity -= extra_move_quantity if extra_move_quantity == 0.0: break - return extra_move + return extra_move | self def _unreserve_initial_demand(self, new_move): pass @@ -1105,9 +1110,7 @@ class StockMove(models.Model): for move in moves: if move.state == 'cancel' or move.quantity_done <= 0: continue - # extra move will not be merged in mrp - if not move.picking_id: - moves_todo |= move + moves_todo |= move._create_extra_move() # Split moves where necessary and move quants diff --git a/addons/stock/models/stock_move_line.py b/addons/stock/models/stock_move_line.py index ec2a917a4ed..f7e5cce352b 100644 --- a/addons/stock/models/stock_move_line.py +++ b/addons/stock/models/stock_move_line.py @@ -502,7 +502,7 @@ class StockMoveLine(models.Model): if quantity > available_quantity: # We now have to find the move lines that reserved our now unavailable quantity. We # take care to exclude ourselves and the move lines were work had already been done. - oudated_move_lines_domain = [ + outdated_move_lines_domain = [ ('move_id.state', 'not in', ['done', 'cancel']), ('product_id', '=', product_id.id), ('lot_id', '=', lot_id.id if lot_id else False), @@ -512,14 +512,15 @@ class StockMoveLine(models.Model): ('product_qty', '>', 0.0), ('id', 'not in', ml_to_ignore.ids), ] - oudated_candidates = self.env['stock.move.line'].search(oudated_move_lines_domain) + current_picking_first = lambda cand: cand.picking_id != self.move_id.picking_id + outdated_candidates = self.env['stock.move.line'].search(outdated_move_lines_domain).sorted(current_picking_first) # As the move's state is not computed over the move lines, we'll have to manually # recompute the moves which we adapted their lines. move_to_recompute_state = self.env['stock.move'] rounding = self.product_uom_id.rounding - for candidate in oudated_candidates: + for candidate in outdated_candidates: if float_compare(candidate.product_qty, quantity, precision_rounding=rounding) <= 0: quantity -= candidate.product_qty move_to_recompute_state |= candidate.move_id diff --git a/addons/stock/report/picking_templates.xml b/addons/stock/report/picking_templates.xml index 8d135dd0c40..d9959b5646d 100644 --- a/addons/stock/report/picking_templates.xml +++ b/addons/stock/report/picking_templates.xml @@ -18,11 +18,11 @@ ^FO100,50 ^A0N,44,33^FD<t t-esc="move_line.product_id.display_name"/>^FS ^FO100,100 -<t t-if="move_line.product_id.tracking != 'none' and move_line.lot_name"> -^A0N,44,33^FDLN/SN: <t t-esc="move_line.lot_name"/>^FS +<t t-if="move_line.product_id.tracking != 'none' and (move_line.lot_id or move_line.lot_name)"> +^A0N,44,33^FDLN/SN: <t t-esc="move_line.lot_id.name or move_line.lot_name"/>^FS ^FO100,150^BY3 ^BCN,100,Y,N,N -^FD<t t-esc="move_line.lot_name"/>^FS +^FD<t t-esc="move_line.lot_id.name or move_line.lot_name"/>^FS </t> <t t-if="move_line.product_id.tracking == 'none' and move_line.product_id.barcode"> ^BCN,100,Y,N,N diff --git a/addons/stock/tests/test_move2.py b/addons/stock/tests/test_move2.py index 53246be2705..c0cbf4db0e0 100644 --- a/addons/stock/tests/test_move2.py +++ b/addons/stock/tests/test_move2.py @@ -186,6 +186,27 @@ class TestPickShip(TestStockCommon): # the client picking should not be assigned anymore, as we returned partially what we took self.assertEqual(picking_client.state, 'confirmed') + def test_mto_moves_extra_qty(self): + """ Ensure that a move in MTO will support an extra quantity. The extra + move should be created in MTS and should not be merged in the initial + move if it's in MTO. It should also avoid to trigger the rules. + """ + picking_pick, picking_client = self.create_pick_ship() + stock_location = self.env['stock.location'].browse(self.stock_location) + self.productA.write({'route_ids': [(4, self.env.ref('stock.route_warehouse0_mto').id)]}) + self.env['stock.quant']._update_available_quantity(self.productA, stock_location, 10.0) + picking_pick.action_assign() + picking_pick.move_lines[0].move_line_ids[0].qty_done = 15.0 + picking_pick.action_done() + self.assertEqual(picking_pick.state, 'done') + self.assertEqual(picking_client.state, 'assigned') + + picking_client.move_lines[0].move_line_ids[0].qty_done = 15.0 + picking_client.move_lines._action_done() + self.assertEqual(len(picking_client.move_lines), 2) + self.assertEqual(picking_client.move_lines.mapped('procure_method'), ['make_to_order', 'make_to_stock']) + self.assertEqual(picking_client.move_lines.mapped('product_uom_qty'), [10.0, 5.0]) + def test_mto_moves_return_extra(self): picking_pick, picking_client = self.create_pick_ship() stock_location = self.env['stock.location'].browse(self.stock_location) diff --git a/addons/stock_account/tests/test_stockvaluation.py b/addons/stock_account/tests/test_stockvaluation.py index 1b642e0ecb4..99e573e1e1f 100644 --- a/addons/stock_account/tests/test_stockvaluation.py +++ b/addons/stock_account/tests/test_stockvaluation.py @@ -3420,7 +3420,7 @@ class TestStockValuation(SavepointCase): self.product1.standard_price = 15 self.product1.categ_id.property_cost_method = 'fifo' inventory_location = self.product1.property_stock_inventory - inventory_location.company_id = self.env.user.company_id.id + inventory_location.company_id = self.env.company.id # Start Inventory: 12 units move1 = self.env['stock.move'].create({ @@ -3456,3 +3456,52 @@ class TestStockValuation(SavepointCase): self.assertAlmostEqual(move1.stock_valuation_layer_ids.remaining_qty, 0.0) self.assertAlmostEqual(self.product1.value_svl, 0.0) + + def test_at_date_average_1(self): + """ Set a company on the inventory loss, take items from there then put items there, check + the values and quantities at date. + """ + now = Datetime.from_string(Date.today()) + date1 = now - timedelta(days=8) + date2 = now - timedelta(days=7) + + self.product1.standard_price = 10 + self.env['product.price.history'].search([ + ('product_id', '=', self.product1.id) + ], order='datetime desc, id DESC', limit=1).datetime = date1 + self.product1.product_tmpl_id.cost_method = 'average' + inventory_location = self.product1.property_stock_inventory + inventory_location.company_id = self.env.company.id + + move1 = self.env['stock.move'].create({ + 'name': 'Adjustment of 10 units', + 'location_id': inventory_location.id, + 'location_dest_id': self.stock_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 10.0, + }) + move1._action_confirm() + move1._action_assign() + move1.move_line_ids.qty_done = 10.0 + move1._action_done() + move1.date = date1 + + move2 = self.env['stock.move'].create({ + 'name': 'Sell 5 units', + 'location_id': self.stock_location.id, + 'location_dest_id': inventory_location.id, + 'product_id': self.product1.id, + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 5.0, + }) + move2._action_confirm() + move2._action_assign() + move2.move_line_ids.qty_done = 5.0 + move2._action_done() + move2.date = date2 + + self.assertEqual(self.product1.with_context(to_date=Date.to_string(date1)).qty_at_date, 10) + self.assertEqual(self.product1.with_context(to_date=Date.to_string(date1)).stock_value, 100) + self.assertEqual(self.product1.with_context(to_date=Date.to_string(date2)).qty_at_date, 5) + self.assertEqual(self.product1.with_context(to_date=Date.to_string(date2)).stock_value, 50) diff --git a/addons/stock_dropshipping/i18n/ar.po b/addons/stock_dropshipping/i18n/ar.po index edc885f277b..6f6f670a679 100644 --- a/addons/stock_dropshipping/i18n/ar.po +++ b/addons/stock_dropshipping/i18n/ar.po @@ -29,7 +29,7 @@ msgstr "النقل المباشر" #. module: stock_dropshipping #: model:ir.model.fields,field_description:stock_dropshipping.field_sale_order_line__purchase_line_ids msgid "Generated Purchase Lines" -msgstr "" +msgstr "بنود الشراء المنشأة" #. module: stock_dropshipping #: model:ir.model,name:stock_dropshipping.model_purchase_order_line @@ -42,6 +42,8 @@ msgid "" "Purchase line generated by this Sales item on order confirmation, or when " "the quantity was increased." msgstr "" +"بند الشراء الذي أنشأه عنصر المبيعات هذا عند تأكيد الأمر، أو عند زيادة " +"الكمية." #. module: stock_dropshipping #: model:ir.model,name:stock_dropshipping.model_sale_order_line diff --git a/addons/survey/i18n/vi.po b/addons/survey/i18n/vi.po index 34740332325..8f4f87a00a8 100644 --- a/addons/survey/i18n/vi.po +++ b/addons/survey/i18n/vi.po @@ -1300,7 +1300,7 @@ msgstr "" #. module: survey #: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message__moderation_status msgid "Moderation Status" -msgstr "" +msgstr "Trạng thái kiểm duyệt" #. module: survey #: selection:survey.question,type:0 @@ -1746,7 +1746,7 @@ msgstr "Đối tượng Tài liệu liên quan" #. module: survey #: model:ir.model.fields,field_description:survey.field_survey_mail_compose_message__rating_ids msgid "Related ratings" -msgstr "" +msgstr "Xếp hạng liên quan" #. module: survey #: model:ir.model.fields,help:survey.field_survey_mail_compose_message__reply_to diff --git a/addons/theme_bootswatch/i18n/ar.po b/addons/theme_bootswatch/i18n/ar.po index 3ad43b398d7..52d3bf2b5dd 100644 --- a/addons/theme_bootswatch/i18n/ar.po +++ b/addons/theme_bootswatch/i18n/ar.po @@ -4,13 +4,15 @@ # # Translators: # Akram Alfusayal <akram_ma@hotmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-21 13:18+0000\n" -"PO-Revision-Date: 2018-09-21 13:18+0000\n" -"Last-Translator: Akram Alfusayal <akram_ma@hotmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:26+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -21,7 +23,7 @@ msgstr "" #. module: theme_bootswatch #: model:ir.model,name:theme_bootswatch.model_theme_utils msgid "Theme Utils" -msgstr "" +msgstr "أدوات السمة" #. module: theme_bootswatch #: model:ir.actions.act_url,name:theme_bootswatch.action_website diff --git a/addons/transifex/i18n/ar.po b/addons/transifex/i18n/ar.po index a6bdacbd8ee..180604872c1 100644 --- a/addons/transifex/i18n/ar.po +++ b/addons/transifex/i18n/ar.po @@ -4,13 +4,15 @@ # # Translators: # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# 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: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:33+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -22,12 +24,12 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:transifex.ir_translation_dialog_view_tree_transifex #: model_terms:ir.ui.view,arch_db:transifex.ir_translation_view_tree_transifex msgid "Transifex" -msgstr "" +msgstr "Transifex" #. module: transifex #: model:ir.model.fields,field_description:transifex.field_ir_translation__transifex_url msgid "Transifex URL" -msgstr "" +msgstr "رابط Transifex" #. module: transifex #: model:ir.model,name:transifex.model_ir_translation diff --git a/addons/uom/i18n/ar.po b/addons/uom/i18n/ar.po index cd0775e7a48..94bb114e024 100644 --- a/addons/uom/i18n/ar.po +++ b/addons/uom/i18n/ar.po @@ -3,7 +3,6 @@ # * uom # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # Martin Trigaux, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 @@ -13,13 +12,15 @@ # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Zuhair Hammadi <zuhair12@gmail.com>, 2018 # aymen rahmani <aymen.isims@gmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" -"PO-Revision-Date: 2018-09-18 09:49+0000\n" -"Last-Translator: aymen rahmani <aymen.isims@gmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:33+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -63,6 +64,8 @@ msgid "" "Conversion between Units of Measure can only occur if they belong to the " "same category. The conversion will be made based on the ratios." msgstr "" +"لا يمكن التحويل بين وحدات القياس إلا إذا كانت تنتمي لنفس الفئة. سيتم إجراء " +"التحويل بناءً على النسب." #. module: uom #: model:ir.model.fields,field_description:uom.field_uom_category__create_uid @@ -163,7 +166,7 @@ msgstr "وحدة قياس المنتج" #. module: uom #: model:ir.model,name:uom.model_uom_category msgid "Product UoM Categories" -msgstr "" +msgstr "فئات وحدات قياس المنتج" #. module: uom #: model:ir.model.fields,field_description:uom.field_uom_uom__factor diff --git a/addons/utm/i18n/ar.po b/addons/utm/i18n/ar.po index 2d4c4095ae8..e6b0bec19e7 100644 --- a/addons/utm/i18n/ar.po +++ b/addons/utm/i18n/ar.po @@ -144,7 +144,7 @@ msgstr "آخر تحديث في" #. module: utm #: model:utm.source,name:utm.utm_source_mailing msgid "Lead Newsletter" -msgstr "" +msgstr "النشرة البريدية للترشيح" #. module: utm #: model:ir.ui.menu,name:utm.menu_link_tracker_root @@ -219,7 +219,7 @@ msgstr "تويتر" #. module: utm #: model:ir.model,name:utm.model_utm_campaign msgid "UTM Campaign" -msgstr "" +msgstr "حملة UTM" #. module: utm #: model:ir.model,name:utm.model_utm_medium diff --git a/addons/web/i18n/km.po b/addons/web/i18n/km.po index ad4e16ada6e..292c6c554c0 100644 --- a/addons/web/i18n/km.po +++ b/addons/web/i18n/km.po @@ -526,7 +526,7 @@ msgstr "កំណត់យក" #: code:addons/web/static/src/js/views/list/list_controller.js:154 #, python-format msgid "Archive" -msgstr "" +msgstr "សម្រេចគោលដៅ" #. module: web #. openerp-web @@ -1239,7 +1239,7 @@ msgstr "" #: code:addons/web/static/src/js/views/form/form_controller.js:184 #, python-format msgid "Duplicate" -msgstr "" +msgstr "ត្រួត" #. module: web #. openerp-web @@ -1440,7 +1440,7 @@ msgstr "" #: code:addons/web/static/src/xml/base.xml:1353 #, python-format msgid "Favorites" -msgstr "" +msgstr "ចំណូលចិត្ត" #. module: web #. openerp-web @@ -1901,14 +1901,14 @@ msgstr "" #: code:addons/web/static/src/xml/kanban.xml:42 #, python-format msgid "Load more... (" -msgstr "" +msgstr "ផ្ទុកបន្ថែម" #. module: web #. openerp-web #: code:addons/web/static/src/js/chrome/loading.js:58 #, python-format msgid "Loading" -msgstr "" +msgstr "ដំណើរការ" #. module: web #. openerp-web diff --git a/addons/web/static/src/js/chrome/action_manager_act_window.js b/addons/web/static/src/js/chrome/action_manager_act_window.js index c19364fa7a9..325a8d1e11e 100644 --- a/addons/web/static/src/js/chrome/action_manager_act_window.js +++ b/addons/web/static/src/js/chrome/action_manager_act_window.js @@ -295,6 +295,7 @@ ActionManager.include({ } var lazyViewDef; + var lazyControllerID; if (lazyView) { // if the main view is lazy-loaded, its (lazy-loaded) controller is inserted // into the controller stack (so that breadcrumbs can be correctly computed), @@ -304,6 +305,7 @@ ActionManager.include({ // this controller being lazy-loaded, this call is actually sync lazyViewDef = self._createViewController(action, lazyView.type, {}, {lazy: true}) .then(function (lazyLoadedController) { + lazyControllerID = lazyLoadedController.jsID; self.controllerStack.push(lazyLoadedController.jsID); }); } @@ -322,7 +324,13 @@ ActionManager.include({ action.controllerID = controller.jsID; return self._executeAction(action, options); }) - .guardedCatch(self._destroyWindowAction.bind(self, action)); + .guardedCatch(function () { + if (lazyControllerID) { + var index = self.controllerStack.indexOf(lazyControllerID); + self.controllerStack = self.controllerStack.slice(0, index); + } + self._destroyWindowAction(action); + }); }); }, /** diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index 660c7dc81e1..5aef3d54bfa 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -623,9 +623,12 @@ var FormController = BasicController.extend({ * @private * @param {OdooEvent} event */ - _onFormDialogDiscarded: function(e) { - e.stopPropagation(); - this.renderer.focusLastActivatedWidget(); + _onFormDialogDiscarded: function(ev) { + ev.stopPropagation(); + var isFocused = this.renderer.focusLastActivatedWidget(); + if (ev.data.callback) { + ev.data.callback(_.str.toBool(isFocused)); + } }, /** * Opens a one2many record (potentially new) in a dialog. This handler is diff --git a/addons/web/static/src/js/views/form/form_renderer.js b/addons/web/static/src/js/views/form/form_renderer.js index 9efadaabe30..cee79966a51 100644 --- a/addons/web/static/src/js/views/form/form_renderer.js +++ b/addons/web/static/src/js/views/form/form_renderer.js @@ -194,8 +194,11 @@ var FormRenderer = BasicRenderer.extend({ * field. */ focusLastActivatedWidget: function () { - this._activateNextFieldWidget(this.state, this.lastActivatedFieldIndex - 1, - { noAutomaticCreate: true }); + if (this.lastActivatedFieldIndex !== -1) { + return this._activateNextFieldWidget(this.state, this.lastActivatedFieldIndex - 1, + { noAutomaticCreate: true }); + } + return false; }, /** * returns the active tab pages for each notebook diff --git a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js index 0c484931aae..6a9caa99a39 100644 --- a/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js +++ b/addons/web/static/src/js/views/kanban/kanban_column_progressbar.js @@ -150,7 +150,7 @@ var KanbanColumnProgressBar = Widget.extend({ }); // Adapt active state - $bar.toggleClass('active progress-bar-striped', key === self.activeFilter); + $bar.toggleClass('progress-bar-animated progress-bar-striped', key === self.activeFilter); // Adapt width $bar.removeClass('o_bar_has_records transition-off'); diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js index 6469b78347a..3c36720081e 100644 --- a/addons/web/static/src/js/views/list/list_editable_renderer.js +++ b/addons/web/static/src/js/views/list/list_editable_renderer.js @@ -480,34 +480,41 @@ ListRenderer.include({ * Returns the relative width according to the widget or the field type. * @see _renderHeader * - * @param {Object} column a `field` arch node + * @param {Object} column an arch node + * @returns {integer | string} either a weight factor (number) or a css + * width description (string) */ _getColumnWidthFactor: function (column) { - if (column.attrs.width) { - // the width attribute has precedence on the width factor - return 0; + if (!this.state.fieldsInfo.list[column.attrs.name]) { + // Unnamed columns get default value + return 1; + } + var field = this.state.fields[column.attrs.name]; + if (!field) { + // this is not a field. Probably a button or something of unknown + // width. + return 1; } - var fieldType = this.state.fields[column.attrs.name].type; var widget = this.state.fieldsInfo.list[column.attrs.name].Widget.prototype; if ('widthFactor' in widget) { return widget.widthFactor; } - switch (fieldType) { + switch (field.type) { case 'binary': return 1; - case 'boolean': return 0.4; + case 'boolean': return '40px'; case 'char': return 1; - case 'date': return 1; - case 'datetime': return 1.5; - case 'float': return 1; + case 'date': return '100px'; + case 'datetime': return '150px'; + case 'float': return '100px'; case 'html': return 3; - case 'integer': return 0.8; - case 'many2many': return 2.2; - case 'many2one': return 1.5; + case 'integer': return '80px'; + case 'many2many': return 2; + case 'many2one': return 2; case 'monetary': return 1.2; - case 'one2many': return 2.2; + case 'one2many': return 2.5; case 'reference': return 1.5; case 'selection': return 1.5; - case 'text': return 3; + case 'text': return 2.5; default: return 1; } }, @@ -720,24 +727,26 @@ ListRenderer.include({ }); }, /** - * Overridden to set weights on columns for the fixed layout. + * Overridden to set weights or explicit width on columns for the fixed layout. * * @override * @private */ _processColumns: function () { this._super.apply(this, arguments); - if (this.editable) { var self = this; this.columns.forEach(function (column) { - if (column.attrs.width_factor) { + if (column.attrs.width) { + // nothing to do + } else if (column.attrs.width_factor) { column.attrs.widthFactor = parseFloat(column.attrs.width_factor, 10); } else { - if (column.tag === 'field') { - column.attrs.widthFactor = self._getColumnWidthFactor(column); + var factor = self._getColumnWidthFactor(column); + if (typeof factor === 'string') { + column.attrs.width = factor; } else { - column.attrs.widthFactor = 1; + column.attrs.widthFactor = factor; } } }); @@ -818,15 +827,18 @@ ListRenderer.include({ var $thead = this._super.apply(this, arguments); if (this.editable) { + // we compute the sum of the weights for each columns, excluding + // those with a fixed width. var totalWidth = this.columns.reduce(function (acc, column) { - return acc + column.attrs.widthFactor; + return acc + (column.attrs.widthFactor || 0); }, 0); this.columns.forEach(function (column) { - var $cell = $thead.find('th[data-name=' + column.attrs.name + ']'); - if (column.attrs.width) { - $cell.css('width', column.attrs.width); - } else if (column.attrs.widthFactor) { - $cell.css('width', (column.attrs.widthFactor / totalWidth * 100) + '%'); + if (column.attrs.width || column.attrs.widthFactor) { + var width = column.attrs.width || ((column.attrs.widthFactor / totalWidth * 100) + '%'); + var $th = $thead.find('th[data-name=' + column.attrs.name + ']'); + if ($th.data('name')) { + $th.css('width', width); + } } }); } diff --git a/addons/web/static/src/js/views/list/list_model.js b/addons/web/static/src/js/views/list/list_model.js index 41178498c96..25fdf28954c 100644 --- a/addons/web/static/src/js/views/list/list_model.js +++ b/addons/web/static/src/js/views/list/list_model.js @@ -52,17 +52,19 @@ odoo.define('web.ListModel', function (require) { var model = records[0].model; var recordResIds = _.pluck(records, 'res_id'); var fieldNames = records[0].getFieldNames(); + var context = records[0].getContext(); return this._rpc({ model: model, method: 'write', args: [recordResIds, changes], - context: records[0].getContext(), + context: context, }).then(function () { return self._rpc({ model: model, method: 'read', args: [recordResIds, fieldNames], + context: context, }); }).then(function (results) { results.forEach(function (data) { @@ -94,14 +96,7 @@ odoo.define('web.ListModel', function (require) { options = options || {}; options.fetchRecordsWithGroups = true; return this._super(list, options).then(function (result) { - var prom; - if (!list.parentID) { - // groupbys buttons are only displayed on the first level of - // groupby so no need to fetch the extra fields for inner - // groups - prom = self._readGroupExtraFields(list); - } - return Promise.resolve(prom).then(_.constant(result)); + return self._readGroupExtraFields(list).then(_.constant(result)); }); }, /** diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index df6345d398f..f7efaab1798 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -599,16 +599,22 @@ var ListRenderer = BasicRenderer.extend({ var colspanBeforeAggregate; if (firstAggregateIndex !== -1) { // if there are aggregates, the first $th goes until the first - // aggregate then all cells between aggregates are rendered, then - // there is a last $th for the pager + // aggregate then all cells between aggregates are rendered colspanBeforeAggregate = firstAggregateIndex; var lastAggregateIndex = _.findLastIndex(this.columns, function (column) { return column.tag === 'field' && _.contains(aggregateKeys, column.attrs.name); }); cells = cells.concat(aggregateCells.slice(firstAggregateIndex, lastAggregateIndex + 1)); - cells.push($('<th>').attr('colspan', this.columns.length - 1 - lastAggregateIndex)); + var colSpan = this.columns.length - 1 - lastAggregateIndex; + if (colSpan > 0) { + cells.push($('<th>').attr('colspan', colSpan)); + } } else { - colspanBeforeAggregate = this.columns.length; + var colN = this.columns.length; + colspanBeforeAggregate = colN > 1 ? colN - 1 : 1; + if (colN > 1) { + cells.push($('<th>')); + } } if (this.hasSelectors) { colspanBeforeAggregate += 1; @@ -616,11 +622,11 @@ var ListRenderer = BasicRenderer.extend({ $th.attr('colspan', colspanBeforeAggregate); if (group.isOpen && !group.groupedBy.length && (group.count > group.data.length)) { - var $lastCell = cells[cells.length - 1]; var $pager = this._renderGroupPager(group); - $lastCell.addClass('o_group_pager').append($pager); + var $lastCell = cells[cells.length - 1]; + $lastCell.append($pager); } - if (groupLevel === 0 && group.isOpen && this.groupbys[groupBy]) { + if (group.isOpen && this.groupbys[groupBy]) { var $buttons = this._renderGroupButtons(group, this.groupbys[groupBy]); if ($buttons.length) { var $buttonSection = $('<div>', { diff --git a/addons/web/static/src/js/views/pivot/pivot_model.js b/addons/web/static/src/js/views/pivot/pivot_model.js index bf7c70e2859..a544ab15593 100644 --- a/addons/web/static/src/js/views/pivot/pivot_model.js +++ b/addons/web/static/src/js/views/pivot/pivot_model.js @@ -430,6 +430,7 @@ var PivotModel = AbstractModel.extend({ } if ('domain' in params) { this.data.domain = params.domain; + this.initialDomain = params.domain; } else { this.data.domain = this.initialDomain; } diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js index e35f09a6cc9..f665bf49791 100644 --- a/addons/web/static/src/js/views/view_dialogs.js +++ b/addons/web/static/src/js/views/view_dialogs.js @@ -243,8 +243,13 @@ var FormViewDialog = ViewDialog.extend({ * @override */ _focusOnClose: function() { - this.trigger_up('form_dialog_discarded'); - return true; + var isFocusSet = false; + this.trigger_up('form_dialog_discarded', { + callback: function (isFocused) { + isFocusSet = isFocused; + }, + }); + return isFocusSet; }, /** @@ -425,8 +430,13 @@ var SelectCreateDialog = ViewDialog.extend({ * @override */ _focusOnClose: function() { - this.trigger_up('form_dialog_discarded'); - return true; + var isFocusSet = false; + this.trigger_up('form_dialog_discarded', { + callback: function (isFocused) { + isFocusSet = isFocused; + }, + }); + return isFocusSet; }, }); diff --git a/addons/web/static/src/scss/layout_standard.scss b/addons/web/static/src/scss/layout_standard.scss index acc0e07bf1c..bd0b4934259 100644 --- a/addons/web/static/src/scss/layout_standard.scss +++ b/addons/web/static/src/scss/layout_standard.scss @@ -1,3 +1,6 @@ .o_standard_footer { margin-top: 200px; + .list-inline-item { + white-space: nowrap; + } } diff --git a/addons/web/static/src/scss/list_view.scss b/addons/web/static/src/scss/list_view.scss index 3d25258eac5..a18d9f70083 100644 --- a/addons/web/static/src/scss/list_view.scss +++ b/addons/web/static/src/scss/list_view.scss @@ -125,18 +125,18 @@ padding-bottom: 0; } } - .o_group_pager { - position: relative; + .o_pager { + cursor: text; + user-select: none; + text-align: right; + padding-top: 0 !important; + padding-bottom: 0 !important; + margin-top: -2px; + margin-bottom: -2px; - .o_pager { - @include o-position-absolute(0, 16px); - cursor: text; - user-select: none; - padding-top: 3px !important; - padding-bottom: 0 !important; - } .o_pager_previous, .o_pager_next { max-height: 30px; + padding: 0 5px; background-color: $o-list-group-header-color; &:hover { background-color: darken($o-list-group-header-color, 10%); diff --git a/addons/web/static/src/xml/kanban.xml b/addons/web/static/src/xml/kanban.xml index 3a01370443f..e54ad36b8b8 100644 --- a/addons/web/static/src/xml/kanban.xml +++ b/addons/web/static/src/xml/kanban.xml @@ -110,7 +110,7 @@ <div class="o_kanban_counter_progress progress"> <t t-foreach="widget.colors" t-as="color"> <t t-set="count" t-value="widget.subgroupCounts and widget.subgroupCounts[color] or 0"/> - <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' active progress-bar-striped' : ''}" + <div t-attf-class="progress-bar transition-off bg-#{color_value}-full#{count ? ' o_bar_has_records' : ''}#{widget.activeFilter ? ' progress-bar-animated progress-bar-striped' : ''}" t-att-data-filter="color" t-attf-data-original-title="#{count} #{color}" aria-valuemin="0" aria-valuemax="100" t-att-aria-valuenow="count*100" role="progressbar" diff --git a/addons/web/static/src/xml/menu.xml b/addons/web/static/src/xml/menu.xml index 6a4749d1c25..086d676e02a 100644 --- a/addons/web/static/src/xml/menu.xml +++ b/addons/web/static/src/xml/menu.xml @@ -20,7 +20,7 @@ </a> <div class="dropdown-menu" role="menu"> <t t-foreach="widget.getApps()" t-as="app"> - <a role="menuitem" + <a role="menuitem" t-attf-href="#menu_id=#{app.menuID}" class="dropdown-item o_app" t-att-data-menu-id="app.menuID" t-att-data-menu-xmlid="app.xmlID" diff --git a/addons/web/static/tests/chrome/action_manager_tests.js b/addons/web/static/tests/chrome/action_manager_tests.js index 5724da4b2f8..b98a973695f 100644 --- a/addons/web/static/tests/chrome/action_manager_tests.js +++ b/addons/web/static/tests/chrome/action_manager_tests.js @@ -880,6 +880,41 @@ QUnit.module('ActionManager', { actionManager.destroy(); }); + QUnit.test('lazy loaded multi record view with failing mono record one', async function (assert) { + assert.expect(4); + + var actionManager = await createActionManager({ + actions: this.actions, + archs: this.archs, + data: this.data, + mockRPC: function (route, args) { + if (args.method === 'read') { + return Promise.reject(); + } + return this._super.apply(this, arguments); + }, + }); + + await actionManager.loadState({ + action: 3, + id: 2, + view_type: 'form', + }).then(function () { + assert.ok(false, 'should not resolve the deferred'); + }).catch(function () { + assert.ok(true, 'should reject the deferred'); + }); + + assert.containsNone(actionManager, '.o_form_view'); + assert.containsNone(actionManager, '.o_list_view'); + + await actionManager.doAction(1); + + assert.containsOnce(actionManager, '.o_kanban_view'); + + actionManager.destroy(); + }); + QUnit.test('change the viewType of the current action', async function (assert) { assert.expect(13); diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index b5e098d230c..9c649cc0173 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -313,8 +313,8 @@ QUnit.module('relational_fields', { await testUtils.form.clickEdit(form); await testUtils.dom.click(form.$('.o_external_button')); - var $originalModal = $('.modal-dialog'); - var $focusedModal = $(document.activeElement).closest('.modal-dialog'); + var $originalModal = $('.modal'); + var $focusedModal = $(document.activeElement).closest('.modal'); assert.equal($originalModal.length, 1, 'There should be one modal'); assert.equal($originalModal[0], $focusedModal[0], 'Modal is focused'); @@ -322,8 +322,8 @@ QUnit.module('relational_fields', { // Open many2one modal of field in many2one modal await testUtils.dom.click($originalModal.find('.o_external_button')); - var $modals = $('.modal-dialog'); - $focusedModal = $(document.activeElement).closest('.modal-dialog'); + var $modals = $('.modal'); + $focusedModal = $(document.activeElement).closest('.modal'); assert.equal($modals.length, 2, 'There should be two modals'); assert.equal($modals[1], $focusedModal[0], 'Last modal is focused'); @@ -331,8 +331,8 @@ QUnit.module('relational_fields', { // Close second modal await testUtils.dom.click($modals.last().find('button[class="close"]')); - var $modal = $('.modal-dialog'); - $focusedModal = $(document.activeElement).closest('.modal-dialog'); + var $modal = $('.modal'); + $focusedModal = $(document.activeElement).closest('.modal'); assert.equal($modal.length, 1, 'There should be one modal'); assert.equal($modal[0], $originalModal[0], 'First modal is still opened'); diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index cd9659aceed..1fa82e3f238 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -4881,6 +4881,65 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.module('focus and scroll test', async function () { + QUnit.test('no focus set on form when closing many2one modal if lastActivatedFieldIndex is not set', async function (assert) { + assert.expect(8); + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<field name="display_name"/>' + + '<field name="foo"/>' + + '<field name="bar"/>' + + '<field name="p"/>' + + '<field name="timmy"/>' + + '<field name="product_ids"/>' + + '<field name="trululu"/>' + + '</form>', + res_id: 2, + archs: { + 'partner,false,list': '<tree><field name="display_name"/></tree>', + 'partner_type,false,list': '<tree><field name="name"/></tree>', + 'partner,false,form': '<form><field name="trululu"/></form>', + 'product,false,list': '<tree><field name="name"/></tree>', + }, + mockRPC: function (route, args) { + if (args.method === 'get_formview_id') { + return Promise.resolve(false); + } + return this._super(route, args); + }, + }); + + // set max-height to have scroll forcefully so that we can test scroll position after modal close + $('.o_content').css({'overflow': 'auto', 'max-height': '300px'}); + // Open many2one modal, lastActivatedFieldIndex will not set as we directly click on external button + await testUtils.form.clickEdit(form); + assert.strictEqual($(".o_content").scrollTop(), 0, "scroll position should be 0"); + + form.$(".o_field_many2one[name='trululu'] .o_input").focus(); + assert.notStrictEqual($(".o_content").scrollTop(), 0, "scroll position should not be 0"); + + await testUtils.dom.click(form.$('.o_external_button')); + // Close modal + await testUtils.dom.click($('.modal').last().find('button[class="close"]')); + assert.notStrictEqual($(".o_content").scrollTop(), 0, + "scroll position should not be 0 after closing modal"); + assert.containsNone(document.body, '.modal', 'There should be no modal'); + assert.doesNotHaveClass($('body'), 'modal-open', 'Modal is not said opened'); + assert.strictEqual(form.renderer.lastActivatedFieldIndex, -1, + "lastActivatedFieldIndex is -1"); + assert.equal(document.activeElement, $('body')[0], + 'body is focused, should not set focus on form widget'); + assert.notStrictEqual(document.activeElement, form.$('.o_field_many2one[name="trululu"] .o_input'), + 'field widget should not be focused when lastActivatedFieldIndex is -1'); + + form.destroy(); + }); + }); + QUnit.test('in create mode, autofocus fields are focused', async function (assert) { assert.expect(1); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 4e324762372..5dd64d6a074 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -553,10 +553,29 @@ QUnit.module('Views', { hasSelectors: false, }); - assert.strictEqual(list.$('.o_group_header:first').children().length, 1, - "group header should have exactly 1 column"); + assert.strictEqual(list.$('.o_group_header:first').children().length, 2, + "group header should have exactly 2 column"); + assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "1", + "the header should not span the whole table"); + list.destroy(); + }); + + QUnit.test('basic grouped list rendering 3 cols without selector', async function (assert) { + assert.expect(2); + + var list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree ><field name="foo"/><field name="bar"/><field name="text"/></tree>', + groupBy: ['bar'], + hasSelectors: false, + }); + + assert.strictEqual(list.$('.o_group_header:first').children().length, 2, + "group header should have exactly 2 columns"); assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "2", - "the header should span the whole table"); + "the first header should span two columns"); list.destroy(); }); @@ -572,10 +591,29 @@ QUnit.module('Views', { hasSelectors: true, }); - assert.strictEqual(list.$('.o_group_header:first').children().length, 1, - "group header should have exactly 1 column"); + assert.strictEqual(list.$('.o_group_header:first').children().length, 2, + "group header should have exactly 2 columns"); + assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "2", + "the header should not span the whole table"); + list.destroy(); + }); + + QUnit.test('basic grouped list rendering 3 cols with selector', async function (assert) { + assert.expect(2); + + var list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree ><field name="foo"/><field name="bar"/><field name="text"/></tree>', + groupBy: ['bar'], + hasSelectors: true, + }); + + assert.strictEqual(list.$('.o_group_header:first').children().length, 2, + "group header should have exactly 2 columns"); assert.strictEqual(list.$('.o_group_header:first th').attr('colspan'), "3", - "the header should span the whole table"); + "the header should not span the whole table"); list.destroy(); }); @@ -1391,6 +1429,39 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('width of some of the fields should be hardcoded', async function (assert) { + const assertions = [ + { field: 'bar', expected: 40, type: 'Boolean' }, + { field: 'int_field', expected: 80, type: 'Integer' }, + { field: 'qux', expected: 100, type: 'Float' }, + { field: 'date', expected: 100, type: 'Date' }, + { field: 'datetime', expected: 150, type: 'Datetime' }, + ]; + assert.expect(assertions.length + 1); + + var list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree editable="top">' + + '<field name="bar"/>' + + '<field name="foo"/>' + + '<field name="int_field"/>' + + '<field name="qux"/>' + + '<field name="date"/>' + + '<field name="datetime"/>' + + '</tree>', + }); + + assertions.forEach(a => { + assert.strictEqual(list.$(`th[data-name="${a.field}"]`)[0].offsetWidth, a.expected, + `Field ${a.type} should have a fixed width of ${a.expected} pixels`); + }); + assert.strictEqual(list.$('th[data-name="foo"]')[0].style.width, '100%', "Char field should occupy the remaining space"); + + list.destroy(); + }); + QUnit.test('row height should not change when switching mode', async function (assert) { // Warning: this test is css dependant assert.expect(3); @@ -1414,7 +1485,7 @@ QUnit.module('Views', { '<field name="int_field" readonly="1"/>' + '<field name="boolean"/>' + '<field name="date"/>' + - '<field name="text" width_factor="2"/>' + + '<field name="text" width_factor="1"/>' + '<field name="amount"/>' + '<field name="currency_id" invisible="1"/>' + '<field name="m2o"/>' + @@ -1424,6 +1495,11 @@ QUnit.module('Views', { currencies: currencies, }, }); + + // the width is hardcoded to make sure we have the same condition + // between debug mode and non debug mode (#qunit-fixture is limited to + // 1000px) + list.$el.width('1000px'); var startHeight = list.$('.o_data_row:first').height(); // start edition of first row @@ -2094,8 +2170,8 @@ QUnit.module('Views', { await testUtils.dom.click(list.$('tbody:eq(1) .o_group_header:eq(0)')); - assert.containsNone(list, '.o_group_header button', - "there should be no button in the header"); + assert.containsOnce(list, '.o_group_header button', + "there should be one button in the header"); list.destroy(); }); @@ -2759,8 +2835,8 @@ QUnit.module('Views', { await testUtils.dom.click(list.$('.o_group_header')); assert.strictEqual(list.$('.o_group_header').css('height'), headerHeight, "height of group header shouldn't have changed"); - assert.hasClass(list.$('.o_group_header th'), 'o_group_pager', - "last cell of open group header should have classname 'o_group_header'"); + assert.hasClass(list.$('.o_group_header th:eq(1) > div'), 'o_pager', + "last cell of open group header should have classname 'o_pager'"); assert.strictEqual(list.$('.o_group_header .o_pager_value').text(), '1-3', "pager's value should be correct"); assert.containsN(list, '.o_data_row', 3, @@ -4299,6 +4375,43 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('editable list view: contexts with multiple edit', async function (assert) { + assert.expect(4); + + var list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + arch: '<tree editable="top">' + + '<field name="foo"/>' + + '</tree>', + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/foo/write' || + route === '/web/dataset/call_kw/foo/read') { + var context = args.kwargs.context; + assert.strictEqual(context.active_field, 2, "context should be correct"); + assert.strictEqual(context.someKey, 'some value', "context should be correct"); + } + return this._super.apply(this, arguments); + }, + session: { + user_context: {someKey: 'some value'}, + }, + viewOptions: { + context: {active_field: 2}, + }, + }); + + // Uses the main selector to select all lines. + await testUtils.dom.click(list.$('.o_content input:first')); + await testUtils.dom.click(list.$('.o_data_cell:first')); + // Edits first record then confirms changes. + await testUtils.fields.editInput(list.$('.o_field_widget[name=foo]'), 'legion'); + await testUtils.dom.click($('.modal-dialog button.btn-primary')); + + list.destroy(); + }); + QUnit.test('editable list view: multi edition', async function (assert) { assert.expect(19); diff --git a/addons/web/static/tests/views/pivot_tests.js b/addons/web/static/tests/views/pivot_tests.js index 333f51f75ba..3a83a23b64e 100644 --- a/addons/web/static/tests/views/pivot_tests.js +++ b/addons/web/static/tests/views/pivot_tests.js @@ -4,6 +4,7 @@ odoo.define('web.pivot_tests', function (require) { var core = require('web.core'); var PivotView = require('web.PivotView'); var testUtils = require('web.test_utils'); +var testUtilsDom = require('web.test_utils_dom'); var createActionManager = testUtils.createActionManager; var patchDate = testUtils.mock.patchDate; @@ -16,7 +17,7 @@ QUnit.module('Views', { this.data = { partner: { fields: { - foo: {string: "Foo", type: "integer"}, + foo: {string: "Foo", type: "integer", searchable: true}, bar: {string: "bar", type: "boolean"}, date: {string: "Date", type: "date", store: true, sortable: true}, product_id: {string: "Product", type: "many2one", relation: 'product', store: true}, @@ -1880,6 +1881,71 @@ QUnit.module('Views', { actionManager.destroy(); }); + QUnit.test('Navigation list view for a group and back with breadcrumbs', async function (assert) { + assert.expect(16); + // create an action manager to test the interactions with the search view + var readGroupCount = 0; + var actionManager = await createActionManager({ + data: this.data, + archs: { + 'partner,false,pivot': '<pivot>' + + '<field name="customer" type="row"/>' + + '</pivot>', + 'partner,false,search': '<search><filter name="bayou" string="Bayou" domain="[(\'foo\',\'=\', 12)]"/></search>', + 'partner,false,list': '<tree><field name="foo"/></tree>', + 'partner,false,form': '<form><field name="foo"/></form>', + }, + intercepts: { + do_action: function (event) { + var action = event.data.action; + actionManager.doAction(action); + } + }, + mockRPC: function (route, args) { + if (args.method === 'read_group') { + assert.step('read_group'); + var domain = args.kwargs.domain; + if ([0,1].indexOf(readGroupCount) !== -1) { + assert.deepEqual(domain, [], 'initial domain empty'); + } else if ([2,3,4,5].indexOf(readGroupCount) !== -1) { + assert.deepEqual(domain, [['foo', '=', 12]], + 'domain conserved when back with breadcrumbs'); + } + readGroupCount++; + } + if (route === '/web/dataset/search_read') { + assert.step('search_read'); + var domain = args.domain; + assert.deepEqual(domain, [['foo', '=', 12], ['customer', '=', 1], ['foo', '=', 12]], + 'list domain is correct'); + } + return this._super.apply(this, arguments); + } + }); + + await actionManager.doAction({ + res_model: 'partner', + type: 'ir.actions.act_window', + views: [[false, 'pivot']], + }); + + await testUtilsDom.click(actionManager.$('.o_filters_menu_button')); + await testUtilsDom.click(actionManager.$('.o_menu_item:contains("Bayou")')); + + await testUtilsDom.click(actionManager.$('.o_pivot_cell_value:nth(1)')) + + assert.containsOnce(actionManager, '.o_list_view'); + + await testUtilsDom.click(actionManager.$('.o_control_panel .breadcrumb-item:first() a')); + + assert.verifySteps([ + 'read_group', 'read_group', + 'read_group', 'read_group', + 'search_read', + 'read_group', 'read_group']) + actionManager.destroy(); + }); + QUnit.module('Sort in comparison mode', { beforeEach: async function () { this.data.partner.records[0].date = '2016-12-15'; diff --git a/addons/web_editor/i18n/km.po b/addons/web_editor/i18n/km.po index 702cddccbb2..0ca4f16327a 100644 --- a/addons/web_editor/i18n/km.po +++ b/addons/web_editor/i18n/km.po @@ -378,7 +378,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/snippets.xml:15 #, python-format msgid "Customize" -msgstr "" +msgstr "អតិថិជន" #. module: web_editor #. openerp-web @@ -1017,7 +1017,7 @@ msgstr "" #: code:addons/web_editor/static/src/xml/editor.xml:309 #, python-format msgid "Preview" -msgstr "" +msgstr "ពីមុន" #. module: web_editor #. openerp-web diff --git a/addons/web_editor/i18n/vi.po b/addons/web_editor/i18n/vi.po index 8bcf0142fcb..9b93ed3e375 100644 --- a/addons/web_editor/i18n/vi.po +++ b/addons/web_editor/i18n/vi.po @@ -1072,7 +1072,7 @@ msgstr "" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_float msgid "Qweb Field Float" -msgstr "" +msgstr "Qweb Field Float" #. module: web_editor #: model:ir.model,name:web_editor.model_ir_qweb_field_html diff --git a/addons/web_editor/models/ir_ui_view.py b/addons/web_editor/models/ir_ui_view.py index 9f856a11a78..8847103f846 100644 --- a/addons/web_editor/models/ir_ui_view.py +++ b/addons/web_editor/models/ir_ui_view.py @@ -251,10 +251,10 @@ class IrUiView(models.Model): if called_view and called_view not in views_to_return: views_to_return += self._views_get(called_view, get_children=get_children, bundles=bundles) - extensions = self._view_get_inherited_children(view) if not get_children: - # only active children - extensions = extensions.filtered(lambda view: view.active) + return views_to_return + + extensions = self._view_get_inherited_children(view) # Keep children in a deterministic order regardless of their applicability for extension in extensions.sorted(key=lambda v: v.id): diff --git a/addons/web_editor/static/src/js/wysiwyg/plugin/history.js b/addons/web_editor/static/src/js/wysiwyg/plugin/history.js index a60ab41523b..addf6383783 100644 --- a/addons/web_editor/static/src/js/wysiwyg/plugin/history.js +++ b/addons/web_editor/static/src/js/wysiwyg/plugin/history.js @@ -19,6 +19,12 @@ var HistoryPlugin = Plugins.history.extend({ console.error(e); } this.context.invoke('editor.focus'); + var newRange = this.context.invoke('editor.createRange'); + if (!this.options.isEditableNode(newRange.sc)) { + var firstEditableSel = '[contenteditable="true"]:not(":hidden")'; + var sc = this.$editable.find(firstEditableSel)[0]; + this.context.invoke('editor.setRange', sc, 0, sc, 0).select(); + } }, /** * Clear the history. diff --git a/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js b/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js index 9bc9124688b..d13ddf63038 100644 --- a/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js +++ b/addons/web_editor/static/src/js/wysiwyg_snippets/snippets.editor.js @@ -358,6 +358,8 @@ var SnippetEditor = Widget.extend({ ev.preventDefault(); this.trigger_up('cover_will_change'); + this.trigger_up('snippet_will_be_cloned', {$target: this.$target}); + var $clone = this.$target.clone(false); this.trigger_up('request_history_undo_record', {$target: this.$target}); @@ -372,7 +374,7 @@ var SnippetEditor = Widget.extend({ } }, }); - this.trigger_up('snippet_cloned', {$target: $clone}); + this.trigger_up('snippet_cloned', {$target: $clone, $origin: this.$target}); $clone.trigger('content_changed'); }, /** diff --git a/addons/web_settings_dashboard/i18n/ar.po b/addons/web_settings_dashboard/i18n/ar.po index f0c39c121a0..cad93376788 100644 --- a/addons/web_settings_dashboard/i18n/ar.po +++ b/addons/web_settings_dashboard/i18n/ar.po @@ -182,7 +182,7 @@ msgstr "دعوة مستخدمين جدد" #: code:addons/web_settings_dashboard/static/src/xml/dashboard.xml:104 #, python-format msgid "LinkedIn" -msgstr "" +msgstr "LinkedIn" #. module: web_settings_dashboard #. openerp-web @@ -196,7 +196,7 @@ msgstr "تحميل ترجمة" #: code:addons/web_settings_dashboard/static/src/xml/dashboard.xml:132 #, python-format msgid "Load demo data" -msgstr "" +msgstr "تحميل البيانات التجريبية" #. module: web_settings_dashboard #. openerp-web diff --git a/addons/website/i18n/cs.po b/addons/website/i18n/cs.po index 5c390d2a6ff..b90e3b92b83 100644 --- a/addons/website/i18n/cs.po +++ b/addons/website/i18n/cs.po @@ -4778,7 +4778,7 @@ msgstr "" #. module: website #: model_terms:ir.ui.view,arch_db:website.res_config_settings_view_form msgid "www.odoo.com" -msgstr "" +msgstr "www.odoo.com" #. module: website #: model_terms:ir.ui.view,arch_db:website.500 diff --git a/addons/website/i18n/km.po b/addons/website/i18n/km.po index 6a8c385d6af..32b8677435b 100644 --- a/addons/website/i18n/km.po +++ b/addons/website/i18n/km.po @@ -1338,7 +1338,7 @@ msgstr "" #. module: website #: model_terms:ir.ui.view,arch_db:website.user_navbar msgid "Customize" -msgstr "" +msgstr "អតិថិជន" #. module: website #: model_terms:ir.ui.view,arch_db:website.user_navbar @@ -1627,7 +1627,7 @@ msgstr "" #. module: website #: model_terms:ir.ui.view,arch_db:website.s_features_grid msgid "Duplicate" -msgstr "" +msgstr "ត្រួត" #. module: website #: model_terms:ir.ui.view,arch_db:website.s_features_grid @@ -3194,7 +3194,7 @@ msgstr "" #: code:addons/website/static/src/xml/website.seo.xml:143 #, python-format msgid "Preview" -msgstr "" +msgstr "ពីមុន" #. module: website #. openerp-web @@ -3400,7 +3400,7 @@ msgstr "" #. module: website #: model_terms:ir.ui.view,arch_db:website.s_tabs msgid "Review" -msgstr "" +msgstr "ពិនិត្យឡើងវិញ" #. module: website #: model_terms:ir.ui.view,arch_db:website.snippet_options diff --git a/addons/website/i18n/nl.po b/addons/website/i18n/nl.po index 67a11e93fa4..cc8d6acfba2 100644 --- a/addons/website/i18n/nl.po +++ b/addons/website/i18n/nl.po @@ -1979,7 +1979,7 @@ msgstr "Volg al de" #. module: website #: model_terms:ir.ui.view,arch_db:website.res_config_settings_view_form msgid "Follow your website traffic in Odoo." -msgstr "Volg uw website trafiek in Odoo." +msgstr "Volg uw website verkeer in Odoo." #. module: website #: model_terms:ir.ui.view,arch_db:website.theme_customize diff --git a/addons/website/i18n/vi.po b/addons/website/i18n/vi.po index ebc18f8d44f..37a6684b5b8 100644 --- a/addons/website/i18n/vi.po +++ b/addons/website/i18n/vi.po @@ -3194,7 +3194,7 @@ msgstr "Trình đơn cha" #. module: website #: model:ir.model.fields,field_description:website.field_website_menu__parent_path msgid "Parent Path" -msgstr "" +msgstr "Parent Path" #. module: website #: model:ir.model.fields,help:website.field_website__partner_id diff --git a/addons/website/models/website_redirect.py b/addons/website/models/website_redirect.py index 511a006b8a7..a0fbda884b0 100644 --- a/addons/website/models/website_redirect.py +++ b/addons/website/models/website_redirect.py @@ -13,6 +13,6 @@ class WebsiteRedirect(models.Model): redirect_type = fields.Selection([('301', 'Moved permanently (301)'), ('302', 'Moved temporarily (302)')], string='Redirection Type', required=True, default="301") url_from = fields.Char('Redirect From', required=True) url_to = fields.Char('Redirect To', required=True) - website_id = fields.Many2one('website', 'Website') + website_id = fields.Many2one('website', 'Website', ondelete='cascade') active = fields.Boolean(default=True) sequence = fields.Integer() diff --git a/addons/website/static/src/js/menu/edit.js b/addons/website/static/src/js/menu/edit.js index a08ca136131..a601ae3fb8a 100644 --- a/addons/website/static/src/js/menu/edit.js +++ b/addons/website/static/src/js/menu/edit.js @@ -21,6 +21,7 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ custom_events: _.extend({}, websiteNavbarData.WebsiteNavbarActionWidget.custom_events || {}, { content_will_be_destroyed: '_onContentWillBeDestroyed', content_was_recreated: '_onContentWasRecreated', + snippet_will_be_cloned: '_onSnippetWillBeCloned', snippet_cloned: '_onSnippetCloned', snippet_dropped: '_onSnippetDropped', edition_will_stopped: '_onEditionWillStop', @@ -204,8 +205,21 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ this.editModeEnable = false; }, /** + * Called when a snippet is about to be cloned in the page. Notifies the + * WebsiteRoot that is should destroy the animations for this snippet. + * + * @private + * @param {OdooEvent} ev + */ + _onSnippetWillBeCloned: function (ev) { + this.trigger_up('animation_stop_demand', { + $target: ev.data.$target, + }); + }, + /** * Called when a snippet is cloned in the page. Notifies the WebsiteRoot - * that is should start the public widgets for this snippet. + * that is should start the public widgets for this snippet and the snippet it + * was cloned from. * * @private * @param {OdooEvent} ev @@ -215,6 +229,13 @@ var EditPageMenu = websiteNavbarData.WebsiteNavbarActionWidget.extend({ editableMode: true, $target: ev.data.$target, }); + // TODO: remove in saas-12.5, undefined $origin will restart #wrapwrap + if (ev.data.$origin) { + this.trigger_up('widgets_start_request', { + editableMode: true, + $target: ev.data.$origin, + }); + } }, /** * Called when a snippet is dropped in the page. Notifies the WebsiteRoot diff --git a/addons/website/tests/test_views.py b/addons/website/tests/test_views.py index 0d24a2517ad..b8262bb11b8 100644 --- a/addons/website/tests/test_views.py +++ b/addons/website/tests/test_views.py @@ -610,6 +610,20 @@ class TestCowViewSaving(common.TransactionCase): 'arch': '<div position="inside">, sub ext</div>', 'key': 'II', }) + + # B + # | + # I + # | + # II + + # First, test that children of inactive children are not returned (not multiwebsite related) + self.inherit_view.active = False + views = View.get_related_views('B') + self.assertEqual(views.mapped('key'), ['B', 'I'], "As 'I' is inactive, 'II' (its own child) should not be returned.") + self.inherit_view.active = True + + # Second, test multi-website self.inherit_view.with_context(website_id=1).write({'name': 'Extension'}) # Trigger cow on hierarchy View.create({ 'name': 'II2', diff --git a/addons/website_blog/i18n/km.po b/addons/website_blog/i18n/km.po index a057aae8da8..efe44b535f0 100644 --- a/addons/website_blog/i18n/km.po +++ b/addons/website_blog/i18n/km.po @@ -471,7 +471,7 @@ msgstr "ឈ្មោះសំរាប់បង្ហាញ" #. module: website_blog #: model_terms:ir.ui.view,arch_db:website_blog.blog_edit_options msgid "Duplicate" -msgstr "" +msgstr "ត្រួត" #. module: website_blog #: model_terms:blog.post,content:website_blog.blog_post_1 diff --git a/addons/website_crm/i18n/km.po b/addons/website_crm/i18n/km.po index 83a6d9d5a22..48b97b24367 100644 --- a/addons/website_crm/i18n/km.po +++ b/addons/website_crm/i18n/km.po @@ -108,7 +108,7 @@ msgstr "" #. module: website_crm #: model_terms:ir.ui.view,arch_db:website_crm.res_config_settings_view_form msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: website_crm #: model_terms:ir.ui.view,arch_db:website_crm.res_config_settings_view_form diff --git a/addons/website_crm_partner_assign/i18n/km.po b/addons/website_crm_partner_assign/i18n/km.po index e13b9fb62c1..8a204f09ff8 100644 --- a/addons/website_crm_partner_assign/i18n/km.po +++ b/addons/website_crm_partner_assign/i18n/km.po @@ -376,7 +376,7 @@ msgstr "" #. module: website_crm_partner_assign #: model:ir.model.fields,field_description:website_crm_partner_assign.field_crm_lead_forward_to_partner__body msgid "Contents" -msgstr "" +msgstr "មាតិកា" #. module: website_crm_partner_assign #: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.portal_my_opportunity @@ -986,7 +986,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.portal_my_lead #: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.view_report_crm_partner_assign_filter msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: website_crm_partner_assign #: model_terms:ir.ui.view,arch_db:website_crm_partner_assign.portal_my_lead diff --git a/addons/website_customer/i18n/vi.po b/addons/website_customer/i18n/vi.po index 288f833b753..c742269e447 100644 --- a/addons/website_customer/i18n/vi.po +++ b/addons/website_customer/i18n/vi.po @@ -124,6 +124,8 @@ msgid "" "Manage contact tags to better classify them for tracking and analysis " "purposes." msgstr "" +"Quản lý các từ khóa liên lạc để phân biệt tốt hơn các liên lạc cho mục đích " +"theo dõi và phân tích." #. module: website_customer #: model_terms:ir.ui.view,arch_db:website_customer.index diff --git a/addons/website_event/i18n/cs.po b/addons/website_event/i18n/cs.po index 5960968308f..e8ab5fa9eef 100644 --- a/addons/website_event/i18n/cs.po +++ b/addons/website_event/i18n/cs.po @@ -83,6 +83,8 @@ msgid "" "<i class=\"fa fa-flag fa-5x\"/>\n" " Events from Your Country" msgstr "" +"<i class=\"fa fa-flag fa-5x\"/>\n" +" Události z vaší země" #. module: website_event #: model_terms:ir.ui.view,arch_db:website_event.registration_complete diff --git a/addons/website_event_track/i18n/ar.po b/addons/website_event_track/i18n/ar.po index b208df87d3f..ff7e20db68a 100644 --- a/addons/website_event_track/i18n/ar.po +++ b/addons/website_event_track/i18n/ar.po @@ -481,7 +481,7 @@ msgstr "" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track_stage__fold msgid "Folded in Kanban" -msgstr "" +msgstr "مطوي في عرض كانبان" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track__message_follower_ids @@ -629,7 +629,7 @@ msgstr "متابع" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track__is_published msgid "Is published" -msgstr "" +msgstr "منشور" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track__kanban_state @@ -934,7 +934,7 @@ msgstr "غرفة" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track__is_seo_optimized msgid "SEO optimized" -msgstr "" +msgstr "تم تحسين محركات البحث" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_sponsor__sequence @@ -1285,7 +1285,7 @@ msgstr "" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track__website_published msgid "Visible on current website" -msgstr "" +msgstr "ظاهرة في الموقع الحالي" #. module: website_event_track #: model_terms:ir.ui.view,arch_db:website_event_track.event_track_proposal @@ -1347,7 +1347,7 @@ msgstr "العنوان الدلالي بالموقع" #. module: website_event_track #: model:ir.model.fields,field_description:website_event_track.field_event_track__website_meta_og_img msgid "Website opengraph image" -msgstr "" +msgstr "صورة الرسم البياني المفتوح للموقع" #. module: website_event_track #: model_terms:ir.ui.view,arch_db:website_event_track.event_track_proposal @@ -1384,4 +1384,4 @@ msgstr "محادثات" #: model_terms:ir.ui.view,arch_db:website_event_track.agenda #: model_terms:ir.ui.view,arch_db:website_event_track.tracks msgid "unpublished" -msgstr "" +msgstr "غير منشور" diff --git a/addons/website_event_track/i18n/km.po b/addons/website_event_track/i18n/km.po index a770f060b1b..4ea114a98c3 100644 --- a/addons/website_event_track/i18n/km.po +++ b/addons/website_event_track/i18n/km.po @@ -928,7 +928,7 @@ msgstr "លំដាប់" #. module: website_event_track #: model_terms:ir.ui.view,arch_db:website_event_track.view_event_track_search msgid "Show all records which has next action date is before today" -msgstr "" +msgstr "បង្ហាញកំណត់ត្រាទាំងអស់ដែលមានកាលបរិច្ឆេទសកម្មភាពបន្ទាប់នៅមុនថ្ងៃនេះ" #. module: website_event_track #: model:event.sponsor.type,name:website_event_track.event_sponsor_type2 diff --git a/addons/website_gengo/i18n/ar.po b/addons/website_gengo/i18n/ar.po index 59330193eee..c6f2a4a1f54 100644 --- a/addons/website_gengo/i18n/ar.po +++ b/addons/website_gengo/i18n/ar.po @@ -26,42 +26,42 @@ msgstr "" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:144 #, python-format msgid "- Enable if you using testing account" -msgstr "- تمكين إذا كنت تستخدم حساب الاختبار" +msgstr "- قم بتمكينه إذا كنت تستخدم حساب اختباري" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:138 #, python-format msgid "- Jobs are Automatically Approved by Gengo." -msgstr "" +msgstr "- تتم الموافقة على الوظائف تلقائيًا من خلال Gengo." #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:118 #, python-format msgid "1. Go To your" -msgstr "1. اذهب إلى ل" +msgstr "1. اذهب إلى" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:119 #, python-format msgid "2. Then paste generated keys in given form" -msgstr "" +msgstr "2. ثم قم بلصق المفاتيح الناشئة في النموذج المعطى" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:29 #, python-format msgid "Already translated content" -msgstr "محتوى مترجم مسبقاً" +msgstr "محتوى مترجم مسبقًا" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:137 #, python-format msgid "Auto Approve Translation" -msgstr "ترجمة تم الموافقة عليها تلقائياً" +msgstr "قبول الترجمة تلقائيًا" #. module: website_gengo #. openerp-web @@ -75,7 +75,7 @@ msgstr "ترجمة تلقائية" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:67 #, python-format msgid "By Machine (Free)" -msgstr "بواسطة آلة (مجانا)" +msgstr "آلية (مجانية)" #. module: website_gengo #. openerp-web @@ -102,21 +102,21 @@ msgstr "إقفال" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:23 #, python-format msgid "Content to translate or you can post them to" -msgstr "" +msgstr "المحتوى المطلوب ترجمته أو يمكنك نشره هنا" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/js/website_gengo.js:88 #, python-format msgid "Could not Post translation" -msgstr "" +msgstr "تعذّر نشر الترجمة" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/js/website_gengo.js:195 #, python-format msgid "Could not submit ! Try Again" -msgstr "" +msgstr "تعذّر الإرسال! حاول مرة أخرى" #. module: website_gengo #. openerp-web @@ -137,35 +137,35 @@ msgstr "لا تعرض مربع الحوار هذا مجدداً." #: code:addons/website_gengo/static/src/xml/website.gengo.xml:24 #, python-format msgid "Gengo" -msgstr "" +msgstr "Gengo" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:114 #, python-format msgid "Gengo API is not configured" -msgstr "" +msgstr "لم يتم إعداد واجهة برمجة تطبيق Gengo" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:94 #, python-format msgid "Gengo Dashboard" -msgstr "" +msgstr "لوحة معلومات Gengo" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:94 #, python-format msgid "Gengo Statistics" -msgstr "" +msgstr "إحصائيات Gengo" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:118 #, python-format msgid "Gengo account" -msgstr "" +msgstr "حساب Gengo" #. module: website_gengo #. openerp-web @@ -203,14 +203,14 @@ msgstr "لصق المفتاح الخاص هنا" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:125 #, python-format msgid "Paste public key here" -msgstr "" +msgstr "لصق المفتاح العام هنا" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:75 #, python-format msgid "Post" -msgstr "تأجيل" +msgstr "نشر" #. module: website_gengo #. openerp-web @@ -224,7 +224,7 @@ msgstr "مفتاح خاص" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:69 #, python-format msgid "Pro - $" -msgstr "" +msgstr "احترافية - $" #. module: website_gengo #. openerp-web @@ -245,21 +245,21 @@ msgstr "تحديد الصلاحيات" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:62 #, python-format msgid "Select Gengo Translation Service Level" -msgstr "" +msgstr "اختر مستوى خدمة ترجمة Gengo" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:68 #, python-format msgid "Standard - $" -msgstr "" +msgstr "قياسية - $" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:117 #, python-format msgid "Steps for configure Gengo" -msgstr "" +msgstr "خطوات إعداد Gengo" #. module: website_gengo #. openerp-web @@ -287,28 +287,28 @@ msgstr "الكلمات المترجمة" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:6 #, python-format msgid "Translation in Progress" -msgstr "الترجمة في تقدم" +msgstr "جاري الترجمة" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:26 #, python-format msgid "Translation in process (Gengo)" -msgstr "" +msgstr "جاري الترجمة (من خلال Gengo)" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:89 #, python-format msgid "Translator statistics for this page" -msgstr "إحصاءات الترجمة لهذه الصفحة" +msgstr "إحصائيات الترجمة لهذه الصفحة" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:70 #, python-format msgid "Ultra - $" -msgstr "" +msgstr "فائقة - $" #. module: website_gengo #. openerp-web @@ -322,14 +322,14 @@ msgstr "انتظر" #: code:addons/website_gengo/static/src/xml/website.gengo.xml:97 #, python-format msgid "Words in progress" -msgstr "كلمات قيد التقدم" +msgstr "كلمات جاري العمل عليها" #. module: website_gengo #. openerp-web #: code:addons/website_gengo/static/src/xml/website.gengo.xml:96 #, python-format msgid "Words posted for translate" -msgstr "كلمات مرحلة للترجمة" +msgstr "كلمات نُشرت للترجمة" #. module: website_gengo #. openerp-web @@ -343,7 +343,7 @@ msgstr "أنت على وشك الدخول في وضع الترجمة." #: code:addons/website_gengo/static/src/xml/website.gengo.xml:118 #, python-format msgid "and generate API Keys." -msgstr "" +msgstr "وإنشاء مفاتيح واجهة برمجة التطبيق." #. module: website_gengo #: model:ir.model,name:website_gengo.model_base_gengo_translations @@ -362,4 +362,4 @@ msgstr "للترجمة." #: code:addons/website_gengo/static/src/xml/website.gengo.xml:93 #, python-format msgid "new words found on this page." -msgstr "كلمات جديدة وجدت على هذه الصفحة." +msgstr "كلمات جديدة وجدت في هذه الصفحة." diff --git a/addons/website_hr/i18n/ar.po b/addons/website_hr/i18n/ar.po index 707fabe711c..0952c06cfe0 100644 --- a/addons/website_hr/i18n/ar.po +++ b/addons/website_hr/i18n/ar.po @@ -3,16 +3,17 @@ # * website_hr # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-24 09:05+0000\n" -"PO-Revision-Date: 2018-08-24 09:05+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:34+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -29,7 +30,7 @@ msgstr "الموظف" #. module: website_hr #: model:ir.model.fields,field_description:website_hr.field_hr_employee__is_published msgid "Is published" -msgstr "" +msgstr "منشور" #. module: website_hr #: model_terms:ir.ui.view,arch_db:website_hr.aboutus @@ -44,7 +45,7 @@ msgstr "المعلومات العامة" #. module: website_hr #: model:ir.model.fields,help:website_hr.field_hr_employee__website_id msgid "Restrict publishing to this website." -msgstr "" +msgstr "قصر إمكانية النشر على هذا الموقع." #. module: website_hr #: model:ir.model.fields,help:website_hr.field_hr_employee__website_url @@ -54,7 +55,7 @@ msgstr "الرابط الكامل للوصول إلى المستند من خلا #. module: website_hr #: model:ir.model.fields,field_description:website_hr.field_hr_employee__website_published msgid "Visible on current website" -msgstr "" +msgstr "ظاهرة في الموقع الحالي" #. module: website_hr #: model:ir.model.fields,field_description:website_hr.field_hr_employee__website_id diff --git a/addons/website_livechat/i18n/ar.po b/addons/website_livechat/i18n/ar.po index d2de193afab..d7bc5ea2653 100644 --- a/addons/website_livechat/i18n/ar.po +++ b/addons/website_livechat/i18n/ar.po @@ -3,19 +3,20 @@ # * website_livechat # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Martin Trigaux, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 # Ali Alrehawi <alrehawi@hotmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-02 10:06+0000\n" -"PO-Revision-Date: 2018-10-02 10:06+0000\n" -"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:34+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -53,7 +54,7 @@ msgstr "وصف القناة المعروضة على صفحة موقع الويب #. module: website_livechat #: model_terms:ir.ui.view,arch_db:website_livechat.channel_page msgid "Happy face" -msgstr "" +msgstr "وجه سعيد" #. module: website_livechat #: model:website.menu,name:website_livechat.menu_livechat @@ -85,19 +86,19 @@ msgstr "الاسم" #. module: website_livechat #: model_terms:ir.ui.view,arch_db:website_livechat.channel_page msgid "Neutral face" -msgstr "" +msgstr "وجه محايد" #. module: website_livechat #. openerp-web #: code:addons/website_livechat/static/src/js/website_livechat.editor.js:29 #, python-format msgid "New Channel" -msgstr "" +msgstr "قناة جديدة" #. module: website_livechat #: model_terms:ir.ui.view,arch_db:website_livechat.channel_page msgid "Sad face" -msgstr "" +msgstr "وجه حزين" #. module: website_livechat #: model_terms:ir.ui.view,arch_db:website_livechat.channel_page diff --git a/addons/website_mail/i18n/km.po b/addons/website_mail/i18n/km.po index 2a97fbea84c..68b73a5d688 100644 --- a/addons/website_mail/i18n/km.po +++ b/addons/website_mail/i18n/km.po @@ -42,7 +42,7 @@ msgstr "" #: model:ir.model.fields,help:website_mail.field_mail_mail__description #: model:ir.model.fields,help:website_mail.field_mail_message__description msgid "Message description: either the subject, or the beginning of the body" -msgstr "" +msgstr "ការពិពណ៌នាសារ: ទាំងប្រធានបទឬការចាប់ផ្តើមនៃរាងកាយ" #. module: website_mail #. openerp-web diff --git a/addons/website_mass_mailing/i18n/km.po b/addons/website_mass_mailing/i18n/km.po index 3ceff6d0020..3b2e4e7a5e9 100644 --- a/addons/website_mass_mailing/i18n/km.po +++ b/addons/website_mass_mailing/i18n/km.po @@ -93,7 +93,7 @@ msgstr "" #. module: website_mass_mailing #: model:ir.model,name:website_mass_mailing.model_mail_mass_mailing_list msgid "Mailing List" -msgstr "" +msgstr "តារាងសំបុត្រ" #. module: website_mass_mailing #. openerp-web diff --git a/addons/website_partner/i18n/ar.po b/addons/website_partner/i18n/ar.po index edbbb4d82e6..495498161aa 100644 --- a/addons/website_partner/i18n/ar.po +++ b/addons/website_partner/i18n/ar.po @@ -3,16 +3,17 @@ # * website_partner # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-18 09:49+0000\n" -"PO-Revision-Date: 2018-09-18 09:49+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:35+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -29,13 +30,13 @@ msgstr "جهة الاتصال" #: model:ir.model.fields,field_description:website_partner.field_res_partner__is_published #: model:ir.model.fields,field_description:website_partner.field_res_users__is_published msgid "Is published" -msgstr "" +msgstr "منشور" #. module: website_partner #: model:ir.model.fields,field_description:website_partner.field_res_partner__is_seo_optimized #: model:ir.model.fields,field_description:website_partner.field_res_users__is_seo_optimized msgid "SEO optimized" -msgstr "" +msgstr "تم تحسين محركات البحث" #. module: website_partner #: model_terms:ir.ui.view,arch_db:website_partner.partner_detail @@ -52,7 +53,7 @@ msgstr "الرابط الكامل للوصول إلى المستند من خلا #: model:ir.model.fields,field_description:website_partner.field_res_partner__website_published #: model:ir.model.fields,field_description:website_partner.field_res_users__website_published msgid "Visible on current website" -msgstr "" +msgstr "ظاهرة في الموقع الحالي" #. module: website_partner #: model:ir.model.fields,field_description:website_partner.field_res_partner__website_description @@ -94,4 +95,4 @@ msgstr "العنوان الدلالي بالموقع" #: model:ir.model.fields,field_description:website_partner.field_res_partner__website_meta_og_img #: model:ir.model.fields,field_description:website_partner.field_res_users__website_meta_og_img msgid "Website opengraph image" -msgstr "" +msgstr "صورة الرسم البياني المفتوح للموقع" diff --git a/addons/website_profile/controllers/main.py b/addons/website_profile/controllers/main.py index c3b9ba54941..9bd3ee8e892 100644 --- a/addons/website_profile/controllers/main.py +++ b/addons/website_profile/controllers/main.py @@ -243,7 +243,6 @@ class WebsiteProfile(http.Controller): Users = request.env['res.users'] where_query = Users._where_calc(domain) - Users._apply_ir_rules(where_query, 'read') from_clause, where_clause, where_clause_params = where_query.get_sql() # we search on every user in the DB to get the real positioning (not the one inside the subset) diff --git a/addons/website_rating/i18n/ar.po b/addons/website_rating/i18n/ar.po index 4b70ac48bf1..09f10848c46 100644 --- a/addons/website_rating/i18n/ar.po +++ b/addons/website_rating/i18n/ar.po @@ -3,17 +3,18 @@ # * website_rating # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 # Shaima Safar <shaima.safar@open-inside.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-08-24 09:05+0000\n" -"PO-Revision-Date: 2018-08-24 09:05+0000\n" -"Last-Translator: Shaima Safar <shaima.safar@open-inside.com>, 2018\n" +"POT-Creation-Date: 2018-09-18 09:49+0000\n" +"PO-Revision-Date: 2018-08-24 09:35+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -125,7 +126,7 @@ msgstr "التقييم" #: code:addons/website_rating/static/src/xml/website_mail.xml:52 #, python-format msgid "Remove selection" -msgstr "" +msgstr "إزالة المحدد" #. module: website_rating #. openerp-web diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index c25d61fd6a4..bba443b74a5 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -365,9 +365,11 @@ class WebsiteSale(http.Controller): @http.route(['/shop/pricelist'], type='http', auth="public", website=True, sitemap=False) def pricelist(self, promo, **post): redirect = post.get('r', '/shop/cart') - pricelist = request.env['product.pricelist'].sudo().search([('code', '=', promo)], limit=1) - if not pricelist or (pricelist and not request.website.is_pricelist_available(pricelist.id)): - return request.redirect("%s?code_not_available=1" % redirect) + # empty promo code is used to reset/remove pricelist (see `sale_get_order()`) + if promo: + pricelist = request.env['product.pricelist'].sudo().search([('code', '=', promo)], limit=1) + if (not pricelist or (pricelist and not request.website.is_pricelist_available(pricelist.id))): + return request.redirect("%s?code_not_available=1" % redirect) request.website.sale_get_order(code=promo) return request.redirect(redirect) @@ -703,6 +705,8 @@ class WebsiteSale(http.Controller): if mode[1] == 'billing': order.partner_id = partner_id order.onchange_partner_id() + # This is the *only* thing that the front end user will see/edit anyway when choosing billing address + order.partner_invoice_id = partner_id if not kw.get('use_same'): kw['callback'] = kw.get('callback') or \ (not order.only_services and (mode[0] == 'edit' and '/shop/checkout' or '/shop/address')) diff --git a/addons/website_sale/i18n/km.po b/addons/website_sale/i18n/km.po index fe07bf80fee..bb5672725ba 100644 --- a/addons/website_sale/i18n/km.po +++ b/addons/website_sale/i18n/km.po @@ -579,7 +579,7 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:website_sale.confirmation #: model_terms:ir.ui.view,arch_db:website_sale.payment msgid "Billing" -msgstr "" +msgstr "ការចេញវិក្កយបត្រ" #. module: website_sale #: model_terms:ir.ui.view,arch_db:website_sale.checkout @@ -1150,7 +1150,7 @@ msgstr "" #. module: website_sale #: model:ir.model.fields,field_description:website_sale.field_product_template__product_image_ids msgid "Images" -msgstr "" +msgstr "រូបភាព" #. module: website_sale #: model:ir.model.fields,help:website_sale.field_res_config_settings__module_website_sale_stock @@ -1182,7 +1182,7 @@ msgstr "វិកិយប័ត្រ" #: model:ir.model.fields,field_description:website_sale.field_res_config_settings__module_account #: model_terms:ir.ui.view,arch_db:website_sale.res_config_settings_view_form msgid "Invoicing" -msgstr "" +msgstr "វិយបត្រ" #. module: website_sale #: model_terms:ir.ui.view,arch_db:website_sale.res_config_settings_view_form @@ -1910,7 +1910,7 @@ msgstr "" #. module: website_sale #: model:ir.model,name:website_sale.model_crm_team msgid "Sales Channels" -msgstr "" +msgstr "លក់" #. module: website_sale #: model:ir.model,name:website_sale.model_sale_order_line @@ -1935,7 +1935,7 @@ msgstr "" #: model:ir.model.fields,field_description:website_sale.field_website__salesteam_id #: model_terms:ir.ui.view,arch_db:website_sale.res_config_settings_view_form msgid "Sales Team" -msgstr "" +msgstr "ក្រុមលក់" #. module: website_sale #: model:ir.model.fields,field_description:website_sale.field_res_config_settings__salesperson_id diff --git a/addons/website_sale/security/website_sale.xml b/addons/website_sale/security/website_sale.xml index b859c0e2d05..39bb153ca1b 100644 --- a/addons/website_sale/security/website_sale.xml +++ b/addons/website_sale/security/website_sale.xml @@ -23,6 +23,8 @@ <field name="perm_unlink" eval="False"/> </record> + <!-- TODO: remove in master --> + <!-- TODO: remove in master --> <record id="sales_team.group_sale_manager" model="res.groups"> <field name="implied_ids" eval="[(4, ref('website.group_website_publisher'))]"/> </record> diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index 095011a969f..cebc6c5c897 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -402,6 +402,7 @@ </button> <div class="collapse d-lg-block" id="wsale_products_attributes_collapse"> <form class="js_attributes mb-2" method="get"> + <input t-if="category" type="hidden" name="category" t-att-value="category.id" /> <input type="hidden" name="search" t-att-value="search" /> <ul class="nav nav-pills flex-column"> <t t-foreach="attributes" t-as="a"> diff --git a/addons/website_sale_delivery/i18n/ar.po b/addons/website_sale_delivery/i18n/ar.po index 9def04011b8..0f3b96d3c88 100644 --- a/addons/website_sale_delivery/i18n/ar.po +++ b/addons/website_sale_delivery/i18n/ar.po @@ -36,6 +36,8 @@ msgid "" " This description will be copied to every Sales Order, Delivery Order and " "Customer Invoice/Credit Note" msgstr "" +"وصف المنتج الذي تود إرفاقه لعملائك. سيتم نسخ هذا الوصف وإضافته لكل أمر بيع، " +"وأمر تسليم، والفواتير أو أوامر الخصم الموجهة للعميل" #. module: website_sale_delivery #: model_terms:ir.ui.view,arch_db:website_sale_delivery.payment_delivery @@ -50,7 +52,7 @@ msgstr "دولة" #. module: website_sale_delivery #: model_terms:ir.ui.view,arch_db:website_sale_delivery.res_config_settings_view_form msgid "DHL Delivery Methods" -msgstr "" +msgstr "طرق تسليم DHL" #. module: website_sale_delivery #: model:ir.model.fields,field_description:website_sale_delivery.field_sale_order__amount_delivery diff --git a/addons/website_sale_stock/i18n/ar.po b/addons/website_sale_stock/i18n/ar.po index 40556c120bc..b7bf1917992 100644 --- a/addons/website_sale_stock/i18n/ar.po +++ b/addons/website_sale_stock/i18n/ar.po @@ -3,20 +3,21 @@ # * website_sale_stock # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # Mohammed Albasha <m.albasha.ma@gmail.com>, 2018 # Ghaith Gammar <g.gammar@saharaifs.net>, 2018 # Waleed Mohsen <mohsen.waleed@gmail.com>, 2018 # Martin Trigaux, 2018 # Ali Alrehawi <alrehawi@hotmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-21 13:18+0000\n" -"PO-Revision-Date: 2018-09-21 13:18+0000\n" -"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:35+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -28,30 +29,30 @@ msgstr "" #: model_terms:ir.ui.view,arch_db:website_sale_stock.website_sale_stock_cart_lines #: model_terms:ir.ui.view,arch_db:website_sale_stock.website_sale_stock_payment msgid "<strong>Warning!</strong>" -msgstr "" +msgstr "<strong>تحذير!</strong>" #. module: website_sale_stock #: model:ir.model.fields,help:website_sale_stock.field_product_product__inventory_availability #: model:ir.model.fields,help:website_sale_stock.field_product_template__inventory_availability msgid "Adds an inventory availability status on the web product page." -msgstr "" +msgstr "يضيف مؤشر لحالة توافر المخزون في صفحة المنتج على الموقع." #. module: website_sale_stock #: model_terms:ir.ui.view,arch_db:website_sale_stock.product_template_form_view_inherit_website_sale_stock msgid "Availability" -msgstr "متاح" +msgstr "التوافر" #. module: website_sale_stock #: model:ir.model.fields,field_description:website_sale_stock.field_product_product__available_threshold #: model:ir.model.fields,field_description:website_sale_stock.field_product_template__available_threshold #: model:ir.model.fields,field_description:website_sale_stock.field_res_config_settings__available_threshold msgid "Availability Threshold" -msgstr "" +msgstr "حد التوافر" #. module: website_sale_stock #: model:ir.model.fields,field_description:website_sale_stock.field_product_product__cart_qty msgid "Cart Qty" -msgstr "" +msgstr "الكمية الموجودة في عربة التسوق" #. module: website_sale_stock #: model:ir.model,name:website_sale_stock.model_res_config_settings @@ -62,12 +63,12 @@ msgstr "ضبط الإعدادات" #: model:ir.model.fields,field_description:website_sale_stock.field_product_product__custom_message #: model:ir.model.fields,field_description:website_sale_stock.field_product_template__custom_message msgid "Custom Message" -msgstr "" +msgstr "رسالة مخصصة" #. module: website_sale_stock #: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form msgid "Default Mode" -msgstr "" +msgstr "الوضع الافتراضي" #. module: website_sale_stock #: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form @@ -75,18 +76,20 @@ msgid "" "Default availability mode set on newly created storable products. This can " "be changed at the product level." msgstr "" +"وضع التوافر الافتراضي للمنتجات المخزّنة المنشأة حديثًا. يمكن تغييره في مستوى" +" المنتج." #. module: website_sale_stock #: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form msgid "Default threshold" -msgstr "" +msgstr "الحد الافتراضي" #. module: website_sale_stock #. openerp-web #: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:16 #, python-format msgid "In stock" -msgstr "" +msgstr "في المخزون" #. module: website_sale_stock #: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form @@ -98,14 +101,14 @@ msgstr "مخزون" #: model:ir.model.fields,field_description:website_sale_stock.field_product_template__inventory_availability #: model:ir.model.fields,field_description:website_sale_stock.field_res_config_settings__inventory_availability msgid "Inventory Availability" -msgstr "" +msgstr "توافر المخزون" #. module: website_sale_stock #: model_terms:ir.ui.view,arch_db:website_sale_stock.res_config_settings_view_form msgid "" "Manage the inventory of your products and display their availability status " "on the website." -msgstr "" +msgstr "إدارة مخزون منتجاتك وعرض حالة توافرهم على الموقع." #. module: website_sale_stock #: model:ir.model,name:website_sale_stock.model_product_product @@ -125,31 +128,32 @@ msgstr "أمر البيع" #. module: website_sale_stock #: model:ir.model,name:website_sale_stock.model_sale_order_line msgid "Sales Order Line" -msgstr "سطر أمر المبيعات" +msgstr "بند أمر البيع" #. module: website_sale_stock #: selection:product.template,inventory_availability:0 #: selection:res.config.settings,inventory_availability:0 msgid "Sell regardless of inventory" -msgstr "" +msgstr "البيع بغض النظر عن المخزون" #. module: website_sale_stock #: selection:product.template,inventory_availability:0 #: selection:res.config.settings,inventory_availability:0 msgid "Show inventory below a threshold and prevent sales if not enough stock" msgstr "" +"عرض المخزون تحت حدٍ معين على الموقع ومنع البيع إن لم يكن المخزون كافيًا" #. module: website_sale_stock #: selection:product.template,inventory_availability:0 #: selection:res.config.settings,inventory_availability:0 msgid "Show inventory on website and prevent sales if not enough stock" -msgstr "" +msgstr "عرض المخزون على الموقع ومنع البيع إن لم يكن المخزون كافيًا" #. module: website_sale_stock #: selection:product.template,inventory_availability:0 #: selection:res.config.settings,inventory_availability:0 msgid "Show product-specific notifications" -msgstr "" +msgstr "عرض إشعارات حسب المنتج" #. module: website_sale_stock #: code:addons/website_sale_stock/models/sale_order.py:30 @@ -158,13 +162,14 @@ msgid "" "Some products became unavailable and your cart has been updated. We're sorry" " for the inconvenience." msgstr "" +"بعض المنتجات لم تعد متاحة، لذا قمنا بتحديث عربة تسوقكم. نعتذر على الإزعاج." #. module: website_sale_stock #. openerp-web #: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:22 #, python-format msgid "Temporarily out of stock" -msgstr "" +msgstr "نفذت الكمية مؤقتًا" #. module: website_sale_stock #: model:ir.model,name:website_sale_stock.model_stock_picking @@ -192,20 +197,20 @@ msgstr "الموقع الإلكتروني" #. module: website_sale_stock #: model:ir.model.fields,help:website_sale_stock.field_stock_picking__website_id msgid "Website this picking belongs to." -msgstr "" +msgstr "الموقع الذي تنتمي إليه عملية الاستلام هذه." #. module: website_sale_stock #. openerp-web #: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:19 #, python-format msgid "You already added" -msgstr "" +msgstr "قمت بالفعل بإضافة" #. module: website_sale_stock #: code:addons/website_sale_stock/models/sale_order.py:27 #, python-format msgid "You ask for %s products but only %s is available" -msgstr "" +msgstr "لقد طلبت كمية %s من المنتج لكن المتوفر هو %s فقط" #. module: website_sale_stock #. openerp-web @@ -220,11 +225,11 @@ msgstr "الكل" #: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:14 #, python-format msgid "available" -msgstr "" +msgstr "متاح" #. module: website_sale_stock #. openerp-web #: code:addons/website_sale_stock/static/src/xml/website_sale_stock_product_availability.xml:20 #, python-format msgid "in your cart." -msgstr "" +msgstr "في عربة تسوقك." diff --git a/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss b/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss index 36a173dc255..ce306a53b21 100644 --- a/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss +++ b/addons/website_slides/static/src/scss/slides_slide_fullscreen.scss @@ -1,7 +1,7 @@ .o_wslides_fs_main { @include o-position-absolute(0,0,0,0); - z-index: 2000; + z-index: $zindex-dropdown - 1; background-image: linear-gradient(120deg, $o-wslides-color-dark2, $o-wslides-color-dark3); .o_wslides_slide_fs_header { diff --git a/addons/website_twitter/i18n/ar.po b/addons/website_twitter/i18n/ar.po index 4633ebb8ddc..d1e7eb965d5 100644 --- a/addons/website_twitter/i18n/ar.po +++ b/addons/website_twitter/i18n/ar.po @@ -3,21 +3,21 @@ # * website_twitter # # Translators: -# Mustafa Rawi <mustafa@cubexco.com>, 2018 # Mustafa J. Kadhem <safi2266@gmail.com>, 2018 # Akram Alfusayal <akram_ma@hotmail.com>, 2018 # amrnegm <amrnegm.01@gmail.com>, 2018 # hoxhe Aits <hoxhe0@gmail.com>, 2018 -# Osoul <baruni@osoul.ly>, 2018 # Osama Ahmaro <osamaahmaro@gmail.com>, 2018 # Ali Alrehawi <alrehawi@hotmail.com>, 2018 +# Mustafa Rawi <mustafa@cubexco.com>, 2019 +# msgid "" msgstr "" "Project-Id-Version: Odoo Server saas~11.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-09-21 13:18+0000\n" -"PO-Revision-Date: 2018-09-21 13:18+0000\n" -"Last-Translator: Ali Alrehawi <alrehawi@hotmail.com>, 2018\n" +"PO-Revision-Date: 2018-08-24 09:35+0000\n" +"Last-Translator: Mustafa Rawi <mustafa@cubexco.com>, 2019\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" @@ -31,6 +31,8 @@ msgid "" "<i class=\"fa fa-arrow-right\"/>\n" " Show me how to obtain the Twitter API key and Twitter API secret" msgstr "" +"<i class=\"fa fa-arrow-right\"/>\n" +" أريني كيفية الحصول على مفتاح واجهة برمجة تطبيق تويتر ورمزها السري" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form @@ -38,38 +40,40 @@ msgid "" "<span class=\"o_form_label\">Twitter Roller</span>\n" " <span class=\"fa fa-lg fa-globe\" title=\"Values set here are website-specific.\" groups=\"website.group_multi_website\"/>" msgstr "" +"<span class=\"o_form_label\">Twitter Roller</span>\n" +" <span class=\"fa fa-lg fa-globe\" title=\"القيم التي تعين هنا تحدد حسب الموقع.\" groups=\"website.group_multi_website\"/>" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "<strong>Callback URL: </strong>Leave blank" -msgstr "" +msgstr "<strong>رابط العودة: </strong>يُترك فارغًا" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "<strong>Description: </strong> Odoo Twitter Integration" -msgstr "" +msgstr "<strong>الوصف: </strong> ربط أودو بتويتر" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "<strong>Name: </strong> Odoo Twitter Integration" -msgstr "" +msgstr "<strong>الاسم: </strong> ربط أودو بتويتر" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "<strong>Website: </strong>" -msgstr "" +msgstr "<strong>الموقع: </strong>" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_api_key #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "API Key" -msgstr "API Key" +msgstr "مفتاح واجهة برمجة التطبيق" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_api_secret #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "API secret" -msgstr "" +msgstr "الرمز السري لواجهة برمجة التطبيق" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form @@ -77,6 +81,7 @@ msgid "" "Accept terms of use and click on the Create your Twitter application button " "at the bottom" msgstr "" +"قم بقبول شروط الاستخدام واضغط على زر إنشاء تطبيقك على تويتر الموجود بالأسفل" #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:16 @@ -85,6 +90,8 @@ msgid "" "Authentication credentials were missing or incorrect. Maybe screen name " "tweets are protected." msgstr "" +"بيانات الاعتماد المطلوبة للمصادقة مفقودة أو غير صحيحة. قد تكون التغريدات " +"محمية." #. module: website_twitter #: model:ir.model,name:website_twitter.model_res_config_settings @@ -97,11 +104,13 @@ msgid "" "Copy/Paste Consumer Key (API Key) and Consumer Secret (API Secret) keys " "below." msgstr "" +"قم بنسخ ولصق مفتاح المستهلك (مفتاح واجهة برمجة التطبيق) والرمز السري من " +"الأسفل." #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "Create a new Twitter application on" -msgstr "إنشاء تطبيق تويتر جديد على " +msgstr "إنشاء تطبيق تويتر جديد على" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__create_uid @@ -116,29 +125,29 @@ msgstr "أنشئ في" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__display_name msgid "Display Name" -msgstr "اسم العرض" +msgstr "الاسم المعروض" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_screen_name #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "Favorites From" -msgstr "" +msgstr "المفضلات من" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website__twitter_screen_name msgid "Get favorites from this screen name" -msgstr "الحصول على مفضلات إسم الظهور هذا" +msgstr "الحصول على مفضلات اسم الظهور هذا" #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:48 #, python-format msgid "HTTP Error: Something is misconfigured" -msgstr "" +msgstr "خطأ HTTP: هناك مشكلة في الإعدادات" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "How to configure the Twitter API access" -msgstr "كيفية إعداد وصول مفتاح واجهة برمجة التطبيق لتويتر" +msgstr "كيفية إعداد وصول مفتاح واجهة برمجة تطبيق تويتر" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__id @@ -149,7 +158,7 @@ msgstr "المعرف" #: code:addons/website_twitter/models/res_config_settings.py:59 #, python-format msgid "Internet connection refused" -msgstr "" +msgstr "الاتصال بالإنترنت مرفوض" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet____last_update @@ -171,7 +180,7 @@ msgstr "آخر تحديث في" #: code:addons/website_twitter/models/res_config_settings.py:62 #, python-format msgid "Please double-check your Twitter API Key and Secret!" -msgstr "" +msgstr "برجاء مراجعة مفتاح واجهة برمجة تطبيق تويتر ورمزها السري!" #. module: website_twitter #: code:addons/website_twitter/controllers/main.py:27 @@ -180,7 +189,7 @@ msgid "" "Please set a Twitter screen name to load favorites from, in the Website " "Settings (it does not have to be yours)" msgstr "" -"الرجاء وضع إسم ظهور لتحميل مفضلاته في إعدادات موقع الإنترنت (ليس بالضرورة أن" +"الرجاء وضع اسم ظهور لتحميل مفضلاته في إعدادات موقع الإنترنت (ليس بالضرورة أن" " يكون اسم خاص بك)" #. module: website_twitter @@ -188,7 +197,8 @@ msgstr "" #, python-format msgid "Please set the Twitter API Key and Secret in the Website Settings." msgstr "" -"الرجاء وضع مفتاح واجهة برمجة التطبيق والسر لتويتر في إعدادات موقع الانترنت." +"برجاء وضع مفتاح واجهة برمجة تطبيق تويتر ورمزها السري في إعدادات موقع " +"الانترنت." #. module: website_twitter #. openerp-web @@ -203,12 +213,12 @@ msgstr "إعادة تحميل" msgid "" "Request cannot be served due to the applications rate limit having been " "exhausted for the resource." -msgstr "" +msgstr "لا يمكن تنفيذ الطلب نظرًا لاستنفاد حد معدل التطبيقات للمورد." #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__screen_name msgid "Screen Name" -msgstr "الاسم الذي سيظهر" +msgstr "اسم الظهور" #. module: website_twitter #: model:ir.model.fields,help:website_twitter.field_res_config_settings__twitter_screen_name @@ -216,13 +226,13 @@ msgid "" "Screen Name of the Twitter Account from which you want to load favorites.It " "does not have to match the API Key/Secret." msgstr "" -"إسم الظهور لحساب تويتر الذي تريد تحميل مفضلاته لا يتطابق مع مفتاح واجهة " -"برمجة التطبق / السر" +"اسم ظهور حساب تويتر الذي تريد تحميل مفضلاته لا يتطابق مع مفتاح واجهة برمجة " +"تطبيق تويتر أو الرمز السري لها." #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "Switch to the API Keys tab: <br/>" -msgstr "" +msgstr "الانتقال لتبويب مفاتيح واجهة برمجة التطبيق: <br/>" #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:21 @@ -230,6 +240,7 @@ msgstr "" msgid "" "The Twitter servers are up, but overloaded with requests. Try again later." msgstr "" +"سيرفرات تويتر تعمل، لكنها محملة بالكثير من الطلبات. حاول مرة أخرى لاحقًا." #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:22 @@ -238,6 +249,8 @@ msgid "" "The Twitter servers are up, but the request could not be serviced due to " "some failure within our stack. Try again later." msgstr "" +"سيرفرات تويتر تعمل، لكن تعذّر تنفيذ الطلب بسبب مشكلة في بياناتنا. حاول مرة " +"أخرى لاحقًا." #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:17 @@ -246,6 +259,8 @@ msgid "" "The request is understood, but it has been refused or access is not allowed." " Please check your Twitter API Key and Secret." msgstr "" +"تم فهم الطلب، لكن تم رفضه أو قد يكون الوصول ممنوع. برجاء التحقق من كلمة سر " +"واجهة برمجة تطبيق تويتر ورمزها السري." #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:15 @@ -254,12 +269,14 @@ msgid "" "The request was invalid or cannot be otherwise served. Requests without " "authentication are considered invalid and will yield this response." msgstr "" +"الطلب غير صالح أو مستحيل التنفيذ. تعتبر الطلبات غير صالحة إذا لم تتم " +"المُصادقة عليها وينتج عنها هذه الرسالة." #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:14 #, python-format msgid "There was no new data to return." -msgstr "" +msgstr "لا توجد بيانات حديثة لإعادتها." #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website_twitter_tweet__tweet_id @@ -274,37 +291,40 @@ msgstr "تغريدات" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "Twitter API Credentials" -msgstr "" +msgstr "بيانات اعتماد واجهة برمجة تطبيق تويتر" #. module: website_twitter #: model:ir.model.fields,help:website_twitter.field_website__twitter_api_key msgid "Twitter API Key" -msgstr "واجهة برمجة التطبيق لتويتر" +msgstr "واجهة برمجة تطبيق تويتر" #. module: website_twitter #: model:ir.model.fields,help:website_twitter.field_website__twitter_api_secret msgid "Twitter API Secret" -msgstr "سر واجهة برمجة التطبيق لتويتر" +msgstr "الرمز السري لواجهة برمجة تطبيق تويتر" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website__twitter_api_key msgid "Twitter API key" -msgstr "واجهة برمجة التطبيق لتويتر" +msgstr "مفتاح واجهة برمجة تطبيق تويتر" #. module: website_twitter #: model:ir.model.fields,help:website_twitter.field_res_config_settings__twitter_api_key msgid "Twitter API key you can get it from https://apps.twitter.com/" msgstr "" +"يمكنك الحصول على مفتاح واجهة برمجة تطبيق تويتر من https://apps.twitter.com/" #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_website__twitter_api_secret msgid "Twitter API secret" -msgstr "سر واجهة برمجة التطبيق لتويتر" +msgstr "الرمز السري لواجهة برمجة تطبيق تويتر" #. module: website_twitter #: model:ir.model.fields,help:website_twitter.field_res_config_settings__twitter_api_secret msgid "Twitter API secret you can get it from https://apps.twitter.com/" msgstr "" +"يمكنك الحصول على الرمز السري لواجهة برمجة تطبيق تويتر من " +"https://apps.twitter.com/" #. module: website_twitter #. openerp-web @@ -323,7 +343,7 @@ msgstr "خطأ مصادقة تويتر!" #: code:addons/website_twitter/models/res_config_settings.py:20 #, python-format msgid "Twitter is down or being upgraded." -msgstr "" +msgstr "تويتر معطل أو جاري تحديثه." #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:19 @@ -332,16 +352,18 @@ msgid "" "Twitter seems broken. Please retry later. You may consider posting an issue " "on Twitter forums to get help." msgstr "" +"يبدو أن تويتر معطل. برجاء المحاولة مرة أخرى لاحقًا. ربما عليك كتابة منشور عن" +" مشكلتك على منتديات تويتر للحصول على المساعدة." #. module: website_twitter #: model:ir.model.fields,field_description:website_twitter.field_res_config_settings__twitter_server_uri msgid "Twitter server uri" -msgstr "" +msgstr "سيرفر uri الخاص بتويتر" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "Twitter tutorial" -msgstr "" +msgstr "درس تدريبي عن تويتر" #. module: website_twitter #: code:addons/website_twitter/controllers/main.py:37 @@ -351,28 +373,28 @@ msgid "" " or choose a different screen name." msgstr "" "مستخدم تويتر @%(username)s لديه أقل من 12 تغريدة مفضلة. الرجاء إضافة المزيد " -"أو إختيار إسم ظهور مختلف." +"أو إختيار اسم ظهور مختلف." #. module: website_twitter #. openerp-web #: code:addons/website_twitter/static/src/xml/website.twitter.xml:6 #, python-format msgid "Twitter's user" -msgstr "" +msgstr "مستخدم تويتر" #. module: website_twitter #: model:ir.actions.server,name:website_twitter.ir_cron_twitter_actions_ir_actions_server #: model:ir.cron,cron_name:website_twitter.ir_cron_twitter_actions #: model:ir.cron,name:website_twitter.ir_cron_twitter_actions msgid "Twitter: Fetch new favorites" -msgstr "" +msgstr "تويتر: البحث عن مفضلات جديدة" #. module: website_twitter #: code:addons/website_twitter/models/res_config_settings.py:58 #: code:addons/website_twitter/models/res_config_settings.py:59 #, python-format msgid "We failed to reach a twitter server." -msgstr "" +msgstr "تعذّر الوصول لسيرفر تويتر." #. module: website_twitter #: model:ir.model,name:website_twitter.model_website @@ -383,12 +405,7 @@ msgstr "الموقع الإلكتروني" #. module: website_twitter #: model:ir.model,name:website_twitter.model_website_twitter_tweet msgid "Website Twitter" -msgstr "" - -#. module: website_twitter -#: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form -msgid "api_key.png" -msgstr "" +msgstr "موقع تويتر" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form @@ -398,4 +415,4 @@ msgstr "https://apps.twitter.com/app/new" #. module: website_twitter #: model_terms:ir.ui.view,arch_db:website_twitter.res_config_settings_view_form msgid "with the following values:" -msgstr "مع القيم التالية:" +msgstr "بالقيم التالية:" |
