Merge branch 'develop' into project-duplicate-read-permission-check

This commit is contained in:
Shllokkk
2026-08-24 13:14:19 +05:30
committed by GitHub
52 changed files with 17370 additions and 16909 deletions

View File

@@ -22,6 +22,6 @@ jobs:
pull-requests: write
steps:
- uses: alyf-de/po-review-action@v1.1.0
- uses: alyf-de/po-review-action@5928f84d6bc9094f9ad6e2c5780f01c0044b800e # v1.1.1
with:
hidden-po-files: eo.po

View File

@@ -204,8 +204,8 @@ 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_translated_label("add_taxes_from_item_tax_template")),
frappe.bold(self.meta.get_translated_label("add_taxes_from_taxes_and_charges_template")),
),
title=_("Auto Tax Settings Error"),
)

View File

@@ -442,7 +442,9 @@ 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_translated_label(field)
) 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_translated_label(k)))
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

@@ -677,6 +677,6 @@ Object.assign(erpnext.journal_entry, {
} else {
erpnext.journal_entry.set_debit_credit_in_company_currency(frm, cdt, cdn);
}
frm.refresh_field("accounts");
frm.get_field("accounts").grid.refresh_row(cdn);
},
});

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_translated_label(fieldname)),
frappe.bold(self.company),
)
)
@@ -661,7 +662,7 @@ 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_translated_label(field)))
def validate_reference_documents(self):
valid_reference_doctypes = self.get_valid_reference_doctypes()
@@ -1151,7 +1152,7 @@ class PaymentEntry(AccountsController):
if value:
continue
label = _(frappe.get_meta("Company").get_label(fieldname))
label = frappe.get_meta("Company").get_translated_label(fieldname)
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,7 @@ 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_translated_label(fieldname)))
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_translated_label(tocheck)),
frappe.MandatoryError,
)
if self.apply_rule_on_other:
o_field = "other_" + frappe.scrub(self.apply_rule_on_other)

View File

@@ -94,10 +94,15 @@ frappe.query_reports["Accounts Payable"] = {
options: get_party_type_options(),
on_change: function () {
frappe.query_report.set_filter_value("party", "");
frappe.query_report.toggle_filter_display(
"supplier_group",
frappe.query_report.get_filter_value("party_type") !== "Supplier"
);
let is_supplier = frappe.query_report.get_filter_value("party_type") === "Supplier";
let supplier_group_filter = frappe.query_report.get_filter("supplier_group");
if (supplier_group_filter) {
supplier_group_filter.df.hidden = !is_supplier;
}
frappe.query_report.toggle_filter_display("supplier_group", !is_supplier);
if (!is_supplier) {
frappe.query_report.set_filter_value("supplier_group", []);
}
},
},
{

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_translated_label(field), 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_translated_label(fieldname), company
)
)

View File

@@ -524,7 +524,7 @@ class AccountsController(TransactionBase):
_(
"Please set {0} to {1}, the same account that was used in the original invoice {2}."
).format(
frappe.bold(_(self.meta.get_label(cr_dr_account_field), context=self.doctype)),
frappe.bold(self.meta.get_translated_label(cr_dr_account_field)),
frappe.bold(original_account),
frappe.bold(self.return_against),
)

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_translated_label("from_warehouse"),
to_warehouse_field=item.meta.get_translated_label("warehouse"),
)
)
@@ -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_translated_label("conversion_factor"),
)
)
d.stock_qty = flt(d.qty) * flt(d.conversion_factor)
@@ -757,7 +757,7 @@ 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_translated_label(fieldname),
item_code=frappe.bold(item_row["item_code"]),
)
)
@@ -1210,14 +1210,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_translated_label("schedule_date"),
transaction_date=self.meta.get_translated_label("transaction_date"),
)
)
else:
frappe.throw(
_("Please enter the {schedule_date}.").format(
schedule_date=_(self.meta.get_label("schedule_date"))
schedule_date=self.meta.get_translated_label("schedule_date")
)
)

View File

