| Language | Approved | Translated | Unreviewed | Unfinished | Unfinished words | Unfinished characters | Untranslated | Checks | Suggestions | Comments | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| English BSD-2-Clause | 100% | 100% | 0 | 0 | 0 | 0 | 0 | 49 | 0 | 0 | |
| Arabic BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 24 | 0 | 0 | |
| Azerbaijani BSD-2-Clause | 0% | 67% | 250 | 123 | 1,952 | 24,135 | 123 | 2 | 0 | 0 | |
| Bosnian BSD-2-Clause | 0% | 38% | 144 | 229 | 2,660 | 32,212 | 229 | 4 | 0 | 0 | |
| Bulgarian BSD-2-Clause | 0% | 69% | 259 | 114 | 2,200 | 29,117 | 114 | 6 | 0 | 0 | |
| Burmese BSD-2-Clause | 0% | 26% | 98 | 275 | 2,763 | 32,862 | 275 | 0 | 0 | 0 | |
| Catalan BSD-2-Clause | 1% | 99% | 369 | 3 | 1,320 | 20,080 | 3 | 3 | 0 | 0 | |
| Chinese (Simplified Han script) BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 1 | 0 | 0 | |
| Chinese (Traditional Han script) BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 2 | 0 | 0 | |
| Croatian BSD-2-Clause | 0% | 77% | 289 | 84 | 2,051 | 28,250 | 84 | 4 | 0 | 0 | |
| Czech BSD-2-Clause | 6% | 99% | 345 | 3 | 1,320 | 20,080 | 3 | 3 | 0 | 0 | |
| Danish BSD-2-Clause | 0% | 98% | 368 | 5 | 1,634 | 25,347 | 5 | 7 | 0 | 0 | |
| Dutch BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 1 | 0 | 0 | |
| Estonian BSD-2-Clause | 0% | 98% | 369 | 4 | 1,627 | 25,265 | 4 | 5 | 0 | 0 | |
| Finnish BSD-2-Clause | 1% | 99% | 369 | 3 | 1,320 | 20,080 | 3 | 6 | 0 | 0 | |
| French BSD-2-Clause | 0% | 100% | 373 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | |
| German BSD-2-Clause | 0% | 99% | 371 | 2 | 808 | 12,468 | 2 | 8 | 0 | 0 | |
| Greek BSD-2-Clause | 0% | 72% | 270 | 103 | 2,214 | 29,067 | 103 | 4 | 0 | 0 | |
| Hebrew BSD-2-Clause | 1% | 93% | 346 | 26 | 1,738 | 26,022 | 26 | 2 | 0 | 0 | |
| Hindi BSD-2-Clause | 0% | 96% | 361 | 12 | 1,650 | 25,526 | 12 | 1 | 0 | 0 | |
| Hungarian BSD-2-Clause | 0% | 70% | 263 | 110 | 2,211 | 29,263 | 110 | 2 | 1 | 0 | |
| Indonesian BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 2 | 0 | 0 | |
| Italian BSD-2-Clause | 0% | 100% | 373 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | |
| Japanese BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 13 | 0 | 0 | |
| Kabyle BSD-2-Clause | 0% | 17% | 64 | 309 | 2,805 | 33,103 | 309 | 0 | 0 | 0 | |
| Korean BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 19 | 0 | 0 | |
| Kurdish (Central) BSD-2-Clause | 0% | 15% | 58 | 315 | 2,782 | 32,956 | 315 | 4 | 0 | 0 | |
| Latvian BSD-2-Clause | 0% | 90% | 337 | 36 | 1,817 | 26,565 | 36 | 1 | 0 | 0 | |
| Lithuanian BSD-2-Clause | 0% | 70% | 262 | 111 | 2,216 | 29,112 | 111 | 4 | 0 | 0 | |
| Mongolian BSD-2-Clause | 0% | 53% | 200 | 173 | 2,432 | 30,742 | 173 | 3 | 0 | 0 | |
| Norwegian Bokmål BSD-2-Clause | 0% | 78% | 294 | 79 | 2,177 | 29,021 | 79 | 5 | 0 | 0 | |
| Persian BSD-2-Clause | 0% | 95% | 358 | 15 | 1,718 | 25,880 | 15 | 14 | 0 | 0 | |
| Polish BSD-2-Clause | 99% | 99% | 0 | 3 | 1,320 | 20,080 | 3 | 1 | 0 | 0 | |
| Portuguese BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 0 | 0 | 0 | |
| Portuguese (Brazil) BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 2 | 0 | 0 | |
| Romanian BSD-2-Clause | 0% | 98% | 369 | 4 | 1,627 | 25,265 | 4 | 3 | 0 | 0 | |
| Russian BSD-2-Clause | 1% | 99% | 368 | 3 | 1,320 | 20,080 | 3 | 4 | 0 | 0 | |
| Serbian (Latin script) BSD-2-Clause | 0% | 97% | 363 | 10 | 1,696 | 25,744 | 9 | 1 | 0 | 0 | |
| Slovak BSD-2-Clause | 0% | 65% | 245 | 128 | 2,254 | 29,673 | 128 | 2 | 0 | 0 | |
| Slovenian BSD-2-Clause | 0% | 98% | 369 | 4 | 1,627 | 25,265 | 4 | 6 | 0 | 0 | |
| Spanish BSD-2-Clause | 1% | 100% | 370 | 0 | 0 | 0 | 0 | 6 | 0 | 0 | |
| Spanish (Latin America) BSD-2-Clause | 1% | 100% | 370 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | |
| Swedish BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 0 | 0 | 0 | |
| Thai BSD-2-Clause | 1% | 99% | 369 | 3 | 1,320 | 20,080 | 3 | 1 | 0 | 0 | |
| Turkish BSD-2-Clause | 15% | 99% | 311 | 3 | 1,320 | 20,080 | 3 | 0 | 0 | 0 | |
| Ukrainian BSD-2-Clause | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||
| Vietnamese BSD-2-Clause | 0% | 99% | 370 | 3 | 1,320 | 20,080 | 3 | 6 | 0 | 0 | |
Please sign in to see the alerts.
Summary
| Project website | www.odoo.com | |
|---|---|---|
| Project reviewers41 |
|
|
| Translation license | BSD 2-Clause "Simplified" License | |
| Translation process |
|
|
| File mask |
addons/calendar/i18n/*.po
|
|
03/27/2026
String statistics
| Strings percent | Hosted strings | Words percent | Hosted words | Characters percent | Hosted characters | |
|---|---|---|---|---|---|---|
| Total | 17,531 | 135,548 | 1,578,448 | |||
| Source | 373 | 2,884 | 33,584 | |||
| Approved | 4% | 839 | 6% | 8,245 | 6% | 101,502 |
| Waiting for review | 79% | 13,994 | 39% | 54,000 | 28% | 449,062 |
| Translated | 86% | 15,206 | 48% | 65,129 | 37% | 584,148 |
| Needs editing | 1% | 1 | 1% | 1 | 1% | 17 |
| Read-only | 2% | 373 | 2% | 2,884 | 2% | 33,584 |
| Failing checks | 1% | 248 | 3% | 4,312 | 3% | 47,937 |
| Strings with suggestions | 1% | 1 | 1% | 3 | 1% | 24 |
| Untranslated strings | 13% | 2,324 | 51% | 70,418 | 62% | 994,283 |
Quick numbers
135 k
Hosted words
17,531
Hosted strings
86%
Translated
0
Components
47
Languages
47
Translations
0
Screenshots
and previous 30 days
Trends of last 30 days
−4%
Hosted words
+100%
—
Hosted strings
+100%
+1%
Translated
+86%
+50%
Contributors
+100%
|
Translation added |
|
|
Contributor joined |
Contributor joined
03/27/2026
|
|
Translation changed |
|
|
Translation changed |
|
|
Translation approved |
|
|
Translation completed |
Translation completed
03/26/2026
|
|
Translation added |
|
|
Translation approved |
|
|
Translation added |
|
|
Translation completed |
Translation completed
03/25/2026
|
<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="customer" t-value="object.event_id.find_partner_customer()"/>
<t t-set="target_responsible" t-value="object.partner_id == object.event_id.partner_id"/>
<t t-set="target_customer" t-value="object.partner_id == customer"/>
<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 ''">Ready Mat</t>,<br/><br/>
<t t-if="is_online and target_responsible">
<t t-if="customer">
The date of your appointment with <t t-out="customer.name or ''">Jesse Brown</t> has been updated.
</t>
<t t-else="">
Your appointment has been updated.
</t>
The appointment <strong t-out="object.event_id.appointment_type_id.name or ''">Schedule a Demo</strong> is now scheduled for
<t t-out="object.event_id.get_display_time_tz(tz=object.partner_id.tz) or ''">05/04/2021 at (11:00:00 To 11:30:00) (Europe/Brussels)</t>
</t>
<t t-elif="is_online and target_customer">
The date of your appointment with <t t-out="object.event_id.user_id.partner_id.name or ''">Colleen Diaz</t> has been updated.
The appointment <strong t-out="object.event_id.appointment_type_id.name or ''"/> is now scheduled for
<t t-out="object.event_id.get_display_time_tz(tz=object.partner_id.tz) or ''">05/04/2021 at (11:00:00 To 11:30:00) (Europe/Brussels)</t>.
</t>
<t t-else="">
The date of the meeting has been updated.
The meeting <strong t-out="object.event_id.name or ''">Follow-up for Project proposal</strong> created by <t t-out="object.event_id.user_id.partner_id.name or ''">Colleen Diaz</t> is now scheduled for
<t t-out="object.event_id.get_display_time_tz(tz=object.partner_id.tz) or ''">05/04/2021 at (11:00:00 To 11:30:00) (Europe/Brussels)</t>.
</t>
</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="customer" t-value="object.event_id.find_partner_customer()"/>
<t t-set="target_responsible" t-value="object.partner_id == object.event_id.partner_id"/>
<t t-set="target_customer" t-value="object.partner_id == customer"/>
<t t-set="recurrent" t-value="object.recurrence_id and not ctx.get('calendar_template_ignore_recurrence')"/>
<p>
Guten Tag <t t-out="object.common_name or ''">Ready Mat</t>,<br/><br/>
<t t-if="is_online and target_responsible">
<t t-if="customer">
das Datum Ihres Termins mit <t t-out="customer.name or ''">Jesse Brown</t> wurde aktualisiert.
</t>
<t t-else="">
Ihr Termin wurde aktualisiert.
</t>
Der Termin <strong t-out="object.event_id.appointment_type_id.name or ''">Eine Demo planen</strong> ist jetzt geplant am
<t t-out="object.event_id.get_display_time_tz(tz=object.partner_id.tz) or ''">05/04/2021 um (11:00:00 bis 11:30:00) (Europa/Brüssel)</t>
</t>
<t t-elif="is_online and target_customer">
das Datum Ihres Termins mit <t t-out="object.event_id.user_id.partner_id.name or ''">Colleen Diaz</t> wurde aktualisiert.
Der Termin <strong t-out="object.event_id.appointment_type_id.name or ''"/> ist jetzt geplant am
<t t-out="object.event_id.get_display_time_tz(tz=object.partner_id.tz) or ''">05/04/2021 um (11:00:00 bis 11:30:00) (Europa/Brüssel)</t>.
</t>
<t t-else="">
das Datum des Termins wurde aktualisiert.
Der Termin <strong t-out="object.event_id.name or ''">Besprechung des Projektvorschlags</strong>, erstellt von <t t-out="object.event_id.user_id.partner_id.name or ''">Colleen Diaz</t> ist jetzt geplant am
<t t-out="object.event_id.get_display_time_tz(tz=object.partner_id.tz) or ''">05/04/2021 um (11:00:00 bis 11:30:00) (Europa/Brüssel)</t>.
</t>
</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">
Anzeigen</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 """>Dienstag</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 """>Mai 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 Uhr</t>
</div>
<t t-if="object.mail_tz">
<div style="font-size: 10px; font-weight: normal">
(<t t-out="object.mail_tz or ''">Europa/Brüssel</t>)
</div>
</t>
</t>
</div>
</td>
<td width="20px;"/>
<td style="padding-top: 5px;">
<p><strong>Veranstaltungsdetails</strong></p>
<ul>
<t t-if="object.event_id.location">
<li>Veranstaltungsort: <t t-out="object.event_id.location or ''">Brüssel</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}}">(Karte anzeigen)</a>
</li>
</t>
<t t-if="recurrent">
<li>Wann: <t t-out="object.recurrence_id.get_recurrence_name()">Jede Woche, 3 Veranstaltungen</t></li>
</t>
<t t-if="not object.event_id.allday and object.event_id.duration">
<li>Dauer: <t t-out="('%dH%02d' % (object.event_id.duration,round(object.event_id.duration*60)%60)) or ''">0H30</t></li>
</t>
<li>Teilnehmer
<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">Sie</span>
</t>
</li>
</ul></li>
<t t-if="object.event_id.videocall_location">
<li>
So können Sie teilnehmen:
<t t-if="object.get_base_url() in object.event_id.videocall_location"> Mit Odoo Dialog</t>
<t t-else=""> Über</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>Beschreibung der Veranstaltung:
<t t-out="object.event_id.description">Internes Treffen zur Besprechung der neuen Preisgestaltung für Produkte und Dienstleistungen.</t></li>
</t>
</ul>
</td>
</tr></table>
<br/>
Vielen Dank!
<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>