| Component | Approved | Translated | Unreviewed | Unfinished | Unfinished words | Unfinished characters | Untranslated | Checks | Suggestions | Comments | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3pl_logistic_company BSD-2-Clause | 0% | 15% | 44 | 235 | 2,582 | 22,231 | 235 | 0 | 0 | 0 | |
| account BSD-2-Clause | 1% | 84% | 2,744 | 502 | 4,712 | 49,185 | 502 | 36 | 0 | 0 | |
| account_3way_match BSD-2-Clause | 0% | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_accountant BSD-2-Clause | 1% | 77% | 362 | 105 | 594 | 4,298 | 105 | 3 | 0 | 0 | |
| account_accountant_check_printing BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_accountant_fleet BSD-2-Clause | 0% | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_asset BSD-2-Clause | 0% | 77% | 290 | 85 | 707 | 4,878 | 85 | 2 | 0 | 0 | |
| account_asset_fleet BSD-2-Clause | 0% | 70% | 7 | 3 | 30 | 155 | 3 | 0 | 0 | 0 | |
| account_avatax BSD-2-Clause | 0% | 99% | 112 | 1 | 4 | 29 | 1 | 2 | 0 | 0 | |
| account_avatax_geolocalize BSD-2-Clause | 0% | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_avatax_sale BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_avatax_stock BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_bank_statement_extract BSD-2-Clause | 0% | 93% | 43 | 3 | 5 | 39 | 3 | 0 | 0 | 0 | |
| account_bank_statement_import BSD-2-Clause | 0% | 87% | 27 | 4 | 48 | 292 | 4 | 1 | 0 | 0 | |
| account_bank_statement_import_camt BSD-2-Clause | 1% | 316 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_bank_statement_import_csv BSD-2-Clause | 0% | 75% | 9 | 3 | 7 | 56 | 3 | 0 | 0 | 0 | |
| account_bank_statement_import_ofx BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_bank_statement_import_qif BSD-2-Clause | 0% | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_base_import BSD-2-Clause | 0% | 94% | 73 | 4 | 24 | 197 | 4 | 1 | 0 | 0 | |
| account_batch_payment BSD-2-Clause | 0% | 90% | 154 | 17 | 75 | 432 | 17 | 3 | 0 | 0 | |
| account_budget BSD-2-Clause | 0% | 97% | 121 | 3 | 13 | 84 | 3 | 1 | 0 | 0 | |
| account_budget_purchase BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_check_printing BSD-2-Clause | 0% | 88% | 60 | 8 | 162 | 1,006 | 8 | 1 | 0 | 0 | |
| account_debit_note BSD-2-Clause | 0% | 97% | 33 | 1 | 1 | 15 | 1 | 2 | 0 | 0 | |
| account_edi BSD-2-Clause | 0% | 98% | 72 | 1 | 5 | 36 | 1 | 0 | 0 | 0 | |
| account_edi_proxy_client BSD-2-Clause | 0% | 85% | 30 | 5 | 84 | 444 | 5 | 0 | 0 | 0 | |
| account_edi_ubl_cii BSD-2-Clause | 0% | 75% | 232 | 74 | 768 | 4,450 | 74 | 2 | 0 | 0 | |
| account_external_tax BSD-2-Clause | 0% | 100% | 9 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| account_fiscal_categories BSD-2-Clause | 0% | 57% | 23 | 17 | 61 | 390 | 17 | 0 | 0 | 0 | |
| account_fiscal_categories_fleet BSD-2-Clause | 0% | 69% | 16 | 7 | 31 | 213 | 7 | 0 | 0 | 0 | |
| account_fleet BSD-2-Clause | 0% | 75% | 21 | 7 | 55 | 404 | 7 | 0 | 0 | 0 | |
| account_followup BSD-2-Clause | 0% | 92% | 144 | 12 | 235 | 3,071 | 12 | 0 | 0 | 0 | |
| account_inter_company_rules BSD-2-Clause | 0% | 85% | 18 | 3 | 7 | 45 | 3 | 0 | 0 | 0 | |
| account_intrastat BSD-2-Clause | 0% | 81% | 117 | 27 | 134 | 925 | 27 | 1 | 0 | 0 | |
| account_invoice_extract BSD-2-Clause | 0% | 90% | 56 | 6 | 27 | 160 | 6 | 0 | 0 | 0 | |
| account_invoice_extract_purchase BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_iso20022 BSD-2-Clause | 0% | 70% | 62 | 26 | 132 | 835 | 26 | 6 | 0 | 0 | |
| account_loans BSD-2-Clause | 0% | 93% | 163 | 12 | 87 | 565 | 12 | 2 | 0 | 0 | |
| account_loans_extract BSD-2-Clause | 0% | 0% | 0 | 41 | 112 | 734 | 41 | 0 | 0 | 0 | |
| account_online_payment BSD-2-Clause | 0% | 54% | 25 | 21 | 496 | 7,265 | 21 | 0 | 0 | 0 | |
| account_online_synchronization BSD-2-Clause | 0% | 90% | 199 | 20 | 108 | 743 | 20 | 8 | 0 | 0 | |
| account_payment BSD-2-Clause | 0% | 93% | 120 | 9 | 49 | 305 | 9 | 5 | 0 | 0 | |
| account_peppol BSD-2-Clause | 0% | 40% | 134 | 196 | 2,010 | 12,516 | 196 | 2 | 0 | 0 | |
| account_pos_settle_due BSD-2-Clause | 0% | 0% | 0 | 8 | 40 | 238 | 8 | 0 | 0 | 0 | |
| account_qr_code_emv BSD-2-Clause | 0% | 88% | 16 | 2 | 5 | 30 | 2 | 0 | 0 | 0 | |
| account_qr_code_sepa BSD-2-Clause | 0% | 87% | 7 | 1 | 2 | 12 | 1 | 0 | 0 | 0 | |
| account_reports BSD-2-Clause | 1% | 63% | 740 | 420 | 2,757 | 19,921 | 420 | 7 | 0 | 0 | |
| account_reports_cash_basis BSD-2-Clause | 0% | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_saft BSD-2-Clause | 0% | 89% | 17 | 2 | 11 | 75 | 2 | 0 | 0 | 0 | |
| account_saft_import BSD-2-Clause | 0% | 21 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_sepa_direct_debit BSD-2-Clause | 0% | 95% | 266 | 14 | 190 | 1,869 | 14 | 4 | 0 | 0 | |
| account_tax_python BSD-2-Clause | 0% | 57% | 11 | 8 | 48 | 306 | 8 | 1 | 0 | 0 | |
| account_transfer BSD-2-Clause | 0% | 82% | 60 | 13 | 120 | 762 | 13 | 0 | 0 | 0 | |
| account_update_tax_tags BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_winbooks_import BSD-2-Clause | 0% | 97% | 35 | 1 | 1 | 7 | 1 | 0 | 0 | 0 | |
| accountant BSD-2-Clause | 0% | 85% | 6 | 1 | 3 | 20 | 1 | 0 | 0 | 0 | |
| accountant_fleet BSD-2-Clause | 0% | 33% | 1 | 2 | 24 | 158 | 2 | 0 | 0 | 0 | |
| accountant_hr_expense BSD-2-Clause | 0% | 0% | 0 | 2 | 17 | 131 | 2 | 0 | 0 | 0 | |
| accountant_knowledge BSD-2-Clause | 0% | 40% | 36 | 53 | 179 | 1,264 | 53 | 0 | 0 | 0 | |
| accounting_firm BSD-2-Clause | 0% | 20% | 52 | 208 | 2,402 | 15,117 | 208 | 0 | 0 | 0 | |
| agriculture_shop BSD-2-Clause | 0% | 37% | 96 | 157 | 1,635 | 14,160 | 157 | 1 | 0 | 0 | |
| ai BSD-2-Clause | 0% | 22% | 68 | 240 | 3,055 | 22,610 | 240 | 0 | 0 | 0 | |
| ai_app BSD-2-Clause | 0% | 34% | 18 | 34 | 188 | 1,247 | 34 | 0 | 0 | 0 | |
| ai_calendar BSD-2-Clause | 0% | 0% | 0 | 1 | 62 | 385 | 1 | 0 | 0 | 0 | |
| ai_crm BSD-2-Clause | 0% | 50% | 4 | 4 | 92 | 550 | 4 | 0 | 0 | 0 | |
| ai_crm_livechat BSD-2-Clause | 0% | 75% | 6 | 2 | 7 | 38 | 2 | 0 | 0 | 0 | |
| ai_documents BSD-2-Clause | 0% | 27% | 16 | 43 | 258 | 1,585 | 43 | 0 | 0 | 0 | |
| ai_documents_account BSD-2-Clause | 0% | 26% | 6 | 17 | 168 | 1,029 | 17 | 0 | 0 | 0 | |
| ai_documents_fleet BSD-2-Clause | 0% | 0% | 0 | 12 | 74 | 450 | 12 | 0 | 0 | 0 | |
| ai_documents_source BSD-2-Clause | 0% | 55% | 5 | 4 | 22 | 115 | 4 | 0 | 0 | 0 | |
| ai_esg BSD-2-Clause | 0% | 0% | 0 | 29 | 263 | 1,744 | 29 | 0 | 0 | 0 | |
| ai_fields BSD-2-Clause | 0% | 21% | 8 | 29 | 129 | 632 | 29 | 0 | 0 | 0 | |
| ai_helpdesk BSD-2-Clause | 0% | 0% | 0 | 1 | 41 | 293 | 1 | 0 | 0 | 0 | |
| ai_knowledge BSD-2-Clause | 0% | 17% | 5 | 24 | 83 | 530 | 24 | 0 | 0 | 0 | |
| ai_livechat BSD-2-Clause | 0% | 46% | 7 | 8 | 55 | 314 | 8 | 0 | 0 | 0 | |
| ai_mass_mailing BSD-2-Clause | 0% | 0% | 0 | 1 | 103 | 635 | 1 | 0 | 0 | 0 | |
| ai_purchase BSD-2-Clause | 0% | 0% | 0 | 1 | 25 | 190 | 1 | 0 | 0 | 0 | |
| ai_sale BSD-2-Clause | 0% | 0% | 0 | 5 | 299 | 1,908 | 5 | 0 | 0 | 0 | |
| ai_sale_margin BSD-2-Clause | 0% | 0% | 0 | 1 | 42 | 286 | 1 | 0 | 0 | 0 | |
| ai_sale_stock BSD-2-Clause | 0% | 0% | 0 | 1 | 56 | 421 | 1 | 0 | 0 | 0 | |
| ai_server_actions BSD-2-Clause | 0% | 66% | 8 | 4 | 22 | 111 | 4 | 1 | 0 | 0 | |
| ai_stock BSD-2-Clause | 0% | 0% | 0 | 1 | 88 | 582 | 1 | 0 | 0 | 0 | |
| ai_website BSD-2-Clause | 0% | 31% | 7 | 15 | 43 | 277 | 15 | 0 | 0 | 0 | |
| ai_website_livechat BSD-2-Clause | 0% | 53% | 16 | 14 | 48 | 302 | 14 | 0 | 0 | 0 | |
| analytic BSD-2-Clause | 0% | 93% | 152 | 10 | 84 | 452 | 10 | 1 | 0 | 0 | |
| analytic_enterprise BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| api_doc BSD-2-Clause | 0% | 56% | 21 | 16 | 60 | 338 | 16 | 0 | 0 | 0 | |
| appointment BSD-2-Clause | 0% | 75% | 477 | 153 | 2,807 | 34,625 | 153 | 5 | 0 | 0 | |
| appointment_account_payment BSD-2-Clause | 0% | 84% | 76 | 14 | 109 | 943 | 14 | 1 | 0 | 0 | |
| appointment_crm BSD-2-Clause | 0% | 93% | 14 | 1 | 5 | 31 | 1 | 0 | 0 | 0 | |
| appointment_google_calendar BSD-2-Clause | 0% | 75% | 6 | 2 | 77 | 508 | 2 | 0 | 0 | 0 | |
| appointment_google_reserve BSD-2-Clause | 0% | 52% | 40 | 36 | 265 | 1,867 | 36 | 0 | 0 | 0 | |
| appointment_hr BSD-2-Clause | 0% | 66% | 4 | 2 | 3 | 38 | 2 | 0 | 0 | 0 | |
| appointment_hr_recruitment BSD-2-Clause | 0% | 60% | 9 | 6 | 66 | 448 | 6 | 0 | 0 | 0 | |
| appointment_sms BSD-2-Clause | 0% | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| approvals BSD-2-Clause | 0% | 90% | 231 | 24 | 135 | 953 | 24 | 0 | 0 | 0 | |
| approvals_purchase BSD-2-Clause | 0% | 78% | 26 | 7 | 58 | 379 | 7 | 0 | 0 | 0 | |
| approvals_purchase_stock BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| architects BSD-2-Clause | 0% | 35% | 52 | 96 | 950 | 8,344 | 96 | 0 | 0 | 0 | |
| art_craft BSD-2-Clause | 0% | 67% | 123 | 60 | 926 | 7,645 | 60 | 3 | 0 | 0 | |
Summary
| Project website | www.odoo.com | |
|---|---|---|
| Project reviewers41 |
|
|
| Language | Catalan | |
| Language code | ca | |
| Text direction | Left to right | |
| Case sensitivity | Case-sensitive | |
| Number of speakers | 8,218,781 | |
03/13/2026
String statistics
| Strings percent | Hosted strings | Words percent | Hosted words | Characters percent | Hosted characters | |
|---|---|---|---|---|---|---|
| Total | 116,933 | 726,566 | 5,335,089 | |||
| Approved | 1% | 28 | 1% | 3,912 | 1% | 63,115 |
| Waiting for review | 56% | 66,738 | 41% | 299,361 | 38% | 2,069,011 |
| Translated | 57% | 66,766 | 41% | 303,273 | 39% | 2,132,126 |
| Needs editing | 1% | 1 | 1% | 2 | 1% | 12 |
| Read-only | 0% | 0 | 0% | 0 | 0% | 0 |
| Failing checks | 1% | 749 | 1% | 8,311 | 1% | 55,533 |
| Strings with suggestions | 0% | 0 | 0% | 0 | 0% | 0 |
| Untranslated strings | 42% | 50,166 | 58% | 423,291 | 60% | 3,202,951 |
Quick numbers
and previous 30 days
Trends of last 30 days
+100%
Hosted words
—
+100%
Hosted strings
—
+57%
Translated
—
+100%
Contributors
—
|
Translation approved |
|
|
Translation added |
|
|
Translation approved |
|
|
Translation changed |
|
|
Translation approved |
|
|
Translation added |
|
|
Contributor joined |
Contributor joined
03/12/2026
|
|
Translation approved |
|
|
Translation changed |
|
|
Translation approved |
|
<t t-set="is_online" t-value="'appointment_type_id' in object.event_id and object.event_id.appointment_type_id"/>
<t t-set="recurrent" t-value="object.recurrence_id and not ctx.get('calendar_template_ignore_recurrence')"/>
<h1 style="font-size: 18px; font-weight: bold; color: #374151; margin-bottom: 28px;">
Reminder
<img src="/calendar/static/src/img/bell.png" style="border:0; width: 21px; height: 24px; margin-left: 10px; text-decoration:none; vertical-align: bottom;"/>
</h1>
<p style="margin: 0;">
Hello <t t-out="object.common_name or ''">Gemini Furniture</t>,<br/>
<span style="display: block; margin-top: 8px;">This is a reminder for the event below.</span>
</p>
<div style="text-align: center; padding: 16px 0px 16px 0px;">
<a t-attf-href="/calendar/{{ 'recurrence' if recurrent else 'meeting' }}/accept?token={{ object.sudo().access_token }}&id={{ object.event_id.id }}" t-attf-style="display: inline-block; padding: 7px 14px; color: {{object.event_id.user_id.company_id.email_primary_color or '#FFFFFF'}}; text-decoration: none; background-color: {{object.event_id.user_id.company_id.email_secondary_color or '#875A7B'}}; border-radius: 3px;">
Accept</a>
<a t-attf-href="/calendar/{{ 'recurrence' if recurrent else 'meeting' }}/decline?token={{ object.sudo().access_token }}&id={{ object.event_id.id }}" t-attf-style="display: inline-block; margin-left: 6px; padding: 7px 14px; color: {{object.event_id.user_id.company_id.email_primary_color or '#FFFFFF'}}; text-decoration: none; background-color: {{object.event_id.user_id.company_id.email_secondary_color or '#875A7B'}}; border-radius: 3px;">
Decline</a>
<a t-attf-href="/calendar/meeting/view?token={{ object.sudo().access_token }}&id={{ object.event_id.id }}" t-attf-style="display: inline-block; margin-left: 12px; padding: 7px 14px; color: #111827; text-decoration: none; background-color: #E7E9ED; border-radius: 3px;">
View</a>
</div>
<div style="margin: 16px 0 0;">
<h2 t-attf-style="margin-bottom: 12px; font-size: 14px; font-weight: bold; color: {{user.company_id.email_secondary_color or '#875A7B'}};">Details</h2>
<table cellpadding="0" cellspacing="0" border="0" style="font-size: 13px; color: #374151;">
<tr>
<td style="width: 100px; color: #676F7B;">Date & Time</td>
<td style="font-weight: bold;">
<t t-out="format_datetime(dt=object.event_id.start, tz=object.mail_tz if not object.event_id.allday else None, dt_format='EEEE', lang_code=object.env.lang) or ''">Tuesday</t>
<t t-out="format_datetime(dt=object.event_id.start, tz=object.mail_tz if not object.event_id.allday else None, dt_format='d', lang_code=object.env.lang) or ''">4</t>
<t t-out="format_datetime(dt=object.event_id.start, tz=object.mail_tz if not object.event_id.allday else None, dt_format='MMMM y', lang_code=object.env.lang) or ''">May 2021</t>
<t t-if="not object.event_id.allday">
<t t-out="format_time(time=object.event_id.start, tz=object.mail_tz, time_format='short', lang_code=object.env.lang) or ''">11:00 AM</t>
<t t-if="object.mail_tz">
<span style="font-size: 11px; font-weight: normal;">
(<t t-out="object.mail_tz or ''">Europe/Brussels</t>)
</span>
</t>
</t>
</td>
</tr>
<tr t-if="recurrent">
<td style="width: 100px; padding-top: 6px; color: #676F7B;">When</td>
<td style="padding-top: 6px;">
<t t-out="object.recurrence_id.get_recurrence_name() or ''">Every 1 Weeks, for 3 events</t>
</td>
</tr>
<tr t-if="not object.event_id.allday and object.event_id.duration">
<td style="width: 100px; padding-top: 6px; color: #676F7B;">Duration</td>
<td style="padding-top: 6px;">
<t t-out="('%dH%02d' % (object.event_id.duration,round(object.event_id.duration*60)%60)) or ''">0H30</t>
</td>
</tr>
<tr t-if="object.event_id.location">
<td style="width: 100px; padding-top: 6px; color: #676F7B; vertical-align: top;">Location</td>
<td style="padding-top: 6px;">
<t t-out="object.event_id.location or ''">Bruxelles</t>
<a target="_blank" t-if="not is_online or is_online and object.event_id.location != object.event_id.appointment_type_id.location_id.name" t-attf-href="http://maps.google.com/maps?oi=map&q={{object.event_id.location}}" style="margin-left: 12px; font-size: 12px; color: #008f8c; text-decoration: underline;">View Map</a>
</td>
</tr>
<tr t-if="object.event_id.videocall_location">
<td style="width: 100px; padding-top: 6px; color: #676F7B;">
<t t-if="object.get_base_url() in object.event_id.videocall_location">Join with</t>
<t t-else="">Join</t>
</td>
<td style="padding-top: 6px;">
<a t-att-href="object.event_id.videocall_location" target="_blank" style="color: #008f8c;">
<t t-if="object.get_base_url() in object.event_id.videocall_location">Odoo Discuss</t>
<t t-else="">Video meeting</t>
</a>
</td>
</tr>
</table>
</div>
<div style="margin: 32px 0 0;">
<t t-set="max_shown_attendees" t-value="20"/>
<h2 t-attf-style="margin-bottom: 12px; font-size: 14px; font-weight: bold; color: {{user.company_id.email_secondary_color or '#875A7B'}};">Attendees</h2>
<div t-foreach="object.event_id.attendee_ids[:max_shown_attendees]" t-as="attendee" style="margin-bottom: 5px;">
<img t-if="attendee.state" t-attf-src="/calendar/static/src/img/state_{{ attendee.state }}.png" style="border:0; width: 15px; height: 15px; vertical-align: text-bottom;"/>
<t t-if="attendee != object">
<span style="margin-left: 5px;" t-out="attendee.common_name or ''">Mitchell Admin</span>
</t>
<t t-else="">
<span style="margin-left: 5px;">You</span>
</t>
</div>
<div t-if="len(object.event_id.attendee_ids) > max_shown_attendees" style="margin-bottom: 5px;">
... and <t t-out="len(object.event_id.attendee_ids) - max_shown_attendees"/> more
</div>
</div>
<div t-if="not is_html_empty(object.event_id.description)" style="margin: 32px 0 0;">
<h2 t-attf-style="margin-bottom: 12px; font-size: 14px; font-weight: bold; color: {{user.company_id.email_secondary_color or '#875A7B'}};">Description of the event</h2>
<t t-out="object.event_id.description">Internal meeting for discussion for new pricing for product and services.</t>
</div>
<p style="margin: 32px 0 0;">
Thank you!
<t t-if="object.event_id.user_id.signature">
<span style="display: block; margin-top: 8px;"><t t-out="object.event_id.user_id.signature or ''">Mitchell Admin</t></span>
</t>
</p>
</div>
<t t-set="is_online" t-value="'appointment_type_id' in object.event_id and object.event_id.appointment_type_id"/>
<t t-set="recurrent" t-value="object.recurrence_id and not ctx.get('calendar_template_ignore_recurrence')"/>
<h1 style="font-size: 18px; font-weight: bold; color: #374151; margin-bottom: 28px;">
Recordatori
<img src="/calendar/static/src/img/bell.png" style="border:0; width: 21px; height: 24px; margin-left: 10px; text-decoration:none; vertical-align: bottom;"/>
</h1>
<p style="margin: 0;">
Hola, <t t-out="object.common_name or ''">Gemini Furniture</t>:<br/>
<span style="display: block; margin-top: 8px;">Aquest és un recordatori del següent esdeveniment.</span>
</p>
<div style="text-align: center; padding: 16px 0px 16px 0px;">
<a t-attf-href="/calendar/{{ 'recurrence' if recurrent else 'meeting' }}/accept?token={{ object.sudo().access_token }}&id={{ object.event_id.id }}" t-attf-style="display: inline-block; padding: 7px 14px; color: {{object.event_id.user_id.company_id.email_primary_color or '#FFFFFF'}}; text-decoration: none; background-color: {{object.event_id.user_id.company_id.email_secondary_color or '#875A7B'}}; border-radius: 3px;">
Acceptar</a>
<a t-attf-href="/calendar/{{ 'recurrence' if recurrent else 'meeting' }}/decline?token={{ object.sudo().access_token }}&id={{ object.event_id.id }}" t-attf-style="display: inline-block; margin-left: 6px; padding: 7px 14px; color: {{object.event_id.user_id.company_id.email_primary_color or '#FFFFFF'}}; text-decoration: none; background-color: {{object.event_id.user_id.company_id.email_secondary_color or '#875A7B'}}; border-radius: 3px;">
Rebutjar</a>
<a t-attf-href="/calendar/meeting/view?token={{ object.sudo().access_token }}&id={{ object.event_id.id }}" t-attf-style="display: inline-block; margin-left: 12px; padding: 7px 14px; color: #111827; text-decoration: none; background-color: #E7E9ED; border-radius: 3px;">
Veure</a>
</div>
<div style="margin: 16px 0 0;">
<h2 t-attf-style="margin-bottom: 12px; font-size: 14px; font-weight: bold; color: {{user.company_id.email_secondary_color or '#875A7B'}};">Detalls</h2>
<table cellpadding="0" cellspacing="0" border="0" style="font-size: 13px; color: #374151;">
<tr>
<td style="width: 100px; color: #676F7B;">Data i hora</td>
<td style="font-weight: bold;">
<t t-out="format_datetime(dt=object.event_id.start, tz=object.mail_tz if not object.event_id.allday else None, dt_format='EEEE', lang_code=object.env.lang) or ''">dimarts</t>
<t t-out="format_datetime(dt=object.event_id.start, tz=object.mail_tz if not object.event_id.allday else None, dt_format='d', lang_code=object.env.lang) or ''">4</t>
<t t-out="format_datetime(dt=object.event_id.start, tz=object.mail_tz if not object.event_id.allday else None, dt_format='MMMM y', lang_code=object.env.lang) or ''">de maig de 2021</t>
<t t-if="not object.event_id.allday">
<t t-out="format_time(time=object.event_id.start, tz=object.mail_tz, time_format='short', lang_code=object.env.lang) or ''">11:00 h</t>
<t t-if="object.mail_tz">
<span style="font-size: 11px; font-weight: normal;">
(<t t-out="object.mail_tz or ''">Europa/Brussel·les</t>)
</span>
</t>
</t>
</td>
</tr>
<tr t-if="recurrent">
<td style="width: 100px; padding-top: 6px; color: #676F7B;">Quan?</td>
<td style="padding-top: 6px;">
<t t-out="object.recurrence_id.get_recurrence_name() or ''">setmanalment, 3 esdeveniments</t>
</td>
</tr>
<tr t-if="not object.event_id.allday and object.event_id.duration">
<td style="width: 100px; padding-top: 6px; color: #676F7B;">Durada</td>
<td style="padding-top: 6px;">
<t t-out="('%dH%02d' % (object.event_id.duration,round(object.event_id.duration*60)%60)) or ''">0 h 30 min</t>
</td>
</tr>
<tr t-if="object.event_id.location">
<td style="width: 100px; padding-top: 6px; color: #676F7B; vertical-align: top;">Ubicació</td>
<td style="padding-top: 6px;">
<t t-out="object.event_id.location or ''">Brussel·les</t>
<a target="_blank" t-if="not is_online or is_online and object.event_id.location != object.event_id.appointment_type_id.location_id.name" t-attf-href="http://maps.google.com/maps?oi=map&q={{object.event_id.location}}" style="margin-left: 12px; font-size: 12px; color: #008f8c; text-decoration: underline;">Veure al mapa</a>
</td>
</tr>
<tr t-if="object.event_id.videocall_location">
<td style="width: 100px; padding-top: 6px; color: #676F7B;">
<t t-if="object.get_base_url() in object.event_id.videocall_location">Unir-se amb</t>
<t t-else="">Unir-se</t>
</td>
<td style="padding-top: 6px;">
<a t-att-href="object.event_id.videocall_location" target="_blank" style="color: #008f8c;">
<t t-if="object.get_base_url() in object.event_id.videocall_location">Converses d'Odoo</t>
<t t-else="">Videotrucada</t>
</a>
</td>
</tr>
</table>
</div>
<div style="margin: 32px 0 0;">
<t t-set="max_shown_attendees" t-value="20"/>
<h2 t-attf-style="margin-bottom: 12px; font-size: 14px; font-weight: bold; color: {{user.company_id.email_secondary_color or '#875A7B'}};">Participants</h2>
<div t-foreach="object.event_id.attendee_ids[:max_shown_attendees]" t-as="attendee" style="margin-bottom: 5px;">
<img t-if="attendee.state" t-attf-src="/calendar/static/src/img/state_{{ attendee.state }}.png" style="border:0; width: 15px; height: 15px; vertical-align: text-bottom;"/>
<t t-if="attendee != object">
<span style="margin-left: 5px;" t-out="attendee.common_name or ''">Mitchell Admin</span>
</t>
<t t-else="">
<span style="margin-left: 5px;">Vostè</span>
</t>
</div>
<div t-if="len(object.event_id.attendee_ids) > max_shown_attendees" style="margin-bottom: 5px;">
<t t-out="len(object.event_id.attendee_ids) - max_shown_attendees"/> i molt més
</div>
</div>
<div t-if="not is_html_empty(object.event_id.description)" style="margin: 32px 0 0;">
<h2 t-attf-style="margin-bottom: 12px; font-size: 14px; font-weight: bold; color: {{user.company_id.email_secondary_color or '#875A7B'}};">Descripció de l'esdeveniment</h2>
<t t-out="object.event_id.description">Reunió interna per parlar sobre els nous preus dels productes i dels serveis.</t>
</div>
<p style="margin: 32px 0 0;">
Gràcies!
<t t-if="object.event_id.user_id.signature">
<span style="display: block; margin-top: 8px;"><t t-out="object.event_id.user_id.signature or ''">Mitchell Admin</t></span>
</t>
</p>
</div>