@@ -31,7 +31,9 @@ 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_translated_label("return_against"), doc.return_against)
)
else:
ref_doc = frappe.get_doc(doc.doctype, doc.return_against)
@@ -40,7 +42,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_translated_label(party_type),
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_translated_label("commission_rate"),
_("must be between 0 and 100"),
)
)
@@ -306,7 +306,7 @@ 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_translated_label("validate_selling_price")),
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_translated_label("allow_zero_valuation_rate"),
),
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_translated_label("conversion_rate"),
self.doc.company,
)

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-08-16 09:41+0000\n"
"PO-Revision-Date: 2026-08-18 01:44\n"
"PO-Revision-Date: 2026-08-20 02:36\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Bosnian\n"
"MIME-Version: 1.0\n"
@@ -343,7 +343,7 @@ msgstr "'Trajanje Važenja Verifikacijskog Linka' mora biti između 15 i 60 minu
#: erpnext/accounts/doctype/bank_account/bank_account.py:79
msgid "'{0}' account is already used by {1}. Use another account."
msgstr "Račun '{0}' već koristi {1}. Koristite drugi račun."
msgstr "Račun '{0}' već koristi {1}. Koristi drugi račun."
#: erpnext/accounts/doctype/pos_settings/pos_settings.py:44
msgid "'{0}' has been already added."
@@ -48100,7 +48100,7 @@ msgstr "Red {0}: Dodijeljeni iznos {1} mora biti manji ili jednak preostalom izn
#: erpnext/stock/doctype/stock_entry/stock_entry.py:810
msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials."
msgstr "Red {0}: Kako je {1} omogućen, sirovine se ne mogu dodati u {2} unos. Koristite {3} unos za potrošnju sirovina."
msgstr "Red {0}: Kako je {1} omogućen, sirovine se ne mogu dodati u {2} unos. Koristi {3} unos za potrošnju sirovina."
#: erpnext/stock/doctype/material_request/material_request.py:625
msgid "Row {0}: Bill of Materials not found for the Item {1}"
@@ -60958,7 +60958,7 @@ msgstr "Hitno"
#: erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.js:36
msgid "Use 'Repost in background' button to trigger background job. Job can only be triggered when document is in Queued or Failed status."
msgstr "Koristite dugme 'Ponovo knjiži u pozadini' da pokrenete posao u pozadini. Zadatak se može pokrenuti samo kada je dokument u stanju čekanja ili neuspješan."
msgstr "Koristi dugme 'Ponovo knjiži u pozadini' da pokrenete posao u pozadini. Zadatak se može pokrenuti samo kada je dokument u stanju čekanja ili neuspješan."
#. Description of the 'Advanced Filtering' (Check) field in DocType 'Financial
#. Report Row'
@@ -61105,7 +61105,7 @@ msgstr "Koristi Devizni Kurs Datuma Transakcije"
#: erpnext/projects/doctype/project/project.py:671
msgid "Use a name that is different from previous project name"
msgstr "Koristite naziv koji se razlikuje od naziva prethodnog projekta"
msgstr "Koristi naziv koji se razlikuje od naziva prethodnog projekta"
#. Label of the use_for_shopping_cart (Check) field in DocType 'Tax Rule'
#: erpnext/accounts/doctype/tax_rule/tax_rule.json
@@ -61122,13 +61122,13 @@ msgstr "Koristi stari Kontroler Proračuna"
#. 'Accounts Settings'
#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json
msgid "Use legacy controller for Period Closing Voucher"
msgstr "Koristite stari kontroler za Verifikat Zatvaranje Perioda"
msgstr "Koristi stari kontroler za Verifikat Zatvaranje Perioda"
#. Label of the fallback_to_default_price_list (Check) field in DocType
#. 'Selling Settings'
#: erpnext/selling/doctype/selling_settings/selling_settings.json
msgid "Use prices from Default Price List as fallback"
msgstr "Koristite cjene iz Standard Cjenovnika kao Rezervnu Opciju"
msgstr "Koristi cjene iz Standard Cjenovnika kao Rezervnu Opciju"
#. Description of the 'No of Shifts' (Int) field in DocType 'Production Plan'
#: erpnext/manufacturing/doctype/production_plan/production_plan.json
@@ -64110,7 +64110,7 @@ msgstr "po satu"
#: erpnext/stock/stock_ledger.py:2251
msgid "performing either one below:"
msgstr "izvodi bilo koje dolje:"
msgstr "izvodi bilo koje niže:"
#. Description of the 'Product Bundle Item' (Data) field in DocType 'Pick List
#. Item'

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-08-16 09:41+0000\n"
"PO-Revision-Date: 2026-08-17 01:43\n"
"PO-Revision-Date: 2026-08-23 02:59\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Persian\n"
"MIME-Version: 1.0\n"
@@ -22508,7 +22508,7 @@ msgstr "دفتر کل"
#. Settings'
#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json
msgid "General Ledger Report"
msgstr ""
msgstr "گزارش دفتر کل"
#. Label of the general_ledger_remarks_length (Int) field in DocType 'Accounts
#. Settings'
@@ -26090,7 +26090,7 @@ msgstr ""
#: erpnext/controllers/queries.py:227
msgid "Invalid party type: {0}"
msgstr ""
msgstr "نوع طرف نامعتبر: {0}"
#: erpnext/public/js/utils/serial_batch_inline_editor.js:773
msgid "Invalid range. Use the format {0}"
@@ -27226,7 +27226,7 @@ msgstr "آیتم"
#. Schedule'
#: erpnext/manufacturing/doctype/production_plan_schedule/production_plan_schedule.json
msgid "Item & Operation"
msgstr ""
msgstr "آیتم و عملیات"
#: erpnext/stock/report/bom_search/bom_search.js:8
msgid "Item 1"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: hello@frappe.io\n"
"POT-Creation-Date: 2026-08-16 09:41+0000\n"
"PO-Revision-Date: 2026-08-17 01:43\n"
"PO-Revision-Date: 2026-08-21 02:30\n"
"Last-Translator: hello@frappe.io\n"
"Language-Team: Swedish\n"
"MIME-Version: 1.0\n"
@@ -29827,7 +29827,7 @@ msgstr "Begränsad till tolv tecken"
#. Settings'
#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json
msgid "Limits don't apply on"
msgstr "Begränsningar gäller inte för"
msgstr "Begränsning gäller inte för"
#. Label of the reference_code (Data) field in DocType 'Financial Report Row'
#: erpnext/accounts/doctype/financial_report_row/financial_report_row.json
@@ -36153,7 +36153,7 @@ msgstr "Sidbrytning efter varje SoA"
#: banking/src/components/features/BankStatementImporter/PDF/PDFTableEditor.tsx:302
msgid "Page preview"
msgstr "Förhandsgranska Sida"
msgstr "Förhandsvisa Sida"
#. Option for the 'Status' (Select) field in DocType 'Payment Request'
#. Option for the 'Status' (Select) field in DocType 'POS Invoice'
@@ -40391,17 +40391,17 @@ msgstr "Förhindrar att system automatiskt använder pris från senaste inköp t
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:268
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
msgid "Preview Email"
msgstr "Förhandsgranska E-post"
msgstr "Förhandsvisa E-post"
#. Label of the download_materials_request_plan_section_section (Section Break)
#. field in DocType 'Production Plan'
#: erpnext/manufacturing/doctype/production_plan/production_plan.json
msgid "Preview Required Materials"
msgstr "Förhandsgranska Erfordrad Material"
msgstr "Förhandsvisa Erfordrad Material"
#: banking/src/components/features/BankStatementImporter/CSV/StatementDetails.tsx:230
msgid "Preview Transactions"
msgstr "Förhandsgranska Transaktioner"
msgstr "Förhandsvisa Transaktioner"
#. Label of the preview_mode (Check) field in DocType 'Accounts Settings'
#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json

