| Component | Approved | Translated | Unreviewed | Unfinished | Unfinished words | Unfinished characters | Untranslated | Checks | Suggestions | Comments | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| microsoft_account BSD-2-Clause | 0% | 100% | 9 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| microsoft_calendar BSD-2-Clause | 0% | 84% | 59 | 11 | 129 | 840 | 11 | 1 | 0 | 0 | |
| microsoft_outlook BSD-2-Clause | 0% | 83% | 36 | 7 | 77 | 488 | 7 | 0 | 0 | 0 | |
| mrp BSD-2-Clause | 0% | 88% | 984 | 126 | 1,022 | 7,533 | 126 | 8 | 0 | 0 | |
| mrp_account BSD-2-Clause | 1% | 94% | 95 | 6 | 33 | 206 | 6 | 1 | 0 | 0 | |
| mrp_account_enterprise BSD-2-Clause | 0% | 91% | 41 | 4 | 23 | 162 | 4 | 2 | 0 | 0 | |
| mrp_accountant BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| mrp_iot BSD-2-Clause | 0% | 0% | 0 | 47 | 87 | 536 | 47 | 0 | 0 | 0 | |
| mrp_landed_costs BSD-2-Clause | 0% | 50% | 4 | 4 | 7 | 48 | 4 | 0 | 0 | 0 | |
| mrp_maintenance BSD-2-Clause | 0% | 85% | 86 | 15 | 191 | 1,189 | 15 | 0 | 0 | 0 | |
| mrp_mps BSD-2-Clause | 0% | 66% | 121 | 62 | 360 | 2,432 | 62 | 1 | 0 | 0 | |
| mrp_plm BSD-2-Clause | 0% | 92% | 303 | 24 | 83 | 533 | 24 | 1 | 0 | 0 | |
| mrp_product_expiry BSD-2-Clause | 0% | 70% | 7 | 3 | 18 | 95 | 3 | 0 | 0 | 0 | |
| mrp_repair BSD-2-Clause | 0% | 63% | 7 | 4 | 12 | 69 | 4 | 0 | 0 | 0 | |
| mrp_subcontracting BSD-2-Clause | 0% | 85% | 82 | 14 | 69 | 495 | 14 | 0 | 0 | 0 | |
| mrp_subcontracting_account BSD-2-Clause | 0% | 40% | 2 | 3 | 5 | 24 | 3 | 0 | 0 | 0 | |
| mrp_subcontracting_account_enterprise BSD-2-Clause | 0% | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| mrp_subcontracting_dropshipping BSD-2-Clause | 0% | 75% | 12 | 4 | 11 | 67 | 4 | 0 | 0 | 0 | |
| mrp_subcontracting_purchase BSD-2-Clause | 0% | 73% | 17 | 6 | 16 | 117 | 6 | 0 | 0 | 0 | |
| mrp_subcontracting_quality BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| mrp_workorder BSD-2-Clause | 0% | 65% | 223 | 120 | 600 | 3,831 | 120 | 3 | 0 | 0 | |
| mrp_workorder_hr_account BSD-2-Clause | 0% | 15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| mrp_workorder_plm BSD-2-Clause | 0% | 80% | 17 | 4 | 18 | 114 | 4 | 1 | 0 | 0 | |
| museum BSD-2-Clause | 0% | 16% | 57 | 286 | 3,069 | 21,946 | 286 | 0 | 0 | 0 | |
| night_clubs BSD-2-Clause | 0% | 13% | 31 | 206 | 1,760 | 13,978 | 206 | 0 | 0 | 0 | |
| non_profit_organization BSD-2-Clause | 0% | 29% | 157 | 384 | 3,559 | 33,095 | 384 | 1 | 0 | 0 | |
| Glossary Odoo Main Glossary | 0% | 66% | 26 | 13 | 20 | 122 | 13 | 0 | 0 | 0 | |
| odoo_partner BSD-2-Clause | 0% | 91% | 105 | 10 | 144 | 1,254 | 10 | 2 | 0 | 0 | |
| onboarding BSD-2-Clause | 0% | 81% | 58 | 13 | 69 | 395 | 13 | 1 | 0 | 0 | |
| outdoor_activities BSD-2-Clause | 0% | 21% | 51 | 184 | 2,824 | 23,124 | 184 | 0 | 0 | 0 | |
| partner_autocomplete BSD-2-Clause | 0% | 76% | 16 | 5 | 16 | 103 | 5 | 0 | 0 | 0 | |
| partner_commission BSD-2-Clause | 0% | 92% | 72 | 6 | 36 | 275 | 6 | 1 | 0 | 0 | |
| partnership BSD-2-Clause | 0% | 2% | 1 | 43 | 149 | 915 | 43 | 0 | 0 | 0 | |
| payment BSD-2-Clause | 0% | 37% | 223 | 368 | 1,395 | 9,133 | 368 | 3 | 0 | 0 | |
| payment_adyen BSD-2-Clause | 0% | 60% | 23 | 15 | 116 | 705 | 15 | 0 | 0 | 0 | |
| payment_aps BSD-2-Clause | 0% | 47% | 9 | 10 | 44 | 287 | 10 | 0 | 0 | 0 | |
| payment_asiapay BSD-2-Clause | 0% | 83% | 25 | 5 | 13 | 96 | 5 | 0 | 0 | 0 | |
| payment_authorize BSD-2-Clause | 0% | 73% | 30 | 11 | 66 | 481 | 11 | 0 | 0 | 0 | |
| payment_buckaroo BSD-2-Clause | 0% | 80% | 12 | 3 | 7 | 38 | 3 | 0 | 0 | 0 | |
| payment_custom BSD-2-Clause | 0% | 76% | 16 | 5 | 23 | 148 | 5 | 0 | 0 | 0 | |
| payment_demo BSD-2-Clause | 0% | 48% | 25 | 27 | 112 | 806 | 27 | 0 | 0 | 0 | |
| payment_dpo BSD-2-Clause | 0% | 7% | 1 | 12 | 30 | 177 | 12 | 0 | 0 | 0 | |
| payment_flutterwave BSD-2-Clause | 0% | 73% | 14 | 5 | 31 | 187 | 5 | 0 | 0 | 0 | |
| payment_iyzico BSD-2-Clause | 0% | 71% | 10 | 4 | 14 | 82 | 4 | 0 | 0 | 0 | |
| payment_mercado_pago BSD-2-Clause | 0% | 35% | 19 | 34 | 342 | 2,120 | 34 | 0 | 0 | 0 | |
| payment_mollie BSD-2-Clause | 0% | 83% | 10 | 2 | 20 | 117 | 2 | 0 | 0 | 0 | |
| payment_nuvei BSD-2-Clause | 0% | 65% | 13 | 7 | 42 | 283 | 7 | 0 | 0 | 0 | |
| payment_paymob BSD-2-Clause | 0% | 0% | 0 | 29 | 141 | 868 | 29 | 0 | 0 | 0 | |
| payment_paypal BSD-2-Clause | 0% | 63% | 19 | 11 | 57 | 333 | 11 | 0 | 0 | 0 | |
| payment_razorpay BSD-2-Clause | 0% | 42% | 20 | 27 | 189 | 1,262 | 27 | 0 | 0 | 0 | |
| payment_redsys BSD-2-Clause | 0% | 6% | 1 | 14 | 35 | 227 | 14 | 0 | 0 | 0 | |
| payment_sepa_direct_debit BSD-2-Clause | 2% | 78% | 35 | 10 | 85 | 580 | 10 | 0 | 0 | 0 | |
| payment_stripe BSD-2-Clause | 0% | 77% | 31 | 9 | 82 | 509 | 9 | 0 | 0 | 0 | |
| payment_toss_payments BSD-2-Clause | 0% | 0% | 0 | 18 | 59 | 377 | 18 | 0 | 0 | 0 | |
| payment_worldline BSD-2-Clause | 0% | 52% | 11 | 10 | 39 | 305 | 10 | 0 | 0 | 0 | |
| payment_xendit BSD-2-Clause | 0% | 70% | 21 | 9 | 18 | 103 | 9 | 0 | 0 | 0 | |
| personal_trainer BSD-2-Clause | 0% | 34% | 26 | 50 | 452 | 3,207 | 50 | 0 | 0 | 0 | |
| pharmacy_retail BSD-2-Clause | 0% | 15% | 21 | 112 | 1,005 | 7,792 | 112 | 5 | 0 | 0 | |
| phone_validation BSD-2-Clause | 0% | 87% | 55 | 8 | 71 | 432 | 8 | 0 | 0 | 0 | |
| photography BSD-2-Clause | 0% | 29% | 49 | 119 | 1,640 | 11,996 | 119 | 2 | 0 | 0 | |
| physical_therapy BSD-2-Clause | 0% | 0% | 0 | 94 | 1,288 | 9,652 | 94 | 0 | 0 | 0 | |
| planning BSD-2-Clause | 0% | 62% | 252 | 150 | 1,767 | 18,714 | 150 | 1 | 0 | 0 | |
| planning_attendance BSD-2-Clause | 0% | 68% | 15 | 7 | 25 | 167 | 7 | 0 | 0 | 0 | |
| planning_field_service BSD-2-Clause | 0% | 0% | 0 | 155 | 777 | 6,828 | 155 | 0 | 0 | 0 | |
| planning_field_service_repair BSD-2-Clause | 0% | 0% | 0 | 3 | 5 | 24 | 3 | 0 | 0 | 0 | |
| planning_field_service_sale_stock BSD-2-Clause | 0% | 0% | 0 | 36 | 137 | 957 | 36 | 0 | 0 | 0 | |
| planning_field_service_sale_subscription BSD-2-Clause | 0% | 0% | 0 | 3 | 5 | 28 | 3 | 0 | 0 | 0 | |
| planning_field_service_sale_timesheet BSD-2-Clause | 0% | 0% | 0 | 72 | 334 | 2,554 | 72 | 0 | 0 | 0 | |
| planning_field_service_sale_worksheet BSD-2-Clause | 0% | 0% | 0 | 8 | 18 | 121 | 8 | 0 | 0 | 0 | |
| planning_field_service_sms BSD-2-Clause | 0% | 0% | 0 | 4 | 106 | 1,271 | 4 | 0 | 0 | 0 | |
| planning_field_service_worksheet BSD-2-Clause | 0% | 0% | 0 | 15 | 71 | 508 | 15 | 0 | 0 | 0 | |
| planning_holidays BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| planning_hr_skills BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| point_of_sale BSD-2-Clause | 1% | 73% | 1,315 | 481 | 2,731 | 16,648 | 481 | 24 | 0 | 0 | |
| portal BSD-2-Clause | 0% | 77% | 187 | 54 | 321 | 2,423 | 54 | 7 | 0 | 0 | |
| portal_address_extended BSD-2-Clause | 0% | 0% | 0 | 7 | 10 | 56 | 7 | 0 | 0 | 0 | |
| portal_rating BSD-2-Clause | 0% | 76% | 26 | 8 | 22 | 141 | 8 | 0 | 0 | 0 | |
| pos_account_tax_python BSD-2-Clause | 0% | 0% | 0 | 3 | 4 | 17 | 3 | 0 | 0 | 0 | |
| pos_adyen BSD-2-Clause | 0% | 65% | 21 | 11 | 49 | 288 | 11 | 0 | 0 | 0 | |
| pos_appointment BSD-2-Clause | 0% | 69% | 39 | 17 | 46 | 252 | 17 | 0 | 0 | 0 | |
| pos_avatax BSD-2-Clause | 0% | 83% | 10 | 2 | 25 | 140 | 2 | 1 | 0 | 0 | |
| pos_discount BSD-2-Clause | 0% | 63% | 14 | 8 | 25 | 171 | 8 | 1 | 0 | 0 | |
| pos_dpopay BSD-2-Clause | 0% | 0% | 0 | 44 | 274 | 1,706 | 44 | 0 | 0 | 0 | |
| pos_edi_ubl BSD-2-Clause | 0% | 0% | 0 | 3 | 8 | 39 | 3 | 0 | 0 | 0 | |
| pos_enterprise BSD-2-Clause | 0% | 68% | 96 | 45 | 200 | 1,241 | 45 | 0 | 0 | 0 | |
| pos_enterprise_sms_whatsapp BSD-2-Clause | 0% | 0% | 0 | 20 | 122 | 848 | 20 | 0 | 0 | 0 | |
| pos_event BSD-2-Clause | 0% | 54% | 27 | 23 | 89 | 542 | 23 | 0 | 0 | 0 | |
| pos_event_iot BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| pos_event_sale BSD-2-Clause | 0% | 0% | 0 | 4 | 8 | 50 | 4 | 0 | 0 | 0 | |
| pos_glory_cash BSD-2-Clause | 0% | 12% | 8 | 54 | 307 | 1,925 | 54 | 0 | 0 | 0 | |
| pos_hr BSD-2-Clause | 0% | 54% | 32 | 27 | 142 | 829 | 27 | 0 | 0 | 0 | |
| pos_hr_mobile BSD-2-Clause | 0% | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| pos_imin BSD-2-Clause | 0% | 0% | 0 | 12 | 37 | 201 | 12 | 0 | 0 | 0 | |
| pos_iot BSD-2-Clause | 0% | 53% | 44 | 39 | 322 | 1,874 | 39 | 0 | 0 | 0 | |
| pos_iot_adam_scale BSD-2-Clause | 0% | 0% | 0 | 5 | 14 | 87 | 5 | 0 | 0 | 0 | |
| pos_iot_six BSD-2-Clause | 0% | 48% | 14 | 15 | 110 | 613 | 15 | 0 | 0 | 0 | |
| pos_iot_worldline BSD-2-Clause | 0% | 85% | 6 | 1 | 5 | 28 | 1 | 0 | 0 | 0 | |
| pos_loyalty BSD-2-Clause | 0% | 72% | 99 | 38 | 209 | 1,159 | 38 | 2 | 0 | 0 | |
| pos_mercado_pago BSD-2-Clause | 0% | 32% | 8 | 17 | 85 | 647 | 17 | 1 | 0 | 0 | |
| pos_mobile BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 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/14/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>