seitime-frappe/frappe/gettext/extractors/customization.py
2024-06-27 18:39:54 +02:00

64 lines
1.7 KiB
Python

import json
from .utils import EXCLUDE_SELECT_OPTIONS, extract_messages_from_docfield, extract_messages_from_links
def extract(fileobj, *args, **kwargs):
"""Extract messages from `custom/{doctype}.json` files. To be used by babel extractor.
:param fileobj: the file-like object the messages should be extracted from
:rtype: `iterator`
"""
data = json.load(fileobj)
if isinstance(data, list):
return
doctype = data.get("doctype")
messages = []
for field in data.get("custom_fields", []):
messages.extend(extract_messages_from_docfield(doctype, field))
messages.extend(extract_messages_from_links(doctype, data.get("links", [])))
for property_setter in data.get("property_setters", []):
if property_setter.get("doctype_or_field") != "DocField":
continue
property_name = property_setter.get("property")
fieldname = property_setter.get("field_name")
if property_name == "options" and fieldname not in EXCLUDE_SELECT_OPTIONS:
message = property_setter.get("value")
select_options = [option for option in message.split("\n") if option and not option.isdigit()]
if select_options and "icon" in select_options[0]:
continue
messages.extend(
(
option,
f"Option for the '{fieldname}' (Select) field in DocType '{doctype}'",
)
for option in select_options
)
if property_name == "label":
messages.append(
(
property_setter.get("value"),
f"Label of the '{fieldname}' field in DocType '{doctype}'",
)
)
if property_name == "description":
messages.append(
(
property_setter.get("value"),
f"Description of the '{fieldname}' field in DocType '{doctype}'",
)
)
yield from ((None, "_", message, [comment]) for message, comment in messages)