File diff suppressed because it is too large Load Diff

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_translated_label("transfer_material_against")
),
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_translated_label(fieldname),
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_translated_label("transfer_material_against")
),
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_translated_label(doctype, fieldname)}</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_translated_label(child_doctype, fieldname)}</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_translated_label(fieldname),
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_translated_label(fieldname),
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_translated_label(cdt, fieldnames[i], cdn),
item.item_code,
])
);

View File

@@ -122,7 +122,7 @@ 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(
var conversion_rate_label = frappe.meta.get_translated_label(
this.frm.doc.doctype,
"conversion_rate",
this.frm.doc.name

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_translated_label(cdt, "payment_terms_template"));
}
if (doc.payment_schedule?.length) {
to_clear.push(__(frappe.meta.get_label(cdt, "payment_schedule")));
to_clear.push(frappe.meta.get_translated_label(cdt, "payment_schedule"));
}
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_translated_label(cdt, "due_date"), frappe.utils.comma_and(to_clear)],
"Clear payment terms template and/or payment schedule when due date is changed"
),
() => {
@@ -2646,7 +2646,7 @@ 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_translated_label(me.frm.doc.doctype, fieldname, me.frm.doc.name),
])
);
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_translated_label(doc.doctype, "customer", doc.name),
]),
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_translated_label(
doc.doctype,
frappe.dynamic_link.fieldname,
doc.name
),
]),
indicator: "orange",
});
@@ -79,7 +83,9 @@ $.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_translated_label(doc.doctype, "company", doc.name)])
);
}
return {
@@ -94,7 +100,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_translated_label(
doc.doctype,
frappe.dynamic_link.fieldname,
doc.name
),
]),
indicator: "orange",
});
@@ -115,7 +125,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_translated_label(doc.doctype, "company", doc.name),
]),
indicator: "orange",
});
@@ -146,7 +156,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_translated_label(doc.doctype, "supplier", doc.name),
]),
indicator: "orange",
});
@@ -160,7 +170,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_translated_label(doc.doctype, "lead", doc.name),
]),
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

