diff --git a/.github/helper/install.sh b/.github/helper/install.sh index 5cdcbebe1a..3bba9a2600 100644 --- a/.github/helper/install.sh +++ b/.github/helper/install.sh @@ -66,6 +66,6 @@ bench --site test_site reinstall --yes if [ "$TYPE" == "server" ] then - # wait till assets are built succesfully + # wait till assets are built successfully wait $build_pid fi diff --git a/.github/helper/roulette.py b/.github/helper/roulette.py index e3b212fa89..ebca901c95 100644 --- a/.github/helper/roulette.py +++ b/.github/helper/roulette.py @@ -73,8 +73,9 @@ def has_label(pr_number, label, repo="frappe/frappe"): ) -def is_py(file): - return file.endswith("py") +def is_server_side_code(file): + """File exclusively affects server side code""" + return file.endswith("py") or file.endswith(".po") def is_ci(file): @@ -112,7 +113,7 @@ if __name__ == "__main__": ci_files_changed = any(f for f in files_list if is_ci(f)) only_docs_changed = len(list(filter(is_docs, files_list))) == len(files_list) only_frontend_code_changed = len(list(filter(is_frontend_code, files_list))) == len(files_list) - updated_py_file_count = len(list(filter(is_py, files_list))) + updated_py_file_count = len(list(filter(is_server_side_code, files_list))) only_py_changed = updated_py_file_count == len(files_list) if has_skip_ci_label(pr_number, repo): diff --git a/.github/workflows/linters.yml b/.github/workflows/linters.yml index 367b576204..960a59306f 100644 --- a/.github/workflows/linters.yml +++ b/.github/workflows/linters.yml @@ -51,7 +51,7 @@ jobs: python $GITHUB_WORKSPACE/.github/helper/documentation.py $PR_NUMBER linter: - name: 'Frappe Linter' + name: 'Semgrep Rules' runs-on: ubuntu-latest if: github.event_name == 'pull_request' @@ -61,7 +61,6 @@ jobs: with: python-version: '3.10' cache: pip - - uses: pre-commit/action@v3.0.0 - name: Download Semgrep rules run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules @@ -83,7 +82,7 @@ jobs: - uses: actions/checkout@v4 - name: Cache pip - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py') }} diff --git a/.github/workflows/patch-mariadb-tests.yml b/.github/workflows/patch-mariadb-tests.yml index f48df1367a..a0970eb7bf 100644 --- a/.github/workflows/patch-mariadb-tests.yml +++ b/.github/workflows/patch-mariadb-tests.yml @@ -76,7 +76,7 @@ jobs: run: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts - name: Cache pip - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py') }} @@ -88,7 +88,7 @@ jobs: id: yarn-cache-dir-path run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000000..32ececc78a --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,26 @@ +name: Pre-commit + +on: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: precommit-frappe-${{ github.event_name }}-${{ github.event.number }} + cancel-in-progress: true + +jobs: + linter: + name: 'precommit' + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.10' + cache: pip + - uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/server-tests.yml b/.github/workflows/server-tests.yml index a8af938ec3..9da7244527 100644 --- a/.github/workflows/server-tests.yml +++ b/.github/workflows/server-tests.yml @@ -43,6 +43,8 @@ jobs: needs: checkrun if: ${{ needs.checkrun.outputs.build == 'strawberry' }} timeout-minutes: 60 + env: + NODE_ENV: "production" strategy: fail-fast: false @@ -104,7 +106,7 @@ jobs: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts - name: Cache pip - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py') }} @@ -116,7 +118,7 @@ jobs: id: yarn-cache-dir-path run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml index 1f8ee5e575..ecda8cc6b1 100644 --- a/.github/workflows/ui-tests.yml +++ b/.github/workflows/ui-tests.yml @@ -42,6 +42,8 @@ jobs: needs: checkrun if: ${{ needs.checkrun.outputs.build == 'strawberry' && github.repository_owner == 'frappe' }} timeout-minutes: 60 + env: + NODE_ENV: "production" strategy: fail-fast: false @@ -87,7 +89,7 @@ jobs: echo "127.0.0.1 test_site" | sudo tee -a /etc/hosts - name: Cache pip - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/*requirements.txt', '**/pyproject.toml', '**/setup.py') }} @@ -99,7 +101,7 @@ jobs: id: yarn-cache-dir-path run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} @@ -108,7 +110,7 @@ jobs: ${{ runner.os }}-yarn-ui- - name: Cache cypress binary - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/Cypress key: ${{ runner.os }}-cypress diff --git a/babel_extractors.csv b/babel_extractors.csv index 133a13e736..37858338ba 100644 --- a/babel_extractors.csv +++ b/babel_extractors.csv @@ -6,4 +6,4 @@ hooks.py,frappe.gettext.extractors.navbar.extract **/report/*/*.json,frappe.gettext.extractors.report.extract **.py,frappe.gettext.extractors.python.extract **.js,frappe.gettext.extractors.javascript.extract -**.html,frappe.gettext.extractors.jinja2.extract \ No newline at end of file +**.html,frappe.gettext.extractors.html_template.extract \ No newline at end of file diff --git a/esbuild/esbuild.js b/esbuild/esbuild.js index e22613e0e9..c64b68fc3d 100644 --- a/esbuild/esbuild.js +++ b/esbuild/esbuild.js @@ -64,6 +64,11 @@ const argv = yargs description: "Saves esbuild metafiles for built assets. Useful for analyzing bundle size. More info: https://esbuild.github.io/api/#metafile", }) + .option("using-cached", { + type: "boolean", + description: + "Skips build and uses cached build artifacts to update assets.json (used by Bench)", + }) .example("node esbuild --apps frappe,erpnext", "Run build only for frappe and erpnext") .example( "node esbuild --files frappe/website.bundle.js,frappe/desk.bundle.js", @@ -88,6 +93,7 @@ const NODE_PATHS = [].concat( // import js file of any app if you provide the full path app_list.map((app) => path.resolve(get_app_path(app), "..")).filter(fs.existsSync) ); +const USING_CACHED = Boolean(argv["using-cached"]); execute().catch((e) => { console.error(e); @@ -101,6 +107,12 @@ if (WATCH_MODE) { async function execute() { console.time(TOTAL_BUILD_TIME); + if (USING_CACHED) { + await update_assets_json_from_built_assets(APPS); + await update_assets_json_in_cache(); + console.timeEnd(TOTAL_BUILD_TIME); + process.exit(0); + } let results; try { @@ -131,6 +143,44 @@ async function execute() { } } +async function update_assets_json_from_built_assets(apps) { + const assets = await get_assets_json_path_and_obj(false); + const assets_rtl = await get_assets_json_path_and_obj(true); + + for (const app in apps) { + await update_assets_obj(app, assets.obj, assets_rtl.obj); + } + + for (const { obj, path } of [assets, assets_rtl]) { + const data = JSON.stringify(obj, null, 4); + await fs.promises.writeFile(path, data); + } +} + +async function update_assets_obj(app, assets, assets_rtl) { + const app_path = path.join(apps_path, app, app); + const dist_path = path.join(app_path, "public, dist"); + const files = await glob("**/*.bundle.*.{js,css}", { cwd: dist_path }); + const prefix = path.join("/", "assets", app, "dist"); + + // eg: "js/marketplace.bundle.6SCSPSGQ.js" + for (const file of files) { + // eg: [ "marketplace", "bundle", "6SCSPSGQ", "js" ] + const parts = path.parse(file).base.split("."); + + // eg: "marketplace.bundle.js" + const key = [...parts.slice(0, -2), parts.at(-1)].join("."); + + // eg: "js/marketplace.bundle.6SCSPSGQ.js" + const value = path.join(prefix, file); + if (file.includes("-rtl")) { + assets_rtl[`rtl_${key}`] = value; + } else { + assets[key] = value; + } + } +} + function build_assets_for_apps(apps, files) { let { include_patterns, ignore_patterns } = files.length ? get_files_to_build(files) @@ -393,14 +443,7 @@ async function write_assets_json(metafile) { } } - let assets_json_path = path.resolve(assets_path, `assets${rtl ? "-rtl" : ""}.json`); - let assets_json; - try { - assets_json = await fs.promises.readFile(assets_json_path, "utf-8"); - } catch (error) { - assets_json = "{}"; - } - assets_json = JSON.parse(assets_json); + let { obj: assets_json, path: assets_json_path } = await get_assets_json_path_and_obj(rtl); // update with new values let new_assets_json = Object.assign({}, assets_json, out); curr_assets_json = new_assets_json; @@ -434,6 +477,19 @@ async function update_assets_json_in_cache() { }); } +async function get_assets_json_path_and_obj(is_rtl) { + const file_name = is_rtl ? "assets-rtl.json" : "assets.json"; + const assets_json_path = path.resolve(assets_path, file_name); + let assets_json; + try { + assets_json = await fs.promises.readFile(assets_json_path, "utf-8"); + } catch (error) { + assets_json = "{}"; + } + assets_json = JSON.parse(assets_json); + return { obj: assets_json, path: assets_json_path }; +} + function run_build_command_for_apps(apps) { let cwd = process.cwd(); let { execSync } = require("child_process"); diff --git a/frappe/__init__.py b/frappe/__init__.py index 379f242e32..90f01b3b98 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -130,9 +130,45 @@ def _lt(msg: str, lang: str | None = None, context: str | None = None): Note: Result is not guaranteed to equivalent to pure strings for all operations. """ - from frappe.translate import LazyTranslate + return _LazyTranslate(msg, lang, context) - return LazyTranslate(msg, lang, context) + +@functools.total_ordering +class _LazyTranslate: + __slots__ = ("msg", "lang", "context") + + def __init__(self, msg: str, lang: str | None = None, context: str | None = None) -> None: + self.msg = msg + self.lang = lang + self.context = context + + @property + def value(self) -> str: + return _(str(self.msg), self.lang, self.context) + + def __str__(self): + return self.value + + def __add__(self, other): + if isinstance(other, (str, _LazyTranslate)): + return self.value + str(other) + raise NotImplementedError + + def __radd__(self, other): + if isinstance(other, (str, _LazyTranslate)): + return str(other) + self.value + return NotImplementedError + + def __repr__(self) -> str: + return f"'{self.value}'" + + # NOTE: it's required to override these methods and raise error as default behaviour will + # return `False` in all cases. + def __eq__(self, other): + raise NotImplementedError + + def __lt__(self, other): + raise NotImplementedError def as_unicode(text, encoding: str = "utf-8") -> str: @@ -275,20 +311,38 @@ def connect( ) -> None: """Connect to site database instance. - :param site: If site is given, calls `frappe.init`. - :param db_name: Optional. Will use from `site_config.json`. + :param site: (Deprecated) If site is given, calls `frappe.init`. + :param db_name: (Deprecated) Optional. Will use from `site_config.json`. :param set_admin_as_user: Set Administrator as current user. """ from frappe.database import get_db if site: + from frappe.utils.deprecations import deprecation_warning + + deprecation_warning( + "Calling frappe.connect with the site argument is deprecated and will be removed in next major version. " + "Instead, explicitly invoke frappe.init(site) prior to calling frappe.connect(), if initializing the site is necessary." + ) init(site) + if db_name: + from frappe.utils.deprecations import deprecation_warning + + deprecation_warning( + "Calling frappe.connect with the db_name argument is deprecated and will be removed in next major version. " + "Instead, explicitly invoke frappe.init(site) with the right config prior to calling frappe.connect(), if necessary." + ) + + assert db_name or local.conf.db_user, "site must be fully initialized, db_user missing" + assert db_name or local.conf.db_name, "site must be fully initialized, db_name missing" + assert local.conf.db_password, "site must be fully initialized, db_password missing" local.db = get_db( host=local.conf.db_host, port=local.conf.db_port, - user=db_name or local.conf.db_name, - password=None, + user=local.conf.db_user or db_name, + password=local.conf.db_password, + cur_db_name=local.conf.db_name or db_name, ) if set_admin_as_user: set_user("Administrator") @@ -300,15 +354,21 @@ def connect_replica() -> bool: if local and hasattr(local, "replica_db") and hasattr(local, "primary_db"): return False - user = local.conf.db_name + user = local.conf.db_user password = local.conf.db_password port = local.conf.replica_db_port if local.conf.different_credentials_for_replica: - user = local.conf.replica_db_name + user = local.conf.replica_db_user or local.conf.replica_db_name password = local.conf.replica_db_password - local.replica_db = get_db(host=local.conf.replica_host, user=user, password=password, port=port) + local.replica_db = get_db( + host=local.conf.replica_host, + port=port, + user=user, + password=password, + cur_db_name=local.conf.db_name, + ) # swap db connections local.primary_db = local.db @@ -370,6 +430,11 @@ def get_site_config(sites_path: str | None = None, site_path: str | None = None) os.environ.get("FRAPPE_DB_PORT") or config.get("db_port") or db_default_ports(config["db_type"]) ) + # Set the user as database name if not set in config + config["db_user"] = ( + os.environ.get("FRAPPE_DB_USER") or config.get("db_user") or config.get("db_name") + ) + return config diff --git a/frappe/auth.py b/frappe/auth.py index 56f1bcae26..521b0a6289 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -4,13 +4,15 @@ import base64 import binascii from urllib.parse import quote, urlencode, urlparse +from werkzeug.wrappers import Response + import frappe import frappe.database import frappe.utils import frappe.utils.user from frappe import _ from frappe.core.doctype.activity_log.activity_log import add_authentication_log -from frappe.sessions import Session, clear_sessions, delete_session +from frappe.sessions import Session, clear_sessions, delete_session, get_expiry_in_seconds from frappe.translate import get_language from frappe.twofactor import ( authenticate_for_2factor, @@ -272,9 +274,7 @@ class LoginManager: if self.user in frappe.STANDARD_USERS: return False - reset_pwd_after_days = cint( - frappe.db.get_single_value("System Settings", "force_user_to_reset_password") - ) + reset_pwd_after_days = cint(frappe.get_system_settings("force_user_to_reset_password")) if reset_pwd_after_days: last_password_reset_date = ( @@ -356,12 +356,19 @@ class CookieManager: if not frappe.local.session.get("sid"): return - # sid expires in 3 days - expires = datetime.datetime.now() + datetime.timedelta(days=3) if frappe.session.sid: - self.set_cookie("sid", frappe.session.sid, expires=expires, httponly=True) + self.set_cookie("sid", frappe.session.sid, max_age=get_expiry_in_seconds(), httponly=True) - def set_cookie(self, key, value, expires=None, secure=False, httponly=False, samesite="Lax"): + def set_cookie( + self, + key, + value, + expires=None, + secure=False, + httponly=False, + samesite="Lax", + max_age=None, + ): if not secure and hasattr(frappe.local, "request"): secure = frappe.local.request.scheme == "https" @@ -371,6 +378,7 @@ class CookieManager: "secure": secure, "httponly": httponly, "samesite": samesite, + "max_age": max_age, } def delete_cookie(self, to_delete): @@ -379,7 +387,7 @@ class CookieManager: self.to_delete.extend(to_delete) - def flush_cookies(self, response): + def flush_cookies(self, response: Response): for key, opts in self.cookies.items(): response.set_cookie( key, @@ -388,6 +396,7 @@ class CookieManager: secure=opts.get("secure"), httponly=opts.get("httponly"), samesite=opts.get("samesite"), + max_age=opts.get("max_age"), ) # expires yesterday! diff --git a/frappe/automation/doctype/assignment_rule/assignment_rule.py b/frappe/automation/doctype/assignment_rule/assignment_rule.py index 4ceff84573..82f1c7d799 100644 --- a/frappe/automation/doctype/assignment_rule/assignment_rule.py +++ b/frappe/automation/doctype/assignment_rule/assignment_rule.py @@ -9,6 +9,7 @@ from frappe.cache_manager import clear_doctype_map, get_doctype_map from frappe.desk.form import assign_to from frappe.model import log_types from frappe.model.document import Document +from frappe.utils.data import comma_and class AssignmentRule(Document): @@ -55,14 +56,10 @@ class AssignmentRule(Document): def validate_assignment_days(self): assignment_days = self.get_assignment_days() - if len(set(assignment_days)) != len(assignment_days): - repeated_days = get_repeated(assignment_days) - plural = "s" if len(repeated_days) > 1 else "" - frappe.throw( - _("Assignment Day{0} {1} has been repeated.").format( - plural, frappe.bold(", ".join(repeated_days)) + _("The following Assignment Days have been repeated: {0}").format( + comma_and([_(day) for day in get_repeated(assignment_days)], add_quotes=False) ) ) diff --git a/frappe/automation/doctype/auto_repeat/auto_repeat.py b/frappe/automation/doctype/auto_repeat/auto_repeat.py index 956bb0c9c3..e8db131ebb 100644 --- a/frappe/automation/doctype/auto_repeat/auto_repeat.py +++ b/frappe/automation/doctype/auto_repeat/auto_repeat.py @@ -550,7 +550,7 @@ def get_auto_repeat_doctypes(doctype, txt, searchfield, start, page_len, filters docs += [r.name for r in res] docs = set(list(docs)) - return [[d] for d in docs] + return [[d] for d in docs if txt in d] @frappe.whitelist() diff --git a/frappe/build.py b/frappe/build.py index 03b830f0cb..49021ae6bb 100644 --- a/frappe/build.py +++ b/frappe/build.py @@ -229,6 +229,7 @@ def bundle( skip_frappe=False, files=None, save_metafiles=False, + using_cached=False, ): """concat / minify js files""" setup() @@ -246,7 +247,10 @@ def bundle( if files: command += " --files {files}".format(files=",".join(files)) - command += " --run-build-command" + if using_cached: + command += " --using-cached" + else: + command += " --run-build-command" if save_metafiles: command += " --save-metafiles" diff --git a/frappe/commands/site.py b/frappe/commands/site.py index f016724f87..3b6fcb32f1 100644 --- a/frappe/commands/site.py +++ b/frappe/commands/site.py @@ -53,6 +53,7 @@ from frappe.exceptions import SiteNotSpecifiedError default=True, help="Create user and database in mariadb/postgres; only bootstrap if false", ) +@click.option("--db-user", help="Database user if you already have one") def new_site( site, db_root_username=None, @@ -68,6 +69,7 @@ def new_site( db_type=None, db_host=None, db_port=None, + db_user=None, set_default=False, setup_db=True, ): @@ -91,6 +93,7 @@ def new_site( db_type=db_type, db_host=db_host, db_port=db_port, + db_user=db_user, setup_db=setup_db, ) @@ -319,7 +322,7 @@ def restore_backup( ) except Exception as err: - print(err.args[1]) + print(err) sys.exit(1) @@ -339,7 +342,7 @@ def partial_restore(context, sql_file_path, verbose, encryption_key=None): site = get_site(context) verbose = context.verbose or verbose frappe.init(site=site) - frappe.connect(site=site) + frappe.connect() err, out = frappe.utils.execute_in_shell(f"file {sql_file_path}", check_exit_code=True) if err: click.secho("Failed to detect type of backup file", fg="red") @@ -535,7 +538,8 @@ def add_db_index(context, doctype, column): columns = column # correct naming for site in context.sites: - frappe.connect(site=site) + frappe.init(site=site) + frappe.connect() try: frappe.db.add_index(doctype, columns) if len(columns) == 1: @@ -577,7 +581,8 @@ def describe_database_table(context, doctype, column): import json for site in context.sites: - frappe.connect(site=site) + frappe.init(site=site) + frappe.connect() try: data = _extract_table_stats(doctype, column) # NOTE: Do not print anything else in this to avoid clobbering the output. @@ -663,7 +668,8 @@ def add_system_manager(context, email, first_name, last_name, send_welcome_email import frappe.utils.user for site in context.sites: - frappe.connect(site=site) + frappe.init(site=site) + frappe.connect() try: frappe.utils.user.add_system_manager(email, first_name, last_name, send_welcome_email, password) frappe.db.commit() @@ -689,7 +695,8 @@ def add_user_for_sites( import frappe.utils.user for site in context.sites: - frappe.connect(site=site) + frappe.init(site=site) + frappe.connect() try: add_new_user(email, first_name, last_name, user_type, send_welcome_email, password, add_role) frappe.db.commit() @@ -1058,7 +1065,11 @@ def _drop_site( sys.exit(1) click.secho("Dropping site database and user", fg="green") - drop_user_and_database(frappe.conf.db_name, db_root_username, db_root_password) + + frappe.flags.root_login = db_root_username + frappe.flags.root_password = db_root_password + + drop_user_and_database(frappe.conf.db_name, frappe.conf.db_user) archived_sites_path = archived_sites_path or os.path.join( frappe.utils.get_bench_path(), "archived", "sites" @@ -1336,7 +1347,6 @@ def build_search_index(context): @click.option("--no-backup", is_flag=True, default=False, help="Do not backup the table") @pass_context def clear_log_table(context, doctype, days, no_backup): - """If any logtype table grows too large then clearing it with DELETE query is not feasible in reasonable time. This command copies recent data to new table and replaces current table with new smaller table. diff --git a/frappe/commands/translate.py b/frappe/commands/translate.py index 5042843405..247d4a77d5 100644 --- a/frappe/commands/translate.py +++ b/frappe/commands/translate.py @@ -34,7 +34,8 @@ def new_language(context, lang_code, app): raise Exception("--site is required") # init site - frappe.connect(site=context["sites"][0]) + frappe.init(site=context["sites"][0]) + frappe.connect() frappe.translate.write_translations_file(app, lang_code) print( diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index 8f6cb70d17..333c37669f 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -36,6 +36,13 @@ EXTRA_ARGS_CTX = {"ignore_unknown_options": True, "allow_extra_args": True} default=False, help="Saves esbuild metafiles for built assets. Useful for analyzing bundle size. More info: https://esbuild.github.io/api/#metafile", ) +@click.option( + "--using-cached", + is_flag=True, + default=False, + envvar="USING_CACHED", + help="Skips build and uses cached build artifacts (cache is set by Bench). Ignored if developer_mode enabled.", +) def build( app=None, apps=None, @@ -44,6 +51,7 @@ def build( verbose=False, force=False, save_metafiles=False, + using_cached=False, ): "Compile JS and CSS source files" from frappe.build import bundle, download_frappe_assets @@ -69,6 +77,9 @@ def build( if production: mode = "production" + if development: + using_cached = False + bundle( mode, apps=apps, @@ -76,6 +87,7 @@ def build( verbose=verbose, skip_frappe=skip_frappe, save_metafiles=save_metafiles, + using_cached=using_cached, ) if apps and isinstance(apps, str): @@ -108,7 +120,8 @@ def clear_cache(context): for site in context.sites: try: - frappe.connect(site) + frappe.init(site=site) + frappe.connect() frappe.clear_cache() clear_website_cache() finally: @@ -601,7 +614,7 @@ def console(context, autoreload=False): all_apps = frappe.get_installed_apps() failed_to_import = [] - for app in all_apps: + for app in list(all_apps): try: locals()[app] = __import__(app) except ModuleNotFoundError: @@ -759,12 +772,8 @@ def run_tests( click.secho(f"bench --site {site} set-config allow_tests true", fg="green") return - frappe.init(site=site) - - frappe.flags.skip_before_tests = skip_before_tests - frappe.flags.skip_test_records = skip_test_records - ret = frappe.test_runner.main( + site, app, module, doctype, @@ -777,6 +786,8 @@ def run_tests( doctype_list_path=doctype_list_path, failfast=failfast, case=case, + skip_test_records=skip_test_records, + skip_before_tests=skip_before_tests, ) if len(ret.failures) == 0 and len(ret.errors) == 0: diff --git a/frappe/contacts/doctype/address_template/address_template.py b/frappe/contacts/doctype/address_template/address_template.py index 601fb54302..2c9b27e585 100644 --- a/frappe/contacts/doctype/address_template/address_template.py +++ b/frappe/contacts/doctype/address_template/address_template.py @@ -28,7 +28,7 @@ class AddressTemplate(Document): if not self.is_default and not self._get_previous_default(): self.is_default = 1 - if frappe.db.get_single_value("System Settings", "setup_complete"): + if frappe.get_system_settings("setup_complete"): frappe.msgprint(_("Setting this Address Template as default as there is no other default")) def on_update(self): diff --git a/frappe/core/doctype/comment/comment.py b/frappe/core/doctype/comment/comment.py index 946f9833e1..b33b7e6f63 100644 --- a/frappe/core/doctype/comment/comment.py +++ b/frappe/core/doctype/comment/comment.py @@ -93,7 +93,7 @@ class Comment(Document): def remove_comment_from_cache(self): _comments = get_comments_from_parent(self) - for c in _comments: + for c in list(_comments): if c.get("name") == self.name: _comments.remove(c) diff --git a/frappe/core/doctype/communication/mixins.py b/frappe/core/doctype/communication/mixins.py index 2c05570cdb..222778f28e 100644 --- a/frappe/core/doctype/communication/mixins.py +++ b/frappe/core/doctype/communication/mixins.py @@ -146,7 +146,7 @@ class CommunicationEmailMixin: return get_formatted_email(self.mail_sender_fullname(), mail=self.mail_sender()) def get_content(self, print_format=None): - if print_format and frappe.db.get_single_value("System Settings", "attach_view_link"): + if print_format and frappe.get_system_settings("attach_view_link"): return self.content + self.get_attach_link(print_format) return self.content diff --git a/frappe/core/doctype/data_export/data_export.js b/frappe/core/doctype/data_export/data_export.js index afac4dd3a6..1808578d31 100644 --- a/frappe/core/doctype/data_export/data_export.js +++ b/frappe/core/doctype/data_export/data_export.js @@ -41,7 +41,7 @@ const can_export = (frm) => { if (!doctype) { frappe.msgprint(__("Please select the Document Type.")); } else if (!parent_multicheck_options.length) { - frappe.msgprint(__("Atleast one field of Parent Document Type is mandatory")); + frappe.msgprint(__("At least one field of Parent Document Type is mandatory")); } else { is_valid_form = true; } @@ -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), value: df.fieldname, danger: df.reqd, checked: 1, @@ -163,7 +163,7 @@ const add_doctype_field_multicheck_control = (doctype, parent_wrapper) => { const multicheck_control = frappe.ui.form.make_control({ parent: parent_wrapper, df: { - label: doctype, + label: __(doctype), fieldname: doctype + "_fields", fieldtype: "MultiCheck", options: options, diff --git a/frappe/core/doctype/data_import/data_import.js b/frappe/core/doctype/data_import/data_import.js index 9f0e11a7b7..c27ea9a062 100644 --- a/frappe/core/doctype/data_import/data_import.js +++ b/frappe/core/doctype/data_import/data_import.js @@ -135,34 +135,29 @@ frappe.ui.form.on("Data Import", { let failed_records = cint(r.message.failed); let total_records = cint(r.message.total_records); - if (!total_records) return; - let action, message; - if (frm.doc.import_type === "Insert New Records") { - action = "imported"; - } else { - action = "updated"; + if (!total_records) { + return; } - if (failed_records === 0) { - let message_args = [action, successful_records]; - if (successful_records === 1) { - message = __("Successfully {0} 1 record.", message_args); - } else { - message = __("Successfully {0} {1} records.", message_args); - } + let message; + if (frm.doc.import_type === "Insert New Records") { + message = __("Successfully imported {0} out of {1} records.", [ + successful_records, + total_records, + ]); } else { - let message_args = [action, successful_records, total_records]; - if (successful_records === 1) { - message = __( - "Successfully {0} {1} record out of {2}. Click on Export Errored Rows, fix the errors and import again.", - message_args + message = __("Successfully updated {0} out of {1} records.", [ + successful_records, + total_records, + ]); + } + + if (failed_records > 0) { + message += + "
" + + __( + "Please click on 'Export Errored Rows', fix the errors and import again." ); - } else { - message = __( - "Successfully {0} {1} records out of {2}. Click on Export Errored Rows, fix the errors and import again.", - message_args - ); - } } // If the job timed out, display an extra hint @@ -506,13 +501,7 @@ frappe.ui.form.on("Data Import", { }, show_import_log(frm) { - if (!frm.doc.show_failed_logs) { - frm.toggle_display("import_log_preview", false); - return; - } - frm.toggle_display("import_log_section", false); - frm.toggle_display("import_log_preview", true); if (frm.import_in_progress) { return; diff --git a/frappe/core/doctype/data_import/data_import.json b/frappe/core/doctype/data_import/data_import.json index 97716219a2..02d65c8004 100644 --- a/frappe/core/doctype/data_import/data_import.json +++ b/frappe/core/doctype/data_import/data_import.json @@ -139,7 +139,7 @@ "default": "0", "fieldname": "show_failed_logs", "fieldtype": "Check", - "label": "Show Failed Logs" + "label": "Show Only Failed Logs" }, { "depends_on": "eval:!doc.__islocal && !doc.import_file", @@ -171,7 +171,7 @@ ], "hide_toolbar": 1, "links": [], - "modified": "2023-12-15 12:45:49.452834", + "modified": "2024-01-30 17:08:05.566686", "modified_by": "Administrator", "module": "Core", "name": "Data Import", diff --git a/frappe/core/doctype/data_import/data_import.py b/frappe/core/doctype/data_import/data_import.py index ac28f9091f..b63b5cd2a7 100644 --- a/frappe/core/doctype/data_import/data_import.py +++ b/frappe/core/doctype/data_import/data_import.py @@ -38,7 +38,6 @@ class DataImport(Document): submit_after_import: DF.Check template_options: DF.Code | None template_warnings: DF.Code | None - # end: auto-generated types def validate(self): @@ -93,7 +92,8 @@ class DataImport(Document): def start_import(self): from frappe.utils.scheduler import is_scheduler_inactive - if is_scheduler_inactive() and not frappe.flags.in_test: + run_now = frappe.flags.in_test or frappe.conf.developer_mode + if is_scheduler_inactive() and not run_now: frappe.throw(_("Scheduler is inactive. Cannot import data."), title=_("Scheduler Inactive")) job_id = f"data_import::{self.name}" @@ -106,7 +106,7 @@ class DataImport(Document): event="data_import", job_id=job_id, data_import=self.name, - now=frappe.conf.developer_mode or frappe.flags.in_test, + now=run_now, ) return True diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index 22b84d1cbc..7b188569d7 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -157,6 +157,7 @@ }, { "default": "0", + "depends_on": "eval:!doc.is_virtual", "fieldname": "in_list_view", "fieldtype": "Check", "label": "In List View", @@ -580,7 +581,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2023-11-16 11:26:56.364594", + "modified": "2024-02-01 15:55:44.007917", "modified_by": "Administrator", "module": "Core", "name": "DocField", diff --git a/frappe/core/doctype/docfield/docfield.py b/frappe/core/doctype/docfield/docfield.py index 01fa56a9ce..ed663c3bba 100644 --- a/frappe/core/doctype/docfield/docfield.py +++ b/frappe/core/doctype/docfield/docfield.py @@ -117,6 +117,7 @@ class DocField(Document): unique: DF.Check width: DF.Data | None # end: auto-generated types + def get_link_doctype(self): """Return the Link doctype for the `docfield` (if applicable). diff --git a/frappe/core/doctype/docshare/test_docshare.py b/frappe/core/doctype/docshare/test_docshare.py index 125e829d9b..3b6ec0c396 100644 --- a/frappe/core/doctype/docshare/test_docshare.py +++ b/frappe/core/doctype/docshare/test_docshare.py @@ -56,6 +56,24 @@ class TestDocShare(FrappeTestCase): with self.assertRowsRead(1): self.assertTrue(self.event.has_permission()) + def test_list_permission(self): + frappe.set_user(self.user) + with self.assertRaises(frappe.PermissionError): + frappe.get_list("Web Page") + + frappe.set_user("Administrator") + doc = frappe.new_doc("Web Page") + doc.update({"title": "test document for docshare permissions"}) + doc.insert() + frappe.share.add("Web Page", doc.name, self.user) + + frappe.set_user(self.user) + self.assertEqual(len(frappe.get_list("Web Page")), 1) + + doc.delete(ignore_permissions=True) + with self.assertRaises(frappe.PermissionError): + frappe.get_list("Web Page") + def test_share_permission(self): frappe.share.add("Event", self.event.name, self.user, write=1, share=1) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 73c9fda5dc..f71ed048cb 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -4,13 +4,10 @@ import copy import json import os - -# imports - standard imports import re import shutil from typing import TYPE_CHECKING, Union -# imports - module imports import frappe from frappe import _ from frappe.cache_manager import clear_controller_cache, clear_user_cache @@ -1614,7 +1611,6 @@ def validate_fields(meta): check_illegal_characters(d.fieldname) check_invalid_fieldnames(meta.get("name"), d.fieldname) - check_unique_fieldname(meta.get("name"), d.fieldname) check_fieldname_length(d.fieldname) check_hidden_and_mandatory(meta.get("name"), d) check_unique_and_text(meta.get("name"), d) @@ -1624,6 +1620,7 @@ def validate_fields(meta): validate_data_field_type(d) if not frappe.flags.in_migrate: + check_unique_fieldname(meta.get("name"), d.fieldname) check_link_table_options(meta.get("name"), d) check_illegal_mandatory(meta.get("name"), d) check_dynamic_link_options(d) diff --git a/frappe/core/doctype/doctype/doctype_list.js b/frappe/core/doctype/doctype/doctype_list.js index 56f345420f..a3cf3c8142 100644 --- a/frappe/core/doctype/doctype/doctype_list.js +++ b/frappe/core/doctype/doctype/doctype_list.js @@ -3,7 +3,19 @@ frappe.listview_settings["DocType"] = { this.new_doctype_dialog(); }, - new_doctype_dialog() { + new_doctype_dialog(args) { + const { + doctype_name = "", + doctype_module = "", + is_submittable = 0, + is_child = 0, + is_virtual = 0, + is_single = 0, + is_tree = 0, + is_custom = 0, + editable_grid = 1, + } = args || {}; + let non_developer = frappe.session.user !== "Administrator" || !frappe.boot.developer_mode; let fields = [ { @@ -11,6 +23,7 @@ frappe.listview_settings["DocType"] = { fieldname: "name", fieldtype: "Data", reqd: 1, + default: doctype_name, }, { fieldtype: "Column Break" }, { @@ -19,6 +32,7 @@ frappe.listview_settings["DocType"] = { fieldtype: "Link", options: "Module Def", reqd: 1, + default: doctype_module, }, { fieldtype: "Section Break" }, { @@ -29,6 +43,7 @@ frappe.listview_settings["DocType"] = { "Once submitted, submittable documents cannot be changed. They can only be Cancelled and Amended." ), depends_on: "eval:!doc.istable && !doc.issingle", + default: is_submittable, }, { label: __("Is Child Table"), @@ -36,13 +51,14 @@ frappe.listview_settings["DocType"] = { fieldtype: "Check", description: __("Child Tables are shown as a Grid in other DocTypes"), depends_on: "eval:!doc.is_submittable && !doc.issingle", + default: is_child, }, { label: __("Editable Grid"), fieldname: "editable_grid", fieldtype: "Check", depends_on: "istable", - default: 1, + default: editable_grid, }, { label: __("Is Single"), @@ -52,12 +68,13 @@ frappe.listview_settings["DocType"] = { "Single Types have only one record no tables associated. Values are stored in tabSingles" ), depends_on: "eval:!doc.istable && !doc.is_submittable", + default: is_single, }, { label: "Is Tree", fieldname: "is_tree", fieldtype: "Check", - default: "0", + default: is_tree, depends_on: "eval:!doc.istable", description: "Tree structures are implemented using Nested Set", }, @@ -65,7 +82,7 @@ frappe.listview_settings["DocType"] = { label: __("Custom?"), fieldname: "custom", fieldtype: "Check", - default: non_developer, + default: non_developer || is_custom, read_only: non_developer, }, ]; @@ -75,7 +92,7 @@ frappe.listview_settings["DocType"] = { label: "Is Virtual", fieldname: "is_virtual", fieldtype: "Check", - default: "0", + default: is_virtual, }); } diff --git a/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py b/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py index d1a6fbe90d..8fc1584aa3 100644 --- a/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py +++ b/frappe/core/doctype/document_naming_settings/test_document_naming_settings.py @@ -40,8 +40,8 @@ class TestNamingSeries(FrappeTestCase): def get_valid_serieses(self): VALID_SERIES = ["SINV-", "SI-.{field}.", "SI-#.###", ""] - exisiting_series = self.dns.get_transactions_and_prefixes()["prefixes"] - return VALID_SERIES + exisiting_series + existing_series = self.dns.get_transactions_and_prefixes()["prefixes"] + return VALID_SERIES + existing_series def test_naming_preview(self): self.dns.transaction_type = self.ns_doctype diff --git a/frappe/core/doctype/file/file.py b/frappe/core/doctype/file/file.py index de4375ae6c..02cf453d2b 100755 --- a/frappe/core/doctype/file/file.py +++ b/frappe/core/doctype/file/file.py @@ -756,6 +756,13 @@ class File(Document): self.save_file(content=optimized_content, overwrite=True) self.save() + @property + def unique_url(self) -> str: + """Unique URL contains file ID in URL to speed up permisison checks.""" + from urllib.parse import urlencode + + return self.file_url + "?" + urlencode({"fid": self.name}) + @staticmethod def zip_files(files): zip_file = io.BytesIO() diff --git a/frappe/core/doctype/role_profile/role_profile.py b/frappe/core/doctype/role_profile/role_profile.py index 22a6d0a9a7..d0fd42edfa 100644 --- a/frappe/core/doctype/role_profile/role_profile.py +++ b/frappe/core/doctype/role_profile/role_profile.py @@ -25,7 +25,11 @@ class RoleProfile(Document): self.name = self.role_profile def on_update(self): - self.queue_action("update_all_users", now=frappe.flags.in_test) + self.queue_action( + "update_all_users", + now=frappe.flags.in_test or frappe.flags.in_install, + enqueue_after_commit=True, + ) def update_all_users(self): """Changes in role_profile reflected across all its user""" diff --git a/frappe/core/doctype/server_script/test_server_script.py b/frappe/core/doctype/server_script/test_server_script.py index b83d1edda4..f53d69304a 100644 --- a/frappe/core/doctype/server_script/test_server_script.py +++ b/frappe/core/doctype/server_script/test_server_script.py @@ -238,7 +238,6 @@ frappe.qb.from_(todo).select(todo.name).where(todo.name == "{todo.name}").run() script.execute_method() def test_server_script_rate_limiting(self): - # why not script1 = frappe.get_doc( doctype="Server Script", name="rate_limited_server_script", diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 8f6ee3ca94..4d2b2ea46a 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -94,7 +94,9 @@ "dormant_days", "telemetry_section", "allow_error_traceback", - "enable_telemetry" + "enable_telemetry", + "search_section", + "link_field_results_limit" ], "fields": [ { @@ -634,12 +636,24 @@ { "fieldname": "column_break_uhqk", "fieldtype": "Column Break" + }, + { + "fieldname": "search_section", + "fieldtype": "Section Break", + "label": "Search" + }, + { + "default": "10", + "fieldname": "link_field_results_limit", + "fieldtype": "Int", + "label": "Link Field Results Limit", + "non_negative": 1 } ], "icon": "fa fa-cog", "issingle": 1, "links": [], - "modified": "2023-12-08 15:52:37.525003", + "modified": "2024-01-26 11:29:20.924425", "modified_by": "Administrator", "module": "Core", "name": "System Settings", diff --git a/frappe/core/doctype/system_settings/system_settings.py b/frappe/core/doctype/system_settings/system_settings.py index 1a548b580b..013172a572 100644 --- a/frappe/core/doctype/system_settings/system_settings.py +++ b/frappe/core/doctype/system_settings/system_settings.py @@ -61,6 +61,7 @@ class SystemSettings(Document): hide_footer_in_auto_email_reports: DF.Check language: DF.Link lifespan_qrcode_image: DF.Int + link_field_results_limit: DF.Int login_with_email_link: DF.Check login_with_email_link_expiry: DF.Int logout_on_password_reset: DF.Check @@ -94,6 +95,7 @@ class SystemSettings(Document): two_factor_method: DF.Literal["OTP App", "SMS", "Email"] welcome_email_template: DF.Link | None # end: auto-generated types + def validate(self): from frappe.twofactor import toggle_two_factor_auth @@ -130,6 +132,16 @@ class SystemSettings(Document): self.validate_backup_limit() self.validate_file_extensions() + if not self.link_field_results_limit: + self.link_field_results_limit = 10 + + if self.link_field_results_limit > 50: + self.link_field_results_limit = 50 + label = _(self.meta.get_label("link_field_results_limit")) + frappe.msgprint( + _("{0} can not be more than {1}").format(label, 50), alert=True, indicator="yellow" + ) + def validate_user_pass_login(self): if not self.disable_user_pass_login: return diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 5ed990a794..30a1ccc865 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -462,7 +462,7 @@ "read_only": 1 }, { - "default": "1", + "default": "2", "fieldname": "simultaneous_sessions", "fieldtype": "Int", "label": "Simultaneous Sessions" diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 640048d93a..ec95d54094 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -725,12 +725,8 @@ class User(Document): 3. If allow_login_using_user_name is set, you can use username while finding the user. """ - login_with_mobile = cint( - frappe.db.get_single_value("System Settings", "allow_login_using_mobile_number") - ) - login_with_username = cint( - frappe.db.get_single_value("System Settings", "allow_login_using_user_name") - ) + login_with_mobile = cint(frappe.get_system_settings("allow_login_using_mobile_number")) + login_with_username = cint(frappe.get_system_settings("allow_login_using_user_name")) or_filters = [{"name": user_name}] if login_with_mobile: @@ -840,8 +836,8 @@ def update_password( else: user = res["user"] - logout_all_sessions = cint(logout_all_sessions) or frappe.db.get_single_value( - "System Settings", "logout_on_password_reset" + logout_all_sessions = cint(logout_all_sessions) or frappe.get_system_settings( + "logout_on_password_reset" ) _update_password(user, new_password, logout_all_sessions=cint(logout_all_sessions)) @@ -933,7 +929,7 @@ def _get_user_for_update_password(key, old_password): result.user, last_reset_password_key_generated_on = user or (None, None) if result.user: reset_password_link_expiry = cint( - frappe.db.get_single_value("System Settings", "reset_password_link_expiry_duration") + frappe.get_system_settings("reset_password_link_expiry_duration") ) if ( reset_password_link_expiry @@ -1018,7 +1014,7 @@ def sign_up(email: str, full_name: str, redirect_to: str) -> tuple[int, str]: @frappe.whitelist(allow_guest=True) -@rate_limit(limit=get_password_reset_limit, seconds=24 * 60 * 60) +@rate_limit(limit=get_password_reset_limit, seconds=60 * 60) def reset_password(user: str) -> str: if user == "Administrator": return "not allowed" @@ -1254,34 +1250,37 @@ def create_contact(user, ignore_links=False, ignore_mandatory=False): except frappe.DuplicateEntryError: pass else: - contact = frappe.get_doc("Contact", contact_name) - contact.first_name = user.first_name - contact.last_name = user.last_name - contact.gender = user.gender + try: + contact = frappe.get_doc("Contact", contact_name) + contact.first_name = user.first_name + contact.last_name = user.last_name + contact.gender = user.gender - # Add mobile number if phone does not exists in contact - if user.phone and not any(new_contact.phone == user.phone for new_contact in contact.phone_nos): - # Set primary phone if there is no primary phone number - contact.add_phone( - user.phone, - is_primary_phone=not any( - new_contact.is_primary_phone == 1 for new_contact in contact.phone_nos - ), - ) + # Add mobile number if phone does not exists in contact + if user.phone and not any(new_contact.phone == user.phone for new_contact in contact.phone_nos): + # Set primary phone if there is no primary phone number + contact.add_phone( + user.phone, + is_primary_phone=not any( + new_contact.is_primary_phone == 1 for new_contact in contact.phone_nos + ), + ) - # Add mobile number if mobile does not exists in contact - if user.mobile_no and not any( - new_contact.phone == user.mobile_no for new_contact in contact.phone_nos - ): - # Set primary mobile if there is no primary mobile number - contact.add_phone( - user.mobile_no, - is_primary_mobile_no=not any( - new_contact.is_primary_mobile_no == 1 for new_contact in contact.phone_nos - ), - ) + # Add mobile number if mobile does not exists in contact + if user.mobile_no and not any( + new_contact.phone == user.mobile_no for new_contact in contact.phone_nos + ): + # Set primary mobile if there is no primary mobile number + contact.add_phone( + user.mobile_no, + is_primary_mobile_no=not any( + new_contact.is_primary_mobile_no == 1 for new_contact in contact.phone_nos + ), + ) - contact.save(ignore_permissions=True) + contact.save(ignore_permissions=True) + except frappe.TimestampMismatchError: + raise frappe.RetryBackgroundJobError def get_restricted_ip_list(user): diff --git a/frappe/core/doctype/user_permission/user_permission_list.js b/frappe/core/doctype/user_permission/user_permission_list.js index ce5e624403..45602b973c 100644 --- a/frappe/core/doctype/user_permission/user_permission_list.js +++ b/frappe/core/doctype/user_permission/user_permission_list.js @@ -121,7 +121,7 @@ frappe.listview_settings["User Permission"] = { callback: function (r) { if (r.message === 1) { frappe.show_alert({ - message: __("User Permissions created sucessfully"), + message: __("User Permissions created successfully"), indicator: "blue", }); } else { diff --git a/frappe/core/page/permission_manager/permission_manager.js b/frappe/core/page/permission_manager/permission_manager.js index f25ec6d4ad..308bbfedba 100644 --- a/frappe/core/page/permission_manager/permission_manager.js +++ b/frappe/core/page/permission_manager/permission_manager.js @@ -253,6 +253,10 @@ frappe.PermissionEngine = class PermissionEngine { if (!d.is_submittable && ["submit", "cancel", "amend"].includes(r)) return; if (d.in_create && ["create", "delete"].includes(r)) return; this.add_check(perm_container, d, r); + + if (d.if_owner && r == "report") { + perm_container.find("div[data-fieldname='report']").toggle(false); + } }); // buttons @@ -414,6 +418,13 @@ frappe.PermissionEngine = class PermissionEngine { chk.prop("checked", !chk.prop("checked")); } else { me.get_perm(args.role)[args.ptype] = args.value; + + if (args.ptype == "if_owner") { + let report_checkbox = chk + .closest("div.row") + .find("div[data-fieldname='report']"); + report_checkbox.toggle(!args.value); + } } }, }); diff --git a/frappe/core/page/permission_manager/permission_manager.py b/frappe/core/page/permission_manager/permission_manager.py index 71d6a4a002..64c6e7b8bb 100644 --- a/frappe/core/page/permission_manager/permission_manager.py +++ b/frappe/core/page/permission_manager/permission_manager.py @@ -129,8 +129,15 @@ def update( frappe.clear_cache(doctype=doctype) frappe.only_for("System Manager") + + if ptype == "report" and value == "1" and if_owner == "1": + frappe.throw(_("Cannot set 'Report' permission if 'Only If Creator' permission is set")) + out = update_permission_property(doctype, role, permlevel, ptype, value, if_owner=if_owner) + if ptype == "if_owner" and value == "1": + update_permission_property(doctype, role, permlevel, "report", "0", if_owner=value) + frappe.db.after_commit.add(clear_cache) return "refresh" if out else None diff --git a/frappe/core/utils.py b/frappe/core/utils.py index 3e7fb8f350..13b912b3aa 100644 --- a/frappe/core/utils.py +++ b/frappe/core/utils.py @@ -8,7 +8,7 @@ import frappe def get_parent_doc(doc): """Return document of `reference_doctype`, `reference_doctype`.""" - if not hasattr(doc, "parent_doc"): + if not getattr(doc, "parent_doc", None): if doc.reference_doctype and doc.reference_name: doc.parent_doc = frappe.get_doc(doc.reference_doctype, doc.reference_name) else: diff --git a/frappe/core/workspace/build/build.json b/frappe/core/workspace/build/build.json index ad6cd2d287..015b771ed6 100644 --- a/frappe/core/workspace/build/build.json +++ b/frappe/core/workspace/build/build.json @@ -13,21 +13,71 @@ "label": "Build", "links": [ { + "description": "Customize properties, naming, fields and more for standard doctypes", "hidden": 0, "is_query_report": 0, - "label": "Models", - "link_count": 0, + "label": "Customization", + "link_count": 4, "link_type": "DocType", "onboard": 0, - "only_for": "", "type": "Card Break" }, { "hidden": 0, "is_query_report": 0, - "label": "DocType", + "label": "Customize Form", "link_count": 0, - "link_to": "DocType", + "link_to": "Customize Form", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Custom Field", + "link_count": 0, + "link_to": "Custom Field", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Custom Translation", + "link_count": 0, + "link_to": "Translation", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Navbar Settings", + "link_count": 0, + "link_to": "Navbar Settings", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "description": "Group your custom doctypes under modules", + "hidden": 0, + "is_query_report": 0, + "label": "Modules", + "link_count": 2, + "link_type": "DocType", + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Module Def", + "link_count": 0, + "link_to": "Module Def", "link_type": "DocType", "onboard": 0, "only_for": "", @@ -36,22 +86,112 @@ { "hidden": 0, "is_query_report": 0, - "label": "Workflow", + "label": "Module Onboarding", "link_count": 0, - "link_to": "Workflow", + "link_to": "Module Onboarding", "link_type": "DocType", "onboard": 0, "only_for": "", "type": "Link" }, { + "description": "Monitor logs for errors, background jobs, communications, and user activity", + "hidden": 0, + "is_query_report": 0, + "label": "System Logs", + "link_count": 5, + "link_type": "DocType", + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Background Jobs", + "link_count": 0, + "link_to": "RQ Job", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Scheduled Jobs Logs", + "link_count": 0, + "link_to": "Scheduled Job Log", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Error Logs", + "link_count": 0, + "link_to": "Error Log", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Communication Logs", + "link_count": 0, + "link_to": "Communication", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Activity Log", + "link_count": 0, + "link_to": "Activity Log", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "description": "Packages are lightweight apps (collection of Module Defs) that can be created, imported, or released right from the UI", + "hidden": 0, + "is_query_report": 0, + "label": "Packages", + "link_count": 2, + "link_type": "DocType", + "onboard": 0, + "type": "Card Break" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Package", + "link_count": 0, + "link_to": "Package", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Package Import", + "link_count": 0, + "link_to": "Package Import", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, + { + "description": "Automate processes and extend standard functionality using scripts and background jobs", "hidden": 0, "is_query_report": 0, "label": "Scripting", - "link_count": 0, + "link_count": 3, "link_type": "DocType", "onboard": 0, - "only_for": "", "type": "Card Break" }, { @@ -88,38 +228,12 @@ "type": "Link" }, { - "hidden": 0, - "is_query_report": 0, - "label": "Packages", - "link_count": 2, - "onboard": 0, - "type": "Card Break" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Package", - "link_count": 0, - "link_to": "Package", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Package Import", - "link_count": 0, - "link_to": "Package Import", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { + "description": "Build your own reports, print formats, and dashboards. Create personalized workspaces for easier navigation", "hidden": 0, "is_query_report": 0, "label": "Views", "link_count": 5, + "link_type": "DocType", "onboard": 0, "type": "Card Break" }, @@ -177,115 +291,10 @@ "type": "Link" }, { + "description": "Create new forms and views with doctypes. Set up multi-level workflows for approval", "hidden": 0, "is_query_report": 0, - "label": "Customization", - "link_count": 4, - "onboard": 0, - "type": "Card Break" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Customize Form", - "link_count": 0, - "link_to": "Customize Form", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Custom Field", - "link_count": 0, - "link_to": "Custom Field", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Custom Translation", - "link_count": 0, - "link_to": "Translation", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Navbar Settings", - "link_count": 0, - "link_to": "Navbar Settings", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "System Logs", - "link_count": 5, - "onboard": 0, - "type": "Card Break" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Background Jobs", - "link_count": 0, - "link_to": "RQ Job", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Scheduled Jobs Logs", - "link_count": 0, - "link_to": "Scheduled Job Log", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Error Logs", - "link_count": 0, - "link_to": "Error Log", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Communication Logs", - "link_count": 0, - "link_to": "Communication", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Activity Log", - "link_count": 0, - "link_to": "Activity Log", - "link_type": "DocType", - "onboard": 0, - "type": "Link" - }, - { - "hidden": 0, - "is_query_report": 0, - "label": "Modules", + "label": "Models", "link_count": 2, "link_type": "DocType", "onboard": 0, @@ -294,9 +303,9 @@ { "hidden": 0, "is_query_report": 0, - "label": "Module Def", + "label": "DocType", "link_count": 0, - "link_to": "Module Def", + "link_to": "DocType", "link_type": "DocType", "onboard": 0, "only_for": "", @@ -305,16 +314,16 @@ { "hidden": 0, "is_query_report": 0, - "label": "Module Onboarding", + "label": "Workflow", "link_count": 0, - "link_to": "Module Onboarding", + "link_to": "Workflow", "link_type": "DocType", "onboard": 0, "only_for": "", "type": "Link" } ], - "modified": "2024-01-02 15:38:42.806824", + "modified": "2024-01-23 17:27:44.769958", "modified_by": "Administrator", "module": "Core", "name": "Build", @@ -325,7 +334,7 @@ "quick_lists": [], "restrict_to_domain": "", "roles": [], - "sequence_id": 16.0, + "sequence_id": 27.0, "shortcuts": [ { "color": "Grey", diff --git a/frappe/custom/doctype/custom_field/custom_field.js b/frappe/custom/doctype/custom_field/custom_field.js index 38c234a507..d0c61b6d8c 100644 --- a/frappe/custom/doctype/custom_field/custom_field.js +++ b/frappe/custom/doctype/custom_field/custom_field.js @@ -112,27 +112,30 @@ frappe.ui.form.on("Custom Field", { } }, add_rename_field(frm) { - frm.add_custom_button(__("Rename Fieldname"), () => { - frappe.prompt( - { - fieldtype: "Data", - label: __("Fieldname"), - fieldname: "fieldname", - reqd: 1, - }, - function (data) { - frappe.call({ - method: "frappe.custom.doctype.custom_field.custom_field.rename_fieldname", - args: { - custom_field: frm.doc.name, - fieldname: data.fieldname, - }, - }); - }, - __("Rename Fieldname"), - __("Rename") - ); - }); + if (!frm.is_new()) { + frm.add_custom_button(__("Rename Fieldname"), () => { + frappe.prompt( + { + fieldtype: "Data", + label: __("Fieldname"), + fieldname: "fieldname", + reqd: 1, + default: frm.doc.fieldname, + }, + function (data) { + frappe.call({ + method: "frappe.custom.doctype.custom_field.custom_field.rename_fieldname", + args: { + custom_field: frm.doc.name, + fieldname: data.fieldname, + }, + }); + }, + __("Rename Fieldname"), + __("Rename") + ); + }); + } }, }); diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.json b/frappe/custom/doctype/customize_form_field/customize_form_field.json index 67c6c8ba95..0dfd7a6c45 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.json +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.json @@ -130,6 +130,7 @@ }, { "default": "0", + "depends_on": "eval:!doc.is_virtual", "fieldname": "in_list_view", "fieldtype": "Check", "label": "In List View" @@ -483,7 +484,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2023-12-08 15:52:37.525003", + "modified": "2024-02-01 15:56:39.171633", "modified_by": "Administrator", "module": "Custom", "name": "Customize Form Field", diff --git a/frappe/custom/doctype/customize_form_field/customize_form_field.py b/frappe/custom/doctype/customize_form_field/customize_form_field.py index 59b0155a98..76ab6535e3 100644 --- a/frappe/custom/doctype/customize_form_field/customize_form_field.py +++ b/frappe/custom/doctype/customize_form_field/customize_form_field.py @@ -110,4 +110,5 @@ class CustomizeFormField(Document): unique: DF.Check width: DF.Data | None # end: auto-generated types + pass diff --git a/frappe/database/__init__.py b/frappe/database/__init__.py index d88536ad99..178ad80fc9 100644 --- a/frappe/database/__init__.py +++ b/frappe/database/__init__.py @@ -23,47 +23,45 @@ def setup_database(force, verbose=None, no_mariadb_socket=False): ) -def bootstrap_database(db_name, verbose=None, source_sql=None): +def bootstrap_database(verbose=None, source_sql=None): import frappe if frappe.conf.db_type == "postgres": import frappe.database.postgres.setup_db - return frappe.database.postgres.setup_db.bootstrap_database(db_name, verbose, source_sql) + return frappe.database.postgres.setup_db.bootstrap_database(verbose, source_sql) else: import frappe.database.mariadb.setup_db - return frappe.database.mariadb.setup_db.bootstrap_database(db_name, verbose, source_sql) + return frappe.database.mariadb.setup_db.bootstrap_database(verbose, source_sql) -def drop_user_and_database(db_name, root_login=None, root_password=None): +def drop_user_and_database(db_name, db_user): import frappe if frappe.conf.db_type == "postgres": import frappe.database.postgres.setup_db - return frappe.database.postgres.setup_db.drop_user_and_database( - db_name, root_login, root_password - ) + return frappe.database.postgres.setup_db.drop_user_and_database(db_name, db_user) else: import frappe.database.mariadb.setup_db - return frappe.database.mariadb.setup_db.drop_user_and_database( - db_name, root_login, root_password - ) + return frappe.database.mariadb.setup_db.drop_user_and_database(db_name, db_user) -def get_db(host=None, user=None, password=None, port=None): +def get_db(host=None, user=None, password=None, port=None, cur_db_name=None): import frappe if frappe.conf.db_type == "postgres": import frappe.database.postgres.database - return frappe.database.postgres.database.PostgresDatabase(host, user, password, port=port) + return frappe.database.postgres.database.PostgresDatabase( + host, user, password, port, cur_db_name + ) else: import frappe.database.mariadb.database - return frappe.database.mariadb.database.MariaDBDatabase(host, user, password, port=port) + return frappe.database.mariadb.database.MariaDBDatabase(host, user, password, port, cur_db_name) def get_command( @@ -77,12 +75,7 @@ def get_command( else: bin, bin_name = which("psql"), "psql" - host = frappe.utils.esc(host, "$ ") - user = frappe.utils.esc(user, "$ ") - db_name = frappe.utils.esc(db_name, "$ ") - if password: - password = frappe.utils.esc(password, "$ ") conn_string = f"postgresql://{user}:{password}@{host}:{port}/{db_name}" else: conn_string = f"postgresql://{user}@{host}:{port}/{db_name}" @@ -98,10 +91,6 @@ def get_command( else: bin, bin_name = which("mariadb") or which("mysql"), "mariadb" - host = frappe.utils.esc(host, "$ ") - user = frappe.utils.esc(user, "$ ") - db_name = frappe.utils.esc(db_name, "$ ") - command = [ f"--user={user}", f"--host={host}", @@ -109,7 +98,6 @@ def get_command( ] if password: - password = frappe.utils.esc(password, "$ ") command.append(f"--password={password}") if dump: diff --git a/frappe/database/database.py b/frappe/database/database.py index b117c2c6dc..e8e29dbc2a 100644 --- a/frappe/database/database.py +++ b/frappe/database/database.py @@ -40,7 +40,6 @@ if TYPE_CHECKING: from pymysql.connections import Connection as MariadbConnection from pymysql.cursors import Cursor as MariadbCursor - IFNULL_PATTERN = re.compile(r"ifnull\(", flags=re.IGNORECASE) INDEX_PATTERN = re.compile(r"\s*\([^)]+\)\s*") SINGLE_WORD_PATTERN = re.compile(r'([`"]?)(tab([A-Z]\w+))\1') @@ -74,27 +73,20 @@ class Database: host=None, user=None, password=None, - ac_name=None, - use_default=0, port=None, + cur_db_name=None, ): self.setup_type_map() - self.host = host or frappe.conf.db_host - self.port = port or frappe.conf.db_port - self.user = user or frappe.conf.db_name - self.cur_db_name = frappe.conf.db_name + self.host = host + self.port = port + self.user = user + self.password = password + self.cur_db_name = cur_db_name self._conn = None - if ac_name: - self.user = ac_name or frappe.conf.db_name - - if use_default: - self.user = frappe.conf.db_name - self.transaction_writes = 0 self.auto_commit_on_many_writes = 0 - self.password = password or frappe.conf.db_password self.value_cache = {} self.logger = frappe.logger("database") self.logger.setLevel("WARNING") @@ -104,8 +96,8 @@ class Database: self.before_rollback = CallbackManager() self.after_rollback = CallbackManager() - # self.db_type: str - # self.last_query (lazy) attribute of last sql query executed + # self.db_type: str + # self.last_query (lazy) attribute of last sql query executed def setup_type_map(self): pass @@ -784,7 +776,7 @@ class Database: Example: # Update the `deny_multiple_sessions` field in System Settings DocType. - company = frappe.db.set_single_value("System Settings", "deny_multiple_sessions", True) + frappe.db.set_single_value("System Settings", "deny_multiple_sessions", True) """ to_update = self._get_update_dict( diff --git a/frappe/database/db_manager.py b/frappe/database/db_manager.py index 4e1404084e..ef399aac6c 100644 --- a/frappe/database/db_manager.py +++ b/frappe/database/db_manager.py @@ -16,7 +16,7 @@ class DbManager: def create_user(self, user, password, host=None): host = host or self.get_current_host() password_predicate = f" IDENTIFIED BY '{password}'" if password else "" - self.db.sql(f"CREATE USER '{user}'@'{host}'{password_predicate}") + self.db.sql(f"CREATE USER IF NOT EXISTS '{user}'@'{host}'{password_predicate}") def delete_user(self, target, host=None): host = host or self.get_current_host() diff --git a/frappe/database/mariadb/database.py b/frappe/database/mariadb/database.py index 4c4c468fe4..4a37ab6cc3 100644 --- a/frappe/database/mariadb/database.py +++ b/frappe/database/mariadb/database.py @@ -124,7 +124,7 @@ class MariaDBConnectionUtil: "use_unicode": True, } - if self.user not in (frappe.flags.root_login, "root"): + if self.cur_db_name: conn_settings["database"] = self.cur_db_name if self.port: diff --git a/frappe/database/mariadb/setup_db.py b/frappe/database/mariadb/setup_db.py index de1173e507..28fa232022 100644 --- a/frappe/database/mariadb/setup_db.py +++ b/frappe/database/mariadb/setup_db.py @@ -26,55 +26,58 @@ def get_mariadb_version(version_string: str = ""): def setup_database(force, verbose, no_mariadb_socket=False): frappe.local.session = frappe._dict({"user": "Administrator"}) + db_user = frappe.conf.db_user db_name = frappe.local.conf.db_name - root_conn = get_root_connection(frappe.flags.root_login, frappe.flags.root_password) + root_conn = get_root_connection() dbman = DbManager(root_conn) dbman_kwargs = {} if no_mariadb_socket: dbman_kwargs["host"] = "%" + dbman.create_user(db_user, frappe.conf.db_password, **dbman_kwargs) + if verbose: + print(f"Created or updated user {db_user}") + if force or (db_name not in dbman.get_database_list()): - dbman.delete_user(db_name, **dbman_kwargs) dbman.drop_database(db_name) else: raise Exception(f"Database {db_name} already exists") - dbman.create_user(db_name, frappe.conf.db_password, **dbman_kwargs) - if verbose: - print("Created user %s" % db_name) - dbman.create_database(db_name) if verbose: print("Created database %s" % db_name) - dbman.grant_all_privileges(db_name, db_name, **dbman_kwargs) + dbman.grant_all_privileges(db_name, db_user, **dbman_kwargs) dbman.flush_privileges() if verbose: - print(f"Granted privileges to user {db_name} and database {db_name}") + print(f"Granted privileges to user {db_user} and database {db_name}") # close root connection root_conn.close() -def drop_user_and_database(db_name, root_login, root_password): - frappe.local.db = get_root_connection(root_login, root_password) +def drop_user_and_database( + db_name, + db_user, +): + frappe.local.db = get_root_connection() dbman = DbManager(frappe.local.db) dbman.drop_database(db_name) - dbman.delete_user(db_name, host="%") - dbman.delete_user(db_name) + dbman.delete_user(db_user, host="%") + dbman.delete_user(db_user) -def bootstrap_database(db_name, verbose, source_sql=None): +def bootstrap_database(verbose, source_sql=None): import sys - frappe.connect(db_name=db_name) + frappe.connect() if not check_database_settings(): print("Database settings do not match expected values; stopping database setup.") sys.exit(1) import_db_from_sql(source_sql, verbose) - frappe.connect(db_name=db_name) + frappe.connect() if "tabDefaultValue" not in frappe.db.get_tables(cached=False): from click import secho @@ -96,14 +99,13 @@ def import_db_from_sql(source_sql=None, verbose=False): if not source_sql: source_sql = os.path.join(os.path.dirname(__file__), "framework_mariadb.sql") DbManager(frappe.local.db).restore_database( - verbose, db_name, source_sql, db_name, frappe.conf.db_password + verbose, db_name, source_sql, frappe.conf.db_user, frappe.conf.db_password ) if verbose: print("Imported from database %s" % source_sql) def check_database_settings(): - check_compatible_versions() # Check each expected value vs. actuals: @@ -152,24 +154,26 @@ def check_compatible_versions(): ) -def get_root_connection(root_login, root_password): - import getpass - +def get_root_connection(): if not frappe.local.flags.root_connection: - if not root_login: - root_login = "root" + from getpass import getpass - if not root_password: - root_password = frappe.conf.get("root_password") or None + if not frappe.flags.root_login: + frappe.flags.root_login = ( + frappe.conf.get("root_login") or input("Enter mysql super user [root]: ") or "root" + ) - if not root_password: - root_password = getpass.getpass("MySQL root password: ") + if not frappe.flags.root_password: + frappe.flags.root_password = frappe.conf.get("root_password") or getpass( + "MySQL root password: " + ) frappe.local.flags.root_connection = frappe.database.get_db( host=frappe.conf.db_host, port=frappe.conf.db_port, - user=root_login, - password=root_password, + user=frappe.flags.root_login, + password=frappe.flags.root_password, + cur_db_name=None, ) return frappe.local.flags.root_connection diff --git a/frappe/database/postgres/database.py b/frappe/database/postgres/database.py index 2ed595d5e7..76cca1faea 100644 --- a/frappe/database/postgres/database.py +++ b/frappe/database/postgres/database.py @@ -161,12 +161,11 @@ class PostgresDatabase(PostgresExceptionUtil, Database): def get_connection(self): conn_settings = { + "dbname": self.cur_db_name, "user": self.user, "host": self.host, "password": self.password, } - if self.user not in (frappe.flags.root_login, "root"): - conn_settings["dbname"] = self.cur_db_name if self.port: conn_settings["port"] = self.port diff --git a/frappe/database/postgres/setup_db.py b/frappe/database/postgres/setup_db.py index 5118a38509..ba45af4cad 100644 --- a/frappe/database/postgres/setup_db.py +++ b/frappe/database/postgres/setup_db.py @@ -7,27 +7,34 @@ from frappe.utils import cint def setup_database(): - root_conn = get_root_connection(frappe.flags.root_login, frappe.flags.root_password) + root_conn = get_root_connection() root_conn.commit() root_conn.sql("end") - root_conn.sql(f"DROP DATABASE IF EXISTS `{frappe.conf.db_name}`") - root_conn.sql(f"DROP USER IF EXISTS {frappe.conf.db_name}") - root_conn.sql(f"CREATE DATABASE `{frappe.conf.db_name}`") - root_conn.sql(f"CREATE user {frappe.conf.db_name} password '{frappe.conf.db_password}'") - root_conn.sql("GRANT ALL PRIVILEGES ON DATABASE `{0}` TO {0}".format(frappe.conf.db_name)) + root_conn.sql(f'DROP DATABASE IF EXISTS "{frappe.conf.db_name}"') + + # If user exists, just update password + if root_conn.sql(f"SELECT 1 FROM pg_roles WHERE rolname='{frappe.conf.db_user}'"): + root_conn.sql(f"ALTER USER \"{frappe.conf.db_user}\" WITH PASSWORD '{frappe.conf.db_password}'") + else: + root_conn.sql(f"CREATE USER \"{frappe.conf.db_user}\" WITH PASSWORD '{frappe.conf.db_password}'") + root_conn.sql(f'CREATE DATABASE "{frappe.conf.db_name}"') + root_conn.sql( + f'GRANT ALL PRIVILEGES ON DATABASE "{frappe.conf.db_name}" TO "{frappe.conf.db_user}"' + ) if psql_version := root_conn.sql("SELECT VERSION()", as_dict=True): version_string = psql_version[0].get("version") or "PostgreSQL 14" major_version = cint(re.split(r"[\w\.]", version_string)[1]) if major_version > 15: - root_conn.sql("ALTER DATABASE `{0}` OWNER TO {0}".format(frappe.conf.db_name)) + root_conn.sql(f'ALTER DATABASE "{frappe.conf.db_name}" OWNER TO "{frappe.conf.db_user}"') root_conn.close() -def bootstrap_database(db_name, verbose, source_sql=None): - frappe.connect(db_name=db_name) - import_db_from_sql(source_sql, verbose) - frappe.connect(db_name=db_name) +def bootstrap_database(verbose, source_sql=None): + frappe.connect() + import_db_from_sql(source_sql, verbose) + + frappe.connect() if "tabDefaultValue" not in frappe.db.get_tables(): import sys @@ -49,42 +56,39 @@ def import_db_from_sql(source_sql=None, verbose=False): if not source_sql: source_sql = os.path.join(os.path.dirname(__file__), "framework_postgres.sql") DbManager(frappe.local.db).restore_database( - verbose, db_name, source_sql, db_name, frappe.conf.db_password + verbose, db_name, source_sql, frappe.conf.db_user, frappe.conf.db_password ) if verbose: print("Imported from database %s" % source_sql) -def get_root_connection(root_login=None, root_password=None): +def get_root_connection(): if not frappe.local.flags.root_connection: - if not root_login: - root_login = frappe.conf.get("root_login") or None + from getpass import getpass - if not root_login: - root_login = input("Enter postgres super user: ") + if not frappe.flags.root_login: + frappe.flags.root_login = ( + frappe.conf.get("root_login") or input("Enter postgres super user [postgres]: ") or "postgres" + ) - if not root_password: - root_password = frappe.conf.get("root_password") or None - - if not root_password: - from getpass import getpass - - root_password = getpass("Postgres super user password: ") + if not frappe.flags.root_password: + frappe.flags.root_password = frappe.conf.get("root_password") or getpass( + "Postgres super user password: " + ) frappe.local.flags.root_connection = frappe.database.get_db( host=frappe.conf.db_host, port=frappe.conf.db_port, - user=root_login, - password=root_password, + user=frappe.flags.root_login, + password=frappe.flags.root_password, + cur_db_name=frappe.flags.root_login, ) return frappe.local.flags.root_connection -def drop_user_and_database(db_name, root_login, root_password): - root_conn = get_root_connection( - frappe.flags.root_login or root_login, frappe.flags.root_password or root_password - ) +def drop_user_and_database(db_name, db_user): + root_conn = get_root_connection() root_conn.commit() root_conn.sql( "SELECT pg_terminate_backend (pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = %s", @@ -92,4 +96,4 @@ def drop_user_and_database(db_name, root_login, root_password): ) root_conn.sql("end") root_conn.sql(f"DROP DATABASE IF EXISTS {db_name}") - root_conn.sql(f"DROP USER IF EXISTS {db_name}") + root_conn.sql(f"DROP USER IF EXISTS {db_user}") diff --git a/frappe/desk/doctype/desktop_icon/desktop_icon.py b/frappe/desk/doctype/desktop_icon/desktop_icon.py index fda9eed7bb..1c3c2d1c86 100644 --- a/frappe/desk/doctype/desktop_icon/desktop_icon.py +++ b/frappe/desk/doctype/desktop_icon/desktop_icon.py @@ -271,7 +271,7 @@ def set_desktop_icons(visible_list, ignore_duplicate=True): frappe.db.sql("update `tabDesktop Icon` set blocked=0, hidden=1 where standard=1") # set as visible if present, or add icon - for module_name in visible_list: + for module_name in list(visible_list): name = frappe.db.get_value("Desktop Icon", {"module_name": module_name}) if name: frappe.db.set_value("Desktop Icon", name, "hidden", 0) diff --git a/frappe/desk/doctype/event/event.js b/frappe/desk/doctype/event/event.js index 299cbe5cc3..ef2b2eb7e1 100644 --- a/frappe/desk/doctype/event/event.js +++ b/frappe/desk/doctype/event/event.js @@ -44,9 +44,13 @@ frappe.ui.form.on("Event", { const [ends_on_date] = frm.doc.ends_on ? frm.doc.ends_on.split(" ") - : frm.doc.starts_on.split(" "); + : frm.doc.starts_on?.split(" ") || []; - if (frm.doc.google_meet_link && frappe.datetime.now_date() <= ends_on_date) { + if ( + ends_on_date && + frm.doc.google_meet_link && + frappe.datetime.now_date() <= ends_on_date + ) { frm.dashboard.set_headline( __("Join video conference with {0}", [ `Google Meet`, diff --git a/frappe/desk/doctype/kanban_board/kanban_board.py b/frappe/desk/doctype/kanban_board/kanban_board.py index 4ab9e66f9d..49604f6cd0 100644 --- a/frappe/desk/doctype/kanban_board/kanban_board.py +++ b/frappe/desk/doctype/kanban_board/kanban_board.py @@ -238,7 +238,7 @@ def update_column_order(board_name, order): new_columns = [] for col in order: - for column in old_columns: + for column in list(old_columns): if col == column.column_name: new_columns.append(column) old_columns.remove(column) diff --git a/frappe/desk/doctype/note/note.py b/frappe/desk/doctype/note/note.py index 9cc14cbc1e..ef64d17f79 100644 --- a/frappe/desk/doctype/note/note.py +++ b/frappe/desk/doctype/note/note.py @@ -28,6 +28,9 @@ class Note(Document): # expire this notification in a week (default) self.expire_notification_on = frappe.utils.add_days(self.creation, 7) + if not self.public and self.notify_on_login: + self.notify_on_login = 0 + if not self.content: self.content = "" diff --git a/frappe/desk/doctype/workspace/workspace.py b/frappe/desk/doctype/workspace/workspace.py index 06768f3da6..814be47124 100644 --- a/frappe/desk/doctype/workspace/workspace.py +++ b/frappe/desk/doctype/workspace/workspace.py @@ -186,6 +186,7 @@ class Workspace(Document): "label": card.get("label"), "type": "Card Break", "icon": card.get("icon"), + "description": card.get("description"), "hidden": card.get("hidden") or False, "link_count": card.get("link_count"), "idx": 1 if not self.links else self.links[-1].idx + 1, diff --git a/frappe/desk/doctype/workspace_link/workspace_link.json b/frappe/desk/doctype/workspace_link/workspace_link.json index a7b217be9e..5f0a082a83 100644 --- a/frappe/desk/doctype/workspace_link/workspace_link.json +++ b/frappe/desk/doctype/workspace_link/workspace_link.json @@ -8,6 +8,7 @@ "type", "label", "icon", + "description", "hidden", "link_details_section", "link_type", @@ -107,12 +108,20 @@ "fieldtype": "Int", "hidden": 1, "label": "Link Count" + }, + { + "depends_on": "eval:doc.type == \"Card Break\"", + "fieldname": "description", + "fieldtype": "HTML Editor", + "ignore_xss_filter": 1, + "label": "Description", + "max_height": "7rem" } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2021-06-01 11:23:28.990593", + "modified": "2024-01-23 17:39:16.833318", "modified_by": "Administrator", "module": "Desk", "name": "Workspace Link", @@ -121,5 +130,6 @@ "quick_entry": 1, "sort_field": "modified", "sort_order": "DESC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/frappe/desk/doctype/workspace_link/workspace_link.py b/frappe/desk/doctype/workspace_link/workspace_link.py index e7d6ccf68a..03da7abe47 100644 --- a/frappe/desk/doctype/workspace_link/workspace_link.py +++ b/frappe/desk/doctype/workspace_link/workspace_link.py @@ -15,6 +15,7 @@ class WorkspaceLink(Document): from frappe.types import DF dependencies: DF.Data | None + description: DF.HTMLEditor | None hidden: DF.Check icon: DF.Data | None is_query_report: DF.Check @@ -29,4 +30,5 @@ class WorkspaceLink(Document): parenttype: DF.Data type: DF.Literal["Link", "Card Break"] # end: auto-generated types + pass diff --git a/frappe/desk/form/test_form.py b/frappe/desk/form/test_form.py index f256b03d27..5028fedf96 100644 --- a/frappe/desk/form/test_form.py +++ b/frappe/desk/form/test_form.py @@ -11,10 +11,3 @@ class TestForm(FrappeTestCase): results = get_linked_docs("Role", "System Manager", linkinfo=get_linked_doctypes("Role")) self.assertTrue("User" in results) self.assertTrue("DocType" in results) - - -if __name__ == "__main__": - import unittest - - frappe.connect() - unittest.main() diff --git a/frappe/desk/notifications.py b/frappe/desk/notifications.py index 4c728bdee9..090a3f6817 100644 --- a/frappe/desk/notifications.py +++ b/frappe/desk/notifications.py @@ -25,7 +25,7 @@ def get_notifications(): "open_count_doctype": {}, "targets": {}, } - if frappe.flags.in_install or not frappe.db.get_single_value("System Settings", "setup_complete"): + if frappe.flags.in_install or not frappe.get_system_settings("setup_complete"): return out config = get_notification_config() diff --git a/frappe/desk/page/setup_wizard/setup_wizard.js b/frappe/desk/page/setup_wizard/setup_wizard.js index 44960915b1..dde665bce5 100644 --- a/frappe/desk/page/setup_wizard/setup_wizard.js +++ b/frappe/desk/page/setup_wizard/setup_wizard.js @@ -476,18 +476,15 @@ frappe.setup.slides_settings = [ onload: function (slide) { if (frappe.session.user !== "Administrator") { - slide.form.fields_dict.email.$wrapper.toggle(false); - slide.form.fields_dict.password.$wrapper.toggle(false); - - // remove password field - delete slide.form.fields_dict.password; - - if (frappe.boot.user.first_name || frappe.boot.user.last_name) { + const { first_name, last_name, email } = frappe.boot.user; + if (first_name || last_name) { slide.form.fields_dict.full_name.set_input( - [frappe.boot.user.first_name, frappe.boot.user.last_name].join(" ").trim() + [first_name, last_name].join(" ").trim() ); } - delete slide.form.fields_dict.email; + slide.form.fields_dict.email.set_input(email); + slide.form.fields_dict.email.df.read_only = 1; + slide.form.fields_dict.email.refresh(); } else { slide.form.fields_dict.email.df.reqd = 1; slide.form.fields_dict.email.refresh(); diff --git a/frappe/desk/page/setup_wizard/setup_wizard.py b/frappe/desk/page/setup_wizard/setup_wizard.py index 22aa4245d8..0ae465ba55 100755 --- a/frappe/desk/page/setup_wizard/setup_wizard.py +++ b/frappe/desk/page/setup_wizard/setup_wizard.py @@ -14,7 +14,7 @@ from frappe.utils.password import update_password from . import install_fixtures -def get_setup_stages(args): +def get_setup_stages(args): # nosemgrep # App setup stage functions should not include frappe.db.commit # That is done by frappe after successful completion of all stages @@ -104,18 +104,18 @@ def process_setup_stages(stages, user_input, is_background_task=False): frappe.flags.in_setup_wizard = False -def update_global_settings(args): +def update_global_settings(args): # nosemgrep if args.language and args.language != "English": set_default_language(get_language_code(args.lang)) frappe.db.commit() frappe.clear_cache() update_system_settings(args) - update_user_name(args) + create_or_update_user(args) set_timezone(args) -def run_post_setup_complete(args): +def run_post_setup_complete(args): # nosemgrep disable_future_access() frappe.db.commit() frappe.clear_cache() @@ -124,20 +124,20 @@ def run_post_setup_complete(args): frappe.get_cached_doc("System Settings") and frappe.get_doc("System Settings") -def run_setup_success(args): +def run_setup_success(args): # nosemgrep for hook in frappe.get_hooks("setup_wizard_success"): frappe.get_attr(hook)(args) install_fixtures.install() -def get_stages_hooks(args): +def get_stages_hooks(args): # nosemgrep stages = [] for method in frappe.get_hooks("setup_wizard_stages"): stages += frappe.get_attr(method)(args) return stages -def get_setup_complete_hooks(args): +def get_setup_complete_hooks(args): # nosemgrep return [ { "status": "Executing method", @@ -154,7 +154,7 @@ def get_setup_complete_hooks(args): ] -def handle_setup_exception(args): +def handle_setup_exception(args): # nosemgrep frappe.db.rollback() if args: traceback = frappe.get_traceback(with_context=True) @@ -163,7 +163,7 @@ def handle_setup_exception(args): frappe.get_attr(hook)(traceback, args) -def update_system_settings(args): +def update_system_settings(args): # nosemgrep number_format = get_country_info(args.get("country")).get("number_format", "#,###.##") # replace these as float number formats, as they have 0 precision @@ -194,72 +194,51 @@ def update_system_settings(args): frappe.db.set_default("session_recording_start", now()) -def update_user_name(args): +def create_or_update_user(args): # nosemgrep + email = args.get("email") + if not email: + return + first_name, last_name = args.get("full_name", ""), "" if " " in first_name: first_name, last_name = first_name.split(" ", 1) - if args.get("email"): - if frappe.db.exists("User", args.get("email")): - # running again - return - - args["name"] = args.get("email") - + if user := frappe.db.get_value("User", email, ["first_name", "last_name"], as_dict=True): + if user.first_name != first_name or user.last_name != last_name: + ( + frappe.qb.update("User") + .set("first_name", first_name) + .set("last_name", last_name) + .set("full_name", args.get("full_name")) + ).run() + else: _mute_emails, frappe.flags.mute_emails = frappe.flags.mute_emails, True - doc = frappe.get_doc( + + user = frappe.new_doc("User") + user.update( { - "doctype": "User", - "email": args.get("email"), + "email": email, "first_name": first_name, "last_name": last_name, } ) + user.append_roles(*_get_default_roles()) + user.flags.no_welcome_mail = True + user.insert() - doc.append_roles(*_get_default_roles()) - doc.flags.no_welcome_mail = True - doc.insert() frappe.flags.mute_emails = _mute_emails - update_password(args.get("email"), args.get("password")) - elif first_name: - args.update({"name": frappe.session.user, "first_name": first_name, "last_name": last_name}) - - frappe.db.sql( - """update `tabUser` SET first_name=%(first_name)s, - last_name=%(last_name)s WHERE name=%(name)s""", - args, - ) - - if args.get("attach_user"): - attach_user = args.get("attach_user").split(",") - if len(attach_user) == 3: - filename, filetype, content = attach_user - _file = frappe.get_doc( - { - "doctype": "File", - "file_name": filename, - "attached_to_doctype": "User", - "attached_to_name": args.get("name"), - "content": content, - "decode": True, - } - ) - _file.save() - fileurl = _file.file_url - frappe.db.set_value("User", args.get("name"), "user_image", fileurl) - - if args.get("name"): - add_all_roles_to(args.get("name")) + if args.get("password"): + update_password(email, args.get("password")) -def set_timezone(args): +def set_timezone(args): # nosemgrep if args.get("timezone"): for name in frappe.STANDARD_USERS: frappe.db.set_value("User", name, "time_zone", args.get("timezone")) -def parse_args(args): +def parse_args(args): # nosemgrep if not args: args = frappe.local.form_dict if isinstance(args, str): @@ -344,7 +323,7 @@ def load_user_details(): } -def prettify_args(args): +def prettify_args(args): # nosemgrep # remove attachments for key, val in args.items(): if isinstance(val, str) and "data:image" in val: @@ -357,7 +336,7 @@ def prettify_args(args): return pretty_args -def email_setup_wizard_exception(traceback, args): +def email_setup_wizard_exception(traceback, args): # nosemgrep if not frappe.conf.setup_wizard_exception_email: return @@ -402,7 +381,7 @@ def email_setup_wizard_exception(traceback, args): ) -def log_setup_wizard_exception(traceback, args): +def log_setup_wizard_exception(traceback, args): # nosemgrep with open("../logs/setup-wizard.log", "w+") as setup_log: setup_log.write(traceback) setup_log.write(json.dumps(args)) diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.json b/frappe/email/doctype/auto_email_report/auto_email_report.json index 75a9e99c96..f208626500 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.json +++ b/frappe/email/doctype/auto_email_report/auto_email_report.json @@ -25,6 +25,7 @@ "to_date_field", "column_break_17", "dynamic_date_period", + "use_first_day_of_period", "email_settings", "email_to", "day_of_week", @@ -207,10 +208,18 @@ "fieldtype": "Link", "label": "Sender", "options": "Email Account" + }, + { + "default": "0", + "description": "To begin the date range at the start of the chosen period. For example, if 'Year' is selected as the period, the report will start from January 1st of the current year.", + "fieldname": "use_first_day_of_period", + "fieldtype": "Check", + "depends_on": "eval: doc.dynamic_date_period != 'Daily'", + "label": "Use First Day of Period" } ], "links": [], - "modified": "2022-09-08 15:31:55.031023", + "modified": "2024-01-29 11:42:27.433958", "modified_by": "Administrator", "module": "Email", "name": "Auto Email Report", @@ -245,4 +254,4 @@ "sort_order": "DESC", "states": [], "track_changes": 1 -} \ No newline at end of file +} diff --git a/frappe/email/doctype/auto_email_report/auto_email_report.py b/frappe/email/doctype/auto_email_report/auto_email_report.py index 6fe2596d7f..5549d0ba6e 100644 --- a/frappe/email/doctype/auto_email_report/auto_email_report.py +++ b/frappe/email/doctype/auto_email_report/auto_email_report.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import calendar +import datetime from datetime import timedelta from email.utils import formataddr @@ -14,8 +15,13 @@ from frappe.utils import ( add_to_date, cint, format_time, + get_first_day, + get_first_day_of_week, get_link_to_form, + get_quarter_start, get_url_to_report, + get_year_start, + getdate, global_date_format, now, now_datetime, @@ -57,8 +63,10 @@ class AutoEmailReport(Document): send_if_data: DF.Check sender: DF.Link | None to_date_field: DF.Literal + use_first_day_of_period: DF.Check user: DF.Link # end: auto-generated types + def autoname(self): self.name = _(self.report) if frappe.db.exists("Auto Email Report", self.name): @@ -92,7 +100,7 @@ class AutoEmailReport(Document): max_reports_per_user = ( cint(frappe.local.conf.max_reports_per_user) # kept for backward compatibilty - or cint(frappe.db.get_single_value("System Settings", "max_auto_email_report_per_user")) + or cint(frappe.get_system_settings("max_auto_email_report_per_user")) or 20 ) @@ -207,17 +215,37 @@ class AutoEmailReport(Document): self.filters = frappe.parse_json(self.filters) to_date = today() - from_date_value = { - "Daily": ("days", -1), - "Weekly": ("weeks", -1), - "Monthly": ("months", -1), - "Quarterly": ("months", -3), - "Half Yearly": ("months", -6), - "Yearly": ("years", -1), - }[self.dynamic_date_period] - from_date = add_to_date(to_date, **{from_date_value[0]: from_date_value[1]}) + if self.use_first_day_of_period: + from_date = to_date + if self.dynamic_date_period == "Daily": + from_date = add_to_date(to_date, days=-1) + elif self.dynamic_date_period == "Weekly": + from_date = get_first_day_of_week(from_date) + elif self.dynamic_date_period == "Monthly": + from_date = get_first_day(from_date) + elif self.dynamic_date_period == "Quarterly": + from_date = get_quarter_start(from_date) + elif self.dynamic_date_period == "Half Yearly": + from_date = get_half_year_start(from_date) + elif self.dynamic_date_period == "Yearly": + from_date = get_year_start(from_date) + self.set_date_filters(from_date, to_date) + else: + from_date_value = { + "Daily": ("days", -1), + "Weekly": ("weeks", -1), + "Monthly": ("months", -1), + "Quarterly": ("months", -3), + "Half Yearly": ("months", -6), + "Yearly": ("years", -1), + }[self.dynamic_date_period] + + from_date = add_to_date(to_date, **{from_date_value[0]: from_date_value[1]}) + self.set_date_filters(from_date, to_date) + + def set_date_filters(self, from_date, to_date): self.filters[self.from_date_field] = from_date self.filters[self.to_date_field] = to_date @@ -332,3 +360,23 @@ def update_field_types(columns): col.fieldtype = "Data" col.options = "" return columns + + +DATE_FORMAT = "%Y-%m-%d" + + +def get_half_year_start(as_str=False): + """ + Returns the first day of the current half-year based on the current date. + """ + today_date = getdate(today()) + + half_year = 1 if today_date.month <= 6 else 2 + + year = today_date.year if half_year == 1 else today_date.year + 1 + month = 1 if half_year == 1 else 7 + day = 1 + + result_date = datetime.date(year, month, day) + + return result_date if not as_str else result_date.strftime(DATE_FORMAT) diff --git a/frappe/email/doctype/email_queue/email_queue.py b/frappe/email/doctype/email_queue/email_queue.py index 91ca2bbdbb..aff8782abf 100644 --- a/frappe/email/doctype/email_queue/email_queue.py +++ b/frappe/email/doctype/email_queue/email_queue.py @@ -131,12 +131,12 @@ class EmailQueue(Document): def attachments_list(self): return json.loads(self.attachments) if self.attachments else [] - def get_email_account(self): + def get_email_account(self, raise_error=False): if self.email_account: return frappe.get_cached_doc("Email Account", self.email_account) return EmailAccount.find_outgoing( - match_by_email=self.sender, match_by_doctype=self.reference_doctype + match_by_email=self.sender, match_by_doctype=self.reference_doctype, _raise_error=raise_error ) def is_to_be_sent(self): @@ -158,6 +158,7 @@ class EmailQueue(Document): return with SendMailContext(self, smtp_server_instance) as ctx: + ctx.fetch_smtp_server() message = None for recipient in self.recipients: if recipient.is_mail_sent(): @@ -233,14 +234,16 @@ class SendMailContext: smtp_server_instance: SMTPServer = None, ): self.queue_doc: EmailQueue = queue_doc - self.email_account_doc = queue_doc.get_email_account() - - self.smtp_server: SMTPServer = smtp_server_instance or self.email_account_doc.get_smtp_server() - + self.smtp_server: SMTPServer = smtp_server_instance self.sent_to_atleast_one_recipient = any( rec.recipient for rec in self.queue_doc.recipients if rec.is_mail_sent() ) + def fetch_smtp_server(self): + self.email_account_doc = self.queue_doc.get_email_account(raise_error=True) + if not self.smtp_server: + self.smtp_server = self.email_account_doc.get_smtp_server() + def __enter__(self): self.queue_doc.update_status(status="Sending", commit=True) return self @@ -733,7 +736,7 @@ class QueueBuilder: recipients = list(set([r] + self.final_cc() + self.bcc)) q = EmailQueue.new({**queue_data, **{"recipients": recipients}}, ignore_permissions=True) if not smtp_server_instance: - email_account = q.get_email_account() + email_account = q.get_email_account(raise_error=True) smtp_server_instance = email_account.get_smtp_server() with suppress(Exception): diff --git a/frappe/email/doctype/newsletter/newsletter.json b/frappe/email/doctype/newsletter/newsletter.json index e7c902697f..e03cc506e6 100644 --- a/frappe/email/doctype/newsletter/newsletter.json +++ b/frappe/email/doctype/newsletter/newsletter.json @@ -3,7 +3,7 @@ "allow_guest_to_view": 1, "allow_rename": 1, "creation": "2013-01-10 16:34:31", - "description": "Create and Send Newsletters", + "description": "Create and send emails to a specific group of subscribers periodically.", "doctype": "DocType", "document_type": "Other", "engine": "InnoDB", @@ -244,8 +244,7 @@ "fieldname": "campaign", "fieldtype": "Link", "label": "Campaign", - "options": "Marketing Campaign", - "reqd": 0 + "options": "Marketing Campaign" } ], "has_web_view": 1, @@ -254,7 +253,7 @@ "index_web_pages_for_search": 1, "is_published_field": "published", "links": [], - "modified": "2023-12-29 18:04:13.270523", + "modified": "2024-01-30 14:05:50.645802", "modified_by": "Administrator", "module": "Email", "name": "Newsletter", diff --git a/frappe/email/receive.py b/frappe/email/receive.py index 72a2dfce82..74d7f84dac 100644 --- a/frappe/email/receive.py +++ b/frappe/email/receive.py @@ -673,7 +673,7 @@ class InboundMail(Email): content = self.content for file in attachments: if file.name in self.cid_map and self.cid_map[file.name]: - content = content.replace(f"cid:{self.cid_map[file.name]}", file.file_url) + content = content.replace(f"cid:{self.cid_map[file.name]}", file.unique_url) return content def is_notification(self): diff --git a/frappe/geo/doctype/currency/currency.json b/frappe/geo/doctype/currency/currency.json index c51ab7f063..9a4df0f117 100644 --- a/frappe/geo/doctype/currency/currency.json +++ b/frappe/geo/doctype/currency/currency.json @@ -4,7 +4,7 @@ "allow_rename": 1, "autoname": "field:currency_name", "creation": "2013-01-28 10:06:02", - "description": "**Currency** Master", + "description": "Currency list stores the currency value, its symbol and fraction unit", "doctype": "DocType", "document_type": "Setup", "engine": "InnoDB", @@ -82,7 +82,7 @@ "idx": 1, "index_web_pages_for_search": 1, "links": [], - "modified": "2022-07-04 09:42:52.425440", + "modified": "2024-01-30 13:18:12.053557", "modified_by": "Administrator", "module": "Geo", "name": "Currency", @@ -102,6 +102,10 @@ "share": 1, "write": 1 }, + { + "read": 1, + "role": "Accounts Manager" + }, { "read": 1, "role": "Accounts User" diff --git a/frappe/gettext/extractors/html_template.py b/frappe/gettext/extractors/html_template.py new file mode 100644 index 0000000000..34f51e4032 --- /dev/null +++ b/frappe/gettext/extractors/html_template.py @@ -0,0 +1,26 @@ +from jinja2.ext import babel_extract + +from .utils import extract_messages_from_code + + +def extract(*args, **kwargs): + """Extract messages from Jinja and JS microtemplates. + + Reuse the babel_extract function from jinja2.ext, but handle our own implementation of `_()`. + To handle JS microtemplates, parse all code again using regex.""" + fileobj = args[0] or kwargs["fileobj"] + print(fileobj.name) + code = fileobj.read().decode("utf-8") + + for lineno, funcname, messages, comments in babel_extract(*args, **kwargs): + if funcname == "_" and isinstance(messages, tuple) and len(messages) > 1: + funcname = "pgettext" + messages = (messages[-1], messages[0]) # (context, message) + + yield lineno, funcname, messages, comments + + for lineno, message, context in extract_messages_from_code(code): + if context: + yield lineno, "pgettext", (context, message), [] + else: + yield lineno, "_", message, [] diff --git a/frappe/gettext/extractors/jinja2.py b/frappe/gettext/extractors/jinja2.py deleted file mode 100644 index ee07ac6cee..0000000000 --- a/frappe/gettext/extractors/jinja2.py +++ /dev/null @@ -1,11 +0,0 @@ -from jinja2.ext import babel_extract - - -def extract(*args, **kwargs): - """Reuse the babel_extract function from jinja2.ext, but handle our own implementation of `_()`""" - for lineno, funcname, messages, comments in babel_extract(*args, **kwargs): - if funcname == "_" and isinstance(messages, tuple) and len(messages) > 1: - funcname = "pgettext" - messages = (messages[-1], messages[0]) # (context, message) - - yield lineno, funcname, messages, comments diff --git a/frappe/gettext/extractors/utils.py b/frappe/gettext/extractors/utils.py new file mode 100644 index 0000000000..e088a8409b --- /dev/null +++ b/frappe/gettext/extractors/utils.py @@ -0,0 +1,81 @@ +import re + +import frappe + +TRANSLATE_PATTERN = re.compile( + r"_\(\s*" # starts with literal `_(`, ignore following whitespace/newlines + # BEGIN: message search + r"([\"']{,3})" # start of message string identifier - allows: ', ", """, '''; 1st capture group + r"(?P((?!\1).)*)" # Keep matching until string closing identifier is met which is same as 1st capture group + r"\1" # match exact string closing identifier + # END: message search + # BEGIN: python context search + r"(\s*,\s*context\s*=\s*" # capture `context=` with ignoring whitespace + r"([\"'])" # start of context string identifier; 5th capture group + r"(?P((?!\5).)*)" # capture context string till closing id is found + r"\5" # match context string closure + r")?" # match 0 or 1 context strings + # END: python context search + # BEGIN: JS context search + r"(\s*,\s*(.)*?\s*(,\s*" # skip message format replacements: ["format", ...] | null | [] + r"([\"'])" # start of context string; 11th capture group + r"(?P((?!\11).)*)" # capture context string till closing id is found + r"\11" # match context string closure + r")*" + r")*" # match one or more context string + # END: JS context search + r"\s*\)" # Closing function call ignore leading whitespace/newlines +) + + +def extract_messages_from_code(code): + """ + Extracts translatable strings from a code file + :param code: code from which translatable files are to be extracted + """ + from jinja2 import TemplateError + + from frappe.model.utils import InvalidIncludePath, render_include + + try: + code = frappe.as_unicode(render_include(code)) + + # Exception will occur when it encounters John Resig's microtemplating code + except (TemplateError, ImportError, InvalidIncludePath, OSError) as e: + if isinstance(e, InvalidIncludePath) and hasattr(frappe.local, "message_log"): + frappe.clear_last_message() + + messages = [] + + for m in TRANSLATE_PATTERN.finditer(code): + message = m.group("message") + context = m.group("py_context") or m.group("js_context") + pos = m.start() + + if is_translatable(message): + messages.append([pos, message, context]) + + return add_line_number(messages, code) + + +def is_translatable(m): + return bool( + re.search("[a-zA-Z]", m) + and not m.startswith("fa fa-") + and not m.endswith("px") + and not m.startswith("eval:") + ) + + +def add_line_number(messages, code): + ret = [] + messages = sorted(messages, key=lambda x: x[0]) + newlines = [m.start() for m in re.compile(r"\n").finditer(code)] + line = 1 + newline_i = 0 + for pos, message, context in messages: + while newline_i < len(newlines) and pos > newlines[newline_i]: + line += 1 + newline_i += 1 + ret.append([line, message, context]) + return ret diff --git a/frappe/handler.py b/frappe/handler.py index d889c67b23..d875e9bd57 100644 --- a/frappe/handler.py +++ b/frappe/handler.py @@ -250,7 +250,7 @@ def check_write_permission(doctype: str = None, name: str = None): if doctype and name: try: doc = frappe.get_doc(doctype, name) - doc.has_permission("write") + doc.check_permission("write") except frappe.DoesNotExistError: # doc has not been inserted yet, name is set to "new-some-doctype" check_doctype = True diff --git a/frappe/hooks.py b/frappe/hooks.py index 36a7748588..c5f19ebfb2 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -532,15 +532,15 @@ standard_help_items = [ # log doctype cleanups to automatically add in log settings default_log_clearing_doctypes = { - "Error Log": 30, - "Activity Log": 90, + "Error Log": 14, "Email Queue": 30, - "Scheduled Job Log": 90, - "Route History": 90, - "Submission Queue": 30, - "Prepared Report": 30, + "Scheduled Job Log": 7, + "Submission Queue": 7, + "Prepared Report": 14, "Webhook Request Log": 30, - "Integration Request": 90, "Unhandled Email": 30, "Reminder": 30, + "Integration Request": 90, + "Activity Log": 90, + "Route History": 90, } diff --git a/frappe/installer.py b/frappe/installer.py index 1215aa8e0e..68fd4d87d2 100644 --- a/frappe/installer.py +++ b/frappe/installer.py @@ -20,9 +20,10 @@ from frappe.utils.dashboard import sync_dashboards from frappe.utils.synchronization import filelock -def _is_scheduler_enabled() -> bool: +def _is_scheduler_enabled(site) -> bool: enable_scheduler = False try: + frappe.init(site=site) frappe.connect() enable_scheduler = cint(frappe.db.get_single_value("System Settings", "enable_scheduler")) except Exception: @@ -49,6 +50,7 @@ def _new_site( db_type=None, db_host=None, db_port=None, + db_user=None, setup_db=True, ): """Install a new Frappe site""" @@ -77,7 +79,7 @@ def _new_site( try: # enable scheduler post install? - enable_scheduler = _is_scheduler_enabled() + enable_scheduler = _is_scheduler_enabled(site) except Exception: enable_scheduler = False @@ -97,6 +99,7 @@ def _new_site( db_type=db_type, db_host=db_host, db_port=db_port, + db_user=db_user, no_mariadb_socket=no_mariadb_socket, setup=setup_db, ) @@ -135,6 +138,7 @@ def install_db( db_type=None, db_host=None, db_port=None, + db_user=None, no_mariadb_socket=False, setup=True, ): @@ -156,6 +160,7 @@ def install_db( db_type=db_type, db_host=db_host, db_port=db_port, + db_user=db_user, ) frappe.flags.in_install_db = True @@ -166,7 +171,6 @@ def install_db( setup_database(force, verbose, no_mariadb_socket) bootstrap_database( - db_name=frappe.conf.db_name, verbose=verbose, source_sql=source_sql, ) @@ -533,11 +537,23 @@ def init_singles(): def make_conf( - db_name=None, db_password=None, site_config=None, db_type=None, db_host=None, db_port=None + db_name=None, + db_password=None, + site_config=None, + db_type=None, + db_host=None, + db_port=None, + db_user=None, ): site = frappe.local.site make_site_config( - db_name, db_password, site_config, db_type=db_type, db_host=db_host, db_port=db_port + db_name, + db_password, + site_config, + db_type=db_type, + db_host=db_host, + db_port=db_port, + db_user=db_user, ) sites_path = frappe.local.sites_path frappe.destroy() @@ -545,7 +561,13 @@ def make_conf( def make_site_config( - db_name=None, db_password=None, site_config=None, db_type=None, db_host=None, db_port=None + db_name=None, + db_password=None, + site_config=None, + db_type=None, + db_host=None, + db_port=None, + db_user=None, ): frappe.create_folder(os.path.join(frappe.local.site_path)) site_file = get_site_config_path() @@ -563,6 +585,8 @@ def make_site_config( if db_port: site_config["db_port"] = db_port + site_config["db_user"] = db_user or db_name + with open(site_file, "w") as f: f.write(json.dumps(site_config, indent=1, sort_keys=True)) diff --git a/frappe/integrations/doctype/google_calendar/google_calendar.py b/frappe/integrations/doctype/google_calendar/google_calendar.py index 8430e5c80c..2afd3222c5 100644 --- a/frappe/integrations/doctype/google_calendar/google_calendar.py +++ b/frappe/integrations/doctype/google_calendar/google_calendar.py @@ -239,7 +239,7 @@ def check_google_calendar(account, google_calendar): # If no Calendar ID create a new Calendar calendar = { "summary": account.calendar_name, - "timeZone": frappe.db.get_single_value("System Settings", "time_zone"), + "timeZone": frappe.get_system_settings("time_zone"), } created_calendar = google_calendar.calendars().insert(body=calendar).execute() frappe.db.set_value( diff --git a/frappe/integrations/doctype/google_drive/google_drive.js b/frappe/integrations/doctype/google_drive/google_drive.js index 208c1e5e1a..ec5833cf59 100644 --- a/frappe/integrations/doctype/google_drive/google_drive.js +++ b/frappe/integrations/doctype/google_drive/google_drive.js @@ -13,13 +13,14 @@ frappe.ui.form.on("Google Drive", { frappe.realtime.on("upload_to_google_drive", (data) => { if (data.progress) { + const progress_title = __("Uploading to Google Drive"); frm.dashboard.show_progress( - "Uploading to Google Drive", + progress_title, (data.progress / data.total) * 100, - __("{0}", [data.message]) + data.message ); if (data.progress === data.total) { - frm.dashboard.hide_progress("Uploading to Google Drive"); + frm.dashboard.hide_progress(progress_title); } } }); diff --git a/frappe/integrations/doctype/google_drive/google_drive.py b/frappe/integrations/doctype/google_drive/google_drive.py index a8c44796ef..394f43bbee 100644 --- a/frappe/integrations/doctype/google_drive/google_drive.py +++ b/frappe/integrations/doctype/google_drive/google_drive.py @@ -170,7 +170,7 @@ def upload_system_backup_to_google_drive(): validate_file_size() if frappe.flags.create_new_backup: - set_progress(1, "Backing up Data.") + set_progress(1, _("Backing up Data.")) backup = new_backup() file_urls = [] file_urls.append(backup.backup_path_db) @@ -196,12 +196,12 @@ def upload_system_backup_to_google_drive(): frappe.throw(_("Google Drive - Could not locate - {0}").format(e)) try: - set_progress(2, "Uploading backup to Google Drive.") + set_progress(2, _("Uploading backup to Google Drive.")) google_drive.files().create(body=file_metadata, media_body=media, fields="id").execute() except HttpError as e: send_email(False, "Google Drive", "Google Drive", "email", error_status=e) - set_progress(3, "Uploading successful.") + set_progress(3, _("Uploading successful.")) frappe.db.set_single_value("Google Drive", "last_backup_on", frappe.utils.now_datetime()) send_email(True, "Google Drive", "Google Drive", "email") return _("Google Drive Backup Successful.") diff --git a/frappe/integrations/doctype/google_settings/google_settings.json b/frappe/integrations/doctype/google_settings/google_settings.json index 6f25fa4bf6..ee48fde97b 100644 --- a/frappe/integrations/doctype/google_settings/google_settings.json +++ b/frappe/integrations/doctype/google_settings/google_settings.json @@ -39,8 +39,7 @@ "description": "The browser API key obtained from the Google Cloud Console under \n\"APIs & Services\" > \"Credentials\"\n", "fieldname": "api_key", "fieldtype": "Data", - "label": "API Key", - "mandatory_depends_on": "google_drive_picker_enabled" + "label": "API Key" }, { "depends_on": "enable", @@ -76,7 +75,7 @@ ], "issingle": 1, "links": [], - "modified": "2021-06-29 18:26:07.094851", + "modified": "2024-01-16 13:19:22.365362", "modified_by": "Administrator", "module": "Integrations", "name": "Google Settings", @@ -96,5 +95,6 @@ "quick_entry": 1, "sort_field": "modified", "sort_order": "ASC", + "states": [], "track_changes": 1 } \ No newline at end of file diff --git a/frappe/integrations/doctype/google_settings/google_settings.py b/frappe/integrations/doctype/google_settings/google_settings.py index a5b2a919ed..d69ae79572 100644 --- a/frappe/integrations/doctype/google_settings/google_settings.py +++ b/frappe/integrations/doctype/google_settings/google_settings.py @@ -21,6 +21,7 @@ class GoogleSettings(Document): enable: DF.Check google_drive_picker_enabled: DF.Check # end: auto-generated types + pass @@ -34,6 +35,5 @@ def get_file_picker_settings(): return { "enabled": True, "appId": google_settings.app_id, - "developerKey": google_settings.api_key, "clientId": google_settings.client_id, } diff --git a/frappe/integrations/doctype/google_settings/test_google_settings.py b/frappe/integrations/doctype/google_settings/test_google_settings.py index d4bb830779..4b705a67f1 100644 --- a/frappe/integrations/doctype/google_settings/test_google_settings.py +++ b/frappe/integrations/doctype/google_settings/test_google_settings.py @@ -40,4 +40,3 @@ class TestGoogleSettings(FrappeTestCase): self.assertEqual(True, settings.get("enabled", False)) self.assertEqual("test_client_id", settings.get("clientId", "")) self.assertEqual("test_app_id", settings.get("appId", "")) - self.assertEqual("test_api_key", settings.get("developerKey", "")) diff --git a/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py b/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py index 2e20367990..8f9ebf712c 100644 --- a/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py +++ b/frappe/integrations/doctype/ldap_settings/test_ldap_settings.py @@ -438,7 +438,7 @@ class LDAP_TestCase: for user_role in updated_user_roles: # match each users role mapped to ldap groups self.assertTrue( role_to_group_map[user_role] in test_user_data[test_user], - f"during sync_roles(), the user was given role {user_role} which should not have occured", + f"during sync_roles(), the user was given role {user_role} which should not have occurred", ) @mock_ldap_connection diff --git a/frappe/integrations/offsite_backup_utils.py b/frappe/integrations/offsite_backup_utils.py index 0a5cd80ea6..a71fe0e28d 100644 --- a/frappe/integrations/offsite_backup_utils.py +++ b/frappe/integrations/offsite_backup_utils.py @@ -41,9 +41,6 @@ def send_email(success, service_name, doctype, email_field, error_status=None): def get_recipients(doctype, email_field): - if not frappe.db: - frappe.connect() - return split_emails(frappe.db.get_value(doctype, None, email_field)) @@ -52,7 +49,7 @@ def get_latest_backup_file(with_files=False): odb = BackupGenerator( frappe.conf.db_name, - frappe.conf.db_name, + frappe.conf.db_user, frappe.conf.db_password, db_host=frappe.conf.db_host, db_port=frappe.conf.db_port, @@ -110,7 +107,7 @@ def generate_files_backup(): backup = BackupGenerator( frappe.conf.db_name, - frappe.conf.db_name, + frappe.conf.db_user, frappe.conf.db_password, db_host=frappe.conf.db_host, db_port=frappe.conf.db_port, diff --git a/frappe/locale/de.po b/frappe/locale/de.po index f2280304dd..fa60b45725 100644 --- a/frappe/locale/de.po +++ b/frappe/locale/de.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: frappe\n" "Report-Msgid-Bugs-To: developers@frappe.io\n" "POT-Creation-Date: 2024-01-12 01:53+0053\n" -"PO-Revision-Date: 2024-01-15 11:31\n" +"PO-Revision-Date: 2024-01-27 17:04\n" "Last-Translator: developers@frappe.io\n" "Language-Team: German\n" "MIME-Version: 1.0\n" @@ -223,7 +223,7 @@ msgstr "** Fehlgeschlagen: {0} um {1}: {2}" #: workflow/doctype/workflow_document_state/workflow_document_state.json msgctxt "Workflow Document State" msgid "0 - Draft; 1 - Submitted; 2 - Cancelled" -msgstr "0 - Entwurf; 1 - Übertragen; 2 - Storniert" +msgstr "0 - Entwurf; 1 - Gebucht; 2 - Storniert" #. Description of the 'Priority' (Int) field in DocType 'Web Page' #: website/doctype/web_page/web_page.json @@ -538,7 +538,72 @@ msgid "

Print Format Help

\n" "\t\t\n" "\t\n" "\n" -msgstr "" +msgstr "

Hilfe zu Druckformaten

\n" +"
\n" +"

Einführung

\n" +"

Druckformate werden auf der Serverseite mit der Jinja Templating Language gerendert. Alle Formulare haben Zugriff auf das doc Objekt, das Informationen über das Dokument enthält, das formatiert wird. Sie können auch über das Modul frappe auf allgemeine Dienstprogramme zugreifen.

\n" +"

Für das Styling steht Ihnen das Boostrap CSS-Framework zur Verfügung und Sie können die gesamte Bandbreite an Klassen nutzen.

\n" +"
\n" +"

Referenzen

\n" +"
    \n" +"\t
  1. Jinja Templating Language
  2. \n" +"\t
  3. Bootstrap CSS Framework
  4. \n" +"
\n" +"
\n" +"

Beispiel

\n" +"
<h3>{{ doc.select_print_heading or \"Invoice\" }}</h3>\n"
+"<div class=\"row\">\n"
+"\t<div class=\"col-md-3 text-right\">Kundenname</div>\n"
+"\t<div class=\"col-md-9\">{{ doc.customer_name }}</div>\n"
+"</div>\n"
+"<div class=\"row\">\n"
+"\t<div class=\"col-md-3 text-right\">Datum</div>\n"
+"\t<div class=\"col-md-9\">{{ doc.get_formatted(\"invoice_date\") }}</div>\n"
+"</div>\n"
+"<table class=\"table table-bordered\">\n"
+"\t<tbody>\n"
+"\t\t<tr>\n"
+"\t\t\t<th>Sr</th>\n"
+"\t\t\t<th>Artikelname</th>\n"
+"\t\t\t<th>Beschreibung</th>\n"
+"\t\t\t<th class=\"text-right\">Menge</th>\n"
+"\t\t\t<th class=\"text-right\">Preis</th>\n"
+"\t\t\t<th class=\"text-right\">Betrag</th>\n"
+"\t\t</tr>\n"
+"\t\t{%- for row in doc.items -%}\n"
+"\t\t<tr>\n"
+"\t\t\t<td style=\"width: 3%;\">{{ row.idx }}</td>\n"
+"\t\t\t<td style=\"width: 20%;\">\n"
+"\t\t\t\t{{ row.item_name }}\n"
+"\t\t\t\t{% if row.item_code != row.item_name -%}\n"
+"\t\t\t\t<br>Artikelcode: {{ row.item_code}}\n"
+"\t\t\t\t{%- endif %}\n"
+"\t\t\t</td>\n"
+"\t\t\t<td style=\"width: 37%;\">\n"
+"\t\t\t\t<div style=\"border: 0px;\">{{ row.description }}</div></td>\n"
+"\t\t\t<td style=\"width: 10%; text-align: right;\">{{ row.qty }} {{ row.uom or row.stock_uom }}</td>\n"
+"\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n"
+"\t\t\t\trow.get_formatted(\"rate\", doc) }}</td>\n"
+"\t\t\t<td style=\"width: 15%; text-align: right;\">{{\n"
+"\t\t\t\trow.get_formatted(\"amount\", doc) }}</td>\n"
+"\t\t</tr>\n"
+"\t\t{%- endfor -%}\n"
+"\t</tbody>\n"
+"</table>
\n" +"
\n" +"

Gemeinsame Funktionen

\n" +"\n" +"\t\n" +"\t\t\n" +"\t\t\t\n" +"\t\t\t\n" +"\t\t\n" +"\t\t\n" +"\t\t\t\n" +"\t\t\t\n" +"\t\t\n" +"\t\n" +"
doc.get_formatted(\"[feldname]\", [übergeordnetes_doc])Dokumentwert als Datum, Währung usw. formatiert abrufen. Übergeben Sie das übergeordnete doc für Felder vom Typ Währung.
frappe.db.get_value(\"[doctype]\", \"[name]\", \"fieldname\")Holen Sie den Wert aus einem anderen Dokument.
\n" #. Description of the 'Template' (Code) field in DocType 'Address Template' #: contacts/doctype/address_template/address_template.json @@ -556,7 +621,18 @@ msgid "

Default Template

\n" "{% if fax %}Fax: {{ fax }}<br>{% endif -%}\n" "{% if email_id %}Email: {{ email_id }}<br>{% endif -%}\n" "" -msgstr "" +msgstr "

Standardvorlage

\n" +"

Verwendet Jinja Templating und alle Felder der Adresse (einschließlich der benutzerdefinierten Felder, falls vorhanden) werden verfügbar sein

\n" +"
{{ address_line1 }}<br>\n"
+"{% if address_line2 %}{{ address_line2 }}<br>{% endif -%}\n"
+"{{ city }}<br>\n"
+"{% if state %}{{ state }}<br>{% endif -%}\n"
+"{% if pincode %} PIN:  {{ pincode }}<br>{% endif -%}\n"
+"{{ country }}<br>\n"
+"{% if phone %}Telefon: {{ phone }}<br>{% endif -%}\n"
+"{% if fax %}Fax: {{ fax }}<br>{% endif -%}\n"
+"{% if email_id %}E-Mail: {{ email_id }}<br>{% endif -%}\n"
+"
" #. Content of the 'Email Reply Help' (HTML) field in DocType 'Email Template' #: email/doctype/email_template/email_template.json @@ -572,13 +648,23 @@ msgid "

Email Reply Example

\n\n" "

The fieldnames you can use in your email template are the fields in the document from which you are sending the email. You can find out the fields of any documents via Setup > Customize Form View and selecting the document type (e.g. Sales Invoice)

\n\n" "

Templating

\n\n" "

Templates are compiled using the Jinja Templating Language. To learn more about Jinja, read this documentation.

\n" -msgstr "" +msgstr "

Beispiel für eine E-Mail-Antwort

\n\n" +"
Überfällige Bestellung\n\n"
+"Die Transaktion {{ name }} hat das Fälligkeitsdatum überschritten. Bitte ergreifen Sie die notwendigen Maßnahmen.\n\n"
+"Details\n\n"
+"- Kunde: {{ customer }}\n"
+"- Betrag: {{ grand_total }}\n"
+"
\n\n" +"

So erhalten Sie Feldnamen

\n\n" +"

Die Feldnamen, die Sie in Ihrer E-Mail-Vorlage verwenden können, sind die Felder des Dokuments, aus dem Sie die E-Mail versenden. Sie können die Felder aller Dokumente über Setup > Formularansicht anpassen und den Dokumententyp auswählen (z.B. Verkaufsrechnung)

\n\n" +"

Vorlagenerstellung

\n\n" +"

Vorlagen werden mit der Jinja-Vorlagensprache erstellt. Wenn Sie mehr über Jinja erfahren möchten, lesen Sie diese Dokumentation.

\n" #. Content of the 'html_5' (HTML) field in DocType 'Data Import' #: core/doctype/data_import/data_import.json msgctxt "Data Import" msgid "
Or
" -msgstr "" +msgstr "
Oder
" #. Content of the 'Message Examples' (HTML) field in DocType 'Notification' #: email/doctype/notification/notification.json @@ -597,7 +683,19 @@ msgid "
Message Example
\n\n" "<li>Amount: {{ doc.grand_total }}\n" "</ul>\n" "" -msgstr "" +msgstr "
Nachrichtenbeispiel
\n\n" +"
<h3>Bestellung überfällig</h3>\n\n"
+"<p>Transaktion {{ doc.name }} hat das Fälligkeitsdatum überschritten. Bitte ergreifen Sie die notwendigen Maßnahmen.</p>\n\n"
+"<!-- letzten Kommentar anzeigen -->\n"
+"{% if comments %}\n"
+"Letzter Kommentar: {{ comments[-1].comment }} von {{ comments[-1].by }}\n"
+"{% endif %}\n\n"
+"<h4>Details</h4>\n\n"
+"<ul>\n"
+"<li>Kunde: {{ doc.customer }}\n"
+"<li>Betrag: {{ doc.grand_total }}\n"
+"</ul>\n"
+"
" #. Content of the 'html_condition' (HTML) field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -605,7 +703,9 @@ msgctxt "Webhook" msgid "

Condition Examples:

\n" "
doc.status==\"Open\"
doc.due_date==nowdate()
doc.total > 40000\n" "
" -msgstr "" +msgstr "

Bedingungsbeispiele:

\n" +"
doc.status==\"Öffnen\"
doc.due_date==nowdate()
doc.total > 40000\n\n" +"
" #. Content of the 'html_7' (HTML) field in DocType 'Notification' #: email/doctype/notification/notification.json @@ -613,7 +713,9 @@ msgctxt "Notification" msgid "

Condition Examples:

\n" "
doc.status==\"Open\"
doc.due_date==nowdate()
doc.total > 40000\n" "
\n" -msgstr "" +msgstr "

Bedingungsbeispiele:

\n" +"
doc.status==\"Öffnen\"
doc.due_date==nowdate()
doc.total > 40000\n" +"
\n" #. Content of the 'Condition Description' (HTML) field in DocType 'Web Form' #: website/doctype/web_form/web_form.json @@ -621,7 +723,9 @@ msgctxt "Web Form" msgid "

Multiple webforms can be created for a single doctype. Add filters specific to this webform to display correct record after submission.

For Example:

\n" "

If you create a separate webform every year to capture feedback from employees add a \n" " field named year in doctype and add a filter year = 2023

\n" -msgstr "" +msgstr "

Mehrere Webformulare können für ein einzelnes Doctyle erstellt werden. Fügen Sie Filter für dieses Webformular hinzu, um den korrekten Datensatz nach dem Einreichen anzuzeigen.

Zum Beispiel:

\n" +"

Wenn Sie jedes Jahr ein separates Webformular erstellen, um Feedback von Mitarbeitern zu erfassen, fügen Sie ein \n" +" Feld mit dem Namen Jahr in Doctype hinzu und fügen Sie einen Filter Jahr = 2023

\n" #. Description of the 'Context Script' (Code) field in DocType 'Web Page' #: website/doctype/web_page/web_page.json @@ -630,7 +734,10 @@ msgid "

Set context before rendering a template. Example:

\n" "

\n"
 "context.project = frappe.get_doc(\"Project\", frappe.form_dict.name)\n"
 "
" -msgstr "" +msgstr "

Legen Sie den Kontext vor der Darstellung einer Vorlage fest. Beispiel:

\n" +"

\n"
+"context.project = frappe.get_doc(\"Project\", frappe.form_dict.name)\n"
+"
" #. Content of the 'JS Message' (HTML) field in DocType 'Custom HTML Block' #: desk/doctype/custom_html_block/custom_html_block.json @@ -643,7 +750,7 @@ msgstr "" #: twofactor.py:469 msgid "

Your OTP secret on {0} has been reset. If you did not perform this reset and did not request it, please contact your System Administrator immediately.

" -msgstr "" +msgstr "

Ihr OTP-Geheimnis auf {0} wurde zurückgesetzt. Wenn Sie diese Rücksetzung nicht durchgeführt und nicht angefordert haben, wenden Sie sich bitte umgehend an Ihren Systemadministrator.

" #. Description of the 'Cron Format' (Data) field in DocType 'Scheduled Job #. Type' @@ -661,7 +768,18 @@ msgid "
*  *  *  *  *\n"
 "* - Any value\n"
 "/ - Step values\n"
 "
\n" -msgstr "" +msgstr "
* * * *\n"
+"┬ ┬ ┬ ┬\n"
+"│ │ │ │\n"
+"│ │ │ │ └ Wochentag (0 - 6) (0 ist Sonntag)\n"
+"│ │ │ └───── Monat (1 - 12)\n"
+"│ │ └────────── Tag des Monats (1 - 31)\n"
+"│ └─────────────── Stunde (0 - 23)\n"
+"└──────────────────── Minute (0 - 59)\n\n"
+"---\n\n"
+"* - beliebiger Wert\n"
+"/ - Schrittwert\n"
+"
\n" #. Description of the 'Cron Format' (Data) field in DocType 'Server Script' #: core/doctype/server_script/server_script.json @@ -678,7 +796,18 @@ msgid "
*  *  *  *  *\n"
 "* - Any value\n"
 "/ - Step values\n"
 "
\n" -msgstr "" +msgstr "
* * * *\n"
+"┬ ┬ ┬ ┬\n"
+"│ │ │ │\n"
+"│ │ │ │ └ Wochentag (0 - 6) (0 ist Sonntag)\n"
+"│ │ │ └───── Monat (1 - 12)\n"
+"│ │ └────────── Tag des Monats (1 - 31)\n"
+"│ └─────────────── Stunde (0 - 23)\n"
+"└──────────────────── Minute (0 - 59)\n\n"
+"---\n\n"
+"* - beliebiger Wert\n"
+"/ - Schrittwert\n"
+"
\n" #. Content of the 'Example' (HTML) field in DocType 'Workflow Transition' #: workflow/doctype/workflow_transition/workflow_transition.json @@ -696,11 +825,23 @@ msgid "
doc.grand_total > 0
\n\n" "
  • frappe.utils.now
  • \n" "\n" "

    Example:

    doc.creation > frappe.utils.add_to_date(frappe.utils.now_datetime(), days=-5, as_string=True, as_datetime=True) 

    " -msgstr "" +msgstr "
    doc.grand_total > 0
    \n\n" +"

    Bedingungen sollten in einfachem Python geschrieben werden. Bitte verwenden Sie nur die im Formular verfügbaren Eigenschaften.

    \n" +"

    Erlaubte Funktionen:\n" +"

      \n" +"
    • frappe.db.get_value
    • \n" +"
    • frappe.db.get_list
    • \n" +"
    • frappe.session
    • \n" +"
    • frappe.utils.now_datetime
    • \n" +"
    • frappe.utils.get_datetime
    • \n" +"
    • frappe.utils.add_to_date
    • \n" +"
    • frappe.utils.now
    • \n" +"
    \n" +"

    Beispiel:

    doc.creation > frappe.utils.add_to_date(frappe.utils.now_datetime(), days=-5, as_string=True, as_datetime=True) 

    " #: custom/doctype/custom_field/custom_field.js:39 msgid "Warning: This field is system generated and may be overwritten by a future update. Modify it using {0} instead." -msgstr "" +msgstr "Warnung: Dieses Feld wird vom System generiert und kann durch ein zukünftiges Update überschrieben werden. Ändern Sie es stattdessen mit {0}." #. Option for the 'Condition' (Select) field in DocType 'Document Naming Rule #. Condition' @@ -1662,7 +1803,7 @@ msgstr "Nach dem Speichern (Übermitteltes Dokument)" #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "After Submission" -msgstr "" +msgstr "Nach dem Buchen" #. Option for the 'DocType Event' (Select) field in DocType 'Server Script' #: core/doctype/server_script/server_script.json @@ -1672,7 +1813,7 @@ msgstr "Nach dem Absenden" #: desk/doctype/number_card/number_card.py:58 msgid "Aggregate Field is required to create a number card" -msgstr "" +msgstr "Das Feld Aggregatfunktion wird benötigt, um eine Nummernkarte zu erstellen" #. Label of a Select field in DocType 'Dashboard Chart' #: desk/doctype/dashboard_chart/dashboard_chart.json @@ -1699,7 +1840,7 @@ msgstr "Aufmerksam" #. Label of a Card Break in the Tools Workspace #: automation/workspace/tools/tools.json msgid "Alerts and Notifications" -msgstr "" +msgstr "Warnungen und Benachrichtigungen" #. Label of a Select field in DocType 'Letter Head' #: printing/doctype/letter_head/letter_head.json @@ -1784,13 +1925,13 @@ msgstr "Alle Anpassungen werden entfernt. Bitte bestätigen." #: templates/includes/comments/comments.html:158 msgid "All fields are necessary to submit the comment." -msgstr "" +msgstr "Alle Felder sind notwendig, um den Kommentar abzuschicken." #. Description of the 'Document States' (Table) field in DocType 'Workflow' #: workflow/doctype/workflow/workflow.json msgctxt "Workflow" msgid "All possible Workflow States and roles of the workflow. Docstatus Options: 0 is \"Saved\", 1 is \"Submitted\" and 2 is \"Cancelled\"" -msgstr "" +msgstr "Alle möglichen Workflow-Zustände und Rollen des Workflows. Docstatus Optionen: 0 ist „gespeichert“, 1 ist „gebucht“ und 2 ist „storniert“" #: utils/password_strength.py:187 msgid "All-uppercase is almost as easy to guess as all-lowercase." @@ -1880,7 +2021,7 @@ msgstr "Dropbox-Zugang zulassen" #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "Allow Editing After Submit" -msgstr "" +msgstr "Bearbeiten nach Buchen erlauben" #: integrations/doctype/google_calendar/google_calendar.py:100 #: integrations/doctype/google_calendar/google_calendar.py:114 @@ -2030,7 +2171,7 @@ msgstr "Erlaube Selbstgenehmigung" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Allow Sending Usage Data for Improving Applications" -msgstr "" +msgstr "Senden von Nutzungsdaten zur Verbesserung von Anwendungen zulassen" #. Description of the 'Allow Self Approval' (Check) field in DocType 'Workflow #. Transition' @@ -2079,19 +2220,19 @@ msgstr "In Schnelleingabe zulassen" #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" msgid "Allow on Submit" -msgstr "Änderungen zulassen wenn gebucht" +msgstr "Änderungen nach dem Buchen zulassen" #. Label of a Check field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "Allow on Submit" -msgstr "Änderungen zulassen wenn gebucht" +msgstr "Änderungen nach dem Buchen zulassen" #. Label of a Check field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Allow on Submit" -msgstr "Änderungen zulassen wenn gebucht" +msgstr "Änderungen nach dem Buchen zulassen" #. Label of a Check field in DocType 'System Settings' #: core/doctype/system_settings/system_settings.json @@ -2107,7 +2248,7 @@ msgstr "Seitenumbruch innerhalb von Tabellen erlauben" #: desk/page/setup_wizard/setup_wizard.js:420 msgid "Allow recording my first session to improve user experience" -msgstr "" +msgstr "Erlauben Sie die Aufzeichnung meiner ersten Sitzung, um die Benutzerfreundlichkeit zu verbessern" #. Description of the 'Allow Incomplete Forms' (Check) field in DocType 'Web #. Form' @@ -2118,7 +2259,7 @@ msgstr "Speichern trotz leerer Pflichtfelder zulassen" #: desk/page/setup_wizard/setup_wizard.js:413 msgid "Allow sending usage data for improving applications" -msgstr "" +msgstr "Erlaube das Senden von Nutzungsdaten zur Verbesserung von Anwendungen" #. Description of the 'Login After' (Int) field in DocType 'User' #: core/doctype/user/user.json @@ -2137,7 +2278,7 @@ msgstr "Benutzer darf sich nur vor dieser Stunde anmelden (0-24)" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Allow users to log in without a password, using a login link sent to their email" -msgstr "" +msgstr "Benutzern erlauben, sich ohne Passwort anzumelden, indem ein Login-Link an ihre E-Mail gesendet wird" #. Label of a Link field in DocType 'Workflow Transition' #: workflow/doctype/workflow_transition/workflow_transition.json @@ -2242,13 +2383,13 @@ msgstr "Änderungszähler" #. Name of a DocType #: core/doctype/amended_document_naming_settings/amended_document_naming_settings.json msgid "Amended Document Naming Settings" -msgstr "" +msgstr "Einstellungen für berichtigte Benennung von Dokumenten" #. Label of a Section Break field in DocType 'Document Naming Settings' #: core/doctype/document_naming_settings/document_naming_settings.json msgctxt "Document Naming Settings" msgid "Amended Documents" -msgstr "" +msgstr "Berichtigte Dokumente" #. Label of a Link field in DocType 'Personal Data Download Request' #: website/doctype/personal_data_download_request/personal_data_download_request.json @@ -2353,7 +2494,7 @@ msgstr "App Zugriffsschlüssel" #: integrations/doctype/dropbox_settings/dropbox_settings.js:22 msgid "App Access Key and/or Secret Key are not present." -msgstr "" +msgstr "App Access Key und/oder Secret Key sind nicht vorhanden." #. Label of a Data field in DocType 'OAuth Client' #: integrations/doctype/oauth_client/oauth_client.json @@ -2447,7 +2588,7 @@ msgstr "\"Anhängen an\" kann ein Wert aus {0} sein" #: email/doctype/email_account/email_account.json msgctxt "Email Account" msgid "Append as communication against this DocType (must have fields: \"Sender\" and \"Subject\"). These fields can be defined in the email settings section of the appended doctype." -msgstr "" +msgstr "Als Kommunikation an diesen DocType anhängen (muss Felder haben: \"Absender\" und \"Betreff\"). Diese Felder können im Abschnitt E-Mail-Einstellungen des angehängten DocTyps definiert werden." #: core/doctype/user_permission/user_permission_list.js:105 msgid "Applicable Document Types" @@ -2618,7 +2759,7 @@ msgstr "Sind Sie sicher, dass Sie fortfahren möchten?" #: core/doctype/rq_job/rq_job_list.js:25 msgid "Are you sure you want to re-enable scheduler?" -msgstr "" +msgstr "Sind Sie sicher, dass Sie den Scheduler wieder aktivieren möchten?" #: core/doctype/communication/communication.js:163 msgid "Are you sure you want to relink this communication to {0}?" @@ -2626,7 +2767,7 @@ msgstr "Sind Sie sicher, dass Sie diese Mitteilung an {0} neu verknüpfen wollen #: core/doctype/rq_job/rq_job_list.js:10 msgid "Are you sure you want to remove all failed jobs?" -msgstr "" +msgstr "Sind Sie sicher, dass Sie alle fehlgeschlagenen Jobs entfernen möchten?" #: public/js/frappe/list/list_filter.js:109 msgid "Are you sure you want to remove the {0} filter?" @@ -2638,7 +2779,7 @@ msgstr "Möchten Sie wirklich alle Anpassungen zurücksetzen?" #: email/doctype/newsletter/newsletter.js:60 msgid "Are you sure you want to send this newsletter now?" -msgstr "" +msgstr "Sind Sie sicher, dass Sie diesen Newsletter jetzt senden möchten?" #: core/doctype/document_naming_rule/document_naming_rule.js:16 #: core/doctype/user_permission/user_permission_list.js:165 @@ -2663,7 +2804,7 @@ msgstr "Da die Freigabe von Dokumenten deaktiviert ist, erteilen Sie ihnen vor d #: templates/emails/account_deletion_notification.html:3 msgid "As per your request, your account and data on {0} associated with email {1} has been permanently deleted" -msgstr "" +msgstr "Wie von Ihnen gewünscht, wurden Ihr Konto und die Daten auf {0}, die mit der E-Mail {1} verbunden sind, endgültig gelöscht" #. Label of a Code field in DocType 'Assignment Rule' #: automation/doctype/assignment_rule/assignment_rule.json @@ -2780,7 +2921,7 @@ msgstr "Zuordnungstage" #: automation/doctype/assignment_rule/assignment_rule.py:64 msgid "Assignment Day{0} {1} has been repeated." -msgstr "" +msgstr "Zuweisungstag {0} {1} kommen mehrfach vor." #. Name of a DocType #: automation/doctype/assignment_rule/assignment_rule.json @@ -2850,11 +2991,11 @@ msgstr "Zuordnungen" #: public/js/frappe/form/grid_row.js:629 msgid "At least one column is required to show in the grid." -msgstr "" +msgstr "Mindestens eine Spalte muss im Raster angezeigt werden." #: website/doctype/web_form/web_form.js:64 msgid "Atleast one field is required in Web Form Fields Table" -msgstr "" +msgstr "Mindestens ein Feld ist in der Tabelle der Webformularfelder erforderlich" #: core/doctype/data_export/data_export.js:44 msgid "Atleast one field of Parent Document Type is mandatory" @@ -2964,7 +3105,7 @@ msgstr "Angehängt an Namen" #: core/doctype/file/file.py:140 msgid "Attached To Name must be a string or an integer" -msgstr "" +msgstr "Angehängt an Name muss eine Zeichenfolge oder eine Ganzzahl sein" #. Option for the 'Comment Type' (Select) field in DocType 'Comment' #: core/doctype/comment/comment.json @@ -2999,7 +3140,7 @@ msgstr "Beschränkung der Größe des Anhangs (MB)" #: core/doctype/file/file.py:321 #: public/js/frappe/form/sidebar/attachments.js:36 msgid "Attachment Limit Reached" -msgstr "" +msgstr "Limit für Anhänge erreicht" #. Label of a HTML field in DocType 'Notification Log' #: desk/doctype/notification_log/notification_log.json @@ -3243,7 +3384,7 @@ msgstr "Automatische Wiederholung der Dokumentenerstellung fehlgeschlagen" #: automation/doctype/auto_repeat/auto_repeat.js:115 msgid "Auto Repeat Schedule" -msgstr "" +msgstr "Zeitplan automatisch wiederholen" #: public/js/frappe/utils/common.js:434 msgid "Auto Repeat created for this document" @@ -3279,7 +3420,7 @@ msgstr "Dokumenten automatisch folgen, die Ihnen zugewiesen sind" #: core/doctype/user/user.json msgctxt "User" msgid "Auto follow documents that are shared with you" -msgstr "" +msgstr "Dokumenten automatisch folgen, die mit Ihnen geteilt werden" #. Label of a Check field in DocType 'User' #: core/doctype/user/user.json @@ -3321,7 +3462,7 @@ msgstr "Autovervollständigung" #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Autoincrement" -msgstr "" +msgstr "Autoinkrement" #. Option for the 'Communication Type' (Select) field in DocType #. 'Communication' @@ -3352,7 +3493,7 @@ msgstr "Die automatische Verknüpfung kann nur aktiviert werden, wenn Eingehend #: website/doctype/website_settings/website_settings.json msgctxt "Website Settings" msgid "Automatically delete account within (hours)" -msgstr "" +msgstr "Konto automatisch löschen innerhalb von (Stunden)" #. Label of a Card Break in the Tools Workspace #: automation/workspace/tools/tools.json @@ -3762,19 +3903,19 @@ msgstr "Vor dem Speichern" #: core/doctype/server_script/server_script.json msgctxt "Server Script" msgid "Before Save (Submitted Document)" -msgstr "Vor dem Speichern (gesendetes Dokument)" +msgstr "Vor dem Speichern (gebuchtes Dokument)" #. Option for the 'DocType Event' (Select) field in DocType 'Server Script' #: core/doctype/server_script/server_script.json msgctxt "Server Script" msgid "Before Submit" -msgstr "Vor dem Absenden" +msgstr "Vor dem Buchen" #. Option for the 'DocType Event' (Select) field in DocType 'Server Script' #: core/doctype/server_script/server_script.json msgctxt "Server Script" msgid "Before Validate" -msgstr "" +msgstr "Vor der Validierung" #. Option for the 'Level' (Select) field in DocType 'Help Article' #: website/doctype/help_article/help_article.json @@ -4143,13 +4284,13 @@ msgstr "Erstellen" #: workflow/doctype/workflow/workflow_list.js:18 msgid "Build {0}" -msgstr "" +msgstr "Baue {0}" #. Label of a Check field in DocType 'Role' #: core/doctype/role/role.json msgctxt "Role" msgid "Bulk Actions" -msgstr "" +msgstr "Massenbearbeitung" #: core/doctype/user_permission/user_permission_list.js:142 msgid "Bulk Delete" @@ -4176,19 +4317,19 @@ msgstr "Massen-Update" #: model/workflow.py:253 msgid "Bulk approval only support up to 500 documents." -msgstr "" +msgstr "Massengenehmigung unterstützt nur bis zu 500 Dokumente." #: desk/doctype/bulk_update/bulk_update.py:57 msgid "Bulk operation is enqueued in background." -msgstr "" +msgstr "Massenoperationen werden im Hintergrund eingereiht." #: desk/doctype/bulk_update/bulk_update.py:70 msgid "Bulk operations only support up to 500 documents." -msgstr "" +msgstr "Massenvorgänge unterstützen nur bis zu 500 Dokumente." #: model/workflow.py:243 msgid "Bulk {0} is enqueued in background." -msgstr "" +msgstr "Massen- {0} ist im Hintergrund eingereiht." #. Option for the 'Field Type' (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json @@ -4248,7 +4389,7 @@ msgstr "Standardmäßig wird der Titel als Metatitel verwendet. Wenn Sie hier ei #: integrations/doctype/s3_backup_settings/s3_backup_settings.json msgctxt "S3 Backup Settings" msgid "By default, emails are only sent for failed backups." -msgstr "" +msgstr "E-Mails werden standardmäßig nur für fehlgeschlagene Sicherungen versendet." #. Option for the 'Naming Rule' (Select) field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -4353,7 +4494,7 @@ msgstr "CSS-Klasse" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "CSS selector for the element you want to highlight." -msgstr "" +msgstr "CSS-Selektor für das Element, das Sie hervorheben möchten." #. Option for the 'Format' (Select) field in DocType 'Auto Email Report' #: email/doctype/auto_email_report/auto_email_report.json @@ -4645,7 +4786,7 @@ msgstr "Zugriff auf Dateipfad {0} nicht möglich" #: public/js/workflow_builder/utils.js:183 msgid "Cannot cancel before submitting while transitioning from {0} State to {1} State" -msgstr "" +msgstr "Beim Übergang vom Zustand {0} zum Zustand {1}kann der Vorgang nicht vor dem Buchen abgebrochen werden" #: workflow/doctype/workflow/workflow.py:112 msgid "Cannot cancel before submitting. See Transition {0}" @@ -4661,11 +4802,11 @@ msgstr "Status kann nicht von 0 (Entwurf) zu 2 (Abgebrochen) geändert werden" #: model/document.py:852 msgid "Cannot change docstatus from 1 (Submitted) to 0 (Draft)" -msgstr "" +msgstr "Der Dokumentstatus kann nicht von 1 (Gebucht) auf 0 (Entwurf) geändert werden" #: public/js/workflow_builder/utils.js:170 msgid "Cannot change state of Cancelled Document ({0} State)" -msgstr "" +msgstr "Der Status des abgebrochenen Dokuments kann nicht geändert werden (Status {0})" #: workflow/doctype/workflow/workflow.py:101 msgid "Cannot change state of Cancelled Document. Transition row {0}" @@ -4673,7 +4814,7 @@ msgstr "Zustand des aufgehobenen Dokumentes kann nicht geändert werden. Überga #: core/doctype/doctype/doctype.py:1104 msgid "Cannot change to/from autoincrement autoname in Customize Form" -msgstr "" +msgstr "In „Formular anpassen“ kann nicht von/zu Benennungsschema „Autoinkrementierung“ gewechselt werden" #: core/doctype/communication/communication.py:193 msgid "Cannot create a {0} against a child document: {1}" @@ -4709,7 +4850,7 @@ msgstr "Standarddokumentstatus kann nicht gelöscht werden." #: custom/doctype/customize_form/customize_form.js:276 msgid "Cannot delete standard field {0}. You can hide it instead." -msgstr "" +msgstr "Das Standardfeld {0}kann nicht gelöscht werden. Sie können es stattdessen ausblenden." #: custom/doctype/customize_form/customize_form.js:298 msgid "Cannot delete standard link. You can hide it if you want" @@ -4717,7 +4858,7 @@ msgstr "Standardlink kann nicht gelöscht werden. Sie können es ausblenden, wen #: custom/doctype/customize_form/customize_form.js:268 msgid "Cannot delete system generated field {0}. You can hide it instead." -msgstr "" +msgstr "Das vom System generierte Feld {0}kann nicht gelöscht werden. Sie können es stattdessen ausblenden." #: public/js/frappe/list/bulk_operations.js:171 msgid "Cannot delete {0}" @@ -4805,7 +4946,7 @@ msgstr "Kann {0} nicht buchen." #: desk/doctype/workspace/workspace.py:351 msgid "Cannot update private workspace of other users" -msgstr "" +msgstr "Der private Arbeitsbereich anderer Benutzer kann nicht verändert werden" #: desk/doctype/bulk_update/bulk_update.js:26 #: public/js/frappe/list/bulk_operations.js:301 @@ -4818,11 +4959,11 @@ msgstr "Kann in \"sortieren nach\" keine Unterabfrage verwenden." #: model/db_query.py:1143 msgid "Cannot use {0} in order/group by" -msgstr "" +msgstr "{0} kann für die Sortierung oder Gruppierung verwendet werden" #: public/js/frappe/list/bulk_operations.js:232 msgid "Cannot {0} {1}." -msgstr "" +msgstr "Kann {1} nicht {0}." #: utils/password_strength.py:185 msgid "Capitalization doesn't help very much." @@ -4910,7 +5051,7 @@ msgstr "Kettenintegrität" #: core/doctype/transaction_log/transaction_log.json msgctxt "Transaction Log" msgid "Chaining Hash" -msgstr "" +msgstr "Kettenhash" #: tests/test_translate.py:98 msgid "Change" @@ -4948,15 +5089,16 @@ msgstr "Benutzer wechseln" msgctxt "Document Naming Settings" msgid "Change the starting / current sequence number of an existing series.
    \n\n" "Warning: Incorrectly updating counters can prevent documents from getting created. " -msgstr "" +msgstr "Ändern Sie die initiale bzw. aktuelle Sequenznummer eines bestehenden Nummernkreises.
    \n\n" +"Warnung: Eine fehlerhafte Aktualisierung der Zähler kann dazu führen, dass keine neuen Dokumente erstellt werden können. " #: email/doctype/email_domain/email_domain.js:5 msgid "Changing any setting will reflect on all the email accounts associated with this domain." -msgstr "" +msgstr "Das Ändern einer Einstellung wirkt sich auf alle mit dieser Domain verknüpften E-Mail-Konten aus." #: core/doctype/system_settings/system_settings.js:62 msgid "Changing rounding method on site with data can result in unexpected behaviour." -msgstr "" +msgstr "Das Ändern der Rundungsmethode einer Instanz mit Daten kann zu unerwartetem Verhalten führen." #. Label of a Select field in DocType 'Notification' #: email/doctype/notification/notification.json @@ -5136,7 +5278,7 @@ msgstr "Version Prüfsumme" #: www/list.py:85 msgid "Child DocTypes are not allowed" -msgstr "" +msgstr "Untergeordnete DocTypes sind nicht erlaubt" #. Label of a Data field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json @@ -5203,7 +5345,7 @@ msgstr "Leeren und Vorlage einfügen" #: public/js/frappe/views/communication.js:98 msgid "Clear & Add template" -msgstr "" +msgstr "Leeren und Vorlage einfügen" #: public/js/frappe/ui/keyboard.js:275 msgid "Clear Cache and Reload" @@ -5678,7 +5820,7 @@ msgstr "Spaltenname darf nicht leer sein" #: public/js/frappe/form/grid_row.js:593 msgid "Column width cannot be zero." -msgstr "" +msgstr "Spaltenbreite darf nicht null sein." #. Label of a Int field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json @@ -5729,7 +5871,7 @@ msgstr "Kombination von Grant-Typ ( {0} ) und Antworttyp ( {1 #: printing/doctype/print_settings/print_settings.json msgctxt "Print Settings" msgid "Comm10E" -msgstr "" +msgstr "Comm10E" #. Name of a DocType #: core/doctype/comment/comment.json @@ -5784,13 +5926,13 @@ msgstr "Kommentar kann nur vom Eigentümer bearbeitet werden" #: website/doctype/blog_settings/blog_settings.json msgctxt "Blog Settings" msgid "Comment limit" -msgstr "" +msgstr "Kommentarlimit" #. Description of the 'Comment limit' (Int) field in DocType 'Blog Settings' #: website/doctype/blog_settings/blog_settings.json msgctxt "Blog Settings" msgid "Comment limit per hour" -msgstr "" +msgstr "Kommentarlimit pro Stunde" #: model/__init__.py:150 model/meta.py:54 public/js/frappe/model/meta.js:206 #: public/js/frappe/model/model.js:125 @@ -5812,7 +5954,7 @@ msgstr "Kommentare dürfen keine Links oder E-Mail-Adressen enthalten" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Commercial Rounding" -msgstr "" +msgstr "Kaufmännisches Runden" #. Label of a Check field in DocType 'System Console' #: desk/doctype/system_console/system_console.json @@ -5824,7 +5966,7 @@ msgstr "Verpflichten" #: desk/doctype/console_log/console_log.json msgctxt "Console Log" msgid "Committed" -msgstr "" +msgstr "Persistiert" #: utils/password_strength.py:180 msgid "Common names and surnames are easy to guess." @@ -5870,7 +6012,7 @@ msgstr "Kommunikationsverbindung" #: core/workspace/build/build.json msgctxt "Communication" msgid "Communication Logs" -msgstr "" +msgstr "Kommunikationsprotokolle" #. Label of a Select field in DocType 'Communication' #: core/doctype/communication/communication.json @@ -5903,11 +6045,11 @@ msgstr "Firma" #: custom/doctype/client_script/client_script.js:54 #: public/js/frappe/utils/diffview.js:27 msgid "Compare Versions" -msgstr "" +msgstr "Versionen vergleichen" #: core/doctype/server_script/server_script.py:134 msgid "Compilation warning" -msgstr "" +msgstr "Kompilierungswarnung" #: website/doctype/website_theme/website_theme.py:125 msgid "Compiled Successfully" @@ -5969,7 +6111,7 @@ msgstr "Abgeschlossen" #: workflow/doctype/workflow_action/workflow_action.json msgctxt "Workflow Action" msgid "Completed By Role" -msgstr "" +msgstr "Abgeschlossen durch Rolle" #. Label of a Link field in DocType 'Workflow Action' #: workflow/doctype/workflow_action/workflow_action.json @@ -6033,7 +6175,7 @@ msgstr "Zustand" #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "Condition Description" -msgstr "" +msgstr "Beschreibung der Bedingung" #. Label of a JSON field in DocType 'Web Form' #: website/doctype/web_form/web_form.json @@ -6074,7 +6216,9 @@ msgctxt "Document Naming Settings" msgid "Configure how amended documents will be named.
    \n\n" "Default behaviour is to follow an amend counter which adds a number to the end of the original name indicating the amended version.
    \n\n" "Default Naming will make the amended document to behave same as new documents." -msgstr "" +msgstr "Legen Sie fest, wie berichtigte Dokumente benannt werden sollen.
    \n\n" +"Standardmäßig wird ein Berichtigungszähler verwendet, der am Ende des Originalnamens eine Zahl anhängt, die die berichtigte Version angibt.
    \n\n" +"Die Standardbenennung bewirkt, dass sich das berichtigte Dokument genauso verhält wie neue Dokumente." #: www/update-password.html:30 msgid "Confirm" @@ -6342,7 +6486,7 @@ msgstr "Inhaltstyp" #: desk/doctype/workspace/workspace.py:79 msgid "Content data shoud be a list" -msgstr "" +msgstr "Inhaltsdaten sollten eine Liste sein" #: website/doctype/web_page/web_page.js:91 msgid "Content type for building the page" @@ -6398,7 +6542,7 @@ msgstr "Beitragsstatus" #: integrations/doctype/social_login_key/social_login_key.json msgctxt "Social Login Key" msgid "Controls whether new users can sign up using this Social Login Key. If unset, Website Settings is respected. " -msgstr "" +msgstr "Steuert, ob sich neue Benutzer mit diesem Social Login Key anmelden können. Wenn nicht eingestellt, werden die Website-Einstellungen berücksichtigt. " #: public/js/frappe/utils/utils.js:1030 msgid "Copied to clipboard." @@ -6512,7 +6656,7 @@ msgstr "Land" #: utils/__init__.py:116 msgid "Country Code Required" -msgstr "" +msgstr "Landesvorwahl erforderlich" #. Label of a Data field in DocType 'Country' #: geo/doctype/country/country.json @@ -6530,7 +6674,7 @@ msgstr "Landesbezirk/Gemeinde/Kreis" #: public/js/frappe/utils/number_systems.js:45 msgctxt "Number system" msgid "Cr" -msgstr "" +msgstr "Cr" #: core/doctype/communication/communication.js:117 #: desk/doctype/dashboard_chart_source/dashboard_chart_source.js:15 @@ -6594,7 +6738,7 @@ msgstr "Benutzerdefinierte Felder erstellen" #: public/js/frappe/views/workspace/workspace.js:925 msgid "Create Duplicate" -msgstr "" +msgstr "Duplikat erstellen" #. Option for the 'Action' (Select) field in DocType 'Onboarding Step' #: desk/doctype/onboarding_step/onboarding_step.json @@ -6922,7 +7066,7 @@ msgstr "" #: desk/doctype/workspace/workspace.json msgctxt "Workspace" msgid "Custom Blocks" -msgstr "" +msgstr "Benutzerdefinierte Blöcke" #. Label of a Code field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json @@ -6996,7 +7140,7 @@ msgstr "Das benutzerdefinierte Feld {0} wird vom Administrator erstellt und kann #. Subtitle of the Module Onboarding 'Customization' #: custom/module_onboarding/customization/customization.json msgid "Custom Field, Custom Doctype, Naming Series, Role Permission, Workflow, Print Formats, Reports" -msgstr "" +msgstr "Benutzerdefiniertes Feld, Benutzerdefinierter Doctype, Nummernkreis, Rollenberechtigung, Workflow, Druckformate, Berichte" #: custom/doctype/custom_field/custom_field.py:260 msgid "Custom Fields can only be added to a standard DocType." @@ -7022,11 +7166,11 @@ msgstr "Benutzerdefiniertes Format" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "Custom Group Search" -msgstr "" +msgstr "Benutzerdefinierte Gruppensuche" #: integrations/doctype/ldap_settings/ldap_settings.py:119 msgid "Custom Group Search if filled needs to contain the user placeholder {0}, eg uid={0},ou=users,dc=example,dc=com" -msgstr "" +msgstr "Die benutzerdefinierte Gruppensuche muss den Benutzerplatzhalter {0} enthalten, z.B. uid={0},ou=users,dc=example,dc=com" #: printing/page/print_format_builder/print_format_builder.js:190 #: printing/page/print_format_builder/print_format_builder.js:720 @@ -7046,7 +7190,7 @@ msgstr "Benutzerdefinierte HTML-Hilfe" #: integrations/doctype/ldap_settings/ldap_settings.py:111 msgid "Custom LDAP Directoy Selected, please ensure 'LDAP Group Member attribute' and 'Group Object Class' are entered" -msgstr "" +msgstr "Benutzerdefiniertes LDAP-Verzeichnis ausgewählt. Stellen Sie sicher, dass „LDAP-Gruppenmitgliedsattribut“ und „Gruppenobjektklasse“ eingegeben sind" #. Label of a Data field in DocType 'Web Form Field' #: website/doctype/web_form_field/web_form_field.json @@ -8112,7 +8256,7 @@ msgstr "Löschen Sie diesen Datensatz, um das Senden an diese E-Mail Adresse zu #: public/js/frappe/list/list_view.js:1862 msgctxt "Title of confirmation dialog" msgid "Delete {0} item permanently?" -msgstr "" +msgstr "Element {0} endgültig löschen?" #: public/js/frappe/list/list_view.js:1868 msgctxt "Title of confirmation dialog" @@ -8188,7 +8332,7 @@ msgstr "Schritte zur Löschung " #: core/doctype/page/page.py:108 msgid "Deletion of this document is only permitted in developer mode." -msgstr "" +msgstr "Das Löschen dieses Dokuments ist nur im Entwicklermodus erlaubt." #: public/js/frappe/views/reports/report_utils.js:276 msgid "Delimiter must be a single character" @@ -8354,7 +8498,7 @@ msgstr "Beschreibung für Auflistungsseite, im Klartext, nur ein paar Zeilen. (m #: desk/doctype/onboarding_step/onboarding_step.json msgctxt "Onboarding Step" msgid "Description to inform the user about any action that is going to be performed" -msgstr "" +msgstr "Beschreibung, um den Benutzer über eine Aktion zu informieren, die durchgeführt werden soll" #. Label of a Data field in DocType 'Contact' #: contacts/doctype/contact/contact.json @@ -8452,7 +8596,7 @@ msgstr "Wurde nicht entfernt" #: public/js/frappe/utils/diffview.js:56 msgid "Diff" -msgstr "" +msgstr "Unterschiede" #. Description of the 'States' (Section Break) field in DocType 'Workflow' #: workflow/doctype/workflow/workflow.json @@ -8655,12 +8799,12 @@ msgstr "Verwerfen?" #. Name of a DocType #: website/doctype/discussion_reply/discussion_reply.json msgid "Discussion Reply" -msgstr "Diskussionsantwort" +msgstr "Unterhaltungsantwort" #. Name of a DocType #: website/doctype/discussion_topic/discussion_topic.json msgid "Discussion Topic" -msgstr "Diskussionsthema" +msgstr "Unterhaltungsthema" #: templates/discussions/reply_card.html:16 msgid "Dismiss" @@ -8701,7 +8845,7 @@ msgstr "Keinen neuen Benutzer erstellen" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "Do not create new user if user with email does not exist in the system" -msgstr "" +msgstr "Keinen neuen Benutzer anlegen, wenn ein Benutzer mit dieser E-Mail-Adresse nicht bereits im System vorhanden ist" #: public/js/frappe/form/grid.js:1156 msgid "Do not edit headers which are preset in the template" @@ -8985,7 +9129,7 @@ msgstr "DocType" #: core/doctype/doctype/doctype.py:1004 msgid "Doctype name is limited to {0} characters ({1})" -msgstr "" +msgstr "Der DocType-Name ist auf {0} Zeichen begrenzt ({1})" #: public/js/frappe/list/bulk_operations.js:3 msgid "Doctype required" @@ -8993,7 +9137,7 @@ msgstr "Doctype erforderlich" #: public/js/frappe/views/workspace/workspace.js:1303 msgid "Doctype with same route already exist. Please choose different title." -msgstr "" +msgstr "Unter demselben Pfad gibt es bereits einen DocType. Bitte wählen Sie einen anderen Titel." #. Label of a Dynamic Link field in DocType 'Audit Trail' #: core/doctype/audit_trail/audit_trail.json @@ -9067,19 +9211,19 @@ msgstr "Dokumentverknüpfungen" #: core/doctype/doctype/doctype.py:1162 msgid "Document Links Row #{0}: Could not find field {1} in {2} DocType" -msgstr "" +msgstr "Dokumentenverknüpfungen Zeile #{0}: Feld {1} konnte nicht in DocType {2} gefunden werden" #: core/doctype/doctype/doctype.py:1182 msgid "Document Links Row #{0}: Invalid doctype or fieldname." -msgstr "" +msgstr "Dokumentenverknüpfungen Zeile #{0}: Ungültiger DocType oder Feldname." #: core/doctype/doctype/doctype.py:1145 msgid "Document Links Row #{0}: Parent DocType is mandatory for internal links" -msgstr "" +msgstr "Dokumentenverknüpfungen Zeile #{0}: Übergeordneter DocType ist obligatorisch für interne Links" #: core/doctype/doctype/doctype.py:1151 msgid "Document Links Row #{0}: Table Fieldname is mandatory for internal links" -msgstr "" +msgstr "Dokumentverknüpfungen Zeile #{0}: Tabellenfeldname ist obligatorisch für interne Links" #: core/doctype/user_permission/user_permission_list.js:36 #: public/js/frappe/form/form_tour.js:58 @@ -9169,13 +9313,13 @@ msgstr "Dokumentenfreigabe" #. Name of a DocType #: core/doctype/document_share_key/document_share_key.json msgid "Document Share Key" -msgstr "" +msgstr "Dokumentfreigabeschlüssel" #. Label of a Int field in DocType 'System Settings' #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Document Share Key Expiry (in Days)" -msgstr "" +msgstr "Gültigkeitsdauer des Dokumentfreigabeschlüssels (in Tagen)" #. Name of a report #. Label of a Link in the Users Workspace @@ -9349,7 +9493,7 @@ msgstr "Dokumententyp" #: desk/doctype/number_card/number_card.py:55 msgid "Document Type and Function are required to create a number card" -msgstr "" +msgstr "Dokumententyp und Funktion werden benötigt, um eine Nummernkarte zu erstellen" #: permissions.py:149 msgid "Document Type is not importable" @@ -9379,7 +9523,7 @@ msgstr "Dokumententypen" #: core/doctype/user_type/user_type.json msgctxt "User Type" msgid "Document Types (Select Permissions Only)" -msgstr "" +msgstr "Dokumententypen (nur „Auswahl“-Berechtigungen)" #. Label of a Section Break field in DocType 'User Type' #: core/doctype/user_type/user_type.json @@ -9535,13 +9679,13 @@ msgstr "Senden Sie keine E-Mails" #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "Don't encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field" -msgstr "" +msgstr "HTML-Tags wie <script> oder Zeichen wie < oder > nicht kodieren, da diese absichtlich in diesem Feld verwendet werden könnten" #. Description of the 'Ignore XSS Filter' (Check) field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Don't encode HTML tags like <script> or just characters like < or >, as they could be intentionally used in this field" -msgstr "" +msgstr "HTML-Tags wie <script> oder Zeichen wie < oder > nicht kodieren, da diese absichtlich in diesem Feld verwendet werden könnten" #: www/login.html:119 www/login.html:135 www/update-password.html:34 msgid "Don't have an account?" @@ -9688,7 +9832,7 @@ msgstr "Aktuelle Zeile duplizieren" #: public/js/frappe/views/workspace/workspace.js:990 msgid "Duplicate of {0} named as {1} is created successfully" -msgstr "" +msgstr "Das Duplikat von {0} mit dem Namen {1} wurde erfolgreich erstellt" #. Option for the 'Field Type' (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json @@ -9812,7 +9956,7 @@ msgstr "Dynamische Vorlage" #. Description of the Onboarding Step 'Setup Naming Series' #: custom/onboarding_step/naming_series/naming_series.json msgid "Each document created in ERPNext can have a unique ID generated for it, using a prefix defined for it. Though each document has some prefix pre-configured, you can further customize it using tools like Naming Series Tool and Document Naming Rule.\n" -msgstr "" +msgstr "Für jedes in ERPNext erstellte Dokument kann eine eindeutige ID generiert werden, die ein dafür definiertes Präfix verwendet. Obwohl für jedes Dokument ein Präfix vorkonfiguriert ist, können Sie es mit Tools wie dem Nummernkreis-Tool und der Dokumentbenennungsregel weiter anpassen.\n" #: core/page/dashboard_view/dashboard_view.js:169 #: printing/page/print_format_builder_beta/print_format_builder_beta.js:46 @@ -10258,7 +10402,7 @@ msgstr "E-Mail-Queue Empfänger" #: email/queue.py:163 msgid "Email Queue flushing aborted due to too many failures." -msgstr "" +msgstr "Das Leeren der E-Mail-Warteschlange wurde aufgrund zu vieler Fehler abgebrochen." #. Label of a HTML field in DocType 'Email Template' #: email/doctype/email_template/email_template.json @@ -10359,7 +10503,7 @@ msgstr "E-Mail-Vorlage" #: desk/doctype/notification_settings/notification_settings.json msgctxt "Notification Settings" msgid "Email Threads on Assigned Document" -msgstr "" +msgstr "E-Mail-Threads zum zugewiesenen Dokument" #. Label of a Small Text field in DocType 'Auto Email Report' #: email/doctype/auto_email_report/auto_email_report.json @@ -10589,7 +10733,7 @@ msgstr "Webseiten-Tracking aktivieren" #: printing/doctype/print_format_field_template/print_format_field_template.py:27 msgid "Enable developer mode to create a standard Print Template" -msgstr "" +msgstr "Aktivieren Sie den Entwicklermodus, um eine Standard-Druckvorlage zu erstellen" #: website/doctype/web_template/web_template.py:33 msgid "Enable developer mode to create a standard Web Template" @@ -10600,14 +10744,15 @@ msgstr "Aktivieren Sie den Entwicklermodus, um eine Standard-Webvorlage zu erste #: website/doctype/blog_post/blog_post.json msgctxt "Blog Post" msgid "Enable email notification for any comment or likes received on your Blog Post." -msgstr "" +msgstr "E-Mail-Benachrichtigung für Kommentare oder Likes zu Ihren Blog-Beiträgen aktivieren." #. Description of the 'Modal Trigger' (Check) field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Enable if on click\n" "opens modal." -msgstr "" +msgstr "Aktivieren, wenn bei Klick\n" +"ein Modal geöffnet wird." #. Label of a Check field in DocType 'Website Settings' #: website/doctype/website_settings/website_settings.json @@ -10726,21 +10871,21 @@ msgstr "Aktiviert Kalender- und Gantt-Ansichten." #: email/doctype/email_account/email_account.js:232 msgid "Enabling auto reply on an incoming email account will send automated replies to all the synchronized emails. Do you wish to continue?" -msgstr "" +msgstr "Wenn Sie die automatische Beantwortung für ein eingehendes E-Mail-Konto aktivieren, werden automatische Antworten an alle synchronisierten E-Mails gesendet. Möchten Sie fortfahren?" #. Description of the 'Queue in Background (BETA)' (Check) field in DocType #. 'Customize Form' #: custom/doctype/customize_form/customize_form.json msgctxt "Customize Form" msgid "Enabling this will submit documents in background" -msgstr "" +msgstr "Wenn Sie dies aktivieren, werden die Dokumente im Hintergrund gebucht" #. Description of the 'Queue in Background (BETA)' (Check) field in DocType #. 'DocType' #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Enabling this will submit documents in background" -msgstr "" +msgstr "Wenn Sie dies aktivieren, werden die Dokumente im Hintergrund gebucht" #. Label of a Check field in DocType 'System Settings' #: core/doctype/system_settings/system_settings.json @@ -10873,7 +11018,7 @@ msgstr "Eingereiht von" #: integrations/doctype/ldap_settings/ldap_settings.py:105 msgid "Ensure the user and group search paths are correct." -msgstr "" +msgstr "Stellen Sie sicher, dass die Suchpfade für Benutzer und Gruppen korrekt sind." #: integrations/doctype/google_calendar/google_calendar.py:92 msgid "Enter Client Id and Client Secret in Google Settings." @@ -10896,7 +11041,7 @@ msgstr "Wert eingeben" #: public/js/frappe/form/form_tour.js:56 msgid "Enter a name for this {0}" -msgstr "" +msgstr "Geben Sie einen Namen für dieses {0} ein" #. Description of the 'User Defaults' (Table) field in DocType 'User' #: core/doctype/user/user.json @@ -11031,11 +11176,11 @@ msgstr "Fehler beim Verbinden mit der QZ-Tray-Anwendung ...

    Sie müssen #: email/doctype/email_domain/email_domain.py:32 msgid "Error connecting via IMAP/POP3: {e}" -msgstr "" +msgstr "Fehler beim Verbinden über IMAP/POP3: {e}" #: email/doctype/email_domain/email_domain.py:33 msgid "Error connecting via SMTP: {e}" -msgstr "" +msgstr "Fehler beim Verbinden über SMTP: {e}" #: email/doctype/email_domain/email_domain.py:98 msgid "Error has occurred in {0}" @@ -11119,7 +11264,7 @@ msgstr "Veranstaltungsteilnehmer" #: desk/doctype/notification_settings/notification_settings.json msgctxt "Notification Settings" msgid "Event Reminders" -msgstr "" +msgstr "Ereignis Erinnerungen" #: integrations/doctype/google_calendar/google_calendar.py:455 #: integrations/doctype/google_calendar/google_calendar.py:539 @@ -11146,7 +11291,8 @@ msgstr "Ereignisse im heutigen Kalender" #: custom/onboarding_step/custom_field/custom_field.json msgid "Every form in ERPNext has a standard set of fields. If you need to capture some information, but there is no standard Field available for it, you can insert Custom Field for it.\n\n" "Once custom fields are added, you can use them for reports and analytics charts as well.\n" -msgstr "" +msgstr "Jedes Formular in ERPNext verfügt über eine Reihe von Standardfeldern. Wenn Sie eine Information erfassen müssen, für die kein Standardfeld zur Verfügung steht, können Sie dafür ein benutzerdefiniertes Feld einfügen.\n\n" +"Sobald benutzerdefinierte Felder hinzugefügt sind, können Sie diese auch für Berichte und Diagramme verwenden.\n" #. Label of a Check field in DocType 'DocShare' #: core/doctype/docshare/docshare.json @@ -11197,7 +11343,7 @@ msgstr "Beispiel: 00001" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Example: Setting this to 24:00 will log out a user if they are not active for 24:00 hours." -msgstr "" +msgstr "Beispiel: Wenn Sie diesen Wert auf 24:00 setzen, wird ein Benutzer abgemeldet, wenn er 24:00 Stunden lang nicht aktiv ist." #. Description of the 'Description' (Small Text) field in DocType 'Assignment #. Rule' @@ -11418,13 +11564,13 @@ msgstr "Export nicht erlaubt. Rolle {0} wird gebraucht zum exportieren." #: core/doctype/data_export/data_export.json msgctxt "Data Export" msgid "Export the data without any header notes and column descriptions" -msgstr "" +msgstr "Daten ohne Kopfzeilenbeschreibungen und Spaltenbeschreibungen exportieren" #. Label of a Check field in DocType 'Data Export' #: core/doctype/data_export/data_export.json msgctxt "Data Export" msgid "Export without main header" -msgstr "" +msgstr "Export ohne Hauptkopfzeile" #: public/js/frappe/data_import/data_exporter.js:243 msgid "Export {0} records" @@ -11508,7 +11654,7 @@ msgstr "Fehlgeschlagen" #: core/doctype/rq_worker/rq_worker.json msgctxt "RQ Worker" msgid "Failed Job Count" -msgstr "" +msgstr "Anzahl fehlgeschlagener Jobs" #: model/workflow.py:305 msgid "Failed Transactions" @@ -11516,7 +11662,7 @@ msgstr "Fehlgeschlagene Transaktionen" #: utils/synchronization.py:46 msgid "Failed to aquire lock: {}. Lock may be held by another process." -msgstr "" +msgstr "Sperre konnte nicht erlangt werden: {}. Die Sperre wird möglicherweise von einem anderen Prozess gehalten." #: integrations/doctype/ldap_settings/ldap_settings.py:360 msgid "Failed to change password." @@ -11528,7 +11674,7 @@ msgstr "Der Abschluss des Setup ist fehlgeschlagen." #: integrations/doctype/webhook/webhook.py:148 msgid "Failed to compute request body: {}" -msgstr "" +msgstr "Fehler beim Berechnen des Anfragekörpers: {}" #: printing/doctype/network_printer_settings/network_printer_settings.py:45 #: printing/doctype/network_printer_settings/network_printer_settings.py:47 @@ -11541,11 +11687,11 @@ msgstr "Fehler beim Dekodieren des Tokens. Bitte geben Sie ein gültiges Base64- #: core/doctype/rq_job/rq_job_list.js:33 msgid "Failed to enable scheduler: {0}" -msgstr "" +msgstr "Konnte Zeitplaner nicht aktivieren: {0}" #: integrations/doctype/webhook/webhook.py:136 msgid "Failed to evaluate conditions: {}" -msgstr "" +msgstr "Die Bedingungen konnten nicht ausgewertet werden: {}" #: types/exporter.py:197 msgid "Failed to export python type hints" @@ -11569,11 +11715,11 @@ msgstr "Die Methode {0} mit {1} konnte nicht abgerufen werden" #: model/virtual_doctype.py:64 msgid "Failed to import virtual doctype {}, is controller file present?" -msgstr "" +msgstr "Fehler beim Importieren des virtuellen Doctype {}, ist die Controller-Datei vorhanden?" #: utils/image.py:75 msgid "Failed to optimize image: {0}" -msgstr "" +msgstr "Fehler beim Optimieren des Bilds: {0}" #: email/doctype/email_queue/email_queue.py:278 msgid "Failed to send email with subject:" @@ -11730,7 +11876,7 @@ msgstr "Das Feld "Route" ist für Web-Ansichten obligatorisch" #: core/doctype/doctype/doctype.py:1477 msgid "Field \"title\" is mandatory if \"Website Search Field\" is set." -msgstr "" +msgstr "Das Feld \"Titel\" ist obligatorisch, wenn \"Website-Suchfeld\" eingestellt ist." #: desk/doctype/bulk_update/bulk_update.js:17 msgid "Field \"value\" is mandatory. Please specify value to be updated" @@ -11792,11 +11938,11 @@ msgstr "Feldtyp kann nicht für {0} geändert werden" #: database/database.py:783 msgid "Field {0} does not exist on {1}" -msgstr "" +msgstr "Das Feld {0} existiert nicht auf {1}" #: desk/form/meta.py:203 msgid "Field {0} is referring to non-existing doctype {1}." -msgstr "" +msgstr "Das Feld {0} bezieht sich auf einen nicht existierenden Doctype {1}." #: public/js/frappe/form/form.js:1727 msgid "Field {0} not found." @@ -11850,11 +11996,11 @@ msgstr "Feldname" #: core/doctype/doctype/doctype.py:270 msgid "Fieldname '{0}' conflicting with a {1} of the name {2} in {3}" -msgstr "" +msgstr "Feldname '{0}' im Konflikt mit einem {1} mit dem Namen {2} in {3}" #: core/doctype/doctype/doctype.py:1039 msgid "Fieldname called {0} must exist to enable autonaming" -msgstr "" +msgstr "Der Feldname {0} muss existieren, um die automatische Benennung zu ermöglichen" #: database/schema.py:125 database/schema.py:359 msgid "Fieldname is limited to 64 characters ({0})" @@ -11870,7 +12016,7 @@ msgstr "Feldname, der der DocType für dieses Verknüpfungsfeld sein wird." #: public/js/form_builder/store.js:170 msgid "Fieldname {0} appears multiple times" -msgstr "" +msgstr "Feldname {0} erscheint mehrfach" #: database/schema.py:349 msgid "Fieldname {0} cannot have special characters like {1}" @@ -11937,7 +12083,7 @@ msgstr "Felder Multicheck" #: core/doctype/file/file.py:406 msgid "Fields `file_name` or `file_url` must be set for File" -msgstr "" +msgstr "Felder `file_name` oder `file_url` müssen für die Datei gesetzt sein" #. Description of the 'Search Fields' (Data) field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -11983,7 +12129,7 @@ msgstr "Feldtyp" #: custom/doctype/custom_field/custom_field.py:189 msgid "Fieldtype cannot be changed from {0} to {1}" -msgstr "" +msgstr "Feldtyp kann nicht von {0} auf {1} geändert werden" #: custom/doctype/customize_form/customize_form.py:586 msgid "Fieldtype cannot be changed from {0} to {1} in row {2}" @@ -12095,7 +12241,7 @@ msgstr "Datei zu groß" #: core/doctype/file/file.py:373 msgid "File type of {0} is not allowed" -msgstr "" +msgstr "Der Dateityp {0} ist nicht zulässig" #: core/doctype/file/file.py:360 core/doctype/file/file.py:422 msgid "File {0} does not exist" @@ -12227,7 +12373,7 @@ msgstr "Filter" #: public/js/frappe/ui/filters/filter_list.js:131 msgid "Filters {0}" -msgstr "" +msgstr "Filter {0}" #. Label of a Code field in DocType 'Number Card' #: desk/doctype/number_card/number_card.json @@ -12454,7 +12600,7 @@ msgstr "Folgen" #: email/doctype/auto_email_report/auto_email_report.py:124 msgid "Following Report Filters have missing values:" -msgstr "" +msgstr "Die folgenden Berichtsfilter haben fehlende Werte:" #: website/doctype/web_form/web_form.py:107 msgid "Following fields are missing:" @@ -12474,7 +12620,7 @@ msgstr "Den folgende Feldern fehlen Werte:" #: email/doctype/newsletter/newsletter.js:30 msgid "Following links are broken in the email content: {0}" -msgstr "" +msgstr "Die folgenden Links in der E-Mail sind defekt: {0}" #. Label of a Select field in DocType 'Print Settings' #: printing/doctype/print_settings/print_settings.json @@ -12574,7 +12720,7 @@ msgstr "Fußzeile HTML" #: printing/doctype/letter_head/letter_head.py:72 msgid "Footer HTML set from attachment {0}" -msgstr "" +msgstr "Fußzeilen-HTML aus Anhang {0} festgelegt" #. Label of a Section Break field in DocType 'Letter Head' #: printing/doctype/letter_head/letter_head.json @@ -12609,7 +12755,7 @@ msgstr "Werte für Fußzeilenvorlagen" #: printing/page/print/print.js:116 msgid "Footer might not be visible as {0} option is disabled" -msgstr "" +msgstr "Die Fußzeile ist möglicherweise nicht sichtbar, da die Option {0} deaktiviert ist" #. Description of the 'Footer HTML' (HTML Editor) field in DocType 'Letter #. Head' @@ -12644,14 +12790,16 @@ msgstr "Zum Beispiel: {} Öffnen" msgctxt "Customize Form Field" msgid "For Links, enter the DocType as range.\n" "For Select, enter list of Options, each on a new line." -msgstr "" +msgstr "Für Links geben Sie den DocType als Bereich ein.\n" +"Für Auswahl geben Sie eine Liste von Optionen ein, jede in einer neuen Zeile." #. Description of the 'Options' (Small Text) field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "For Links, enter the DocType as range.\n" "For Select, enter list of Options, each on a new line." -msgstr "" +msgstr "Für Links geben Sie den DocType als Bereich ein.\n" +"Für Auswahl geben Sie eine Liste von Optionen ein, jede in einer neuen Zeile." #: core/doctype/user_permission/user_permission_list.js:10 #: core/doctype/user_permission/user_permission_list.js:148 @@ -12719,7 +12867,7 @@ msgstr "Weitere Informationen erhalten Sie bei {0}." #: email/doctype/auto_email_report/auto_email_report.json msgctxt "Auto Email Report" msgid "For multiple addresses, enter the address on different line. e.g. test@test.com ⏎ test1@test.com" -msgstr "" +msgstr "Bei mehreren Adressen geben Sie bitte jede Adresse in einer neuen Zeile ein. z.B. test@test.com ⏎ test1@test.com" #: core/doctype/data_export/exporter.py:199 msgid "For updating, you can update only selective columns." @@ -12746,13 +12894,13 @@ msgstr "Erzwingen" #: custom/doctype/customize_form/customize_form.json msgctxt "Customize Form" msgid "Force Re-route to Default View" -msgstr "" +msgstr "Umleitung zur Standardansicht erzwingen" #. Label of a Check field in DocType 'DocType' #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Force Re-route to Default View" -msgstr "" +msgstr "Umleitung zur Standardansicht erzwingen" #. Label of a Check field in DocType 'Desktop Icon' #: desk/doctype/desktop_icon/desktop_icon.json @@ -12762,7 +12910,7 @@ msgstr "Anzeige erzwingen" #: core/doctype/rq_job/rq_job.js:13 msgid "Force Stop job" -msgstr "" +msgstr "Job stoppen erzwingen" #. Label of a Int field in DocType 'System Settings' #: core/doctype/system_settings/system_settings.json @@ -12774,7 +12922,7 @@ msgstr "Benutzer zum Zurücksetzen des Kennworts zwingen" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Force Web Capture Mode for Uploads" -msgstr "" +msgstr "Web-Capture-Modus für Uploads erzwingen" #: www/login.html:35 msgid "Forgot Password?" @@ -12818,13 +12966,13 @@ msgstr "Formular" #: custom/doctype/customize_form/customize_form.json msgctxt "Customize Form" msgid "Form Builder" -msgstr "" +msgstr "Formular-Generator" #. Label of a HTML field in DocType 'DocType' #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Form Builder" -msgstr "" +msgstr "Formular-Generator" #. Label of a Code field in DocType 'Recorder' #: core/doctype/recorder/recorder.json @@ -12933,7 +13081,7 @@ msgstr "Frappe-Framework" #: public/js/frappe/ui/theme_switcher.js:59 msgid "Frappe Light" -msgstr "" +msgstr "Frappe Hell" #. Label of a standard help item #. Type: Action @@ -13057,7 +13205,7 @@ msgstr "Vom Benutzer" #: public/js/frappe/utils/diffview.js:30 msgid "From version" -msgstr "" +msgstr "Von Version" #. Option for the 'Width' (Select) field in DocType 'Dashboard Chart Link' #: desk/doctype/dashboard_chart_link/dashboard_chart_link.json @@ -13126,7 +13274,7 @@ msgstr "Funktion basiert auf" #: __init__.py:835 msgid "Function {0} is not whitelisted." -msgstr "" +msgstr "Funktion {0} ist nicht freigegeben." #: public/js/frappe/views/treeview.js:402 msgid "Further nodes can be only created under 'Group' type nodes" @@ -13241,7 +13389,7 @@ msgstr "Alarme für heute" #: desk/page/backups/backups.js:19 msgid "Get Backup Encryption Key" -msgstr "" +msgstr "Backup-Verschlüsselungsschlüssel abrufen" #. Label of a Button field in DocType 'Auto Repeat' #: automation/doctype/auto_repeat/auto_repeat.json @@ -13259,7 +13407,7 @@ msgstr "Artikel aufrufen" #: integrations/doctype/connected_app/connected_app.js:6 msgid "Get OpenID Configuration" -msgstr "" +msgstr "OpenID-Konfiguration abrufen" #: www/printview.html:22 msgid "Get PDF" @@ -13270,14 +13418,14 @@ msgstr "PDF herunterladen" #: core/doctype/document_naming_settings/document_naming_settings.json msgctxt "Document Naming Settings" msgid "Get a preview of generated names with a series." -msgstr "" +msgstr "Erhalten Sie eine Vorschau der generierten Namen eines Nummernkreises." #. Description of the 'Email Threads on Assigned Document' (Check) field in #. DocType 'Notification Settings' #: desk/doctype/notification_settings/notification_settings.json msgctxt "Notification Settings" msgid "Get notified when an email is received on any of the documents assigned to you." -msgstr "" +msgstr "Benachrichtigen, wenn eine E-Mail auf einem der Ihnen zugewiesenen Dokumente empfangen wird." #. Description of the 'User Image' (Attach Image) field in DocType 'User' #: core/doctype/user/user.json @@ -13289,7 +13437,7 @@ msgstr "Allgemein wiedererkennbaren Avatar von Gravatar.com abrufen" #: core/doctype/installed_application/installed_application.json msgctxt "Installed Application" msgid "Git Branch" -msgstr "" +msgstr "Git-Zweig" #. Option for the 'Social Login Provider' (Select) field in DocType 'Social #. Login Key' @@ -13371,7 +13519,7 @@ msgstr "Gehe zum Dokument" #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "Go to this URL after completing the form" -msgstr "" +msgstr "Nach dem Ausfüllen des Formulars diese URL aufrufen" #: core/doctype/doctype/doctype.js:54 #: custom/doctype/client_script/client_script.js:10 @@ -13435,7 +13583,7 @@ msgstr "Google-Kalender" #: integrations/doctype/google_calendar/google_calendar.py:781 msgid "Google Calendar - Contact / email not found. Did not add attendee for -
    {0}" -msgstr "" +msgstr "Google Kalender - Kontakt / E-Mail nicht gefunden. Teilnehmer wurde nicht hinzugefügt für -
    {0}" #: integrations/doctype/google_calendar/google_calendar.py:251 msgid "Google Calendar - Could not create Calendar for {0}, error code {1}." @@ -13696,11 +13844,11 @@ msgstr "Gruppen-Knoten" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "Group Object Class" -msgstr "" +msgstr "Gruppenobjektklasse" #: public/js/frappe/ui/group_by/group_by.js:415 msgid "Grouped by {0}" -msgstr "" +msgstr "Gruppiert nach {0}" #. Option for the 'Method' (Select) field in DocType 'Recorder' #: core/doctype/recorder/recorder.json @@ -13865,7 +14013,7 @@ msgstr "Hat Domain" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Has Next Condition" -msgstr "" +msgstr "Hat nächste Bedingung" #. Name of a DocType #: core/doctype/has_role/has_role.json @@ -13932,13 +14080,13 @@ msgstr "Header, Robots" #: integrations/doctype/webhook/webhook.json msgctxt "Webhook" msgid "Headers" -msgstr "" +msgstr "Headers" #. Label of a Code field in DocType 'Webhook Request Log' #: integrations/doctype/webhook_request_log/webhook_request_log.json msgctxt "Webhook Request Log" msgid "Headers" -msgstr "" +msgstr "Headers" #: printing/page/print_format_builder/print_format_builder.js:602 msgid "Heading" @@ -14048,7 +14196,7 @@ msgstr "Hilfe zur Suche" #: desk/doctype/note/note.json msgctxt "Note" msgid "Help: To link to another record in the system, use \"/app/note/[Note Name]\" as the Link URL. (don't use \"http://\")" -msgstr "" +msgstr "Hilfe: Um einen Link zu einem anderen Datensatz im System zu erstellen, verwenden Sie \"/app/note/[Name der Notiz]\" als Link URL. (ohne \"http://\" und Domain)" #. Label of a Int field in DocType 'Help Article' #: website/doctype/help_article/help_article.json @@ -14222,13 +14370,13 @@ msgstr "Tage verstecken" #: core/doctype/user_permission/user_permission_list.js:96 msgid "Hide Descendants" -msgstr "" +msgstr "Nachkommen ausblenden" #. Label of a Check field in DocType 'User Permission' #: core/doctype/user_permission/user_permission.json msgctxt "User Permission" msgid "Hide Descendants" -msgstr "" +msgstr "Nachkommen ausblenden" #: www/error.html:41 www/error.html:56 msgid "Hide Error" @@ -14249,7 +14397,7 @@ msgstr "Vorschau verbergen" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Hide Previous, Next and Close button on highlight dialog." -msgstr "" +msgstr "Die Schaltflächen Zurück, Weiter und Schließen ausblenden." #: public/js/frappe/list/list_filter.js:87 msgid "Hide Saved" @@ -14277,7 +14425,7 @@ msgstr "Sekunden ausblenden" #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Hide Sidebar, Menu, and Comments" -msgstr "" +msgstr "Seitenleiste, Menü und Kommentare ausblenden" #. Label of a Check field in DocType 'Portal Settings' #: website/doctype/portal_settings/portal_settings.json @@ -14302,7 +14450,7 @@ msgstr "Arbeitsbereich ausblenden" #: core/doctype/user_permission/user_permission.json msgctxt "User Permission" msgid "Hide descendant records of For Value." -msgstr "" +msgstr "Untergeordnete Datensätze von Für Wert ausblenden." #: public/js/frappe/form/layout.js:260 msgid "Hide details" @@ -14466,7 +14614,7 @@ msgstr "ID (Name) der Einheit, deren Eigenschaft festgelegt werden muss" #: website/doctype/web_page_block/web_page_block.json msgctxt "Web Page Block" msgid "IDs must contain only alphanumeric characters, not contain spaces, and should be unique." -msgstr "" +msgstr "IDs dürfen nur alphanumerische Zeichen enthalten, keine Leerzeichen und sollten eindeutig sein." #. Label of a Section Break field in DocType 'Email Account' #: email/doctype/email_account/email_account.json @@ -14585,7 +14733,7 @@ msgstr "Identitätsdetails" #: desk/doctype/desktop_icon/desktop_icon.json msgctxt "Desktop Icon" msgid "Idx" -msgstr "" +msgstr "Pos" #. Description of the 'Apply Strict User Permissions' (Check) field in DocType #. 'System Settings' @@ -14623,7 +14771,7 @@ msgstr "Wenn aktiviert, werden alle anderen Workflows inaktiv." #: printing/doctype/print_format/print_format.json msgctxt "Print Format" msgid "If checked, negative numeric values of Currency, Quantity or Count would be shown as positive" -msgstr "" +msgstr "Wenn aktiviert, werden negative numerische Werte von Währung, Menge oder Anzahl als positiv angezeigt" #. Description of the 'Skip Authorization' (Check) field in DocType 'OAuth #. Client' @@ -14733,13 +14881,13 @@ msgstr "Wenn nicht gesetzt, hängt die Währungspräzision vom Zahlenformat ab" #: desk/doctype/dashboard_chart/dashboard_chart.json msgctxt "Dashboard Chart" msgid "If set, only user with these roles can access this chart. If not set, DocType or Report permissions will be used." -msgstr "" +msgstr "Wenn diese Option gesetzt ist, können nur Benutzer mit diesen Rollen auf dieses Diagramm zugreifen. Wenn nicht festgelegt, werden die Berechtigungen für den zugehörigen DocType oder Report verwendet." #. Description of the 'Condition' (Code) field in DocType 'Energy Point Rule' #: social/doctype/energy_point_rule/energy_point_rule.json msgctxt "Energy Point Rule" msgid "If the condition is satisfied user will be rewarded with the points. eg. doc.status == 'Closed'\n" -msgstr "" +msgstr "Wenn die Bedingung erfüllt ist, wird der Benutzer mit den Punkten belohnt. z.B. doc.status == 'Closed'\n" #. Description of the 'User Type' (Link) field in DocType 'User' #: core/doctype/user/user.json @@ -14752,21 +14900,21 @@ msgstr "Wenn der Benutzer eine Rolle geprüft hat, wird er ein \"System User\". #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" msgid "If unchecked, the value will always be re-fetched on save." -msgstr "" +msgstr "Wenn diese Option deaktiviert ist, wird der Wert beim Speichern immer erneut abgerufen." #. Description of the 'Fetch on Save if Empty' (Check) field in DocType #. 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "If unchecked, the value will always be re-fetched on save." -msgstr "" +msgstr "Wenn diese Option deaktiviert ist, wird der Wert beim Speichern immer erneut abgerufen." #. Description of the 'Fetch on Save if Empty' (Check) field in DocType #. 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "If unchecked, the value will always be re-fetched on save." -msgstr "" +msgstr "Wenn diese Option deaktiviert ist, wird der Wert beim Speichern immer erneut abgerufen." #. Label of a Check field in DocType 'Custom DocPerm' #: core/doctype/custom_docperm/custom_docperm.json @@ -14794,11 +14942,11 @@ msgstr "Wenn neue Datensätze hochgeladen werden, bitte die Spalte \"Bezeichnung #: utils/password.py:200 msgid "If you have recently restored the site you may need to copy the site config contaning original Encryption Key." -msgstr "" +msgstr "Falls Sie diese Instanz kürzlich wiederhergestellt haben, müssen Sie möglicherweise noch den Verschlüsselungsschlüssel des vorherigen Systems in die Site Config übernehmen." #: core/doctype/doctype/doctype.js:80 msgid "If you just want to customize for your site, use {0} instead." -msgstr "" +msgstr "Falls Sie nur für Ihre Instanz anpassen möchten, verwenden Sie stattdessen {0}." #. Description of the 'Parent Label' (Select) field in DocType 'Top Bar Item' #: website/doctype/top_bar_item/top_bar_item.json @@ -14997,7 +15145,7 @@ msgstr "Bilder" #: core/doctype/log_settings/log_settings.py:56 msgid "Implement `clear_old_logs` method to enable auto error clearing." -msgstr "" +msgstr "Implementieren Sie die Methode `clear_old_logs`, um die automatische Fehlerbereinigung zu aktivieren." #. Option for the 'Grant Type' (Select) field in DocType 'OAuth Client' #: integrations/doctype/oauth_client/oauth_client.json @@ -15137,7 +15285,7 @@ msgstr "In Tagen" #. Description of the Onboarding Step 'Setup Limited Access for a User' #: custom/onboarding_step/role_permissions/role_permissions.json msgid "In ERPNext, you can add your Employees as Users, and give them restricted access. Tools like Role Permission and User Permission allow you to define rules which give restricted access to the user to masters and transactions." -msgstr "" +msgstr "In ERPNext können Sie Ihre Mitarbeiter als Benutzer hinzufügen und ihnen eingeschränkten Zugriff gewähren. Mit Werkzeugen wie Rollenberechtigung und Benutzerberechtigung können Sie Regeln definieren, die dem Benutzer einen eingeschränkten Zugang zu Stammdaten und Transaktionen ermöglichen." #. Label of a Check field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json @@ -15248,7 +15396,7 @@ msgstr "Im Standard-Filter" #. Description of the Onboarding Step 'Generate Custom Reports' #: custom/onboarding_step/report_builder/report_builder.json msgid "In each module, you will find a host of single-click reports, ranging from financial statements to sales and purchase analytics and stock tracking reports. If a required new report is not available out-of-the-box, you can create custom reports in ERPNext by pulling values from the same multiple ERPNext tables.\n" -msgstr "" +msgstr "In jedem Modul finden Sie eine Vielzahl von Berichten, die Sie per Mausklick erstellen können – von Finanzberichten über Verkaufs- und Einkaufsanalysen bis hin zu Berichten zur Bestandsverfolgung. Wenn ein benötigter Bericht noch nicht angeboten wird, können Sie in ERPNext benutzerdefinierte Berichte erstellen, in denen Sie Werte aus denselben vielzähligen ERPNext-Tabellen abrufen.\n" #. Description of the 'Font Size' (Float) field in DocType 'Print Settings' #: printing/doctype/print_settings/print_settings.json @@ -15311,7 +15459,7 @@ msgstr "Dokument Web View Link per E-Mail senden" #: public/js/frappe/views/reports/query_report.js:1488 msgid "Include filters" -msgstr "" +msgstr "Filter einbeziehen" #: public/js/frappe/views/reports/query_report.js:1480 msgid "Include indentation" @@ -15325,25 +15473,25 @@ msgstr "Geben Sie Symbole, Zahlen und Großbuchstaben in das Passwort ein" #: email/doctype/email_account/email_account.json msgctxt "Email Account" msgid "Incoming (POP/IMAP) Settings" -msgstr "" +msgstr "Eingehende (POP/IMAP) Einstellungen" #. Label of a Data field in DocType 'Email Account' #: email/doctype/email_account/email_account.json msgctxt "Email Account" msgid "Incoming Server" -msgstr "" +msgstr "Eingehender Server" #. Label of a Data field in DocType 'Email Domain' #: email/doctype/email_domain/email_domain.json msgctxt "Email Domain" msgid "Incoming Server" -msgstr "" +msgstr "Eingehender Server" #. Label of a Section Break field in DocType 'Email Domain' #: email/doctype/email_domain/email_domain.json msgctxt "Email Domain" msgid "Incoming Settings" -msgstr "" +msgstr "Eingehende Einstellungen" #: email/doctype/email_domain/email_domain.py:32 msgid "Incoming email account not correct" @@ -15351,7 +15499,7 @@ msgstr "Falsches Konto für eingehende E-Mails" #: model/virtual_doctype.py:81 model/virtual_doctype.py:94 msgid "Incomplete Virtual Doctype Implementation" -msgstr "" +msgstr "Unvollständige Implementierung des virtuellen DocTypes" #: auth.py:236 msgid "Incomplete login details" @@ -15385,25 +15533,25 @@ msgstr "Falscher Wert: {0} muss {1} {2} sein" #: public/js/frappe/model/model.js:114 #: public/js/frappe/views/reports/report_view.js:941 msgid "Index" -msgstr "" +msgstr "Pos" #. Label of a Check field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" msgid "Index" -msgstr "" +msgstr "Pos" #. Label of a Check field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Index" -msgstr "" +msgstr "Pos" #. Label of a Int field in DocType 'Recorder Query' #: core/doctype/recorder_query/recorder_query.json msgctxt "Recorder Query" msgid "Index" -msgstr "" +msgstr "Pos" #. Label of a Check field in DocType 'DocType' #: core/doctype/doctype/doctype.json @@ -15520,7 +15668,7 @@ msgstr "Stil einfügen" #: public/js/frappe/ui/toolbar/search_utils.js:646 #: public/js/frappe/ui/toolbar/search_utils.js:647 msgid "Install {0} from Marketplace" -msgstr "" +msgstr "{0} aus Marketplace installieren" #. Name of a DocType #: core/doctype/installed_application/installed_application.json @@ -15560,7 +15708,7 @@ msgstr "Unzureichende Berechtigungen um Bericht zu bearbeiten" #: core/doctype/doctype/doctype.py:447 msgid "Insufficient attachment limit" -msgstr "" +msgstr "Unzureichende Begrenzung für Anhänge" #. Option for the 'Field Type' (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json @@ -15717,7 +15865,7 @@ msgstr "Ungültiger "abhängiger_on" -Ausdruck im Filter {0}" #: public/js/frappe/form/save.js:206 msgid "Invalid \"mandatory_depends_on\" expression" -msgstr "" +msgstr "Ungültiger Ausdruck in Bedingung für Pflichtfeld" #: utils/nestedset.py:181 msgid "Invalid Action" @@ -15793,7 +15941,7 @@ msgstr "Ungültige Option" #: email/smtp.py:102 msgid "Invalid Outgoing Mail Server or Port: {0}" -msgstr "" +msgstr "Ungültiger Postausgang Server oder Port: {0}" #: email/doctype/auto_email_report/auto_email_report.py:182 msgid "Invalid Output Format" @@ -15840,7 +15988,7 @@ msgstr "Ungültiger Benutzername oder fehlendes Passwort. Bitte Angaben korrigie #: integrations/doctype/webhook/webhook.py:116 msgid "Invalid Webhook Secret" -msgstr "" +msgstr "Ungültiges Webhook Geheimnis" #: desk/reportview.py:150 msgid "Invalid aggregate function" @@ -15889,7 +16037,7 @@ msgstr "Ungültiger JSON in den benutzerdefinierten Optionen hinzugefügt: {0}" #: model/naming.py:445 msgid "Invalid name type (integer) for varchar name column" -msgstr "" +msgstr "Ungültiger Namenstyp (Ganzzahl) für die Varchar-Namensspalte" #: model/naming.py:52 msgid "Invalid naming series {}: dot (.) missing" @@ -15901,11 +16049,11 @@ msgstr "Ungültiger oder beschädigter Inhalt für den Import" #: website/doctype/website_settings/website_settings.py:139 msgid "Invalid redirect regex in row #{}: {}" -msgstr "" +msgstr "Ungültige Weiterleitungs-Regex in Zeile #{}: {}" #: app.py:301 msgid "Invalid request arguments" -msgstr "" +msgstr "Ungültige Anfrageargumente" #: integrations/doctype/connected_app/connected_app.py:172 msgid "Invalid state." @@ -16413,49 +16561,49 @@ msgstr "Jinja" #: core/doctype/prepared_report/prepared_report.json msgctxt "Prepared Report" msgid "Job ID" -msgstr "" +msgstr "Job-ID" #. Label of a Data field in DocType 'RQ Job' #: core/doctype/rq_job/rq_job.json msgctxt "RQ Job" msgid "Job ID" -msgstr "" +msgstr "Job-ID" #. Label of a Link field in DocType 'Submission Queue' #: core/doctype/submission_queue/submission_queue.json msgctxt "Submission Queue" msgid "Job Id" -msgstr "" +msgstr "Job Id" #. Label of a Section Break field in DocType 'RQ Job' #: core/doctype/rq_job/rq_job.json msgctxt "RQ Job" msgid "Job Info" -msgstr "" +msgstr "Jobinfo" #. Label of a Data field in DocType 'RQ Job' #: core/doctype/rq_job/rq_job.json msgctxt "RQ Job" msgid "Job Name" -msgstr "" +msgstr "Jobname" #. Label of a Section Break field in DocType 'RQ Job' #: core/doctype/rq_job/rq_job.json msgctxt "RQ Job" msgid "Job Status" -msgstr "" +msgstr "Jobstatus" #: core/doctype/rq_job/rq_job.js:24 msgid "Job Stopped Successfully" -msgstr "" +msgstr "Job erfolgreich beendet" #: core/doctype/rq_job/rq_job.py:122 msgid "Job is not running." -msgstr "" +msgstr "Job läuft nicht." #: desk/doctype/event/event.js:51 msgid "Join video conference with {0}" -msgstr "" +msgstr "Videokonferenz mit {0} beitreten" #: public/js/frappe/form/toolbar.js:355 public/js/frappe/form/toolbar.js:757 msgid "Jump to field" @@ -16562,7 +16710,7 @@ msgstr "Tastatürkürzel" #: public/js/frappe/utils/number_systems.js:37 msgctxt "Number system" msgid "Kh" -msgstr "" +msgstr "Kh" #. Label of a Card Break in the Website Workspace #: website/doctype/help_article/help_article.py:80 @@ -16584,13 +16732,13 @@ msgstr "Wissensdatenbank Bearbeiter/-in" #: public/js/frappe/utils/number_systems.js:49 msgctxt "Number system" msgid "L" -msgstr "" +msgstr "L" #. Label of a Section Break field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "LDAP Auth" -msgstr "" +msgstr "LDAP-Authentifizierung" #. Label of a Section Break field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json @@ -16638,7 +16786,7 @@ msgstr "LDAP-Gruppenzuordnungen" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "LDAP Group Member attribute" -msgstr "" +msgstr "LDAP-Gruppenmitgliedsattribut" #. Label of a Data field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json @@ -16656,7 +16804,7 @@ msgstr "LDAP Middle Name-Feld" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "LDAP Mobile Field" -msgstr "" +msgstr "LDAP-Mobilfunkfeld" #: integrations/doctype/ldap_settings/ldap_settings.py:160 msgid "LDAP Not Installed" @@ -16676,13 +16824,13 @@ msgstr "LDAP Suchstring" #: integrations/doctype/ldap_settings/ldap_settings.py:127 msgid "LDAP Search String must be enclosed in '()' and needs to contian the user placeholder {0}, eg sAMAccountName={0}" -msgstr "" +msgstr "Der LDAP-Suchstring muss in '()' eingeschlossen sein und den Benutzerplatzhalter {0} enthalten, z.B. sAMAccountName={0}" #. Label of a Section Break field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "LDAP Search and Paths" -msgstr "" +msgstr "LDAP-Suche und Pfade" #. Label of a Section Break field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json @@ -17072,11 +17220,11 @@ msgstr "Zuletzt synchronisiert {0}" #: custom/doctype/customize_form/customize_form.js:186 msgid "Layout Reset" -msgstr "" +msgstr "Layout zurücksetzen" #: custom/doctype/customize_form/customize_form.js:178 msgid "Layout will be reset to standard layout, are you sure you want to do this?" -msgstr "" +msgstr "Das Layout wird auf das Standardlayout zurückgesetzt. Sind Sie sicher, dass Sie dies tun möchten?" #: desk/page/leaderboard/leaderboard.js:15 msgid "Leaderboard" @@ -17085,7 +17233,7 @@ msgstr "Bestenliste" #. Label of an action in the Onboarding Step 'Customize Print Formats' #: custom/onboarding_step/print_format/print_format.json msgid "Learn about Standard and Custom Print Formats" -msgstr "" +msgstr "Erfahren Sie mehr über Standard- und benutzerdefinierte Druckformate" #. Title of an Onboarding Step #: website/onboarding_step/web_page_tour/web_page_tour.json @@ -17104,7 +17252,7 @@ msgstr "Mehr erfahren" #. Label of an action in the Onboarding Step 'Generate Custom Reports' #: custom/onboarding_step/report_builder/report_builder.json msgid "Learn more about Report Builders" -msgstr "" +msgstr "Erfahren Sie mehr über Berichterstellungswerkzeuge" #. Label of an action in the Onboarding Step 'Custom Document Types' #: custom/onboarding_step/custom_doctype/custom_doctype.json @@ -17596,17 +17744,17 @@ msgstr "Link zu" #: desk/doctype/workspace_link/workspace_link.json msgctxt "Workspace Link" msgid "Link Type" -msgstr "" +msgstr "Linktyp" #: website/doctype/about_us_settings/about_us_settings.js:6 msgid "Link for About Us Page is \"/about\"." -msgstr "" +msgstr "Der Link zur Seite „Über uns“ lautet „/about“." #. Description of the 'Home Page' (Data) field in DocType 'Website Settings' #: website/doctype/website_settings/website_settings.json msgctxt "Website Settings" msgid "Link that is the website home page. Standard Links (home, login, products, blog, about, contact)" -msgstr "" +msgstr "Pfad, der als Startseite verwendet werden soll. Standardpfade: home, login, products, blog, about, contact" #. Description of the 'URL' (Data) field in DocType 'Top Bar Item' #: website/doctype/top_bar_item/top_bar_item.json @@ -17694,13 +17842,13 @@ msgstr "Liste" #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "List / Search Settings" -msgstr "" +msgstr "Listen-/Sucheinstellungen" #. Label of a Table field in DocType 'Web Form' #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "List Columns" -msgstr "" +msgstr "Listenspalten" #. Name of a DocType #: desk/doctype/list_filter/list_filter.json @@ -17759,7 +17907,7 @@ msgstr "Liste als [{ \"label\": _ ( \"Jobs\"), \"route\": \"jobs\"}]" #: public/js/frappe/ui/toolbar/search_utils.js:526 msgid "Lists" -msgstr "" +msgstr "Listen" #. Option for the 'Rule' (Select) field in DocType 'Assignment Rule' #: automation/doctype/assignment_rule/assignment_rule.json @@ -17825,7 +17973,7 @@ msgstr "Anmelden bei {0}" #: core/doctype/data_import_log/data_import_log.json msgctxt "Data Import Log" msgid "Log Index" -msgstr "" +msgstr "Protokollindex" #. Name of a DocType #: core/doctype/log_setting_user/log_setting_user.json @@ -17928,7 +18076,7 @@ msgstr "Anmelden und im Browser anzeigen" #: website/doctype/web_form/web_form.js:358 msgid "Login is required to see web form list view. Enable {0} to see list settings" -msgstr "" +msgstr "Um die Listenansicht des Webformulars zu sehen, ist eine Anmeldung erforderlich. Aktivieren Sie {0}, um die Listeneinstellungen zu sehen" #: auth.py:322 auth.py:325 msgid "Login not allowed at this time" @@ -17968,7 +18116,7 @@ msgstr "Mit E-Mail-Link anmelden" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Login with email link expiry (in minutes)" -msgstr "" +msgstr "Gültigkeitsdauer des E-Mail-Links (in Minuten)" #: auth.py:131 msgid "Login with username and password is not allowed." @@ -18048,7 +18196,7 @@ msgstr "Sieht so aus, als hätten Sie den Wert nicht geändert" #: www/third_party_apps.html:57 msgid "Looks like you haven’t added any third party apps." -msgstr "" +msgstr "Wie es aussieht haben Sie keine Drittanbieter-Apps hinzugefügt." #: public/js/frappe/form/sidebar/assign_to.js:190 msgid "Low" @@ -18128,7 +18276,7 @@ msgstr " Anhänge im Standard als öffentlich markieren" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Make sure to configure a Social Login Key before disabling to prevent lockout" -msgstr "" +msgstr "Stellen Sie sicher, dass Sie vor der Deaktivierung einen Social Login Key konfigurieren, um eine Sperre zu verhindern" #: utils/password_strength.py:94 msgid "Make use of longer keyboard patterns" @@ -18148,7 +18296,7 @@ msgstr "Drittanbieter-Anwendungen verwalten" #: www/me.html:59 msgid "Manage your apps" -msgstr "" +msgstr "Verwalten Sie Ihre Apps" #. Label of a Check field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json @@ -18184,25 +18332,25 @@ msgstr "Zwingend notwendig" #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" msgid "Mandatory Depends On" -msgstr "Obligatorisch Hängt von ab" +msgstr "Bedingung für Pflichtfeld" #. Label of a Code field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "Mandatory Depends On" -msgstr "Obligatorisch Hängt von ab" +msgstr "Bedingung für Pflichtfeld" #. Label of a Code field in DocType 'Web Form Field' #: website/doctype/web_form_field/web_form_field.json msgctxt "Web Form Field" msgid "Mandatory Depends On" -msgstr "Obligatorisch Hängt von ab" +msgstr "Bedingung für Pflichtfeld" #. Label of a Code field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Mandatory Depends On (JS)" -msgstr "" +msgstr "Bedingung für Pflichtfeld (JS)" #: website/doctype/web_form/web_form.py:412 msgid "Mandatory Information missing:" @@ -18227,7 +18375,7 @@ msgstr "Für {0} benötigte Pflichtfelder:" #: public/js/frappe/web_form/web_form.js:234 msgctxt "Error message in web form" msgid "Mandatory fields required:" -msgstr "" +msgstr "Pflichtfelder erforderlich:" #: core/doctype/data_export/exporter.py:142 msgid "Mandatory:" @@ -18407,7 +18555,7 @@ msgstr "Maximaler Wert" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Max auto email report per user" -msgstr "" +msgstr "Höchstzahl automatischer E-Mail-Berichte pro Benutzer" #: core/doctype/doctype/doctype.py:1293 msgid "Max width for type Currency is 100px in row {0}" @@ -18421,7 +18569,7 @@ msgstr "Maximal" #: core/doctype/file/file.py:317 msgid "Maximum Attachment Limit of {0} has been reached for {1} {2}." -msgstr "" +msgstr "Die Höchstgrenze für Anhänge von {0} wurde für {1} {2} erreicht." #. Label of a Select field in DocType 'List View Settings' #: desk/doctype/list_view_settings/list_view_settings.json @@ -18437,7 +18585,7 @@ msgstr "Maximale Punkte" #: public/js/frappe/form/sidebar/attachments.js:38 msgid "Maximum attachment limit of {0} has been reached." -msgstr "" +msgstr "Die Höchstgrenze für Anhänge von {0} wurde erreicht." #. Description of the 'Maximum Points' (Int) field in DocType 'Energy Point #. Rule' @@ -18445,7 +18593,8 @@ msgstr "" msgctxt "Energy Point Rule" msgid "Maximum points allowed after multiplying points with the multiplier value\n" "(Note: For no limit leave this field empty or set 0)" -msgstr "" +msgstr "Maximal erlaubte Punkte nach Multiplikation mit dem Multiplikatorwert\n" +"(Hinweis: Für kein Limit lassen Sie dieses Feld leer oder setzen Sie es auf 0)" #: model/rename_doc.py:675 msgid "Maximum {0} rows allowed" @@ -18489,7 +18638,7 @@ msgstr "Treffen" #: integrations/doctype/webhook/webhook.json msgctxt "Webhook" msgid "Meets Condition?" -msgstr "" +msgstr "Bedingungen erfüllen?" #. Group in Email Group's connections #: email/doctype/email_group/email_group.json @@ -18670,7 +18819,7 @@ msgstr "Nachrichten ID" #: core/doctype/data_import_log/data_import_log.json msgctxt "Data Import Log" msgid "Messages" -msgstr "" +msgstr "Nachrichten" #. Label of a Section Break field in DocType 'Web Form' #: website/doctype/web_form/web_form.json @@ -18868,7 +19017,7 @@ msgstr "Nicht ausgefüllte Felder" #: email/doctype/auto_email_report/auto_email_report.py:123 msgid "Missing Filters Required" -msgstr "" +msgstr "Fehlende Filter erforderlich" #: desk/form/assign_to.py:105 msgid "Missing Permission" @@ -18910,7 +19059,7 @@ msgstr "Mobilfunknummer" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Modal Trigger" -msgstr "" +msgstr "Modal-Auslöser" #. Label of a Card Break in the Build Workspace #: core/workspace/build/build.json @@ -19085,7 +19234,7 @@ msgstr "Modul-Def" #: core/doctype/module_profile/module_profile.json msgctxt "Module Profile" msgid "Module HTML" -msgstr "" +msgstr "Modul HTML" #. Label of a Data field in DocType 'Desktop Icon' #: desk/doctype/desktop_icon/desktop_icon.json @@ -19135,7 +19284,7 @@ msgstr "Modulprofil Name" #: desk/doctype/module_onboarding/module_onboarding.py:68 msgid "Module onboarding progress reset" -msgstr "" +msgstr "Modul Onboarding-Fortschritt zurücksetzen" #: custom/doctype/customize_form/customize_form.js:208 msgid "Module to Export" @@ -19327,7 +19476,7 @@ msgstr "Am Meisten verwendet" #: utils/password.py:65 msgid "Most probably your password is too long." -msgstr "" +msgstr "Wahrscheinlich ist Ihr Passwort zu lang." #: core/doctype/communication/communication.js:86 #: core/doctype/communication/communication.js:194 @@ -19345,19 +19494,19 @@ msgstr "In den Papierkorb verschieben" #: public/js/frappe/form/form.js:176 msgid "Move cursor to above row" -msgstr "" +msgstr "Cursor zur Zeile darüber bewegen" #: public/js/frappe/form/form.js:180 msgid "Move cursor to below row" -msgstr "" +msgstr "Cursor zur Zeile darunter bewegen" #: public/js/frappe/form/form.js:184 msgid "Move cursor to next column" -msgstr "" +msgstr "Cursor zur nächsten Spalte bewegen" #: public/js/frappe/form/form.js:188 msgid "Move cursor to previous column" -msgstr "" +msgstr "Cursor zur vorherigen Spalte bewegen" #: public/js/frappe/form/grid_row.js:165 msgid "Move to Row Number" @@ -19367,14 +19516,14 @@ msgstr "Gehe zu Zeilennummer" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Move to next step when clicked inside highlighted area." -msgstr "" +msgstr "Zum nächsten Schritt bewegen, wenn innerhalb des markierten Bereichs geklickt wird." #. Description of the 'Parent Element Selector' (Data) field in DocType 'Form #. Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Mozilla doesn't support :has() so you can pass parent selector here as workaround" -msgstr "" +msgstr "Mozilla unterstützt :has() nicht, daher können Sie hier den übergeordneten Selektor als Workaround übergeben" #: utils/nestedset.py:334 msgid "Multiple root nodes not allowed." @@ -19398,7 +19547,7 @@ msgstr "Muss eine öffentlich zugängliche Google Sheets-URL sein" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "Must be enclosed in '()' and include '{0}', which is a placeholder for the user/login name. i.e. (&(objectclass=user)(uid={0}))" -msgstr "" +msgstr "Muss in '()' eingeschlossen sein und '{0}' enthalten, was ein Platzhalter für den Benutzer-/Loginnamen ist. d.h. (&(objectclass=user)(uid={0}))" #. Description of the 'Image Field' (Data) field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -19453,14 +19602,14 @@ msgstr "MyISAM" #: workflow/doctype/workflow/workflow.js:19 msgid "NOTE: If you add states or transitions in the table, it will be reflected in the Workflow Builder but you will have to position them manually. Also Workflow Builder is currently in BETA." -msgstr "" +msgstr "HINWEIS: Wenn Sie in der Tabelle Zustände oder Übergänge hinzufügen, wird dies im Workflow Builder berücksichtigt, aber Sie müssen sie manuell positionieren. Außerdem befindet sich Workflow Builder derzeit noch in der BETA-Phase." #. Description of the 'LDAP Group Field' (Data) field in DocType 'LDAP #. Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "NOTE: This box is due for depreciation. Please re-setup LDAP to work with the newer settings" -msgstr "" +msgstr "HINWEIS: Dieses Feld ist veraltet. Bitte richten Sie LDAP neu ein, um mit den neueren Einstellungen zu arbeiten" #: public/js/frappe/form/layout.js:75 #: public/js/frappe/form/multi_select_dialog.js:239 @@ -19468,31 +19617,31 @@ msgstr "" #: public/js/frappe/views/file/file_view.js:97 #: website/doctype/website_slideshow/website_slideshow.js:25 msgid "Name" -msgstr "" +msgstr "Name" #. Label of a Data field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "Name" -msgstr "" +msgstr "Name" #. Label of a Data field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Name" -msgstr "" +msgstr "Name" #. Label of a Data field in DocType 'Slack Webhook URL' #: integrations/doctype/slack_webhook_url/slack_webhook_url.json msgctxt "Slack Webhook URL" msgid "Name" -msgstr "" +msgstr "Name" #. Label of a Data field in DocType 'Workspace' #: desk/doctype/workspace/workspace.json msgctxt "Workspace" msgid "Name" -msgstr "" +msgstr "Name" #: desk/utils.py:22 msgid "Name already taken, please set a new name" @@ -19542,7 +19691,9 @@ msgctxt "DocType" msgid "Naming Options:\n" "
    1. field:[fieldname] - By Field
    2. autoincrement - Uses Databases' Auto Increment feature
    3. naming_series: - By Naming Series (field called naming_series must be present)
    4. Prompt - Prompt user for a name
    5. [series] - Series by prefix (separated by a dot); for example PRE.#####
    6. \n" "
    7. format:EXAMPLE-{MM}morewords{fieldname1}-{fieldname2}-{#####} - Replace all braced words (fieldnames, date words (DD, MM, YY), series) with their value. Outside braces, any characters can be used.
    " -msgstr "" +msgstr "Benennungsoptionen:\n" +"
    1. field:[fieldname] - Nach Feld
    2. autoincrement - Verwendet die Funktion Auto Increment der Datenbanken
    3. naming_series: - Nach Nummernkreis (ein Feld namens naming_series muss vorhanden sein)
    4. Prompt - Fragt den Benutzer nach einem Namen
    5. [series] - Zähler nach Präfix (durch einen Punkt getrennt); zum Beispiel PRE.#####
    6. \n" +"
    7. format:EXAMPLE-{MM}morewords{fieldname1}-{fieldname2}-{#####} - Ersetzt alle Wörter in geschweiften Klammern (Feldnamen, Datumskürzel (DD, MM, YY), Zähler) durch ihren Wert. Außerhalb der geschweiften Klammern können beliebige Zeichen verwendet werden.
    " #. Description of the 'Auto Name' (Data) field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -19550,7 +19701,9 @@ msgctxt "Customize Form" msgid "Naming Options:\n" "
    1. field:[fieldname] - By Field
    2. naming_series: - By Naming Series (field called naming_series must be present)
    3. Prompt - Prompt user for a name
    4. [series] - Series by prefix (separated by a dot); for example PRE.#####
    5. \n" "
    6. format:EXAMPLE-{MM}morewords{fieldname1}-{fieldname2}-{#####} - Replace all braced words (fieldnames, date words (DD, MM, YY), series) with their value. Outside braces, any characters can be used.
    " -msgstr "" +msgstr "Benennungsoptionen:\n" +"
    1. field:[fieldname] - Nach Feld
    2. naming_series: - Nach Nummernkreis (ein Feld namens naming_series muss vorhanden sein)
    3. Prompt - Aufforderung zur Eingabe eines Namens
    4. [series] - Zähler nach Präfix (durch einen Punkt getrennt); zum Beispiel PRE.#####
    5. \n" +"
    6. format:EXAMPLE-{MM}morewords{fieldname1}-{fieldname2}-{#####} - Ersetzt alle Wörter in geschweiften Klammern (Feldnamen, Datumskürzel (DD, MM, YY), Zähler) durch ihren Wert. Außerhalb der geschweiften Klammern können beliebige Zeichen verwendet werden.
    " #. Label of a Select field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -19642,11 +19795,11 @@ msgstr "Navigationseinstellungen" #: desk/doctype/workspace/workspace.py:297 msgid "Need Workspace Manager role to edit private workspace of other users" -msgstr "" +msgstr "Sie benötigen die Rolle des Workspace Managers, um den privaten Arbeitsbereich anderer Benutzer zu bearbeiten" #: desk/doctype/workspace/workspace.py:343 msgid "Need Workspace Manager role to hide/unhide public workspaces" -msgstr "" +msgstr "Benötigen Sie die Rolle des Workspace Managers, um öffentliche Arbeitsbereiche ein- und auszublenden" #: model/document.py:607 msgid "Negative Value" @@ -19704,7 +19857,7 @@ msgstr "Neues benutzerdefiniertes Druckformat" #: desk/doctype/form_tour/form_tour.json msgctxt "Form Tour" msgid "New Document Form" -msgstr "" +msgstr "Neues Dokumentenformular" #: desk/doctype/notification_log/notification_log.py:158 msgid "New Document Shared {0}" @@ -19792,7 +19945,7 @@ msgstr "Neue Updates sind verfügbar" #: website/doctype/website_settings/website_settings.json msgctxt "Website Settings" msgid "New users will have to be manually registered by system managers." -msgstr "" +msgstr "Neue Benutzer müssen von den Systemmanagern manuell angelegt werden." #. Description of the 'Set Value' (Small Text) field in DocType 'Property #. Setter' @@ -19836,7 +19989,7 @@ msgstr "Neue {} Versionen für die folgenden Apps sind verfügbar" #: core/doctype/user/user.py:764 msgid "Newly created user {0} has no roles enabled." -msgstr "" +msgstr "Der neu erstellte Benutzer {0} hat keine aktivierten Rollen." #. Label of a Card Break in the Tools Workspace #. Name of a DocType @@ -19919,7 +20072,7 @@ msgstr "Nächste Ausführung" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Next Form Tour" -msgstr "" +msgstr "Nächste Formular-Tour" #. Label of a Date field in DocType 'Auto Repeat' #: automation/doctype/auto_repeat/auto_repeat.json @@ -19937,7 +20090,7 @@ msgstr "Nächster Status" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Next Step Condition" -msgstr "" +msgstr "Bedingung für den nächsten Schritt" #. Label of a Password field in DocType 'Google Calendar' #: integrations/doctype/google_calendar/google_calendar.json @@ -19955,7 +20108,7 @@ msgstr "Nächstes Sync-Token" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Next on Click" -msgstr "" +msgstr "Weiter bei Klick" #: integrations/doctype/webhook/webhook.py:137 #: public/js/form_builder/utils.js:341 @@ -20511,7 +20664,7 @@ msgstr "Hinweis: Wenn Sie den Seitennamen ändern, wird die vorherige URL auf di #: core/doctype/user/user.js:25 msgid "Note: Etc timezones have their signs reversed." -msgstr "" +msgstr "Hinweis: Bei \"Etc\"-Zeitzonen sind die Vorzeichen umgekehrt." #. Description of the 'sb0' (Section Break) field in DocType 'Website #. Slideshow' @@ -20529,7 +20682,7 @@ msgstr "Hinweis: Mehrere Sitzungen wird im Falle einer mobilen Gerät erlaubt se #: website/web_form/request_to_delete_data/request_to_delete_data.js:8 msgid "Note: Your request for account deletion will be fulfilled within {0} hours." -msgstr "" +msgstr "Hinweis: Ihr Antrag auf Kontolöschung wird innerhalb von {0} Stunden bearbeitet." #: core/doctype/data_export/exporter.py:183 msgid "Notes:" @@ -20757,7 +20910,7 @@ msgstr "Anzahl der Abfragen" #: core/doctype/doctype/doctype.py:444 public/js/frappe/doctype/index.js:59 msgid "Number of attachment fields are more than {}, limit updated to {}." -msgstr "" +msgstr "Anzahl der Anhangsfelder ist größer als {}, Limit auf {} aktualisiert." #: core/doctype/system_settings/system_settings.py:152 msgid "Number of backups must be greater than zero." @@ -20870,7 +21023,7 @@ msgstr "Name des OTP-Emittenten" #: twofactor.py:468 msgid "OTP Secret Reset - {0}" -msgstr "" +msgstr "OTP Geheimnis zurücksetzen - {0}" #: twofactor.py:487 msgid "OTP Secret has been reset. Re-registration will be required on next login." @@ -20972,11 +21125,11 @@ msgstr "Onboarding-Schritt" #. Name of a DocType #: desk/doctype/onboarding_step_map/onboarding_step_map.json msgid "Onboarding Step Map" -msgstr "" +msgstr "Onboarding-Schritt Zuordnung" #: public/js/frappe/widgets/onboarding_widget.js:269 msgid "Onboarding complete" -msgstr "" +msgstr "Onboarding abgeschlossen" #: core/doctype/doctype/doctype_list.js:28 msgid "Once submitted, submittable documents cannot be changed. They can only be Cancelled and Amended." @@ -21002,7 +21155,7 @@ msgstr "Einer von" #: public/js/frappe/views/workspace/workspace.js:1312 msgid "One of the child page with name {0} already exist in {1} Section. Please update the name of the child page first before moving" -msgstr "" +msgstr "Eine untergeordnete Seiten mit dem Namen {0} existiert bereits im Bereich {1}. Bitte aktualisieren Sie zuerst den Namen der untergeordneten Seite, bevor Sie sie verschieben." #: client.py:213 msgid "Only 200 inserts allowed in one request" @@ -21042,22 +21195,22 @@ msgstr "Nur Send Records aktualisiert in den letzten X Stunden" #: desk/doctype/workspace/workspace.js:36 msgid "Only Workspace Manager can edit public workspaces" -msgstr "" +msgstr "Nur der Workspace Manager kann öffentliche Arbeitsbereiche bearbeiten" #: public/js/frappe/views/workspace/workspace.js:536 msgid "Only Workspace Manager can sort or edit this page" -msgstr "" +msgstr "Nur der Workspace-Manager kann diese Seite sortieren oder bearbeiten" #: modules/utils.py:66 msgid "Only allowed to export customizations in developer mode" -msgstr "" +msgstr "Anpassungen können nur im Entwicklermodus exportiert werden" #. Description of the 'Endpoint URL' (Data) field in DocType 'S3 Backup #. Settings' #: integrations/doctype/s3_backup_settings/s3_backup_settings.json msgctxt "S3 Backup Settings" msgid "Only change this if you want to use other S3 compatible object storage backends." -msgstr "" +msgstr "Ändern Sie dies nur, wenn Sie andere S3-kompatible Objektspeicher-Backends verwenden möchten." #. Label of a Link field in DocType 'Workspace Link' #: desk/doctype/workspace_link/workspace_link.json @@ -21076,11 +21229,11 @@ msgstr "Es kann nur eine {0} als primäre festgelegt werden." #: desk/reportview.py:319 msgid "Only reports of type Report Builder can be deleted" -msgstr "" +msgstr "Nur Berichte aus dem Berichterstellungswerkzeug können gelöscht werden" #: desk/reportview.py:290 msgid "Only reports of type Report Builder can be edited" -msgstr "" +msgstr "Nur Berichte aus dem Berichterstellungswerkzeug können bearbeitet werden" #: custom/doctype/customize_form/customize_form.py:124 msgid "Only standard DocTypes are allowed to be customized from Customize Form." @@ -21096,7 +21249,7 @@ msgstr "Es werden nur Benutzer aufgelistet, die an dem Dokument beteiligt sind" #: email/doctype/auto_email_report/auto_email_report.py:100 msgid "Only {0} emailed reports are allowed per user." -msgstr "" +msgstr "Pro Benutzer sind nur {0} per E-Mail versandte Berichte erlaubt." #: core/doctype/deleted_document/deleted_document.js:7 msgid "Open" @@ -21207,7 +21360,7 @@ msgstr "{0} öffnen" #: integrations/doctype/connected_app/connected_app.json msgctxt "Connected App" msgid "OpenID Configuration" -msgstr "" +msgstr "OpenID-Konfiguration" #. Option for the 'Directory Server' (Select) field in DocType 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json @@ -21321,7 +21474,7 @@ msgstr "Hilfe zu Optionen" #: core/doctype/doctype/doctype.py:1601 msgid "Options for Rating field can range from 3 to 10" -msgstr "" +msgstr "Optionen für Bewertungsfeld können zwischen 3 und 10 liegen" #: custom/doctype/custom_field/custom_field.js:96 msgid "Options for select. Each option on a new line." @@ -21333,7 +21486,7 @@ msgstr "Optionen für {0} müssen festgelegt werden, bevor der Standardwert fest #: public/js/form_builder/store.js:177 msgid "Options is required for field {0} of type {1}" -msgstr "" +msgstr "Optionen sind erforderlich für Feld {0} des Typs {1}" #: model/base_document.py:767 msgid "Options not set for link field {0}" @@ -21635,7 +21788,7 @@ msgstr "Seitenumbruch" #: website/doctype/web_page/web_page.json msgctxt "Web Page" msgid "Page Builder" -msgstr "" +msgstr "Seitengenerator" #. Label of a Table field in DocType 'Web Page' #: website/doctype/web_page/web_page.json @@ -21760,7 +21913,7 @@ msgstr "Übergeordneter DocType wird benötigt, um Zahlenkarte zu erstellen" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Parent Element Selector" -msgstr "" +msgstr "Selektor für übergeordnetes Element" #. Label of a Select field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json @@ -21804,7 +21957,7 @@ msgstr "Übergeordnete Tabelle" #: desk/doctype/dashboard_chart/dashboard_chart.py:404 msgid "Parent document type is required to create a dashboard chart" -msgstr "" +msgstr "Übergeordneter Dokumententyp wird benötigt, um ein Dashboard-Diagramm zu erstellen" #: core/doctype/data_export/exporter.py:255 msgid "Parent is the name of the document to which the data will get added to." @@ -21812,7 +21965,7 @@ msgstr "Parent ist der Name des Dokuments, zu dem die Daten hinzugefügt werden. #: permissions.py:806 msgid "Parentfield not specified in {0}: {1}" -msgstr "" +msgstr "Das übergeordnete Feld wurde in {0}: {1} nicht angegeben" #: client.py:476 msgid "Parenttype, Parent and Parentfield are required to insert a child record" @@ -21986,7 +22139,7 @@ msgstr "Korrektur-Protokoll" #: modules/patch_handler.py:137 msgid "Patch type {} not found in patches.txt" -msgstr "" +msgstr "Patch-Typ {} nicht in patches.txt gefunden" #: website/report/website_analytics/website_analytics.js:35 msgid "Path" @@ -22038,7 +22191,7 @@ msgstr "Pfad zur privaten Schlüsseldatei" #: core/doctype/data_import/data_import.json msgctxt "Data Import" msgid "Payload Count" -msgstr "" +msgstr "Nutzlast Anzahl" #. Option for the 'Status' (Select) field in DocType 'Data Import' #: core/doctype/data_import/data_import.json @@ -22406,11 +22559,11 @@ msgstr "Bitte zuerst eine Datei anhängen." #: printing/doctype/letter_head/letter_head.py:73 msgid "Please attach an image file to set HTML for Footer." -msgstr "" +msgstr "Bitte fügen Sie eine Bilddatei an, um HTML für die Fußzeile festzulegen." #: printing/doctype/letter_head/letter_head.py:61 msgid "Please attach an image file to set HTML for Letter Head." -msgstr "" +msgstr "Bitte fügen Sie eine Bilddatei an, um HTML für den Briefkopf festzulegen." #: core/doctype/package_import/package_import.py:38 msgid "Please attach the package" @@ -22418,7 +22571,7 @@ msgstr "Bitte das Paket anhängen" #: integrations/doctype/connected_app/connected_app.js:19 msgid "Please check OpenID Configuration URL" -msgstr "" +msgstr "Bitte überprüfen Sie die OpenID-Konfigurations-URL" #: utils/dashboard.py:58 msgid "Please check the filter values set for Dashboard Chart: {}" @@ -22442,7 +22595,7 @@ msgstr "Bitte überprüfen Sie Ihren Posteingang auf weitere Instruktionen.\\nLa #: twofactor.py:291 msgid "Please click on the following link and follow the instructions on the page. {0}" -msgstr "" +msgstr "Bitte klicken Sie auf den folgenden Link und folgen Sie den Anweisungen auf der Seite. {0}" #: templates/emails/password_reset.html:2 msgid "Please click on the following link to set your new password" @@ -22458,7 +22611,7 @@ msgstr "Bitte bestätigen Sie Ihre Aktion für {0} dieses Dokument." #: core/doctype/server_script/server_script.js:33 msgid "Please contact your system administrator to enable this feature." -msgstr "" +msgstr "Bitte kontaktieren Sie Ihren Systemadministrator, um diese Funktion zu aktivieren." #: desk/doctype/number_card/number_card.js:44 msgid "Please create Card first" @@ -22470,7 +22623,7 @@ msgstr "Bitte erstellen Sie zuerst ein Diagramm" #: desk/form/meta.py:209 msgid "Please delete the field from {0} or add the required doctype." -msgstr "" +msgstr "Bitte löschen Sie das Feld von {0} oder fügen Sie den erforderlichen DocType hinzu." #: core/doctype/data_export/exporter.py:184 msgid "Please do not change the template headings." @@ -22482,7 +22635,7 @@ msgstr "Bitte kopieren um Änderungen vorzunehmen" #: core/doctype/system_settings/system_settings.py:145 msgid "Please enable atleast one Social Login Key or LDAP or Login With Email Link before disabling username/password based login." -msgstr "" +msgstr "Bitte aktivieren Sie mindestens eines der Anmeldeverfahren Social Login Key, LDAP oder Anmeldung per E-Mail-Link, bevor Sie die Anmeldung per Benutzernamen und Passwort deaktivieren." #: desk/doctype/notification_log/notification_log.js:45 #: email/doctype/auto_email_report/auto_email_report.js:17 @@ -22543,7 +22696,7 @@ msgstr "Bitte Passwort eingeben" #: public/js/frappe/desk.js:196 msgctxt "Email Account" msgid "Please enter the password for: {0}" -msgstr "" +msgstr "Bitte geben Sie das Passwort ein für: {0}" #: core/doctype/sms_settings/sms_settings.py:42 msgid "Please enter valid mobile nos" @@ -22623,7 +22776,7 @@ msgstr "Bitte wählen Sie Minimum Password Score" #: utils/__init__.py:115 msgid "Please select a country code for field {1}." -msgstr "" +msgstr "Bitte wählen Sie einen Ländercode für das Feld {1} aus." #: utils/file_manager.py:50 msgid "Please select a file or url" @@ -22666,7 +22819,7 @@ msgstr "Bitte {0} auswählen" #: integrations/doctype/dropbox_settings/dropbox_settings.py:306 msgid "Please set Dropbox access keys in site config or doctype" -msgstr "" +msgstr "Bitte setzen Sie die Dropbox-Zugriffsschlüssel in der Site Config oder im DocType" #: contacts/doctype/contact/contact.py:200 msgid "Please set Email Address" @@ -22686,7 +22839,7 @@ msgstr "Bitte setzen Sie Filter Wert in Berichtsfiltertabelle." #: model/naming.py:533 msgid "Please set the document name" -msgstr "" +msgstr "Bitte geben Sie den Dokumentnamen ein" #: desk/doctype/dashboard/dashboard.py:125 msgid "Please set the following documents in this Dashboard as standard first." @@ -22706,11 +22859,11 @@ msgstr "Bitte richten Sie zuerst eine Nachricht ein" #: email/doctype/email_account/email_account.py:389 msgid "Please setup default Email Account from Settings > Email Account" -msgstr "" +msgstr "Bitte richten Sie ein Standard-E-Mail-Konto unter Einstellungen > E-Mail-Konto ein" #: core/doctype/user/user.py:369 msgid "Please setup default outgoing Email Account from Settings > Email Account" -msgstr "" +msgstr "Bitte legen Sie das Standard-E-Mail-Konto unter Einstellungen > E-Mail-Konto fest" #: public/js/frappe/model/model.js:785 msgid "Please specify" @@ -22718,7 +22871,7 @@ msgstr "Bitte angeben" #: permissions.py:782 msgid "Please specify a valid parent DocType for {0}" -msgstr "" +msgstr "Bitte geben Sie einen gültigen übergeordneten DocType für {0} an" #: email/doctype/notification/notification.py:86 msgid "Please specify which date field must be checked" @@ -22775,13 +22928,13 @@ msgstr "Punkte gegeben" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Popover Element" -msgstr "" +msgstr "Popover-Element" #. Label of a HTML Editor field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "Popover or Modal Description" -msgstr "" +msgstr "Popover- oder Modal-Beschreibung" #. Label of a Data field in DocType 'Email Account' #: email/doctype/email_account/email_account.json @@ -22845,7 +22998,7 @@ msgstr "Absenden" #: templates/discussions/reply_section.html:39 msgid "Post it here, our mentors will help you out." -msgstr "" +msgstr "Posten Sie es hier, unsere Mentoren werden Ihnen helfen." #. Option for the 'Address Type' (Select) field in DocType 'Address' #: contacts/doctype/address/address.json @@ -23050,7 +23203,7 @@ msgstr "Vorheriger Hash" #: public/js/frappe/form/form.js:2162 msgid "Previous Submission" -msgstr "" +msgstr "Vorherige Buchungen" #. Option for the 'Style' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json @@ -23156,13 +23309,13 @@ msgstr "Programm zum Erstellen von Druckformaten" #. Label of a Link in the Tools Workspace #: automation/workspace/tools/tools.json msgid "Print Format Builder (New)" -msgstr "" +msgstr "Druckformat-Generator (neu)" #. Label of a Check field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json msgctxt "Print Format" msgid "Print Format Builder Beta" -msgstr "" +msgstr "Format-Builder Beta drucken" #: utils/pdf.py:52 msgid "Print Format Error" @@ -23171,7 +23324,7 @@ msgstr "Druckformatfehler" #. Name of a DocType #: printing/doctype/print_format_field_template/print_format_field_template.json msgid "Print Format Field Template" -msgstr "" +msgstr "Druckformat Feldvorlage" #. Label of a HTML field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json @@ -23192,12 +23345,12 @@ msgstr "Druckformat {0} ist deaktiviert" #. Description of the Onboarding Step 'Customize Print Formats' #: custom/onboarding_step/print_format/print_format.json msgid "Print Formats allow you can define looks for documents when printed or converted to PDF. You can also create a custom Print Format using drag-and-drop tools." -msgstr "" +msgstr "Mit Druckformaten können Sie das Aussehen von Dokumenten festlegen, die gedruckt oder in PDF konvertiert werden. Sie können auch ein benutzerdefiniertes Druckformat mit Hilfe von Drag-and-Drop-Tools erstellen." #. Name of a DocType #: printing/doctype/print_heading/print_heading.json msgid "Print Heading" -msgstr "" +msgstr "Druck-Kopfzeile" #. Label of a Link in the Tools Workspace #. Label of a Data field in DocType 'Print Heading' @@ -23205,7 +23358,7 @@ msgstr "" #: printing/doctype/print_heading/print_heading.json msgctxt "Print Heading" msgid "Print Heading" -msgstr "" +msgstr "Druck-Kopfzeile" #. Label of a Check field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json @@ -23495,7 +23648,7 @@ msgstr "Eigenschaftstyp" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Provide a list of allowed file extensions for file uploads. Each line should contain one allowed file type. If unset, all file extensions are allowed. Example:
    CSV
    JPG
    PNG" -msgstr "" +msgstr "Geben Sie eine Liste der zulässigen Dateierweiterungen für Datei-Uploads an. Jede Zeile sollte einen erlaubten Dateityp enthalten. Wenn Sie nichts angeben, sind alle Dateierweiterungen erlaubt. Beispiel:
    CSV
    JPG
    PNG" #. Label of a Data field in DocType 'User Social Login' #: core/doctype/user_social_login/user_social_login.json @@ -23864,7 +24017,7 @@ msgstr "Eingereiht von" #: core/doctype/submission_queue/submission_queue.py:173 msgid "Queued for Submission. You can track the progress over {0}." -msgstr "" +msgstr "In der Warteschlange für die Buchung. Sie können den Fortschritt über {0} verfolgen." #: integrations/doctype/dropbox_settings/dropbox_settings.py:64 #: integrations/doctype/google_drive/google_drive.py:156 @@ -23878,15 +24031,15 @@ msgstr "Warteschlange für Backup. Sie erhalten eine E-Mail mit dem Download-Lin #: email/doctype/newsletter/newsletter.js:95 msgid "Queued {0} emails" -msgstr "" +msgstr "{0} E-Mails in der Warteschlange" #: email/doctype/newsletter/newsletter.js:90 msgid "Queuing emails..." -msgstr "" +msgstr "E-Mails in die Warteschlange stellen..." #: desk/doctype/bulk_update/bulk_update.py:88 msgid "Queuing {0} for Submission" -msgstr "" +msgstr "Einreihen von {0} zur Buchung" #. Label of a Check field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -23904,18 +24057,18 @@ msgstr "Schnelleingabe" #: desk/doctype/workspace_quick_list/workspace_quick_list.json msgctxt "Workspace Quick List" msgid "Quick List Filter" -msgstr "" +msgstr "Schnelllisten-Filter" #. Label of a Tab Break field in DocType 'Workspace' #. Label of a Table field in DocType 'Workspace' #: desk/doctype/workspace/workspace.json msgctxt "Workspace" msgid "Quick Lists" -msgstr "" +msgstr "Schnelllisten" #: public/js/frappe/views/reports/report_utils.js:280 msgid "Quoting must be between 0 and 3" -msgstr "" +msgstr "Einstellung für CSV-Anführungszeichen muss zwischen 0 und 3 liegen" #. Label of a Section Break field in DocType 'Access Log' #: core/doctype/access_log/access_log.json @@ -23953,13 +24106,13 @@ msgstr "Bandbreite" #: core/doctype/server_script/server_script.json msgctxt "Server Script" msgid "Rate Limiting" -msgstr "" +msgstr "Anfragen begrenzen" #. Label of a Section Break field in DocType 'Blog Settings' #: website/doctype/blog_settings/blog_settings.json msgctxt "Blog Settings" msgid "Rate Limits" -msgstr "" +msgstr "Anfragen begrenzen" #. Label of a Int field in DocType 'Communication' #: core/doctype/communication/communication.json @@ -24021,7 +24174,7 @@ msgstr "Rohdruck" #: printing/page/print/print.js:165 msgid "Raw Printing Setting" -msgstr "" +msgstr "Einstellung für Rohdruck" #: desk/doctype/console_log/console_log.js:6 msgid "Re-Run in Console" @@ -24136,7 +24289,7 @@ msgstr "Nur lesen hängt von ab" #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Read Only Depends On (JS)" -msgstr "" +msgstr "Bedingungen für Schreibschutz (JS)" #: templates/includes/navbar/navbar_items.html:97 msgid "Read Only Mode" @@ -24166,7 +24319,7 @@ msgstr "Lesemodus" #: utils/safe_exec.py:91 msgid "Read the documentation to know more" -msgstr "" +msgstr "Lesen Sie die Dokumentation, um mehr zu erfahren" #. Label of a Markdown Editor field in DocType 'Package' #: core/doctype/package/package.json @@ -24201,13 +24354,13 @@ msgstr "Baum neu aufbauen" #: utils/nestedset.py:180 msgid "Rebuilding of tree is not supported for {}" -msgstr "" +msgstr "Die Neuberechnung des Baums wird für {} nicht unterstützt" #. Description of the 'Anonymous' (Check) field in DocType 'Web Form' #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "Receive anonymous response" -msgstr "" +msgstr "Anonyme Antwort erhalten" #. Option for the 'Sent or Received' (Select) field in DocType 'Communication' #: core/doctype/communication/communication.json @@ -24217,7 +24370,7 @@ msgstr "Empfangen" #: integrations/doctype/token_cache/token_cache.py:49 msgid "Received an invalid token type." -msgstr "" +msgstr "Es wurde ein ungültiger Tokentyp empfangen." #. Label of a Select field in DocType 'Notification Recipient' #: email/doctype/notification_recipient/notification_recipient.json @@ -24243,7 +24396,7 @@ msgstr "Die letzten Jahre sind leicht zu erraten." #: public/js/frappe/ui/toolbar/search_utils.js:516 msgid "Recents" -msgstr "" +msgstr "Kürzlich aufgerufen" #. Label of a Table field in DocType 'Email Queue' #: email/doctype/email_queue/email_queue.json @@ -24320,7 +24473,7 @@ msgstr "Redirect URI Bound To Auth-Code" #: integrations/doctype/oauth_client/oauth_client.json msgctxt "OAuth Client" msgid "Redirect URIs" -msgstr "" +msgstr "Weiterleitungs-URIs" #. Label of a Data field in DocType 'Social Login Key' #: integrations/doctype/social_login_key/social_login_key.json @@ -24338,13 +24491,13 @@ msgstr "Redirect-URL" #: email/doctype/email_group/email_group.json msgctxt "Email Group" msgid "Redirect to this URL after successful confirmation." -msgstr "" +msgstr "Nach erfolgreicher Bestätigung zu dieser URL weiterleiten." #. Label of a Tab Break field in DocType 'Website Settings' #: website/doctype/website_settings/website_settings.json msgctxt "Website Settings" msgid "Redirects" -msgstr "" +msgstr "Weiterleitungen" #: sessions.py:148 msgid "Redis cache server not running. Please contact Administrator / Tech support" @@ -24366,7 +24519,7 @@ msgstr "Ref-DocType" #: desk/doctype/form_tour/form_tour.js:38 msgid "Referance Doctype and Dashboard Name both can't be used at the same time." -msgstr "" +msgstr "Referenz-DocType und Dashboard-Name können nicht gleichzeitig verwendet werden." #: core/doctype/user_type/user_type_dashboard.py:5 desk/report/todo/todo.py:42 #: public/js/frappe/views/interaction.js:54 @@ -24494,13 +24647,13 @@ msgstr "Referenzdokument" #: core/doctype/document_share_key/document_share_key.json msgctxt "Document Share Key" msgid "Reference Document Name" -msgstr "" +msgstr "Name des Referenzdokuments" #. Label of a Dynamic Link field in DocType 'Integration Request' #: integrations/doctype/integration_request/integration_request.json msgctxt "Integration Request" msgid "Reference Document Name" -msgstr "" +msgstr "Name des Referenzdokuments" #. Label of a Link field in DocType 'Activity Log' #: core/doctype/activity_log/activity_log.json @@ -24757,13 +24910,13 @@ msgstr "Referenz: {0} {1}" #: website/report/website_analytics/website_analytics.js:37 msgid "Referrer" -msgstr "" +msgstr "Referrer" #. Label of a Data field in DocType 'Web Page View' #: website/doctype/web_page_view/web_page_view.json msgctxt "Web Page View" msgid "Referrer" -msgstr "" +msgstr "Referrer" #: printing/page/print/print.js:73 public/js/frappe/desk.js:133 #: public/js/frappe/form/form.js:1174 public/js/frappe/list/base_list.js:65 @@ -24850,7 +25003,7 @@ msgstr "Versionshinweise" #: core/doctype/communication/communication.js:48 #: core/doctype/communication/communication.js:159 msgid "Relink" -msgstr "" +msgstr "Neu verknüpfen" #: core/doctype/communication/communication.js:138 msgid "Relink Communication" @@ -24860,13 +25013,13 @@ msgstr "Relink Kommunikation" #: core/doctype/comment/comment.json msgctxt "Comment" msgid "Relinked" -msgstr "" +msgstr "Neu verknüpft" #. Option for the 'Comment Type' (Select) field in DocType 'Communication' #: core/doctype/communication/communication.json msgctxt "Communication" msgid "Relinked" -msgstr "" +msgstr "Neu verknüpft" #. Label of a standard navbar item #. Type: Action @@ -24877,7 +25030,7 @@ msgstr "Neu laden" #: public/js/frappe/list/base_list.js:239 msgid "Reload List" -msgstr "" +msgstr "Reload List" #: public/js/frappe/views/reports/query_report.js:99 msgid "Reload Report" @@ -24897,13 +25050,13 @@ msgstr "Zuletzt gewählten Wert merken" #: public/js/frappe/form/reminders.js:33 msgid "Remind At" -msgstr "" +msgstr "Erinnern am" #. Label of a Datetime field in DocType 'Reminder' #: automation/doctype/reminder/reminder.json msgctxt "Reminder" msgid "Remind At" -msgstr "" +msgstr "Erinnern am" #: public/js/frappe/form/toolbar.js:436 msgid "Remind Me" @@ -24911,7 +25064,7 @@ msgstr "Erinnere mich" #: public/js/frappe/form/reminders.js:13 msgid "Remind Me In" -msgstr "" +msgstr "Erinnere mich in" #. Name of a DocType #: automation/doctype/reminder/reminder.json @@ -24928,7 +25081,7 @@ msgstr "" #: core/doctype/rq_job/rq_job_list.js:8 msgid "Remove Failed Jobs" -msgstr "" +msgstr "Fehlgeschlagene Jobs entfernen" #: printing/page/print_format_builder/print_format_builder.js:488 msgid "Remove Field" @@ -25141,19 +25294,19 @@ msgstr "Bericht" #: public/js/frappe/list/list_view_select.js:66 msgid "Report Builder" -msgstr "Berichts-Generator" +msgstr "Berichterstellungswerkzeug" #. Option for the 'Report Type' (Select) field in DocType 'Report' #: core/doctype/report/report.json msgctxt "Report" msgid "Report Builder" -msgstr "Berichts-Generator" +msgstr "Berichterstellungswerkzeug" #. Option for the 'DocType View' (Select) field in DocType 'Workspace Shortcut' #: desk/doctype/workspace_shortcut/workspace_shortcut.json msgctxt "Workspace Shortcut" msgid "Report Builder" -msgstr "Berichts-Generator" +msgstr "Berichterstellungswerkzeug" #. Name of a DocType #: core/doctype/report_column/report_column.json @@ -25247,7 +25400,7 @@ msgstr "Berichtsname" #: desk/doctype/number_card/number_card.py:65 msgid "Report Name, Report Field and Fucntion are required to create a number card" -msgstr "" +msgstr "Zum Erstellen einer Nummernkarte sind Berichtsname, Berichtsfeld und Funktion erforderlich" #. Label of a Data field in DocType 'Onboarding Step' #: desk/doctype/onboarding_step/onboarding_step.json @@ -25289,11 +25442,11 @@ msgstr "Der Bericht enthält keine numerischen Felder. Bitte ändern Sie den Ber #: public/js/frappe/views/reports/query_report.js:935 msgid "Report initiated, click to view status" -msgstr "" +msgstr "Bericht initiiert. Klicken Sie hier, um den Status anzuzeigen" #: email/doctype/auto_email_report/auto_email_report.py:102 msgid "Report limit reached" -msgstr "" +msgstr "Berichtsgrenze erreicht" #: core/doctype/prepared_report/prepared_report.py:202 msgid "Report timed out." @@ -25358,7 +25511,7 @@ msgstr "Kontolöschung anfordern" #: integrations/doctype/webhook/webhook.json msgctxt "Webhook" msgid "Request Body" -msgstr "" +msgstr "Body anfordern" #. Label of a Code field in DocType 'Integration Request' #: integrations/doctype/integration_request/integration_request.json @@ -25370,19 +25523,19 @@ msgstr "Daten anfordern" #: integrations/doctype/integration_request/integration_request.json msgctxt "Integration Request" msgid "Request Description" -msgstr "" +msgstr "Beschreibung der Anfrage" #. Label of a Code field in DocType 'Integration Request' #: integrations/doctype/integration_request/integration_request.json msgctxt "Integration Request" msgid "Request Headers" -msgstr "" +msgstr "Anfrage-Kopfzeilen" #. Label of a Code field in DocType 'Recorder' #: core/doctype/recorder/recorder.json msgctxt "Recorder" msgid "Request Headers" -msgstr "" +msgstr "Anfrage-Kopfzeilen" #. Label of a Data field in DocType 'Integration Request' #: integrations/doctype/integration_request/integration_request.json @@ -25414,13 +25567,13 @@ msgstr "Zeitüberschreitung der Anfrage" #: public/js/frappe/request.js:241 msgid "Request Timeout" -msgstr "" +msgstr "Zeitüberschreitung der Anfrage" #. Label of a Int field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json msgctxt "Webhook" msgid "Request Timeout" -msgstr "" +msgstr "Zeitüberschreitung der Anfrage" #. Label of a Data field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -25445,14 +25598,14 @@ msgstr "Vertrauenswürdiges Zertifikat anfordern" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "Requires any valid fdn path. i.e. ou=groups,dc=example,dc=com" -msgstr "" +msgstr "Benötigt einen gültigen fdn-Pfad. z.B. ou=groups,dc=example,dc=com" #. Description of the 'LDAP search path for Users' (Data) field in DocType #. 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "Requires any valid fdn path. i.e. ou=users,dc=example,dc=com" -msgstr "" +msgstr "Benötigt einen gültigen fdn-Pfad. z.B. ou=users,dc=example,dc=com" #: core/doctype/communication/communication.js:279 msgid "Res: {0}" @@ -25513,13 +25666,13 @@ msgstr "Passwortschlüssel zurücksetzen" #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Reset Password Link Expiry Duration" -msgstr "" +msgstr "Gültigkeitsdauer des Passwort-Links zurücksetzen" #. Label of a Link field in DocType 'System Settings' #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Reset Password Template" -msgstr "" +msgstr "Vorlage Passwort zurücksetzen" #: core/page/permission_manager/permission_manager.js:109 msgid "Reset Permissions for {0}?" @@ -25758,19 +25911,19 @@ msgstr "Gesperrte" #: website/doctype/blog_post/blog_post.json msgctxt "Blog Post" msgid "Rich Text" -msgstr "" +msgstr "Rich-Text" #. Option for the 'Content Type' (Select) field in DocType 'Newsletter' #: email/doctype/newsletter/newsletter.json msgctxt "Newsletter" msgid "Rich Text" -msgstr "" +msgstr "Rich-Text" #. Option for the 'Content Type' (Select) field in DocType 'Web Page' #: website/doctype/web_page/web_page.json msgctxt "Web Page" msgid "Rich Text" -msgstr "" +msgstr "Rich-Text" #. Option for the 'Position' (Select) field in DocType 'Form Tour Step' #: desk/doctype/form_tour_step/form_tour_step.json @@ -25970,7 +26123,7 @@ msgstr "Rolle und Ebene" #: core/doctype/user/user.py:314 msgid "Role has been set as per the user type {0}" -msgstr "" +msgstr "Die Rolle wurde gemäß Benutzertyp {0} festgelegt" #: core/page/permission_manager/permission_manager.js:59 msgid "Roles" @@ -26186,7 +26339,7 @@ msgstr "Zeile" #: core/doctype/doctype/doctype.py:1772 core/doctype/doctype/doctype.py:1782 msgid "Row # {0}: Non administrator user can not set the role {1} to the custom doctype" -msgstr "" +msgstr "Zeile # {0}: Nicht-Administrator-Benutzer können die Rolle {1} nicht auf den benutzerdefinierten Doctype einstellen" #: model/base_document.py:868 msgid "Row #{0}:" @@ -26194,7 +26347,7 @@ msgstr "Zeile #{0}:" #: core/doctype/doctype/doctype.py:492 msgid "Row #{}: Fieldname is required" -msgstr "" +msgstr "Zeile #{}: Feldname ist erforderlich" #. Label of a Data field in DocType 'Transaction Log' #: core/doctype/transaction_log/transaction_log.json @@ -26260,7 +26413,7 @@ msgstr "Regelname" #: permissions.py:662 msgid "Rule for this doctype, role, permlevel and if-owner combination already exists." -msgstr "" +msgstr "Die Regel für diese Kombination aus Doctype, Rolle, Permlevel und if-owner existiert bereits." #. Group in DocType's connections #: core/doctype/doctype/doctype.json @@ -26592,7 +26745,7 @@ msgstr "Speichere Anpassung..." #: desk/doctype/module_onboarding/module_onboarding.js:8 msgid "Saving this will export this document as well as the steps linked here as json." -msgstr "" +msgstr "Wenn Sie dies speichern, werden dieses Dokument und die hier verlinkten Schritte als JSON exportiert." #: public/js/form_builder/store.js:228 #: public/js/print_format_builder/store.js:36 @@ -26628,7 +26781,7 @@ msgstr "Senden planen" #: email/doctype/newsletter/newsletter.json msgctxt "Newsletter" msgid "Schedule sending at a later time" -msgstr "" +msgstr "Senden zu einem späteren Zeitpunkt planen" #: email/doctype/newsletter/newsletter_list.js:7 msgid "Scheduled" @@ -26684,13 +26837,13 @@ msgstr "Geplanter Auftragstyp" #: core/workspace/build/build.json msgctxt "Scheduled Job Log" msgid "Scheduled Jobs Logs" -msgstr "" +msgstr "Protokolle geplanter Jobs" #. Label of a Section Break field in DocType 'Newsletter' #: email/doctype/newsletter/newsletter.json msgctxt "Newsletter" msgid "Scheduled Sending" -msgstr "" +msgstr "Geplanter Versand" #. Label of a Int field in DocType 'Newsletter' #: email/doctype/newsletter/newsletter.json @@ -26718,7 +26871,7 @@ msgstr "Scheduler Inaktiv" #: utils/scheduler.py:196 msgid "Scheduler can not be re-enabled when maintenance mode is active." -msgstr "" +msgstr "Scheduler kann nicht wieder aktiviert werden, wenn der Wartungsmodus aktiv ist." #: core/doctype/data_import/data_import.py:97 msgid "Scheduler is inactive. Cannot import data." @@ -26726,48 +26879,48 @@ msgstr "Scheduler ist inaktiv. Daten können nicht importiert werden." #: core/doctype/rq_job/rq_job_list.js:19 msgid "Scheduler: Active" -msgstr "" +msgstr "Planer: Aktiv" #: core/doctype/rq_job/rq_job_list.js:21 msgid "Scheduler: Inactive" -msgstr "" +msgstr "Zeitplaner: Inaktiv" #. Label of a Data field in DocType 'OAuth Scope' #: integrations/doctype/oauth_scope/oauth_scope.json msgctxt "OAuth Scope" msgid "Scope" -msgstr "" +msgstr "Geltungsbereich" #. Label of a Section Break field in DocType 'Connected App' #. Label of a Table field in DocType 'Connected App' #: integrations/doctype/connected_app/connected_app.json msgctxt "Connected App" msgid "Scopes" -msgstr "" +msgstr "Geltungsbereiche" #. Label of a Text field in DocType 'OAuth Authorization Code' #: integrations/doctype/oauth_authorization_code/oauth_authorization_code.json msgctxt "OAuth Authorization Code" msgid "Scopes" -msgstr "" +msgstr "Geltungsbereiche" #. Label of a Text field in DocType 'OAuth Bearer Token' #: integrations/doctype/oauth_bearer_token/oauth_bearer_token.json msgctxt "OAuth Bearer Token" msgid "Scopes" -msgstr "" +msgstr "Geltungsbereiche" #. Label of a Text field in DocType 'OAuth Client' #: integrations/doctype/oauth_client/oauth_client.json msgctxt "OAuth Client" msgid "Scopes" -msgstr "" +msgstr "Geltungsbereiche" #. Label of a Table field in DocType 'Token Cache' #: integrations/doctype/token_cache/token_cache.json msgctxt "Token Cache" msgid "Scopes" -msgstr "" +msgstr "Geltungsbereiche" #. Label of a Code field in DocType 'Client Script' #: custom/doctype/client_script/client_script.json @@ -26825,19 +26978,19 @@ msgstr "Skripttyp" #. Label of a Card Break in the Build Workspace #: core/workspace/build/build.json msgid "Scripting" -msgstr "" +msgstr "Skripterstellung" #. Label of a Tab Break field in DocType 'Web Page' #: website/doctype/web_page/web_page.json msgctxt "Web Page" msgid "Scripting" -msgstr "" +msgstr "Skripterstellung" #. Label of a Section Break field in DocType 'Web Form' #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "Scripting / Style" -msgstr "" +msgstr "Skripterstellung / Stil" #: public/js/frappe/form/link_selector.js:46 #: public/js/frappe/ui/toolbar/search.js:49 @@ -26972,7 +27125,7 @@ msgstr "Auf der Webseite ansehen" #: website/doctype/web_form/templates/web_form.html:150 msgid "See previous responses" -msgstr "" +msgstr "Vorherige Antworten anzeigen" #: integrations/doctype/slack_webhook_url/slack_webhook_url.py:48 msgid "See the document at {0}" @@ -27267,11 +27420,11 @@ msgstr "DocType auswählen, um ein neues Format zu erstellen" #: integrations/doctype/webhook/webhook.py:130 msgid "Select a document to check if it meets conditions." -msgstr "" +msgstr "Wählen Sie ein Dokument aus, um zu prüfen, ob es die Bedingungen erfüllt." #: integrations/doctype/webhook/webhook.py:142 msgid "Select a document to preview request data" -msgstr "" +msgstr "Wählen Sie ein Dokument zur Vorschau der Anfragedaten" #: public/js/frappe/views/treeview.js:342 msgid "Select a group node first." @@ -27331,7 +27484,7 @@ msgstr "Bitte Element auswählen, nach dem ein neues Feld eingefügt werden soll #: public/js/frappe/utils/diffview.js:101 msgid "Select two versions to view the diff." -msgstr "" +msgstr "Wählen Sie zwei Versionen aus, um den Unterschied anzuzeigen." #: public/js/frappe/form/link_selector.js:24 #: public/js/frappe/form/multi_select_dialog.js:79 @@ -27379,7 +27532,7 @@ msgstr "E-Mail-Benachrichtigung senden" #: email/doctype/newsletter/newsletter.json msgctxt "Newsletter" msgid "Send Email At" -msgstr "" +msgstr "E-Mail senden am" #. Description of the 'Send Print as PDF' (Check) field in DocType 'Print #. Settings' @@ -27488,7 +27641,7 @@ msgstr "Abmelde-Link senden" #: email/doctype/newsletter/newsletter.json msgctxt "Newsletter" msgid "Send Web View Link" -msgstr "" +msgstr "Webview-Link senden" #. Label of a Check field in DocType 'User' #: core/doctype/user/user.json @@ -27498,7 +27651,7 @@ msgstr "Willkommens-E-Mail senden" #: www/me.html:67 msgid "Send a request to delete your account" -msgstr "" +msgstr "Senden Sie eine Anfrage zum Löschen Ihres Kontos" #: email/doctype/newsletter/newsletter.js:10 msgid "Send a test email" @@ -27815,15 +27968,15 @@ msgstr "Serverskript" #: utils/safe_exec.py:90 msgid "Server Scripts are disabled. Please enable server scripts from bench configuration." -msgstr "" +msgstr "Serverskripte sind deaktiviert. Bitte aktivieren Sie Server-Skripte in der Bankkonfiguration." #: core/doctype/server_script/server_script.js:32 msgid "Server Scripts feature is not available on this site." -msgstr "" +msgstr "Server-Skript-Funktion ist auf dieser Seite nicht verfügbar." #: public/js/frappe/request.js:243 public/js/frappe/request.js:251 msgid "Server was too busy to process this request. Please try again." -msgstr "" +msgstr "Server war zu beschäftigt, um diese Anfrage zu bearbeiten. Bitte versuchen Sie es erneut." #. Label of a Select field in DocType 'Email Account' #: email/doctype/email_account/email_account.json @@ -27923,7 +28076,7 @@ msgstr "Limit festlegen" #: core/doctype/document_naming_settings/document_naming_settings.json msgctxt "Document Naming Settings" msgid "Set Naming Series options on your transactions." -msgstr "" +msgstr "Legen Sie Nummernkreise für Ihre Transaktionen fest." #. Label of a Password field in DocType 'User' #: core/doctype/user/user.json @@ -28058,7 +28211,24 @@ msgid "Set the filters here. For example:\n" "\treqd: 1\n" "}]\n" "
    " -msgstr "" +msgstr "Legen Sie hier die Filter fest. Beispiel:\n" +"
    \n"
    +"[{\n"
    +"\tfieldname: \"company\",\n"
    +"\tlabel: __(\"Company\"),\n"
    +"\tfieldtype: \"Link\",\n"
    +"\toptions: \"Company\",\n"
    +"\tdefault: frappe.defaults.get_user_default(\"Company\"),\n"
    +"\treqd: 1\n"
    +"},\n"
    +"{\n"
    +"\tfieldname: \"account\",\n"
    +"\tlabel: __(\"Account\"),\n"
    +"\tfieldtype: \"Link\",\n"
    +"\toptions: \"Account\",\n"
    +"\treqd: 1\n"
    +"}]\n"
    +"
    " #. Description of the 'Method' (Data) field in DocType 'Number Card' #: desk/doctype/number_card/number_card.json @@ -28071,7 +28241,14 @@ msgid "Set the path to a whitelisted function that will return the data for the "\t\"route_options\": {\"from_date\": \"2023-05-23\"},\n" "\t\"route\": [\"query-report\", \"Permitted Documents For User\"]\n" "}" -msgstr "" +msgstr "Tragen Sie den Pfad zu einer freigegebenen Funktion ein, die die Daten für die Zahlenkarte im folgenden Format zurückgibt:\n\n" +"
    \n"
    +"{\n"
    +"\t\"value\": value,\n"
    +"\t\"fieldtype\": \"Currency\",\n"
    +"\t\"route_options\": {\"from_date\": \"2023-05-23\"},\n"
    +"\t\"route\": [\"query-report\", \"Permitted Documents For User\"]\n"
    +"}
    " #: contacts/doctype/address_template/address_template.py:32 msgid "Setting this Address Template as default as there is no other default" @@ -28138,7 +28315,7 @@ msgstr "Einrichtung" #. Title of an Onboarding Step #: custom/onboarding_step/workflows/workflows.json msgid "Setup Approval Workflows" -msgstr "" +msgstr "Genehmigungsworkflows einrichten" #: public/js/frappe/views/reports/query_report.js:1658 #: public/js/frappe/views/reports/report_view.js:1609 @@ -28158,7 +28335,7 @@ msgstr "Einrichtung abgeschlossen" #. Title of an Onboarding Step #: custom/onboarding_step/role_permissions/role_permissions.json msgid "Setup Limited Access for a User" -msgstr "" +msgstr "Eingeschränkten Zugriff für einen Benutzer einrichten" #. Title of an Onboarding Step #: custom/onboarding_step/naming_series/naming_series.json @@ -28257,7 +28434,7 @@ msgstr "Anzeigen" #: website/doctype/blog_settings/blog_settings.json msgctxt "Blog Settings" msgid "Show \"Call to Action\" in Blog" -msgstr "" +msgstr "„Aufruf zum Handeln\" im Blog anzeigen" #. Label of a Check field in DocType 'Print Format' #: printing/doctype/print_format/print_format.json @@ -28599,7 +28776,7 @@ msgstr "Registrieren" #: integrations/doctype/social_login_key/social_login_key.json msgctxt "Social Login Key" msgid "Sign ups" -msgstr "" +msgstr "Registrierungen" #. Option for the 'Field Type' (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json @@ -28683,7 +28860,7 @@ msgstr "Einzelne Typen haben nur einen Datensatz, keine Tabellen zugeordnet. Die #: database/database.py:230 msgid "Site is running in read only mode for maintenance or site update, this action can not be performed right now. Please try again later." -msgstr "" +msgstr "Diese Instanz läuft im schreibgeschützten Modus für Wartungsarbeiten und Aktualisierungen. Diese Aktion kann daher momentan nicht ausgeführt werden. Bitte versuchen Sie es später erneut." #: public/js/onboarding_tours/onboarding_tours.js:18 msgid "Skip" @@ -28725,11 +28902,11 @@ msgstr "Spalte {0} wird übersprungen" #: modules/utils.py:162 msgid "Skipping fixture syncing for doctype {0} from file {1}" -msgstr "" +msgstr "Überspringe Synchronisierung von Fixtures für den Doctype {0} aus der Datei {1}" #: core/doctype/data_import/data_import.js:39 msgid "Skipping {0} of {1}, {2}" -msgstr "" +msgstr "Überspringe {0} von {1}, {2}" #. Label of a Data field in DocType 'Contact Us Settings' #: website/doctype/contact_us_settings/contact_us_settings.json @@ -28840,13 +29017,13 @@ msgstr "Typ des sozialen Links" #. Name of a DocType #: integrations/doctype/social_login_key/social_login_key.json msgid "Social Login Key" -msgstr "" +msgstr "Social Login Key" #. Label of a Link in the Integrations Workspace #: integrations/workspace/integrations/integrations.json msgctxt "Social Login Key" msgid "Social Login Key" -msgstr "" +msgstr "Social Login Key" #. Label of a Select field in DocType 'Social Login Key' #: integrations/doctype/social_login_key/social_login_key.json @@ -29043,7 +29220,7 @@ msgstr "Standard" #: model/delete_doc.py:79 msgid "Standard DocType can not be deleted." -msgstr "" +msgstr "Standard DocType kann nicht gelöscht werden." #: core/doctype/doctype/doctype.py:228 msgid "Standard DocType cannot have default print format, use Customize Form" @@ -29085,7 +29262,7 @@ msgstr "Standardrollen kann nicht umbenannt werden" #: core/doctype/user_type/user_type.py:60 msgid "Standard user type {0} can not be deleted." -msgstr "" +msgstr "Standard-Benutzertyp {0} kann nicht gelöscht werden." #: templates/emails/energy_points_summary.html:33 msgid "Standings" @@ -29136,7 +29313,7 @@ msgstr "Startzeit" #: templates/includes/comments/comments.html:8 msgid "Start a new discussion" -msgstr "" +msgstr "Eine neue Unterhaltung starten" #: core/doctype/data_export/exporter.py:22 msgid "Start entering data below this line" @@ -29452,7 +29629,7 @@ msgstr "Speichert die JSON (JavaScript Object Notation) der letzten bekannten Ve #: core/doctype/user/user.json msgctxt "User" msgid "Stores the datetime when the last reset password key was generated." -msgstr "" +msgstr "Speichert das Datum, an dem der letzte Schlüssel zum Zurücksetzen des Passworts generiert wurde." #: utils/password_strength.py:99 msgid "Straight rows of keys are easy to guess" @@ -29681,11 +29858,11 @@ msgstr "Nach dem Import buchen" #: website/doctype/web_form/web_form.json msgctxt "Web Form" msgid "Submit Button Label" -msgstr "" +msgstr "Übertrage Button Label" #: website/doctype/web_form/templates/web_form.html:153 msgid "Submit another response" -msgstr "" +msgstr "Eine weitere Antwort senden" #. Label of a Check field in DocType 'Auto Repeat' #: automation/doctype/auto_repeat/auto_repeat.json @@ -29730,7 +29907,7 @@ msgstr "Buchung kann nicht in Entwurf umgewandelt werden. Zeile {0}" #: public/js/workflow_builder/utils.js:176 msgid "Submitted document cannot be converted back to draft while transitioning from {0} State to {1} State" -msgstr "" +msgstr "Das gebuchte Dokument kann beim Übergang vom Status {0} zum Status {1} nicht wieder in einen Entwurf umgewandelt werden." #: public/js/frappe/form/save.js:10 msgctxt "Freeze message while submitting a document" @@ -29857,11 +30034,11 @@ msgstr "Erfolgreich aktualisiert" #: core/doctype/data_import/data_import.js:434 msgid "Successfully imported {0}" -msgstr "" +msgstr "Erfolgreich importiert {0}" #: desk/doctype/form_tour/form_tour.py:86 msgid "Successfully reset onboarding status for all users." -msgstr "" +msgstr "Onboarding-Status für alle Benutzer erfolgreich zurückgesetzt." #: public/js/frappe/views/translation_manager.js:22 msgid "Successfully updated translations" @@ -29869,11 +30046,11 @@ msgstr "Erfolgreich aktualisierte Übersetzungen" #: core/doctype/data_import/data_import.js:442 msgid "Successfully updated {0}" -msgstr "" +msgstr "Erfolgreich aktualisiert {0}" #: core/doctype/data_import/data_import.js:149 msgid "Successfully {0} 1 record." -msgstr "" +msgstr "Erfolgreich {0} 1 Datensatz." #: core/doctype/data_import/data_import.js:156 msgid "Successfully {0} {1} record out of {2}. Click on Export Errored Rows, fix the errors and import again." @@ -29885,7 +30062,7 @@ msgstr "" #: core/doctype/data_import/data_import.js:151 msgid "Successfully {0} {1} records." -msgstr "" +msgstr "Erfolgreich {0} {1} Datensätze." #: core/doctype/user/user.py:679 msgid "Suggested Username: {0}" @@ -29971,7 +30148,7 @@ msgstr "Kamera wird gewechselt" #: geo/doctype/currency/currency.json msgctxt "Currency" msgid "Symbol" -msgstr "" +msgstr "Symbol" #. Label of a Section Break field in DocType 'Google Calendar' #: integrations/doctype/google_calendar/google_calendar.json @@ -29999,7 +30176,7 @@ msgstr "Anpassungen bei jeder Datenbankmigration synchronisieren" #: integrations/doctype/google_calendar/google_calendar.py:295 msgid "Sync token was invalid and has been reset, Retry syncing." -msgstr "" +msgstr "Das Synchronisierungstoken war ungültig und wurde zurückgesetzt. Versuchen Sie die Synchronisierung erneut." #. Label of a Check field in DocType 'Event' #: desk/doctype/event/event.json @@ -30038,7 +30215,7 @@ msgstr "Syntaxfehler" #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "System" -msgstr "" +msgstr "System" #. Name of a DocType #: desk/doctype/system_console/system_console.json @@ -30047,12 +30224,12 @@ msgstr "Systemkonsole" #: custom/doctype/custom_field/custom_field.py:358 msgid "System Generated Fields can not be renamed" -msgstr "" +msgstr "Systemgenerierte Felder können nicht umbenannt werden" #. Label of a Card Break in the Build Workspace #: core/workspace/build/build.json msgid "System Logs" -msgstr "" +msgstr "Systemprotokolle" #. Name of a role #: automation/doctype/assignment_rule/assignment_rule.json @@ -30187,7 +30364,7 @@ msgstr "System-Manager" #: desk/page/backups/backups.js:36 msgid "System Manager privileges required." -msgstr "" +msgstr "System-Manager-Berechtigungen erforderlich." #. Option for the 'Channel' (Select) field in DocType 'Notification' #: email/doctype/notification/notification.json @@ -30199,7 +30376,7 @@ msgstr "Systembenachrichtigung" #: desk/doctype/notification_settings/notification_settings.json msgctxt "Notification Settings" msgid "System Notifications" -msgstr "" +msgstr "Systembenachrichtigungen" #. Label of a Check field in DocType 'Page' #: core/doctype/page/page.json @@ -30234,19 +30411,19 @@ msgstr "Bio" #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" msgid "Tab Break" -msgstr "" +msgstr "Tab-Umbruch" #. Option for the 'Type' (Select) field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "Tab Break" -msgstr "" +msgstr "Tab-Umbruch" #. Option for the 'Type' (Select) field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Tab Break" -msgstr "" +msgstr "Tab-Umbruch" #: core/doctype/data_export/exporter.py:23 msgid "Table" @@ -30290,7 +30467,7 @@ msgstr "Tabellenfeldname" #: core/doctype/doctype/doctype.py:1154 msgid "Table Fieldname Missing" -msgstr "" +msgstr "Tabellenfeldname fehlt" #. Label of a HTML field in DocType 'Version' #: core/doctype/version/version.json @@ -30328,7 +30505,7 @@ msgstr "Tabelle {0} darf nicht leer sein" #: printing/doctype/print_settings/print_settings.json msgctxt "Print Settings" msgid "Tabloid" -msgstr "" +msgstr "Tabloid" #. Name of a DocType #: desk/doctype/tag/tag.json @@ -30398,13 +30575,13 @@ msgstr "Überschrift zu den Teammitgliedern" #: website/doctype/about_us_settings/about_us_settings.json msgctxt "About Us Settings" msgid "Team Members Subtitle" -msgstr "" +msgstr "Teammitglieder Untertitel" #. Label of a Section Break field in DocType 'System Settings' #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "Telemetry" -msgstr "" +msgstr "Telemetrie" #. Label of a Code field in DocType 'Address Template' #: contacts/doctype/address_template/address_template.json @@ -30439,7 +30616,7 @@ msgstr "Vorlagenfehler" #: printing/doctype/print_format_field_template/print_format_field_template.json msgctxt "Print Format Field Template" msgid "Template File" -msgstr "" +msgstr "Vorlagendatei" #. Label of a Code field in DocType 'Data Import' #: core/doctype/data_import/data_import.json @@ -30473,31 +30650,31 @@ msgstr "Test_Ordner" #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" msgid "Text" -msgstr "" +msgstr "Text" #. Option for the 'Type' (Select) field in DocType 'Customize Form Field' #: custom/doctype/customize_form_field/customize_form_field.json msgctxt "Customize Form Field" msgid "Text" -msgstr "" +msgstr "Text" #. Option for the 'Type' (Select) field in DocType 'DocField' #: core/doctype/docfield/docfield.json msgctxt "DocField" msgid "Text" -msgstr "" +msgstr "Text" #. Option for the 'Fieldtype' (Select) field in DocType 'Web Form Field' #: website/doctype/web_form_field/web_form_field.json msgctxt "Web Form Field" msgid "Text" -msgstr "" +msgstr "Text" #. Option for the 'Fieldtype' (Select) field in DocType 'Web Template Field' #: website/doctype/web_template_field/web_template_field.json msgctxt "Web Template Field" msgid "Text" -msgstr "" +msgstr "Text" #. Label of a Select field in DocType 'Web Page' #: website/doctype/web_page/web_page.json @@ -30579,7 +30756,9 @@ msgctxt "Google Settings" msgid "The Client ID obtained from the Google Cloud Console under \n" "\"APIs & Services\" > \"Credentials\"\n" "" -msgstr "" +msgstr "Die Client-ID, die Sie in der Google Cloud Console unter \n" +"\"APIs & Services\" > \"Credentials\"\n" +"erhalten" #: email/doctype/notification/notification.py:129 msgid "The Condition '{0}' is invalid" @@ -30591,7 +30770,7 @@ msgstr "Die eingegebene Datei-URL ist falsch" #: website/doctype/personal_data_deletion_request/personal_data_deletion_request.py:364 msgid "The User record for this request has been auto-deleted due to inactivity by system admins." -msgstr "" +msgstr "Der Benutzerdatensatz für diese Anfrage wurde aufgrund der Inaktivität der Systemadministratoren automatisch gelöscht." #: public/js/frappe/desk.js:127 msgid "The application has been updated to a new version, please refresh this page" @@ -30614,7 +30793,9 @@ msgctxt "Google Settings" msgid "The browser API key obtained from the Google Cloud Console under \n" "\"APIs & Services\" > \"Credentials\"\n" "" -msgstr "" +msgstr "Der Browser-API-Schlüssel, den Sie von der Google Cloud Console unter \n" +"\"APIs & Dienste\" > \"Zugangsdaten\"\n" +"erhalten" #: database/database.py:388 msgid "The changes have been reverted." @@ -30641,14 +30822,14 @@ msgstr "Das Dokument wurde {0} zugewiesen" #: desk/doctype/dashboard_chart/dashboard_chart.json msgctxt "Dashboard Chart" msgid "The document type selected is a child table, so the parent document type is required." -msgstr "" +msgstr "Der ausgewählte Dokumenttyp ist eine untergeordnete Tabelle, daher ist der übergeordnete Dokumenttyp erforderlich." #. Description of the 'Parent Document Type' (Link) field in DocType 'Number #. Card' #: desk/doctype/number_card/number_card.json msgctxt "Number Card" msgid "The document type selected is a child table, so the parent document type is required." -msgstr "" +msgstr "Der ausgewählte Dokumenttyp ist eine untergeordnete Tabelle, daher ist der übergeordnete Dokumenttyp erforderlich." #: core/doctype/user_type/user_type.py:109 msgid "The field {0} is mandatory" @@ -30656,11 +30837,11 @@ msgstr "Das Feld {0} ist ein Pflichtfeld" #: core/doctype/file/file.py:143 msgid "The fieldname you've specified in Attached To Field is invalid" -msgstr "" +msgstr "Der Feldname, den Sie im Angehängten Feld angegeben haben, ist ungültig" #: core/doctype/data_import/importer.py:1035 msgid "The following values are invalid: {0}. Values must be one of {1}" -msgstr "" +msgstr "Die folgenden Werte sind ungültig: {0}. Die Werte müssen einer der folgenden sein: {1}" #: core/doctype/data_import/importer.py:998 msgid "The following values do not exist for {0}: {1}" @@ -30668,7 +30849,7 @@ msgstr "Die folgenden Werte existieren nicht für {0}: {1}" #: core/doctype/user_type/user_type.py:88 msgid "The limit has not set for the user type {0} in the site config file." -msgstr "" +msgstr "Das Limit für den Benutzertyp {0} in der Seitenkonfigurationsdatei wurde nicht gesetzt." #: templates/emails/login_with_email_link.html:21 msgid "The link will expire in {0} minutes" @@ -30722,7 +30903,9 @@ msgctxt "Google Settings" msgid "The project number obtained from Google Cloud Console under \n" "\"IAM & Admin\" > \"Settings\"\n" "" -msgstr "" +msgstr "Die Projektnummer aus der Google Cloud Console unter \n" +"\"IAM & Admin\" > \"Einstellungen\"\n" +"" #: core/doctype/user/user.py:943 msgid "The reset password link has been expired" @@ -30742,11 +30925,11 @@ msgstr "Die Rolle {0} sollte eine benutzerdefinierte Rolle sein." #: core/doctype/audit_trail/audit_trail.py:45 msgid "The selected document {0} is not a {1}." -msgstr "" +msgstr "Das ausgewählte Dokument {0} ist nicht vom Typ {1}." #: utils/response.py:321 msgid "The system is being updated. Please refresh again after a few moments." -msgstr "" +msgstr "Das System wird gerade aktualisiert. Bitte probieren Sie es nach einigen Augenblicken erneut." #: public/js/frappe/form/grid_row.js:615 msgid "The total column width cannot be more than 10." @@ -30754,7 +30937,7 @@ msgstr "Die Gesamtbreite aller Spalten darf nicht mehr als 10 sein." #: core/doctype/user_type/user_type.py:96 msgid "The total number of user document types limit has been crossed." -msgstr "" +msgstr "Das Limit für die Gesamtzahl der Benutzerdokumenttypen wurde überschritten." #. Description of the 'User Field' (Select) field in DocType 'Energy Point #. Rule' @@ -30765,7 +30948,7 @@ msgstr "Der Benutzer aus diesem Feld erhält Punkte" #: public/js/frappe/form/controls/data.js:24 msgid "The value you pasted was {0} characters long. Max allowed characters is {1}." -msgstr "" +msgstr "Der Wert, den Sie eingefügt haben, war {0} Zeichen lang. Die maximal erlaubten Zeichen sind {1}." #. Description of the 'Condition' (Small Text) field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -30872,7 +31055,7 @@ msgstr "Hier gibt es nichts" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "These settings are required if 'Custom' LDAP Directory is used" -msgstr "" +msgstr "Diese Einstellungen sind erforderlich, wenn das 'Benutzerdefinierte' LDAP-Verzeichnis verwendet wird" #. Description of the 'Defaults' (Section Break) field in DocType 'User' #: core/doctype/user/user.json @@ -30928,7 +31111,7 @@ msgstr "Dieses Diagramm steht allen Benutzern zur Verfügung, wenn dies festgele #: desk/doctype/workspace/workspace.js:23 msgid "This document allows you to edit limited fields. For all kinds of workspace customization, use the Edit button located on the workspace page" -msgstr "" +msgstr "In diesem Dokument können Sie begrenzte Felder bearbeiten. Für alle Arten von Anpassungen des Arbeitsbereichs verwenden Sie die Schaltfläche Bearbeiten auf der Seite des Arbeitsbereichs" #: social/doctype/energy_point_log/energy_point_log.py:90 msgid "This document cannot be reverted" @@ -30957,7 +31140,8 @@ msgstr "Diese E-Mail wurde automatisch generiert" #: printing/doctype/network_printer_settings/network_printer_settings.py:29 msgid "This feature can not be used as dependencies are missing.\n" "\t\t\t\tPlease contact your system manager to enable this by installing pycups!" -msgstr "" +msgstr "Diese Funktion kann nicht verwendet werden, da die Abhängigkeiten fehlen.\n" +"\t\t\t\tBitte wenden Sie sich an Ihren Systemmanager, um diese Funktion durch die Installation von pycups zu aktivieren!" #. Description of the 'Depends On' (Code) field in DocType 'Customize Form #. Field' @@ -30967,11 +31151,14 @@ msgid "This field will appear only if the fieldname defined here has value OR th "myfield\n" "eval:doc.myfield=='My Value'\n" "eval:doc.age>18" -msgstr "" +msgstr "Dieses Feld wird nur angezeigt, wenn der hier definierte Feldname Wert hat oder die Regeln wahr sind (Beispiele):\n" +"myfield\n" +"eval:doc.myfield=='Mein Wert'\n" +"eval:doc.age>18" #: core/doctype/file/file.js:10 msgid "This file is public. It can be accessed without authentication." -msgstr "" +msgstr "Diese Datei ist öffentlich. Sie kann ohne Authentifizierung aufgerufen werden." #: public/js/frappe/form/form.js:1172 msgid "This form has been modified after you have loaded it" @@ -31012,7 +31199,7 @@ msgstr "Dies ist ein sehr verbreitetes Passwort." #: core/doctype/rq_job/rq_job.js:9 msgid "This is a virtual doctype and data is cleared periodically." -msgstr "" +msgstr "Dies ist ein virtueller Dokumenttyp und die Daten werden regelmäßig gelöscht." #: templates/emails/auto_reply.html:5 msgid "This is an automatically generated reply" @@ -31058,7 +31245,7 @@ msgstr "Dieser Newsletter wird voraussichtlich am {0} verschickt" #: email/doctype/newsletter/newsletter.js:50 msgid "This newsletter was scheduled to send on a later date. Are you sure you want to send it now?" -msgstr "" +msgstr "Der Versand dieses Newsletters war zu einem späteren Zeitpunkt geplant. Sind Sie sicher, dass Sie es jetzt senden möchten?" #: templates/emails/auto_email_report.html:57 msgid "This report was generated on {0}" @@ -31074,7 +31261,7 @@ msgstr "Diese Anfrage wurde vom Benutzer noch nicht genehmigt." #: templates/includes/navbar/navbar_items.html:95 msgid "This site is in read only mode, full functionality will be restored soon." -msgstr "" +msgstr "Diese Instanz erlaubt derzeit nur lesenden Zugriff. Die volle Funktionalität wird bald wiederhergestellt werden." #: core/doctype/doctype/doctype.js:76 msgid "This site is running in developer mode. Any change made here will be updated in code." @@ -31593,14 +31780,16 @@ msgstr "An Benutzer" msgctxt "Auto Repeat" msgid "To add dynamic subject, use jinja tags like\n\n" "
    New {{ doc.doctype }} #{{ doc.name }}
    " -msgstr "" +msgstr "Um einen dynamischen Betreff hinzuzufügen, verwenden Sie Jinja-Tags wie\n\n" +"
    Neu {{ doc.doctype }} #{{ doc.name }}
    " #. Description of the 'Subject' (Data) field in DocType 'Notification' #: email/doctype/notification/notification.json msgctxt "Notification" msgid "To add dynamic subject, use jinja tags like\n\n" "
    {{ doc.name }} Delivered
    " -msgstr "" +msgstr "Um einen dynamischen Betreff hinzuzufügen, verwenden Sie Jinja-Tags wie\n\n" +"
    {{ doc.name }} Delivered
    " #. Description of the 'JSON Request Body' (Code) field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -31610,11 +31799,15 @@ msgid "To add dynamic values from the document, use jinja tags like\n\n" "
    { \"id\": \"{{ doc.name }}\" }\n"
     "
    \n" "" -msgstr "" +msgstr "Um dynamische Werte aus dem Dokument hinzuzufügen, verwenden Sie Jinja-Tags wie\n\n" +"
    \n" +"
    { \"id\": \"{{ doc.name }}\" }\n"
    +"
    \n" +"
    " #: email/doctype/auto_email_report/auto_email_report.py:101 msgid "To allow more reports update limit in System Settings." -msgstr "" +msgstr "Um mehr Berichte zuzulassen, aktualisieren Sie das Limit in den Systemeinstellungen." #. Label of a Section Break field in DocType 'Communication' #: core/doctype/communication/communication.json @@ -31632,7 +31825,7 @@ msgstr "Befolgen Sie zum Aktivieren die Anweisungen unter folgendem Link: {0}" #: desk/doctype/onboarding_step/onboarding_step.js:18 msgid "To export this step as JSON, link it in a Onboarding document and save the document." -msgstr "" +msgstr "Um diesen Schritt als JSON zu exportieren, verknüpfen Sie ihn in einem Onboarding-Dokument und speichern das Dokument." #: public/js/frappe/views/reports/query_report.js:783 msgid "To get the updated report, click on {0}." @@ -31640,17 +31833,17 @@ msgstr "Klicken Sie auf {0}, um den aktualisierten Bericht abzurufen." #: www/me.html:51 msgid "To manage your authorized third party apps" -msgstr "" +msgstr "Um Ihre autorisierten Drittanbieter-Apps zu verwalten" #. Description of the 'Console' (Code) field in DocType 'System Console' #: desk/doctype/system_console/system_console.json msgctxt "System Console" msgid "To print output use print(text)" -msgstr "" +msgstr "Um die Ausgabe zu drucken, verwenden Sie print(text)" #: core/doctype/user_type/user_type.py:295 msgid "To set the role {0} in the user {1}, kindly set the {2} field as {3} in one of the {4} record." -msgstr "" +msgstr "Um die Rolle {0} im Benutzer {1} festzulegen, legen Sie bitte das Feld {2} als {3} in einem der Datensätze {4} fest." #: integrations/doctype/google_calendar/google_calendar.js:8 msgid "To use Google Calendar, enable {0}." @@ -31669,17 +31862,17 @@ msgstr "Aktivieren Sie {0}, um Google Drive zu verwenden." #: website/doctype/website_settings/website_settings.json msgctxt "Website Settings" msgid "To use Google Indexing, enable Google Settings." -msgstr "" +msgstr "Um die Google-Indizierung zu verwenden, aktivieren Sie die Google-Einstellungen." #. Description of the 'Slack Channel' (Link) field in DocType 'Notification' #: email/doctype/notification/notification.json msgctxt "Notification" msgid "To use Slack Channel, add a Slack Webhook URL." -msgstr "" +msgstr "Um den Slack Kanal zu verwenden, fügen Sie eine Slack Webhook URL hinzu." #: public/js/frappe/utils/diffview.js:43 msgid "To version" -msgstr "" +msgstr "Zu Version" #. Name of a DocType #. Name of a report @@ -31747,19 +31940,19 @@ msgstr "Zeichen" #. Name of a DocType #: integrations/doctype/token_cache/token_cache.json msgid "Token Cache" -msgstr "" +msgstr "Token Cache" #. Linked DocType in Connected App's connections #: integrations/doctype/connected_app/connected_app.json msgctxt "Connected App" msgid "Token Cache" -msgstr "" +msgstr "Token Cache" #. Linked DocType in User's connections #: core/doctype/user/user.json msgctxt "User" msgid "Token Cache" -msgstr "" +msgstr "Token Cache" #. Label of a Data field in DocType 'Token Cache' #: integrations/doctype/token_cache/token_cache.json @@ -31836,7 +32029,7 @@ msgstr "Oben links" #: templates/emails/energy_points_summary.html:3 msgid "Top Performer" -msgstr "" +msgstr "Top Performer" #: templates/emails/energy_points_summary.html:18 msgid "Top Reviewer" @@ -31918,7 +32111,7 @@ msgstr "Summenzeile" #: core/doctype/error_log/error_log.json msgctxt "Error Log" msgid "Trace ID" -msgstr "" +msgstr "Trace ID" #. Label of a Code field in DocType 'Patch Log' #: core/doctype/patch_log/patch_log.json @@ -31960,7 +32153,7 @@ msgstr "Track gesehen" #: desk/doctype/form_tour/form_tour.json msgctxt "Form Tour" msgid "Track Steps" -msgstr "" +msgstr "Schritte verfolgen" #. Label of a Check field in DocType 'Customize Form' #: custom/doctype/customize_form/customize_form.json @@ -31981,11 +32174,13 @@ msgctxt "Email Account" msgid "Track if your email has been opened by the recipient.\n" "
    \n" "Note: If you're sending to multiple recipients, even if 1 recipient reads the email, it'll be considered \"Opened\"" -msgstr "" +msgstr "Verfolgen Sie, ob Ihre E-Mail vom Empfänger geöffnet wurde.\n" +"
    \n" +"Hinweis: Wenn Sie an mehrere Empfänger senden, gilt die E-Mail auch dann als \"Geöffnet\", wenn nur ein Empfänger sie liest." #: public/js/frappe/utils/utils.js:1744 msgid "Tracking URL generated and copied to clipboard" -msgstr "" +msgstr "Tracking URL generiert und in die Zwischenablage kopiert" #. Label of a Small Text field in DocType 'Transaction Log' #: core/doctype/transaction_log/transaction_log.json @@ -32104,7 +32299,7 @@ msgstr "Primäre Aktion auslösen" #: tests/test_translate.py:55 msgid "Trigger caching" -msgstr "" +msgstr "Caching auslösen" #. Description of the 'Trigger Method' (Data) field in DocType 'Notification' #: email/doctype/notification/notification.json @@ -32259,7 +32454,7 @@ msgstr "Typ" #: public/js/frappe/form/controls/comment.js:78 msgid "Type a reply / comment" -msgstr "" +msgstr "Geben Sie eine Antwort/einen Kommentar ein" #: templates/includes/search_template.html:51 msgid "Type something in the search box to search" @@ -32342,7 +32537,8 @@ msgstr "UNGESEHEN" msgctxt "OAuth Client" msgid "URIs for receiving authorization code once the user allows access, as well as failure responses. Typically a REST endpoint exposed by the Client App.\n" "
    e.g. http://hostname/api/method/frappe.integrations.oauth2_logins.login_via_facebook" -msgstr "" +msgstr "URIs für den Empfang des Autorisierungscodes, sobald der Benutzer den Zugriff erlaubt, sowie für Fehlerantworten. In der Regel ein REST-Endpunkt, der von der Client-App bereitgestellt wird.\n" +"
    z.B. http://hostname/api/method/frappe.integrations.oauth2_logins.login_via_facebook" #. Label of a Small Text field in DocType 'Integration Request' #: integrations/doctype/integration_request/integration_request.json @@ -32417,7 +32613,7 @@ msgstr "Das Dateiformat für {0} kann nicht gelesen werden" #: core/doctype/communication/email.py:173 msgid "Unable to send mail because of a missing email account. Please setup default Email Account from Settings > Email Account" -msgstr "" +msgstr "Sie können keine E-Mail senden, weil ein E-Mail-Konto fehlt. Bitte richten Sie ein Standard-E-Mail-Konto unter Einstellungen > E-Mail-Konto ein." #: public/js/frappe/views/calendar/calendar.js:439 msgid "Unable to update event" @@ -32498,7 +32694,7 @@ msgstr "Unbekannte Datei-Codierung. Folgende Verfahren wurden ausprobiert: UTF-8 #: core/doctype/submission_queue/submission_queue.js:7 msgid "Unlock Reference Document" -msgstr "" +msgstr "Referenzdokument entsperren" #: website/doctype/blog_post/blog_post.js:36 #: website/doctype/web_form/web_form.js:77 @@ -32614,7 +32810,7 @@ msgstr "Aktualisieren" #: core/doctype/document_naming_settings/document_naming_settings.json msgctxt "Document Naming Settings" msgid "Update Amendment Naming" -msgstr "" +msgstr "Benennung aktualisieren" #: public/js/frappe/views/workspace/workspace.js:596 msgid "Update Details" @@ -32725,11 +32921,11 @@ msgstr "Aktualisierung läuft" #: email/doctype/email_queue/email_queue.py:406 msgid "Updating Email Queue Statuses. The emails will be picked up in the next scheduled run." -msgstr "" +msgstr "Aktualisieren des Status der E-Mail-Warteschlange. Die E-Mails werden beim nächsten geplanten Lauf abgeholt." #: core/doctype/document_naming_rule/document_naming_rule.js:17 msgid "Updating counter may lead to document name conflicts if not done properly" -msgstr "" +msgstr "Aktualisierungszähler kann zu Dokumentennamenskonflikten führen, wenn sie nicht ordnungsgemäß ausgeführt werden" #: desk/page/setup_wizard/setup_wizard.py:23 msgid "Updating global settings" @@ -32741,7 +32937,7 @@ msgstr "Optionen für Nummernkreise werden aktualisiert" #: public/js/frappe/form/toolbar.js:126 msgid "Updating related fields..." -msgstr "" +msgstr "Aktualisiere zugehörige Felder..." #: desk/doctype/bulk_update/bulk_update.py:98 msgid "Updating {0}" @@ -32774,7 +32970,7 @@ msgstr "Auf Google Drive hochgeladen" #, python-format msgctxt "Onboarding Step" msgid "Use % for any non empty value." -msgstr "" +msgstr "Verwenden Sie % für jeden nicht leeren Wert." #. Label of a Check field in DocType 'Email Account' #: email/doctype/email_account/email_account.json @@ -32880,7 +33076,7 @@ msgstr "Verwenden Sie diesen Feldnamen, um den Titel zu erzeugen" #: core/doctype/user_email/user_email.json msgctxt "User Email" msgid "Used OAuth" -msgstr "" +msgstr "OAuh verwendet" #. Name of a DocType #: core/doctype/user/user.json @@ -33071,7 +33267,7 @@ msgstr "Benutzeraktivitätsbericht" #. Name of a DocType #: core/doctype/report/user_activity_report_without_sort.json msgid "User Activity Report Without Sort" -msgstr "" +msgstr "Benutzeraktivitätsbericht ohne Sortierung" #. Label of a Data field in DocType 'Web Page View' #: website/doctype/web_page_view/web_page_view.json @@ -33171,7 +33367,7 @@ msgstr "Benutzer-Id-Feld" #: core/doctype/user_type/user_type.py:287 msgid "User Id Field is mandatory in the user type {0}" -msgstr "" +msgstr "Benutzer-Id Feld ist obligatorisch in der Benutzerart {0}" #. Label of a Attach Image field in DocType 'User' #: core/doctype/user/user.json @@ -33291,7 +33487,7 @@ msgstr "Benutzer existiert nicht" #: core/doctype/user_type/user_type.py:82 msgid "User does not have permission to create the new {0}" -msgstr "" +msgstr "Der Benutzer hat keine Berechtigung zum Erstellen der neuen {0}" #: core/doctype/docshare/docshare.py:55 msgid "User is mandatory for Share" @@ -33317,7 +33513,7 @@ msgstr "Benutzer mit E-Mail-Adresse {0} existiert nicht" #: integrations/doctype/ldap_settings/ldap_settings.py:224 msgid "User with email: {0} does not exist in the system. Please ask 'System Administrator' to create the user for you." -msgstr "" +msgstr "Ein Benutzer mit der E-Mail-Adresse {0} existiert nicht im System. Bitten Sie den 'Systemadministrator', den Benutzer für Sie anzulegen." #: core/doctype/user/user.py:504 msgid "User {0} cannot be deleted" @@ -33350,13 +33546,13 @@ msgstr "Benutzer {0} ist deaktiviert" #: desk/form/assign_to.py:101 msgid "User {0} is not permitted to access this document." -msgstr "" +msgstr "Der Benutzer {0} ist nicht berechtigt, auf dieses Dokument zuzugreifen." #. Label of a Data field in DocType 'Connected App' #: integrations/doctype/connected_app/connected_app.json msgctxt "Connected App" msgid "Userinfo URI" -msgstr "" +msgstr "Benutzerinfo URI" #: www/login.py:99 msgid "Username" @@ -33403,7 +33599,7 @@ msgstr "Benutzer mit Rolle {0}:" #: public/js/frappe/ui/theme_switcher.js:70 msgid "Uses system's theme to switch between light and dark mode" -msgstr "" +msgstr "Verwendet das Systemdesign, um zwischen hellem und dunklem Modus zu wechseln" #: public/js/frappe/desk.js:112 msgid "Using this console may allow attackers to impersonate you and steal your information. Do not enter or paste code that you do not understand." @@ -33638,7 +33834,7 @@ msgstr "Alle ansehen" #: public/js/frappe/form/toolbar.js:507 msgid "View Audit Trail" -msgstr "" +msgstr "Prüfprotokoll anzeigen" #: templates/includes/likes/likes.py:34 msgid "View Blog Post" @@ -33749,11 +33945,11 @@ msgstr "Virtuell" #: model/virtual_doctype.py:78 msgid "Virtual DocType {} requires a static method called {} found {}" -msgstr "" +msgstr "Virtueller DocType {} benötigt eine statische Methode namens {} gefunden {}" #: model/virtual_doctype.py:91 msgid "Virtual DocType {} requires overriding an instance method called {} found {}" -msgstr "" +msgstr "Der virtuelle DocType {} erfordert das Überschreiben einer Instanzmethode namens {} gefunden {}" #. Label of a Section Break field in DocType 'DocField' #: core/doctype/docfield/docfield.json @@ -33779,7 +33975,7 @@ msgstr "Besucher-ID" #: templates/discussions/reply_section.html:38 msgid "Want to discuss?" -msgstr "" +msgstr "Möchten Sie mitreden?" #. Option for the 'Address Type' (Select) field in DocType 'Address' #: contacts/doctype/address/address.json @@ -33801,7 +33997,7 @@ msgstr "Warnung: {0} kann in keiner Tabelle zu {1} gefunden werden" #: core/doctype/document_naming_rule/document_naming_rule.json msgctxt "Document Naming Rule" msgid "Warning: Updating counter may lead to document name conflicts if not done properly" -msgstr "" +msgstr "Warnung: Die Aktualisierung des Zählers kann zu Konflikten bei den Dokumentennamen führen, wenn sie nicht ordnungsgemäß durchgeführt wird." #: website/doctype/help_article/templates/help_article.html:24 msgid "Was this article helpful?" @@ -33815,7 +34011,7 @@ msgstr "Schau Video" #: desk/doctype/workspace/workspace.js:38 msgid "We do not allow editing of this document. Simply click the Edit button on the workspace page to make your workspace editable and customize it as you wish" -msgstr "" +msgstr "Wir erlauben keine Bearbeitung dieses Dokuments. Klicken Sie einfach auf die Schaltfläche Bearbeiten auf der Arbeitsbereichsseite, um Ihren Arbeitsbereich bearbeitbar zu machen und ihn nach Ihren Wünschen anzupassen." #: templates/emails/delete_data_confirmation.html:2 msgid "We have received a request for deletion of {0} data associated with: {1}" @@ -33867,7 +34063,7 @@ msgstr "Web-Formularfelder" #. Name of a DocType #: website/doctype/web_form_list_column/web_form_list_column.json msgid "Web Form List Column" -msgstr "" +msgstr "Web-Formular-Listenspalte" #. Name of a DocType #: website/doctype/web_page/web_page.json @@ -33936,7 +34132,7 @@ msgstr "Webvorlagenwerte" #: utils/jinja_globals.py:48 msgid "Web Template is not specified" -msgstr "" +msgstr "Web-Vorlage ist nicht angegeben" #. Label of a Section Break field in DocType 'DocType' #: core/doctype/doctype/doctype.json @@ -33981,7 +34177,7 @@ msgstr "Webhook Daten" #. Name of a DocType #: integrations/doctype/webhook_header/webhook_header.json msgid "Webhook Header" -msgstr "" +msgstr "Webhook-Kopfzeile" #. Label of a Section Break field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -33998,13 +34194,13 @@ msgstr "Webhook Anfrage" #. Name of a DocType #: integrations/doctype/webhook_request_log/webhook_request_log.json msgid "Webhook Request Log" -msgstr "" +msgstr "Webhook-Anfrage-Protokoll" #. Linked DocType in Webhook's connections #: integrations/doctype/webhook/webhook.json msgctxt "Webhook" msgid "Webhook Request Log" -msgstr "" +msgstr "Webhook-Anfrage-Protokoll" #. Label of a Password field in DocType 'Webhook' #: integrations/doctype/webhook/webhook.json @@ -34045,7 +34241,7 @@ msgstr "Webseite" #. Name of a report #: website/report/website_analytics/website_analytics.json msgid "Website Analytics" -msgstr "" +msgstr "Website-Analysen" #. Name of a role #: core/doctype/comment/comment.json @@ -34103,11 +34299,11 @@ msgstr "Webseiten-Skript" #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Website Search Field" -msgstr "" +msgstr "Website-Suchfeld" #: core/doctype/doctype/doctype.py:1473 msgid "Website Search Field must be a valid fieldname" -msgstr "" +msgstr "Website-Suchfeld muss ein gültiger Feldname sein" #. Name of a DocType #: website/doctype/website_settings/website_settings.json @@ -34386,7 +34582,7 @@ msgstr "Wenn diese Option aktiviert ist, können Gäste Dateien in Ihre Bewerbun #: core/doctype/system_settings/system_settings.json msgctxt "System Settings" msgid "When uploading files, force the use of the web-based image capture. If this is unchecked, the default behavior is to use the mobile native camera when use from a mobile is detected." -msgstr "" +msgstr "Erzwingen Sie beim Hochladen von Dateien die Verwendung der webbasierten Bilderfassung. Falls diese Option nicht aktiviert ist, wird standardmäßig die native Kamera des Mobiltelefons verwendet, wenn eine Nutzung von einem Mobiltelefon aus erkannt wird." #: public/js/frappe/widgets/widget_dialog.js:440 msgid "Which view of the associated DocType should this shortcut take you to?" @@ -34475,43 +34671,43 @@ msgstr "Worflow-Stati existieren nicht" #: core/doctype/rq_worker/rq_worker.json msgctxt "RQ Worker" msgid "Worker Information" -msgstr "" +msgstr "Arbeitnehmerinformationen" #. Label of a Data field in DocType 'RQ Worker' #: core/doctype/rq_worker/rq_worker.json msgctxt "RQ Worker" msgid "Worker Name" -msgstr "" +msgstr "Name des Arbeiters" #. Name of a DocType #: workflow/doctype/workflow/workflow.json msgid "Workflow" -msgstr "" +msgstr "Workflow" #. Option for the 'Comment Type' (Select) field in DocType 'Comment' #: core/doctype/comment/comment.json msgctxt "Comment" msgid "Workflow" -msgstr "" +msgstr "Workflow" #. Option for the 'Comment Type' (Select) field in DocType 'Communication' #: core/doctype/communication/communication.json msgctxt "Communication" msgid "Workflow" -msgstr "" +msgstr "Workflow" #. Group in DocType's connections #. Linked DocType in DocType's connections #: core/doctype/doctype/doctype.json msgctxt "DocType" msgid "Workflow" -msgstr "" +msgstr "Workflow" #. Label of a Link in the Build Workspace #: core/workspace/build/build.json msgctxt "Workflow" msgid "Workflow" -msgstr "" +msgstr "Workflow" #. Name of a DocType #: workflow/doctype/workflow_action/workflow_action.json @@ -34533,7 +34729,7 @@ msgstr "Workflow-Aktionsname" #. Name of a DocType #: workflow/doctype/workflow_action_permitted_role/workflow_action_permitted_role.json msgid "Workflow Action Permitted Role" -msgstr "" +msgstr "Zulässige Rolle für Workflow-Aktionen" #. Description of the 'Is Optional State' (Check) field in DocType 'Workflow #. Document State' @@ -34544,29 +34740,29 @@ msgstr "Für optionale Status wird keine Workflow-Aktion erstellt" #: workflow/page/workflow_builder/workflow_builder.js:4 msgid "Workflow Builder" -msgstr "" +msgstr "Workflow-Generator" #. Label of a Data field in DocType 'Workflow Document State' #: workflow/doctype/workflow_document_state/workflow_document_state.json msgctxt "Workflow Document State" msgid "Workflow Builder ID" -msgstr "" +msgstr "Workflow-Generator-ID" #. Label of a Data field in DocType 'Workflow Transition' #: workflow/doctype/workflow_transition/workflow_transition.json msgctxt "Workflow Transition" msgid "Workflow Builder ID" -msgstr "" +msgstr "Workflow-Generator-ID" #: workflow/doctype/workflow/workflow.js:11 msgid "Workflow Builder allows you to create workflows visually. You can drag and drop states and link them to create transitions. Also you can update thieir properties from the sidebar." -msgstr "" +msgstr "Mit dem Workflow-Generator können Sie Arbeitsabläufe visuell erstellen. Sie können Zustände per Drag-and-Drop verschieben und sie miteinander verknüpfen, um Übergänge zu erstellen. Außerdem können Sie ihre Eigenschaften über die Seitenleiste aktualisieren." #. Label of a JSON field in DocType 'Workflow' #: workflow/doctype/workflow/workflow.json msgctxt "Workflow" msgid "Workflow Data" -msgstr "" +msgstr "Workflow-Daten" #. Name of a DocType #: workflow/doctype/workflow_document_state/workflow_document_state.json @@ -34616,7 +34812,7 @@ msgstr "Workflow-Übergang" #. Description of the Onboarding Step 'Setup Approval Workflows' #: custom/onboarding_step/workflows/workflows.json msgid "Workflows allow you to define custom rules for the approval process of a particular document in ERPNext. You can also set complex Workflow Rules and set approval conditions." -msgstr "" +msgstr "Mit Workflows können Sie benutzerdefinierte Regeln für den Genehmigungsprozess eines bestimmten Dokuments in ERPNext festlegen. Sie können auch komplexe Workflow-Regeln aufstellen und Genehmigungsbedingungen festlegen." #. Name of a DocType #: desk/doctype/workspace/workspace.json @@ -34670,7 +34866,7 @@ msgstr "Arbeitsbereich-Nummernkarte" #. Name of a DocType #: desk/doctype/workspace_quick_list/workspace_quick_list.json msgid "Workspace Quick List" -msgstr "" +msgstr "Arbeitsbereich-Schnellliste" #. Name of a DocType #: desk/doctype/workspace_shortcut/workspace_shortcut.json @@ -34679,15 +34875,15 @@ msgstr "Arbeitsbereich-Verknüpfung" #: public/js/frappe/views/workspace/workspace.js:1265 msgid "Workspace {0} Created Successfully" -msgstr "" +msgstr "Arbeitsbereich {0} erfolgreich erstellt" #: public/js/frappe/views/workspace/workspace.js:894 msgid "Workspace {0} Deleted Successfully" -msgstr "" +msgstr "Arbeitsbereich {0} erfolgreich gelöscht" #: public/js/frappe/views/workspace/workspace.js:672 msgid "Workspace {0} Edited Successfully" -msgstr "" +msgstr "Arbeitsbereich {0} erfolgreich bearbeitet" #. Option for the 'View' (Select) field in DocType 'Form Tour' #: desk/doctype/form_tour/form_tour.json @@ -34893,7 +35089,7 @@ msgstr "Benutzer" #: public/js/frappe/form/footer/form_timeline.js:462 msgid "You Liked" -msgstr "" +msgstr "Ihnen gefällt" #: public/js/frappe/dom.js:425 msgid "You are connected to internet." @@ -34905,7 +35101,7 @@ msgstr "Sie haben keine Berechtigung, auf diesen Eintrag in {0} zuzugreifen, da #: permissions.py:406 msgid "You are not allowed to access this {0} record because it is linked to {1} '{2}' in row {3}, field {4}" -msgstr "" +msgstr "Sie können auf diesen Datensatz {0} nicht zugreifen, da er mit {1} '{2}' in Zeile {3}, Feld {4} verknüpft ist" #: public/js/frappe/views/kanban/kanban_board.bundle.js:69 msgid "You are not allowed to create columns" @@ -34921,7 +35117,7 @@ msgstr "Sie sind nicht berechtigt, eine Standard-Webseiten-Vorlage zu löschen" #: core/doctype/report/report.py:380 msgid "You are not allowed to edit the report." -msgstr "" +msgstr "Sie sind nicht berechtigt, den Bericht zu bearbeiten." #: permissions.py:614 msgid "You are not allowed to export {} doctype" @@ -34945,7 +35141,7 @@ msgstr "Sie sind nicht mit dem Internet verbunden. Versuchen Sie es später erne #: public/js/frappe/web_form/webform_script.js:22 msgid "You are not permitted to access this page without login." -msgstr "" +msgstr "Sie sind nicht berechtigt, ohne Anmeldung auf diese Seite zuzugreifen." #: www/app.py:25 msgid "You are not permitted to access this page." @@ -34965,7 +35161,7 @@ msgstr "Sie können nur die Reihenfolge verändern, keine Anwendungen entfernen #: email/doctype/email_account/email_account.js:221 msgid "You are selecting Sync Option as ALL, It will resync all read as well as unread message from server. This may also cause the duplication of Communication (emails)." -msgstr "" +msgstr "Sie wählen als Synchronisierungsoption „ALLE“ aus. Dadurch werden alle gelesenen und ungelesenen Nachrichten vom Server neu synchronisiert. Dies kann auch zu einer Duplizierung der Kommunikation (E-Mails) führen." #: public/js/frappe/form/footer/form_timeline.js:413 msgctxt "Form timeline" @@ -34990,7 +35186,7 @@ msgstr "Sie können diese {0} auch kopieren und in Ihren Browser einfügen" #: public/js/frappe/logtypes.js:21 msgid "You can change the retention policy from {0}." -msgstr "" +msgstr "Sie können die Aufbewahrungsrichtlinie unter {0} ändern." #: public/js/frappe/widgets/onboarding_widget.js:199 msgid "You can continue with the onboarding after exploring this page" @@ -35364,7 +35560,7 @@ msgstr "Null bedeutet, dass Sendeaufzeichnungen jederzeit aktualisiert werden" #: desk/doctype/desktop_icon/desktop_icon.json msgctxt "Desktop Icon" msgid "_doctype" -msgstr "" +msgstr "_doctype" #. Label of a Link field in DocType 'Desktop Icon' #: desk/doctype/desktop_icon/desktop_icon.json @@ -35374,11 +35570,11 @@ msgstr "_Bericht" #: utils/background_jobs.py:94 msgid "`job_id` paramater is required for deduplication." -msgstr "" +msgstr "Der Parameter `job_id` ist für die Deduplizierung erforderlich." #: public/js/frappe/form/footer/version_timeline_content_builder.js:219 msgid "added rows for {0}" -msgstr "" +msgstr "Zeilen für {0} hinzugefügt" #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json @@ -35622,7 +35818,7 @@ msgstr "bereinigen" #: workflow/doctype/workflow_state/workflow_state.json msgctxt "Workflow State" msgid "cog" -msgstr "" +msgstr "cog" #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json @@ -35646,7 +35842,7 @@ msgstr "türkis" #: public/js/frappe/utils/utils.js:1113 msgctxt "Days (Field: Duration)" msgid "d" -msgstr "" +msgstr "T" #. Option for the 'Indicator Color' (Select) field in DocType 'Workspace' #: desk/doctype/workspace/workspace.json @@ -35719,7 +35915,7 @@ msgstr "herunterladen" #: workflow/doctype/workflow_state/workflow_state.json msgctxt "Workflow State" msgid "download-alt" -msgstr "" +msgstr "download-alt" #. Description of the 'Email Account Name' (Data) field in DocType 'Email #. Account' @@ -35979,7 +36175,7 @@ msgstr "grau" #: utils/backups.py:375 msgid "gzip not found in PATH! This is required to take a backup." -msgstr "" +msgstr "gzip nicht in PATH gefunden! Dies ist erforderlich, um ein Backup zu erstellen." #: public/js/frappe/utils/utils.js:1117 msgctxt "Hours (Field: Duration)" @@ -36342,7 +36538,7 @@ msgstr "eine(r/s) von" #: utils/data.py:1535 msgid "only." -msgstr "nur." +msgstr "." #: public/js/frappe/utils/utils.js:393 www/login.html:87 msgid "or" @@ -36515,7 +36711,7 @@ msgstr "Entfernen-Zeichen" #: public/js/frappe/form/footer/version_timeline_content_builder.js:221 msgid "removed rows for {0}" -msgstr "" +msgstr "entfernte Zeilen für {0}" #: model/rename_doc.py:217 msgid "renamed from {0} to {1}" @@ -36583,7 +36779,7 @@ msgstr "Straße" #: public/js/frappe/utils/utils.js:1125 msgctxt "Seconds (Field: Duration)" msgid "s" -msgstr "" +msgstr "Sek" #. Option for the 'Code challenge method' (Select) field in DocType 'OAuth #. Authorization Code' @@ -36721,21 +36917,21 @@ msgstr "halt" #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "string value, i.e. group" -msgstr "" +msgstr "String-Wert, z. B. Gruppe" #. Description of the 'LDAP Group Member attribute' (Data) field in DocType #. 'LDAP Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "string value, i.e. member" -msgstr "" +msgstr "String-Wert, z. B. Mitglied" #. Description of the 'Custom Group Search' (Data) field in DocType 'LDAP #. Settings' #: integrations/doctype/ldap_settings/ldap_settings.json msgctxt "LDAP Settings" msgid "string value, i.e. {0} or uid={0},ou=users,dc=example,dc=com" -msgstr "" +msgstr "String-Wert, z.B {0} oder uid={0},ou=users,dc=example,dc=com" #. Option for the 'Permission Type' (Select) field in DocType 'Permission #. Inspector' @@ -36786,19 +36982,19 @@ msgstr "Textbreite" #: workflow/doctype/workflow_state/workflow_state.json msgctxt "Workflow State" msgid "th" -msgstr "" +msgstr "th" #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json msgctxt "Workflow State" msgid "th-large" -msgstr "" +msgstr "th-large" #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json msgctxt "Workflow State" msgid "th-list" -msgstr "" +msgstr "th-list" #: public/js/frappe/form/controls/data.js:35 msgid "this form" @@ -36806,7 +37002,7 @@ msgstr "dieses Formular" #: tests/test_translate.py:158 msgid "this shouldn't break" -msgstr "" +msgstr "das sollte nicht kaputt gehen" #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json @@ -36869,7 +37065,7 @@ msgstr "Werte durch Komma getrennt" #: core/doctype/audit_trail/audit_trail.json msgctxt "Audit Trail" msgid "version_table" -msgstr "" +msgstr "version_table" #: automation/doctype/assignment_rule/assignment_rule.py:386 msgid "via Assignment Rule" @@ -36918,7 +37114,7 @@ msgstr "Lautstärke erhöhen" #: templates/includes/oauth_confirmation.html:5 msgid "wants to access the following details from your account" -msgstr "" +msgstr "möchte auf folgende Details von Ihrem Konto zugreifen" #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json @@ -36931,7 +37127,7 @@ msgstr "Warnschild" #: desk/doctype/form_tour_step/form_tour_step.json msgctxt "Form Tour Step" msgid "when clicked on element it will focus popover if present." -msgstr "" +msgstr "wenn Sie auf ein Element klicken, wird das Popover aktiviert, falls vorhanden." #. Option for the 'Icon' (Select) field in DocType 'Workflow State' #: workflow/doctype/workflow_state/workflow_state.json @@ -36977,25 +37173,25 @@ msgstr "verkleinern" #: desk/doctype/event/event.js:83 #: integrations/doctype/google_drive/google_drive.js:19 msgid "{0}" -msgstr "" +msgstr "{0}" #: public/js/frappe/ui/toolbar/search_utils.js:81 #: public/js/frappe/ui/toolbar/search_utils.js:82 msgid "{0} ${label}" -msgstr "" +msgstr "{0} ${label}" #: public/js/frappe/ui/toolbar/search_utils.js:177 msgid "{0} ${skip_list ? \"\" : type}" -msgstr "" +msgstr "{0} ${skip_list ? \"\" : type}" #: public/js/frappe/ui/toolbar/search_utils.js:182 msgid "{0} ${type}" -msgstr "" +msgstr "{0} ${type}" #: public/js/frappe/data_import/data_exporter.js:77 #: public/js/frappe/views/gantt/gantt_view.js:54 msgid "{0} ({1})" -msgstr "" +msgstr "{0} ({1})" #: public/js/frappe/data_import/data_exporter.js:76 msgid "{0} ({1}) (1 row mandatory)" @@ -37003,12 +37199,12 @@ msgstr "{0} ({1}) (1 Zeile obligatorisch)" #: public/js/frappe/views/gantt/gantt_view.js:53 msgid "{0} ({1}) - {2}%" -msgstr "" +msgstr "{0} ({1}) - {2}%" #: public/js/frappe/ui/toolbar/awesome_bar.js:346 #: public/js/frappe/ui/toolbar/awesome_bar.js:349 msgid "{0} = {1}" -msgstr "" +msgstr "{0} = {1}" #: public/js/frappe/views/calendar/calendar.js:29 msgid "{0} Calendar" @@ -37042,7 +37238,7 @@ msgstr "{0} Google-Kontakte synchronisiert" #: public/js/frappe/form/footer/form_timeline.js:463 msgid "{0} Liked" -msgstr "" +msgstr "{0} Gefällt mir" #: public/js/frappe/utils/utils.js:923 #: public/js/frappe/widgets/chart_widget.js:317 www/list.html:4 www/list.html:8 @@ -37051,7 +37247,7 @@ msgstr "{0} Liste" #: public/js/frappe/utils/pretty_date.js:37 msgid "{0} M" -msgstr "" +msgstr "{0} M" #: public/js/frappe/views/map/map_view.js:14 msgid "{0} Map" @@ -37063,11 +37259,11 @@ msgstr "{0} Module" #: public/js/frappe/form/quick_entry.js:113 msgid "{0} Name" -msgstr "" +msgstr "{0} ID" #: model/base_document.py:1027 msgid "{0} Not allowed to change {1} after submission from {2} to {3}" -msgstr "" +msgstr "{0} Es ist nicht erlaubt, {1} nach dem Buchen von {2} auf {3} zu ändern" #: public/js/frappe/utils/utils.js:920 #: public/js/frappe/widgets/chart_widget.js:325 @@ -37182,11 +37378,11 @@ msgstr "{0} hat folgende Werte geändert: {1} {2}" #: public/js/frappe/form/footer/version_timeline_content_builder.js:186 msgid "{0} changed the values for {1}" -msgstr "" +msgstr "{0} hat die Werte für {1} geändert" #: public/js/frappe/form/footer/version_timeline_content_builder.js:177 msgid "{0} changed the values for {1} {2}" -msgstr "" +msgstr "{0} hat die Werte für {1} {2} geändert" #: public/js/frappe/form/footer/form_timeline.js:443 msgctxt "Form timeline" @@ -37208,11 +37404,11 @@ msgstr "Von {0} erstellt" #: public/js/frappe/form/sidebar/review.js:154 msgid "{0} criticism point for {1}" -msgstr "" +msgstr "{0} Kritikpunkt für {1}" #: public/js/frappe/form/sidebar/review.js:156 msgid "{0} criticism points for {1}" -msgstr "" +msgstr "{0} Kritikpunkte für {1}" #: public/js/frappe/utils/energy_point_utils.js:41 msgid "{0} criticized on {1}" @@ -37234,7 +37430,7 @@ msgstr "{0} kritisiert {1}" #: public/js/frappe/utils/pretty_date.js:33 msgid "{0} d" -msgstr "" +msgstr "{0} d" #: public/js/frappe/utils/pretty_date.js:60 msgid "{0} days ago" @@ -37251,7 +37447,7 @@ msgstr "Feld {0} kann in {1} nicht als einzigartig gesetzt werden, da es nicht-e #: core/doctype/data_import/importer.py:1017 msgid "{0} format could not be determined from the values in this column. Defaulting to {1}." -msgstr "" +msgstr "Das {0} Format konnte nicht von den Werten in dieser Spalte bestimmt werden. Standard ist {1}." #: public/js/frappe/form/footer/version_timeline_content_builder.js:97 msgid "{0} from {1} to {2}" @@ -37397,11 +37593,11 @@ msgstr "{0} ist kein gültiger Workflow-Status. Bitte aktualisieren Sie Ihren Wo #: permissions.py:795 msgid "{0} is not a valid parent DocType for {1}" -msgstr "" +msgstr "{0} ist kein gültiger übergeordneter DocType für {1}" #: permissions.py:815 msgid "{0} is not a valid parentfield for {1}" -msgstr "" +msgstr "{0} ist kein gültiges übergeordnetes Feld für {1}" #: email/doctype/auto_email_report/auto_email_report.py:109 msgid "{0} is not a valid report format. Report format should one of the following {1}" @@ -37500,7 +37696,8 @@ msgstr "{0} muss einmalig sein" #: core/doctype/language/language.py:42 msgid "{0} must begin and end with a letter and can only contain letters,\n" "\t\t\t\thyphen or underscore." -msgstr "" +msgstr "{0} muss mit einem Buchstaben beginnen und enden und darf nur Buchstaben,\n" +"\t\t\t\tBindestriche oder Unterstriche enthalten." #: workflow/doctype/workflow/workflow.py:93 msgid "{0} not a valid State" @@ -37536,7 +37733,7 @@ msgstr "{0} Datensatz gelöscht" #: public/js/frappe/logtypes.js:22 msgid "{0} records are not automatically deleted." -msgstr "" +msgstr "{0} Datensätze werden nicht automatisch gelöscht." #: public/js/frappe/logtypes.js:29 msgid "{0} records are retained for {1} days." @@ -37596,7 +37793,7 @@ msgstr "{0} teilte dieses Dokument mit {1}" #: core/doctype/doctype/doctype.py:320 msgid "{0} should be indexed because it's referred in dashboard connections" -msgstr "" +msgstr "{0} sollte indiziert werden, da es in Dashboard-Verknüpfungen verwendet wird" #: automation/doctype/auto_repeat/auto_repeat.py:136 msgid "{0} should not be same as {1}" @@ -37644,7 +37841,7 @@ msgstr "Von {0} angesehen" #: public/js/frappe/utils/pretty_date.js:35 msgid "{0} w" -msgstr "" +msgstr "{0} W" #: public/js/frappe/utils/pretty_date.js:64 msgid "{0} weeks ago" @@ -37652,7 +37849,7 @@ msgstr "vor {0} Woche(n)" #: public/js/frappe/utils/pretty_date.js:39 msgid "{0} y" -msgstr "" +msgstr "{0} J" #: public/js/frappe/utils/pretty_date.js:72 msgid "{0} years ago" @@ -37798,7 +37995,7 @@ msgstr "{0}: {1} ist auf Status {2} festgelegt" #: public/js/frappe/views/reports/query_report.js:1190 msgid "{0}: {1} vs {2}" -msgstr "" +msgstr "{0}: {1} vs {2}" #: core/doctype/doctype/doctype.py:1385 msgid "{0}:Fieldtype {1} for {2} cannot be indexed" @@ -37838,7 +38035,7 @@ msgstr "{} Possibly invalid python code.
    {}" #: core/doctype/log_settings/log_settings.py:54 msgid "{} does not support automated log clearing." -msgstr "" +msgstr "{} unterstützt keine automatische Protokolllöschung." #: core/doctype/audit_trail/audit_trail.py:40 msgid "{} field cannot be empty." diff --git a/frappe/locale/main.pot b/frappe/locale/main.pot index 863603eb01..ae11132373 100644 --- a/frappe/locale/main.pot +++ b/frappe/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Frappe Framework VERSION\n" "Report-Msgid-Bugs-To: developers@frappe.io\n" -"POT-Creation-Date: 2024-01-12 01:53+0053\n" -"PO-Revision-Date: 2024-01-12 01:53+0053\n" +"POT-Creation-Date: 2024-01-29 18:10+0053\n" +"PO-Revision-Date: 2024-01-29 18:10+0053\n" "Last-Translator: developers@frappe.io\n" "Language-Team: developers@frappe.io\n" "MIME-Version: 1.0\n" @@ -188,7 +188,7 @@ msgstr "" msgid "'In Global Search' is not allowed for field {0} of type {1}" msgstr "" -#: core/doctype/doctype/doctype.py:1305 +#: core/doctype/doctype/doctype.py:1301 msgid "'In Global Search' not allowed for type {0} in row {1}" msgstr "" @@ -208,7 +208,7 @@ msgstr "" msgid "'{0}' is not a valid URL" msgstr "" -#: core/doctype/doctype/doctype.py:1299 +#: core/doctype/doctype/doctype.py:1295 msgid "'{0}' not allowed for type {1} in row {2}" msgstr "" @@ -229,7 +229,7 @@ msgctxt "Web Page" msgid "0 is highest" msgstr "" -#: public/js/frappe/form/grid_row.js:786 +#: public/js/frappe/form/grid_row.js:806 msgid "1 = True & 0 = False" msgstr "" @@ -253,7 +253,7 @@ msgstr "" msgid "1 comment" msgstr "" -#: tests/test_utils.py:647 +#: tests/test_utils.py:648 msgid "1 day ago" msgstr "" @@ -261,15 +261,15 @@ msgstr "" msgid "1 hour" msgstr "" -#: public/js/frappe/utils/pretty_date.js:52 tests/test_utils.py:645 +#: public/js/frappe/utils/pretty_date.js:52 tests/test_utils.py:646 msgid "1 hour ago" msgstr "" -#: public/js/frappe/utils/pretty_date.js:48 tests/test_utils.py:643 +#: public/js/frappe/utils/pretty_date.js:48 tests/test_utils.py:644 msgid "1 minute ago" msgstr "" -#: public/js/frappe/utils/pretty_date.js:66 tests/test_utils.py:651 +#: public/js/frappe/utils/pretty_date.js:66 tests/test_utils.py:652 msgid "1 month ago" msgstr "" @@ -277,35 +277,35 @@ msgstr "" msgid "1 record will be exported" msgstr "" -#: tests/test_utils.py:642 +#: tests/test_utils.py:643 msgid "1 second ago" msgstr "" -#: public/js/frappe/utils/pretty_date.js:62 tests/test_utils.py:649 +#: public/js/frappe/utils/pretty_date.js:62 tests/test_utils.py:650 msgid "1 week ago" msgstr "" -#: public/js/frappe/utils/pretty_date.js:70 tests/test_utils.py:653 +#: public/js/frappe/utils/pretty_date.js:70 tests/test_utils.py:654 msgid "1 year ago" msgstr "" -#: tests/test_utils.py:646 +#: tests/test_utils.py:647 msgid "2 hours ago" msgstr "" -#: tests/test_utils.py:652 +#: tests/test_utils.py:653 msgid "2 months ago" msgstr "" -#: tests/test_utils.py:650 +#: tests/test_utils.py:651 msgid "2 weeks ago" msgstr "" -#: tests/test_utils.py:654 +#: tests/test_utils.py:655 msgid "2 years ago" msgstr "" -#: tests/test_utils.py:644 +#: tests/test_utils.py:645 msgid "3 minutes ago" msgstr "" @@ -321,7 +321,7 @@ msgstr "" msgid "5 Records" msgstr "" -#: tests/test_utils.py:648 +#: tests/test_utils.py:649 msgid "5 days ago" msgstr "" @@ -343,7 +343,7 @@ msgctxt "Document Naming Rule Condition" msgid "<=" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:564 +#: public/js/frappe/widgets/widget_dialog.js:570 msgid "{0} is not a valid URL" msgstr "" @@ -715,7 +715,7 @@ msgstr "" msgid "A DocType (Document Type) is used to insert forms in ERPNext. Forms such as Customer, Orders, and Invoices are Doctypes in the backend. You can also create new DocTypes to create new forms in ERPNext as per your business needs." msgstr "" -#: core/doctype/doctype/doctype.py:1015 +#: core/doctype/doctype/doctype.py:1011 msgid "A DocType's name should start with a letter and can only consist of letters, numbers, spaces, underscores and hyphens" msgstr "" @@ -983,7 +983,7 @@ msgctxt "Social Login Key" msgid "Access Token URL" msgstr "" -#: auth.py:444 +#: auth.py:455 msgid "Access not allowed from this IP Address" msgstr "" @@ -1001,7 +1001,7 @@ msgstr "" #. Name of a role #: automation/doctype/auto_repeat/auto_repeat.json -#: contacts/doctype/contact/contact.json +#: contacts/doctype/contact/contact.json geo/doctype/currency/currency.json msgid "Accounts Manager" msgstr "" @@ -1202,9 +1202,9 @@ msgstr "" #: core/page/permission_manager/permission_manager.js:465 #: email/doctype/email_group/email_group.js:60 -#: public/js/frappe/form/grid_row.js:468 +#: public/js/frappe/form/grid_row.js:469 #: public/js/frappe/form/sidebar/assign_to.js:100 -#: public/js/frappe/list/bulk_operations.js:372 +#: public/js/frappe/list/bulk_operations.js:393 #: public/js/frappe/views/dashboard/dashboard_view.js:440 #: public/js/frappe/views/reports/query_report.js:265 #: public/js/frappe/views/reports/query_report.js:293 @@ -1283,7 +1283,7 @@ msgid "Add Custom Tags" msgstr "" #: public/js/frappe/widgets/widget_dialog.js:159 -#: public/js/frappe/widgets/widget_dialog.js:683 +#: public/js/frappe/widgets/widget_dialog.js:689 msgid "Add Filters" msgstr "" @@ -1346,16 +1346,16 @@ msgstr "" msgid "Add Subscribers" msgstr "" -#: public/js/frappe/list/bulk_operations.js:360 +#: public/js/frappe/list/bulk_operations.js:381 msgid "Add Tags" msgstr "" -#: public/js/frappe/list/list_view.js:1834 +#: public/js/frappe/list/list_view.js:1858 msgctxt "Button in list view actions menu" msgid "Add Tags" msgstr "" -#: public/js/frappe/views/communication.js:320 +#: public/js/frappe/views/communication.js:362 msgid "Add Template" msgstr "" @@ -1381,7 +1381,7 @@ msgctxt "Event" msgid "Add Video Conferencing" msgstr "" -#: public/js/frappe/form/form_tour.js:203 +#: public/js/frappe/form/form_tour.js:205 msgid "Add a Row" msgstr "" @@ -1557,7 +1557,7 @@ msgstr "" msgid "Addresses And Contacts" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:536 +#: public/js/frappe/ui/toolbar/search_utils.js:552 msgid "Administration" msgstr "" @@ -1604,8 +1604,8 @@ msgctxt "User Permission" msgid "Advanced Control" msgstr "" -#: public/js/frappe/form/controls/link.js:315 -#: public/js/frappe/form/controls/link.js:317 +#: public/js/frappe/form/controls/link.js:316 +#: public/js/frappe/form/controls/link.js:318 msgid "Advanced Search" msgstr "" @@ -2398,7 +2398,7 @@ msgstr "" msgid "App not found for module: {0}" msgstr "" -#: __init__.py:1677 +#: __init__.py:1731 msgid "App {0} is not installed" msgstr "" @@ -2477,7 +2477,7 @@ msgctxt "Property Setter" msgid "Applied On" msgstr "" -#: public/js/frappe/list/list_view.js:1819 +#: public/js/frappe/list/list_view.js:1843 msgctxt "Button in list view actions menu" msgid "Apply Assignment Rule" msgstr "" @@ -2579,11 +2579,15 @@ msgstr "" msgid "Archived Columns" msgstr "" +#: public/js/frappe/list/list_view.js:1822 +msgid "Are you sure you want to clear the assignments?" +msgstr "" + #: public/js/frappe/form/grid.js:269 msgid "Are you sure you want to delete all rows?" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:885 +#: public/js/frappe/views/workspace/workspace.js:891 msgid "Are you sure you want to delete page {0}?" msgstr "" @@ -2765,10 +2769,6 @@ msgctxt "Assignment Rule" msgid "Assignment Days" msgstr "" -#: automation/doctype/assignment_rule/assignment_rule.py:64 -msgid "Assignment Day{0} {1} has been repeated." -msgstr "" - #. Name of a DocType #: automation/doctype/assignment_rule/assignment_rule.json msgid "Assignment Rule" @@ -2803,7 +2803,7 @@ msgstr "" msgid "Assignment Rule User" msgstr "" -#: automation/doctype/assignment_rule/assignment_rule.py:53 +#: automation/doctype/assignment_rule/assignment_rule.py:54 msgid "Assignment Rule is not allowed on {0} document type" msgstr "" @@ -2835,16 +2835,16 @@ msgctxt "Notification Settings" msgid "Assignments" msgstr "" -#: public/js/frappe/form/grid_row.js:629 +#: public/js/frappe/form/grid_row.js:649 msgid "At least one column is required to show in the grid." msgstr "" #: website/doctype/web_form/web_form.js:64 -msgid "Atleast one field is required in Web Form Fields Table" +msgid "At least one field is required in Web Form Fields Table" msgstr "" #: core/doctype/data_export/data_export.js:44 -msgid "Atleast one field of Parent Document Type is mandatory" +msgid "At least one field of Parent Document Type is mandatory" msgstr "" #: public/js/frappe/form/controls/attach.js:5 @@ -3252,7 +3252,7 @@ msgctxt "Email Account" msgid "Auto Reply Message" msgstr "" -#: automation/doctype/assignment_rule/assignment_rule.py:179 +#: automation/doctype/assignment_rule/assignment_rule.py:176 msgid "Auto assignment failed: {0}" msgstr "" @@ -3327,11 +3327,11 @@ msgctxt "User" msgid "Automatic" msgstr "" -#: email/doctype/email_account/email_account.py:675 +#: email/doctype/email_account/email_account.py:677 msgid "Automatic Linking can be activated only for one Email Account." msgstr "" -#: email/doctype/email_account/email_account.py:670 +#: email/doctype/email_account/email_account.py:672 msgid "Automatic Linking can be activated only if Incoming is enabled." msgstr "" @@ -3543,7 +3543,11 @@ msgctxt "System Settings" msgid "Background Workers" msgstr "" -#: integrations/doctype/google_drive/google_drive.js:31 +#: integrations/doctype/google_drive/google_drive.py:173 +msgid "Backing up Data." +msgstr "" + +#: integrations/doctype/google_drive/google_drive.js:32 msgid "Backing up to Google Drive." msgstr "" @@ -4142,11 +4146,11 @@ msgstr "" msgid "Bulk Delete" msgstr "" -#: public/js/frappe/list/bulk_operations.js:256 +#: public/js/frappe/list/bulk_operations.js:277 msgid "Bulk Edit" msgstr "" -#: public/js/frappe/form/grid.js:1151 +#: public/js/frappe/form/grid.js:1153 msgid "Bulk Edit {0}" msgstr "" @@ -4453,7 +4457,7 @@ msgstr "" msgid "Camera" msgstr "" -#: public/js/frappe/utils/utils.js:1711 +#: public/js/frappe/utils/utils.js:1712 #: website/report/website_analytics/website_analytics.js:39 msgid "Campaign" msgstr "" @@ -4480,7 +4484,7 @@ msgstr "" msgid "Can not rename as column {0} is already present on DocType." msgstr "" -#: core/doctype/doctype/doctype.py:1114 +#: core/doctype/doctype/doctype.py:1110 msgid "Can only change to/from Autoincrement naming rule when there is no data in the doctype" msgstr "" @@ -4495,12 +4499,12 @@ msgstr "" msgid "Can't rename {0} to {1} because {0} doesn't exist." msgstr "" -#: core/doctype/doctype/doctype_list.js:113 +#: core/doctype/doctype/doctype_list.js:130 #: public/js/frappe/form/reminders.js:54 msgid "Cancel" msgstr "" -#: public/js/frappe/list/list_view.js:1889 +#: public/js/frappe/list/list_view.js:1913 msgctxt "Button in list view actions menu" msgid "Cancel" msgstr "" @@ -4553,7 +4557,7 @@ msgstr "" msgid "Cancel Scheduling" msgstr "" -#: public/js/frappe/list/list_view.js:1894 +#: public/js/frappe/list/list_view.js:1918 msgctxt "Title of confirmation dialog" msgid "Cancel {0} documents?" msgstr "" @@ -4622,7 +4626,7 @@ msgstr "" msgid "Cannot Remove" msgstr "" -#: model/base_document.py:1034 +#: model/base_document.py:1053 msgid "Cannot Update After Submit" msgstr "" @@ -4638,7 +4642,7 @@ msgstr "" msgid "Cannot cancel before submitting. See Transition {0}" msgstr "" -#: public/js/frappe/list/bulk_operations.js:229 +#: public/js/frappe/list/bulk_operations.js:250 msgid "Cannot cancel {0}." msgstr "" @@ -4658,7 +4662,7 @@ msgstr "" msgid "Cannot change state of Cancelled Document. Transition row {0}" msgstr "" -#: core/doctype/doctype/doctype.py:1104 +#: core/doctype/doctype/doctype.py:1100 msgid "Cannot change to/from autoincrement autoname in Customize Form" msgstr "" @@ -4666,7 +4670,7 @@ msgstr "" msgid "Cannot create a {0} against a child document: {1}" msgstr "" -#: desk/doctype/workspace/workspace.py:250 +#: desk/doctype/workspace/workspace.py:254 msgid "Cannot create private workspace of other users" msgstr "" @@ -4678,11 +4682,11 @@ msgstr "" msgid "Cannot delete or cancel because {0} {1} is linked with {2} {3} {4}" msgstr "" -#: desk/doctype/workspace/workspace.py:417 +#: desk/doctype/workspace/workspace.py:423 msgid "Cannot delete private workspace of other users" msgstr "" -#: desk/doctype/workspace/workspace.py:410 +#: desk/doctype/workspace/workspace.py:416 msgid "Cannot delete public workspace without Workspace Manager role" msgstr "" @@ -4786,16 +4790,16 @@ msgstr "" msgid "Cannot share {0} with submit permission as the doctype {1} is not submittable" msgstr "" -#: public/js/frappe/list/bulk_operations.js:226 +#: public/js/frappe/list/bulk_operations.js:247 msgid "Cannot submit {0}." msgstr "" -#: desk/doctype/workspace/workspace.py:351 +#: desk/doctype/workspace/workspace.py:357 msgid "Cannot update private workspace of other users" msgstr "" #: desk/doctype/bulk_update/bulk_update.js:26 -#: public/js/frappe/list/bulk_operations.js:301 +#: public/js/frappe/list/bulk_operations.js:322 msgid "Cannot update {0}" msgstr "" @@ -4807,7 +4811,7 @@ msgstr "" msgid "Cannot use {0} in order/group by" msgstr "" -#: public/js/frappe/list/bulk_operations.js:232 +#: public/js/frappe/list/bulk_operations.js:253 msgid "Cannot {0} {1}." msgstr "" @@ -4835,7 +4839,7 @@ msgstr "" msgid "Card Label" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:227 +#: public/js/frappe/widgets/widget_dialog.js:233 msgid "Card Links" msgstr "" @@ -5133,11 +5137,11 @@ msgctxt "Form Tour Step" msgid "Child Doctype" msgstr "" -#: core/doctype/doctype/doctype.py:1588 +#: core/doctype/doctype/doctype.py:1584 msgid "Child Table {0} for field {1}" msgstr "" -#: core/doctype/doctype/doctype_list.js:37 +#: core/doctype/doctype/doctype_list.js:52 msgid "Child Tables are shown as a Grid in other DocTypes" msgstr "" @@ -5147,11 +5151,11 @@ msgctxt "DocType" msgid "Child Tables are shown as a Grid in other DocTypes" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:614 +#: public/js/frappe/widgets/widget_dialog.js:620 msgid "Choose Existing Card or create New Card" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1385 +#: public/js/frappe/views/workspace/workspace.js:1391 msgid "Choose a block or continue typing" msgstr "" @@ -5186,7 +5190,7 @@ msgstr "" msgid "Clear" msgstr "" -#: public/js/frappe/views/communication.js:325 +#: public/js/frappe/views/communication.js:367 msgid "Clear & Add Template" msgstr "" @@ -5194,6 +5198,11 @@ msgstr "" msgid "Clear & Add template" msgstr "" +#: public/js/frappe/list/list_view.js:1819 +msgctxt "Button in list view actions menu" +msgid "Clear Assignment" +msgstr "" + #: public/js/frappe/ui/keyboard.js:275 msgid "Clear Cache and Reload" msgstr "" @@ -5212,7 +5221,7 @@ msgstr "" msgid "Clear User Permissions" msgstr "" -#: public/js/frappe/views/communication.js:326 +#: public/js/frappe/views/communication.js:368 msgid "Clear the email message and add the template" msgstr "" @@ -5228,7 +5237,7 @@ msgstr "" msgid "Click here to verify" msgstr "" -#: integrations/doctype/google_drive/google_drive.js:46 +#: integrations/doctype/google_drive/google_drive.js:47 msgid "Click on Authorize Google Drive Access to authorize Google Drive Access." msgstr "" @@ -5465,7 +5474,7 @@ msgctxt "OAuth Authorization Code" msgid "Code challenge method" msgstr "" -#: public/js/frappe/form/form_tour.js:268 +#: public/js/frappe/form/form_tour.js:270 #: public/js/frappe/widgets/base_widget.js:157 msgid "Collapse" msgstr "" @@ -5517,8 +5526,8 @@ msgstr "" #. Name of a DocType #: public/js/frappe/views/reports/query_report.js:1140 -#: public/js/frappe/widgets/widget_dialog.js:505 -#: public/js/frappe/widgets/widget_dialog.js:657 +#: public/js/frappe/widgets/widget_dialog.js:511 +#: public/js/frappe/widgets/widget_dialog.js:663 #: website/doctype/color/color.json msgid "Color" msgstr "" @@ -5665,7 +5674,7 @@ msgstr "" msgid "Column Name cannot be empty" msgstr "" -#: public/js/frappe/form/grid_row.js:593 +#: public/js/frappe/form/grid_row.js:613 msgid "Column width cannot be zero." msgstr "" @@ -6332,7 +6341,7 @@ msgctxt "Web Page" msgid "Content Type" msgstr "" -#: desk/doctype/workspace/workspace.py:79 +#: desk/doctype/workspace/workspace.py:82 msgid "Content data shoud be a list" msgstr "" @@ -6392,7 +6401,7 @@ msgctxt "Social Login Key" msgid "Controls whether new users can sign up using this Social Login Key. If unset, Website Settings is respected. " msgstr "" -#: public/js/frappe/utils/utils.js:1030 +#: public/js/frappe/utils/utils.js:1031 msgid "Copied to clipboard." msgstr "" @@ -6452,11 +6461,11 @@ msgctxt "Number Card" msgid "Count" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:499 +#: public/js/frappe/widgets/widget_dialog.js:505 msgid "Count Customizations" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:484 +#: public/js/frappe/widgets/widget_dialog.js:490 msgid "Count Filter" msgstr "" @@ -6531,7 +6540,7 @@ msgstr "" #: public/js/frappe/views/file/file_view.js:112 #: public/js/frappe/views/interaction.js:18 #: public/js/frappe/views/reports/query_report.js:1172 -#: public/js/frappe/views/workspace/workspace.js:1217 +#: public/js/frappe/views/workspace/workspace.js:1223 #: workflow/page/workflow_builder/workflow_builder.js:46 msgid "Create" msgstr "" @@ -6554,7 +6563,7 @@ msgctxt "User Document Type" msgid "Create" msgstr "" -#: core/doctype/doctype/doctype_list.js:85 +#: core/doctype/doctype/doctype_list.js:102 msgid "Create & Continue" msgstr "" @@ -6584,7 +6593,7 @@ msgstr "" msgid "Create Custom Fields" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:925 +#: public/js/frappe/views/workspace/workspace.js:931 msgid "Create Duplicate" msgstr "" @@ -6606,7 +6615,7 @@ msgstr "" msgid "Create New" msgstr "" -#: core/doctype/doctype/doctype_list.js:83 +#: core/doctype/doctype/doctype_list.js:100 msgid "Create New DocType" msgstr "" @@ -6618,7 +6627,7 @@ msgstr "" msgid "Create User Email" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:465 +#: public/js/frappe/views/workspace/workspace.js:471 msgid "Create Workspace" msgstr "" @@ -6626,7 +6635,7 @@ msgstr "" msgid "Create a Reminder" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:521 +#: public/js/frappe/ui/toolbar/search_utils.js:537 msgid "Create a new ..." msgstr "" @@ -6634,8 +6643,8 @@ msgstr "" msgid "Create a new record" msgstr "" -#: public/js/frappe/form/controls/link.js:291 -#: public/js/frappe/form/controls/link.js:293 +#: public/js/frappe/form/controls/link.js:292 +#: public/js/frappe/form/controls/link.js:294 #: public/js/frappe/form/link_selector.js:139 #: public/js/frappe/list/list_view.js:470 msgid "Create a new {0}" @@ -7103,7 +7112,7 @@ msgctxt "Translation" msgid "Custom Translation" msgstr "" -#: core/doctype/doctype/doctype_list.js:65 +#: core/doctype/doctype/doctype_list.js:82 msgid "Custom?" msgstr "" @@ -7149,7 +7158,7 @@ msgstr "" msgid "Customization onboarding is all done!" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:511 +#: public/js/frappe/views/workspace/workspace.js:517 msgid "Customizations Discarded" msgstr "" @@ -7340,7 +7349,7 @@ msgstr "" msgid "Daily Event Digest is sent for Calendar Events where reminders are set." msgstr "" -#: desk/doctype/event/event.py:93 +#: desk/doctype/event/event.py:94 msgid "Daily Events should finish on the Same Day." msgstr "" @@ -7381,7 +7390,7 @@ msgstr "" #. Name of a DocType #: core/page/dashboard_view/dashboard_view.js:10 #: desk/doctype/dashboard/dashboard.json -#: public/js/frappe/ui/toolbar/search_utils.js:546 +#: public/js/frappe/ui/toolbar/search_utils.js:562 msgid "Dashboard" msgstr "" @@ -7571,7 +7580,7 @@ msgstr "" msgid "Data Too Long" msgstr "" -#: model/base_document.py:703 +#: model/base_document.py:722 msgid "Data missing in table" msgstr "" @@ -8000,11 +8009,11 @@ msgctxt "DocType" msgid "Default View" msgstr "" -#: core/doctype/doctype/doctype.py:1327 +#: core/doctype/doctype/doctype.py:1323 msgid "Default for 'Check' type of field {0} must be either '0' or '1'" msgstr "" -#: core/doctype/doctype/doctype.py:1340 +#: core/doctype/doctype/doctype.py:1336 msgid "Default value for {0} must be in the list of options." msgstr "" @@ -8049,12 +8058,12 @@ msgstr "" #: public/js/frappe/form/toolbar.js:423 #: public/js/frappe/views/reports/report_view.js:1645 #: public/js/frappe/views/treeview.js:313 -#: public/js/frappe/views/workspace/workspace.js:823 +#: public/js/frappe/views/workspace/workspace.js:829 #: templates/discussions/reply_card.html:35 msgid "Delete" msgstr "" -#: public/js/frappe/list/list_view.js:1857 +#: public/js/frappe/list/list_view.js:1881 msgctxt "Button in list view actions menu" msgid "Delete" msgstr "" @@ -8089,11 +8098,11 @@ msgstr "" msgid "Delete Kanban Board" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:824 +#: public/js/frappe/views/workspace/workspace.js:830 msgid "Delete Workspace" msgstr "" -#: public/js/frappe/form/footer/form_timeline.js:696 +#: public/js/frappe/form/footer/form_timeline.js:719 msgid "Delete comment?" msgstr "" @@ -8101,12 +8110,12 @@ msgstr "" msgid "Delete this record to allow sending to this email address" msgstr "" -#: public/js/frappe/list/list_view.js:1862 +#: public/js/frappe/list/list_view.js:1886 msgctxt "Title of confirmation dialog" msgid "Delete {0} item permanently?" msgstr "" -#: public/js/frappe/list/list_view.js:1868 +#: public/js/frappe/list/list_view.js:1892 msgctxt "Title of confirmation dialog" msgid "Delete {0} items permanently?" msgstr "" @@ -8235,6 +8244,7 @@ msgid "Descendants Of (inclusive)" msgstr "" #: desk/report/todo/todo.py:39 public/js/frappe/form/reminders.js:44 +#: public/js/frappe/widgets/widget_dialog.js:227 msgid "Description" msgstr "" @@ -8335,6 +8345,12 @@ msgctxt "Website Slideshow Item" msgid "Description" msgstr "" +#. Label of a HTML Editor field in DocType 'Workspace Link' +#: desk/doctype/workspace_link/workspace_link.json +msgctxt "Workspace Link" +msgid "Description" +msgstr "" + #. Description of the 'Blog Intro' (Small Text) field in DocType 'Blog Post' #: website/doctype/blog_post/blog_post.json msgctxt "Blog Post" @@ -8634,7 +8650,7 @@ msgstr "" #: public/js/frappe/views/communication.js:30 #: public/js/frappe/views/dashboard/dashboard_view.js:70 -#: public/js/frappe/views/workspace/workspace.js:502 +#: public/js/frappe/views/workspace/workspace.js:508 #: public/js/frappe/web_form/web_form.js:187 #: website/doctype/web_form/templates/web_form.html:41 msgid "Discard" @@ -8695,7 +8711,7 @@ msgctxt "LDAP Settings" msgid "Do not create new user if user with email does not exist in the system" msgstr "" -#: public/js/frappe/form/grid.js:1156 +#: public/js/frappe/form/grid.js:1158 msgid "Do not edit headers which are preset in the template" msgstr "" @@ -8852,7 +8868,7 @@ msgctxt "Workspace Shortcut" msgid "DocType" msgstr "" -#: core/doctype/doctype/doctype.py:1528 +#: core/doctype/doctype/doctype.py:1524 msgid "DocType {0} provided for the field {1} must have atleast one Link field" msgstr "" @@ -8895,7 +8911,7 @@ msgctxt "Property Setter" msgid "DocType Link" msgstr "" -#: core/doctype/doctype/doctype_list.js:10 +#: core/doctype/doctype/doctype_list.js:22 msgid "DocType Name" msgstr "" @@ -8916,11 +8932,11 @@ msgctxt "Workspace Shortcut" msgid "DocType View" msgstr "" -#: core/doctype/doctype/doctype.py:646 +#: core/doctype/doctype/doctype.py:642 msgid "DocType can not be merged" msgstr "" -#: core/doctype/doctype/doctype.py:640 +#: core/doctype/doctype/doctype.py:636 msgid "DocType can only be renamed by Administrator" msgstr "" @@ -8958,7 +8974,7 @@ msgstr "" msgid "DocType {} not found" msgstr "" -#: core/doctype/doctype/doctype.py:1009 +#: core/doctype/doctype/doctype.py:1005 msgid "DocType's name should not start or end with whitespace" msgstr "" @@ -8966,7 +8982,7 @@ msgstr "" msgid "DocTypes can not be modified, please use {0} instead" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:645 +#: public/js/frappe/widgets/widget_dialog.js:651 msgid "Doctype" msgstr "" @@ -8976,7 +8992,7 @@ msgctxt "Document Follow" msgid "Doctype" msgstr "" -#: core/doctype/doctype/doctype.py:1004 +#: core/doctype/doctype/doctype.py:1000 msgid "Doctype name is limited to {0} characters ({1})" msgstr "" @@ -8984,7 +9000,7 @@ msgstr "" msgid "Doctype required" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1303 +#: public/js/frappe/views/workspace/workspace.js:1309 msgid "Doctype with same route already exist. Please choose different title." msgstr "" @@ -9058,24 +9074,24 @@ msgctxt "Customize Form" msgid "Document Links" msgstr "" -#: core/doctype/doctype/doctype.py:1162 +#: core/doctype/doctype/doctype.py:1158 msgid "Document Links Row #{0}: Could not find field {1} in {2} DocType" msgstr "" -#: core/doctype/doctype/doctype.py:1182 +#: core/doctype/doctype/doctype.py:1178 msgid "Document Links Row #{0}: Invalid doctype or fieldname." msgstr "" -#: core/doctype/doctype/doctype.py:1145 +#: core/doctype/doctype/doctype.py:1141 msgid "Document Links Row #{0}: Parent DocType is mandatory for internal links" msgstr "" -#: core/doctype/doctype/doctype.py:1151 +#: core/doctype/doctype/doctype.py:1147 msgid "Document Links Row #{0}: Table Fieldname is mandatory for internal links" msgstr "" #: core/doctype/user_permission/user_permission_list.js:36 -#: public/js/frappe/form/form_tour.js:58 +#: public/js/frappe/form/form_tour.js:60 msgid "Document Name" msgstr "" @@ -9602,7 +9618,7 @@ msgstr "" #: public/js/frappe/views/workspace/blocks/header.js:46 #: public/js/frappe/views/workspace/blocks/paragraph.js:136 #: public/js/frappe/views/workspace/blocks/spacer.js:44 -#: public/js/frappe/views/workspace/workspace.js:565 +#: public/js/frappe/views/workspace/workspace.js:571 #: public/js/frappe/widgets/base_widget.js:33 msgid "Drag" msgstr "" @@ -9653,8 +9669,8 @@ msgid "Due Date Based On" msgstr "" #: public/js/frappe/form/toolbar.js:377 -#: public/js/frappe/views/workspace/workspace.js:808 -#: public/js/frappe/views/workspace/workspace.js:975 +#: public/js/frappe/views/workspace/workspace.js:814 +#: public/js/frappe/views/workspace/workspace.js:981 msgid "Duplicate" msgstr "" @@ -9666,12 +9682,12 @@ msgstr "" msgid "Duplicate Filter Name" msgstr "" -#: model/base_document.py:563 model/rename_doc.py:113 +#: model/base_document.py:582 model/rename_doc.py:113 msgid "Duplicate Name" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:547 -#: public/js/frappe/views/workspace/workspace.js:809 +#: public/js/frappe/views/workspace/workspace.js:553 +#: public/js/frappe/views/workspace/workspace.js:815 msgid "Duplicate Workspace" msgstr "" @@ -9679,7 +9695,7 @@ msgstr "" msgid "Duplicate current row" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:990 +#: public/js/frappe/views/workspace/workspace.js:996 msgid "Duplicate of {0} named as {1} is created successfully" msgstr "" @@ -9811,12 +9827,12 @@ msgstr "" #: printing/page/print_format_builder_beta/print_format_builder_beta.js:46 #: printing/page/print_format_builder_beta/print_format_builder_beta.js:85 #: public/js/frappe/form/controls/markdown_editor.js:31 -#: public/js/frappe/form/footer/form_timeline.js:638 +#: public/js/frappe/form/footer/form_timeline.js:661 #: public/js/frappe/form/toolbar.js:672 #: public/js/frappe/views/reports/query_report.js:809 #: public/js/frappe/views/reports/query_report.js:1617 -#: public/js/frappe/views/workspace/workspace.js:448 -#: public/js/frappe/views/workspace/workspace.js:802 +#: public/js/frappe/views/workspace/workspace.js:454 +#: public/js/frappe/views/workspace/workspace.js:808 #: public/js/frappe/widgets/base_widget.js:64 #: public/js/frappe/widgets/chart_widget.js:298 #: public/js/frappe/widgets/number_card_widget.js:314 @@ -9826,7 +9842,7 @@ msgstr "" msgid "Edit" msgstr "" -#: public/js/frappe/list/list_view.js:1943 +#: public/js/frappe/list/list_view.js:1967 msgctxt "Button in list view actions menu" msgid "Edit" msgstr "" @@ -9903,7 +9919,7 @@ msgctxt "Website Settings" msgid "Edit Values" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:803 +#: public/js/frappe/views/workspace/workspace.js:809 msgid "Edit Workspace" msgstr "" @@ -9923,7 +9939,7 @@ msgstr "" msgid "Edit {0}" msgstr "" -#: core/doctype/doctype/doctype_list.js:41 +#: core/doctype/doctype/doctype_list.js:57 msgid "Editable Grid" msgstr "" @@ -10373,7 +10389,7 @@ msgstr "" msgid "Email has been moved to trash" msgstr "" -#: public/js/frappe/views/communication.js:707 +#: public/js/frappe/views/communication.js:749 msgid "Email not sent to {0} (unsubscribed / disabled)" msgstr "" @@ -10696,7 +10712,7 @@ msgstr "" msgid "Enabled Scheduler" msgstr "" -#: email/doctype/email_account/email_account.py:896 +#: email/doctype/email_account/email_account.py:898 msgid "Enabled email inbox for user {0}" msgstr "" @@ -10873,7 +10889,7 @@ msgstr "" msgid "Enter Client Id and Client Secret in Google Settings." msgstr "" -#: public/js/frappe/views/communication.js:663 +#: public/js/frappe/views/communication.js:705 msgid "Enter Email Recipient(s)" msgstr "" @@ -10888,7 +10904,7 @@ msgctxt "Title of prompt dialog" msgid "Enter Value" msgstr "" -#: public/js/frappe/form/form_tour.js:56 +#: public/js/frappe/form/form_tour.js:58 msgid "Enter a name for this {0}" msgstr "" @@ -10939,8 +10955,8 @@ msgstr "" msgid "Equals" msgstr "" -#: desk/page/backups/backups.js:35 model/base_document.py:703 -#: model/base_document.py:708 public/js/frappe/ui/messages.js:22 +#: desk/page/backups/backups.js:35 model/base_document.py:722 +#: model/base_document.py:727 public/js/frappe/ui/messages.js:22 msgid "Error" msgstr "" @@ -11053,7 +11069,7 @@ msgstr "" msgid "Error in print format on line {0}: {1}" msgstr "" -#: email/doctype/email_account/email_account.py:586 +#: email/doctype/email_account/email_account.py:588 msgid "Error while connecting to email account {0}" msgstr "" @@ -11065,7 +11081,7 @@ msgstr "" msgid "Error: Document has been modified after you have opened it" msgstr "" -#: model/base_document.py:716 +#: model/base_document.py:735 msgid "Error: Value missing for {0}: {1}" msgstr "" @@ -11132,7 +11148,7 @@ msgctxt "Recorder" msgid "Event Type" msgstr "" -#: desk/doctype/event/event.py:263 +#: desk/doctype/event/event.py:264 msgid "Events in Today's Calendar" msgstr "" @@ -11334,7 +11350,7 @@ msgstr "" msgid "Export" msgstr "" -#: public/js/frappe/list/list_view.js:1965 +#: public/js/frappe/list/list_view.js:1989 msgctxt "Button in list view actions menu" msgid "Export" msgstr "" @@ -11531,7 +11547,7 @@ msgstr "" msgid "Failed to connect to server" msgstr "" -#: auth.py:649 +#: auth.py:660 msgid "Failed to decode token, please provide a valid base64-encoded token." msgstr "" @@ -11672,7 +11688,7 @@ msgid "Fetching default Global Search documents." msgstr "" #: desk/page/leaderboard/leaderboard.js:131 -#: public/js/frappe/list/bulk_operations.js:262 +#: public/js/frappe/list/bulk_operations.js:283 #: public/js/frappe/views/reports/query_report.js:235 #: public/js/frappe/views/reports/query_report.js:1706 msgid "Field" @@ -11720,11 +11736,11 @@ msgctxt "Web Form List Column" msgid "Field" msgstr "" -#: core/doctype/doctype/doctype.py:419 +#: core/doctype/doctype/doctype.py:415 msgid "Field \"route\" is mandatory for Web Views" msgstr "" -#: core/doctype/doctype/doctype.py:1477 +#: core/doctype/doctype/doctype.py:1473 msgid "Field \"title\" is mandatory if \"Website Search Field\" is set." msgstr "" @@ -11738,7 +11754,7 @@ msgctxt "Custom Field" msgid "Field Description" msgstr "" -#: core/doctype/doctype/doctype.py:1040 +#: core/doctype/doctype/doctype.py:1036 msgid "Field Missing" msgstr "" @@ -11786,7 +11802,7 @@ msgstr "" msgid "Field type cannot be changed for {0}" msgstr "" -#: database/database.py:783 +#: database/database.py:828 msgid "Field {0} does not exist on {1}" msgstr "" @@ -11844,11 +11860,11 @@ msgctxt "Webhook Data" msgid "Fieldname" msgstr "" -#: core/doctype/doctype/doctype.py:270 +#: core/doctype/doctype/doctype.py:266 msgid "Fieldname '{0}' conflicting with a {1} of the name {2} in {3}" msgstr "" -#: core/doctype/doctype/doctype.py:1039 +#: core/doctype/doctype/doctype.py:1035 msgid "Fieldname called {0} must exist to enable autonaming" msgstr "" @@ -11872,11 +11888,11 @@ msgstr "" msgid "Fieldname {0} cannot have special characters like {1}" msgstr "" -#: core/doctype/doctype/doctype.py:1850 +#: core/doctype/doctype/doctype.py:1846 msgid "Fieldname {0} conflicting with meta object" msgstr "" -#: core/doctype/doctype/doctype.py:495 public/js/form_builder/utils.js:302 +#: core/doctype/doctype/doctype.py:491 public/js/form_builder/utils.js:302 msgid "Fieldname {0} is restricted" msgstr "" @@ -12148,11 +12164,11 @@ msgctxt "Prepared Report" msgid "Filter Values" msgstr "" -#: utils/data.py:2021 +#: utils/data.py:2015 msgid "Filter must be a tuple or list (in a list)" msgstr "" -#: utils/data.py:2029 +#: utils/data.py:2023 msgid "Filter must have 4 values (doctype, fieldname, operator, value): {0}" msgstr "" @@ -12255,7 +12271,7 @@ msgctxt "Number Card" msgid "Filters Section" msgstr "" -#: public/js/frappe/form/controls/link.js:486 +#: public/js/frappe/form/controls/link.js:488 msgid "Filters applied for {0}" msgstr "" @@ -12269,14 +12285,14 @@ msgctxt "Report" msgid "Filters will be accessible via filters.

    Send output as result = [result], or for old style data = [columns], [result]" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:556 +#: public/js/frappe/ui/toolbar/search_utils.js:572 msgid "Find '{0}' in ..." msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:325 -#: public/js/frappe/ui/toolbar/awesome_bar.js:326 -#: public/js/frappe/ui/toolbar/search_utils.js:125 -#: public/js/frappe/ui/toolbar/search_utils.js:128 +#: public/js/frappe/ui/toolbar/awesome_bar.js:327 +#: public/js/frappe/ui/toolbar/awesome_bar.js:328 +#: public/js/frappe/ui/toolbar/search_utils.js:141 +#: public/js/frappe/ui/toolbar/search_utils.js:144 msgid "Find {0} in {1}" msgstr "" @@ -12410,11 +12426,11 @@ msgctxt "Report Filter" msgid "Fold" msgstr "" -#: core/doctype/doctype/doctype.py:1401 +#: core/doctype/doctype/doctype.py:1397 msgid "Fold can not be at the end of the form" msgstr "" -#: core/doctype/doctype/doctype.py:1399 +#: core/doctype/doctype/doctype.py:1395 msgid "Fold must come before a Section Break" msgstr "" @@ -12460,7 +12476,7 @@ msgstr "" msgid "Following fields have invalid values:" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:314 +#: public/js/frappe/widgets/widget_dialog.js:320 msgid "Following fields have missing values" msgstr "" @@ -12630,7 +12646,7 @@ msgstr "" msgid "For Document Type" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:529 +#: public/js/frappe/widgets/widget_dialog.js:535 msgid "For Example: {} Open" msgstr "" @@ -12723,7 +12739,7 @@ msgstr "" msgid "For updating, you can update only selective columns." msgstr "" -#: core/doctype/doctype/doctype.py:1692 +#: core/doctype/doctype/doctype.py:1688 msgid "For {0} at level {1} in {2} in row {3}" msgstr "" @@ -12870,7 +12886,7 @@ msgctxt "Webhook" msgid "Form URL-Encoded" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:528 +#: public/js/frappe/widgets/widget_dialog.js:534 msgid "Format" msgstr "" @@ -13108,7 +13124,7 @@ msgid "Full Width" msgstr "" #: public/js/frappe/views/reports/query_report.js:245 -#: public/js/frappe/widgets/widget_dialog.js:666 +#: public/js/frappe/widgets/widget_dialog.js:672 msgid "Function" msgstr "" @@ -13118,11 +13134,11 @@ msgctxt "Number Card" msgid "Function" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:673 +#: public/js/frappe/widgets/widget_dialog.js:679 msgid "Function Based On" msgstr "" -#: __init__.py:835 +#: __init__.py:875 msgid "Function {0} is not whitelisted." msgstr "" @@ -13206,12 +13222,12 @@ msgstr "" msgid "Generate New Report" msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:366 +#: public/js/frappe/ui/toolbar/awesome_bar.js:368 msgid "Generate Random Password" msgstr "" #: public/js/frappe/ui/toolbar/toolbar.js:137 -#: public/js/frappe/utils/utils.js:1750 +#: public/js/frappe/utils/utils.js:1751 msgid "Generate Tracking URL" msgstr "" @@ -13838,6 +13854,12 @@ msgctxt "Auto Email Report" msgid "Half Yearly" msgstr "" +#. Option for the 'Repeat On' (Select) field in DocType 'Event' +#: desk/doctype/event/event.json +msgctxt "Event" +msgid "Half Yearly" +msgstr "" + #: public/js/frappe/utils/common.js:402 msgid "Half-yearly" msgstr "" @@ -14066,7 +14088,7 @@ msgctxt "Print Settings" msgid "Helvetica Neue" msgstr "" -#: public/js/frappe/utils/utils.js:1747 +#: public/js/frappe/utils/utils.js:1748 msgid "Here's your tracking URL" msgstr "" @@ -14134,7 +14156,7 @@ msgctxt "Form Tour Step" msgid "Hidden Fields" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:814 +#: public/js/frappe/views/workspace/workspace.js:820 #: public/js/frappe/widgets/base_widget.js:46 #: public/js/frappe/widgets/base_widget.js:176 msgid "Hide" @@ -14291,7 +14313,7 @@ msgstr "" msgid "Hide Weekends" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:815 +#: public/js/frappe/views/workspace/workspace.js:821 msgid "Hide Workspace" msgstr "" @@ -14501,9 +14523,9 @@ msgctxt "Comment" msgid "IP Address" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:632 -#: public/js/frappe/views/workspace/workspace.js:960 -#: public/js/frappe/views/workspace/workspace.js:1205 +#: public/js/frappe/views/workspace/workspace.js:638 +#: public/js/frappe/views/workspace/workspace.js:966 +#: public/js/frappe/views/workspace/workspace.js:1211 msgid "Icon" msgstr "" @@ -14606,7 +14628,7 @@ msgctxt "Workflow Document State" msgid "If Checked workflow status will not override status in list view" msgstr "" -#: core/doctype/doctype/doctype.py:1706 +#: core/doctype/doctype/doctype.py:1702 msgid "If Owner" msgstr "" @@ -14973,11 +14995,11 @@ msgctxt "Letter Head" msgid "Image Width" msgstr "" -#: core/doctype/doctype/doctype.py:1457 +#: core/doctype/doctype/doctype.py:1453 msgid "Image field must be a valid fieldname" msgstr "" -#: core/doctype/doctype/doctype.py:1459 +#: core/doctype/doctype/doctype.py:1455 msgid "Image field must be of type Attach Image" msgstr "" @@ -15221,7 +15243,7 @@ msgstr "" msgid "In Progress" msgstr "" -#: database/database.py:233 +#: database/database.py:241 msgid "In Read Only Mode" msgstr "" @@ -15351,7 +15373,7 @@ msgstr "" msgid "Incomplete Virtual Doctype Implementation" msgstr "" -#: auth.py:236 +#: auth.py:238 msgid "Incomplete login details" msgstr "" @@ -15433,9 +15455,9 @@ msgctxt "Workspace" msgid "Indicator Color" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:639 -#: public/js/frappe/views/workspace/workspace.js:967 -#: public/js/frappe/views/workspace/workspace.js:1211 +#: public/js/frappe/views/workspace/workspace.js:645 +#: public/js/frappe/views/workspace/workspace.js:973 +#: public/js/frappe/views/workspace/workspace.js:1217 msgid "Indicator color" msgstr "" @@ -15499,7 +15521,7 @@ msgstr "" msgid "Insert Column Before {0}" msgstr "" -#: public/js/frappe/form/controls/markdown_editor.js:81 +#: public/js/frappe/form/controls/markdown_editor.js:82 msgid "Insert Image in Markdown" msgstr "" @@ -15515,8 +15537,8 @@ msgctxt "Web Page" msgid "Insert Style" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:646 -#: public/js/frappe/ui/toolbar/search_utils.js:647 +#: public/js/frappe/ui/toolbar/search_utils.js:662 +#: public/js/frappe/ui/toolbar/search_utils.js:663 msgid "Install {0} from Marketplace" msgstr "" @@ -15540,11 +15562,11 @@ msgstr "" msgid "Installed Apps" msgstr "" -#: permissions.py:826 +#: permissions.py:829 msgid "Insufficient Permission Level for {0}" msgstr "" -#: database/query.py:371 desk/form/load.py:40 model/document.py:234 +#: database/query.py:372 desk/form/load.py:40 model/document.py:234 msgid "Insufficient Permission for {0}" msgstr "" @@ -15556,7 +15578,7 @@ msgstr "" msgid "Insufficient Permissions for editing Report" msgstr "" -#: core/doctype/doctype/doctype.py:447 +#: core/doctype/doctype/doctype.py:443 msgid "Insufficient attachment limit" msgstr "" @@ -15704,7 +15726,7 @@ msgctxt "OAuth Authorization Code" msgid "Invalid" msgstr "" -#: public/js/form_builder/utils.js:221 public/js/frappe/form/grid_row.js:748 +#: public/js/form_builder/utils.js:221 public/js/frappe/form/grid_row.js:768 #: public/js/frappe/form/layout.js:774 msgid "Invalid \"depends_on\" expression" msgstr "" @@ -15741,11 +15763,11 @@ msgstr "" msgid "Invalid DocType" msgstr "" -#: database/query.py:95 +#: database/query.py:96 msgid "Invalid DocType: {0}" msgstr "" -#: core/doctype/doctype/doctype.py:1223 +#: core/doctype/doctype/doctype.py:1219 msgid "Invalid Fieldname" msgstr "" @@ -15785,7 +15807,7 @@ msgstr "" msgid "Invalid Operation" msgstr "" -#: core/doctype/doctype/doctype.py:1582 core/doctype/doctype/doctype.py:1591 +#: core/doctype/doctype/doctype.py:1578 core/doctype/doctype/doctype.py:1587 msgid "Invalid Option" msgstr "" @@ -15811,7 +15833,7 @@ msgstr "" msgid "Invalid Phone Number" msgstr "" -#: auth.py:93 utils/oauth.py:184 utils/oauth.py:191 www/login.py:112 +#: auth.py:95 utils/oauth.py:184 utils/oauth.py:191 www/login.py:112 msgid "Invalid Request" msgstr "" @@ -15819,7 +15841,7 @@ msgstr "" msgid "Invalid Search Field {0}" msgstr "" -#: core/doctype/doctype/doctype.py:1165 +#: core/doctype/doctype/doctype.py:1161 msgid "Invalid Table Fieldname" msgstr "" @@ -15827,7 +15849,7 @@ msgstr "" msgid "Invalid Transition" msgstr "" -#: core/doctype/file/file.py:217 public/js/frappe/widgets/widget_dialog.js:565 +#: core/doctype/file/file.py:217 public/js/frappe/widgets/widget_dialog.js:571 #: utils/csvutils.py:199 utils/csvutils.py:220 msgid "Invalid URL" msgstr "" @@ -15860,11 +15882,11 @@ msgstr "" msgid "Invalid expression set in filter {0} ({1})" msgstr "" -#: utils/data.py:2128 +#: utils/data.py:2122 msgid "Invalid field name {0}" msgstr "" -#: core/doctype/doctype/doctype.py:1048 +#: core/doctype/doctype/doctype.py:1044 msgid "Invalid fieldname '{0}' in autoname" msgstr "" @@ -15872,7 +15894,7 @@ msgstr "" msgid "Invalid file path: {0}" msgstr "" -#: database/query.py:173 public/js/frappe/ui/filters/filter_list.js:199 +#: database/query.py:174 public/js/frappe/ui/filters/filter_list.js:199 msgid "Invalid filter: {0}" msgstr "" @@ -15923,7 +15945,7 @@ msgctxt "Error message in web form" msgid "Invalid values for fields:" msgstr "" -#: core/doctype/doctype/doctype.py:1515 +#: core/doctype/doctype/doctype.py:1511 msgid "Invalid {0} condition" msgstr "" @@ -15965,7 +15987,7 @@ msgctxt "DocType" msgid "Is Calendar and Gantt" msgstr "" -#: core/doctype/doctype/doctype_list.js:34 +#: core/doctype/doctype/doctype_list.js:49 msgid "Is Child Table" msgstr "" @@ -16127,7 +16149,7 @@ msgctxt "DocType" msgid "Is Published Field" msgstr "" -#: core/doctype/doctype/doctype.py:1466 +#: core/doctype/doctype/doctype.py:1462 msgid "Is Published Field must be a valid fieldname" msgstr "" @@ -16143,7 +16165,7 @@ msgctxt "Integration Request" msgid "Is Remote Request?" msgstr "" -#: core/doctype/doctype/doctype_list.js:48 +#: core/doctype/doctype/doctype_list.js:64 msgid "Is Single" msgstr "" @@ -16225,7 +16247,7 @@ msgctxt "Web Form" msgid "Is Standard" msgstr "" -#: core/doctype/doctype/doctype_list.js:25 +#: core/doctype/doctype/doctype_list.js:39 msgid "Is Submittable" msgstr "" @@ -16451,7 +16473,7 @@ msgstr "" msgid "Job is not running." msgstr "" -#: desk/doctype/event/event.js:51 +#: desk/doctype/event/event.js:55 msgid "Join video conference with {0}" msgstr "" @@ -16745,8 +16767,9 @@ msgid "LDAP settings incorrect. validation response was: {0}" msgstr "" #: printing/page/print_format_builder/print_format_builder.js:474 -#: public/js/frappe/widgets/widget_dialog.js:606 -#: public/js/frappe/widgets/widget_dialog.js:639 +#: public/js/frappe/widgets/widget_dialog.js:222 +#: public/js/frappe/widgets/widget_dialog.js:612 +#: public/js/frappe/widgets/widget_dialog.js:645 msgid "Label" msgstr "" @@ -17116,7 +17139,7 @@ msgid "Leave blank to repeat always" msgstr "" #: core/doctype/communication/mixins.py:206 -#: email/doctype/email_account/email_account.py:624 +#: email/doctype/email_account/email_account.py:626 msgid "Leave this conversation" msgstr "" @@ -17518,6 +17541,12 @@ msgstr "" msgid "Link Expired" msgstr "" +#. Label of a Int field in DocType 'System Settings' +#: core/doctype/system_settings/system_settings.json +msgctxt "System Settings" +msgid "Link Field Results Limit" +msgstr "" + #. Label of a Data field in DocType 'DocType Link' #: core/doctype/doctype_link/doctype_link.json msgctxt "DocType Link" @@ -17755,7 +17784,7 @@ msgctxt "Web Page" msgid "List as [{\"label\": _(\"Jobs\"), \"route\":\"jobs\"}]" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:526 +#: public/js/frappe/ui/toolbar/search_utils.js:542 msgid "Lists" msgstr "" @@ -17928,7 +17957,7 @@ msgstr "" msgid "Login is required to see web form list view. Enable {0} to see list settings" msgstr "" -#: auth.py:322 auth.py:325 +#: auth.py:324 auth.py:327 msgid "Login not allowed at this time" msgstr "" @@ -17968,7 +17997,7 @@ msgctxt "System Settings" msgid "Login with email link expiry (in minutes)" msgstr "" -#: auth.py:131 +#: auth.py:133 msgid "Login with username and password is not allowed." msgstr "" @@ -18407,7 +18436,7 @@ msgctxt "System Settings" msgid "Max auto email report per user" msgstr "" -#: core/doctype/doctype/doctype.py:1293 +#: core/doctype/doctype/doctype.py:1289 msgid "Max width for type Currency is 100px in row {0}" msgstr "" @@ -18455,7 +18484,7 @@ msgid "Me" msgstr "" #: public/js/frappe/form/sidebar/assign_to.js:194 -#: public/js/frappe/utils/utils.js:1719 +#: public/js/frappe/utils/utils.js:1720 #: website/report/website_analytics/website_analytics.js:40 msgid "Medium" msgstr "" @@ -18551,7 +18580,7 @@ msgctxt "Communication" msgid "Message" msgstr "" -#: __init__.py:527 public/js/frappe/ui/messages.js:267 +#: __init__.py:567 public/js/frappe/ui/messages.js:267 msgctxt "Default title of the message dialog" msgid "Message" msgstr "" @@ -18641,7 +18670,7 @@ msgctxt "Notification" msgid "Message Type" msgstr "" -#: public/js/frappe/views/communication.js:841 +#: public/js/frappe/views/communication.js:883 msgid "Message clipped" msgstr "" @@ -18857,7 +18886,7 @@ msgstr "" msgid "Missing DocType" msgstr "" -#: core/doctype/doctype/doctype.py:1477 +#: core/doctype/doctype/doctype.py:1473 msgid "Missing Field" msgstr "" @@ -18878,7 +18907,7 @@ msgid "Missing Value" msgstr "" #: public/js/frappe/ui/field_group.js:118 -#: public/js/frappe/widgets/widget_dialog.js:330 +#: public/js/frappe/widgets/widget_dialog.js:336 #: public/js/workflow_builder/store.js:97 #: workflow/doctype/workflow/workflow.js:71 msgid "Missing Values Required" @@ -18921,7 +18950,7 @@ msgstr "" msgid "Modified By" msgstr "" -#: core/doctype/doctype/doctype_list.js:17 +#: core/doctype/doctype/doctype_list.js:30 msgid "Module" msgstr "" @@ -19641,11 +19670,11 @@ msgctxt "Role" msgid "Navigation Settings" msgstr "" -#: desk/doctype/workspace/workspace.py:297 +#: desk/doctype/workspace/workspace.py:303 msgid "Need Workspace Manager role to edit private workspace of other users" msgstr "" -#: desk/doctype/workspace/workspace.py:343 +#: desk/doctype/workspace/workspace.py:349 msgid "Need Workspace Manager role to hide/unhide public workspaces" msgstr "" @@ -19776,7 +19805,7 @@ msgstr "" msgid "New Workflow Name" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1172 +#: public/js/frappe/views/workspace/workspace.js:1178 msgid "New Workspace" msgstr "" @@ -19784,7 +19813,7 @@ msgstr "" msgid "New password cannot be same as old password" msgstr "" -#: utils/change_log.py:306 +#: utils/change_log.py:322 msgid "New updates are available" msgstr "" @@ -19805,10 +19834,10 @@ msgstr "" #: public/js/frappe/form/quick_entry.js:124 public/js/frappe/form/toolbar.js:36 #: public/js/frappe/form/toolbar.js:196 public/js/frappe/form/toolbar.js:209 #: public/js/frappe/form/toolbar.js:490 -#: public/js/frappe/ui/toolbar/search_utils.js:151 -#: public/js/frappe/ui/toolbar/search_utils.js:152 -#: public/js/frappe/ui/toolbar/search_utils.js:201 -#: public/js/frappe/ui/toolbar/search_utils.js:202 +#: public/js/frappe/ui/toolbar/search_utils.js:167 +#: public/js/frappe/ui/toolbar/search_utils.js:168 +#: public/js/frappe/ui/toolbar/search_utils.js:217 +#: public/js/frappe/ui/toolbar/search_utils.js:218 #: public/js/frappe/views/treeview.js:350 #: website/doctype/web_form/web_form.py:310 msgid "New {0}" @@ -19831,7 +19860,7 @@ msgstr "" msgid "New {0}: {1}" msgstr "" -#: utils/change_log.py:298 +#: utils/change_log.py:314 msgid "New {} releases for the following apps are available" msgstr "" @@ -19886,7 +19915,7 @@ msgstr "" msgid "Newsletters" msgstr "" -#: public/js/frappe/form/form_tour.js:316 +#: public/js/frappe/form/form_tour.js:318 #: public/js/onboarding_tours/onboarding_tours.js:15 #: public/js/onboarding_tours/onboarding_tours.js:240 #: templates/includes/slideshow.html:38 website/utils.py:247 @@ -19960,7 +19989,7 @@ msgstr "" #: integrations/doctype/webhook/webhook.py:137 #: public/js/form_builder/utils.js:341 -#: public/js/frappe/form/controls/link.js:471 +#: public/js/frappe/form/controls/link.js:472 #: public/js/frappe/list/list_sidebar_group_by.js:223 #: public/js/frappe/views/reports/query_report.js:1513 #: website/doctype/help_article/templates/help_article.html:26 @@ -20074,7 +20103,7 @@ msgstr "" msgid "No Name Specified for {0}" msgstr "" -#: core/doctype/doctype/doctype.py:1684 +#: core/doctype/doctype/doctype.py:1680 msgid "No Permissions Specified" msgstr "" @@ -20130,7 +20159,7 @@ msgstr "" msgid "No changes made because old and new name are the same." msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1477 +#: public/js/frappe/views/workspace/workspace.js:1483 msgid "No changes made on the page" msgstr "" @@ -20216,7 +20245,7 @@ msgctxt "SMS Log" msgid "No of Sent SMS" msgstr "" -#: __init__.py:1027 client.py:109 client.py:151 +#: __init__.py:1067 client.py:109 client.py:151 msgid "No permission for {0}" msgstr "" @@ -20350,7 +20379,7 @@ msgctxt "DocField" msgid "Not Nullable" msgstr "" -#: __init__.py:921 app.py:354 desk/calendar.py:26 geo/utils.py:97 +#: __init__.py:961 app.py:354 desk/calendar.py:26 geo/utils.py:97 #: public/js/frappe/web_form/webform_script.js:15 #: website/doctype/web_form/web_form.py:603 #: website/page_renderers/not_permitted_page.py:20 www/login.py:177 @@ -20422,7 +20451,7 @@ msgstr "" msgid "Not active" msgstr "" -#: permissions.py:367 +#: permissions.py:370 msgid "Not allowed for {0}: {1}" msgstr "" @@ -20430,7 +20459,7 @@ msgstr "" msgid "Not allowed to attach {0} document, please enable Allow Print For {0} in Print Settings" msgstr "" -#: core/doctype/doctype/doctype.py:338 +#: core/doctype/doctype/doctype.py:334 msgid "Not allowed to create custom Virtual DocType." msgstr "" @@ -20454,12 +20483,12 @@ msgstr "" msgid "Not in Developer Mode" msgstr "" -#: core/doctype/doctype/doctype.py:332 +#: core/doctype/doctype/doctype.py:328 msgid "Not in Developer Mode! Set in site_config.json or make 'Custom' DocType." msgstr "" #: api/v1.py:88 api/v1.py:93 -#: core/doctype/system_settings/system_settings.py:199 handler.py:109 +#: core/doctype/system_settings/system_settings.py:208 handler.py:109 #: public/js/frappe/request.js:157 public/js/frappe/request.js:167 #: public/js/frappe/request.js:172 #: public/js/frappe/views/kanban/kanban_board.bundle.js:68 @@ -20506,7 +20535,7 @@ msgctxt "Google Drive" msgid "Note: By default emails for failed backups are sent." msgstr "" -#: public/js/frappe/utils/utils.js:775 +#: public/js/frappe/utils/utils.js:776 msgid "Note: Changing the Page Name will break previous URL to this page." msgstr "" @@ -20690,7 +20719,7 @@ msgstr "" #. Name of a DocType #: desk/doctype/number_card/number_card.json -#: public/js/frappe/widgets/widget_dialog.js:591 +#: public/js/frappe/widgets/widget_dialog.js:597 msgid "Number Card" msgstr "" @@ -20705,7 +20734,7 @@ msgctxt "Workspace Number Card" msgid "Number Card Name" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:621 +#: public/js/frappe/widgets/widget_dialog.js:627 msgid "Number Cards" msgstr "" @@ -20756,11 +20785,11 @@ msgctxt "Recorder" msgid "Number of Queries" msgstr "" -#: core/doctype/doctype/doctype.py:444 public/js/frappe/doctype/index.js:59 +#: core/doctype/doctype/doctype.py:440 public/js/frappe/doctype/index.js:59 msgid "Number of attachment fields are more than {}, limit updated to {}." msgstr "" -#: core/doctype/system_settings/system_settings.py:152 +#: core/doctype/system_settings/system_settings.py:161 msgid "Number of backups must be greater than zero." msgstr "" @@ -20979,7 +21008,7 @@ msgstr "" msgid "Onboarding complete" msgstr "" -#: core/doctype/doctype/doctype_list.js:28 +#: core/doctype/doctype/doctype_list.js:42 msgid "Once submitted, submittable documents cannot be changed. They can only be Cancelled and Amended." msgstr "" @@ -21001,7 +21030,7 @@ msgstr "" msgid "One of" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1312 +#: public/js/frappe/views/workspace/workspace.js:1318 msgid "One of the child page with name {0} already exist in {1} Section. Please update the name of the child page first before moving" msgstr "" @@ -21021,7 +21050,7 @@ msgstr "" msgid "Only Administrator can save a standard report. Please rename and save." msgstr "" -#: recorder.py:234 +#: recorder.py:227 msgid "Only Administrator is allowed to use Recorder" msgstr "" @@ -21031,7 +21060,7 @@ msgctxt "Workflow Document State" msgid "Only Allow Edit For" msgstr "" -#: core/doctype/doctype/doctype.py:1561 +#: core/doctype/doctype/doctype.py:1557 msgid "Only Options allowed for Data field are:" msgstr "" @@ -21045,7 +21074,7 @@ msgstr "" msgid "Only Workspace Manager can edit public workspaces" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:536 +#: public/js/frappe/views/workspace/workspace.js:542 msgid "Only Workspace Manager can sort or edit this page" msgstr "" @@ -21087,7 +21116,7 @@ msgstr "" msgid "Only standard DocTypes are allowed to be customized from Customize Form." msgstr "" -#: desk/form/assign_to.py:181 +#: desk/form/assign_to.py:195 msgid "Only the assignee can complete this to-do." msgstr "" @@ -21193,13 +21222,13 @@ msgid "Open your authentication app on your mobile phone." msgstr "" #: desk/doctype/todo/todo_list.js:23 -#: public/js/frappe/ui/toolbar/search_utils.js:261 -#: public/js/frappe/ui/toolbar/search_utils.js:262 -#: public/js/frappe/ui/toolbar/search_utils.js:273 -#: public/js/frappe/ui/toolbar/search_utils.js:283 -#: public/js/frappe/ui/toolbar/search_utils.js:292 -#: public/js/frappe/ui/toolbar/search_utils.js:310 -#: public/js/frappe/ui/toolbar/search_utils.js:311 +#: public/js/frappe/ui/toolbar/search_utils.js:277 +#: public/js/frappe/ui/toolbar/search_utils.js:278 +#: public/js/frappe/ui/toolbar/search_utils.js:289 +#: public/js/frappe/ui/toolbar/search_utils.js:299 +#: public/js/frappe/ui/toolbar/search_utils.js:308 +#: public/js/frappe/ui/toolbar/search_utils.js:326 +#: public/js/frappe/ui/toolbar/search_utils.js:327 #: social/doctype/energy_point_log/energy_point_log_list.js:23 msgid "Open {0}" msgstr "" @@ -21228,7 +21257,7 @@ msgctxt "Activity Log" msgid "Operation" msgstr "" -#: utils/data.py:2063 +#: utils/data.py:2057 msgid "Operator must be one of {0}" msgstr "" @@ -21252,7 +21281,7 @@ msgstr "" msgid "Option 3" msgstr "" -#: core/doctype/doctype/doctype.py:1579 +#: core/doctype/doctype/doctype.py:1575 msgid "Option {0} for field {1} is not a child table" msgstr "" @@ -21310,7 +21339,7 @@ msgctxt "Web Template Field" msgid "Options" msgstr "" -#: core/doctype/doctype/doctype.py:1317 +#: core/doctype/doctype/doctype.py:1313 msgid "Options 'Dynamic Link' type of field must point to another Link Field with options as 'DocType'" msgstr "" @@ -21320,7 +21349,7 @@ msgctxt "Custom Field" msgid "Options Help" msgstr "" -#: core/doctype/doctype/doctype.py:1601 +#: core/doctype/doctype/doctype.py:1597 msgid "Options for Rating field can range from 3 to 10" msgstr "" @@ -21328,7 +21357,7 @@ msgstr "" msgid "Options for select. Each option on a new line." msgstr "" -#: core/doctype/doctype/doctype.py:1334 +#: core/doctype/doctype/doctype.py:1330 msgid "Options for {0} must be set before setting the default value." msgstr "" @@ -21336,7 +21365,7 @@ msgstr "" msgid "Options is required for field {0} of type {1}" msgstr "" -#: model/base_document.py:767 +#: model/base_document.py:786 msgid "Options not set for link field {0}" msgstr "" @@ -21672,7 +21701,7 @@ msgctxt "Form Tour" msgid "Page Route" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1499 +#: public/js/frappe/views/workspace/workspace.js:1505 msgid "Page Saved Successfully" msgstr "" @@ -21713,7 +21742,7 @@ msgstr "" msgid "Page not found" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1299 +#: public/js/frappe/views/workspace/workspace.js:1305 msgid "Page with title {0} already exist." msgstr "" @@ -21729,9 +21758,9 @@ msgid "Parameter" msgstr "" #: public/js/frappe/model/model.js:132 -#: public/js/frappe/views/workspace/workspace.js:606 -#: public/js/frappe/views/workspace/workspace.js:934 -#: public/js/frappe/views/workspace/workspace.js:1181 +#: public/js/frappe/views/workspace/workspace.js:612 +#: public/js/frappe/views/workspace/workspace.js:940 +#: public/js/frappe/views/workspace/workspace.js:1187 msgid "Parent" msgstr "" @@ -21769,7 +21798,7 @@ msgctxt "Form Tour Step" msgid "Parent Field" msgstr "" -#: core/doctype/doctype/doctype.py:915 +#: core/doctype/doctype/doctype.py:911 msgid "Parent Field (Tree)" msgstr "" @@ -21779,7 +21808,7 @@ msgctxt "DocType" msgid "Parent Field (Tree)" msgstr "" -#: core/doctype/doctype/doctype.py:921 +#: core/doctype/doctype/doctype.py:917 msgid "Parent Field must be a valid fieldname" msgstr "" @@ -21789,7 +21818,7 @@ msgctxt "Top Bar Item" msgid "Parent Label" msgstr "" -#: core/doctype/doctype/doctype.py:1148 +#: core/doctype/doctype/doctype.py:1144 msgid "Parent Missing" msgstr "" @@ -21811,7 +21840,7 @@ msgstr "" msgid "Parent is the name of the document to which the data will get added to." msgstr "" -#: permissions.py:806 +#: permissions.py:809 msgid "Parentfield not specified in {0}: {1}" msgstr "" @@ -21910,7 +21939,7 @@ msgctxt "System Settings" msgid "Password Reset Link Generation Limit" msgstr "" -#: public/js/frappe/form/grid_row.js:790 +#: public/js/frappe/form/grid_row.js:810 msgid "Password cannot be filtered" msgstr "" @@ -21944,7 +21973,7 @@ msgstr "" msgid "Password set" msgstr "" -#: auth.py:239 +#: auth.py:241 msgid "Password size exceeded the maximum allowed size" msgstr "" @@ -22225,7 +22254,7 @@ msgctxt "System Settings" msgid "Permissions" msgstr "" -#: core/doctype/doctype/doctype.py:1775 core/doctype/doctype/doctype.py:1785 +#: core/doctype/doctype/doctype.py:1771 core/doctype/doctype/doctype.py:1781 msgid "Permissions Error" msgstr "" @@ -22425,7 +22454,7 @@ msgstr "" msgid "Please check the filter values set for Dashboard Chart: {}" msgstr "" -#: model/base_document.py:839 +#: model/base_document.py:858 msgid "Please check the value of \"Fetch From\" set for field {0}" msgstr "" @@ -22481,7 +22510,7 @@ msgstr "" msgid "Please duplicate this to make changes" msgstr "" -#: core/doctype/system_settings/system_settings.py:145 +#: core/doctype/system_settings/system_settings.py:154 msgid "Please enable atleast one Social Login Key or LDAP or Login With Email Link before disabling username/password based login." msgstr "" @@ -22489,7 +22518,7 @@ msgstr "" #: email/doctype/auto_email_report/auto_email_report.js:17 #: printing/page/print/print.js:611 printing/page/print/print.js:640 #: public/js/frappe/list/bulk_operations.js:117 -#: public/js/frappe/utils/utils.js:1416 +#: public/js/frappe/utils/utils.js:1417 msgid "Please enable pop-ups" msgstr "" @@ -22618,7 +22647,7 @@ msgstr "" msgid "Please select Entity Type first" msgstr "" -#: core/doctype/system_settings/system_settings.py:103 +#: core/doctype/system_settings/system_settings.py:105 msgid "Please select Minimum Password Score" msgstr "" @@ -22697,7 +22726,7 @@ msgstr "" msgid "Please set the series to be used." msgstr "" -#: core/doctype/system_settings/system_settings.py:116 +#: core/doctype/system_settings/system_settings.py:118 msgid "Please setup SMS before setting it as an authentication method, via SMS Settings" msgstr "" @@ -22717,7 +22746,7 @@ msgstr "" msgid "Please specify" msgstr "" -#: permissions.py:782 +#: permissions.py:785 msgid "Please specify a valid parent DocType for {0}" msgstr "" @@ -22898,7 +22927,7 @@ msgctxt "Web Form Field" msgid "Precision" msgstr "" -#: core/doctype/doctype/doctype.py:1349 +#: core/doctype/doctype/doctype.py:1345 msgid "Precision should be between 1 and 6" msgstr "" @@ -22954,7 +22983,7 @@ msgstr "" msgid "Preparing Report" msgstr "" -#: public/js/frappe/views/communication.js:321 +#: public/js/frappe/views/communication.js:363 msgid "Prepend the template to the email message" msgstr "" @@ -23075,7 +23104,7 @@ msgstr "" msgid "Print" msgstr "" -#: public/js/frappe/list/list_view.js:1849 +#: public/js/frappe/list/list_view.js:1873 msgctxt "Button in list view actions menu" msgid "Print" msgstr "" @@ -23523,9 +23552,9 @@ msgid "Provider Name" msgstr "" #: desk/doctype/note/note_list.js:6 public/js/frappe/views/interaction.js:78 -#: public/js/frappe/views/workspace/workspace.js:613 -#: public/js/frappe/views/workspace/workspace.js:941 -#: public/js/frappe/views/workspace/workspace.js:1187 +#: public/js/frappe/views/workspace/workspace.js:619 +#: public/js/frappe/views/workspace/workspace.js:947 +#: public/js/frappe/views/workspace/workspace.js:1193 msgid "Public" msgstr "" @@ -23746,6 +23775,12 @@ msgctxt "Dashboard Chart" msgid "Quarterly" msgstr "" +#. Option for the 'Repeat On' (Select) field in DocType 'Event' +#: desk/doctype/event/event.json +msgctxt "Event" +msgid "Quarterly" +msgstr "" + #. Label of a Data field in DocType 'Recorder Query' #: core/doctype/recorder_query/recorder_query.json msgctxt "Recorder Query" @@ -23819,7 +23854,7 @@ msgctxt "DocType" msgid "Queue in Background (BETA)" msgstr "" -#: utils/background_jobs.py:473 +#: utils/background_jobs.py:433 msgid "Queue should be one of {0}" msgstr "" @@ -24028,13 +24063,13 @@ msgstr "" msgid "Re-Run in Console" msgstr "" -#: email/doctype/email_account/email_account.py:630 +#: email/doctype/email_account/email_account.py:632 msgid "Re:" msgstr "" #: core/doctype/communication/communication.js:268 -#: public/js/frappe/form/footer/form_timeline.js:564 -#: public/js/frappe/views/communication.js:257 +#: public/js/frappe/form/footer/form_timeline.js:587 +#: public/js/frappe/views/communication.js:299 msgid "Re: {0}" msgstr "" @@ -24242,7 +24277,7 @@ msgstr "" msgid "Recent years are easy to guess." msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:516 +#: public/js/frappe/ui/toolbar/search_utils.js:532 msgid "Recents" msgstr "" @@ -24347,7 +24382,7 @@ msgctxt "Website Settings" msgid "Redirects" msgstr "" -#: sessions.py:148 +#: sessions.py:149 msgid "Redis cache server not running. Please contact Administrator / Tech support" msgstr "" @@ -24951,7 +24986,7 @@ msgstr "" msgid "Removed {0}" msgstr "" -#: custom/doctype/custom_field/custom_field.js:133 +#: custom/doctype/custom_field/custom_field.js:134 #: public/js/frappe/form/toolbar.js:234 public/js/frappe/form/toolbar.js:238 #: public/js/frappe/form/toolbar.js:398 public/js/frappe/model/model.js:737 #: public/js/frappe/views/treeview.js:295 @@ -24959,7 +24994,7 @@ msgid "Rename" msgstr "" #: custom/doctype/custom_field/custom_field.js:115 -#: custom/doctype/custom_field/custom_field.js:132 +#: custom/doctype/custom_field/custom_field.js:133 msgid "Rename Fieldname" msgstr "" @@ -24967,7 +25002,7 @@ msgstr "" msgid "Rename {0}" msgstr "" -#: core/doctype/doctype/doctype.py:688 +#: core/doctype/doctype/doctype.py:684 msgid "Renamed files and replaced code in controllers, please check!" msgstr "" @@ -25274,7 +25309,7 @@ msgctxt "Report" msgid "Report Type" msgstr "" -#: core/doctype/doctype/doctype.py:1750 +#: core/doctype/doctype/doctype.py:1746 msgid "Report cannot be set for Single types" msgstr "" @@ -25312,8 +25347,8 @@ msgstr "" msgid "Report with more than 10 columns looks better in Landscape mode." msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:235 -#: public/js/frappe/ui/toolbar/search_utils.js:236 +#: public/js/frappe/ui/toolbar/search_utils.js:251 +#: public/js/frappe/ui/toolbar/search_utils.js:252 msgid "Report {0}" msgstr "" @@ -25333,7 +25368,7 @@ msgstr "" msgid "Report:" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:531 +#: public/js/frappe/ui/toolbar/search_utils.js:547 msgid "Reports" msgstr "" @@ -25656,8 +25691,8 @@ msgctxt "Title of message showing restrictions in list view" msgid "Restrictions" msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:354 -#: public/js/frappe/ui/toolbar/awesome_bar.js:369 +#: public/js/frappe/ui/toolbar/awesome_bar.js:356 +#: public/js/frappe/ui/toolbar/awesome_bar.js:371 msgid "Result" msgstr "" @@ -26181,19 +26216,19 @@ msgctxt "Role" msgid "Route: Example \"/desk\"" msgstr "" -#: model/base_document.py:710 model/base_document.py:751 model/document.py:591 +#: model/base_document.py:729 model/base_document.py:770 model/document.py:591 msgid "Row" msgstr "" -#: core/doctype/doctype/doctype.py:1772 core/doctype/doctype/doctype.py:1782 +#: core/doctype/doctype/doctype.py:1768 core/doctype/doctype/doctype.py:1778 msgid "Row # {0}: Non administrator user can not set the role {1} to the custom doctype" msgstr "" -#: model/base_document.py:868 +#: model/base_document.py:887 msgid "Row #{0}:" msgstr "" -#: core/doctype/doctype/doctype.py:492 +#: core/doctype/doctype/doctype.py:488 msgid "Row #{}: Fieldname is required" msgstr "" @@ -26259,7 +26294,7 @@ msgctxt "Energy Point Rule" msgid "Rule Name" msgstr "" -#: permissions.py:662 +#: permissions.py:665 msgid "Rule for this doctype, role, permlevel and if-owner combination already exists." msgstr "" @@ -26508,7 +26543,7 @@ msgstr "" #: desk/page/user_profile/user_profile_controller.js:319 #: printing/page/print/print.js:831 #: printing/page/print_format_builder/print_format_builder.js:160 -#: public/js/frappe/form/footer/form_timeline.js:638 +#: public/js/frappe/form/footer/form_timeline.js:661 #: public/js/frappe/form/quick_entry.js:156 #: public/js/frappe/list/list_settings.js:36 #: public/js/frappe/list/list_settings.js:244 @@ -26520,7 +26555,7 @@ msgstr "" #: public/js/frappe/views/kanban/kanban_view.js:340 #: public/js/frappe/views/reports/query_report.js:1785 #: public/js/frappe/views/reports/report_view.js:1631 -#: public/js/frappe/views/workspace/workspace.js:487 +#: public/js/frappe/views/workspace/workspace.js:493 #: public/js/frappe/widgets/base_widget.js:140 #: public/js/frappe/widgets/quick_list_widget.js:117 #: public/js/print_format_builder/print_format_builder.bundle.js:15 @@ -26565,7 +26600,7 @@ msgctxt "Form Tour" msgid "Save on Completion" msgstr "" -#: public/js/frappe/form/form_tour.js:287 +#: public/js/frappe/form/form_tour.js:289 msgid "Save the document." msgstr "" @@ -26578,7 +26613,7 @@ msgstr "" #: public/js/frappe/list/list_settings.js:40 #: public/js/frappe/views/kanban/kanban_settings.js:47 -#: public/js/frappe/views/workspace/workspace.js:499 +#: public/js/frappe/views/workspace/workspace.js:505 msgid "Saving" msgstr "" @@ -26847,6 +26882,12 @@ msgstr "" msgid "Search" msgstr "" +#. Label of a Section Break field in DocType 'System Settings' +#: core/doctype/system_settings/system_settings.json +msgctxt "System Settings" +msgid "Search" +msgstr "" + #. Label of a Check field in DocType 'Role' #: core/doctype/role/role.json msgctxt "Role" @@ -26879,7 +26920,7 @@ msgstr "" msgid "Search Results for" msgstr "" -#: core/doctype/doctype/doctype.py:1418 +#: core/doctype/doctype/doctype.py:1414 msgid "Search field {0} is not valid" msgstr "" @@ -27179,7 +27220,7 @@ msgstr "" msgid "Select Filters" msgstr "" -#: desk/doctype/event/event.py:96 +#: desk/doctype/event/event.py:97 msgid "Select Google Calendar to which event should be synced." msgstr "" @@ -27278,15 +27319,15 @@ msgstr "" msgid "Select a group node first." msgstr "" -#: core/doctype/doctype/doctype.py:1885 +#: core/doctype/doctype/doctype.py:1881 msgid "Select a valid Sender Field for creating documents from Email" msgstr "" -#: core/doctype/doctype/doctype.py:1869 +#: core/doctype/doctype/doctype.py:1865 msgid "Select a valid Subject field for creating documents from Email" msgstr "" -#: public/js/frappe/form/form_tour.js:313 +#: public/js/frappe/form/form_tour.js:315 msgid "Select an Image" msgstr "" @@ -27324,6 +27365,10 @@ msgstr "" msgid "Select records for assignment" msgstr "" +#: public/js/frappe/list/bulk_operations.js:216 +msgid "Select records for removing assignment" +msgstr "" + #. Description of the 'Insert After' (Select) field in DocType 'Custom Field' #: custom/doctype/custom_field/custom_field.json msgctxt "Custom Field" @@ -27625,7 +27670,7 @@ msgctxt "DocType" msgid "Sender Email Field" msgstr "" -#: core/doctype/doctype/doctype.py:1888 +#: core/doctype/doctype/doctype.py:1884 msgid "Sender Field should have Email in options" msgstr "" @@ -27763,7 +27808,7 @@ msgstr "" msgid "Series counter for {} updated to {} successfully" msgstr "" -#: core/doctype/doctype/doctype.py:1073 +#: core/doctype/doctype/doctype.py:1069 #: core/doctype/document_naming_settings/document_naming_settings.py:171 msgid "Series {0} already used in {1}" msgstr "" @@ -27874,7 +27919,7 @@ msgctxt "System Settings" msgid "Session Expiry (idle timeout)" msgstr "" -#: core/doctype/system_settings/system_settings.py:110 +#: core/doctype/system_settings/system_settings.py:112 msgid "Session Expiry must be in format {0}" msgstr "" @@ -28092,7 +28137,7 @@ msgstr "" #. Label of a Card Break in the Integrations Workspace #: integrations/workspace/integrations/integrations.json #: public/js/frappe/ui/toolbar/toolbar.js:254 -#: public/js/frappe/views/workspace/workspace.js:515 +#: public/js/frappe/views/workspace/workspace.js:521 msgid "Settings" msgstr "" @@ -28128,7 +28173,7 @@ msgid "Settings Dropdown" msgstr "" #. Label of a Card Break in the Website Workspace -#: public/js/frappe/ui/toolbar/search_utils.js:551 +#: public/js/frappe/ui/toolbar/search_utils.js:567 #: website/workspace/website/website.json msgid "Setup" msgstr "" @@ -28675,7 +28720,7 @@ msgstr "" msgid "Single DocTypes cannot be customized." msgstr "" -#: core/doctype/doctype/doctype_list.js:51 +#: core/doctype/doctype/doctype_list.js:67 msgid "Single Types have only one record no tables associated. Values are stored in tabSingles" msgstr "" @@ -28685,7 +28730,7 @@ msgctxt "DocType" msgid "Single Types have only one record no tables associated. Values are stored in tabSingles" msgstr "" -#: database/database.py:230 +#: database/database.py:238 msgid "Site is running in read only mode for maintenance or site update, this action can not be performed right now. Please try again later." msgstr "" @@ -28928,11 +28973,11 @@ msgctxt "Customize Form" msgid "Sort Order" msgstr "" -#: core/doctype/doctype/doctype.py:1501 +#: core/doctype/doctype/doctype.py:1497 msgid "Sort field {0} must be a valid fieldname" msgstr "" -#: public/js/frappe/utils/utils.js:1705 +#: public/js/frappe/utils/utils.js:1706 #: website/report/website_analytics/website_analytics.js:38 msgid "Source" msgstr "" @@ -29049,7 +29094,7 @@ msgstr "" msgid "Standard DocType can not be deleted." msgstr "" -#: core/doctype/doctype/doctype.py:228 +#: core/doctype/doctype/doctype.py:224 msgid "Standard DocType cannot have default print format, use Customize Form" msgstr "" @@ -29599,7 +29644,7 @@ msgctxt "DocType" msgid "Subject Field" msgstr "" -#: core/doctype/doctype/doctype.py:1878 +#: core/doctype/doctype/doctype.py:1874 msgid "Subject Field type should be Data, Text, Long Text, Small Text, Text Editor" msgstr "" @@ -29618,7 +29663,7 @@ msgstr "" msgid "Submit" msgstr "" -#: public/js/frappe/list/list_view.js:1916 +#: public/js/frappe/list/list_view.js:1940 msgctxt "Button in list view actions menu" msgid "Submit" msgstr "" @@ -29705,7 +29750,7 @@ msgstr "" msgid "Submit this document to confirm" msgstr "" -#: public/js/frappe/list/list_view.js:1921 +#: public/js/frappe/list/list_view.js:1945 msgctxt "Title of confirmation dialog" msgid "Submit {0} documents?" msgstr "" @@ -29766,7 +29811,7 @@ msgstr "" #: core/doctype/data_import/data_import.js:470 #: desk/doctype/bulk_update/bulk_update.js:31 #: desk/doctype/desktop_icon/desktop_icon.py:452 -#: public/js/frappe/form/grid.js:1133 +#: public/js/frappe/form/grid.js:1135 #: public/js/frappe/views/translation_manager.js:21 #: templates/pages/integrations/gcalendar-success.html:9 #: workflow/doctype/workflow_action/workflow_action.py:171 @@ -30034,7 +30079,7 @@ msgstr "" msgid "Syncing {0} of {1}" msgstr "" -#: utils/data.py:2424 +#: utils/data.py:2418 msgid "Syntax Error" msgstr "" @@ -30292,7 +30337,7 @@ msgctxt "DocType Link" msgid "Table Fieldname" msgstr "" -#: core/doctype/doctype/doctype.py:1154 +#: core/doctype/doctype/doctype.py:1150 msgid "Table Fieldname Missing" msgstr "" @@ -30320,7 +30365,7 @@ msgctxt "DocField" msgid "Table MultiSelect" msgstr "" -#: public/js/frappe/form/grid.js:1132 +#: public/js/frappe/form/grid.js:1134 msgid "Table updated" msgstr "" @@ -30345,14 +30390,14 @@ msgid "Tag Link" msgstr "" #: model/__init__.py:148 model/meta.py:52 -#: public/js/frappe/list/bulk_operations.js:365 +#: public/js/frappe/list/bulk_operations.js:386 #: public/js/frappe/list/list_sidebar.js:226 public/js/frappe/model/meta.js:204 #: public/js/frappe/model/model.js:123 #: public/js/frappe/ui/toolbar/awesome_bar.js:171 msgid "Tags" msgstr "" -#: integrations/doctype/google_drive/google_drive.js:28 +#: integrations/doctype/google_drive/google_drive.js:29 msgid "Take Backup" msgstr "" @@ -30573,7 +30618,7 @@ msgstr "" msgid "The Auto Repeat for this document has been disabled." msgstr "" -#: public/js/frappe/form/grid.js:1155 +#: public/js/frappe/form/grid.js:1157 msgid "The CSV format is case sensitive" msgstr "" @@ -30622,7 +30667,7 @@ msgid "" "" msgstr "" -#: database/database.py:388 +#: database/database.py:424 msgid "The changes have been reverted." msgstr "" @@ -30664,6 +30709,10 @@ msgstr "" msgid "The fieldname you've specified in Attached To Field is invalid" msgstr "" +#: automation/doctype/assignment_rule/assignment_rule.py:61 +msgid "The following Assignment Days have been repeated: {0}" +msgstr "" + #: core/doctype/data_import/importer.py:1035 msgid "The following values are invalid: {0}. Values must be one of {1}" msgstr "" @@ -30755,7 +30804,7 @@ msgstr "" msgid "The system is being updated. Please refresh again after a few moments." msgstr "" -#: public/js/frappe/form/grid_row.js:615 +#: public/js/frappe/form/grid_row.js:635 msgid "The total column width cannot be more than 10." msgstr "" @@ -30822,7 +30871,7 @@ msgstr "" msgid "There can be only 9 Page Break fields in a Web Form" msgstr "" -#: core/doctype/doctype/doctype.py:1394 +#: core/doctype/doctype/doctype.py:1390 msgid "There can be only one Fold in a form" msgstr "" @@ -30862,7 +30911,7 @@ msgstr "" msgid "There were errors while creating the document. Please try again." msgstr "" -#: public/js/frappe/views/communication.js:728 +#: public/js/frappe/views/communication.js:770 msgid "There were errors while sending email. Please try again." msgstr "" @@ -30913,7 +30962,7 @@ msgstr "" msgid "This Kanban Board will be private" msgstr "" -#: __init__.py:917 +#: __init__.py:957 msgid "This action is only allowed for {}" msgstr "" @@ -31350,11 +31399,11 @@ msgctxt "Activity Log" msgid "Timeline Name" msgstr "" -#: core/doctype/doctype/doctype.py:1489 +#: core/doctype/doctype/doctype.py:1485 msgid "Timeline field must be a Link or Dynamic Link" msgstr "" -#: core/doctype/doctype/doctype.py:1485 +#: core/doctype/doctype/doctype.py:1481 msgid "Timeline field must be a valid fieldname" msgstr "" @@ -31398,9 +31447,9 @@ msgid "Timestamp" msgstr "" #: public/js/form_builder/store.js:89 -#: public/js/frappe/views/workspace/workspace.js:599 -#: public/js/frappe/views/workspace/workspace.js:928 -#: public/js/frappe/views/workspace/workspace.js:1175 +#: public/js/frappe/views/workspace/workspace.js:605 +#: public/js/frappe/views/workspace/workspace.js:934 +#: public/js/frappe/views/workspace/workspace.js:1181 msgid "Title" msgstr "" @@ -31542,7 +31591,7 @@ msgctxt "Website Settings" msgid "Title Prefix" msgstr "" -#: core/doctype/doctype/doctype.py:1426 +#: core/doctype/doctype/doctype.py:1422 msgid "Title field must be a valid fieldname" msgstr "" @@ -31800,7 +31849,7 @@ msgstr "" msgid "Too Many Requests" msgstr "" -#: database/database.py:387 +#: database/database.py:423 msgid "Too many changes to database in single action." msgstr "" @@ -31999,7 +32048,7 @@ msgid "" "Note: If you're sending to multiple recipients, even if 1 recipient reads the email, it'll be considered \"Opened\"" msgstr "" -#: public/js/frappe/utils/utils.js:1744 +#: public/js/frappe/utils/utils.js:1745 msgid "Tracking URL generated and copied to clipboard" msgstr "" @@ -32475,7 +32524,7 @@ msgstr "" msgid "Unhandled Email" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:556 +#: public/js/frappe/views/workspace/workspace.js:562 msgid "Unhide Workspace" msgstr "" @@ -32505,7 +32554,7 @@ msgstr "" msgid "Unknown Rounding Method: {}" msgstr "" -#: auth.py:299 +#: auth.py:301 msgid "Unknown User" msgstr "" @@ -32604,7 +32653,7 @@ msgstr "" msgid "Unzipping files..." msgstr "" -#: desk/doctype/event/event.py:258 +#: desk/doctype/event/event.py:259 msgid "Upcoming Events for Today" msgstr "" @@ -32617,7 +32666,7 @@ msgstr "" #: printing/page/print_format_builder/print_format_builder.js:670 #: printing/page/print_format_builder/print_format_builder.js:757 #: public/js/frappe/form/grid_row.js:402 -#: public/js/frappe/views/workspace/workspace.js:647 +#: public/js/frappe/views/workspace/workspace.js:653 msgid "Update" msgstr "" @@ -32633,7 +32682,7 @@ msgctxt "Document Naming Settings" msgid "Update Amendment Naming" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:596 +#: public/js/frappe/views/workspace/workspace.js:602 msgid "Update Details" msgstr "" @@ -32692,7 +32741,7 @@ msgctxt "Workflow Document State" msgid "Update Value" msgstr "" -#: public/js/frappe/list/bulk_operations.js:310 +#: public/js/frappe/list/bulk_operations.js:331 msgid "Update {0} records" msgstr "" @@ -32721,7 +32770,7 @@ msgstr "" msgid "Updated To A New Version 🎉" msgstr "" -#: public/js/frappe/list/bulk_operations.js:307 +#: public/js/frappe/list/bulk_operations.js:328 msgid "Updated successfully" msgstr "" @@ -32785,6 +32834,18 @@ msgctxt "File" msgid "Uploaded To Google Drive" msgstr "" +#: integrations/doctype/google_drive/google_drive.py:199 +msgid "Uploading backup to Google Drive." +msgstr "" + +#: integrations/doctype/google_drive/google_drive.py:204 +msgid "Uploading successful." +msgstr "" + +#: integrations/doctype/google_drive/google_drive.js:16 +msgid "Uploading to Google Drive" +msgstr "" + #. Description of the 'Value to Validate' (Data) field in DocType 'Onboarding #. Step' #: desk/doctype/onboarding_step/onboarding_step.json @@ -33230,7 +33291,7 @@ msgid "User Permissions" msgstr "" #: core/doctype/user_permission/user_permission_list.js:124 -msgid "User Permissions created sucessfully" +msgid "User Permissions created successfully" msgstr "" #. Label of a shortcut in the Users Workspace @@ -33456,8 +33517,8 @@ msgid "Validity" msgstr "" #: email/doctype/auto_email_report/auto_email_report.js:92 -#: public/js/frappe/list/bulk_operations.js:271 -#: public/js/frappe/list/bulk_operations.js:333 +#: public/js/frappe/list/bulk_operations.js:292 +#: public/js/frappe/list/bulk_operations.js:354 msgid "Value" msgstr "" @@ -33534,7 +33595,7 @@ msgctxt "Notification" msgid "Value To Be Set" msgstr "" -#: model/base_document.py:930 model/document.py:648 +#: model/base_document.py:949 model/document.py:648 msgid "Value cannot be changed for {0}" msgstr "" @@ -33554,7 +33615,7 @@ msgstr "" msgid "Value for field {0} is too long in {1}. Length should be lesser than {2} characters" msgstr "" -#: model/base_document.py:360 +#: model/base_document.py:379 msgid "Value for {0} cannot be a list" msgstr "" @@ -33565,7 +33626,7 @@ msgctxt "Assignment Rule" msgid "Value from this field will be set as the due date in the ToDo" msgstr "" -#: model/base_document.py:712 +#: model/base_document.py:731 msgid "Value missing for" msgstr "" @@ -33579,7 +33640,7 @@ msgctxt "Onboarding Step" msgid "Value to Validate" msgstr "" -#: model/base_document.py:997 +#: model/base_document.py:1016 msgid "Value too big" msgstr "" @@ -33909,7 +33970,7 @@ msgstr "" msgid "Web Page Block" msgstr "" -#: public/js/frappe/utils/utils.js:1697 +#: public/js/frappe/utils/utils.js:1698 msgid "Web Page URL" msgstr "" @@ -34122,7 +34183,7 @@ msgctxt "DocType" msgid "Website Search Field" msgstr "" -#: core/doctype/doctype/doctype.py:1473 +#: core/doctype/doctype/doctype.py:1469 msgid "Website Search Field must be a valid fieldname" msgstr "" @@ -34405,7 +34466,7 @@ msgctxt "System Settings" msgid "When uploading files, force the use of the web-based image capture. If this is unchecked, the default behavior is to use the mobile native camera when use from a mobile is detected." msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:440 +#: public/js/frappe/widgets/widget_dialog.js:446 msgid "Which view of the associated DocType should this shortcut take you to?" msgstr "" @@ -34637,7 +34698,7 @@ msgstr "" #. Name of a DocType #: desk/doctype/workspace/workspace.json -#: public/js/frappe/ui/toolbar/search_utils.js:541 +#: public/js/frappe/ui/toolbar/search_utils.js:557 #: public/js/frappe/views/workspace/workspace.js:10 msgid "Workspace" msgstr "" @@ -34694,15 +34755,19 @@ msgstr "" msgid "Workspace Shortcut" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:1265 +#: desk/doctype/workspace/workspace.py:283 +msgid "Workspace not found" +msgstr "" + +#: public/js/frappe/views/workspace/workspace.js:1271 msgid "Workspace {0} Created Successfully" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:894 +#: public/js/frappe/views/workspace/workspace.js:900 msgid "Workspace {0} Deleted Successfully" msgstr "" -#: public/js/frappe/views/workspace/workspace.js:672 +#: public/js/frappe/views/workspace/workspace.js:678 msgid "Workspace {0} Edited Successfully" msgstr "" @@ -34736,7 +34801,7 @@ msgctxt "User Document Type" msgid "Write" msgstr "" -#: model/base_document.py:840 +#: model/base_document.py:859 msgid "Wrong Fetch From value" msgstr "" @@ -34861,7 +34926,7 @@ msgstr "" #: integrations/doctype/webhook/webhook.py:127 #: integrations/doctype/webhook/webhook.py:137 #: public/js/form_builder/utils.js:336 -#: public/js/frappe/form/controls/link.js:471 +#: public/js/frappe/form/controls/link.js:472 #: public/js/frappe/list/list_sidebar_group_by.js:223 #: public/js/frappe/views/reports/query_report.js:1513 #: website/doctype/help_article/templates/help_article.html:25 @@ -34916,11 +34981,11 @@ msgstr "" msgid "You are connected to internet." msgstr "" -#: permissions.py:417 +#: permissions.py:420 msgid "You are not allowed to access this {0} record because it is linked to {1} '{2}' in field {3}" msgstr "" -#: permissions.py:406 +#: permissions.py:409 msgid "You are not allowed to access this {0} record because it is linked to {1} '{2}' in row {3}, field {4}" msgstr "" @@ -34940,7 +35005,7 @@ msgstr "" msgid "You are not allowed to edit the report." msgstr "" -#: permissions.py:614 +#: permissions.py:617 msgid "You are not allowed to export {} doctype" msgstr "" @@ -34948,7 +35013,7 @@ msgstr "" msgid "You are not allowed to print this report" msgstr "" -#: public/js/frappe/views/communication.js:673 +#: public/js/frappe/views/communication.js:715 msgid "You are not allowed to send emails related to this document" msgstr "" @@ -34968,7 +35033,7 @@ msgstr "" msgid "You are not permitted to access this page." msgstr "" -#: __init__.py:834 +#: __init__.py:874 msgid "You are not permitted to access this resource." msgstr "" @@ -35021,7 +35086,7 @@ msgstr "" msgid "You can manually remove the lock if you think it's safe: {}" msgstr "" -#: public/js/frappe/form/controls/markdown_editor.js:74 +#: public/js/frappe/form/controls/markdown_editor.js:75 msgid "You can only insert images in Markdown fields" msgstr "" @@ -35169,7 +35234,7 @@ msgstr "" msgid "You have hit the row size limit on database table: {0}" msgstr "" -#: public/js/frappe/list/bulk_operations.js:347 +#: public/js/frappe/list/bulk_operations.js:368 msgid "You have not entered a value. The field will be set to empty." msgstr "" @@ -35202,7 +35267,7 @@ msgstr "" msgid "You last edited this" msgstr "" -#: public/js/frappe/widgets/widget_dialog.js:308 +#: public/js/frappe/widgets/widget_dialog.js:314 msgid "You must add atleast one link." msgstr "" @@ -35214,7 +35279,7 @@ msgstr "" msgid "You must login to submit this form" msgstr "" -#: desk/doctype/workspace/workspace.py:69 +#: desk/doctype/workspace/workspace.py:72 msgid "You need to be Workspace Manager to edit this document" msgstr "" @@ -35310,11 +35375,11 @@ msgstr "" msgid "Your account has been deleted" msgstr "" -#: auth.py:465 +#: auth.py:476 msgid "Your account has been locked and will resume after {0} seconds" msgstr "" -#: desk/form/assign_to.py:268 +#: desk/form/assign_to.py:282 msgid "Your assignment on {0} {1} has been removed by {2}" msgstr "" @@ -35389,6 +35454,10 @@ msgctxt "Desktop Icon" msgid "_report" msgstr "" +#: database/database.py:315 +msgid "`as_iterator` only works with `as_list=True` or `as_dict=True`" +msgstr "" + #: utils/background_jobs.py:94 msgid "`job_id` paramater is required for deduplication." msgstr "" @@ -35440,7 +35509,7 @@ msgctxt "Permission Inspector" msgid "amend" msgstr "" -#: public/js/frappe/utils/utils.js:396 utils/data.py:1528 +#: public/js/frappe/utils/utils.js:396 utils/data.py:1526 msgid "and" msgstr "" @@ -35542,7 +35611,7 @@ msgctxt "Workflow State" msgid "bullhorn" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:270 +#: public/js/frappe/ui/toolbar/search_utils.js:286 msgid "calendar" msgstr "" @@ -35660,7 +35729,7 @@ msgctxt "Workspace" msgid "cyan" msgstr "" -#: public/js/frappe/utils/utils.js:1113 +#: public/js/frappe/utils/utils.js:1114 msgctxt "Days (Field: Duration)" msgid "d" msgstr "" @@ -35810,12 +35879,12 @@ msgctxt "Social Link Settings" msgid "email" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:289 +#: public/js/frappe/ui/toolbar/search_utils.js:305 msgid "email inbox" msgstr "" -#: permissions.py:411 permissions.py:422 -#: public/js/frappe/form/controls/link.js:479 +#: permissions.py:414 permissions.py:425 +#: public/js/frappe/form/controls/link.js:481 msgid "empty" msgstr "" @@ -35994,11 +36063,11 @@ msgctxt "Workspace" msgid "grey" msgstr "" -#: utils/backups.py:375 +#: utils/backups.py:379 msgid "gzip not found in PATH! This is required to take a backup." msgstr "" -#: public/js/frappe/utils/utils.js:1117 +#: public/js/frappe/utils/utils.js:1118 msgctxt "Hours (Field: Duration)" msgid "h" msgstr "" @@ -36051,7 +36120,7 @@ msgctxt "Workflow State" msgid "home" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:280 +#: public/js/frappe/ui/toolbar/search_utils.js:296 msgid "hub" msgstr "" @@ -36181,7 +36250,7 @@ msgctxt "RQ Worker" msgid "long" msgstr "" -#: public/js/frappe/utils/utils.js:1121 +#: public/js/frappe/utils/utils.js:1122 msgctxt "Minutes (Field: Duration)" msgid "m" msgstr "" @@ -36253,7 +36322,7 @@ msgctxt "Workflow State" msgid "music" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:144 +#: public/js/frappe/ui/toolbar/search_utils.js:160 msgid "new" msgstr "" @@ -36357,10 +36426,6 @@ msgstr "" msgid "one of" msgstr "" -#: utils/data.py:1535 -msgid "only." -msgstr "" - #: public/js/frappe/utils/utils.js:393 www/login.html:87 msgid "or" msgstr "" @@ -36597,7 +36662,7 @@ msgctxt "Workflow State" msgid "road" msgstr "" -#: public/js/frappe/utils/utils.js:1125 +#: public/js/frappe/utils/utils.js:1126 msgctxt "Seconds (Field: Duration)" msgid "s" msgstr "" @@ -36888,7 +36953,7 @@ msgctxt "Audit Trail" msgid "version_table" msgstr "" -#: automation/doctype/assignment_rule/assignment_rule.py:386 +#: automation/doctype/assignment_rule/assignment_rule.py:383 msgid "via Assignment Rule" msgstr "" @@ -36991,21 +37056,15 @@ msgctxt "Workflow State" msgid "zoom-out" msgstr "" -#: desk/doctype/event/event.js:83 -#: integrations/doctype/google_drive/google_drive.js:19 +#: desk/doctype/event/event.js:87 msgid "{0}" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:81 -#: public/js/frappe/ui/toolbar/search_utils.js:82 -msgid "{0} ${label}" -msgstr "" - -#: public/js/frappe/ui/toolbar/search_utils.js:177 +#: public/js/frappe/ui/toolbar/search_utils.js:193 msgid "{0} ${skip_list ? \"\" : type}" msgstr "" -#: public/js/frappe/ui/toolbar/search_utils.js:182 +#: public/js/frappe/ui/toolbar/search_utils.js:198 msgid "{0} ${type}" msgstr "" @@ -37022,8 +37081,8 @@ msgstr "" msgid "{0} ({1}) - {2}%" msgstr "" -#: public/js/frappe/ui/toolbar/awesome_bar.js:346 -#: public/js/frappe/ui/toolbar/awesome_bar.js:349 +#: public/js/frappe/ui/toolbar/awesome_bar.js:348 +#: public/js/frappe/ui/toolbar/awesome_bar.js:351 msgid "{0} = {1}" msgstr "" @@ -37036,9 +37095,9 @@ msgid "{0} Chart" msgstr "" #: core/page/dashboard_view/dashboard_view.js:67 -#: public/js/frappe/ui/toolbar/search_utils.js:331 -#: public/js/frappe/ui/toolbar/search_utils.js:332 -#: public/js/frappe/utils/utils.js:929 +#: public/js/frappe/ui/toolbar/search_utils.js:347 +#: public/js/frappe/ui/toolbar/search_utils.js:348 +#: public/js/frappe/utils/utils.js:930 #: public/js/frappe/views/dashboard/dashboard_view.js:10 msgid "{0} Dashboard" msgstr "" @@ -37061,7 +37120,9 @@ msgstr "" msgid "{0} Liked" msgstr "" -#: public/js/frappe/utils/utils.js:923 +#: public/js/frappe/ui/toolbar/search_utils.js:83 +#: public/js/frappe/ui/toolbar/search_utils.js:84 +#: public/js/frappe/utils/utils.js:924 #: public/js/frappe/widgets/chart_widget.js:317 www/list.html:4 www/list.html:8 msgid "{0} List" msgstr "" @@ -37074,7 +37135,7 @@ msgstr "" msgid "{0} Map" msgstr "" -#: public/js/frappe/utils/utils.js:926 +#: public/js/frappe/utils/utils.js:927 msgid "{0} Modules" msgstr "" @@ -37082,11 +37143,13 @@ msgstr "" msgid "{0} Name" msgstr "" -#: model/base_document.py:1027 +#: model/base_document.py:1046 msgid "{0} Not allowed to change {1} after submission from {2} to {3}" msgstr "" -#: public/js/frappe/utils/utils.js:920 +#: public/js/frappe/ui/toolbar/search_utils.js:95 +#: public/js/frappe/ui/toolbar/search_utils.js:96 +#: public/js/frappe/utils/utils.js:921 #: public/js/frappe/widgets/chart_widget.js:325 msgid "{0} Report" msgstr "" @@ -37096,6 +37159,8 @@ msgstr "" msgid "{0} Settings" msgstr "" +#: public/js/frappe/ui/toolbar/search_utils.js:87 +#: public/js/frappe/ui/toolbar/search_utils.js:88 #: public/js/frappe/views/treeview.js:139 msgid "{0} Tree" msgstr "" @@ -37109,6 +37174,11 @@ msgstr "" msgid "{0} Web page views" msgstr "" +#: public/js/frappe/ui/toolbar/search_utils.js:91 +#: public/js/frappe/ui/toolbar/search_utils.js:92 +msgid "{0} Workspace" +msgstr "" + #: public/js/frappe/form/link_selector.js:225 msgid "{0} added" msgstr "" @@ -37125,7 +37195,7 @@ msgstr "" msgid "{0} already unsubscribed for {1} {2}" msgstr "" -#: utils/data.py:1715 +#: utils/data.py:1709 msgid "{0} and {1}" msgstr "" @@ -37163,7 +37233,7 @@ msgstr "" msgid "{0} are required" msgstr "" -#: desk/form/assign_to.py:275 +#: desk/form/assign_to.py:289 msgid "{0} assigned a new task {1} {2} to you" msgstr "" @@ -37176,6 +37246,10 @@ msgctxt "Form timeline" msgid "{0} attached {1}" msgstr "" +#: core/doctype/system_settings/system_settings.py:139 +msgid "{0} can not be more than {1}" +msgstr "" + #: public/js/frappe/form/footer/version_timeline_content_builder.js:77 msgid "{0} cancelled this document" msgstr "" @@ -37310,7 +37384,7 @@ msgstr "" msgid "{0} has left the conversation in {1} {2}" msgstr "" -#: __init__.py:2373 +#: __init__.py:2427 msgid "{0} has no versions tracked." msgstr "" @@ -37327,7 +37401,7 @@ msgstr "" msgid "{0} in row {1} cannot have both URL and child items" msgstr "" -#: core/doctype/doctype/doctype.py:916 +#: core/doctype/doctype/doctype.py:912 msgid "{0} is a mandatory field" msgstr "" @@ -37335,7 +37409,7 @@ msgstr "" msgid "{0} is a not a valid zip file" msgstr "" -#: core/doctype/doctype/doctype.py:1559 +#: core/doctype/doctype/doctype.py:1555 msgid "{0} is an invalid Data field." msgstr "" @@ -37412,11 +37486,11 @@ msgstr "" msgid "{0} is not a valid Workflow State. Please update your Workflow and try again." msgstr "" -#: permissions.py:795 +#: permissions.py:798 msgid "{0} is not a valid parent DocType for {1}" msgstr "" -#: permissions.py:815 +#: permissions.py:818 msgid "{0} is not a valid parentfield for {1}" msgstr "" @@ -37506,11 +37580,11 @@ msgstr "" msgid "{0} must be one of {1}" msgstr "" -#: model/base_document.py:771 +#: model/base_document.py:790 msgid "{0} must be set first" msgstr "" -#: model/base_document.py:629 +#: model/base_document.py:648 msgid "{0} must be unique" msgstr "" @@ -37544,7 +37618,12 @@ msgstr "" msgid "{0} of {1} sent" msgstr "" -#: utils/data.py:1705 +#: utils/data.py:1529 +msgctxt "Money in words" +msgid "{0} only." +msgstr "" + +#: utils/data.py:1699 msgid "{0} or {1}" msgstr "" @@ -37612,7 +37691,7 @@ msgstr "" msgid "{0} shared this document with {1}" msgstr "" -#: core/doctype/doctype/doctype.py:320 +#: core/doctype/doctype/doctype.py:316 msgid "{0} should be indexed because it's referred in dashboard connections" msgstr "" @@ -37684,11 +37763,11 @@ msgstr "" msgid "{0} {1} added to Dashboard {2}" msgstr "" -#: model/base_document.py:562 model/rename_doc.py:112 +#: model/base_document.py:581 model/rename_doc.py:112 msgid "{0} {1} already exists" msgstr "" -#: model/base_document.py:873 +#: model/base_document.py:892 msgid "{0} {1} cannot be \"{2}\". It should be one of \"{3}\"" msgstr "" @@ -37704,7 +37783,7 @@ msgstr "" msgid "{0} {1} is linked with the following submitted documents: {2}" msgstr "" -#: model/document.py:170 permissions.py:566 +#: model/document.py:170 permissions.py:569 msgid "{0} {1} not found" msgstr "" @@ -37712,39 +37791,39 @@ msgstr "" msgid "{0} {1}: Submitted Record cannot be deleted. You must {2} Cancel {3} it first." msgstr "" -#: model/base_document.py:988 +#: model/base_document.py:1007 msgid "{0}, Row {1}" msgstr "" -#: model/base_document.py:993 +#: model/base_document.py:1012 msgid "{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}" msgstr "" -#: core/doctype/doctype/doctype.py:1741 +#: core/doctype/doctype/doctype.py:1737 msgid "{0}: Cannot set Amend without Cancel" msgstr "" -#: core/doctype/doctype/doctype.py:1759 +#: core/doctype/doctype/doctype.py:1755 msgid "{0}: Cannot set Assign Amend if not Submittable" msgstr "" -#: core/doctype/doctype/doctype.py:1757 +#: core/doctype/doctype/doctype.py:1753 msgid "{0}: Cannot set Assign Submit if not Submittable" msgstr "" -#: core/doctype/doctype/doctype.py:1736 +#: core/doctype/doctype/doctype.py:1732 msgid "{0}: Cannot set Cancel without Submit" msgstr "" -#: core/doctype/doctype/doctype.py:1743 +#: core/doctype/doctype/doctype.py:1739 msgid "{0}: Cannot set Import without Create" msgstr "" -#: core/doctype/doctype/doctype.py:1739 +#: core/doctype/doctype/doctype.py:1735 msgid "{0}: Cannot set Submit, Cancel, Amend without Write" msgstr "" -#: core/doctype/doctype/doctype.py:1763 +#: core/doctype/doctype/doctype.py:1759 msgid "{0}: Cannot set import as {1} is not importable" msgstr "" @@ -37752,47 +37831,47 @@ msgstr "" msgid "{0}: Failed to attach new recurring document. To enable attaching document in the auto repeat notification email, enable {1} in Print Settings" msgstr "" -#: core/doctype/doctype/doctype.py:1377 +#: core/doctype/doctype/doctype.py:1373 msgid "{0}: Field '{1}' cannot be set as Unique as it has non-unique values" msgstr "" -#: core/doctype/doctype/doctype.py:1285 +#: core/doctype/doctype/doctype.py:1281 msgid "{0}: Field {1} in row {2} cannot be hidden and mandatory without default" msgstr "" -#: core/doctype/doctype/doctype.py:1244 +#: core/doctype/doctype/doctype.py:1240 msgid "{0}: Field {1} of type {2} cannot be mandatory" msgstr "" -#: core/doctype/doctype/doctype.py:1232 +#: core/doctype/doctype/doctype.py:1228 msgid "{0}: Fieldname {1} appears multiple times in rows {2}" msgstr "" -#: core/doctype/doctype/doctype.py:1362 +#: core/doctype/doctype/doctype.py:1358 msgid "{0}: Fieldtype {1} for {2} cannot be unique" msgstr "" -#: core/doctype/doctype/doctype.py:1698 +#: core/doctype/doctype/doctype.py:1694 msgid "{0}: No basic permissions set" msgstr "" -#: core/doctype/doctype/doctype.py:1712 +#: core/doctype/doctype/doctype.py:1708 msgid "{0}: Only one rule allowed with the same Role, Level and {1}" msgstr "" -#: core/doctype/doctype/doctype.py:1266 +#: core/doctype/doctype/doctype.py:1262 msgid "{0}: Options must be a valid DocType for field {1} in row {2}" msgstr "" -#: core/doctype/doctype/doctype.py:1255 +#: core/doctype/doctype/doctype.py:1251 msgid "{0}: Options required for Link or Table type field {1} in row {2}" msgstr "" -#: core/doctype/doctype/doctype.py:1273 +#: core/doctype/doctype/doctype.py:1269 msgid "{0}: Options {1} must be the same as doctype name {2} for the field {3}" msgstr "" -#: core/doctype/doctype/doctype.py:1727 +#: core/doctype/doctype/doctype.py:1723 msgid "{0}: Permission at level 0 must be set before higher levels are set" msgstr "" @@ -37800,7 +37879,7 @@ msgstr "" msgid "{0}: You can increase the limit for the field if required via {1}" msgstr "" -#: core/doctype/doctype/doctype.py:1219 +#: core/doctype/doctype/doctype.py:1215 msgid "{0}: fieldname cannot be set to reserved keyword {1}" msgstr "" @@ -37818,7 +37897,7 @@ msgstr "" msgid "{0}: {1} vs {2}" msgstr "" -#: core/doctype/doctype/doctype.py:1385 +#: core/doctype/doctype/doctype.py:1381 msgid "{0}:Fieldtype {1} for {2} cannot be indexed" msgstr "" @@ -37838,7 +37917,7 @@ msgstr "" msgid "{count} rows selected" msgstr "" -#: core/doctype/doctype/doctype.py:1439 +#: core/doctype/doctype/doctype.py:1435 msgid "{{{0}}} is not a valid fieldname pattern. It should be {{field_name}}." msgstr "" @@ -37846,11 +37925,11 @@ msgstr "" msgid "{} Complete" msgstr "" -#: utils/data.py:2418 +#: utils/data.py:2412 msgid "{} Invalid python code on line {}" msgstr "" -#: utils/data.py:2427 +#: utils/data.py:2421 msgid "{} Possibly invalid python code.
    {}" msgstr "" @@ -37871,7 +37950,7 @@ msgstr "" msgid "{} is not a valid date string." msgstr "" -#: commands/utils.py:519 +#: commands/utils.py:532 msgid "{} not found in PATH! This is required to access the console." msgstr "" @@ -37879,7 +37958,7 @@ msgstr "" msgid "{} not found in PATH! This is required to restore the database." msgstr "" -#: utils/backups.py:441 +#: utils/backups.py:445 msgid "{} not found in PATH! This is required to take a backup." msgstr "" diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index 2dad3df4fd..18d7244179 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -134,22 +134,22 @@ log_types = ( ) std_fields = [ - {"fieldname": "name", "fieldtype": "Link", "label": _lt("ID")}, - {"fieldname": "owner", "fieldtype": "Link", "label": _lt("Created By"), "options": "User"}, - {"fieldname": "idx", "fieldtype": "Int", "label": _lt("Index")}, - {"fieldname": "creation", "fieldtype": "Datetime", "label": _lt("Created On")}, - {"fieldname": "modified", "fieldtype": "Datetime", "label": _lt("Last Updated On")}, + {"fieldname": "name", "fieldtype": "Link", "label": "ID"}, + {"fieldname": "owner", "fieldtype": "Link", "label": "Created By", "options": "User"}, + {"fieldname": "idx", "fieldtype": "Int", "label": "Index"}, + {"fieldname": "creation", "fieldtype": "Datetime", "label": "Created On"}, + {"fieldname": "modified", "fieldtype": "Datetime", "label": "Last Updated On"}, { "fieldname": "modified_by", "fieldtype": "Link", - "label": _lt("Last Updated By"), + "label": "Last Updated By", "options": "User", }, - {"fieldname": "_user_tags", "fieldtype": "Data", "label": _lt("Tags")}, - {"fieldname": "_liked_by", "fieldtype": "Data", "label": _lt("Liked By")}, - {"fieldname": "_comments", "fieldtype": "Text", "label": _lt("Comments")}, - {"fieldname": "_assign", "fieldtype": "Text", "label": _lt("Assigned To")}, - {"fieldname": "docstatus", "fieldtype": "Int", "label": _lt("Document Status")}, + {"fieldname": "_user_tags", "fieldtype": "Data", "label": "Tags"}, + {"fieldname": "_liked_by", "fieldtype": "Data", "label": "Liked By"}, + {"fieldname": "_comments", "fieldtype": "Text", "label": "Comments"}, + {"fieldname": "_assign", "fieldtype": "Text", "label": "Assigned To"}, + {"fieldname": "docstatus", "fieldtype": "Int", "label": "Document Status"}, ] @@ -230,6 +230,9 @@ def get_permitted_fields( if permission_type is None: permission_type = "select" if frappe.only_has_select_perm(doctype, user=user) else "read" + meta_fields = meta.default_fields.copy() + optional_meta_fields = [x for x in optional_fields if x in valid_columns] + if permitted_fields := meta.get_permitted_fieldnames( parenttype=parenttype, user=user, @@ -239,15 +242,12 @@ def get_permitted_fields( if permission_type == "select": return permitted_fields - meta_fields = meta.default_fields.copy() - optional_meta_fields = [x for x in optional_fields if x in valid_columns] - if meta.istable: meta_fields.extend(child_table_fields) return meta_fields + permitted_fields + optional_meta_fields - return [] + return meta_fields + optional_meta_fields def is_default_field(fieldname: str) -> bool: diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 241bfdee31..f83a971082 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -2,6 +2,7 @@ # License: MIT. See LICENSE import datetime import json +import weakref from functools import cached_property from typing import TYPE_CHECKING, TypeVar @@ -163,6 +164,7 @@ class BaseDocument: state.pop("meta", None) state.pop("permitted_fieldnames", None) + state.pop("_parent_doc", None) def update(self, d): """Update multiple fields of a doctype using a dictionary of key-value pairs. @@ -261,11 +263,28 @@ class BaseDocument: ret_value = self._init_child(value, key) table.append(ret_value) - # reference parent document - ret_value.parent_doc = self + # reference parent document but with weak reference, parent_doc will be deleted if self is garbage collected. + ret_value.parent_doc = weakref.ref(self) return ret_value + @property + def parent_doc(self): + parent_doc_ref = getattr(self, "_parent_doc", None) + + if isinstance(parent_doc_ref, BaseDocument): + return parent_doc_ref + elif isinstance(parent_doc_ref, weakref.ReferenceType): + return parent_doc_ref() + + @parent_doc.setter + def parent_doc(self, value): + self._parent_doc = value + + @parent_doc.deleter + def parent_doc(self): + self._parent_doc = None + def extend(self, key, value): try: value = iter(value) @@ -1231,7 +1250,7 @@ class BaseDocument: ref_doc = frappe.new_doc(self.doctype) else: # get values from old doc - if self.get("parent_doc"): + if self.parent_doc: parent_doc = self.parent_doc.get_latest() child_docs = [d for d in parent_doc.get(self.parentfield) if d.name == self.name] if not child_docs: diff --git a/frappe/model/db_query.py b/frappe/model/db_query.py index 106172a508..11054a9a7a 100644 --- a/frappe/model/db_query.py +++ b/frappe/model/db_query.py @@ -217,6 +217,10 @@ class DatabaseQuery: args = self.prepare_args() args.limit = self.add_limit() + if not args.fields: + # apply_fieldlevel_read_permissions has likely removed ALL the fields that user asked for + return [] + if args.conditions: args.conditions = "where " + args.conditions @@ -754,7 +758,7 @@ class DatabaseQuery: ref_doctype = field.options if field else f.doctype lft, rgt = "", "" if f.value: - lft, rgt = frappe.db.get_value(ref_doctype, f.value, ["lft", "rgt"]) + lft, rgt = frappe.db.get_value(ref_doctype, f.value, ["lft", "rgt"]) or (0, 0) # Get descendants elements of a DocType with a tree structure if f.operator.lower() in ( diff --git a/frappe/model/delete_doc.py b/frappe/model/delete_doc.py index b6ab2546bf..6a92971c72 100644 --- a/frappe/model/delete_doc.py +++ b/frappe/model/delete_doc.py @@ -133,6 +133,7 @@ def delete_doc( doctype=doc.doctype, name=doc.name, now=frappe.flags.in_test, + enqueue_after_commit=True, ) # clear cache for Document diff --git a/frappe/model/mapper.py b/frappe/model/mapper.py index 78f329ee83..d467c92958 100644 --- a/frappe/model/mapper.py +++ b/frappe/model/mapper.py @@ -197,11 +197,7 @@ def map_fields(source_doc, target_doc, table_map, source_parent): for d in source_doc.meta.get("fields") if (d.no_copy == 1 or d.fieldtype in table_fields) ] - + [ - d.fieldname - for d in target_doc.meta.get("fields") - if (d.no_copy == 1 or d.fieldtype in table_fields) - ] + + [d.fieldname for d in target_doc.meta.get("fields") if (d.fieldtype in table_fields)] + list(default_fields) + list(child_table_fields) + list(table_map.get("field_no_map", [])) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 7c4a1cf15e..1d5767850d 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -596,6 +596,10 @@ class Meta(Document): self.get_permlevel_access(permission_type=permission_type, parenttype=parenttype, user=user) ) + if 0 not in permlevel_access and permission_type in ("read", "select"): + if frappe.share.get_shared(self.name, user, rights=[permission_type], limit=1): + permlevel_access.add(0) + permitted_fieldnames.extend( df.fieldname for df in self.get_fieldnames_with_value( diff --git a/frappe/model/utils/__init__.py b/frappe/model/utils/__init__.py index 153a42ec12..d0015101b1 100644 --- a/frappe/model/utils/__init__.py +++ b/frappe/model/utils/__init__.py @@ -66,7 +66,7 @@ def render_include(content): if "{% include" in content: paths = INCLUDE_DIRECTIVE_PATTERN.findall(content) if not paths: - frappe.throw(_("Invalid include path"), InvalidIncludePath) + raise InvalidIncludePath for path in paths: app, app_path = path.split("/", 1) diff --git a/frappe/permissions.py b/frappe/permissions.py index a6d2ca3da1..cc36fc53c6 100644 --- a/frappe/permissions.py +++ b/frappe/permissions.py @@ -343,7 +343,10 @@ def has_user_permission(doc, user=None, debug=False): debug and _debug_log("User permission bypassed because user can modify user permissions.") return True - apply_strict_user_permissions = frappe.get_system_settings("apply_strict_user_permissions") + # don't apply strict user permissions for single doctypes since they contain empty link fields + apply_strict_user_permissions = ( + False if doc.meta.issingle else frappe.get_system_settings("apply_strict_user_permissions") + ) if apply_strict_user_permissions: debug and _debug_log("Strict user permissions will be applied") diff --git a/frappe/printing/doctype/letter_head/letter_head.js b/frappe/printing/doctype/letter_head/letter_head.js index 55d97cf37f..7055b5f78a 100644 --- a/frappe/printing/doctype/letter_head/letter_head.js +++ b/frappe/printing/doctype/letter_head/letter_head.js @@ -2,7 +2,60 @@ // For license information, please see license.txt frappe.ui.form.on("Letter Head", { + setup(frm) { + frm.get_field("instructions").html(INSTRUCTIONS); + }, + refresh: function (frm) { frm.flag_public_attachments = true; }, + + validate: (frm) => { + ["header_script", "footer_script"].forEach((field) => { + if (!frm.doc[field]) return; + + try { + eval(frm.doc[field]); + } catch (e) { + frappe.throw({ + title: __("Error in Header/Footer Script"), + indicator: "orange", + message: '
    ' + e.stack + "
    ", + }); + } + }); + }, }); + +const INSTRUCTIONS = `

    ${__("Letter Head Scripts")}

    +

    ${__("Header/Footer scripts can be used to add dynamic behaviours.")}

    +
    +
    +// ${__(
    +	"The following Header Script will add the current date to an element in 'Header HTML' with class 'header-content'"
    +)}
    +var el = document.getElementsByClassName("header-content");
    +if (el.length > 0) {
    +	el[0].textContent += " " + new Date().toGMTString();
    +}
    +
    +
    +

    ${__("You can also access wkhtmltopdf variables (valid only in PDF print):")}

    +
    +
    +// ${__("Get Header and Footer wkhtmltopdf variables")}
    +// ${__("Snippet and more variables:  {0}", ["https://wkhtmltopdf.org/usage/wkhtmltopdf.txt"])}
    +var vars = {};
    +var query_strings_from_url = document.location.search.substring(1).split('&');
    +for (var query_string in query_strings_from_url) {
    +	if (query_strings_from_url.hasOwnProperty(query_string)) {
    +		var temp_var = query_strings_from_url[query_string].split('=', 2);
    +		vars[temp_var[0]] = decodeURI(temp_var[1]);
    +	}
    +}
    +var el = document.getElementsByClassName("header-content");
    +if (el.length > 0 && vars["page"] == 1) {
    +	el[0].textContent += " : " + vars["date"];
    +}
    +
    +
    `; diff --git a/frappe/printing/doctype/letter_head/letter_head.json b/frappe/printing/doctype/letter_head/letter_head.json index 021f79ca93..4ffca134f2 100644 --- a/frappe/printing/doctype/letter_head/letter_head.json +++ b/frappe/printing/doctype/letter_head/letter_head.json @@ -26,7 +26,11 @@ "footer_image", "footer_image_height", "footer_image_width", - "footer_align" + "footer_align", + "scripts_section", + "header_script", + "footer_script", + "instructions" ], "fields": [ { @@ -162,13 +166,40 @@ "fieldtype": "Select", "label": "Footer Based On", "options": "Image\nHTML" + }, + { + "depends_on": "eval:!doc.__islocal && doc.source==='HTML'", + "fieldname": "header_script", + "fieldtype": "Code", + "label": "Header Script", + "options": "Javascript" + }, + { + "depends_on": "eval:!doc.__islocal && doc.footer_source==='HTML'", + "fieldname": "footer_script", + "fieldtype": "Code", + "label": "Footer Script", + "options": "Javascript" + }, + { + "collapsible": 1, + "collapsible_depends_on": "eval: doc.header_script || doc.footer_script", + "fieldname": "scripts_section", + "fieldtype": "Section Break", + "label": "Scripts" + }, + { + "fieldname": "instructions", + "fieldtype": "HTML", + "label": "Instructions", + "read_only": 1 } ], "icon": "fa fa-font", "idx": 1, "links": [], "max_attachments": 3, - "modified": "2023-12-08 15:52:37.525003", + "modified": "2023-12-21 16:19:37.525003", "modified_by": "Administrator", "module": "Printing", "name": "Letter Head", diff --git a/frappe/printing/page/print/print.js b/frappe/printing/page/print/print.js index 11c3b8cd19..fe52ad9915 100644 --- a/frappe/printing/page/print/print.js +++ b/frappe/printing/page/print/print.js @@ -384,13 +384,13 @@ frappe.ui.form.PrintView = class { this.print_wrapper.find(".preview-beta-wrapper").hide(); this.print_wrapper.find(".print-preview-wrapper").show(); - const $print_format = this.print_wrapper.find("iframe"); - this.$print_format_body = $print_format.contents(); this.get_print_html((out) => { if (!out.html) { out.html = this.get_no_preview_html(); } + const $print_format = this.print_wrapper.find("iframe"); + this.$print_format_body = $print_format.contents(); this.setup_print_format_dom(out, $print_format); const print_height = $print_format.get(0).offsetHeight; diff --git a/frappe/public/icons/timeless/icons.svg b/frappe/public/icons/timeless/icons.svg index 58665bd20b..1ea247b405 100644 --- a/frappe/public/icons/timeless/icons.svg +++ b/frappe/public/icons/timeless/icons.svg @@ -121,9 +121,7 @@ - - - + diff --git a/frappe/public/js/form_builder/components/Field.vue b/frappe/public/js/form_builder/components/Field.vue index 9514bbea8e..7e5ab99fa3 100644 --- a/frappe/public/js/form_builder/components/Field.vue +++ b/frappe/public/js/form_builder/components/Field.vue @@ -185,6 +185,11 @@ function is_filter_applied() { } } +function open_child_doctype() { + if (!props.field?.df?.options) return; + window.open(`/app/doctype/${props.field.df.options}`, "_blank"); +} + onMounted(() => selected.value && label_input.value.focus_on_label()); @@ -199,6 +204,7 @@ onMounted(() => selected.value && label_input.value.focus_on_label()); @@ -216,7 +222,7 @@ onMounted(() => selected.value && label_input.value.focus_on_label()); class="help-icon" v-if="field.df.documentation_url" v-html="frappe.utils.icon('help', 'sm')" - > + /> diff --git a/frappe/public/js/form_builder/components/controls/TableControl.vue b/frappe/public/js/form_builder/components/controls/TableControl.vue index 295a6406c8..f132e023b7 100644 --- a/frappe/public/js/form_builder/components/controls/TableControl.vue +++ b/frappe/public/js/form_builder/components/controls/TableControl.vue @@ -2,7 +2,7 @@ import { get_table_columns, load_doctype_model } from "../../utils"; import { computedAsync } from "@vueuse/core"; -const props = defineProps(["df"]); +const props = defineProps(["df", "is-customize-form"]); let table_columns = computedAsync(async () => { let doctype = props.df.options; @@ -13,6 +13,13 @@ let table_columns = computedAsync(async () => { let child_doctype = frappe.get_meta(doctype); return get_table_columns(props.df, child_doctype); }, []); + +function open_new_child_doctype_dialog() { + let is_custom = props.isCustomizeForm; + frappe.model.with_doctype("DocType").then(() => { + frappe.listview_settings["DocType"].new_doctype_dialog({ is_child: 1, is_custom }); + }); +}