From eae36c2d67b3cd6b2714fb725586d4758e1047a6 Mon Sep 17 00:00:00 2001
From: Raffael Meyer <14891507+barredterra@users.noreply.github.com>
Date: Fri, 21 Aug 2026 23:19:36 +0200
Subject: [PATCH] fix(i18n): translate get_label results at presentation with
DocType context (#57217)
---
.../accounts_settings/accounts_settings.py | 11 ++++--
.../financial_report_validation.py | 6 +++-
erpnext/accounts/doctype/gl_entry/gl_entry.py | 2 +-
.../doctype/payment_entry/payment_entry.py | 9 +++--
.../payment_reconciliation.py | 6 +++-
.../doctype/pricing_rule/pricing_rule.py | 5 ++-
erpnext/accounts/services/party_validation.py | 2 +-
erpnext/accounts/utils.py | 2 +-
erpnext/controllers/buying_controller.py | 16 +++++----
.../controllers/sales_and_purchase_return.py | 8 +++--
erpnext/controllers/selling_controller.py | 9 +++--
erpnext/controllers/stock_controller.py | 2 +-
erpnext/controllers/taxes_and_totals.py | 2 +-
erpnext/manufacturing/doctype/bom/bom.py | 4 ++-
.../doctype/work_order/services/status.py | 5 ++-
.../doctype/work_order/work_order.py | 4 ++-
.../bom_comparison_tool.js | 4 +--
erpnext/projects/doctype/task/task.py | 4 +--
erpnext/public/js/controllers/buying.js | 2 +-
.../public/js/controllers/taxes_and_totals.js | 8 ++---
erpnext/public/js/controllers/transaction.js | 12 ++++---
erpnext/public/js/queries.js | 26 ++++++++++----
erpnext/public/js/utils/barcode_scanner.js | 2 +-
erpnext/public/js/utils/sales_common.js | 4 ++-
erpnext/selling/doctype/quotation/mapper.py | 4 ++-
.../selling_settings/selling_settings.py | 11 ++++--
.../doctype/email_digest/email_digest.py | 36 ++++++++++---------
erpnext/setup/install.py | 2 +-
.../operations/install_fixtures.py | 2 +-
erpnext/setup/utils.py | 12 -------
.../doctype/delivery_note/delivery_note.py | 2 +-
erpnext/stock/doctype/item/item.py | 17 ++++++---
.../item_alternative/item_alternative.py | 2 +-
.../stock/doctype/stock_entry/stock_entry.py | 5 ++-
.../stock_ledger_entry/stock_ledger_entry.py | 2 +-
.../stock_reservation_entry.py | 2 +-
.../doctype/stock_settings/stock_settings.py | 11 ++++--
erpnext/stock/get_item_details.py | 7 ++--
.../includes/item_table_description.html | 2 +-
.../print_formats/includes/taxes.html | 2 +-
.../includes/taxes_and_charges.html | 2 +-
41 files changed, 177 insertions(+), 99 deletions(-)
diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
index 7d1848f45ef..928d621677d 100644
--- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
+++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py
@@ -204,8 +204,15 @@ class AccountsSettings(Document):
if self.add_taxes_from_item_tax_template and self.add_taxes_from_taxes_and_charges_template:
frappe.throw(
_("You cannot enable both the settings '{0}' and '{1}'.").format(
- frappe.bold(_(self.meta.get_label("add_taxes_from_item_tax_template"))),
- frappe.bold(_(self.meta.get_label("add_taxes_from_taxes_and_charges_template"))),
+ frappe.bold(
+ _(self.meta.get_label("add_taxes_from_item_tax_template"), context=self.doctype)
+ ),
+ frappe.bold(
+ _(
+ self.meta.get_label("add_taxes_from_taxes_and_charges_template"),
+ context=self.doctype,
+ )
+ ),
),
title=_("Auto Tax Settings Error"),
)
diff --git a/erpnext/accounts/doctype/financial_report_template/financial_report_validation.py b/erpnext/accounts/doctype/financial_report_template/financial_report_validation.py
index 996d05b5658..850be343385 100644
--- a/erpnext/accounts/doctype/financial_report_template/financial_report_validation.py
+++ b/erpnext/accounts/doctype/financial_report_template/financial_report_validation.py
@@ -442,7 +442,11 @@ class AccountFilterValidator(Validator):
if not isinstance(field, str) or not isinstance(operator, str):
return "Field and operator must be strings"
- display = (field if advanced_filtering else self.account_meta.get_label(field)) or field
+ display = (
+ field
+ if advanced_filtering
+ else _(self.account_meta.get_label(field), context=self.account_meta.name)
+ ) or field
if field not in account_fields:
return f"Field '{display}' is not a valid Account field"
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index de1db2cab82..7f4dae5f544 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -134,7 +134,7 @@ class GLEntry(Document):
mandatory = ["account", "voucher_type", "voucher_no", "company"]
for k in mandatory:
if not self.get(k):
- frappe.throw(_("{0} is required").format(_(self.meta.get_label(k))))
+ frappe.throw(_("{0} is required").format(_(self.meta.get_label(k), context=self.doctype)))
if not self.is_cancelled and not (self.party_type and self.party):
account_type = frappe.get_cached_value("Account", self.account, "account_type")
diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py
index fce55dc3e2c..7f96ae26210 100644
--- a/erpnext/accounts/doctype/payment_entry/payment_entry.py
+++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py
@@ -278,7 +278,8 @@ class PaymentEntry(AccountsController):
if not liability_account:
throw(
_("Please set default {0} in Company {1}").format(
- frappe.bold(frappe.get_meta("Company").get_label(fieldname)), frappe.bold(self.company)
+ frappe.bold(_(frappe.get_meta("Company").get_label(fieldname), context="Company")),
+ frappe.bold(self.company),
)
)
@@ -661,7 +662,9 @@ class PaymentEntry(AccountsController):
def validate_mandatory(self):
for field in ("paid_amount", "received_amount", "source_exchange_rate", "target_exchange_rate"):
if not self.get(field):
- frappe.throw(_("{0} is mandatory").format(_(self.meta.get_label(field))))
+ frappe.throw(
+ _("{0} is mandatory").format(_(self.meta.get_label(field), context=self.doctype))
+ )
def validate_reference_documents(self):
valid_reference_doctypes = self.get_valid_reference_doctypes()
@@ -1151,7 +1154,7 @@ class PaymentEntry(AccountsController):
if value:
continue
- label = _(frappe.get_meta("Company").get_label(fieldname))
+ label = _(frappe.get_meta("Company").get_label(fieldname), context="Company")
return frappe.msgprint(
_("Please set {0} in Company {1} to account for Exchange Gain / Loss").format(
label, get_link_to_form("Company", self.company)
diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
index 2554d4d653f..f3a33679871 100644
--- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
+++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py
@@ -647,7 +647,11 @@ class PaymentReconciliation(Document):
def check_mandatory_to_fetch(self):
for fieldname in ["company", "party_type", "party", "receivable_payable_account"]:
if not self.get(fieldname):
- frappe.throw(_("Please select {0} first").format(_(self.meta.get_label(fieldname))))
+ frappe.throw(
+ _("Please select {0} first").format(
+ _(self.meta.get_label(fieldname), context=self.doctype)
+ )
+ )
def validate_entries(self):
if not self.get("invoices"):
diff --git a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
index 8a344a7b9dc..33e5da70885 100644
--- a/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
+++ b/erpnext/accounts/doctype/pricing_rule/pricing_rule.py
@@ -187,7 +187,10 @@ class PricingRule(Document):
tocheck = frappe.scrub(self.get("applicable_for", ""))
if tocheck and not self.get(tocheck):
- throw(_("{0} is required").format(_(self.meta.get_label(tocheck))), frappe.MandatoryError)
+ throw(
+ _("{0} is required").format(_(self.meta.get_label(tocheck), context=self.doctype)),
+ frappe.MandatoryError,
+ )
if self.apply_rule_on_other:
o_field = "other_" + frappe.scrub(self.apply_rule_on_other)
diff --git a/erpnext/accounts/services/party_validation.py b/erpnext/accounts/services/party_validation.py
index a6ec9716840..bf80ecc30db 100644
--- a/erpnext/accounts/services/party_validation.py
+++ b/erpnext/accounts/services/party_validation.py
@@ -183,7 +183,7 @@ class PartyValidator:
):
frappe.throw(
_("{0} does not belong to the Company {1}.").format(
- _(doc.meta.get_label(field)), frappe.bold(doc.company)
+ _(doc.meta.get_label(field), context=doc.doctype), frappe.bold(doc.company)
)
)
diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py
index 8e6197dd8b5..71eb4a92589 100644
--- a/erpnext/accounts/utils.py
+++ b/erpnext/accounts/utils.py
@@ -1168,7 +1168,7 @@ def get_company_default(company: str, fieldname: str, ignore_validation: bool =
if not ignore_validation and not value:
throw(
_("Please set default {0} in Company {1}").format(
- _(frappe.get_meta("Company").get_label(fieldname)), company
+ _(frappe.get_meta("Company").get_label(fieldname), context="Company"), company
)
)
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 1a85031c2fc..b5a65c2f9cb 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -304,8 +304,8 @@ class BuyingController(SubcontractingController):
frappe.throw(
_("Row #{idx}: {from_warehouse_field} and {to_warehouse_field} cannot be same.").format(
idx=item.idx,
- from_warehouse_field=_(item.meta.get_label("from_warehouse")),
- to_warehouse_field=_(item.meta.get_label("warehouse")),
+ from_warehouse_field=_(item.meta.get_label("from_warehouse"), context=item.doctype),
+ to_warehouse_field=_(item.meta.get_label("warehouse"), context=item.doctype),
)
)
@@ -710,7 +710,7 @@ class BuyingController(SubcontractingController):
frappe.throw(
_("Row #{idx}: {field_label} is mandatory.").format(
idx=d.idx,
- field_label=_(d.meta.get_label("conversion_factor")),
+ field_label=_(d.meta.get_label("conversion_factor"), context=d.doctype),
)
)
d.stock_qty = flt(d.qty) * flt(d.conversion_factor)
@@ -757,7 +757,9 @@ class BuyingController(SubcontractingController):
frappe.throw(
_("Row #{idx}: {field_label} can not be negative for item {item_code}.").format(
idx=item_row["idx"],
- field_label=_(frappe.get_meta(item_row.doctype).get_label(fieldname)),
+ field_label=_(
+ frappe.get_meta(item_row.doctype).get_label(fieldname), context=item_row.doctype
+ ),
item_code=frappe.bold(item_row["item_code"]),
)
)
@@ -1210,14 +1212,14 @@ class BuyingController(SubcontractingController):
frappe.throw(
_("Row #{idx}: {schedule_date} cannot be before {transaction_date}.").format(
idx=d.idx,
- schedule_date=_(self.meta.get_label("schedule_date")),
- transaction_date=_(self.meta.get_label("transaction_date")),
+ schedule_date=_(self.meta.get_label("schedule_date"), context=self.doctype),
+ transaction_date=_(self.meta.get_label("transaction_date"), context=self.doctype),
)
)
else:
frappe.throw(
_("Please enter the {schedule_date}.").format(
- schedule_date=_(self.meta.get_label("schedule_date"))
+ schedule_date=_(self.meta.get_label("schedule_date"), context=self.doctype)
)
)
diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py
index c43dce12202..d3798303c07 100644
--- a/erpnext/controllers/sales_and_purchase_return.py
+++ b/erpnext/controllers/sales_and_purchase_return.py
@@ -31,7 +31,11 @@ def validate_return(doc):
def validate_return_against(doc):
if not frappe.db.exists(doc.doctype, doc.return_against):
- frappe.throw(_("Invalid {0}: {1}").format(doc.meta.get_label("return_against"), doc.return_against))
+ frappe.throw(
+ _("Invalid {0}: {1}").format(
+ _(doc.meta.get_label("return_against"), context=doc.doctype), doc.return_against
+ )
+ )
else:
ref_doc = frappe.get_doc(doc.doctype, doc.return_against)
@@ -40,7 +44,7 @@ def validate_return_against(doc):
if ref_doc.get(party_type) != doc.get(party_type):
frappe.throw(
_("The {0} {1} does not match with the {0} {2} in the {3} {4}").format(
- doc.meta.get_label(party_type),
+ _(doc.meta.get_label(party_type), context=doc.doctype),
bold(doc.get(party_type)),
bold(ref_doc.get(party_type)),
ref_doc.doctype,
diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py
index 034256087e5..549fb12d0e6 100644
--- a/erpnext/controllers/selling_controller.py
+++ b/erpnext/controllers/selling_controller.py
@@ -215,7 +215,7 @@ class SellingController(StockController):
if not (0 <= self.commission_rate <= 100.0):
throw(
"{} {}".format(
- _(self.meta.get_label("commission_rate")),
+ _(self.meta.get_label("commission_rate"), context=self.doctype),
_("must be between 0 and 100"),
)
)
@@ -306,7 +306,12 @@ class SellingController(StockController):
bold(ref_rate_field),
bold("net rate"),
bold(rate),
- bold(frappe.get_meta("Selling Settings").get_label("validate_selling_price")),
+ bold(
+ _(
+ frappe.get_meta("Selling Settings").get_label("validate_selling_price"),
+ context="Selling Settings",
+ )
+ ),
get_link_to_form("Selling Settings"),
),
title=_("Invalid Selling Price"),
diff --git a/erpnext/controllers/stock_controller.py b/erpnext/controllers/stock_controller.py
index 190dba7ed02..583ea7dbb91 100644
--- a/erpnext/controllers/stock_controller.py
+++ b/erpnext/controllers/stock_controller.py
@@ -103,7 +103,7 @@ class StockController(AccountsController):
_("Row #{0}: Item {1} has zero rate but '{2}' is not enabled.").format(
item.idx,
frappe.bold(item.item_code),
- item.meta.get_label("allow_zero_valuation_rate"),
+ _(item.meta.get_label("allow_zero_valuation_rate"), context=item.doctype),
),
indicator="orange",
)
diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py
index a7943b8e80a..b2dd3adb202 100644
--- a/erpnext/controllers/taxes_and_totals.py
+++ b/erpnext/controllers/taxes_and_totals.py
@@ -157,7 +157,7 @@ class calculate_taxes_and_totals:
validate_conversion_rate(
self.doc.currency,
self.doc.conversion_rate,
- self.doc.meta.get_label("conversion_rate"),
+ _(self.doc.meta.get_label("conversion_rate"), context=self.doc.doctype),
self.doc.company,
)
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 5222dd796de..109a3d02876 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -1018,7 +1018,9 @@ class BOM(WebsiteGenerator):
self.transfer_material_against = "Work Order"
if not self.transfer_material_against and not self.track_semi_finished_goods and not self.is_new():
frappe.throw(
- _("Setting {0} is required").format(_(self.meta.get_label("transfer_material_against"))),
+ _("Setting {0} is required").format(
+ _(self.meta.get_label("transfer_material_against"), context=self.doctype)
+ ),
title=_("Missing value"),
)
diff --git a/erpnext/manufacturing/doctype/work_order/services/status.py b/erpnext/manufacturing/doctype/work_order/services/status.py
index 6c4163fae12..bac42b203a2 100644
--- a/erpnext/manufacturing/doctype/work_order/services/status.py
+++ b/erpnext/manufacturing/doctype/work_order/services/status.py
@@ -203,7 +203,10 @@ class StatusService:
if qty > completed_qty:
frappe.throw(
_("{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}").format(
- _(self.doc.meta.get_label(fieldname)), qty, completed_qty, self.doc.name
+ _(self.doc.meta.get_label(fieldname), context=self.doc.doctype),
+ qty,
+ completed_qty,
+ self.doc.name,
),
StockOverProductionError,
)
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py
index 3101c0dc30b..65dee07ddea 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order.py
@@ -941,7 +941,9 @@ class WorkOrder(Document):
self.transfer_material_against = "Work Order"
if not self.transfer_material_against:
frappe.throw(
- _("Setting {0} is required").format(_(self.meta.get_label("transfer_material_against"))),
+ _("Setting {0} is required").format(
+ _(self.meta.get_label("transfer_material_against"), context=self.doctype)
+ ),
title=_("Missing value"),
)
diff --git a/erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js b/erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js
index 753fb4e896d..dcca53c1016 100644
--- a/erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js
+++ b/erpnext/manufacturing/page/bom_comparison_tool/bom_comparison_tool.js
@@ -95,7 +95,7 @@ erpnext.BOMComparisonTool = class BOMComparisonTool {
let [fieldname, value1, value2] = change;
return `
- | ${frappe.meta.get_label(doctype, fieldname)} |
+ ${__(frappe.meta.get_label(doctype, fieldname), null, doctype)} |
${frappe.utils.escape_html(cstr(value1))} |
${frappe.utils.escape_html(cstr(value2))} |
@@ -146,7 +146,7 @@ erpnext.BOMComparisonTool = class BOMComparisonTool {
return `
${th}
- | ${frappe.meta.get_label(child_doctype, fieldname)} |
+ ${__(frappe.meta.get_label(child_doctype, fieldname), null, child_doctype)} |
${frappe.utils.escape_html(cstr(value1))} |
${frappe.utils.escape_html(cstr(value2))} |
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index f8750bf2613..3502cca8275 100755
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -136,7 +136,7 @@ class Task(NestedSet):
frappe.throw(
_("{0}'s {1} cannot be after {2}'s Expected End Date.").format(
get_link_to_form("Task", self.name),
- _(self.meta.get_label(fieldname)),
+ _(self.meta.get_label(fieldname), context=self.doctype),
get_link_to_form("Project", self.project),
),
frappe.exceptions.InvalidDates,
@@ -146,7 +146,7 @@ class Task(NestedSet):
frappe.throw(
_("{0}'s {1} cannot be before {2}'s Expected Start Date.").format(
get_link_to_form("Task", self.name),
- _(self.meta.get_label(fieldname)),
+ _(self.meta.get_label(fieldname), context=self.doctype),
get_link_to_form("Project", self.project),
),
frappe.exceptions.InvalidDates,
diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js
index f34ff7ba36c..f5a9da2ad64 100644
--- a/erpnext/public/js/controllers/buying.js
+++ b/erpnext/public/js/controllers/buying.js
@@ -263,7 +263,7 @@ erpnext.buying = {
frappe.msgprint(
__("Row #{0}: {1} can not be negative for item {2}", [
item.idx,
- __(frappe.meta.get_label(cdt, fieldnames[i], cdn)),
+ __(frappe.meta.get_label(cdt, fieldnames[i], cdn), null, cdt),
item.item_code,
])
);
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index 30dcfb0e83a..60aef4dbba7 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -122,10 +122,10 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
this.frm.doc.conversion_rate,
cur_frm ? precision("conversion_rate") : 9
);
- var conversion_rate_label = frappe.meta.get_label(
- this.frm.doc.doctype,
- "conversion_rate",
- this.frm.doc.name
+ var conversion_rate_label = __(
+ frappe.meta.get_label(this.frm.doc.doctype, "conversion_rate", this.frm.doc.name),
+ null,
+ this.frm.doc.doctype
);
var company_currency = this.get_company_currency();
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index 015c76c269b..89877b5db17 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -1438,17 +1438,17 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
) {
const to_clear = [];
if (doc.payment_terms_template) {
- to_clear.push(__(frappe.meta.get_label(cdt, "payment_terms_template")));
+ to_clear.push(__(frappe.meta.get_label(cdt, "payment_terms_template"), null, cdt));
}
if (doc.payment_schedule?.length) {
- to_clear.push(__(frappe.meta.get_label(cdt, "payment_schedule")));
+ to_clear.push(__(frappe.meta.get_label(cdt, "payment_schedule"), null, cdt));
}
frappe.confirm(
__(
"For the new {0} to take effect, would you like to clear the current {1}?",
- [__(frappe.meta.get_label(cdt, "due_date")), frappe.utils.comma_and(to_clear)],
+ [__(frappe.meta.get_label(cdt, "due_date"), null, cdt), frappe.utils.comma_and(to_clear)],
"Clear payment terms template and/or payment schedule when due date is changed"
),
() => {
@@ -2646,7 +2646,11 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
if (!me.frm.doc[fieldname]) {
frappe.msgprint(
__("Please specify {0}. It is needed to fetch Item Details.", [
- __(frappe.meta.get_label(me.frm.doc.doctype, fieldname, me.frm.doc.name)),
+ __(
+ frappe.meta.get_label(me.frm.doc.doctype, fieldname, me.frm.doc.name),
+ null,
+ me.frm.doc.doctype
+ ),
])
);
valid = false;
diff --git a/erpnext/public/js/queries.js b/erpnext/public/js/queries.js
index a329f20615e..f374d4a6817 100644
--- a/erpnext/public/js/queries.js
+++ b/erpnext/public/js/queries.js
@@ -46,7 +46,7 @@ $.extend(erpnext.queries, {
cur_frm.scroll_to_field("customer");
frappe.show_alert({
message: __("Please set {0} first.", [
- __(frappe.meta.get_label(doc.doctype, "customer", doc.name)),
+ __(frappe.meta.get_label(doc.doctype, "customer", doc.name), null, doc.doctype),
]),
indicator: "orange",
});
@@ -61,7 +61,11 @@ $.extend(erpnext.queries, {
cur_frm.scroll_to_field(frappe.dynamic_link.fieldname);
frappe.show_alert({
message: __("Please set {0} first.", [
- __(frappe.meta.get_label(doc.doctype, frappe.dynamic_link.fieldname, doc.name)),
+ __(
+ frappe.meta.get_label(doc.doctype, frappe.dynamic_link.fieldname, doc.name),
+ null,
+ doc.doctype
+ ),
]),
indicator: "orange",
});
@@ -79,7 +83,11 @@ $.extend(erpnext.queries, {
company_contact_query: function (doc) {
if (!doc.company) {
- frappe.throw(__("Please set {0}", [__(frappe.meta.get_label(doc.doctype, "company", doc.name))]));
+ frappe.throw(
+ __("Please set {0}", [
+ __(frappe.meta.get_label(doc.doctype, "company", doc.name), null, doc.doctype),
+ ])
+ );
}
return {
@@ -94,7 +102,11 @@ $.extend(erpnext.queries, {
cur_frm.scroll_to_field(frappe.dynamic_link.fieldname);
frappe.show_alert({
message: __("Please set {0} first.", [
- __(frappe.meta.get_label(doc.doctype, frappe.dynamic_link.fieldname, doc.name)),
+ __(
+ frappe.meta.get_label(doc.doctype, frappe.dynamic_link.fieldname, doc.name),
+ null,
+ doc.doctype
+ ),
]),
indicator: "orange",
});
@@ -115,7 +127,7 @@ $.extend(erpnext.queries, {
cur_frm.scroll_to_field("company");
frappe.show_alert({
message: __("Please set {0} first.", [
- __(frappe.meta.get_label(doc.doctype, "company", doc.name)),
+ __(frappe.meta.get_label(doc.doctype, "company", doc.name), null, doc.doctype),
]),
indicator: "orange",
});
@@ -146,7 +158,7 @@ $.extend(erpnext.queries, {
cur_frm.scroll_to_field("supplier");
frappe.show_alert({
message: __("Please set {0} first.", [
- __(frappe.meta.get_label(doc.doctype, "supplier", doc.name)),
+ __(frappe.meta.get_label(doc.doctype, "supplier", doc.name), null, doc.doctype),
]),
indicator: "orange",
});
@@ -160,7 +172,7 @@ $.extend(erpnext.queries, {
cur_frm.scroll_to_field("lead");
frappe.show_alert({
message: __("Please specify a {0} first.", [
- __(frappe.meta.get_label(doc.doctype, "lead", doc.name)),
+ __(frappe.meta.get_label(doc.doctype, "lead", doc.name), null, doc.doctype),
]),
indicator: "orange",
});
diff --git a/erpnext/public/js/utils/barcode_scanner.js b/erpnext/public/js/utils/barcode_scanner.js
index 318722cb798..8f0c618cf97 100644
--- a/erpnext/public/js/utils/barcode_scanner.js
+++ b/erpnext/public/js/utils/barcode_scanner.js
@@ -529,7 +529,7 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
this.show_alert(
__("{0} will be set as the {1} in subsequently scanned items", [
__(warehouse).bold(),
- __(warehouse_field_label).bold(),
+ __(warehouse_field_label, null, cur_grid.doctype).bold(),
]),
"green",
6
diff --git a/erpnext/public/js/utils/sales_common.js b/erpnext/public/js/utils/sales_common.js
index bbce4b2024f..68a6bc8de0b 100644
--- a/erpnext/public/js/utils/sales_common.js
+++ b/erpnext/public/js/utils/sales_common.js
@@ -358,7 +358,9 @@ erpnext.sales_common = {
this.frm.doc.doctype,
"commission_rate",
this.frm.doc.name
- )
+ ),
+ null,
+ this.frm.doc.doctype
),
])
);
diff --git a/erpnext/selling/doctype/quotation/mapper.py b/erpnext/selling/doctype/quotation/mapper.py
index 014e76af956..732cb475792 100644
--- a/erpnext/selling/doctype/quotation/mapper.py
+++ b/erpnext/selling/doctype/quotation/mapper.py
@@ -257,7 +257,9 @@ def handle_mandatory_error(e, customer, lead_name):
from frappe.utils import get_link_to_form
mandatory_fields = e.args[0].split(":")[1].split(",")
- mandatory_fields = [_(customer.meta.get_label(field.strip())) for field in mandatory_fields]
+ mandatory_fields = [
+ _(customer.meta.get_label(field.strip()), context=customer.doctype) for field in mandatory_fields
+ ]
frappe.local.message_log = []
message = _("Could not auto create Customer due to the following missing mandatory field(s):") + "
"
diff --git a/erpnext/selling/doctype/selling_settings/selling_settings.py b/erpnext/selling/doctype/selling_settings/selling_settings.py
index 3ad49c8c9ca..daf185a9e0d 100644
--- a/erpnext/selling/doctype/selling_settings/selling_settings.py
+++ b/erpnext/selling/doctype/selling_settings/selling_settings.py
@@ -118,8 +118,15 @@ class SellingSettings(Document):
_(
"You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted into the transaction price list."
).format(
- "{}".format(_(self.meta.get_label("fallback_to_default_price_list"))),
- "{}".format(_(stock_meta.get_label("auto_insert_price_list_rate_if_missing"))),
+ "{}".format(
+ _(self.meta.get_label("fallback_to_default_price_list"), context=self.doctype)
+ ),
+ "{}".format(
+ _(
+ stock_meta.get_label("auto_insert_price_list_rate_if_missing"),
+ context=stock_meta.name,
+ )
+ ),
frappe.bold(_("Stock Settings")),
)
)
diff --git a/erpnext/setup/doctype/email_digest/email_digest.py b/erpnext/setup/doctype/email_digest/email_digest.py
index 5dfc1f03b21..3b28ed93d36 100644
--- a/erpnext/setup/doctype/email_digest/email_digest.py
+++ b/erpnext/setup/doctype/email_digest/email_digest.py
@@ -393,7 +393,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"General Ledger",
- _(self.meta.get_label("income")),
+ _(self.meta.get_label("income"), context=self.doctype),
filters={
"from_date": self.future_from_date,
"to_date": self.future_to_date,
@@ -425,7 +425,7 @@ class EmailDigest(Document):
filters = {"currency": self.currency}
label = get_link_to_report(
"Profit and Loss Statement",
- label=_(self.meta.get_label(root_type + "_year_to_date")),
+ label=_(self.meta.get_label(root_type + "_year_to_date"), context=self.doctype),
filters=filters,
)
@@ -433,7 +433,7 @@ class EmailDigest(Document):
filters = {"currency": self.currency}
label = get_link_to_report(
"Profit and Loss Statement",
- label=_(self.meta.get_label(root_type + "_year_to_date")),
+ label=_(self.meta.get_label(root_type + "_year_to_date"), context=self.doctype),
filters=filters,
)
@@ -464,7 +464,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"General Ledger",
- _(self.meta.get_label("expenses_booked")),
+ _(self.meta.get_label("expenses_booked"), context=self.doctype),
filters={
"company": self.company,
"from_date": self.future_from_date,
@@ -506,7 +506,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"Sales Order",
- label=_(self.meta.get_label("sales_orders_to_bill")),
+ label=_(self.meta.get_label("sales_orders_to_bill"), context=self.doctype),
report_type="Report Builder",
doctype="Sales Order",
filters={
@@ -540,7 +540,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"Sales Order",
- label=_(self.meta.get_label("sales_orders_to_deliver")),
+ label=_(self.meta.get_label("sales_orders_to_deliver"), context=self.doctype),
report_type="Report Builder",
doctype="Sales Order",
filters={
@@ -574,7 +574,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"Purchase Order",
- label=_(self.meta.get_label("purchase_orders_to_receive")),
+ label=_(self.meta.get_label("purchase_orders_to_receive"), context=self.doctype),
report_type="Report Builder",
doctype="Purchase Order",
filters={
@@ -608,7 +608,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"Purchase Order",
- label=_(self.meta.get_label("purchase_orders_to_bill")),
+ label=_(self.meta.get_label("purchase_orders_to_bill"), context=self.doctype),
report_type="Report Builder",
doctype="Purchase Order",
filters={
@@ -660,7 +660,9 @@ class EmailDigest(Document):
"company": self.company,
}
label = get_link_to_report(
- "Account Balance", label=_(self.meta.get_label(fieldname)), filters=filters
+ "Account Balance",
+ label=_(self.meta.get_label(fieldname), context=self.doctype),
+ filters=filters,
)
else:
filters = {
@@ -670,7 +672,9 @@ class EmailDigest(Document):
"company": self.company,
}
label = get_link_to_report(
- "Account Balance", label=_(self.meta.get_label(fieldname)), filters=filters
+ "Account Balance",
+ label=_(self.meta.get_label(fieldname), context=self.doctype),
+ filters=filters,
)
return {"label": label, "value": balance, "last_value": prev_balance}
@@ -678,17 +682,17 @@ class EmailDigest(Document):
if account_type == "Payable":
label = get_link_to_report(
"Accounts Payable",
- label=_(self.meta.get_label(fieldname)),
+ label=_(self.meta.get_label(fieldname), context=self.doctype),
filters={"report_date": self.future_to_date, "company": self.company},
)
elif account_type == "Receivable":
label = get_link_to_report(
"Accounts Receivable",
- label=_(self.meta.get_label(fieldname)),
+ label=_(self.meta.get_label(fieldname), context=self.doctype),
filters={"report_date": self.future_to_date, "company": self.company},
)
else:
- label = _(self.meta.get_label(fieldname))
+ label = _(self.meta.get_label(fieldname), context=self.doctype)
return {"label": label, "value": balance, "last_value": prev_balance, "count": count}
@@ -760,7 +764,7 @@ class EmailDigest(Document):
)[0]
return {
- "label": self.meta.get_label(fieldname),
+ "label": _(self.meta.get_label(fieldname), context=self.doctype),
"value": value,
"billed_value": billed_value,
"delivered_value": delivered_value,
@@ -793,7 +797,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"Quotation",
- label=_(self.meta.get_label(fieldname)),
+ label=_(self.meta.get_label(fieldname), context=self.doctype),
report_type="Report Builder",
doctype="Quotation",
filters={
@@ -824,7 +828,7 @@ class EmailDigest(Document):
label = get_link_to_report(
doc_type,
- label=_(self.meta.get_label(fieldname)),
+ label=_(self.meta.get_label(fieldname), context=self.doctype),
report_type="Report Builder",
filters=filters,
doctype=doc_type,
diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py
index c2842c02c49..1a1608b7750 100644
--- a/erpnext/setup/install.py
+++ b/erpnext/setup/install.py
@@ -5,11 +5,11 @@
import os
import frappe
+from frappe import N_ as _
from frappe.custom.doctype.custom_field.custom_field import create_custom_fields
from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
from erpnext.setup.doctype.incoterm.incoterm import create_incoterms
-from erpnext.setup.utils import identity as _
from .default_success_action import get_default_success_action
diff --git a/erpnext/setup/setup_wizard/operations/install_fixtures.py b/erpnext/setup/setup_wizard/operations/install_fixtures.py
index 42821707035..9e1875b2c9c 100644
--- a/erpnext/setup/setup_wizard/operations/install_fixtures.py
+++ b/erpnext/setup/setup_wizard/operations/install_fixtures.py
@@ -7,6 +7,7 @@ import os
from pathlib import Path
import frappe
+from frappe import N_ as _
from frappe.desk.doctype.global_search_settings.global_search_settings import (
update_global_search_doctypes,
)
@@ -16,7 +17,6 @@ from frappe.utils.nestedset import get_root_of
from erpnext.accounts.doctype.account.account import RootNotEditable
from erpnext.regional.address_template.setup import set_up_address_templates
-from erpnext.setup.utils import identity as _
def read_lines(filename: str) -> list[str]:
diff --git a/erpnext/setup/utils.py b/erpnext/setup/utils.py
index 3e0decd8f16..cf0def31d19 100644
--- a/erpnext/setup/utils.py
+++ b/erpnext/setup/utils.py
@@ -210,15 +210,3 @@ def welcome_email():
site_name = get_default_company() or "ERPNext"
title = _("Welcome to {0}").format(site_name)
return title
-
-
-def identity(x, *args, **kwargs):
- """Used for redefining the translation function to return the string as is.
-
- We want to create english records but still mark the strings as translatable.
- E.g. when the respective DocTypes have 'Translate Link Fields' enabled or
- we're creating custom fields.
-
- Use like this: `from erpnext.setup.utils import identity as _`
- """
- return x
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 4f4ac843a27..4f53d00a453 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -370,7 +370,7 @@ class DeliveryNote(SellingController):
if missing_label and missing_label != "No Label":
errors.append(
_("The field {0} in row {1} is not set").format(
- frappe.bold(_(missing_label)), frappe.bold(item.idx)
+ frappe.bold(_(missing_label, context=item.doctype)), frappe.bold(item.idx)
)
)
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index 3dfdb9c0221..00f67f5e7d2 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -272,7 +272,10 @@ class Item(Document):
_(
'Image in the description has been removed. To disable this behavior, uncheck "{0}" in {1}.'
).format(
- frappe.get_meta("Stock Settings").get_label("clean_description_html"),
+ _(
+ frappe.get_meta("Stock Settings").get_label("clean_description_html"),
+ context="Stock Settings",
+ ),
get_link_to_form("Stock Settings"),
),
alert=True,
@@ -424,8 +427,8 @@ class Item(Document):
frappe.throw(
_("Taxes row #{0}: {1} cannot be smaller than {2}").format(
tax.idx,
- bold(_(tax.meta.get_label("maximum_net_rate"))),
- bold(_(tax.meta.get_label("minimum_net_rate"))),
+ bold(_(tax.meta.get_label("maximum_net_rate"), context=tax.doctype)),
+ bold(_(tax.meta.get_label("minimum_net_rate"), context=tax.doctype)),
)
)
@@ -702,7 +705,9 @@ class Item(Document):
if new_properties != [cstr(self.get(field)) for field in field_list]:
msg = _("To merge, following properties must be same for both items")
- msg += ": \n" + ", ".join([_(self.meta.get_label(fld)) for fld in field_list])
+ msg += ": \n" + ", ".join(
+ [_(self.meta.get_label(fld), context=self.doctype) for fld in field_list]
+ )
frappe.throw(msg, title=_("Cannot Merge"), exc=DataValidationError)
def validate_duplicate_product_bundles_before_merge(self, old_name, new_name):
@@ -1134,7 +1139,9 @@ class Item(Document):
return
if linked_doc := self._get_linked_submitted_documents(changed_fields):
- changed_field_labels = [frappe.bold(_(self.meta.get_label(f))) for f in changed_fields]
+ changed_field_labels = [
+ frappe.bold(_(self.meta.get_label(f), context=self.doctype)) for f in changed_fields
+ ]
msg = _(
"As there are existing submitted transactions against item {0}, you can not change the value of {1}."
).format(self.name, ", ".join(changed_field_labels))
diff --git a/erpnext/stock/doctype/item_alternative/item_alternative.py b/erpnext/stock/doctype/item_alternative/item_alternative.py
index ae536ab2a25..8d8fce14dcc 100644
--- a/erpnext/stock/doctype/item_alternative/item_alternative.py
+++ b/erpnext/stock/doctype/item_alternative/item_alternative.py
@@ -56,7 +56,7 @@ class ItemAlternative(Document):
frappe.msgprint(
_("The value of {0} differs between Items {1} and {2}").format(
- frappe.bold(item_meta.get_label(field)),
+ frappe.bold(_(item_meta.get_label(field), context="Item")),
frappe.bold(self.alternative_item_code),
frappe.bold(self.item_code),
),
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 386f49b36ed..207f2c4804e 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -805,7 +805,10 @@ class StockEntry(StockController, SubcontractingInwardController):
def _validate_no_raw_materials_in_manufacture_entry(self, settings):
for item in self.items:
if not item.is_finished_item and not item.secondary_item_type and not item.is_legacy_scrap_item:
- label = frappe.get_meta(settings.doctype).get_label("get_rm_cost_from_consumption_entry")
+ label = _(
+ frappe.get_meta(settings.doctype).get_label("get_rm_cost_from_consumption_entry"),
+ context=settings.doctype,
+ )
frappe.throw(
_(
"Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials."
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index f20f078f0f3..ae346a313dd 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -195,7 +195,7 @@ class StockLedgerEntry(Document):
mandatory = ["warehouse", "posting_date", "voucher_type", "voucher_no", "company"]
for k in mandatory:
if not self.get(k):
- frappe.throw(_("{0} is required").format(_(self.meta.get_label(k))))
+ frappe.throw(_("{0} is required").format(_(self.meta.get_label(k), context=self.doctype)))
if self.voucher_type != "Stock Reconciliation" and not self.actual_qty:
frappe.throw(_("Actual Qty is mandatory"))
diff --git a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
index e7abb0be3ea..2e88a83127a 100644
--- a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
+++ b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
@@ -245,7 +245,7 @@ class StockReservationEntry(Document):
]
for d in mandatory:
if not self.get(d):
- msg = _("{0} is required").format(_(self.meta.get_label(d)))
+ msg = _("{0} is required").format(_(self.meta.get_label(d), context=self.doctype))
frappe.throw(msg)
def validate_group_warehouse(self) -> None:
diff --git a/erpnext/stock/doctype/stock_settings/stock_settings.py b/erpnext/stock/doctype/stock_settings/stock_settings.py
index c986a4fa115..c6f1ccfa358 100644
--- a/erpnext/stock/doctype/stock_settings/stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/stock_settings.py
@@ -264,8 +264,15 @@ class StockSettings(Document):
_(
"You have enabled {0} and {1} in {2}. This can lead to prices from the default price list being inserted in the transaction price list."
).format(
- "{}".format(_(self.meta.get_label("auto_insert_price_list_rate_if_missing"))),
- "{}".format(_(selling_meta.get_label("fallback_to_default_price_list"))),
+ "{}".format(
+ _(self.meta.get_label("auto_insert_price_list_rate_if_missing"), context=self.doctype)
+ ),
+ "{}".format(
+ _(
+ selling_meta.get_label("fallback_to_default_price_list"),
+ context=selling_meta.name,
+ )
+ ),
frappe.bold(_("Selling Settings")),
)
)
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 5c5a35bd29a..4c48bbea0cd 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -1440,7 +1440,10 @@ def validate_conversion_rate(ctx: frappe._dict, meta):
# validate currency conversion rate
validate_conversion_rate(
- ctx.currency, ctx.conversion_rate, meta.get_label("conversion_rate"), ctx.company
+ ctx.currency,
+ ctx.conversion_rate,
+ _(meta.get_label("conversion_rate"), context=meta.name),
+ ctx.company,
)
ctx.conversion_rate = flt(
@@ -1461,7 +1464,7 @@ def validate_conversion_rate(ctx: frappe._dict, meta):
validate_conversion_rate(
ctx.price_list_currency,
ctx.plc_conversion_rate,
- meta.get_label("plc_conversion_rate"),
+ _(meta.get_label("plc_conversion_rate"), context=meta.name),
ctx.company,
)
diff --git a/erpnext/templates/print_formats/includes/item_table_description.html b/erpnext/templates/print_formats/includes/item_table_description.html
index 4ad3d6dd1d1..5fabddbc40e 100644
--- a/erpnext/templates/print_formats/includes/item_table_description.html
+++ b/erpnext/templates/print_formats/includes/item_table_description.html
@@ -38,7 +38,7 @@
{%- for fieldname in columns -%}
{% if doc.get(fieldname) and doc.in_format_data(fieldname) -%}
- {{ _(doc.meta.get_label(fieldname)) }}:
+ {{ _(doc.meta.get_label(fieldname), context=doc.doctype) }}:
{{ doc.get_formatted(fieldname, translated=True) }}
{% endif %}
diff --git a/erpnext/templates/print_formats/includes/taxes.html b/erpnext/templates/print_formats/includes/taxes.html
index 1935542e366..27397fc7ee8 100644
--- a/erpnext/templates/print_formats/includes/taxes.html
+++ b/erpnext/templates/print_formats/includes/taxes.html
@@ -2,7 +2,7 @@
{%- if doc.discount_amount -%}
-
+
- {{ doc.get_formatted("discount_amount", doc) }}
diff --git a/erpnext/templates/print_formats/includes/taxes_and_charges.html b/erpnext/templates/print_formats/includes/taxes_and_charges.html
index 0d8e3834d81..da076d5daf5 100644
--- a/erpnext/templates/print_formats/includes/taxes_and_charges.html
+++ b/erpnext/templates/print_formats/includes/taxes_and_charges.html
@@ -11,7 +11,7 @@
{%- macro render_discount_amount(doc) -%}
{%- if doc.discount_amount -%}
- {{ render_row(_(doc.meta.get_label('discount_amount')), '- ' + doc.get_formatted("discount_amount", doc)) }}
+ {{ render_row(_(doc.meta.get_label('discount_amount'), context=doc.doctype), '- ' + doc.get_formatted("discount_amount", doc)) }}
{%- endif -%}
{%- endmacro -%}