@@ -353,12 +353,10 @@ erpnext.sales_common = {
this.frm.set_value("commission_rate", 100);
frappe.throw(
__("{0} cannot be greater than 100", [
__(
frappe.meta.get_label(
this.frm.doc.doctype,
"commission_rate",
this.frm.doc.name
)
frappe.meta.get_translated_label(
this.frm.doc.doctype,
"commission_rate",
this.frm.doc.name
),
])
);

View File

@@ -257,7 +257,7 @@ 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_translated_label(field.strip()) 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,10 @@ 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_translated_label("fallback_to_default_price_list")),
"<i>{}</i>".format(
stock_meta.get_translated_label("auto_insert_price_list_rate_if_missing")
),
frappe.bold(_("Stock Settings")),
)
)

View File

@@ -323,7 +323,7 @@ class Company(NestedSet):
if not details:
continue
label = _(self.meta.get_label(fieldname))
label = self.meta.get_translated_label(fieldname)
if details.is_group:
frappe.throw(

View File

@@ -393,7 +393,7 @@ class EmailDigest(Document):
label = get_link_to_report(
"General Ledger",
_(self.meta.get_label("income")),
self.meta.get_translated_label("income"),
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_translated_label(root_type + "_year_to_date"),
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_translated_label(root_type + "_year_to_date"),
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_translated_label("expenses_booked"),
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_translated_label("sales_orders_to_bill"),
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_translated_label("sales_orders_to_deliver"),
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_translated_label("purchase_orders_to_receive"),
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_translated_label("purchase_orders_to_bill"),
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_translated_label(fieldname),
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_translated_label(fieldname),
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_translated_label(fieldname),
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_translated_label(fieldname),
filters={"report_date": self.future_to_date, "company": self.company},
)
else:
label = _(self.meta.get_label(fieldname))
label = self.meta.get_translated_label(fieldname)
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_translated_label(fieldname),
"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_translated_label(fieldname),
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_translated_label(fieldname),
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,7 @@ 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_translated_label("clean_description_html"),
get_link_to_form("Stock Settings"),
),
alert=True,
@@ -424,8 +424,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_translated_label("maximum_net_rate")),
bold(tax.meta.get_translated_label("minimum_net_rate")),
)
)
@@ -702,7 +702,7 @@ 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_translated_label(fld) 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 +1134,7 @@ 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_translated_label(f)) 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_translated_label(field)),
frappe.bold(self.alternative_item_code),
frappe.bold(self.item_code),
),

View File

@@ -805,7 +805,9 @@ 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_translated_label(
"get_rm_cost_from_consumption_entry"
)
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_translated_label(k)))
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_translated_label(d))
frappe.throw(msg)
def validate_group_warehouse(self) -> None:

View File

@@ -264,8 +264,10 @@ 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_translated_label("auto_insert_price_list_rate_if_missing")
),
"<i>{}</i>".format(selling_meta.get_translated_label("fallback_to_default_price_list")),
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_translated_label("conversion_rate"),
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_translated_label("plc_conversion_rate"),
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_translated_label(fieldname) }}:</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_translated_label('discount_amount') }}</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_translated_label('discount_amount'), '- ' + doc.get_formatted("discount_amount", doc)) }}
{%- endif -%}
{%- endmacro -%}