| Strings Words Characters | |||
|---|---|---|---|
| 373 2,884 33,584 |
|
All strings | Browse Translate Zen |
| 3 1,320 20,080 |
|
Approved strings | Browse Translate Zen |
| 373 2,884 33,584 |
|
Translated strings | Browse Translate Zen |
| 370 1,564 13,504 |
|
Strings waiting for review | Browse Translate Zen |
| 6 61 352 |
|
Strings with any failing checks | Browse Translate Zen |
| 6 61 352 |
|
Translated strings with any failing checks | Browse Translate Zen |
| 5 42 226 |
|
Failing check: Mismatched full stop | Browse Translate Zen |
| 1 19 126 |
|
Failing check: Python format | Browse Translate Zen |
Summary
| Project website | www.odoo.com | |
|---|---|---|
| Project reviewers41 |
|
|
| Translation license | BSD 2-Clause "Simplified" License | |
| Translation process |
|
|
| File mask |
addons/calendar/i18n/*.po
|
|
| Translation file |
Download
addons/calendar/i18n/es.po
|
|
| Last change | March 26, 2026, 7:58 a.m. | |
| Last change made by | Noemi Pla Garcia (nopl) | |
| Language | Spanish | |
| Language code | es | |
| Text direction | Left to right | |
| Case sensitivity | Case-sensitive | |
| Number of speakers | 507,599,381 | |
| Number of plurals | 3 | |
| Plural type | One/many/other | |
| Plurals | One | 1 | Many | 1000000, 2000000 |
| Other | 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, … | |
| Plural formula |
(n == 1) ? 0 : ((n != 0 && n % 1000000 == 0) ? 1 : 2)
|
|
03/26/2026
String statistics
| Strings percent | Hosted strings | Words percent | Hosted words | Characters percent | Hosted characters | |
|---|---|---|---|---|---|---|
| Total | 373 | 2,884 | 33,584 | |||
| Approved | 1% | 3 | 45% | 1,320 | 59% | 20,080 |
| Waiting for review | 99% | 370 | 54% | 1,564 | 40% | 13,504 |
| Translated | 100% | 373 | 100% | 2,884 | 100% | 33,584 |
| Needs editing | 0% | 0 | 0% | 0 | 0% | 0 |
| Read-only | 0% | 0 | 0% | 0 | 0% | 0 |
| Failing checks | 1% | 6 | 2% | 61 | 1% | 352 |
| Strings with suggestions | 0% | 0 | 0% | 0 | 0% | 0 |
| Untranslated strings | 0% | 0 | 0% | 0 | 0% | 0 |
Quick numbers
and previous 30 days
Trends of last 30 days
−4%
Hosted words
+100%
—
Hosted strings
+100%
−1%
Translated
+100%
+100%
Contributors
—
|
Translation approved |
|
|
Translation completed |
Translation completed
03/26/2026
|
|
Translation added |
|
|
Translation approved |
|
|
Translation added |
|
|
Translation approved |
|
|
Translation changed |
|
|
Translation added |
|
|
Contributor joined |
Contributor joined
03/24/2026
|
None
Resource updated |
The “
addons/calendar/i18n/es.po” file was changed.
03/21/2026
|
| 373 | File in original format as translated in the repository | gettext PO file | |||||||
|---|---|---|---|---|---|---|---|---|---|
| 373 | All strings, converted files enriched with comments; suitable for offline translation | CSV | gettext MO | gettext PO | TBX | TMX | XLIFF 1.1 with gettext extensions | XLIFF 1.1 | XLSX |
None
<t t-set="colors" t-value="{'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00', 'declined': 'red'}"/>
<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')"/>
<p>
Hello <t t-out="object.common_name or ''">Gemini Furniture</t>,<br/><br/>
This is a reminder for the below event:
</p>
<div style="text-align: center; padding: 16px 0px 16px 0px;">
<a t-attf-href="/calendar/meeting/view?token={{ object.access_token }}&id={{ object.event_id.id }}" style="padding: 5px 10px; color: #FFFFFF; text-decoration: none; background-color: #875A7B; border: 1px solid #875A7B; border-radius: 3px">
View</a>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tr>
<td width="130px;" style="min-width: 130px;">
<div style="border-top-start-radius: 3px; border-top-end-radius: 3px; font-size: 12px; border-collapse: separate; text-align: center; font-weight: bold; color: #ffffff; min-height: 18px; background-color: #875A7B; border: 1px solid #875A7B;">
<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>
</div>
<div style="font-size: 48px; min-height: auto; font-weight: bold; text-align: center; color: #5F5F5F; background-color: #F8F8F8; border: 1px solid #875A7B;">
<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>
</div>
<div style="font-size: 12px; text-align: center; font-weight: bold; color: #ffffff; background-color: #875A7B;">
<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>
</div>
<div style="border-collapse: separate; color: #5F5F5F; text-align: center; font-size: 12px; border-bottom-end-radius: 3px; font-weight: bold; border: 1px solid #875A7B; border-bottom-start-radius: 3px;">
<t t-if="not object.event_id.allday">
<div>
<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>
</div>
<t t-if="object.mail_tz">
<div style="font-size: 10px; font-weight: normal">
(<t t-out="object.mail_tz or ''">Europe/Brussels</t>)
</div>
</t>
</t>
</div>
</td>
<td width="20px;"/>
<td style="padding-top: 5px;">
<p><strong>Details of the event</strong></p>
<ul>
<t t-if="object.event_id.location">
<li>Location: <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}}">(View Map)</a>
</li>
</t>
<t t-if="recurrent">
<li>When: <t t-out="object.recurrence_id.get_recurrence_name()">Every 1 Weeks, for 3 events</t></li>
</t>
<t t-if="not object.event_id.allday and object.event_id.duration">
<li>Duration: <t t-out="('%dH%02d' % (object.event_id.duration,round(object.event_id.duration*60)%60)) or ''">0H30</t></li>
</t>
<li>Attendees
<ul>
<li t-foreach="object.event_id.attendee_ids" t-as="attendee">
<div t-attf-style="display: inline-block; border-radius: 50%; width: 10px; height: 10px; background:{{ colors.get(attendee.state) or 'white' }};"> </div>
<t t-if="attendee.common_name != object.common_name">
<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>
</li>
</ul></li>
<t t-if="object.event_id.videocall_location">
<li>
How to Join:
<t t-if="object.get_base_url() in object.event_id.videocall_location"> Join with Odoo Discuss</t>
<t t-else=""> Join at</t><br/>
<a t-att-href="object.event_id.videocall_location" target="_blank" t-out="object.event_id.videocall_location or ''">www.mycompany.com/calendar/join_videocall/xyz</a>
</li>
</t>
<t t-if="not is_html_empty(object.event_id.description)">
<li>Description of the event:
<t t-out="object.event_id.description">Internal meeting for discussion for new pricing for product and services.</t></li>
</t>
</ul>
</td>
</tr></table>
<br/>
Thank you,
<t t-if="object.event_id.user_id.signature" data-o-mail-quote-container="1">
<br/>
<t t-out="object.event_id.user_id.signature or ''" data-o-mail-quote="1">--<br data-o-mail-quote="1"/>Mitchell Admin</t>
</t>
</div>
<t t-set="colors" t-value="{'needsAction': 'grey', 'accepted': 'green', 'tentative': '#FFFF00', 'declined': 'red'}"/>
<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')"/>
<p>
Hola, <t t-out="object.common_name or ''">Gemini Furniture</t>:<br/><br/>
Este es un recordatorio para el siguiente evento:
</p>
<div style="text-align: center; padding: 16px 0px 16px 0px;">
<a t-attf-href="/calendar/meeting/view?token={{ object.access_token }}&id={{ object.event_id.id }}" style="padding: 5px 10px; color: #FFFFFF; text-decoration: none; background-color: #875A7B; border: 1px solid #875A7B; border-radius: 3px">
Ver</a>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tr>
<td width="130px;" style="min-width: 130px;">
<div style="border-top-start-radius: 3px; border-top-end-radius: 3px; font-size: 12px; border-collapse: separate; text-align: center; font-weight: bold; color: #ffffff; min-height: 18px; background-color: #875A7B; border: 1px solid #875A7B;">
<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 """>martes</t>
</div>
<div style="font-size: 48px; min-height: auto; font-weight: bold; text-align: center; color: #5F5F5F; background-color: #F8F8F8; border: 1px solid #875A7B;">
<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>
</div>
<div style="font-size: 12px; text-align: center; font-weight: bold; color: #ffffff; background-color: #875A7B;">
<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 mayo de 2021</t>
</div>
<div style="border-collapse: separate; color: #5F5F5F; text-align: center; font-size: 12px; border-bottom-end-radius: 3px; font-weight: bold; border: 1px solid #875A7B; border-bottom-start-radius: 3px;">
<t t-if="not object.event_id.allday">
<div>
<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>
</div>
<t t-if="object.mail_tz">
<div style="font-size: 10px; font-weight: normal">
(<t t-out="object.mail_tz or ''">Europa/Bruselas</t>)
</div>
</t>
</t>
</div>
</td>
<td width="20px;"/>
<td style="padding-top: 5px;">
<p><strong>Detalles del evento</strong></p>
<ul>
<t t-if="object.event_id.location">
<li>Ubicación: <t t-out="object.event_id.location or ''">Bruselas</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}}">(Ver en el mapa)</a>
</li>
</t>
<t t-if="recurrent">
<li>¿Cuándo?: <t t-out="object.recurrence_id.get_recurrence_name()">semanalmente, 3 eventos</t></li>
</t>
<t t-if="not object.event_id.allday and object.event_id.duration">
<li>Duración: <t t-out="('%dH%02d' % (object.event_id.duration,round(object.event_id.duration*60)%60)) or ''">0 h 30 min</t></li>
</t>
<li>Participantes
<ul>
<li t-foreach="object.event_id.attendee_ids" t-as="attendee">
<div t-attf-style="display: inline-block; border-radius: 50%; width: 10px; height: 10px; background:{{ colors.get(attendee.state) or 'white' }};"> </div>
<t t-if="attendee.common_name != object.common_name">
<span style="margin-left:5px" t-out="attendee.common_name or ''">Mitchell Admin</span>
</t>
<t t-else="">
<span style="margin-left:5px">Usted</span>
</t>
</li>
</ul></li>
<t t-if="object.event_id.videocall_location">
<li>
Cómo unirse:
<t t-if="object.get_base_url() in object.event_id.videocall_location"> Unirse con Conversaciones de Odoo</t>
<t t-else=""> Unirse a través de</t><br/>
<a t-att-href="object.event_id.videocall_location" target="_blank" t-out="object.event_id.videocall_location or ''">www.mycompany.com/calendar/join_videocall/xyz</a>
</li>
</t>
<t t-if="not is_html_empty(object.event_id.description)">
<li>Descripción del evento:
<t t-out="object.event_id.description">Reunión interna para hablar de los nuevos precios de los productos y servicios.</t></li>
</t>
</ul>
</td>
</tr></table>
<br/>
Gracias,
<t t-if="object.event_id.user_id.signature" data-o-mail-quote-container="1">
<br/>
<t t-out="object.event_id.user_id.signature or ''" data-o-mail-quote="1">--<br data-o-mail-quote="1"/>Mitchell Admin</t>
</t>
</div>