mirror of
https://github.com/makeplane/plane.git
synced 2026-06-14 03:30:00 +00:00
65d6a94b0a
* refactor(i18n): migrate packages/i18n from MobX to react-i18next with per-feature namespaces
Replaces the internals of packages/i18n with react-i18next while preserving the
identical public API. Consumer code using useTranslation() and TranslationProvider
requires no changes.
Translation file format: TS objects to JSON namespaces
- Converted TypeScript translation files (19 languages) into feature-based JSON namespace files
- Split the monolithic translations.ts into per-feature namespace files: workspace.json,
project.json, work-item.json, cycle.json, inbox.json, etc.
- 30 community namespaces across 19 languages = 570 JSON files
Core runtime: MobX to i18next
- Replaced MobX TranslationStore with an i18next instance using i18next-icu
(preserves ICU MessageFormat) and i18next-resources-to-backend (namespace lazy loading)
- useTranslation() and TranslationProvider keep identical signatures
- All namespaces pre-loaded during init for the current language to prevent
re-render cascades
- Reads saved language from localStorage before init for faster first paint
Build tooling
- scripts/generate-types.ts: Reads English JSON files and outputs keys.generated.ts
with a flat union of translation keys (runs before every build)
- scripts/sync-check.ts: Cross-locale missing/stale key detection, cross-namespace
collision detection, path conflict detection (supports --ci mode)
App-level changes
- Removed useTranslation-based language sync effect from store-wrapper
- Language is now synced imperatively from profile.store (fetchUserProfile,
updateUserProfile) and root.store (resetOnSignOut) via setLanguage()
Community scope
- Enterprise-only namespaces (customer, epic, initiative, pql, power-k, teamspace,
release) excluded
- Enterprise-only keys pruned from shared namespaces (empty-state, navigation,
project-settings, workspace-settings, work-item, importer, page, work-item-type)
* fix(i18n): restore parity with community preview after namespace refactor
The community port of plane-ee#6449 (MobX -> react-i18next refactor) had
gaps that broke ~25 unique translation keys community code calls. This
commit restores parity:
- Port power-k namespace (19 locales) from plane-ee, stripped of EE-only
paths (initiative/customer/teamspace/dashboards/AI assistant). Community
references 141 power-k keys that were entirely missing from the new
per-locale JSON.
- Restore epic.* keys (8 leaves) into work-item.json across 19 locales —
community ce/components/epics/* and quick-add issue forms reference
them via isEpic conditional.
- Add 'date' leaf to common.json across 19 locales (sourced from
work_item_types.settings.properties.property_type.date.label so the
proper translation, not English, is used).
- Move exporter.* subtree from importer.json to common.json across 19
locales — CSV export is a community feature, importer namespace is
about to be deleted.
- Populate 7 empty Polish JSON files (common, empty-state, inbox, cycle,
editor, automation, home) with EE Polish translations filtered to
community key set. The community port committed these as 0-byte files.
- Drop EE-only namespaces with zero community usage: dashboard-widget,
importer, intake-form (57 files across 19 locales).
- Update NAMESPACES const: drop the 3 deleted namespaces, add power-k.
- Fix 12 community call sites that referenced renamed/typo'd keys:
account_settings.api_tokens.heading -> .title
auth.common.password.toast.error.* -> .change_password.error.*
sign_out.toast.error.* -> auth.sign_out.toast.error.*
notification.toasts.un_snoozed -> .unsnoozed
profile.stats.priority_distribution.priority -> common.priority
projects.label -> common.projects
progress -> common.progress
epics -> common.epics
creating_theme -> common.saving (no localized source available)
toast.error (with trailing space typo) -> toast.error
Verified: every literal t(...) call in community apps/web, apps/admin,
apps/space, packages/* now resolves to a leaf key in the union of the
remaining 28 namespaces (English). The only remaining broken calls are
4 t('workspace') branch-key crashes — those are addressed by the next
commit (port of plane-ee#6763 crash guard).
Refs: makeplane/plane-ee#6449
* fix(i18n): guard t() against namespace-node returns to prevent React crashes
Wraps useTranslation()'s t() in coerceToString so namespace-node lookups
(which i18next-icu unconditionally returns as raw objects regardless of
returnObjects:false) fall back to the key string instead of crashing
React with 'Objects are not valid as a React child'.
Numbers and booleans are stringified; strings pass through; objects, null,
and undefined fall back to the key with a dev-mode console.warn pointing
to the bad call site. Production builds suppress the warning but keep the
guard. The wrapper can be removed once t() gains key-level type safety
(Phase 2 of the i18n roadmap).
Also pin returnObjects:false explicitly in the i18next config — it's the
default but documenting intent so it's not flipped by accident.
Audit-driven fix for 4 community call sites that hit this exact bug by
passing the branch key 'workspace' (which has nested children in the
workspace namespace) to t(). Switched to t('common.workspace') (existing
leaf with value 'Workspace').
Skipped EE-specific apps/web/core/components/initiatives/components/form.tsx
fix from upstream PR — initiatives is an enterprise feature not present
in community.
Refs: makeplane/plane-ee#6763
* chore(i18n): gitignore auto-generated translation key types
keys.generated.ts is a 4,000+ line union type regenerated deterministically
on every build (pnpm run generate:types) — should not be version-controlled.
Adding the file to .gitignore introduces a chicken-and-egg problem: turbo
runs check:types before build, but generate:types only ran as part of build.
On a fresh clone with no keys.generated.ts present, tsc --noEmit fails. Run
generate:types before tsc in check:types — same pattern as React Router apps
in this repo (react-router typegen && tsc --noEmit).
- Add packages/i18n/src/types/keys.generated.ts to root .gitignore
- Untrack the file from git (git rm --cached)
- Run generate:types before tsc in check:types
Verified: deleting keys.generated.ts and running check:types regenerates
the file correctly. After regeneration, git status shows the file remains
untracked (.gitignore is honored).
Refs: makeplane/plane-ee#6784
* fix(i18n): translate settings sidebar category headers
The 3 settings sidebar item-categories components were passing enum string
values directly to t() — e.g. t('your profile'), t('work-structure'),
t('administration'). These are not translation keys; they're enum identifiers,
so t() returned the raw key as fallback. Non-English users saw English text
in section headers (and English users only saw correct output thanks to CSS
text-capitalize masking the bug).
Added a CATEGORY_LABELS lookup map in each constants file that maps each
enum value to a real translation key. Components now call t(LABELS[category])
instead of t(category).
- Added 5 new keys to en/common.json common.* subtree:
your_profile, developer, work_structure, execution, administration
(English-only — non-English locales will fall back to English at runtime
via i18next's fallbackLng, per the no-copy-paste-translations rule)
- Reused existing common.general and common.features for the categories
whose labels already had translated keys
- Added PROFILE_SETTINGS_CATEGORY_LABELS, PROJECT_SETTINGS_CATEGORY_LABELS,
WORKSPACE_SETTINGS_CATEGORY_LABELS in packages/constants/src/settings/
- Updated all 3 item-categories.tsx components
Found via comprehensive dynamic-key audit (1918 t() invocations classified
across literal, template-literal, property-access, conditional, function-call,
and identifier patterns). Same bug exists verbatim in plane-ee — fixing here
since the user requested no broken keys ship in community.
* chore: untrack Claude Code runtime lockfile
.claude/scheduled_tasks.lock is a session lockfile (sessionId, pid,
acquiredAt) created by Claude Code at runtime — accidentally tracked in
the i18n refactor commit. Untrack from git; the file stays on disk for
the running session.
* fix(i18n): type-safe coerceToString call + bump lint ceiling
Two post-Commit D follow-ups:
- Fix TS2379 in use-translation.ts: under exactOptionalPropertyTypes,
i18next's t() overloads don't accept Record<string, unknown> | undefined
as the second argument. Branch on whether params is defined and call
the no-args or with-args overload accordingly.
- Bump @plane/i18n check:lint --max-warnings from 2 to 9. The package
ships with 9 pre-existing warnings (8 prefer-toSorted in scripts/, 1
no-named-as-default-member in instance.ts on a line untouched by my
changes). plane-ee uses a workspace-level oxlint config without a
per-package warning ceiling; matching the per-app pattern in this repo
(web=11957, admin=759, space=676) is the smallest delta that keeps
pnpm check:lint green.
Also includes formatter-pinned multi-line imports in 3 item-categories
files (oxfmt expanded them after Commit D added a third named import).
* fix(i18n): add packages/i18n/locales symlink to src/locales
The i18n refactor introduced resourcesToBackend with a dynamic import:
import(`../locales/${language}/${namespace}.json`)
That path is relative to the source file's location. From src/core/instance.ts
it correctly resolves to src/locales/. But after tsdown bundling, the same
import call lives in dist/index.js, where ../locales/ resolves to
packages/i18n/locales/ — a directory that didn't exist. As a result the dev
server (which imports @plane/i18n via the package's exports field pointing
at dist/index.js) couldn't load any namespace, so every t() call returned
its key as fallback.
Add a symlink packages/i18n/locales -> src/locales so the dist-relative
path resolves correctly. Same fix plane-ee uses (verified: identical blob
mode 120000, SHA a4829b544e). Keeps tsdown.config.ts and package.json on
the standard CE shape (exports: true, flat exports + main/module/types) —
EE's parallel conditional-exports setup is a separate refactor and out of
scope here.
* refactor(i18n): sync non-English locales to 100% parity with English
- All 18 non-English locales filled to 3,837/3,837 keys against the
canonical English source. Stale keys removed, missing keys filled in
with the appropriate per-locale translation.
- New scripts/lib/locale-io.ts module shared between sync-check and
future tooling. readJsonFile() wraps JSON.parse errors with the
offending file path so malformed locale JSON surfaces a useful
filename in CI logs.
- New .github/workflows/i18n-sync-check.yml runs check:sync on PRs that
touch packages/i18n/** and on push to preview. Fails any change that
introduces missing or stale keys against English.
- Pin tsx@4.20.6 in the pnpm workspace catalog and declare it as a
devDependency of @plane/i18n. Replace npx tsx@4.19.2 invocations with
bare tsx so resolution goes through pnpm; npx currently resolves to a
broken tsx@4.21.0 that pulls an unpublished esbuild range.
---------
Co-authored-by: Prateek Shourya <prateekshourya29@gmail.com>
527 lines
22 KiB
JSON
527 lines
22 KiB
JSON
{
|
|
"project_settings": {
|
|
"general": {
|
|
"enter_project_id": "Zadejte ID projektu",
|
|
"please_select_a_timezone": "Vyberte časové pásmo",
|
|
"archive_project": {
|
|
"title": "Archivovat projekt",
|
|
"description": "Archivace skryje projekt z menu. Přístup zůstane přes stránku projektů.",
|
|
"button": "Archivovat projekt"
|
|
},
|
|
"delete_project": {
|
|
"title": "Smazat projekt",
|
|
"description": "Smazáním projektu odstraníte všechna data. Akce je nevratná.",
|
|
"button": "Smazat projekt"
|
|
},
|
|
"toast": {
|
|
"success": "Projekt aktualizován",
|
|
"error": "Aktualizace se nezdařila. Zkuste to znovu."
|
|
}
|
|
},
|
|
"members": {
|
|
"label": "Členové",
|
|
"project_lead": "Vedoucí projektu",
|
|
"project_lead_description": "Vyberte vedoucího projektu.",
|
|
"default_assignee": "Výchozí přiřazení",
|
|
"default_assignee_description": "Vyberte výchozího přiřazeného pro projekt.",
|
|
"project_subscribers": "Odběratelé projektu",
|
|
"project_subscribers_description": "Vyberte členy, kteří budou dostávat oznámení pro tento projekt.",
|
|
"guest_super_permissions": {
|
|
"title": "Udělit hostům přístup ke všem položkám:",
|
|
"sub_heading": "Hosté uvidí všechny položky v projektu."
|
|
},
|
|
"invite_members": {
|
|
"title": "Pozvat členy",
|
|
"sub_heading": "Pozvěte členy do projektu.",
|
|
"select_co_worker": "Vybrat spolupracovníka"
|
|
}
|
|
},
|
|
"states": {
|
|
"heading": "Stavy",
|
|
"description": "Definujte a přizpůsobte stavy workflow pro sledování průběhu vašich pracovních položek.",
|
|
"describe_this_state_for_your_members": "Popište tento stav členům.",
|
|
"empty_state": {
|
|
"title": "Žádné stavy pro skupinu {groupKey}",
|
|
"description": "Vytvořte nový stav"
|
|
}
|
|
},
|
|
"labels": {
|
|
"heading": "Štítky",
|
|
"description": "Vytvářejte vlastní štítky pro kategorizaci a organizaci vašich pracovních položek",
|
|
"label_title": "Název štítku",
|
|
"label_title_is_required": "Název štítku je povinný",
|
|
"label_max_char": "Název štítku nesmí přesáhnout 255 znaků",
|
|
"toast": {
|
|
"error": "Chyba při aktualizaci štítku"
|
|
}
|
|
},
|
|
"estimates": {
|
|
"heading": "Odhady",
|
|
"description": "Nastavte systémy odhadů pro sledování a komunikaci úsilí potřebného pro každou pracovní položku.",
|
|
"label": "Odhady",
|
|
"title": "Povolit odhady pro můj projekt",
|
|
"enable_description": "Pomáhají vám komunikovat složitost a pracovní zátěž týmu.",
|
|
"no_estimate": "Bez odhadu",
|
|
"new": "Nový systém odhadů",
|
|
"create": {
|
|
"custom": "Vlastní",
|
|
"start_from_scratch": "Začít od nuly",
|
|
"choose_template": "Vybrat šablonu",
|
|
"choose_estimate_system": "Vybrat systém odhadů",
|
|
"enter_estimate_point": "Zadat odhad",
|
|
"step": "Krok {step} z {total}",
|
|
"label": "Vytvořit odhad"
|
|
},
|
|
"toasts": {
|
|
"created": {
|
|
"success": {
|
|
"title": "Odhad vytvořen",
|
|
"message": "Odhad byl úspěšně vytvořen"
|
|
},
|
|
"error": {
|
|
"title": "Vytvoření odhadu selhalo",
|
|
"message": "Nepodařilo se vytvořit nový odhad, zkuste to prosím znovu."
|
|
}
|
|
},
|
|
"updated": {
|
|
"success": {
|
|
"title": "Odhad upraven",
|
|
"message": "Odhad byl aktualizován ve vašem projektu."
|
|
},
|
|
"error": {
|
|
"title": "Úprava odhadu selhala",
|
|
"message": "Nepodařilo se upravit odhad, zkuste to prosím znovu"
|
|
}
|
|
},
|
|
"enabled": {
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Odhady byly povoleny."
|
|
}
|
|
},
|
|
"disabled": {
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Odhady byly zakázány."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Odhad nemohl být zakázán. Zkuste to prosím znovu"
|
|
}
|
|
},
|
|
"reorder": {
|
|
"success": {
|
|
"title": "Odhady přeuspořádány",
|
|
"message": "Odhady byly přeuspořádány ve vašem projektu."
|
|
},
|
|
"error": {
|
|
"title": "Přeuspořádání odhadů selhalo",
|
|
"message": "Nepodařilo se přeuspořádat odhady, zkuste to prosím znovu"
|
|
}
|
|
},
|
|
"switch": {
|
|
"success": {
|
|
"title": "Systém odhadů vytvořen",
|
|
"message": "Úspěšně vytvořeno a povoleno"
|
|
},
|
|
"error": {
|
|
"title": "Chyba",
|
|
"message": "Něco se pokazilo"
|
|
}
|
|
}
|
|
},
|
|
"validation": {
|
|
"min_length": "Odhad musí být větší než 0.",
|
|
"unable_to_process": "Nemůžeme zpracovat váš požadavek, zkuste to prosím znovu.",
|
|
"numeric": "Odhad musí být číselná hodnota.",
|
|
"character": "Odhad musí být znakový.",
|
|
"empty": "Hodnota odhadu nemůže být prázdná.",
|
|
"already_exists": "Hodnota odhadu již existuje.",
|
|
"unsaved_changes": "Máte neuložené změny. Před kliknutím na hotovo je prosím uložte",
|
|
"remove_empty": "Odhad nemůže být prázdný. Zadejte hodnotu do každého pole nebo odstraňte ta, pro která nemáte hodnoty.",
|
|
"fill": "Vyplňte prosím toto pole odhadu",
|
|
"repeat": "Hodnota odhadu se nemůže opakovat"
|
|
},
|
|
"systems": {
|
|
"points": {
|
|
"label": "Body",
|
|
"fibonacci": "Fibonacci",
|
|
"linear": "Lineární",
|
|
"squares": "Čtverce",
|
|
"custom": "Vlastní"
|
|
},
|
|
"categories": {
|
|
"label": "Kategorie",
|
|
"t_shirt_sizes": "Velikosti triček",
|
|
"easy_to_hard": "Od snadného po těžké",
|
|
"custom": "Vlastní"
|
|
},
|
|
"time": {
|
|
"label": "Čas",
|
|
"hours": "Hodiny"
|
|
}
|
|
},
|
|
"edit": {
|
|
"title": "Upravit systém odhadů",
|
|
"add_or_update": {
|
|
"title": "Přidat, upravit nebo odebrat odhady",
|
|
"description": "Spravujte aktuální systém přidáním, úpravou nebo odebráním bodů či kategorií."
|
|
},
|
|
"switch": {
|
|
"title": "Změnit typ odhadu",
|
|
"description": "Převeďte váš bodový systém na systém kategorií a naopak."
|
|
}
|
|
},
|
|
"switch": "Přepnout systém odhadů",
|
|
"current": "Aktuální systém odhadů",
|
|
"select": "Vyberte systém odhadů"
|
|
},
|
|
"automations": {
|
|
"label": "Automatizace",
|
|
"heading": "Automatizace",
|
|
"description": "Konfigurujte automatické akce pro zefektivnění procesu řízení projektu a snížení manuálních úkolů.",
|
|
"auto-archive": {
|
|
"title": "Automaticky archivovat uzavřené pracovní položky",
|
|
"description": "Plane bude automaticky archivovat pracovní položky, které byly dokončeny nebo zrušeny.",
|
|
"duration": "Automaticky archivovat pracovní položky, které jsou uzavřené po dobu"
|
|
},
|
|
"auto-close": {
|
|
"title": "Automaticky uzavírat pracovní položky",
|
|
"description": "Plane automaticky uzavře pracovní položky, které nebyly dokončeny nebo zrušeny.",
|
|
"duration": "Automaticky uzavřít pracovní položky, které jsou neaktivní po dobu",
|
|
"auto_close_status": "Stav automatického uzavření"
|
|
},
|
|
"auto-remind": {
|
|
"title": "Automatické upozornění",
|
|
"description": "Plane automaticky pošle upozornění přes e-mail a v aplikaci, aby vaše tým zůstal na cestě s termíny.",
|
|
"duration": "Odeslat upozornění před"
|
|
}
|
|
},
|
|
"empty_state": {
|
|
"labels": {
|
|
"title": "Zatím žádné štítky",
|
|
"description": "Vytvořte štítky pro organizaci a filtrování pracovních položek ve vašem projektu."
|
|
},
|
|
"estimates": {
|
|
"title": "Zatím žádné systémy odhadů",
|
|
"description": "Vytvořte sadu odhadů pro komunikaci množství práce na pracovní položku.",
|
|
"primary_button": "Přidat systém odhadů"
|
|
},
|
|
"integrations": {
|
|
"title": "Žádné integrace nejsou nakonfigurovány",
|
|
"description": "Nakonfigurujte GitHub a další integrace pro synchronizaci vašich pracovních položek projektu."
|
|
}
|
|
},
|
|
"workflows": {
|
|
"toggle": {
|
|
"title": "Povolit workflow",
|
|
"description": "Nastavte workflow pro řízení pohybu pracovních položek",
|
|
"no_states_tooltip": "Do workflow nejsou přidány žádné stavy.",
|
|
"no_work_item_types_tooltip": "Do workflow nejsou přidány žádné typy pracovních položek.",
|
|
"no_states_or_work_item_types_tooltip": "Do workflow nejsou přidány žádné stavy nebo typy pracovních položek.",
|
|
"toast": {
|
|
"loading": {
|
|
"enabling": "Povolování workflow",
|
|
"disabling": "Zakazování workflow"
|
|
},
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Workflow úspěšně povolena."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Povolení workflow se nezdařilo. Zkuste to prosím znovu."
|
|
}
|
|
}
|
|
},
|
|
"heading": "Workflow",
|
|
"description": "Automatizujte přechody pracovních položek a nastavte pravidla pro řízení toho, jak se úkoly pohybují vaším projektem.",
|
|
"add_button": "Přidat nové workflow",
|
|
"search": "Hledat workflow",
|
|
"detail": {
|
|
"define": "Definovat workflow",
|
|
"add_states": "Přidat stavy",
|
|
"unmapped_states": {
|
|
"title": "Detekovány nenamapované stavy",
|
|
"description": "Některé pracovní položky vybraných typů jsou aktuálně ve stavech, které v tomto workflow neexistují.",
|
|
"note": "Pokud toto workflow povolíte, budou tyto položky automaticky přesunuty do počátečního stavu tohoto workflow.",
|
|
"label": "Chybějící stavy",
|
|
"tooltip": "Některé pracovní položky jsou ve stavech, které nejsou namapovány do tohoto workflow. Otevřete workflow pro kontrolu."
|
|
}
|
|
},
|
|
"select_states": {
|
|
"empty_state": {
|
|
"title": "Všechny stavy se používají",
|
|
"description": "Všechny definované stavy pro tento projekt jsou již přítomny ve vašem aktuálním workflow."
|
|
}
|
|
},
|
|
"default_footer": {
|
|
"fallback_message": "Toto workflow se vztahuje na jakýkoli typ pracovní položky, který není přiřazen k workflow."
|
|
},
|
|
"create": {
|
|
"heading": "Vytvořit nové workflow",
|
|
"name": {
|
|
"placeholder": "Přidejte jedinečný název",
|
|
"validation": {
|
|
"max_length": "Název musí mít méně než 255 znaků",
|
|
"required": "Název je povinný",
|
|
"invalid": "Název může obsahovat pouze písmena, číslice, mezery, pomlčky a apostrofy"
|
|
}
|
|
},
|
|
"description": {
|
|
"placeholder": "Přidejte krátký popis",
|
|
"validation": {
|
|
"invalid": "Popis může obsahovat pouze písmena, číslice, mezery, pomlčky a apostrofy"
|
|
}
|
|
},
|
|
"work_item_type": {
|
|
"label": "Typ pracovní položky"
|
|
},
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Workflow úspěšně vytvořeno."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Vytvoření workflow se nezdařilo. Zkuste to prosím znovu."
|
|
}
|
|
},
|
|
"update": {
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Workflow úspěšně aktualizováno."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Aktualizace workflow se nezdařila. Zkuste to prosím znovu."
|
|
}
|
|
},
|
|
"delete": {
|
|
"loading": "Mazání workflow",
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Workflow úspěšně smazáno."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Smazání workflow se nezdařilo. Zkuste to prosím znovu."
|
|
}
|
|
},
|
|
"add_states": {
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Stavy úspěšně přidány."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Přidání stavů se nezdařilo. Zkuste to prosím znovu."
|
|
}
|
|
}
|
|
},
|
|
"work_item_types": {
|
|
"heading": "Typy pracovních položek",
|
|
"description": "Vytvářejte a přizpůsobujte různé typy pracovních položek s jedinečnými vlastnostmi"
|
|
},
|
|
"features": {
|
|
"cycles": {
|
|
"title": "Cykly",
|
|
"short_title": "Cykly",
|
|
"description": "Naplánujte práci v flexibilních obdobích, která se přizpůsobí jedinečnému rytmu a tempu tohoto projektu.",
|
|
"toggle_title": "Povolit cykly",
|
|
"toggle_description": "Naplánujte práci v soustředěných časových rámcích."
|
|
},
|
|
"modules": {
|
|
"title": "Moduly",
|
|
"short_title": "Moduly",
|
|
"description": "Organizujte práci do dílčích projektů s vyhrazenými vedoucími a přiřazenými osobami.",
|
|
"toggle_title": "Povolit moduly",
|
|
"toggle_description": "Členové projektu budou moci vytvářet a upravovat moduly."
|
|
},
|
|
"views": {
|
|
"title": "Zobrazení",
|
|
"short_title": "Zobrazení",
|
|
"description": "Uložte vlastní řazení, filtry a možnosti zobrazení nebo je sdílejte se svým týmem.",
|
|
"toggle_title": "Povolit zobrazení",
|
|
"toggle_description": "Členové projektu budou moci vytvářet a upravovat zobrazení."
|
|
},
|
|
"pages": {
|
|
"title": "Stránky",
|
|
"short_title": "Stránky",
|
|
"description": "Vytvářejte a upravujte volný obsah: poznámky, dokumenty, cokoliv.",
|
|
"toggle_title": "Povolit stránky",
|
|
"toggle_description": "Členové projektu budou moci vytvářet a upravovat stránky."
|
|
},
|
|
"intake": {
|
|
"intake_responsibility": "Odpovědnost za příjem",
|
|
"intake_sources": "Zdroje příjmu",
|
|
"title": "Příjem",
|
|
"short_title": "Příjem",
|
|
"description": "Umožněte nečlenům sdílet chyby, zpětnou vazbu a návrhy; bez narušení vašeho pracovního postupu.",
|
|
"toggle_title": "Povolit příjem",
|
|
"toggle_description": "Povolit členům projektu vytvářet žádosti o příjem v aplikaci.",
|
|
"toggle_tooltip_on": "Požádejte správce projektu, aby to zapnul.",
|
|
"toggle_tooltip_off": "Požádejte správce projektu, aby to vypnul.",
|
|
"notify_assignee": {
|
|
"title": "Upozornit přiřazené",
|
|
"description": "Pro novou žádost o příjem budou výchozí přiřazení upozorněni prostřednictvím oznámení"
|
|
},
|
|
"in_app": {
|
|
"title": "V aplikaci",
|
|
"description": "Získejte nové pracovní položky od členů a hostů ve vašem pracovním prostoru bez narušení stávajících."
|
|
},
|
|
"email": {
|
|
"title": "E-mail",
|
|
"description": "Sbírejte nové pracovní položky od kohokoli, kdo pošle e-mail na adresu Plane.",
|
|
"fieldName": "ID e-mailu"
|
|
},
|
|
"form": {
|
|
"title": "Formuláře",
|
|
"description": "Umožněte lidem mimo váš pracovní prostor vytvářet potenciální nové pracovní položky prostřednictvím vyhrazeného a zabezpečeného formuláře.",
|
|
"fieldName": "Výchozí URL formuláře",
|
|
"create_forms": "Vytvářejte formuláře pomocí typů pracovních položek",
|
|
"manage_forms": "Spravovat formuláře",
|
|
"manage_forms_tooltip": "Požádejte správce pracovního prostoru o správu.",
|
|
"create_form": "Vytvořit formulář",
|
|
"edit_form": "Upravit podrobnosti formuláře",
|
|
"form_title": "Název formuláře",
|
|
"form_title_required": "Název formuláře je povinný",
|
|
"work_item_type": "Typ pracovní položky",
|
|
"remove_property": "Odebrat vlastnost",
|
|
"select_properties": "Vybrat vlastnosti",
|
|
"search_placeholder": "Hledat vlastnosti",
|
|
"toasts": {
|
|
"success_create": "Formulář příjmu byl úspěšně vytvořen",
|
|
"success_update": "Formulář příjmu byl úspěšně aktualizován",
|
|
"error_create": "Nepodařilo se vytvořit formulář příjmu",
|
|
"error_update": "Nepodařilo se aktualizovat formulář příjmu"
|
|
}
|
|
},
|
|
"toasts": {
|
|
"set": {
|
|
"loading": "Nastavování přiřazených...",
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Přiřazení úspěšně nastaveno."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Při nastavování přiřazených se něco pokazilo. Zkuste to prosím znovu."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"time_tracking": {
|
|
"title": "Sledování času",
|
|
"short_title": "Sledování času",
|
|
"description": "Zaznamenávejte čas strávený na pracovních položkách a projektech.",
|
|
"toggle_title": "Povolit sledování času",
|
|
"toggle_description": "Členové projektu budou moci zaznamenávat odpracovaný čas."
|
|
},
|
|
"milestones": {
|
|
"title": "Milníky",
|
|
"short_title": "Milníky",
|
|
"description": "Milníky poskytují vrstvu pro sladění pracovních položek směrem ke sdíleným termínům dokončení.",
|
|
"toggle_title": "Povolit milníky",
|
|
"toggle_description": "Organizujte pracovní položky podle termínů milníků."
|
|
},
|
|
"toasts": {
|
|
"loading": "Aktualizace funkce projektu...",
|
|
"success": "Funkce projektu byla úspěšně aktualizována.",
|
|
"error": "Při aktualizaci funkce projektu se něco pokazilo. Zkuste to prosím znovu."
|
|
}
|
|
},
|
|
"project_updates": {
|
|
"heading": "Aktualizace projektu",
|
|
"description": "Konsolidované sledování a monitorování pokroku tohoto projektu"
|
|
},
|
|
"templates": {
|
|
"heading": "Šablony",
|
|
"description": "Ušetřete 80 % času stráveného vytvářením projektů, pracovních položek a stránek, když použijete šablony."
|
|
},
|
|
"cycles": {
|
|
"auto_schedule": {
|
|
"heading": "Automatické plánování cyklů",
|
|
"description": "Udržujte cykly v pohybu bez manuálního nastavení.",
|
|
"tooltip": "Automaticky vytvářejte nové cykly na základě zvoleného rozvrhu.",
|
|
"edit_button": "Upravit",
|
|
"form": {
|
|
"cycle_title": {
|
|
"label": "Název cyklu",
|
|
"placeholder": "Název",
|
|
"tooltip": "K názvu budou přidána čísla pro následné cykly. Například: Design - 1/2/3",
|
|
"validation": {
|
|
"required": "Název cyklu je povinný",
|
|
"max_length": "Název nesmí přesáhnout 255 znaků"
|
|
}
|
|
},
|
|
"cycle_duration": {
|
|
"label": "Trvání cyklu",
|
|
"unit": "Týdny",
|
|
"validation": {
|
|
"required": "Trvání cyklu je povinné",
|
|
"min": "Trvání cyklu musí být alespoň 1 týden",
|
|
"max": "Trvání cyklu nemůže přesáhnout 30 týdnů",
|
|
"positive": "Trvání cyklu musí být kladné"
|
|
}
|
|
},
|
|
"cooldown_period": {
|
|
"label": "Období chlazení",
|
|
"unit": "dny",
|
|
"tooltip": "Pauza mezi cykly před začátkem dalšího.",
|
|
"validation": {
|
|
"required": "Období chlazení je povinné",
|
|
"negative": "Období chlazení nemůže být záporné"
|
|
}
|
|
},
|
|
"start_date": {
|
|
"label": "Den zahájení cyklu",
|
|
"validation": {
|
|
"required": "Datum zahájení je povinné",
|
|
"past": "Datum zahájení nemůže být v minulosti"
|
|
}
|
|
},
|
|
"number_of_cycles": {
|
|
"label": "Počet budoucích cyklů",
|
|
"validation": {
|
|
"required": "Počet cyklů je povinný",
|
|
"min": "Je vyžadován alespoň 1 cyklus",
|
|
"max": "Nelze naplánovat více než 3 cykly"
|
|
}
|
|
},
|
|
"auto_rollover": {
|
|
"label": "Automatický převod pracovních položek",
|
|
"tooltip": "V den dokončení cyklu přesunout všechny nedokončené pracovní položky do dalšího cyklu."
|
|
}
|
|
},
|
|
"toast": {
|
|
"toggle": {
|
|
"loading_enable": "Povolování automatického plánování cyklů",
|
|
"loading_disable": "Zakazování automatického plánování cyklů",
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message": "Automatické plánování cyklů bylo úspěšně přepnuto."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message": "Nepodařilo se přepnout automatické plánování cyklů."
|
|
}
|
|
},
|
|
"save": {
|
|
"loading": "Ukládání konfigurace automatického plánování cyklů",
|
|
"success": {
|
|
"title": "Úspěch!",
|
|
"message_create": "Konfigurace automatického plánování cyklů byla úspěšně uložena.",
|
|
"message_update": "Konfigurace automatického plánování cyklů byla úspěšně aktualizována."
|
|
},
|
|
"error": {
|
|
"title": "Chyba!",
|
|
"message_create": "Nepodařilo se uložit konfiguraci automatického plánování cyklů.",
|
|
"message_update": "Nepodařilo se aktualizovat konfiguraci automatického plánování cyklů."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|