| Component | Approved | Translated | Unreviewed | Unfinished | Unfinished words | Unfinished characters | Untranslated | Checks | Suggestions | Comments | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 3pl_logistic_company BSD-2-Clause | 0% | 99% | 278 | 1 | 5 | 30 | 1 | 9 | 0 | 0 | |
| account BSD-2-Clause | 0% | 86% | 2,820 | 429 | 4,113 | 42,999 | 429 | 39 | 0 | 0 | |
| account_3way_match BSD-2-Clause | 0% | 18 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_accountant BSD-2-Clause | 0% | 85% | 403 | 67 | 401 | 3,030 | 67 | 6 | 0 | 0 | |
| account_accountant_check_printing BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_accountant_fleet BSD-2-Clause | 0% | 4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_asset BSD-2-Clause | 0% | 78% | 296 | 79 | 673 | 4,641 | 79 | 5 | 0 | 0 | |
| account_asset_fleet BSD-2-Clause | 0% | 70% | 7 | 3 | 30 | 155 | 3 | 0 | 0 | 0 | |
| account_avatax BSD-2-Clause | 0% | 99% | 112 | 1 | 4 | 29 | 1 | 0 | 0 | 0 | |
| account_avatax_geolocalize BSD-2-Clause | 0% | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_avatax_sale BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_avatax_stock BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_bank_statement_extract BSD-2-Clause | 0% | 93% | 43 | 3 | 5 | 39 | 3 | 0 | 0 | 0 | |
| account_bank_statement_import BSD-2-Clause | 0% | 100% | 31 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | |
| account_bank_statement_import_camt BSD-2-Clause | 0% | 318 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_bank_statement_import_csv BSD-2-Clause | 0% | 83% | 10 | 2 | 4 | 37 | 2 | 0 | 0 | 0 | |
| account_bank_statement_import_ofx BSD-2-Clause | 0% | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_bank_statement_import_qif BSD-2-Clause | 0% | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_base_import BSD-2-Clause | 0% | 94% | 73 | 4 | 24 | 197 | 4 | 1 | 0 | 0 | |
| account_batch_payment BSD-2-Clause | 0% | 94% | 161 | 10 | 43 | 252 | 10 | 3 | 0 | 0 | |
| account_budget BSD-2-Clause | 0% | 99% | 123 | 1 | 2 | 14 | 1 | 0 | 0 | 0 | |
| account_budget_purchase BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_check_printing BSD-2-Clause | 0% | 94% | 64 | 4 | 156 | 965 | 4 | 0 | 0 | 0 | |
| account_debit_note BSD-2-Clause | 0% | 34 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_edi BSD-2-Clause | 0% | 98% | 72 | 1 | 5 | 36 | 1 | 1 | 0 | 0 | |
| account_edi_proxy_client BSD-2-Clause | 0% | 85% | 30 | 5 | 84 | 444 | 5 | 0 | 0 | 0 | |
| account_edi_ubl_cii BSD-2-Clause | 0% | 75% | 231 | 75 | 778 | 4,511 | 75 | 0 | 0 | 0 | |
| account_external_tax BSD-2-Clause | 0% | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_fiscal_categories BSD-2-Clause | 0% | 70% | 28 | 12 | 50 | 322 | 12 | 0 | 0 | 0 | |
| account_fiscal_categories_fleet BSD-2-Clause | 0% | 78% | 18 | 5 | 26 | 176 | 5 | 0 | 0 | 0 | |
| account_fleet BSD-2-Clause | 0% | 75% | 21 | 7 | 55 | 404 | 7 | 1 | 0 | 0 | |
| account_followup BSD-2-Clause | 0% | 95% | 149 | 7 | 177 | 2,636 | 7 | 5 | 0 | 0 | |
| account_inter_company_rules BSD-2-Clause | 0% | 90% | 19 | 2 | 6 | 43 | 2 | 1 | 0 | 0 | |
| account_intrastat BSD-2-Clause | 0% | 88% | 127 | 17 | 104 | 697 | 17 | 3 | 0 | 0 | |
| account_invoice_extract BSD-2-Clause | 0% | 91% | 57 | 5 | 19 | 114 | 5 | 1 | 0 | 0 | |
| account_invoice_extract_purchase BSD-2-Clause | 0% | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_iso20022 BSD-2-Clause | 0% | 87% | 77 | 11 | 51 | 307 | 11 | 2 | 0 | 0 | |
| account_loans BSD-2-Clause | 0% | 96% | 169 | 6 | 57 | 336 | 6 | 0 | 0 | 0 | |
| account_loans_extract BSD-2-Clause | 0% | 0% | 0 | 41 | 112 | 734 | 41 | 0 | 0 | 0 | |
| account_online_payment BSD-2-Clause | 0% | 56% | 26 | 20 | 491 | 7,229 | 20 | 1 | 0 | 0 | |
| account_online_synchronization BSD-2-Clause | 0% | 95% | 209 | 10 | 59 | 392 | 10 | 3 | 0 | 0 | |
| account_payment BSD-2-Clause | 0% | 93% | 120 | 9 | 49 | 305 | 9 | 0 | 0 | 0 | |
| account_peppol BSD-2-Clause | 0% | 69% | 229 | 101 | 725 | 4,692 | 101 | 2 | 0 | 0 | |
| account_pos_settle_due BSD-2-Clause | 0% | 0% | 0 | 8 | 40 | 238 | 8 | 0 | 0 | 0 | |
| account_qr_code_emv BSD-2-Clause | 0% | 83% | 15 | 3 | 8 | 45 | 3 | 1 | 0 | 0 | |
| account_qr_code_sepa BSD-2-Clause | 0% | 87% | 7 | 1 | 2 | 12 | 1 | 0 | 0 | 0 | |
| account_reports BSD-2-Clause | 0% | 74% | 866 | 295 | 2,151 | 16,353 | 295 | 5 | 0 | 0 | |
| account_reports_cash_basis BSD-2-Clause | 0% | 10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_saft BSD-2-Clause | 0% | 94% | 18 | 1 | 8 | 59 | 1 | 0 | 0 | 0 | |
| account_saft_import BSD-2-Clause | 0% | 21 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_sepa_direct_debit BSD-2-Clause | 0% | 94% | 265 | 15 | 165 | 1,694 | 15 | 3 | 0 | 0 | |
| account_tax_python BSD-2-Clause | 0% | 94% | 18 | 1 | 7 | 62 | 1 | 1 | 0 | 0 | |
| account_transfer BSD-2-Clause | 0% | 82% | 60 | 13 | 120 | 762 | 13 | 0 | 0 | 0 | |
| account_update_tax_tags BSD-2-Clause | 0% | 16 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| account_winbooks_import BSD-2-Clause | 0% | 97% | 35 | 1 | 1 | 7 | 1 | 0 | 0 | 0 | |
| accountant BSD-2-Clause | 0% | 85% | 6 | 1 | 9 | 70 | 1 | 0 | 0 | 0 | |
| accountant_fleet BSD-2-Clause | 0% | 33% | 1 | 2 | 24 | 158 | 2 | 0 | 0 | 0 | |
| accountant_hr_expense BSD-2-Clause | 0% | 0% | 0 | 2 | 17 | 131 | 2 | 0 | 0 | 0 | |
| accountant_knowledge BSD-2-Clause | 0% | 44% | 40 | 49 | 171 | 1,208 | 49 | 1 | 0 | 0 | |
| accounting_firm BSD-2-Clause | 0% | 55% | 143 | 117 | 1,041 | 6,845 | 117 | 4 | 0 | 0 | |
| agriculture_shop BSD-2-Clause | 0% | 77% | 197 | 56 | 121 | 820 | 56 | 6 | 0 | 0 | |
| ai BSD-2-Clause | 0% | 36% | 111 | 197 | 2,783 | 21,008 | 197 | 0 | 0 | 0 | |
| ai_app BSD-2-Clause | 0% | 57% | 30 | 22 | 102 | 649 | 22 | 2 | 0 | 0 | |
| ai_calendar BSD-2-Clause | 0% | 0% | 0 | 1 | 62 | 385 | 1 | 0 | 0 | 0 | |
| ai_crm BSD-2-Clause | 0% | 50% | 4 | 4 | 92 | 550 | 4 | 0 | 0 | 0 | |
| ai_crm_livechat BSD-2-Clause | 0% | 75% | 6 | 2 | 7 | 38 | 2 | 0 | 0 | 0 | |
| ai_documents BSD-2-Clause | 0% | 27% | 16 | 43 | 258 | 1,585 | 43 | 0 | 0 | 0 | |
| ai_documents_account BSD-2-Clause | 0% | 21% | 5 | 18 | 176 | 1,094 | 18 | 0 | 0 | 0 | |
| ai_documents_fleet BSD-2-Clause | 0% | 0% | 0 | 12 | 74 | 450 | 12 | 0 | 0 | 0 | |
| ai_documents_source BSD-2-Clause | 0% | 55% | 5 | 4 | 22 | 115 | 4 | 0 | 0 | 0 | |
| ai_esg BSD-2-Clause | 0% | 0% | 0 | 29 | 263 | 1,744 | 29 | 0 | 0 | 0 | |
| ai_fields BSD-2-Clause | 0% | 72% | 27 | 10 | 67 | 311 | 10 | 0 | 0 | 0 | |
| ai_helpdesk BSD-2-Clause | 0% | 0% | 0 | 1 | 41 | 293 | 1 | 0 | 0 | 0 | |
| ai_knowledge BSD-2-Clause | 0% | 24% | 7 | 22 | 70 | 444 | 22 | 0 | 0 | 0 | |
| ai_livechat BSD-2-Clause | 0% | 53% | 8 | 7 | 50 | 283 | 7 | 0 | 0 | 0 | |
| ai_mass_mailing BSD-2-Clause | 0% | 0% | 0 | 1 | 103 | 635 | 1 | 0 | 0 | 0 | |
| ai_purchase BSD-2-Clause | 0% | 0% | 0 | 1 | 25 | 190 | 1 | 0 | 0 | 0 | |
| ai_sale BSD-2-Clause | 0% | 0% | 0 | 5 | 299 | 1,908 | 5 | 0 | 0 | 0 | |
| ai_sale_margin BSD-2-Clause | 0% | 0% | 0 | 1 | 42 | 286 | 1 | 0 | 0 | 0 | |
| ai_sale_stock BSD-2-Clause | 0% | 0% | 0 | 1 | 56 | 421 | 1 | 0 | 0 | 0 | |
| ai_server_actions BSD-2-Clause | 0% | 91% | 11 | 1 | 3 | 16 | 1 | 1 | 0 | 0 | |
| ai_stock BSD-2-Clause | 0% | 0% | 0 | 1 | 88 | 582 | 1 | 0 | 0 | 0 | |
| ai_website BSD-2-Clause | 0% | 40% | 9 | 13 | 41 | 259 | 13 | 0 | 0 | 0 | |
| ai_website_livechat BSD-2-Clause | 0% | 56% | 17 | 13 | 46 | 296 | 13 | 2 | 0 | 0 | |
| analytic BSD-2-Clause | 0% | 97% | 158 | 4 | 24 | 120 | 4 | 4 | 0 | 0 | |
| analytic_enterprise BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| api_doc BSD-2-Clause | 0% | 56% | 21 | 16 | 60 | 338 | 16 | 0 | 0 | 0 | |
| appointment BSD-2-Clause | 0% | 98% | 620 | 10 | 55 | 402 | 10 | 14 | 0 | 0 | |
| appointment_account_payment BSD-2-Clause | 0% | 91% | 82 | 8 | 82 | 601 | 8 | 0 | 0 | 0 | |
| appointment_crm BSD-2-Clause | 0% | 93% | 14 | 1 | 5 | 31 | 1 | 0 | 0 | 0 | |
| appointment_google_calendar BSD-2-Clause | 0% | 8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| appointment_google_reserve BSD-2-Clause | 0% | 100% | 76 | 0 | 0 | 0 | 0 | 3 | 0 | 0 | |
| appointment_hr BSD-2-Clause | 0% | 66% | 4 | 2 | 3 | 38 | 2 | 0 | 0 | 0 | |
| appointment_hr_recruitment BSD-2-Clause | 0% | 73% | 11 | 4 | 50 | 355 | 4 | 1 | 0 | 0 | |
| appointment_sms BSD-2-Clause | 0% | 50% | 1 | 1 | 14 | 101 | 1 | 0 | 0 | 0 | |
| approvals BSD-2-Clause | 0% | 94% | 242 | 13 | 58 | 451 | 13 | 1 | 0 | 0 | |
| approvals_purchase BSD-2-Clause | 0% | 100% | 33 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| approvals_purchase_stock BSD-2-Clause | 0% | 6 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| architects BSD-2-Clause | 0% | 100% | 148 | 0 | 0 | 0 | 0 | 2 | 0 | 0 | |
| art_craft BSD-2-Clause | 0% | 100% | 183 | 0 | 0 | 0 | 0 | 7 | 0 | 0 | |
Summary
| Project website | www.odoo.com | |
|---|---|---|
| Project reviewers41 |
|
|
| Language | Chinese (Traditional Han script) | |
| Language code | zh_Hant | |
| Text direction | Left to right | |
| Case sensitivity | Case-insensitive | |
| Number of speakers | 39,078,482 | |
03/10/2026
String statistics
| Strings percent | Hosted strings | Words percent | Hosted words | Characters percent | Hosted characters | |
|---|---|---|---|---|---|---|
| Total | 117,171 | 726,839 | 5,336,966 | |||
| Approved | 1% | 1 | 1% | 1 | 1% | 3 |
| Waiting for review | 82% | 96,441 | 76% | 558,344 | 75% | 4,031,791 |
| Translated | 82% | 96,442 | 76% | 558,345 | 75% | 4,031,794 |
| Needs editing | 0% | 0 | 0% | 0 | 0% | 0 |
| Read-only | 0% | 0 | 0% | 0 | 0% | 0 |
| Failing checks | 1% | 1,675 | 2% | 20,096 | 2% | 137,076 |
| Strings with suggestions | 0% | 0 | 0% | 0 | 0% | 0 |
| Untranslated strings | 17% | 20,729 | 23% | 168,494 | 24% | 1,305,172 |
Quick numbers
and previous 30 days
Trends of last 30 days
+100%
Hosted words
—
+100%
Hosted strings
—
+82%
Translated
—
+100%
Contributors
—
|
Translation changed |
|
|
Translation added |
|
|
Resource updated |
File “
usage_based_maintenance/i18n/zh_TW.po” was added.
03/08/2026
|
|
String added in the repository |
|
|
String added in the repository |
|
|
String added in the repository |
|
|
String added in the repository |
|
|
String added in the repository |
|
|
String added in the repository |
|
|
String added in the repository |
|
<t t-set="color" t-value="object.company_id.email_secondary_color or '#875A7B'"/>
<t t-if="'website_id' in object and object.website_id" t-set="logo_src" t-value="object.website_id.image_url(object.website_id, 'logo')"/>
<t t-else="" t-set="logo_src" t-valuef="/logo.png?company=#{object.company_id.id}"/>
<img t-att-src="logo_src" style="display: block; height: 50px; margin: 0 0 16px;" alt="Logo"/>
<p style="margin: 0 0 12px; padding: 0px; line-height: 18px; font-size: 14px;">
Hello <t t-out="object.partner_id.display_name or ''">Johnny Tester</t>,
<br/><br/>
<t t-set="tx_sudo" t-value="object.get_portal_last_transaction()"/>
Your order <span style="font-weight:bold;" t-out="object.name or ''">S00049</span>
<t t-if="object.state == 'sale' or (tx_sudo and tx_sudo.state in ('done', 'authorized'))">
has been confirmed.<br/>
Thank you for your trust.
</t>
<t t-elif="tx_sudo and tx_sudo.state == 'pending'">
is pending. It will be confirmed when the payment is received.
<t t-if="object.reference">
Your payment reference is <span style="font-weight:bold;" t-out="object.reference or ''"/>.
</t>
</t>
<br/>
<t t-set="documents" t-value="object._get_product_documents()"/>
<t t-if="documents">
<br/>
<t t-if="len(documents)>1">
Here are some additional documents that may interest you:
</t>
<t t-else="">
Here is an additional document that may interest you:
</t>
<ul style="margin-bottom: 0;">
<t t-foreach="documents" t-as="document">
<li style="font-size: 14px;">
<a t-out="document.ir_attachment_id.name" t-att-href="object.get_portal_url('/document/' + str(document.id))" t-att-target="target"/>
</li>
</t>
</ul>
</t>
<t t-if="not is_html_empty(object.user_id.signature)">
<div style="font-size: 14px; margin: 0 0 16px;"><t t-out="object.user_id.signature or ''">Mitchell Admin</t></div>
</t>
</p>
<t t-if="hasattr(object, 'website_id') and object.website_id">
<div style="margin: 0px; padding: 0px;">
<!-- The following loop is also used in the addons > sale > data > mail_template_data.xml file because we want the same layout. -->
<t t-foreach="object.order_line" t-as="line">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and not line.combo_item_id">
<table width="100%" style="max-width: 590px; font-size: 14px; border-collapse: collapse;" role="presentation">
<tr>
<td width="24%" style="max-width: 120px; padding: 0 10px 10px 0; vertical-align: top;">
<img t-attf-src="/web/image/product.product/{{ line.product_id.id }}/image_128" t-attf-style="width: 64px; height: {{object.website_id and object.website_id._get_product_image_ratio_height() or '64px'}}; object-fit: cover; object-position: center;" alt="Product image"/>
</td>
<td align="left" style="vertical-align: top; padding-bottom: 22px;">
<h3 t-attf-style="mso-line-height-rule:exactly; margin:0; font-size: 14px; {{'margin-bottom: 6px;' if line.product_type == 'combo' else ''}}">
<strong t-out="line.product_id.name or ''" t-attf-style="color: #{color};">Taking care of Trees Course</strong>
<span t-if="line.product_id.product_template_attribute_value_ids" style="opacity: 0.5;">
<t t-out="', '.join(line.product_id.product_template_attribute_value_ids.mapped('name'))"/>
</span>
</h3>
<t t-set="combo_line_idx" t-value="0"/>
<t t-set="totalComboLines" t-value="0"/>
<t t-set="line_idx" t-value="line_index"/>
<t t-foreach="object.order_line" t-as="combo_liness">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and (combo_liness.linked_line_id.id == line.id) and line_idx == line_index">
<t t-if="combo_liness.linked_line_id.id == line.id and combo_liness.id != line.id">
<t t-set="totalComboLines" t-value="totalComboLines + 1"/>
</t>
</t>
</t>
<t t-foreach="object.order_line" t-as="combo_line">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and (combo_line.linked_line_id.id == line.id) and combo_line.combo_item_id and line_idx == line_index">
<t t-set="borderRadiusStyle" t-value="''"/>
<t t-set="borderTopStyle" t-value="''"/>
<t t-set="borderBottomStyle" t-value="''"/>
<t t-if="combo_line.linked_line_id.id == line.id and combo_line.id != line.id">
<t t-set="combo_line_idx" t-value="combo_line_idx + 1"/>
</t>
<t t-elif="combo_line.id == line.id and line_idx != line_index">
<t t-set="combo_line_idx" t-value="0"/>
</t>
<t t-if="combo_line_idx == 1">
<t t-if="totalComboLines != 1">
<t t-set="borderRadiusStyle" t-value="'border-radius: 6px 6px 0 0;'"/>
<t t-set="borderBottomStyle" t-value="'border-bottom: none;'"/>
</t>
<t t-else="">
<t t-set="borderRadiusStyle" t-value="'border-radius: 6px;'"/>
</t>
</t>
<t t-elif="totalComboLines == combo_line_idx">
<t t-set="borderRadiusStyle" t-value="'border-radius: 0 0 6px 6px;'"/>
<t t-if="totalComboLines != 2">
<t t-set="borderTopStyle" t-value="'border-top: none;'"/>
</t>
</t>
<div t-attf-style="width: 100%; border: 1px solid #dee2e6; padding: 5px 8px; {{ borderRadiusStyle }} {{ borderBottomStyle }} {{ borderTopStyle }}">
<t t-out="combo_line.product_id.name or ''">Taking care of Trees Course</t>
<span t-if="combo_line.product_id.product_template_attribute_value_ids" style="opacity: 0.5;">
<t t-out="', '.join(combo_line.product_id.product_template_attribute_value_ids.mapped('name'))"/>
</span>
-
<span>
<t t-out="int(combo_line.product_uom_qty) or ''">10000</t>
<t t-out="combo_line.product_uom_id.name or ''" t-if="combo_line.order_id.create_uid._has_group('uom.group_uom')"/>
</span>
<p t-if="hasattr(combo_line, 'is_rental') and combo_line.is_rental and combo_line.id == line.id" style="opacity: 0.7;">
<t t-out="combo_line._get_rental_pricing_description() or ''"/><br/>
</p>
<t t-if="(hasattr(combo_line, 'is_rental') and combo_line.is_rental) or (hasattr(combo_line, 'event_id') and combo_line.event_id) or (hasattr(combo_line, 'calendar_event_id') and combo_line.calendar_event_id)">
<t t-set="description_lines" t-value="combo_line.get_description_following_lines()"/>
<div t-if="description_lines" style="opacity: 0.7;">
<t t-foreach="description_lines" t-as="description_line">
<p t-if="description_line" t-out="description_line" style="margin: 4px 0 0;"/>
</t>
</div>
</t>
</div>
</t>
<t t-elif="not(combo_line.linked_line_id) and combo_line.id == line.id">
<p t-if="hasattr(line, 'is_rental') and line.is_rental" style="margin: 4px 0 0; opacity: 0.7;">
<t t-out="line._get_rental_pricing_description() or ''"/><br/>
</p>
<t t-if="(hasattr(combo_line, 'is_rental') and combo_line.is_rental) or (hasattr(combo_line, 'event_id') and combo_line.event_id) or (hasattr(combo_line, 'calendar_event_id') and combo_line.calendar_event_id)">
<t t-set="product_description_lines" t-value="line.get_description_following_lines()"/>
<div t-if="product_description_lines" style="opacity: 0.7;">
<t t-foreach="product_description_lines" t-as="product_description_line">
<p t-if="product_description_line" t-out="product_description_line" style="margin: 4px 0 0;"/>
</t>
</div>
</t>
</t>
</t>
<span style="display: inline-block; margin-top: 4px; padding: 4px 8px; border-radius: 20px; background-color: #e9ecef; color: #454748; font-size: 12px;">
<t t-out="int(line.product_uom_qty) or ''">10000</t>
<t t-out="line.product_uom_id.name or ''" t-if="line.order_id.create_uid._has_group('uom.group_uom')"/>
</span>
</td>
<td width="19%" align="right" style="max-width: 100px; vertical-align: top;">
<t t-if="line.product_type == 'combo'">
<span t-out="format_amount(line._get_cart_display_price(), object.currency_id) or ''">$ 10.00</span>
</t>
<t t-else="">
<span style="white-space: nowrap;">
<t t-if="hasattr(object, 'website_id') and object.website_id.show_line_subtotals_tax_selection == 'tax_excluded'">
<t t-out="format_amount(line.price_subtotal, object.currency_id) or ''">$ 10.00</t>
</t>
<t t-else="">
<t t-out="format_amount(line.price_total, object.currency_id) or ''">$ 10.00</t>
</t>
</span>
</t>
<t t-if="hasattr(line, 'recurring_invoice') and line.recurring_invoice">
<br/>
<t t-out="line.subscription_plan_id.billing_period_display_sentence or ''"/>
</t>
</td>
</tr>
</table>
</t>
</t>
</div>
<div style="margin: 10px 0 16px; padding: 0px;">
<table width="100%" t-if="hasattr(object, 'carrier_id') and object.carrier_id" style="max-width: 590px; font-size: 14px; border-spacing: 0px 4px; white-space: nowrap;" role="presentation">
<tr>
<td style="padding-top: 8px; width: 50%; border-top: 1px solid #dee2e6;" align="left">Delivery</td>
<td style="padding-top: 8px; width: 50%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_delivery, object.currency_id) or ''">$ 0.00</td>
</tr>
<tr>
<td style="width: 50%;" align="left">Untaxed Amount</td>
<td style="width: 50%;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
<table width="100%" t-else="" style="max-width: 590px; opacity: 0.8; font-size: 14px; border-spacing: 0px 4px; white-space: nowrap;" role="presentation">
<tr>
<td style="width: 50%; border-top: 1px solid #dee2e6;" align="left">Untaxed Amount</td>
<td style="width: 50%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
<table width="100%" style="max-width: 590px; font-size: 14px; border-spacing: 0px; white-space: nowrap;" role="presentation">
<tr>
<t t-if="object.tax_totals and object.tax_totals['subtotals']">
<t t-foreach="object.tax_totals['subtotals']" t-as="line">
<t t-foreach="line['tax_groups']" t-as="tax_line">
<tr>
<td style="width: 20%; padding-bottom: 8px;" align="left"><span t-out="tax_line['group_name']"/></td>
<td style="width: 80%;" align="right" t-out="format_amount(tax_line['tax_amount_currency'], object.currency_id) or ''">$ 0.00</td>
</tr>
</t>
</t>
</t>
</tr>
<tr>
<td style="width: 20%; padding-top: 4px; border-top: 1px solid #343a40; opacity: 0.9;" align="left"><strong>Total</strong></td>
<td style="width: 80%; padding-top: 4px; border-top: 1px solid #343a40; font-weight: bold; " align="right">
<span style="display: inline-block; margin-right: 4px; padding: 4px 8px; border: 1px solid #dee2e6; border-radius: 4px;">
<span style="opacity: 0.9;">Paid with</span>
<span t-attf-style="color: #{color}; font-weight: bold;">
<t t-out="tx_sudo.provider_id.sudo().name or ''"/>
</span>
</span>
<span style="opacity: 0.9;"><t t-out="format_amount(object.amount_total, object.currency_id) or ''">$ 10.00</t></span>
</td>
</tr>
</table>
</div>
<table t-if="object.partner_shipping_id and not object.only_services" width="295" style="vertical-align: top; font-size: 14px; margin-bottom: 12px;" align="left" role="presentation">
<tr>
<td style="padding-bottom: 4px; font-weight: bold;">
<span style="opacity: 0.9;">Delivery with</span>
<span t-attf-style="color: {{color}}; opacity: 1;"><t t-out="object.carrier_id.name or ''"/></span>
</td>
</tr>
<tr>
<td style="opacity: 0.9;">
<t t-out="object.partner_shipping_id.street or ''">1201 S Figueroa St</t><br/>
<t t-out="object.partner_shipping_id.city or ''">Los Angeles</t>
<t t-out="object.partner_shipping_id.state_id.name or ''">California</t>
<t t-out="object.partner_shipping_id.zip or ''">90015</t><br/>
<t t-out="object.partner_shipping_id.country_id.name or ''">United States</t>
</td>
</tr>
</table>
<table t-if="object.partner_invoice_id" width="295" style="vertical-align: top; opacity: 0.8; font-size: 14px;" align="left" role="presentation">
<tr>
<td style="padding-bottom: 4px;">
<span style="font-weight:bold;">Billing</span>
</td>
</tr>
<tr>
<td>
<t t-out="object.partner_invoice_id.street or ''">1201 S Figueroa St</t><br/>
<t t-out="object.partner_invoice_id.city or ''">Los Angeles</t>
<t t-out="object.partner_invoice_id.state_id.name or ''">California</t>
<t t-out="object.partner_invoice_id.zip or ''">90015</t><br/>
<t t-out="object.partner_invoice_id.country_id.name or ''">United States</t>
</td>
</tr>
</table>
</t>
</div>
<t t-set="color" t-value="object.company_id.email_secondary_color or '#875A7B'"/>
<t t-if="'website_id' in object and object.website_id" t-set="logo_src" t-value="object.website_id.image_url(object.website_id, 'logo')"/>
<t t-else="" t-set="logo_src" t-valuef="/logo.png?company=#{object.company_id.id}"/>
<img t-att-src="logo_src" style="display: block; height: 50px; margin: 0 0 16px;" alt="標誌"/>
<p style="margin: 0 0 12px; padding: 0px; line-height: 18px; font-size: 14px;">
<t t-out="object.partner_id.display_name or ''">Johnny Tester</t> 你好!
<br/><br/>
<t t-set="tx_sudo" t-value="object.get_portal_last_transaction()"/>
你的訂單 <span style="font-weight:bold;" t-out="object.name or ''">S00049</span>
<t t-if="object.state == 'sale' or (tx_sudo and tx_sudo.state in ('done', 'authorized'))">
已獲確認。<br/>
多謝惠顧!
</t>
<t t-elif="tx_sudo and tx_sudo.state == 'pending'">
尚待處理。訂單會在收妥付款後自動確認。
<t t-if="object.reference">
你的付款參考編號為 <span style="font-weight:bold;" t-out="object.reference or ''"/>。
</t>
</t>
<br/>
<t t-set="documents" t-value="object._get_product_documents()"/>
<t t-if="documents">
<br/>
<t t-if="len(documents)>1">
以下是你可能會感興趣的一些其他文件:
</t>
<t t-else="">
以下是你可能會感興趣的另一份文件:
</t>
<ul style="margin-bottom: 0;">
<t t-foreach="documents" t-as="document">
<li style="font-size: 14px;">
<a t-out="document.ir_attachment_id.name" t-att-href="object.get_portal_url('/document/' + str(document.id))" t-att-target="target"/>
</li>
</t>
</ul>
</t>
<t t-if="not is_html_empty(object.user_id.signature)">
<div style="font-size: 14px; margin: 0 0 16px;"><t t-out="object.user_id.signature or ''">Mitchell Admin</t></div>
</t>
</p>
<t t-if="hasattr(object, 'website_id') and object.website_id">
<div style="margin: 0px; padding: 0px;">
<!-- The following loop is also used in the addons > sale > data > mail_template_data.xml file because we want the same layout. -->
<t t-foreach="object.order_line" t-as="line">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and not line.combo_item_id">
<table width="100%" style="max-width: 590px; font-size: 14px; border-collapse: collapse;" role="presentation">
<tr>
<td width="24%" style="max-width: 120px; padding: 0 10px 10px 0; vertical-align: top;">
<img t-attf-src="/web/image/product.product/{{ line.product_id.id }}/image_128" t-attf-style="width: 64px; height: {{object.website_id and object.website_id._get_product_image_ratio_height() or '64px'}}; object-fit: cover; object-position: center;" alt="產品圖片"/>
</td>
<td align="left" style="vertical-align: top; padding-bottom: 22px;">
<h3 t-attf-style="mso-line-height-rule:exactly; margin:0; font-size: 14px; {{'margin-bottom: 6px;' if line.product_type == 'combo' else ''}}">
<strong t-out="line.product_id.name or ''" t-attf-style="color: #{color};">樹木護理課程</strong>
<span t-if="line.product_id.product_template_attribute_value_ids" style="opacity: 0.5;">
<t t-out="', '.join(line.product_id.product_template_attribute_value_ids.mapped('name'))"/>
</span>
</h3>
<t t-set="combo_line_idx" t-value="0"/>
<t t-set="totalComboLines" t-value="0"/>
<t t-set="line_idx" t-value="line_index"/>
<t t-foreach="object.order_line" t-as="combo_liness">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and (combo_liness.linked_line_id.id == line.id) and line_idx == line_index">
<t t-if="combo_liness.linked_line_id.id == line.id and combo_liness.id != line.id">
<t t-set="totalComboLines" t-value="totalComboLines + 1"/>
</t>
</t>
</t>
<t t-foreach="object.order_line" t-as="combo_line">
<t t-if="(not hasattr(line, 'is_delivery') or not line.is_delivery) and (combo_line.linked_line_id.id == line.id) and combo_line.combo_item_id and line_idx == line_index">
<t t-set="borderRadiusStyle" t-value="''"/>
<t t-set="borderTopStyle" t-value="''"/>
<t t-set="borderBottomStyle" t-value="''"/>
<t t-if="combo_line.linked_line_id.id == line.id and combo_line.id != line.id">
<t t-set="combo_line_idx" t-value="combo_line_idx + 1"/>
</t>
<t t-elif="combo_line.id == line.id and line_idx != line_index">
<t t-set="combo_line_idx" t-value="0"/>
</t>
<t t-if="combo_line_idx == 1">
<t t-if="totalComboLines != 1">
<t t-set="borderRadiusStyle" t-value="'border-radius: 6px 6px 0 0;'"/>
<t t-set="borderBottomStyle" t-value="'border-bottom: none;'"/>
</t>
<t t-else="">
<t t-set="borderRadiusStyle" t-value="'border-radius: 6px;'"/>
</t>
</t>
<t t-elif="totalComboLines == combo_line_idx">
<t t-set="borderRadiusStyle" t-value="'border-radius: 0 0 6px 6px;'"/>
<t t-if="totalComboLines != 2">
<t t-set="borderTopStyle" t-value="'border-top: none;'"/>
</t>
</t>
<div t-attf-style="width: 100%; border: 1px solid #dee2e6; padding: 5px 8px; {{ borderRadiusStyle }} {{ borderBottomStyle }} {{ borderTopStyle }}">
<t t-out="combo_line.product_id.name or ''">樹木護理課程</t>
<span t-if="combo_line.product_id.product_template_attribute_value_ids" style="opacity: 0.5;">
<t t-out="', '.join(combo_line.product_id.product_template_attribute_value_ids.mapped('name'))"/>
</span>
-
<span>
<t t-out="int(combo_line.product_uom_qty) or ''">10000</t>
<t t-out="combo_line.product_uom_id.name or ''" t-if="combo_line.order_id.create_uid._has_group('uom.group_uom')"/>
</span>
<p t-if="hasattr(combo_line, 'is_rental') and combo_line.is_rental and combo_line.id == line.id" style="opacity: 0.7;">
<t t-out="combo_line._get_rental_pricing_description() or ''"/><br/>
</p>
<t t-if="(hasattr(combo_line, 'is_rental') and combo_line.is_rental) or (hasattr(combo_line, 'event_id') and combo_line.event_id) or (hasattr(combo_line, 'calendar_event_id') and combo_line.calendar_event_id)">
<t t-set="description_lines" t-value="combo_line.get_description_following_lines()"/>
<div t-if="description_lines" style="opacity: 0.7;">
<t t-foreach="description_lines" t-as="description_line">
<p t-if="description_line" t-out="description_line" style="margin: 4px 0 0;"/>
</t>
</div>
</t>
</div>
</t>
<t t-elif="not(combo_line.linked_line_id) and combo_line.id == line.id">
<p t-if="hasattr(line, 'is_rental') and line.is_rental" style="margin: 4px 0 0; opacity: 0.7;">
<t t-out="line._get_rental_pricing_description() or ''"/><br/>
</p>
<t t-if="(hasattr(combo_line, 'is_rental') and combo_line.is_rental) or (hasattr(combo_line, 'event_id') and combo_line.event_id) or (hasattr(combo_line, 'calendar_event_id') and combo_line.calendar_event_id)">
<t t-set="product_description_lines" t-value="line.get_description_following_lines()"/>
<div t-if="product_description_lines" style="opacity: 0.7;">
<t t-foreach="product_description_lines" t-as="product_description_line">
<p t-if="product_description_line" t-out="product_description_line" style="margin: 4px 0 0;"/>
</t>
</div>
</t>
</t>
</t>
<span style="display: inline-block; margin-top: 4px; padding: 4px 8px; border-radius: 20px; background-color: #e9ecef; color: #454748; font-size: 12px;">
<t t-out="int(line.product_uom_qty) or ''">10000</t>
<t t-out="line.product_uom_id.name or ''" t-if="line.order_id.create_uid._has_group('uom.group_uom')"/>
</span>
</td>
<td width="19%" align="right" style="max-width: 100px; vertical-align: top;">
<t t-if="line.product_type == 'combo'">
<span t-out="format_amount(line._get_cart_display_price(), object.currency_id) or ''">$ 10.00</span>
</t>
<t t-else="">
<span style="white-space: nowrap;">
<t t-if="hasattr(object, 'website_id') and object.website_id.show_line_subtotals_tax_selection == 'tax_excluded'">
<t t-out="format_amount(line.price_subtotal, object.currency_id) or ''">$ 10.00</t>
</t>
<t t-else="">
<t t-out="format_amount(line.price_total, object.currency_id) or ''">$ 10.00</t>
</t>
</span>
</t>
<t t-if="hasattr(line, 'recurring_invoice') and line.recurring_invoice">
<br/>
<t t-out="line.subscription_plan_id.billing_period_display_sentence or ''"/>
</t>
</td>
</tr>
</table>
</t>
</t>
</div>
<div style="margin: 10px 0 16px; padding: 0px;">
<table width="100%" t-if="hasattr(object, 'carrier_id') and object.carrier_id" style="max-width: 590px; font-size: 14px; border-spacing: 0px 4px; white-space: nowrap;" role="presentation">
<tr>
<td style="padding-top: 8px; width: 50%; border-top: 1px solid #dee2e6;" align="left">運費:</td>
<td style="padding-top: 8px; width: 50%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_delivery, object.currency_id) or ''">$ 0.00</td>
</tr>
<tr>
<td style="width: 50%;" align="left">未連稅金額:</td>
<td style="width: 50%;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
<table width="100%" t-else="" style="max-width: 590px; opacity: 0.8; font-size: 14px; border-spacing: 0px 4px; white-space: nowrap;" role="presentation">
<tr>
<td style="width: 50%; border-top: 1px solid #dee2e6;" align="left">未連稅金額:</td>
<td style="width: 50%; border-top: 1px solid #dee2e6;" align="right" t-out="format_amount(object.amount_untaxed, object.currency_id) or ''">$ 10.00</td>
</tr>
</table>
<table width="100%" style="max-width: 590px; font-size: 14px; border-spacing: 0px; white-space: nowrap;" role="presentation">
<tr>
<t t-if="object.tax_totals and object.tax_totals['subtotals']">
<t t-foreach="object.tax_totals['subtotals']" t-as="line">
<t t-foreach="line['tax_groups']" t-as="tax_line">
<tr>
<td style="width: 20%; padding-bottom: 8px;" align="left"><span t-out="tax_line['group_name']"/></td>
<td style="width: 80%;" align="right" t-out="format_amount(tax_line['tax_amount_currency'], object.currency_id) or ''">$ 0.00</td>
</tr>
</t>
</t>
</t>
</tr>
<tr>
<td style="width: 20%; padding-top: 4px; border-top: 1px solid #343a40; opacity: 0.9;" align="left"><strong>總金額:</strong></td>
<td style="width: 80%; padding-top: 4px; border-top: 1px solid #343a40; font-weight: bold; " align="right">
<span style="display: inline-block; margin-right: 4px; padding: 4px 8px; border: 1px solid #dee2e6; border-radius: 4px;">
<span style="opacity: 0.9;">付款方法:</span>
<span t-attf-style="color: #{color}; font-weight: bold;">
<t t-out="tx_sudo.provider_id.sudo().name or ''"/>
</span>
</span>
<span style="opacity: 0.9;"><t t-out="format_amount(object.amount_total, object.currency_id) or ''">$ 10.00</t></span>
</td>
</tr>
</table>
</div>
<table t-if="object.partner_shipping_id and not object.only_services" width="295" style="vertical-align: top; font-size: 14px; margin-bottom: 12px;" align="left" role="presentation">
<tr>
<td style="padding-bottom: 4px; font-weight: bold;">
<span style="opacity: 0.9;">送貨
地址方式:</span><span t-attf-style="color: {{color}}; opacity: 1;"><t t-out="object.carrier_id.name or ''"/></span>
</td>
</tr>
<tr>
<td style="opacity: 0.9;">
<t t-out="object.partner_shipping_id.street or ''">1201 S Figueroa St</t><br/>
<t t-out="object.partner_shipping_id.city or ''">Los Angeles</t>
<t t-out="object.partner_shipping_id.state_id.name or ''">California</t>
<t t-out="object.partner_shipping_id.zip or ''">90015</t><br/>
<t t-out="object.partner_shipping_id.country_id.name or ''">United States</t>
</td>
</tr>
</table>
<table t-if="object.partner_invoice_id" width="295" style="vertical-align: top; opacity: 0.8; font-size: 14px;" align="left" role="presentation">
<tr>
<td style="padding-bottom: 4px;">
<span style="font-weight:bold;">賬單地址:</span>
</td>
</tr>
<tr>
<td>
<t t-out="object.partner_invoice_id.street or ''">1201 S Figueroa St</t><br/>
<t t-out="object.partner_invoice_id.city or ''">Los Angeles</t>
<t t-out="object.partner_invoice_id.state_id.name or ''">California</t>
<t t-out="object.partner_invoice_id.zip or ''">90015</t><br/>
<t t-out="object.partner_invoice_id.country_id.name or ''">United States</t>
</td>
</tr>
</table>
</t>
</div>