fix(i18n): translate get_label results at presentation with DocType context (#57217)

This commit is contained in:
Raffael Meyer
2026-08-21 23:19:36 +02:00
committed by GitHub
parent 275844d496
commit eae36c2d67
41 changed files with 177 additions and 99 deletions

View File

@@ -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"),
)

View File

@@ -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"

View File

@@ -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")

View File

@@ -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)

View File

@@ -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"):

View File

@@ -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)

View File

@@ -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)
)
)

View File

@@ -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
)
)

View File

@@ -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)
)
)

View File

@@ -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,

View File

@@ -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"),

View File

@@ -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",
)

View File

@@ -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,
)

View File

@@ -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"),
)

View File

@@ -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,
)

View File

@@ -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"),
)

View File

@@ -95,7 +95,7 @@ erpnext.BOMComparisonTool = class BOMComparisonTool {
let [fieldname, value1, value2] = change;
return `
<tr>
<td>${frappe.meta.get_label(doctype, fieldname)}</td>
<td>${__(frappe.meta.get_label(doctype, fieldname), null, doctype)}</td>
<td>${frappe.utils.escape_html(cstr(value1))}</td>
<td>${frappe.utils.escape_html(cstr(value2))}</td>
</tr>
@@ -146,7 +146,7 @@ erpnext.BOMComparisonTool = class BOMComparisonTool {
return `
<tr>
${th}
<td>${frappe.meta.get_label(child_doctype, fieldname)}</td>
<td>${__(frappe.meta.get_label(child_doctype, fieldname), null, child_doctype)}</td>
<td>${frappe.utils.escape_html(cstr(value1))}</td>
<td>${frappe.utils.escape_html(cstr(value2))}</td>
</tr>

View File

@@ -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,

View File

@@ -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,
])
);

View File

@@ -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();

View File

@@ -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;

View File

@@ -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",
});

View File

@@ -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

View File

@@ -358,7 +358,9 @@ erpnext.sales_common = {
this.frm.doc.doctype,
"commission_rate",
this.frm.doc.name
)
),
null,
this.frm.doc.doctype
),
])
);

View File

@@ -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):") + "<br>"

View File

@@ -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(
"<i>{}</i>".format(_(self.meta.get_label("fallback_to_default_price_list"))),
"<i>{}</i>".format(_(stock_meta.get_label("auto_insert_price_list_rate_if_missing"))),
"<i>{}</i>".format(
_(self.meta.get_label("fallback_to_default_price_list"), context=self.doctype)
),
"<i>{}</i>".format(
_(
stock_meta.get_label("auto_insert_price_list_rate_if_missing"),
context=stock_meta.name,
)
),
frappe.bold(_("Stock Settings")),
)
)

View File

@@ -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,

View File

@@ -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

View File

@@ -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]:

View File

@@ -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

View File

@@ -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)
)
)

View File

@@ -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))

View File

@@ -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),
),

View File

@@ -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."

View File

@@ -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"))

View File

@@ -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:

View File

@@ -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(
"<i>{}</i>".format(_(self.meta.get_label("auto_insert_price_list_rate_if_missing"))),
"<i>{}</i>".format(_(selling_meta.get_label("fallback_to_default_price_list"))),
"<i>{}</i>".format(
_(self.meta.get_label("auto_insert_price_list_rate_if_missing"), context=self.doctype)
),
"<i>{}</i>".format(
_(
selling_meta.get_label("fallback_to_default_price_list"),
context=selling_meta.name,
)
),
frappe.bold(_("Selling Settings")),
)
)

View File

@@ -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,
)

View File

@@ -38,7 +38,7 @@
{%- for fieldname in columns -%}
{% if doc.get(fieldname) and doc.in_format_data(fieldname) -%}
<p>
<strong>{{ _(doc.meta.get_label(fieldname)) }}:</strong>
<strong>{{ _(doc.meta.get_label(fieldname), context=doc.doctype) }}:</strong>
{{ doc.get_formatted(fieldname, translated=True) }}
</p>
{% endif %}

View File

@@ -2,7 +2,7 @@
{%- if doc.discount_amount -%}
<div class="row">
<div class="col-xs-5 {%- if doc.align_labels_right %} text-right{%- endif -%}">
<label>{{ _(doc.meta.get_label('discount_amount')) }}</label></div>
<label>{{ _(doc.meta.get_label('discount_amount'), context=doc.doctype) }}</label></div>
<div class="col-xs-7 text-right">
- {{ doc.get_formatted("discount_amount", doc) }}
</div>

View File

@@ -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 -%}