diff --git a/frappe/core/doctype/data_export/data_export.js b/frappe/core/doctype/data_export/data_export.js index 1808578d31..f2879736cf 100644 --- a/frappe/core/doctype/data_export/data_export.js +++ b/frappe/core/doctype/data_export/data_export.js @@ -153,7 +153,7 @@ const add_doctype_field_multicheck_control = (doctype, parent_wrapper) => { const options = fields.map((df) => { return { - label: __(df.label), + label: __(df.label, null, df.parent), value: df.fieldname, danger: df.reqd, checked: 1, diff --git a/frappe/core/doctype/data_export/exporter.py b/frappe/core/doctype/data_export/exporter.py index 2cbfc632ec..dd2f55741b 100644 --- a/frappe/core/doctype/data_export/exporter.py +++ b/frappe/core/doctype/data_export/exporter.py @@ -306,7 +306,7 @@ class DataExporter: self.tablerow.append("") self.fieldrow.append(docfield.fieldname) - self.labelrow.append(_(docfield.label)) + self.labelrow.append(_(docfield.label, context=docfield.parent)) self.mandatoryrow.append(docfield.reqd and "Yes" or "No") self.typerow.append(docfield.fieldtype) self.inforow.append(self.getinforow(docfield)) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index f079e506ff..0d5af7ed4c 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -313,7 +313,7 @@ class DocType(Document): frappe.msgprint( _("{0} should be indexed because it's referred in dashboard connections").format( - _(d.label) + _(d.label, context=d.parent) ), alert=True, indicator="orange", @@ -1548,7 +1548,7 @@ def validate_fields(meta): if docfield.fieldtype == "Data" and not (docfield.oldfieldtype and docfield.oldfieldtype != "Data"): if docfield.options and (docfield.options not in data_field_options): - df_str = frappe.bold(_(docfield.label)) + df_str = frappe.bold(_(docfield.label, context=docfield.parent)) text_str = ( _("{0} is an invalid Data field.").format(df_str) + "
" * 2 diff --git a/frappe/custom/doctype/custom_field/custom_field.py b/frappe/custom/doctype/custom_field/custom_field.py index 594eabff94..327623709c 100644 --- a/frappe/custom/doctype/custom_field/custom_field.py +++ b/frappe/custom/doctype/custom_field/custom_field.py @@ -259,7 +259,7 @@ def get_fields_label(doctype=None): return frappe.msgprint(_("Custom Fields can only be added to a standard DocType.")) return [ - {"value": df.fieldname or "", "label": _(df.label) if df.label else ""} + {"value": df.fieldname or "", "label": _(df.label, context=df.parent) if df.label else ""} for df in frappe.get_meta(doctype).get("fields") ] diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index bb1076dd46..716693b113 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -143,7 +143,7 @@ def get_desktop_icons(user=None): # translate for d in user_icons: if d.label: - d.label = _(d.label) + d.label = _(d.label, context=d.parent) frappe.cache.hset("desktop_icons", user, user_icons) diff --git a/frappe/desk/doctype/onboarding_step/onboarding_step.js b/frappe/desk/doctype/onboarding_step/onboarding_step.js index 67b2ed0501..a595cfb09b 100644 --- a/frappe/desk/doctype/onboarding_step/onboarding_step.js +++ b/frappe/desk/doctype/onboarding_step/onboarding_step.js @@ -75,7 +75,7 @@ function setup_fields(frm) { }) .map((df) => { return { - label: `${__(df.label)} (${df.fieldname})`, + label: `${__(df.label, null, df.parent)} (${df.fieldname})`, value: df.fieldname, }; }); diff --git a/frappe/email/doctype/notification/notification.js b/frappe/email/doctype/notification/notification.js index 127f803110..0e0c45ddb1 100644 --- a/frappe/email/doctype/notification/notification.js +++ b/frappe/email/doctype/notification/notification.js @@ -15,7 +15,7 @@ frappe.notification = { return { value: select_value, - label: df.fieldname + " (" + __(df.label) + ")", + label: df.fieldname + " (" + __(df.label, null, df.parent) + ")", }; }; diff --git a/frappe/integrations/doctype/webhook/webhook.js b/frappe/integrations/doctype/webhook/webhook.js index 302cacc194..a1a2f02abc 100644 --- a/frappe/integrations/doctype/webhook/webhook.js +++ b/frappe/integrations/doctype/webhook/webhook.js @@ -14,11 +14,9 @@ frappe.webhook = { !frappe.model.table_fields.includes(d.fieldtype) ) { return null; - } else if (d.fieldtype === "Currency" || d.fieldtype === "Float") { - return { label: d.label, value: d.fieldname }; } else { return { - label: `${__(d.label)} (${d.fieldtype})`, + label: `${__(d.label, null, d.parent)} (${__(d.fieldtype)})`, value: d.fieldname, }; } @@ -28,10 +26,12 @@ frappe.webhook = { // add meta fields for (let field of frappe.model.std_fields) { if (field.fieldname == "name") { - fields.unshift({ label: "Name (Doc Name)", value: "name" }); + fields.unshift({ label: __("Name (Doc Name)"), value: "name" }); } else { fields.push({ - label: `${__(field.label)} (${field.fieldtype})`, + label: `${__(field.label, null, field.parent)} (${__( + field.fieldtype + )})`, value: field.fieldname, }); } diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 943fcfae10..d96f4ab6bf 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -376,7 +376,7 @@ class BaseDocument: ) if isinstance(value, list) and df.fieldtype not in table_fields: - frappe.throw(_("Value for {0} cannot be a list").format(_(df.label))) + frappe.throw(_("Value for {0} cannot be a list").format(_(df.label, context=df.parent))) if df.fieldtype == "Check": value = 1 if cint(value) else 0 @@ -719,7 +719,9 @@ class BaseDocument: def get_msg(df): if df.fieldtype in table_fields: - return "{}: {}: {}".format(_("Error"), _("Data missing in table"), _(df.label)) + return "{}: {}: {}".format( + _("Error"), _("Data missing in table"), _(df.label, context=df.parent) + ) # check if parentfield exists (only applicable for child table doctype) elif self.get("parentfield"): @@ -729,10 +731,10 @@ class BaseDocument: _("Row"), self.idx, _("Value missing for"), - _(df.label), + _(df.label, context=df.parent), ) - return _("Error: Value missing for {0}: {1}").format(_(df.parent), _(df.label)) + return _("Error: Value missing for {0}: {1}").format(_(df.parent), _(df.label, context=df.parent)) def has_content(df): value = cstr(self.get(df.fieldname)) @@ -767,9 +769,9 @@ class BaseDocument: def get_msg(df, docname): # check if parentfield exists (only applicable for child table doctype) if self.get("parentfield"): - return "{} #{}: {}: {}".format(_("Row"), self.idx, _(df.label), docname) + return "{} #{}: {}: {}".format(_("Row"), self.idx, _(df.label, context=df.parent), docname) - return f"{_(df.label)}: {docname}" + return f"{_(df.label, context=df.parent)}: {docname}" invalid_links = [] cancelled_links = [] @@ -1014,7 +1016,7 @@ class BaseDocument: frappe.throw( _("{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}").format( - reference, _(df.label), max_length, value + reference, _(df.label, context=df.parent), max_length, value ), frappe.CharacterLengthExceededError, title=_("Value too big"), @@ -1049,7 +1051,7 @@ class BaseDocument: frappe.throw( _("{0} Not allowed to change {1} after submission from {2} to {3}").format( f"Row #{self.idx}:" if self.get("parent") else "", - frappe.bold(_(df.label)), + frappe.bold(_(df.label, context=df.parent)), frappe.bold(db_value), frappe.bold(self_value), ), diff --git a/frappe/model/document.py b/frappe/model/document.py index 090008492e..4bbc68570d 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -591,11 +591,11 @@ class Document(BaseDocument): _("Row"), self.idx, _("Value cannot be negative for"), - frappe.bold(_(df.label)), + frappe.bold(_(df.label, context=df.parent)), ) else: return _("Value cannot be negative for {0}: {1}").format( - _(df.parent), frappe.bold(_(df.label)) + _(df.parent), frappe.bold(_(df.label, context=df.parent)) ) for df in self.meta.get( diff --git a/frappe/permissions.py b/frappe/permissions.py index 1452d03657..dfb5796d1d 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -406,7 +406,7 @@ def has_user_permission(doc, user=None, debug=False): _(field.options), d.get(field.fieldname) or _("empty"), d.idx, - _(field.label) if field.label else field.fieldname, + _(field.label, context=field.parent) if field.label else field.fieldname, ) else: # "You are not allowed to access Company 'Restricted Company' in field Reference Type" @@ -416,7 +416,7 @@ def has_user_permission(doc, user=None, debug=False): _(meta.doctype), _(field.options), d.get(field.fieldname) or _("empty"), - _(field.label) if field.label else field.fieldname, + _(field.label, context=field.parent) if field.label else field.fieldname, ) push_perm_check_log(msg, debug=debug) diff --git a/frappe/printing/page/print_format_builder/print_format_builder_field.html b/frappe/printing/page/print_format_builder/print_format_builder_field.html index 90eb4f1f0a..5e900df601 100644 --- a/frappe/printing/page/print_format_builder/print_format_builder_field.html +++ b/frappe/printing/page/print_format_builder/print_format_builder_field.html @@ -2,7 +2,7 @@ {% if(field.print_hide) { %}style="background-color: #F7FAFC; color: #8D99A6;" title="{{ __("Hidden") }}"{% } %} data-fieldname="{%= field.fieldname %}" - data-label="{{ __(field.label) }}" + data-label="{{ __(field.label, context=field.parent) }}" {% if field.align %}data-align="{{ field.align }}"{% endif %} data-fieldtype="{%= field.fieldtype %}" @@ -34,13 +34,13 @@ - {{ __(field.label) || __(field.fieldname) }} + {{ __(field.label, context=field.parent) || __(field.fieldname) }} ({%= __("Table") %}) {%= __("Select Columns") %} {% } else { %} - {{ __(field.label) }} + {{ __(field.label, context=field.parent) }} {% } %} {% } %} diff --git a/frappe/public/js/frappe/data_import/data_exporter.js b/frappe/public/js/frappe/data_import/data_exporter.js index 894c028187..6cd0adf029 100644 --- a/frappe/public/js/frappe/data_import/data_exporter.js +++ b/frappe/public/js/frappe/data_import/data_exporter.js @@ -73,8 +73,11 @@ frappe.data_import.DataExporter = class DataExporter { let child_fieldname = df.fieldname; let label = df.reqd ? // prettier-ignore - __('{0} ({1}) (1 row mandatory)', [__(df.label || df.fieldname), __(doctype)]) - : __("{0} ({1})", [__(df.label || df.fieldname), __(doctype)]); + __('{0} ({1}) (1 row mandatory)', [__(df.label || df.fieldname, null, df.parent), __(doctype)]) + : __("{0} ({1})", [ + __(df.label || df.fieldname, null, df.parent), + __(doctype), + ]); return { label, fieldname: child_fieldname, @@ -291,7 +294,7 @@ frappe.data_import.DataExporter = class DataExporter { }) .map((df) => { return { - label: __(df.label), + label: __(df.label, null, df.parent), value: df.fieldname, danger: is_field_mandatory(df), checked: false, diff --git a/frappe/public/js/frappe/data_import/import_preview.js b/frappe/public/js/frappe/data_import/import_preview.js index 2dcd22acf3..58b0cdb5c2 100644 --- a/frappe/public/js/frappe/data_import/import_preview.js +++ b/frappe/public/js/frappe/data_import/import_preview.js @@ -334,11 +334,11 @@ function get_fields_as_options(doctype, column_map) { return [].concat( ...keys.map((key) => { return column_map[key].map((df) => { - let label = __(df.label); + let label = __(df.label, null, df.parent); let value = df.fieldname; if (doctype !== key) { let table_field = frappe.meta.get_docfield(doctype, key); - label = `${__(df.label)} (${__(table_field.label)})`; + label = `${__(df.label, null, df.parent)} (${__(table_field.label)})`; value = `${table_field.fieldname}.${df.fieldname}`; } return { diff --git a/frappe/public/js/frappe/form/column.js b/frappe/public/js/frappe/form/column.js index 317679f829..1bb8a86c25 100644 --- a/frappe/public/js/frappe/form/column.js +++ b/frappe/public/js/frappe/form/column.js @@ -30,7 +30,7 @@ export default class Column { if (this.df.label) { $(` `).prependTo(this.wrapper); } diff --git a/frappe/public/js/frappe/form/controls/autocomplete.js b/frappe/public/js/frappe/form/controls/autocomplete.js index b7bf5687d6..344320c468 100644 --- a/frappe/public/js/frappe/form/controls/autocomplete.js +++ b/frappe/public/js/frappe/form/controls/autocomplete.js @@ -67,7 +67,7 @@ frappe.ui.form.ControlAutocomplete = class ControlAutoComplete extends frappe.ui d.label = d.value; } - var _label = me.translate_values ? __(d.label) : d.label; + var _label = me.translate_values ? __(d.label, null, d.parent) : d.label; var html = "" + _label + ""; if (d.description) { html += '
' + __(d.description) + ""; diff --git a/frappe/public/js/frappe/form/controls/base_input.js b/frappe/public/js/frappe/form/controls/base_input.js index c77565f2c7..044d587c71 100644 --- a/frappe/public/js/frappe/form/controls/base_input.js +++ b/frappe/public/js/frappe/form/controls/base_input.js @@ -160,7 +160,8 @@ frappe.ui.form.ControlInput = class ControlInput extends frappe.ui.form.Control var icon = ""; this.label_span.innerHTML = - (icon ? ' ' : "") + __(this.df.label) || " "; + (icon ? ' ' : "") + + __(this.df.label, null, this.df.parent) || " "; this._label = this.df.label; } diff --git a/frappe/public/js/frappe/form/controls/button.js b/frappe/public/js/frappe/form/controls/button.js index 8a654a6bd3..5c0cdc2fee 100644 --- a/frappe/public/js/frappe/form/controls/button.js +++ b/frappe/public/js/frappe/form/controls/button.js @@ -60,7 +60,9 @@ frappe.ui.form.ControlButton = class ControlButton extends frappe.ui.form.Contro if (label) { this.df.label = label; } - label = (this.df.icon ? frappe.utils.icon(this.df.icon) : "") + __(this.df.label); + label = + (this.df.icon ? frappe.utils.icon(this.df.icon) : "") + + __(this.df.label, null, this.df.parent); $(this.label_span).html(" "); this.$input && this.$input.html(label); } diff --git a/frappe/public/js/frappe/form/controls/heading.js b/frappe/public/js/frappe/form/controls/heading.js index ccce412eaf..8089a2532c 100644 --- a/frappe/public/js/frappe/form/controls/heading.js +++ b/frappe/public/js/frappe/form/controls/heading.js @@ -1,5 +1,5 @@ frappe.ui.form.ControlHeading = class ControlHeading extends frappe.ui.form.ControlHTML { get_content() { - return "

" + __(this.df.label) + "

"; + return "

" + __(this.df.label, null, this.df.parent) + "

"; } }; diff --git a/frappe/public/js/frappe/form/controls/signature.js b/frappe/public/js/frappe/form/controls/signature.js index f169ec748a..a25606a8e5 100644 --- a/frappe/public/js/frappe/form/controls/signature.js +++ b/frappe/public/js/frappe/form/controls/signature.js @@ -6,7 +6,7 @@ frappe.ui.form.ControlSignature = class ControlSignature extends frappe.ui.form. super.make(); if (this.df.label) { - $(this.wrapper).find("label").text(__(this.df.label)); + $(this.wrapper).find("label").text(__(this.df.label, null, this.df.parent)); } this.set_doc_url(); diff --git a/frappe/public/js/frappe/form/controls/table.js b/frappe/public/js/frappe/form/controls/table.js index 777705634c..6b547bfbf0 100644 --- a/frappe/public/js/frappe/form/controls/table.js +++ b/frappe/public/js/frappe/form/controls/table.js @@ -110,7 +110,7 @@ frappe.ui.form.ControlTable = class ControlTable extends frappe.ui.form.Control return ( field.fieldname.toLowerCase() === field_name || (field.label || "").toLowerCase() === field_name || - (__(field.label) || "").toLowerCase() === field_name + (__(field.label, null, field.parent) || "").toLowerCase() === field_name ); }; diff --git a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js index 77e6cacd66..2072273b86 100644 --- a/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js +++ b/frappe/public/js/frappe/form/footer/version_timeline_content_builder.js @@ -92,7 +92,7 @@ function get_version_timeline_content(version_doc, frm) { if (field_display_status === "Read" || field_display_status === "Write") { parts.push( __("{0} from {1} to {2}", [ - __(df.label), + __(df.label, null, df.parent), format_content_for_timeline(p[1]), format_content_for_timeline(p[2]), ]) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index de870f02c0..69a7c6e366 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1530,7 +1530,10 @@ frappe.ui.form.Form = class FrappeForm { $.each(fields_list, function (i, fname) { var docfield = frappe.meta.docfield_map[doctype][fname]; if (docfield) { - var label = __(docfield.label || "").replace(/\([^\)]*\)/g, ""); // eslint-disable-line + var label = __(docfield.label || "", null, docfield.parent).replace( + /\([^\)]*\)/g, + "" + ); // eslint-disable-line if (parentfield) { grid_field_label_map[doctype + "-" + fname] = label.trim() + " (" + __(currency) + ")"; diff --git a/frappe/public/js/frappe/form/grid_row.js b/frappe/public/js/frappe/form/grid_row.js index 9442c27a0e..030dba80a5 100644 --- a/frappe/public/js/frappe/form/grid_row.js +++ b/frappe/public/js/frappe/form/grid_row.js @@ -546,7 +546,7 @@ export default class GridRow { ${frappe.utils.icon("drag", "xs")}
- ${__(docfield.label)} + ${__(docfield.label, null, docfield.parent)}