| Component | Approved | Translated | Unreviewed | Unfinished | Unfinished words | Unfinished characters | Untranslated | Checks | Suggestions | Comments | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| attachment_indexation BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| auth_ldap BSD-2-Clause | 0% | 79% | 35 | 9 | 40 | 306 | 9 | 1 | 0 | 0 | |
| auth_oauth BSD-2-Clause | 0% | 84% | 38 | 7 | 33 | 185 | 7 | 1 | 0 | 0 | |
| auth_passkey BSD-2-Clause | 0% | 87% | 35 | 5 | 24 | 213 | 5 | 0 | 0 | 0 | |
| auth_passkey_portal BSD-2-Clause | 0% | 80% | 8 | 2 | 5 | 24 | 2 | 0 | 0 | 0 | |
| auth_password_policy BSD-2-Clause | 0% | 87% | 14 | 2 | 2 | 10 | 2 | 0 | 0 | 0 | |
| auth_password_policy_portal BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| auth_password_policy_signup BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| auth_signup BSD-2-Clause | 0% | 76% | 67 | 21 | 477 | 5,032 | 21 | 4 | 0 | 0 | |
| auth_timeout BSD-2-Clause | 0% | 34% | 13 | 25 | 122 | 882 | 25 | 0 | 0 | 0 | |
| auth_totp BSD-2-Clause | 0% | 72% | 48 | 18 | 116 | 1,017 | 18 | 0 | 0 | 0 | |
| auth_totp_mail BSD-2-Clause | 0% | 79% | 38 | 10 | 63 | 493 | 10 | 0 | 0 | 0 | |
| auth_totp_portal BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| automobile BSD-2-Clause | 0% | 31% | 19 | 42 | 727 | 4,717 | 42 | 1 | 0 | 0 | |
| bakery BSD-2-Clause | 0% | 99% | 108 | 1 | 12 | 70 | 1 | 0 | 0 | 0 | |
| bar_industry BSD-2-Clause | 0% | 90% | 89 | 9 | 67 | 395 | 9 | 3 | 0 | 0 | |
| barcodes BSD-2-Clause | 0% | 96% | 53 | 2 | 11 | 82 | 2 | 0 | 0 | 0 | |
| barcodes_gs1_nomenclature BSD-2-Clause | 0% | 95% | 38 | 2 | 73 | 483 | 2 | 0 | 0 | 0 | |
| base BSD-2-Clause | 0% | 51% | 3,356 | 3,133 | 38,402 | 276,417 | 3,133 | 59 | 0 | 0 | |
| base_address_extended BSD-2-Clause | 0% | 90% | 30 | 3 | 19 | 99 | 3 | 0 | 0 | 0 | |
| base_automation BSD-2-Clause | 0% | 63% | 108 | 62 | 433 | 2,649 | 62 | 0 | 0 | 0 | |
| base_automation_hr BSD-2-Clause | 0% | 100% | 5 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| base_geolocalize BSD-2-Clause | 0% | 97% | 36 | 1 | 6 | 52 | 1 | 1 | 0 | 0 | |
| base_import BSD-2-Clause | 0% | 96% | 145 | 6 | 54 | 332 | 6 | 2 | 0 | 0 | |
| base_import_module BSD-2-Clause | 0% | 69% | 36 | 16 | 136 | 884 | 16 | 0 | 0 | 0 | |
| base_industry_data BSD-2-Clause | 0% | 73% | 11 | 4 | 18 | 107 | 4 | 0 | 0 | 0 | |
| base_install_request BSD-2-Clause | 0% | 28 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| base_setup BSD-2-Clause | 0% | 91% | 92 | 9 | 53 | 350 | 9 | 0 | 0 | 0 | |
| base_sparse_field BSD-2-Clause | 0% | 96% | 24 | 1 | 1 | 5 | 1 | 1 | 0 | 0 | |
| base_vat BSD-2-Clause | 0% | 71% | 28 | 11 | 87 | 607 | 11 | 0 | 0 | 0 | |
| beverage_distributor BSD-2-Clause | 0% | 44% | 105 | 130 | 1,440 | 9,916 | 130 | 4 | 0 | 0 | |
| bike_leasing BSD-2-Clause | 0% | 97% | 82 | 2 | 13 | 75 | 2 | 2 | 0 | 0 | |
| bike_shop BSD-2-Clause | 0% | 23% | 76 | 251 | 2,643 | 24,542 | 251 | 0 | 0 | 0 | |
| billboard_rental BSD-2-Clause | 0% | 38% | 56 | 90 | 944 | 6,291 | 90 | 1 | 0 | 0 | |
| board BSD-2-Clause | 0% | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| booking_engine BSD-2-Clause | 0% | 18% | 36 | 157 | 458 | 2,853 | 157 | 0 | 0 | 0 | |
| bookstore BSD-2-Clause | 0% | 94% | 138 | 8 | 136 | 1,150 | 8 | 4 | 0 | 0 | |
| bowling BSD-2-Clause | 0% | 44% | 55 | 68 | 801 | 8,307 | 68 | 4 | 0 | 0 | |
| bus BSD-2-Clause | 0% | 82% | 24 | 5 | 25 | 158 | 5 | 0 | 0 | 0 | |
| cake_shop BSD-2-Clause | 0% | 99% | 111 | 1 | 12 | 70 | 1 | 2 | 0 | 0 | |
| calendar BSD-2-Clause | 1% | 83% | 366 | 71 | 384 | 2,856 | 71 | 2 | 0 | 0 | |
| calendar_sms BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| campsite BSD-2-Clause | 0% | 9% | 23 | 230 | 2,883 | 19,187 | 230 | 0 | 0 | 0 | |
| candy_shop BSD-2-Clause | 0% | 16% | 31 | 160 | 1,619 | 12,593 | 160 | 0 | 0 | 0 | |
| carpenter BSD-2-Clause | 0% | 17% | 26 | 126 | 1,767 | 12,526 | 126 | 0 | 0 | 0 | |
| catering BSD-2-Clause | 0% | 0% | 0 | 304 | 3,043 | 22,239 | 304 | 0 | 0 | 0 | |
| certificate BSD-2-Clause | 0% | 77% | 66 | 19 | 136 | 877 | 19 | 0 | 0 | 0 | |
| certification_organism BSD-2-Clause | 0% | 40% | 67 | 97 | 856 | 6,948 | 97 | 2 | 0 | 0 | |
| cleaning_services BSD-2-Clause | 0% | 24% | 36 | 110 | 1,135 | 8,062 | 110 | 0 | 0 | 0 | |
| climbing_gym BSD-2-Clause | 0% | 20% | 48 | 189 | 2,102 | 14,439 | 189 | 0 | 0 | 0 | |
| clothing_boutique BSD-2-Clause | 0% | 92% | 131 | 10 | 152 | 1,225 | 10 | 13 | 0 | 0 | |
| cloud_storage BSD-2-Clause | 0% | 50% | 12 | 12 | 98 | 618 | 12 | 0 | 0 | 0 | |
| cloud_storage_azure BSD-2-Clause | 0% | 62% | 10 | 6 | 53 | 325 | 6 | 0 | 0 | 0 | |
| cloud_storage_google BSD-2-Clause | 0% | 64% | 9 | 5 | 47 | 271 | 5 | 0 | 0 | 0 | |
| cloud_storage_migration BSD-2-Clause | 0% | 0% | 0 | 47 | 286 | 1,921 | 47 | 0 | 0 | 0 | |
| coal_petroleum BSD-2-Clause | 0% | 28% | 26 | 65 | 722 | 6,012 | 65 | 1 | 0 | 0 | |
| concert_halls BSD-2-Clause | 0% | 20% | 57 | 215 | 2,173 | 17,700 | 215 | 1 | 0 | 0 | |
| condominium BSD-2-Clause | 0% | 12% | 72 | 526 | 3,745 | 27,702 | 526 | 2 | 0 | 0 | |
| construction BSD-2-Clause | 0% | 6% | 25 | 370 | 3,461 | 26,529 | 370 | 0 | 0 | 0 | |
| construction_developer BSD-2-Clause | 0% | 0% | 0 | 168 | 659 | 4,375 | 168 | 0 | 0 | 0 | |
| contacts BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| corporate_gifts BSD-2-Clause | 0% | 30% | 47 | 108 | 1,043 | 8,524 | 108 | 1 | 0 | 0 | |
| cosmetics_store BSD-2-Clause | 0% | 17% | 37 | 170 | 1,978 | 14,323 | 170 | 1 | 0 | 0 | |
| coworking BSD-2-Clause | 0% | 17% | 48 | 220 | 2,400 | 20,410 | 220 | 0 | 0 | 0 | |
| crm BSD-2-Clause | 0% | 83% | 614 | 123 | 753 | 5,107 | 123 | 9 | 0 | 0 | |
| crm_enterprise BSD-2-Clause | 0% | 53% | 14 | 12 | 80 | 484 | 12 | 0 | 0 | 0 | |
| crm_helpdesk BSD-2-Clause | 0% | 92% | 36 | 3 | 9 | 48 | 3 | 0 | 0 | 0 | |
| crm_iap_enrich BSD-2-Clause | 0% | 19 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| crm_iap_mine BSD-2-Clause | 0% | 95% | 140 | 6 | 38 | 401 | 6 | 0 | 0 | 0 | |
| crm_livechat BSD-2-Clause | 0% | 67% | 23 | 11 | 72 | 440 | 11 | 0 | 0 | 0 | |
| crm_mail_plugin BSD-2-Clause | 0% | 20% | 2 | 8 | 31 | 259 | 8 | 0 | 0 | 0 | |
| crm_sale_project BSD-2-Clause | 0% | 0% | 0 | 16 | 43 | 329 | 16 | 0 | 0 | 0 | |
| crm_sale_subscription BSD-2-Clause | 0% | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| crm_sms BSD-2-Clause | 0% | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| currency_rate_live BSD-2-Clause | 0% | 90% | 45 | 5 | 20 | 116 | 5 | 0 | 0 | 0 | |
| custom_furniture BSD-2-Clause | 0% | 46% | 87 | 101 | 1,725 | 12,726 | 101 | 3 | 0 | 0 | |
| data_cleaning BSD-2-Clause | 0% | 95% | 162 | 7 | 58 | 313 | 7 | 0 | 0 | 0 | |
| data_merge_crm BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| data_merge_helpdesk BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| data_merge_project BSD-2-Clause | 0% | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| data_merge_stock_account BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| data_merge_utm BSD-2-Clause | 0% | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| data_recycle BSD-2-Clause | 0% | 98% | 65 | 1 | 3 | 15 | 1 | 0 | 0 | 0 | |
| databases BSD-2-Clause | 0% | 39% | 50 | 78 | 442 | 3,065 | 78 | 0 | 0 | 0 | |
| delivery BSD-2-Clause | 0% | 78% | 145 | 40 | 423 | 2,607 | 40 | 4 | 0 | 0 | |
| delivery_bpost BSD-2-Clause | 0% | 88% | 59 | 8 | 25 | 177 | 8 | 0 | 0 | 0 | |
| delivery_dhl BSD-2-Clause | 0% | 96% | 102 | 4 | 15 | 103 | 4 | 0 | 0 | 0 | |
| delivery_dhl_rest BSD-2-Clause | 0% | 81% | 84 | 19 | 171 | 1,097 | 19 | 0 | 0 | 0 | |
| delivery_easypost BSD-2-Clause | 0% | 82% | 68 | 14 | 65 | 401 | 14 | 0 | 0 | 0 | |
| delivery_envia BSD-2-Clause | 0% | 22% | 29 | 102 | 980 | 6,017 | 102 | 0 | 0 | 0 | |
| delivery_fedex BSD-2-Clause | 0% | 92% | 104 | 8 | 36 | 237 | 8 | 2 | 0 | 0 | |
| delivery_fedex_rest BSD-2-Clause | 0% | 45% | 64 | 76 | 514 | 3,523 | 76 | 0 | 0 | 0 | |
| delivery_iot BSD-2-Clause | 0% | 78% | 26 | 7 | 50 | 298 | 7 | 0 | 0 | 0 | |
| delivery_mondialrelay BSD-2-Clause | 0% | 89% | 17 | 2 | 6 | 47 | 2 | 0 | 0 | 0 | |
| delivery_sendcloud BSD-2-Clause | 0% | 54% | 62 | 52 | 504 | 3,193 | 52 | 0 | 0 | 0 | |
| delivery_shiprocket BSD-2-Clause | 0% | 28% | 28 | 70 | 448 | 3,041 | 70 | 0 | 0 | 0 | |
| delivery_starshipit BSD-2-Clause | 0% | 27% | 23 | 62 | 599 | 4,070 | 62 | 0 | 0 | 0 | |
| delivery_stock_picking_batch BSD-2-Clause | 0% | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| delivery_ups BSD-2-Clause | 0% | 93% | 115 | 8 | 28 | 180 | 8 | 0 | 0 | 0 | |
| delivery_ups_rest BSD-2-Clause | 0% | 64% | 68 | 37 | 226 | 1,344 | 37 | 0 | 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>