| Component | Approved | Translated | Unreviewed | Unfinished | Unfinished words | Unfinished characters | Untranslated | Checks | Suggestions | Comments | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| delivery_usps BSD-2-Clause | 0% | 93% | 81 | 6 | 23 | 158 | 6 | 0 | 0 | 0 | |
| delivery_usps_rest BSD-2-Clause | 0% | 35% | 53 | 98 | 497 | 2,832 | 98 | 0 | 0 | 0 | |
| deposit_management BSD-2-Clause | 0% | 0% | 0 | 36 | 131 | 827 | 36 | 0 | 0 | 0 | |
| digest BSD-2-Clause | 0% | 85% | 91 | 16 | 73 | 401 | 16 | 0 | 0 | 0 | |
| digest_enterprise BSD-2-Clause | 0% | 80% | 4 | 1 | 7 | 40 | 1 | 0 | 0 | 0 | |
| diy_workshops BSD-2-Clause | 0% | 15% | 37 | 195 | 2,255 | 16,407 | 195 | 2 | 0 | 0 | |
| documents BSD-2-Clause | 0% | 64% | 488 | 270 | 2,180 | 21,523 | 270 | 7 | 0 | 0 | |
| documents_account BSD-2-Clause | 0% | 65% | 71 | 37 | 239 | 1,492 | 37 | 0 | 0 | 0 | |
| documents_account_peppol BSD-2-Clause | 0% | 54% | 6 | 5 | 12 | 79 | 5 | 0 | 0 | 0 | |
| documents_approvals BSD-2-Clause | 0% | 68% | 13 | 6 | 14 | 112 | 6 | 0 | 0 | 0 | |
| documents_fleet BSD-2-Clause | 0% | 85% | 18 | 3 | 6 | 40 | 3 | 0 | 0 | 0 | |
| documents_hr BSD-2-Clause | 0% | 64% | 24 | 13 | 91 | 578 | 13 | 0 | 0 | 0 | |
| documents_hr_expense BSD-2-Clause | 0% | 66% | 8 | 4 | 30 | 162 | 4 | 0 | 0 | 0 | |
| documents_hr_holidays BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| documents_hr_payroll BSD-2-Clause | 0% | 42% | 27 | 36 | 207 | 1,475 | 36 | 1 | 0 | 0 | |
| documents_hr_recruitment BSD-2-Clause | 0% | 0% | 0 | 30 | 70 | 498 | 30 | 0 | 0 | 0 | |
| documents_hr_sign BSD-2-Clause | 0% | 0% | 0 | 6 | 22 | 124 | 6 | 0 | 0 | 0 | |
| documents_product BSD-2-Clause | 0% | 86% | 19 | 3 | 6 | 43 | 3 | 0 | 0 | 0 | |
| documents_project BSD-2-Clause | 0% | 33% | 10 | 20 | 256 | 1,561 | 20 | 0 | 0 | 0 | |
| documents_project_sale BSD-2-Clause | 0% | 75% | 9 | 3 | 6 | 57 | 3 | 0 | 0 | 0 | |
| documents_sign BSD-2-Clause | 0% | 47% | 16 | 18 | 95 | 555 | 18 | 0 | 0 | 0 | |
| documents_spreadsheet BSD-2-Clause | 0% | 50% | 60 | 59 | 342 | 2,084 | 59 | 0 | 0 | 0 | |
| documents_spreadsheet_sign BSD-2-Clause | 0% | 0% | 0 | 15 | 48 | 280 | 15 | 0 | 0 | 0 | |
| documents_spreadsheet_survey BSD-2-Clause | 0% | 43% | 7 | 9 | 24 | 147 | 9 | 0 | 0 | 0 | |
| driving_school BSD-2-Clause | 0% | 21% | 60 | 213 | 2,170 | 14,462 | 213 | 1 | 0 | 0 | |
| dropshipping BSD-2-Clause | 0% | 28% | 53 | 133 | 1,021 | 8,080 | 133 | 0 | 0 | 0 | |
| elearning_platform BSD-2-Clause | 0% | 10% | 36 | 321 | 4,756 | 32,566 | 321 | 1 | 0 | 0 | |
| electrician BSD-2-Clause | 0% | 36% | 43 | 74 | 509 | 3,586 | 74 | 0 | 0 | 0 | |
| electronic_store BSD-2-Clause | 0% | 30% | 53 | 120 | 908 | 7,598 | 120 | 1 | 0 | 0 | |
| environmental_agency BSD-2-Clause | 0% | 32% | 58 | 118 | 1,395 | 11,252 | 118 | 0 | 0 | 0 | |
| equity BSD-2-Clause | 0% | 28% | 93 | 233 | 1,784 | 12,846 | 233 | 0 | 0 | 0 | |
| escape_rooms BSD-2-Clause | 0% | 24% | 50 | 155 | 1,703 | 12,811 | 155 | 0 | 0 | 0 | |
| esg BSD-2-Clause | 0% | 27% | 100 | 264 | 1,192 | 8,307 | 264 | 0 | 0 | 0 | |
| esg_csrd BSD-2-Clause | 0% | 0% | 0 | 307 | 1,445 | 10,911 | 307 | 0 | 0 | 0 | |
| esg_csrd_ai BSD-2-Clause | 0% | 0% | 0 | 57 | 200 | 1,248 | 57 | 0 | 0 | 0 | |
| esg_csrd_hr BSD-2-Clause | 0% | 0% | 0 | 19 | 67 | 701 | 19 | 0 | 0 | 0 | |
| esg_csrd_hr_fleet BSD-2-Clause | 0% | 0% | 0 | 3 | 4 | 18 | 3 | 0 | 0 | 0 | |
| esg_hr BSD-2-Clause | 0% | 57% | 16 | 12 | 50 | 314 | 12 | 0 | 0 | 0 | |
| esg_hr_fleet BSD-2-Clause | 0% | 38% | 14 | 22 | 154 | 1,039 | 22 | 0 | 0 | 0 | |
| esg_project BSD-2-Clause | 0% | 23% | 7 | 23 | 87 | 710 | 23 | 0 | 0 | 0 | |
| event BSD-2-Clause | 0% | 74% | 489 | 166 | 3,927 | 63,405 | 166 | 3 | 0 | 0 | |
| event_booth BSD-2-Clause | 0% | 99% | 120 | 1 | 2 | 14 | 1 | 0 | 0 | 0 | |
| event_booth_sale BSD-2-Clause | 0% | 90% | 59 | 6 | 89 | 672 | 6 | 1 | 0 | 0 | |
| event_crm BSD-2-Clause | 0% | 84% | 79 | 15 | 135 | 836 | 15 | 1 | 0 | 0 | |
| event_crm_sale BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| event_enterprise BSD-2-Clause | 0% | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| event_iot BSD-2-Clause | 0% | 15% | 7 | 37 | 67 | 814 | 37 | 0 | 0 | 0 | |
| event_management BSD-2-Clause | 0% | 54% | 221 | 188 | 1,800 | 12,713 | 188 | 3 | 0 | 0 | |
| event_product BSD-2-Clause | 0% | 63% | 21 | 12 | 72 | 433 | 12 | 0 | 0 | 0 | |
| event_sale BSD-2-Clause | 0% | 83% | 92 | 18 | 184 | 1,193 | 18 | 0 | 0 | 0 | |
| event_sms BSD-2-Clause | 0% | 100% | 13 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| event_social BSD-2-Clause | 0% | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| excise_management BSD-2-Clause | 0% | 15% | 14 | 79 | 182 | 1,146 | 79 | 0 | 0 | 0 | |
| eyewear_shop BSD-2-Clause | 0% | 20% | 83 | 313 | 2,011 | 15,062 | 313 | 0 | 0 | 0 | |
| fast_food BSD-2-Clause | 0% | 71% | 74 | 29 | 543 | 3,813 | 29 | 1 | 0 | 0 | |
| fitness BSD-2-Clause | 0% | 52% | 94 | 85 | 1,363 | 9,645 | 85 | 2 | 0 | 0 | |
| fleet BSD-2-Clause | 0% | 84% | 411 | 73 | 405 | 2,635 | 73 | 4 | 0 | 0 | |
| florist BSD-2-Clause | 0% | 42% | 67 | 92 | 1,143 | 9,017 | 92 | 1 | 0 | 0 | |
| fmcg_store BSD-2-Clause | 0% | 15% | 16 | 85 | 741 | 4,520 | 85 | 1 | 0 | 0 | |
| food_distribution BSD-2-Clause | 0% | 16% | 24 | 120 | 1,918 | 12,938 | 120 | 0 | 0 | 0 | |
| food_trucks BSD-2-Clause | 0% | 100% | 57 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| frontdesk BSD-2-Clause | 0% | 44% | 100 | 124 | 582 | 3,496 | 124 | 1 | 0 | 0 | |
| furniture_store BSD-2-Clause | 0% | 18% | 42 | 184 | 1,799 | 19,102 | 184 | 0 | 0 | 0 | |
| gallery BSD-2-Clause | 0% | 14% | 37 | 222 | 2,393 | 18,334 | 222 | 0 | 0 | 0 | |
| gamification BSD-2-Clause | 0% | 93% | 389 | 25 | 412 | 4,464 | 25 | 7 | 0 | 0 | |
| gamification_sale_crm BSD-2-Clause | 0% | 17 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| gardening BSD-2-Clause | 0% | 29% | 35 | 84 | 1,135 | 11,545 | 84 | 1 | 0 | 0 | |
| google_account BSD-2-Clause | 0% | 100% | 5 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| google_address_autocomplete BSD-2-Clause | 0% | 56% | 9 | 7 | 25 | 154 | 7 | 0 | 0 | 0 | |
| google_calendar BSD-2-Clause | 0% | 90% | 63 | 7 | 97 | 594 | 7 | 1 | 0 | 0 | |
| google_gmail BSD-2-Clause | 0% | 75% | 33 | 11 | 97 | 615 | 11 | 0 | 0 | 0 | |
| google_recaptcha BSD-2-Clause | 0% | 68% | 15 | 7 | 48 | 306 | 7 | 0 | 0 | 0 | |
| guest_house BSD-2-Clause | 0% | 11% | 25 | 198 | 2,453 | 15,914 | 198 | 0 | 0 | 0 | |
| guided_tours BSD-2-Clause | 0% | 17% | 35 | 168 | 2,160 | 15,407 | 168 | 0 | 0 | 0 | |
| hair_salon BSD-2-Clause | 0% | 29% | 39 | 93 | 925 | 6,907 | 93 | 0 | 0 | 0 | |
| handyman BSD-2-Clause | 0% | 36% | 44 | 76 | 530 | 3,676 | 76 | 0 | 0 | 0 | |
| hardware_shop BSD-2-Clause | 0% | 43% | 45 | 59 | 859 | 5,580 | 59 | 1 | 0 | 0 | |
| headhunter BSD-2-Clause | 0% | 43% | 96 | 125 | 1,872 | 15,198 | 125 | 1 | 0 | 0 | |
| helpdesk BSD-2-Clause | 0% | 87% | 542 | 79 | 709 | 5,375 | 79 | 6 | 0 | 0 | |
| helpdesk_account BSD-2-Clause | 9% | 95% | 19 | 1 | 9 | 53 | 1 | 0 | 0 | 0 | |
| helpdesk_holidays BSD-2-Clause | 0% | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| helpdesk_mail_plugin BSD-2-Clause | 0% | 62% | 5 | 3 | 5 | 25 | 3 | 0 | 0 | 0 | |
| helpdesk_planning_field_service BSD-2-Clause | 0% | 0% | 0 | 14 | 27 | 208 | 14 | 0 | 0 | 0 | |
| helpdesk_planning_field_service_sale_timesheet BSD-2-Clause | 0% | 0% | 0 | 4 | 8 | 44 | 4 | 0 | 0 | 0 | |
| helpdesk_repair BSD-2-Clause | 0% | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| helpdesk_sale BSD-2-Clause | 0% | 12 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| helpdesk_sale_loyalty BSD-2-Clause | 0% | 75% | 27 | 9 | 52 | 355 | 9 | 0 | 0 | 0 | |
| helpdesk_sale_timesheet BSD-2-Clause | 0% | 81% | 40 | 9 | 49 | 294 | 9 | 0 | 0 | 0 | |
| helpdesk_sms BSD-2-Clause | 0% | 88% | 8 | 1 | 3 | 15 | 1 | 0 | 0 | 0 | |
| helpdesk_stock BSD-2-Clause | 0% | 82% | 32 | 7 | 38 | 371 | 7 | 0 | 0 | 0 | |
| helpdesk_stock_account BSD-2-Clause | 12% | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| helpdesk_timesheet BSD-2-Clause | 0% | 91% | 44 | 4 | 19 | 126 | 4 | 0 | 0 | 0 | |
| holiday_house BSD-2-Clause | 0% | 17% | 36 | 172 | 2,184 | 14,047 | 172 | 0 | 0 | 0 | |
| hotel BSD-2-Clause | 0% | 12% | 31 | 225 | 2,868 | 20,326 | 225 | 0 | 0 | 0 | |
| hr BSD-2-Clause | 0% | 51% | 499 | 472 | 2,736 | 20,001 | 472 | 7 | 0 | 0 | |
| hr_appraisal BSD-2-Clause | 0% | 48% | 241 | 251 | 2,148 | 18,908 | 251 | 1 | 0 | 0 | |
| hr_appraisal_skills BSD-2-Clause | 0% | 62% | 48 | 29 | 112 | 732 | 29 | 0 | 0 | 0 | |
| hr_appraisal_survey BSD-2-Clause | 0% | 73% | 129 | 46 | 464 | 3,832 | 46 | 3 | 0 | 0 | |
| hr_attendance BSD-2-Clause | 0% | 47% | 196 | 221 | 1,087 | 6,936 | 221 | 0 | 0 | 0 | |
| hr_attendance_gantt BSD-2-Clause | 0% | 90% | 9 | 1 | 1 | 8 | 1 | 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>