diff --git a/.changeset/dirty-dancers-cough.md b/.changeset/dirty-dancers-cough.md new file mode 100644 index 0000000000000..c1298493829c3 --- /dev/null +++ b/.changeset/dirty-dancers-cough.md @@ -0,0 +1,5 @@ +--- +"@medusajs/dashboard": patch +--- + +fix(dashboard): Format i18n schema with Prettier diff --git a/.changeset/dry-insects-burn.md b/.changeset/dry-insects-burn.md new file mode 100644 index 0000000000000..fb646ba2fe7e2 --- /dev/null +++ b/.changeset/dry-insects-burn.md @@ -0,0 +1,6 @@ +--- +"@medusajs/medusa": patch +"@medusajs/framework": patch +--- + +fix: switch from tsc watch to chokidar diff --git a/.changeset/fluffy-cars-yawn.md b/.changeset/fluffy-cars-yawn.md new file mode 100644 index 0000000000000..d5276ef70dcfa --- /dev/null +++ b/.changeset/fluffy-cars-yawn.md @@ -0,0 +1,5 @@ +--- +"@medusajs/admin-bundler": patch +--- + +fix(admin-bundler): Optimize tanstack/react-query diff --git a/.changeset/six-walls-smell.md b/.changeset/six-walls-smell.md new file mode 100644 index 0000000000000..e8bac3fd68dec --- /dev/null +++ b/.changeset/six-walls-smell.md @@ -0,0 +1,5 @@ +--- +"@medusajs/fulfillment": patch +--- + +Fix shipping option rules migration to mikro-orm v6 diff --git a/packages/admin/admin-bundler/package.json b/packages/admin/admin-bundler/package.json index 8a9a5e88c28e0..d6bd1b5ec708d 100644 --- a/packages/admin/admin-bundler/package.json +++ b/packages/admin/admin-bundler/package.json @@ -29,6 +29,7 @@ "@medusajs/admin-shared": "2.3.1", "@medusajs/admin-vite-plugin": "2.3.1", "@medusajs/dashboard": "2.3.1", + "@rollup/plugin-node-resolve": "^16.0.0", "@vitejs/plugin-react": "^4.2.1", "autoprefixer": "^10.4.16", "compression": "^1.7.4", diff --git a/packages/admin/admin-bundler/src/lib/config.ts b/packages/admin/admin-bundler/src/lib/config.ts index 442304294de05..5ea667763a17e 100644 --- a/packages/admin/admin-bundler/src/lib/config.ts +++ b/packages/admin/admin-bundler/src/lib/config.ts @@ -34,6 +34,7 @@ export async function getViteConfig( "react-router-dom", "@medusajs/ui", "@medusajs/dashboard", + "@tanstack/react-query", ], exclude: [...VIRTUAL_MODULES], }, diff --git a/packages/admin/admin-bundler/src/lib/plugin.ts b/packages/admin/admin-bundler/src/lib/plugin.ts index 8088c8b4ff66f..f589646dad13f 100644 --- a/packages/admin/admin-bundler/src/lib/plugin.ts +++ b/packages/admin/admin-bundler/src/lib/plugin.ts @@ -12,6 +12,7 @@ interface PluginOptions { export async function plugin(options: PluginOptions) { const vite = await import("vite") const react = (await import("@vitejs/plugin-react")).default + const { nodeResolve } = await import("@rollup/plugin-node-resolve") const entries = await glob(`${options.root}/src/admin/**/*.{ts,tsx,js,jsx}`) /** @@ -36,11 +37,13 @@ export async function plugin(options: PluginOptions) { const external = new Set([ ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.peerDependencies || {}), + ...Object.keys(pkg.devDependencies || {}), "react", "react-dom", "react/jsx-runtime", "react-router-dom", "@medusajs/admin-sdk", + "@tanstack/react-query", ]) /** @@ -60,7 +63,8 @@ export async function plugin(options: PluginOptions) { minify: false, outDir: path.resolve(options.root, options.outDir), rollupOptions: { - external: [...external], + plugins: [nodeResolve() as any], + external: [...external, /node_modules/], output: { globals: { react: "React", diff --git a/packages/admin/dashboard/package.json b/packages/admin/dashboard/package.json index 8507a5c2ae9c8..d7a1767055fbc 100644 --- a/packages/admin/dashboard/package.json +++ b/packages/admin/dashboard/package.json @@ -40,7 +40,7 @@ "dist" ], "dependencies": { - "@ariakit/react": "^0.4.1", + "@ariakit/react": "^0.4.15", "@dnd-kit/core": "^6.1.0", "@dnd-kit/sortable": "^8.0.0", "@hookform/error-message": "^2.0.1", @@ -50,7 +50,7 @@ "@medusajs/js-sdk": "2.3.1", "@medusajs/ui": "4.0.3", "@radix-ui/react-collapsible": "1.1.0", - "@tanstack/react-query": "^5.28.14", + "@tanstack/react-query": "5.64.2", "@tanstack/react-table": "8.20.5", "@tanstack/react-virtual": "^3.8.3", "@uiw/react-json-view": "^2.0.0-alpha.17", diff --git a/packages/admin/dashboard/scripts/i18n/generate-schema.js b/packages/admin/dashboard/scripts/i18n/generate-schema.js index 2175b5483e86d..68d01bd7d3c5f 100644 --- a/packages/admin/dashboard/scripts/i18n/generate-schema.js +++ b/packages/admin/dashboard/scripts/i18n/generate-schema.js @@ -1,5 +1,6 @@ -const fs = require("fs") +const fs = require("fs/promises") const path = require("path") +const prettier = require("prettier") const translationsDir = path.join(__dirname, "../../src/i18n/translations") const enPath = path.join(translationsDir, "en.json") @@ -33,17 +34,31 @@ function generateSchemaFromObject(obj) { } } -try { - const enJson = JSON.parse(fs.readFileSync(enPath, "utf-8")) +async function outputSchema() { + const enContent = await fs.readFile(enPath, "utf-8") + const enJson = JSON.parse(enContent) const schema = { $schema: "http://json-schema.org/draft-07/schema#", ...generateSchemaFromObject(enJson), } - fs.writeFileSync(schemaPath, JSON.stringify(schema, null, 2)) - console.log("Schema generated successfully at:", schemaPath) -} catch (error) { - console.error("Error generating schema:", error.message) - process.exit(1) + const formattedSchema = await prettier.format( + JSON.stringify(schema, null, 2), + { + parser: "json", + } + ) + + await fs + .writeFile(schemaPath, formattedSchema) + .then(() => { + console.log("Schema generated successfully at:", schemaPath) + }) + .catch((error) => { + console.error("Error generating schema:", error.message) + process.exit(1) + }) } + +outputSchema() diff --git a/packages/admin/dashboard/src/i18n/languages.ts b/packages/admin/dashboard/src/i18n/languages.ts index 653ad91af4a84..754f1ccd9558b 100644 --- a/packages/admin/dashboard/src/i18n/languages.ts +++ b/packages/admin/dashboard/src/i18n/languages.ts @@ -14,9 +14,10 @@ import { mk, mn, ar, - zhCN + zhCN, + faIR, + cs } from "date-fns/locale" - import { Language } from "./types" export const languages: Language[] = [ @@ -116,4 +117,16 @@ export const languages: Language[] = [ ltr: true, date_locale: zhCN, }, + { + code: "fa", + display_name: "فارسی", + ltr: false, + date_locale: faIR, + }, + { + code: "cs", + display_name: "Čeština", + ltr: true, + date_locale: cs, + }, ] diff --git a/packages/admin/dashboard/src/i18n/translations/cs.json b/packages/admin/dashboard/src/i18n/translations/cs.json new file mode 100644 index 0000000000000..65a28b881ad3b --- /dev/null +++ b/packages/admin/dashboard/src/i18n/translations/cs.json @@ -0,0 +1,2928 @@ +{ + "$schema": "./$schema.json", + "general": { + "ascending": "Vzestupně", + "descending": "Sestupně", + "add": "Přidat", + "start": "Začátek", + "end": "Konec", + "open": "Otevřít", + "close": "Zavřít", + "apply": "Použít", + "range": "Rozsah", + "search": "Hledat", + "of": "z", + "results": "výsledky", + "pages": "stránky", + "next": "Další", + "prev": "Předchozí", + "is": "je", + "timeline": "Časová osa", + "success": "Úspěch", + "warning": "Varování", + "tip": "Tip", + "error": "Chyba", + "select": "Vybrat", + "selected": "Vybráno", + "enabled": "Povoleno", + "disabled": "Zakázáno", + "expired": "Vypršelo", + "active": "Aktivní", + "revoked": "Odvoláno", + "new": "Nový", + "modified": "Upraveno", + "added": "Přidáno", + "removed": "Odstraněno", + "admin": "Admin", + "store": "Obchod", + "details": "Detaily", + "items_one": "{{count}} položka", + "items_other": "{{count}} položek", + "countSelected": "{{count}} vybráno", + "countOfTotalSelected": "{{count}} z {{total}} vybráno", + "plusCount": "+ {{count}}", + "plusCountMore": "+ {{count}} více", + "areYouSure": "Jste si jistý?", + "noRecordsFound": "Žádné záznamy nenalezeny", + "typeToConfirm": "Prosím napište {val} pro potvrzení:", + "noResultsTitle": "Žádné výsledky", + "noResultsMessage": "Zkuste změnit filtry nebo hledaný dotaz", + "noSearchResults": "Žádné výsledky hledání", + "noSearchResultsFor": "Žádné výsledky hledání pro <0>'{{query}}'", + "noRecordsTitle": "Žádné záznamy", + "noRecordsMessage": "Nejsou žádné záznamy k zobrazení", + "unsavedChangesTitle": "Jste si jistý, že chcete opustit tento formulář?", + "unsavedChangesDescription": "Máte neuložené změny, které budou ztraceny, pokud opustíte tento formulář.", + "includesTaxTooltip": "Ceny v tomto sloupci jsou včetně daně.", + "excludesTaxTooltip": "Ceny v tomto sloupci jsou bez daně.", + "noMoreData": "Žádná další data" + }, + "json": { + "header": "JSON", + "numberOfKeys_one": "{{count}} klíč", + "numberOfKeys_other": "{{count}} klíčů", + "drawer": { + "header_one": "JSON <0>· {{count}} klíč", + "header_other": "JSON <0>· {{count}} klíčů", + "description": "Zobrazit JSON data pro tento objekt." + } + }, + "metadata": { + "header": "Metadata", + "numberOfKeys_one": "{{count}} klíč", + "numberOfKeys_other": "{{count}} klíčů", + "edit": { + "header": "Upravit Metadata", + "description": "Upravit metadata pro tento objekt.", + "successToast": "Metadata byla úspěšně aktualizována.", + "actions": { + "insertRowAbove": "Vložit řádek nad", + "insertRowBelow": "Vložit řádek pod", + "deleteRow": "Smazat řádek" + }, + "labels": { + "key": "Klíč", + "value": "Hodnota" + }, + "complexRow": { + "label": "Některé řádky jsou zakázány", + "description": "Tento objekt obsahuje neprimární metadata, jako jsou pole nebo objekty, které zde nelze upravit. Chcete-li upravit zakázané řádky, použijte přímo API.", + "tooltip": "Tento řádek je zakázán, protože obsahuje neprimární data." + } + } + }, + "validation": { + "mustBeInt": "Hodnota musí být celé číslo.", + "mustBePositive": "Hodnota musí být kladné číslo." + }, + "actions": { + "save": "Uložit", + "saveAsDraft": "Uložit jako koncept", + "copy": "Kopírovat", + "copied": "Zkopírováno", + "duplicate": "Duplikovat", + "publish": "Publikovat", + "create": "Vytvořit", + "delete": "Smazat", + "remove": "Odstranit", + "revoke": "Odvolat", + "cancel": "Zrušit", + "forceConfirm": "Vynutit potvrzení", + "continueEdit": "Pokračovat v úpravách", + "enable": "Povolit", + "disable": "Zakázat", + "undo": "Zpět", + "complete": "Dokončit", + "viewDetails": "Zobrazit detaily", + "back": "Zpět", + "close": "Zavřít", + "showMore": "Zobrazit více", + "continue": "Pokračovat", + "continueWithEmail": "Pokračovat s e-mailem", + "idCopiedToClipboard": "ID zkopírováno do schránky", + "addReason": "Přidat důvod", + "addNote": "Přidat poznámku", + "reset": "Resetovat", + "confirm": "Potvrdit", + "edit": "Upravit", + "addItems": "Přidat položky", + "download": "Stáhnout", + "clear": "Vymazat", + "clearAll": "Vymazat vše", + "apply": "Použít", + "add": "Přidat", + "select": "Vybrat", + "browse": "Procházet", + "logout": "Odhlásit se", + "hide": "Skrýt", + "export": "Exportovat", + "import": "Importovat", + "cannotUndo": "Tuto akci nelze vrátit zpět" + }, + "operators": { + "in": "V" + }, + "app": { + "search": { + "label": "Hledat", + "title": "Hledat", + "description": "Prohledávejte celý svůj obchod, včetně objednávek, produktů, zákazníků a dalších.", + "allAreas": "Všechny oblasti", + "navigation": "Navigace", + "openResult": "Otevřít výsledek", + "showMore": "Zobrazit více", + "placeholder": "Přejít na nebo najít cokoliv...", + "noResultsTitle": "Nebyly nalezeny žádné výsledky", + "noResultsMessage": "Nenašli jsme nic, co by odpovídalo vašemu hledání.", + "emptySearchTitle": "Zadejte hledaný výraz", + "emptySearchMessage": "Zadejte klíčové slovo nebo frázi k prozkoumání.", + "loadMore": "Načíst dalších {{count}}", + "groups": { + "all": "Všechny oblasti", + "customer": "Zákazníci", + "customerGroup": "Skupiny zákazníků", + "product": "Produkty", + "productVariant": "Varianty produktů", + "inventory": "Inventář", + "reservation": "Rezervace", + "category": "Kategorie", + "collection": "Kolekce", + "order": "Objednávky", + "promotion": "Propagace", + "campaign": "Kampaně", + "priceList": "Ceníky", + "user": "Uživatelé", + "region": "Regiony", + "taxRegion": "Daňové regiony", + "returnReason": "Důvody vrácení", + "salesChannel": "Prodejní kanály", + "productType": "Typy produktů", + "productTag": "Štítky produktů", + "location": "Lokace", + "shippingProfile": "Profily dopravy", + "publishableApiKey": "Publikovatelné API klíče", + "secretApiKey": "Tajné API klíče", + "command": "Příkazy", + "navigation": "Navigace" + } + }, + "keyboardShortcuts": { + "pageShortcut": "Přejít na", + "settingShortcut": "Nastavení", + "commandShortcut": "Příkazy", + "then": "pak", + "navigation": { + "goToOrders": "Objednávky", + "goToProducts": "Produkty", + "goToCollections": "Kolekce", + "goToCategories": "Kategorie", + "goToCustomers": "Zákazníci", + "goToCustomerGroups": "Skupiny zákazníků", + "goToInventory": "Inventář", + "goToReservations": "Rezervace", + "goToPriceLists": "Ceníky", + "goToPromotions": "Propagace", + "goToCampaigns": "Kampaně" + }, + "settings": { + "goToSettings": "Nastavení", + "goToStore": "Obchod", + "goToUsers": "Uživatelé", + "goToRegions": "Regiony", + "goToTaxRegions": "Daňové regiony", + "goToSalesChannels": "Prodejní kanály", + "goToProductTypes": "Typy produktů", + "goToLocations": "Lokace", + "goToPublishableApiKeys": "Publikovatelné API klíče", + "goToSecretApiKeys": "Tajné API klíče", + "goToWorkflows": "Pracovní postupy", + "goToProfile": "Profil", + "goToReturnReasons": "Důvody vrácení" + } + }, + "menus": { + "user": { + "documentation": "Dokumentace", + "changelog": "Seznam změn", + "shortcuts": "Zkratky", + "profileSettings": "Nastavení profilu", + "theme": { + "label": "Téma", + "dark": "Tmavé", + "light": "Světlé", + "system": "Systémové" + } + }, + "store": { + "label": "Obchod", + "storeSettings": "Nastavení obchodu" + }, + "actions": { + "logout": "Odhlásit se" + } + }, + "nav": { + "accessibility": { + "title": "Navigace", + "description": "Navigační menu pro dashboard." + }, + "common": { + "extensions": "Rozšíření" + }, + "main": { + "store": "Obchod", + "storeSettings": "Nastavení obchodu" + }, + "settings": { + "header": "Nastavení", + "general": "Obecné", + "developer": "Vývojář", + "myAccount": "Můj účet" + } + } + }, + "dataGrid": { + "columns": { + "view": "Zobrazit", + "resetToDefault": "Obnovit na výchozí", + "disabled": "Změna viditelných sloupců je zakázána." + }, + "shortcuts": { + "label": "Zkratky", + "commands": { + "undo": "Zpět", + "redo": "Znovu", + "copy": "Kopírovat", + "paste": "Vložit", + "edit": "Upravit", + "delete": "Smazat", + "clear": "Vymazat", + "moveUp": "Posunout nahoru", + "moveDown": "Posunout dolů", + "moveLeft": "Posunout doleva", + "moveRight": "Posunout doprava", + "moveTop": "Posunout na začátek", + "moveBottom": "Posunout na konec", + "selectDown": "Vybrat dolů", + "selectUp": "Vybrat nahoru", + "selectColumnDown": "Vybrat sloupec dolů", + "selectColumnUp": "Vybrat sloupec nahoru", + "focusToolbar": "Zaměřit na panel nástrojů", + "focusCancel": "Zaměřit na zrušení" + } + }, + "errors": { + "fixError": "Opravit chybu", + "count_one": "{{count}} chyba", + "count_other": "{{count}} chyb" + } + }, + "filters": { + "sortLabel": "Řadit", + "filterLabel": "Filtr", + "searchLabel": "Hledat", + "date": { + "today": "Dnes", + "lastSevenDays": "Posledních 7 dní", + "lastThirtyDays": "Posledních 30 dní", + "lastNinetyDays": "Posledních 90 dní", + "lastTwelveMonths": "Posledních 12 měsíců", + "custom": "Vlastní", + "from": "Od", + "to": "Do", + "starting": "Začíná", + "ending": "Končí" + }, + "compare": { + "lessThan": "Méně než", + "greaterThan": "Více než", + "exact": "Přesně", + "range": "Rozsah", + "lessThanLabel": "méně než {{value}}", + "greaterThanLabel": "více než {{value}}", + "andLabel": "a" + }, + "sorting": { + "alphabeticallyAsc": "A až Z", + "alphabeticallyDesc": "Z až A", + "dateAsc": "Nejnovější první", + "dateDesc": "Nejstarší první" + }, + "radio": { + "yes": "Ano", + "no": "Ne", + "true": "Pravda", + "false": "Nepravda" + }, + "addFilter": "Přidat filtr" + }, + "errorBoundary": { + "badRequestTitle": "400 - Špatný požadavek", + "badRequestMessage": "Požadavek nemohl být pochopen serverem kvůli špatné syntaxi.", + "notFoundTitle": "404 - Na této adrese není žádná stránka", + "notFoundMessage": "Zkontrolujte URL a zkuste to znovu, nebo použijte vyhledávací lištu k nalezení toho, co hledáte.", + "internalServerErrorTitle": "500 - Interní chyba serveru", + "internalServerErrorMessage": "Na serveru došlo k neočekávané chybě. Zkuste to prosím později.", + "defaultTitle": "Došlo k chybě", + "defaultMessage": "Při vykreslování této stránky došlo k neočekávané chybě.", + "noMatchMessage": "Stránka, kterou hledáte, neexistuje.", + "backToDashboard": "Zpět na dashboard" + }, + "addresses": { + "shippingAddress": { + "header": "Doručovací adresa", + "editHeader": "Upravit doručovací adresu", + "editLabel": "Doručovací adresa", + "label": "Doručovací adresa" + }, + "billingAddress": { + "header": "Fakturační adresa", + "editHeader": "Upravit fakturační adresu", + "editLabel": "Fakturační adresa", + "label": "Fakturační adresa", + "sameAsShipping": "Stejná jako doručovací adresa" + }, + "contactHeading": "Kontakt", + "locationHeading": "Lokace" + }, + "email": { + "editHeader": "Upravit e-mail", + "editLabel": "E-mail", + "label": "E-mail" + }, + "transferOwnership": { + "header": "Převod vlastnictví", + "label": "Převod vlastnictví", + "details": { + "order": "Detaily objednávky", + "draft": "Detaily konceptu" + }, + "currentOwner": { + "label": "Současný vlastník", + "hint": "Současný vlastník objednávky." + }, + "newOwner": { + "label": "Nový vlastník", + "hint": "Nový vlastník, na kterého se objednávka převede." + }, + "validation": { + "mustBeDifferent": "Nový vlastník musí být odlišný od současného vlastníka.", + "required": "Nový vlastník je povinný." + } + }, + "sales_channels": { + "availableIn": "Dostupné v <0>{{x}} z <1>{{y}} prodejních kanálů" + }, + "products": { + "domain": "Produkty", + "list": { + "noRecordsMessage": "Vytvořte svůj první produkt, abyste mohli začít prodávat." + }, + "edit": { + "header": "Upravit produkt", + "description": "Upravit detaily produktu.", + "successToast": "Produkt {{title}} byl úspěšně aktualizován." + }, + "create": { + "title": "Vytvořit produkt", + "description": "Vytvořit nový produkt.", + "header": "Obecné", + "tabs": { + "details": "Detaily", + "organize": "Organizovat", + "variants": "Varianty", + "inventory": "Sady inventáře" + }, + "errors": { + "variants": "Prosím vyberte alespoň jednu variantu.", + "options": "Prosím vytvořte alespoň jednu možnost.", + "uniqueSku": "SKU musí být jedinečné." + }, + "inventory": { + "heading": "Sady inventáře", + "label": "Přidat inventární položky do sady inventáře varianty.", + "itemPlaceholder": "Vybrat inventární položku", + "quantityPlaceholder": "Kolik z těchto položek je potřeba pro sadu?" + }, + "variants": { + "header": "Varianty", + "subHeadingTitle": "Ano, toto je produkt s variantami", + "subHeadingDescription": "Když není zaškrtnuto, vytvoříme pro vás výchozí variantu", + "optionTitle": { + "placeholder": "Velikost" + }, + "optionValues": { + "placeholder": "Malá, Střední, Velká" + }, + "productVariants": { + "label": "Varianty produktů", + "hint": "Toto pořadí ovlivní pořadí variant ve vašem obchodě.", + "alert": "Přidejte možnosti pro vytvoření variant.", + "tip": "Varianty, které nejsou zaškrtnuté, nebudou vytvořeny. Můžete vždy vytvořit a upravit varianty později, ale tento seznam odpovídá variacím ve vašich produktových možnostech." + }, + "productOptions": { + "label": "Možnosti produktů", + "hint": "Definujte možnosti pro produkt, např. barvu, velikost atd." + } + }, + "successToast": "Produkt {{title}} byl úspěšně vytvořen." + }, + "export": { + "header": "Exportovat seznam produktů", + "description": "Exportovat seznam produktů do souboru CSV.", + "success": { + "title": "Zpracováváme váš export", + "description": "Export dat může trvat několik minut. Oznámíme vám, až budeme hotovi." + }, + "filters": { + "title": "Filtry", + "description": "Použijte filtry v přehledu tabulky pro úpravu tohoto zobrazení" + }, + "columns": { + "title": "Sloupce", + "description": "Přizpůsobte exportovaná data tak, aby splňovala specifické potřeby" + } + }, + "import": { + "header": "Importovat seznam produktů", + "uploadLabel": "Importovat produkty", + "uploadHint": "Přetáhněte soubor CSV nebo klikněte pro nahrání", + "description": "Importujte produkty poskytnutím souboru CSV v předdefinovaném formátu", + "template": { + "title": "Nejste si jisti, jak uspořádat svůj seznam?", + "description": "Stáhněte si níže uvedenou šablonu, abyste se ujistili, že dodržujete správný formát." + }, + "upload": { + "title": "Nahrát soubor CSV", + "description": "Prostřednictvím importů můžete přidávat nebo aktualizovat produkty. Pro aktualizaci existujících produktů musíte použít existující handle a ID, pro aktualizaci existujících variant musíte použít existující ID. Před importem produktů budete požádáni o potvrzení.", + "preprocessing": "Předzpracování...", + "productsToCreate": "Produkty budou vytvořeny", + "productsToUpdate": "Produkty budou aktualizovány" + }, + "success": { + "title": "Zpracováváme váš import", + "description": "Import dat může chvíli trvat. Oznámíme vám, až budeme hotovi." + } + }, + "deleteWarning": "Chystáte se smazat produkt {{title}}. Tuto akci nelze vrátit zpět.", + "variants": { + "header": "Varianty", + "empty": { + "heading": "Žádné varianty", + "description": "Nejsou žádné varianty k zobrazení." + }, + "filtered": { + "heading": "Žádné výsledky", + "description": "Žádné varianty neodpovídají aktuálním kritériím filtru." + } + }, + "attributes": "Atributy", + "editAttributes": "Upravit atributy", + "editOptions": "Upravit možnosti", + "editPrices": "Upravit ceny", + "media": { + "label": "Média", + "editHint": "Přidejte média k produktu, aby se zobrazila ve vašem obchodě.", + "makeThumbnail": "Vytvořit miniaturu", + "uploadImagesLabel": "Nahrát obrázky", + "uploadImagesHint": "Přetáhněte obrázky sem nebo klikněte pro nahrání.", + "invalidFileType": "'{{name}}' není podporovaný typ souboru. Podporované typy souborů jsou: {{types}}.", + "failedToUpload": "Nepodařilo se nahrát přidaná média. Zkuste to prosím znovu.", + "deleteWarning_one": "Chystáte se smazat {{count}} obrázek. Tuto akci nelze vrátit zpět.", + "deleteWarning_other": "Chystáte se smazat {{count}} obrázků. Tuto akci nelze vrátit zpět.", + "deleteWarningWithThumbnail_one": "Chystáte se smazat {{count}} obrázek včetně miniatury. Tuto akci nelze vrátit zpět.", + "deleteWarningWithThumbnail_other": "Chystáte se smazat {{count}} obrázků včetně miniatury. Tuto akci nelze vrátit zpět.", + "thumbnailTooltip": "Miniatura", + "galleryLabel": "Galerie", + "downloadImageLabel": "Stáhnout aktuální obrázek", + "deleteImageLabel": "Smazat aktuální obrázek", + "emptyState": { + "header": "Zatím žádná média", + "description": "Přidejte média k produktu, aby se zobrazila ve vašem obchodě.", + "action": "Přidat média" + }, + "successToast": "Média byla úspěšně aktualizována." + }, + "discountableHint": "Když není zaškrtnuto, slevy nebudou na tento produkt aplikovány.", + "noSalesChannels": "Není dostupné v žádných prodejních kanálech", + "variantCount_one": "{{count}} varianta", + "variantCount_other": "{{count}} variant", + "deleteVariantWarning": "Chystáte se smazat variantu {{title}}. Tuto akci nelze vrátit zpět.", + "productStatus": { + "draft": "Koncept", + "published": "Publikováno", + "proposed": "Navrženo", + "rejected": "Odmítnuto" + }, + "fields": { + "title": { + "label": "Název", + "hint": "Dejte svému produktu krátký a jasný název.<0/>50-60 znaků je doporučená délka pro vyhledávače." + }, + "subtitle": { + "label": "Podtitul" + }, + "handle": { + "label": "Handle", + "tooltip": "Handle se používá k odkazování na produkt ve vašem obchodě. Pokud není specifikováno, handle bude vygenerováno z názvu produktu." + }, + "description": { + "label": "Popis", + "hint": "Dejte svému produktu krátký a jasný popis.<0/>120-160 znaků je doporučená délka pro vyhledávače." + }, + "discountable": { + "label": "Slevový", + "hint": "Když není zaškrtnuto, slevy nebudou na tento produkt aplikovány" + }, + "type": { + "label": "Typ" + }, + "collection": { + "label": "Kolekce" + }, + "categories": { + "label": "Kategorie" + }, + "tags": { + "label": "Štítky" + }, + "sales_channels": { + "label": "Prodejní kanály", + "hint": "Tento produkt bude dostupný pouze v výchozím prodejním kanálu, pokud zůstane nedotčen." + }, + "countryOrigin": { + "label": "Země původu" + }, + "material": { + "label": "Materiál" + }, + "width": { + "label": "Šířka" + }, + "length": { + "label": "Délka" + }, + "height": { + "label": "Výška" + }, + "weight": { + "label": "Hmotnost" + }, + "options": { + "label": "Možnosti produktů", + "hint": "Možnosti se používají k definování barvy, velikosti atd. produktu", + "add": "Přidat možnost", + "optionTitle": "Název možnosti", + "optionTitlePlaceholder": "Barva", + "variations": "Variace (oddělené čárkou)", + "variantionsPlaceholder": "Červená, Modrá, Zelená" + }, + "variants": { + "label": "Varianty produktů", + "hint": "Varianty, které nejsou zaškrtnuté, nebudou vytvořeny. Toto pořadí ovlivní, jak jsou varianty řazeny ve vašem frontend." + }, + "mid_code": { + "label": "Mid kód" + }, + "hs_code": { + "label": "HS kód" + } + }, + "variant": { + "edit": { + "header": "Upravit variantu", + "success": "Varianta produktu byla úspěšně upravena" + }, + "create": { + "header": "Detaily varianty" + }, + "deleteWarning": "Jste si jisti, že chcete smazat tuto variantu?", + "pricesPagination": "1 - {{current}} z {{total}} cen", + "tableItemAvailable": "{{availableCount}} dostupné", + "tableItem_one": "{{availableCount}} dostupné na {{locationCount}} lokaci", + "tableItem_other": "{{availableCount}} dostupné na {{locationCount}} lokacích", + "inventory": { + "notManaged": "Nespravováno", + "manageItems": "Spravovat inventární položky", + "notManagedDesc": "Inventář není spravován pro tuto variantu. Zapněte 'Spravovat inventář' pro sledování inventáře varianty.", + "manageKit": "Spravovat sadu inventáře", + "navigateToItem": "Přejít na inventární položku", + "actions": { + "inventoryItems": "Přejít na inventární položku", + "inventoryKit": "Zobrazit inventární položky" + }, + "inventoryKit": "Sada inventáře", + "inventoryKitHint": "Skládá se tato varianta z několika inventárních položek?", + "validation": { + "itemId": "Prosím vyberte inventární položku.", + "quantity": "Množství je povinné. Prosím zadejte kladné číslo." + }, + "header": "Sklad & Inventář", + "editItemDetails": "Upravit detaily položky", + "manageInventoryLabel": "Spravovat inventář", + "manageInventoryHint": "Když je povoleno, změníme množství inventáře za vás, když jsou vytvořeny objednávky a vrácení.", + "allowBackordersLabel": "Povolit zpětné objednávky", + "allowBackordersHint": "Když je povoleno, zákazníci mohou zakoupit variantu, i když není dostupné množství.", + "toast": { + "levelsBatch": "Úrovně inventáře byly aktualizovány.", + "update": "Inventární položka byla úspěšně aktualizována.", + "updateLevel": "Úroveň inventáře byla úspěšně aktualizována.", + "itemsManageSuccess": "Inventární položky byly úspěšně aktualizovány." + } + } + }, + "options": { + "header": "Možnosti", + "edit": { + "header": "Upravit možnost", + "successToast": "Možnost {{title}} byla úspěšně aktualizována." + }, + "create": { + "header": "Vytvořit možnost", + "successToast": "Možnost {{title}} byla úspěšně vytvořena." + }, + "deleteWarning": "Chystáte se smazat možnost produktu: {{title}}. Tuto akci nelze vrátit zpět." + }, + "organization": { + "header": "Organizovat", + "edit": { + "header": "Upravit organizaci", + "toasts": { + "success": "Organizace {{title}} byla úspěšně aktualizována." + } + } + }, + "stock": { + "heading": "Spravovat úrovně zásob produktů a lokace", + "description": "Aktualizujte úrovně zásob pro všechny varianty produktu.", + "loading": "Počkejte, může to chvíli trvat...", + "tooltips": { + "alreadyManaged": "Tato inventární položka je již upravitelná pod {{title}}.", + "alreadyManagedWithSku": "Tato inventární položka je již upravitelná pod {{title}} ({{sku}})." + } + }, + "toasts": { + "delete": { + "success": { + "header": "Produkt byl smazán", + "description": "{{title}} byl úspěšně smazán." + }, + "error": { + "header": "Nepodařilo se smazat produkt" + } + } + } + }, + "collections": { + "domain": "Kolekce", + "subtitle": "Organizujte produkty do kolekcí.", + "createCollection": "Vytvořit kolekci", + "createCollectionHint": "Vytvořte novou kolekci pro organizaci vašich produktů.", + "createSuccess": "Kolekce byla úspěšně vytvořena.", + "editCollection": "Upravit kolekci", + "handleTooltip": "Handle se používá k odkazování na kolekci ve vašem obchodě. Pokud není specifikováno, handle bude vygenerováno z názvu kolekce.", + "deleteWarning": "Chystáte se smazat kolekci {{title}}. Tuto akci nelze vrátit zpět.", + "removeSingleProductWarning": "Chystáte se odstranit produkt {{title}} z kolekce. Tuto akci nelze vrátit zpět.", + "removeProductsWarning_one": "Chystáte se odstranit {{count}} produkt z kolekce. Tuto akci nelze vrátit zpět.", + "removeProductsWarning_other": "Chystáte se odstranit {{count}} produktů z kolekce. Tuto akci nelze vrátit zpět.", + "products": { + "list": { + "noRecordsMessage": "V kolekci nejsou žádné produkty." + }, + "add": { + "successToast_one": "Produkt byl úspěšně přidán do kolekce.", + "successToast_other": "Produkty byly úspěšně přidány do kolekce." + }, + "remove": { + "successToast_one": "Produkt byl úspěšně odstraněn z kolekce.", + "successToast_other": "Produkty byly úspěšně odstraněny z kolekce." + } + } + }, + "categories": { + "domain": "Kategorie", + "subtitle": "Organizujte produkty do kategorií a spravujte jejich pořadí a hierarchii.", + "create": { + "header": "Vytvořit kategorii", + "hint": "Vytvořte novou kategorii pro organizaci vašich produktů.", + "tabs": { + "details": "Detaily", + "organize": "Organizovat pořadí" + }, + "successToast": "Kategorie {{name}} byla úspěšně vytvořena." + }, + "edit": { + "header": "Upravit kategorii", + "description": "Upravit kategorii pro aktualizaci jejích detailů.", + "successToast": "Kategorie byla úspěšně aktualizována." + }, + "delete": { + "confirmation": "Chystáte se smazat kategorii {{name}}. Tuto akci nelze vrátit zpět.", + "successToast": "Kategorie {{name}} byla úspěšně smazána." + }, + "products": { + "add": { + "disabledTooltip": "Produkt je již v této kategorii.", + "successToast_one": "Přidán {{count}} produkt do kategorie.", + "successToast_other": "Přidáno {{count}} produktů do kategorie." + }, + "remove": { + "confirmation_one": "Chystáte se odstranit {{count}} produkt z kategorie. Tuto akci nelze vrátit zpět.", + "confirmation_other": "Chystáte se odstranit {{count}} produktů z kategorie. Tuto akci nelze vrátit zpět.", + "successToast_one": "Odstraněn {{count}} produkt z kategorie.", + "successToast_other": "Odstraněno {{count}} produktů z kategorie." + }, + "list": { + "noRecordsMessage": "V kategorii nejsou žádné produkty." + } + }, + "organize": { + "header": "Organizovat", + "action": "Upravit pořadí" + }, + "fields": { + "visibility": { + "label": "Viditelnost", + "internal": "Interní", + "public": "Veřejné" + }, + "status": { + "label": "Stav", + "active": "Aktivní", + "inactive": "Neaktivní" + }, + "path": { + "label": "Cesta", + "tooltip": "Zobrazit plnou cestu kategorie." + }, + "children": { + "label": "Děti" + }, + "new": { + "label": "Nový" + } + } + }, + "inventory": { + "domain": "Inventář", + "subtitle": "Spravujte své inventární položky", + "reserved": "Rezervováno", + "available": "Dostupné", + "locationLevels": "Lokace", + "associatedVariants": "Přidružené varianty", + "manageLocations": "Spravovat lokace", + "deleteWarning": "Chystáte se smazat inventární položku. Tuto akci nelze vrátit zpět.", + "editItemDetails": "Upravit detaily položky", + "create": { + "title": "Vytvořit inventární položku", + "details": "Detaily", + "availability": "Dostupnost", + "locations": "Lokace", + "attributes": "Atributy", + "requiresShipping": "Vyžaduje dopravu", + "requiresShippingHint": "Vyžaduje inventární položka dopravu?", + "successToast": "Inventární položka byla úspěšně vytvořena." + }, + "reservation": { + "header": "Rezervace {{itemName}}", + "editItemDetails": "Upravit rezervaci", + "lineItemId": "ID položky", + "orderID": "ID objednávky", + "description": "Popis", + "location": "Lokace", + "inStockAtLocation": "Na skladě na této lokaci", + "availableAtLocation": "Dostupné na této lokaci", + "reservedAtLocation": "Rezervováno na této lokaci", + "reservedAmount": "Rezervované množství", + "create": "Vytvořit rezervaci", + "itemToReserve": "Položka k rezervaci", + "quantityPlaceholder": "Kolik chcete rezervovat?", + "descriptionPlaceholder": "Jaký typ rezervace to je?", + "successToast": "Rezervace byla úspěšně vytvořena.", + "updateSuccessToast": "Rezervace byla úspěšně aktualizována.", + "deleteSuccessToast": "Rezervace byla úspěšně smazána.", + "errors": { + "noAvaliableQuantity": "Skladová lokace nemá dostupné množství.", + "quantityOutOfRange": "Minimální množství je 1 a maximální množství je {{max}}" + } + }, + "adjustInventory": { + "errors": { + "stockedQuantity": "Skladové množství nelze aktualizovat na méně než rezervované množství {{quantity}}." + } + }, + "toast": { + "updateLocations": "Lokace byly úspěšně aktualizovány.", + "updateLevel": "Úroveň inventáře byla úspěšně aktualizována.", + "updateItem": "Inventární položka byla úspěšně aktualizována." + }, + "stock": { + "title": "Aktualizovat úrovně inventáře", + "description": "Aktualizujte skladové úrovně pro vybrané inventární položky.", + "action": "Upravit úrovně zásob", + "placeholder": "Není povoleno", + "disablePrompt_one": "Chystáte se zakázat {{count}} úroveň lokace. Tuto akci nelze vrátit zpět.", + "disablePrompt_other": "Chystáte se zakázat {{count}} úrovní lokace. Tuto akci nelze vrátit zpět.", + "disabledToggleTooltip": "Nelze zakázat: vymažte příchozí a/nebo rezervované množství před zakázáním.", + "successToast": "Úrovně inventáře byly úspěšně aktualizovány." + } + }, + "giftCards": { + "domain": "Dárkové karty", + "editGiftCard": "Upravit dárkovou kartu", + "createGiftCard": "Vytvořit dárkovou kartu", + "createGiftCardHint": "Ručně vytvořte dárkovou kartu, kterou lze použít jako platební metodu ve vašem obchodě.", + "selectRegionFirst": "Nejprve vyberte region", + "deleteGiftCardWarning": "Chystáte se smazat dárkovou kartu {{code}}. Tuto akci nelze vrátit zpět.", + "balanceHigherThanValue": "Zůstatek nemůže být vyšší než původní částka.", + "balanceLowerThanZero": "Zůstatek nemůže být záporný.", + "expiryDateHint": "Země mají různé zákony týkající se data vypršení platnosti dárkových karet. Ujistěte se, že jste zkontrolovali místní předpisy před nastavením data vypršení platnosti.", + "regionHint": "Změna regionu dárkové karty také změní její měnu, což může ovlivnit její peněžní hodnotu.", + "enabledHint": "Určete, zda je dárková karta povolena nebo zakázána.", + "balance": "Zůstatek", + "currentBalance": "Aktuální zůstatek", + "initialBalance": "Počáteční zůstatek", + "personalMessage": "Osobní zpráva", + "recipient": "Příjemce" + }, + "customers": { + "domain": "Zákazníci", + "list": { + "noRecordsMessage": "Vaši zákazníci se zde zobrazí." + }, + "create": { + "header": "Vytvořit zákazníka", + "hint": "Vytvořte nového zákazníka a spravujte jeho detaily.", + "successToast": "Zákazník {{email}} byl úspěšně vytvořen." + }, + "groups": { + "label": "Skupiny zákazníků", + "remove": "Jste si jisti, že chcete odstranit zákazníka ze skupiny zákazníků \"{{name}}\"?", + "removeMany": "Jste si jisti, že chcete zákazníka odstranit z následujících skupin zákazníků: {{groups}}?", + "alreadyAddedTooltip": "Zákazník je již v této skupině zákazníků.", + "list": { + "noRecordsMessage": "Tento zákazník nepatří do žádné skupiny." + }, + "add": { + "success": "Zákazník přidán do: {{groups}}.", + "list": { + "noRecordsMessage": "Nejprve vytvořte skupinu zákazníků." + } + }, + "removed": { + "success": "Zákazník odstraněn z: {{groups}}.", + "list": { + "noRecordsMessage": "Nejprve vytvořte skupinu zákazníků." + } + } + }, + "edit": { + "header": "Upravit zákazníka", + "emailDisabledTooltip": "E-mailová adresa nemůže být změněna pro registrované zákazníky.", + "successToast": "Zákazník {{email}} byl úspěšně aktualizován." + }, + "delete": { + "title": "Smazat zákazníka", + "description": "Chystáte se smazat zákazníka {{email}}. Tuto akci nelze vrátit zpět.", + "successToast": "Zákazník {{email}} byl úspěšně smazán." + }, + "fields": { + "guest": "Host", + "registered": "Registrovaný", + "groups": "Skupiny" + }, + "registered": "Registrovaný", + "guest": "Host", + "hasAccount": "Má účet" + }, + "customerGroups": { + "domain": "Skupiny zákazníků", + "subtitle": "Organizujte zákazníky do skupin. Skupiny mohou mít různé propagace a ceny.", + "list": { + "empty": { + "heading": "Žádné skupiny zákazníků", + "description": "Nejsou žádné skupiny zákazníků k zobrazení." + }, + "filtered": { + "heading": "Žádné výsledky", + "description": "Žádné skupiny zákazníků neodpovídají aktuálním kritériím filtru." + } + }, + "create": { + "header": "Vytvořit skupinu zákazníků", + "hint": "Vytvořte novou skupinu zákazníků pro segmentaci vašich zákazníků.", + "successToast": "Skupina zákazníků {{name}} byla úspěšně vytvořena." + }, + "edit": { + "header": "Upravit skupinu zákazníků", + "successToast": "Skupina zákazníků {{name}} byla úspěšně aktualizována." + }, + "delete": { + "title": "Smazat skupinu zákazníků", + "description": "Chystáte se smazat skupinu zákazníků {{name}}. Tuto akci nelze vrátit zpět.", + "successToast": "Skupina zákazníků {{name}} byla úspěšně smazána." + }, + "customers": { + "alreadyAddedTooltip": "Zákazník již byl přidán do skupiny.", + "add": { + "successToast_one": "Zákazník byl úspěšně přidán do skupiny.", + "successToast_other": "Zákazníci byli úspěšně přidáni do skupiny.", + "list": { + "noRecordsMessage": "Nejprve vytvořte zákazníka." + } + }, + "remove": { + "title_one": "Odstranit zákazníka", + "title_other": "Odstranit zákazníky", + "description_one": "Chystáte se odstranit {{count}} zákazníka ze skupiny zákazníků. Tuto akci nelze vrátit zpět.", + "description_other": "Chystáte se odstranit {{count}} zákazníků ze skupiny zákazníků. Tuto akci nelze vrátit zpět." + }, + "list": { + "noRecordsMessage": "Tato skupina nemá zákazníky." + } + } + }, + "orders": { + "domain": "Objednávky", + "claim": "Reklamace", + "exchange": "Výměna", + "return": "Vrácení", + "cancelWarning": "Chystáte se zrušit objednávku {{id}}. Tuto akci nelze vrátit zpět.", + "orderCanceled": "Objednávka byla úspěšně zrušena", + "onDateFromSalesChannel": "{{date}} z {{salesChannel}}", + "list": { + "noRecordsMessage": "Vaše objednávky se zde zobrazí." + }, + "status": { + "not_paid": "Nezaplaceno", + "pending": "Čeká se", + "completed": "Dokončeno", + "draft": "Koncept", + "archived": "Archivováno", + "canceled": "Zrušeno", + "requires_action": "Vyžaduje akci" + }, + "summary": { + "requestReturn": "Požádat o vrácení", + "allocateItems": "Přidělit položky", + "editOrder": "Upravit objednávku", + "editOrderContinue": "Pokračovat v úpravě objednávky", + "inventoryKit": "Skládá se z {{count}}x inventárních položek", + "itemTotal": "Celková cena položek", + "shippingTotal": "Celková cena dopravy", + "discountTotal": "Celková sleva", + "taxTotalIncl": "Celková daň (včetně)", + "itemSubtotal": "Mezisoučet položek", + "shippingSubtotal": "Mezisoučet dopravy", + "discountSubtotal": "Mezisoučet slevy", + "taxTotal": "Celková daň" + }, + "transfer": { + "title": "Převod vlastnictví", + "requestSuccess": "Žádost o převod objednávky byla odeslána na: {{email}}.", + "currentOwner": "Současný vlastník", + "newOwner": "Nový vlastník", + "currentOwnerDescription": "Zákazník aktuálně spojený s touto objednávkou.", + "newOwnerDescription": "Zákazník, na kterého se objednávka převede." + }, + "payment": { + "title": "Platby", + "isReadyToBeCaptured": "Platba <0/> je připravena k zachycení.", + "totalPaidByCustomer": "Celková částka zaplacená zákazníkem", + "capture": "Zachytit platbu", + "capture_short": "Zachytit", + "refund": "Vrácení peněz", + "markAsPaid": "Označit jako zaplaceno", + "statusLabel": "Stav platby", + "statusTitle": "Stav platby", + "status": { + "notPaid": "Nezaplaceno", + "authorized": "Autorizováno", + "partiallyAuthorized": "Částečně autorizováno", + "awaiting": "Čeká se", + "captured": "Zachyceno", + "partiallyRefunded": "Částečně vráceno", + "partiallyCaptured": "Částečně zachyceno", + "refunded": "Vráceno", + "canceled": "Zrušeno", + "requiresAction": "Vyžaduje akci" + }, + "capturePayment": "Platba ve výši {{amount}} bude zachycena.", + "capturePaymentSuccess": "Platba ve výši {{amount}} byla úspěšně zachycena", + "markAsPaidPayment": "Platba ve výši {{amount}} bude označena jako zaplacená.", + "markAsPaidPaymentSuccess": "Platba ve výši {{amount}} byla úspěšně označena jako zaplacená", + "createRefund": "Vytvořit vrácení peněz", + "refundPaymentSuccess": "Vrácení peněz ve výši {{amount}} bylo úspěšné", + "createRefundWrongQuantity": "Množství by mělo být číslo mezi 1 a {{number}}", + "refundAmount": "Vrátit {{ amount }}", + "paymentLink": "Zkopírovat odkaz na platbu pro {{ amount }}", + "selectPaymentToRefund": "Vyberte platbu k vrácení" + }, + "edits": { + "title": "Upravit objednávku", + "confirm": "Potvrdit úpravu", + "confirmText": "Chystáte se potvrdit úpravu objednávky. Tuto akci nelze vrátit zpět.", + "cancel": "Zrušit úpravu", + "currentItems": "Aktuální položky", + "currentItemsDescription": "Upravit množství položky nebo odstranit.", + "addItemsDescription": "Můžete přidat nové položky do objednávky.", + "addItems": "Přidat položky", + "amountPaid": "Zaplacená částka", + "newTotal": "Nový celkový součet", + "differenceDue": "Rozdíl k úhradě", + "create": "Upravit objednávku", + "currentTotal": "Aktuální celkový součet", + "noteHint": "Přidat interní poznámku k úpravě", + "cancelSuccessToast": "Úprava objednávky byla zrušena", + "createSuccessToast": "Žádost o úpravu objednávky byla vytvořena", + "activeChangeError": "Na objednávce je již aktivní změna objednávky (vrácení, reklamace, výměna atd.). Dokončete nebo zrušte změnu před úpravou objednávky.", + "panel": { + "title": "Žádost o úpravu objednávky", + "titlePending": "Čeká se na úpravu objednávky" + }, + "toast": { + "canceledSuccessfully": "Úprava objednávky byla úspěšně zrušena", + "confirmedSuccessfully": "Úprava objednávky byla úspěšně potvrzena" + }, + "validation": { + "quantityLowerThanFulfillment": "Nelze nastavit množství na méně než nebo rovno splněnému množství" + } + }, + "edit": { + "email": { + "title": "Upravit e-mail", + "requestSuccess": "E-mail objednávky byl aktualizován na {{email}}." + }, + "shippingAddress": { + "title": "Upravit doručovací adresu", + "requestSuccess": "Doručovací adresa objednávky byla aktualizována." + }, + "billingAddress": { + "title": "Upravit fakturační adresu", + "requestSuccess": "Fakturační adresa objednávky byla aktualizována." + } + }, + "returns": { + "create": "Vytvořit vrácení", + "confirm": "Potvrdit vrácení", + "confirmText": "Chystáte se potvrdit vrácení. Tuto akci nelze vrátit zpět.", + "inbound": "Příchozí", + "outbound": "Odchozí", + "sendNotification": "Odeslat oznámení", + "sendNotificationHint": "Oznámit zákazníkovi o vrácení.", + "returnTotal": "Celková částka vrácení", + "inboundTotal": "Celková částka příchozí", + "refundAmount": "Částka k vrácení", + "outstandingAmount": "Nesplacená částka", + "reason": "Důvod", + "reasonHint": "Vyberte, proč chce zákazník vrátit položky.", + "note": "Poznámka", + "noInventoryLevel": "Žádná úroveň inventáře", + "noInventoryLevelDesc": "Vybraná lokace nemá úroveň inventáře pro vybrané položky. Vrácení může být požadováno, ale nemůže být přijato, dokud nebude vytvořena úroveň inventáře pro vybranou lokaci.", + "noteHint": "Můžete volně psát, pokud chcete něco upřesnit.", + "location": "Lokace", + "locationHint": "Vyberte, na kterou lokaci chcete vrátit položky.", + "inboundShipping": "Vrácení dopravy", + "inboundShippingHint": "Vyberte, kterou metodu chcete použít.", + "returnableQuantityLabel": "Množství k vrácení", + "refundableAmountLabel": "Částka k vrácení", + "returnRequestedInfo": "{{requestedItemsCount}}x položek požadováno k vrácení", + "returnReceivedInfo": "{{requestedItemsCount}}x položek přijato k vrácení", + "itemReceived": "Položky přijaty", + "returnRequested": "Požadováno vrácení", + "damagedItemReceived": "Poškozené položky přijaty", + "damagedItemsReturned": "{{quantity}}x poškozených položek vráceno", + "activeChangeError": "Na této objednávce probíhá aktivní změna objednávky. Dokončete nebo zrušte předchozí změnu.", + "cancel": { + "title": "Zrušit vrácení", + "description": "Jste si jisti, že chcete zrušit žádost o vrácení?" + }, + "placeholders": { + "noReturnShippingOptions": { + "title": "Nebyly nalezeny žádné možnosti vrácení dopravy", + "hint": "Nebyly vytvořeny žádné možnosti vrácení dopravy pro lokaci. Můžete vytvořit jednu na Lokace & Doprava." + }, + "outboundShippingOptions": { + "title": "Nebyly nalezeny žádné možnosti odchozí dopravy", + "hint": "Nebyly vytvořeny žádné možnosti odchozí dopravy pro lokaci. Můžete vytvořit jednu na Lokace & Doprava." + } + }, + "receive": { + "action": "Přijmout položky", + "receiveItems": "{{ returnType }} {{ id }}", + "restockAll": "Doplnit všechny položky", + "itemsLabel": "Přijaté položky", + "title": "Přijmout položky pro #{{returnId}}", + "sendNotificationHint": "Oznámit zákazníkovi o přijatém vrácení.", + "inventoryWarning": "Upozorňujeme, že automaticky upravíme úrovně inventáře na základě vašeho vstupu výše.", + "writeOffInputLabel": "Kolik položek je poškozených?", + "toast": { + "success": "Vrácení bylo úspěšně přijato.", + "errorLargeValue": "Množství je větší než požadované množství položky.", + "errorNegativeValue": "Množství nemůže být záporné.", + "errorLargeDamagedValue": "Množství poškozených položek + množství nepoškozených přijatých položek přesahuje celkové množství položky na vrácení. Snižte množství nepoškozených položek." + } + }, + "toast": { + "canceledSuccessfully": "Vrácení bylo úspěšně zrušeno", + "confirmedSuccessfully": "Vrácení bylo úspěšně potvrzeno" + }, + "panel": { + "title": "Vrácení zahájeno", + "description": "Existuje otevřená žádost o vrácení, která musí být dokončena" + } + }, + "claims": { + "create": "Vytvořit reklamaci", + "confirm": "Potvrdit reklamaci", + "confirmText": "Chystáte se potvrdit reklamaci. Tuto akci nelze vrátit zpět.", + "manage": "Spravovat reklamaci", + "outbound": "Odchozí", + "outboundItemAdded": "{{itemsCount}}x přidáno prostřednictvím reklamace", + "outboundTotal": "Celková částka odchozí", + "outboundShipping": "Odchozí doprava", + "outboundShippingHint": "Vyberte, kterou metodu chcete použít.", + "refundAmount": "Odhadovaný rozdíl", + "activeChangeError": "Na této objednávce probíhá aktivní změna objednávky. Dokončete nebo zrušte předchozí změnu.", + "actions": { + "cancelClaim": { + "successToast": "Reklamace byla úspěšně zrušena." + } + }, + "cancel": { + "title": "Zrušit reklamaci", + "description": "Jste si jisti, že chcete zrušit reklamaci?" + }, + "tooltips": { + "onlyReturnShippingOptions": "Tento seznam bude obsahovat pouze možnosti vrácení dopravy." + }, + "toast": { + "canceledSuccessfully": "Reklamace byla úspěšně zrušena", + "confirmedSuccessfully": "Reklamace byla úspěšně potvrzena" + }, + "panel": { + "title": "Reklamace zahájena", + "description": "Existuje otevřená žádost o reklamaci, která musí být dokončena" + } + }, + "exchanges": { + "create": "Vytvořit výměnu", + "manage": "Spravovat výměnu", + "confirm": "Potvrdit výměnu", + "confirmText": "Chystáte se potvrdit výměnu. Tuto akci nelze vrátit zpět.", + "outbound": "Odchozí", + "outboundItemAdded": "{{itemsCount}}x přidáno prostřednictvím výměny", + "outboundTotal": "Celková částka odchozí", + "outboundShipping": "Odchozí doprava", + "outboundShippingHint": "Vyberte, kterou metodu chcete použít.", + "refundAmount": "Odhadovaný rozdíl", + "activeChangeError": "Na této objednávce probíhá aktivní změna objednávky. Dokončete nebo zrušte předchozí změnu.", + "actions": { + "cancelExchange": { + "successToast": "Výměna byla úspěšně zrušena." + } + }, + "cancel": { + "title": "Zrušit výměnu", + "description": "Jste si jisti, že chcete zrušit výměnu?" + }, + "tooltips": { + "onlyReturnShippingOptions": "Tento seznam bude obsahovat pouze možnosti vrácení dopravy." + }, + "toast": { + "canceledSuccessfully": "Výměna byla úspěšně zrušena", + "confirmedSuccessfully": "Výměna byla úspěšně potvrzena" + }, + "panel": { + "title": "Výměna zahájena", + "description": "Existuje otevřená žádost o výměnu, která musí být dokončena" + } + }, + "reservations": { + "allocatedLabel": "Přiděleno", + "notAllocatedLabel": "Nepřiděleno" + }, + "allocateItems": { + "action": "Přidělit položky", + "title": "Přidělit položky objednávky", + "locationDescription": "Vyberte, z které lokace chcete přidělit položky.", + "itemsToAllocate": "Položky k přidělení", + "itemsToAllocateDesc": "Vyberte počet položek, které chcete přidělit", + "search": "Hledat položky", + "consistsOf": "Skládá se z {{num}}x inventárních položek", + "requires": "Vyžaduje {{num}} na variantu", + "toast": { + "created": "Položky byly úspěšně přiděleny" + }, + "error": { + "quantityNotAllocated": "Existují nepřidělené položky." + } + }, + "shipment": { + "title": "Označit plnění jako odeslané", + "trackingNumber": "Sledovací číslo", + "addTracking": "Přidat sledovací číslo", + "sendNotification": "Odeslat oznámení", + "sendNotificationHint": "Oznámit zákazníkovi o této zásilce.", + "toastCreated": "Zásilka byla úspěšně vytvořena." + }, + "fulfillment": { + "cancelWarning": "Chystáte se zrušit plnění. Tuto akci nelze vrátit zpět.", + "markAsDeliveredWarning": "Chystáte se označit plnění jako doručené. Tuto akci nelze vrátit zpět.", + "unfulfilledItems": "Nesplněné položky", + "statusLabel": "Stav plnění", + "statusTitle": "Stav plnění", + "fulfillItems": "Splnit položky", + "awaitingFulfillmentBadge": "Čeká se na plnění", + "requiresShipping": "Vyžaduje dopravu", + "number": "Plnění #{{number}}", + "itemsToFulfill": "Položky k plnění", + "create": "Vytvořit plnění", + "available": "Dostupné", + "inStock": "Na skladě", + "markAsShipped": "Označit jako odeslané", + "markAsDelivered": "Označit jako doručené", + "itemsToFulfillDesc": "Vyberte položky a množství k plnění", + "locationDescription": "Vyberte, z které lokace chcete plnit položky.", + "sendNotificationHint": "Oznámit zákazníkům o vytvořeném plnění.", + "methodDescription": "Vyberte jinou metodu dopravy než tu, kterou zákazník vybral", + "error": { + "wrongQuantity": "K dispozici je pouze jedna položka k plnění", + "wrongQuantity_other": "Množství by mělo být číslo mezi 1 a {{number}}", + "noItems": "Žádné položky k plnění." + }, + "status": { + "notFulfilled": "Nesplněno", + "partiallyFulfilled": "Částečně splněno", + "fulfilled": "Splněno", + "partiallyShipped": "Částečně odesláno", + "shipped": "Odesláno", + "delivered": "Doručeno", + "partiallyDelivered": "Částečně doručeno", + "partiallyReturned": "Částečně vráceno", + "returned": "Vráceno", + "canceled": "Zrušeno", + "requiresAction": "Vyžaduje akci" + }, + "toast": { + "created": "Plnění bylo úspěšně vytvořeno", + "canceled": "Plnění bylo úspěšně zrušeno", + "fulfillmentShipped": "Nelze zrušit již odeslané plnění", + "fulfillmentDelivered": "Plnění bylo úspěšně označeno jako doručené" + }, + "trackingLabel": "Sledování", + "shippingFromLabel": "Doprava z", + "itemsLabel": "Položky" + }, + "refund": { + "title": "Vytvořit vrácení peněz", + "sendNotificationHint": "Oznámit zákazníkům o vytvořeném vrácení peněz.", + "systemPayment": "Systémová platba", + "systemPaymentDesc": "Jedna nebo více vašich plateb je systémová platba. Upozorňujeme, že zachycení a vrácení peněz nejsou zpracovávány Medusou pro takové platby.", + "error": { + "amountToLarge": "Nelze vrátit více než původní částku objednávky.", + "amountNegative": "Částka k vrácení musí být kladné číslo.", + "reasonRequired": "Prosím vyberte důvod vrácení peněz." + } + }, + "customer": { + "contactLabel": "Kontakt", + "editEmail": "Upravit e-mail", + "transferOwnership": "Převod vlastnictví", + "editBillingAddress": "Upravit fakturační adresu", + "editShippingAddress": "Upravit doručovací adresu" + }, + "activity": { + "header": "Aktivita", + "showMoreActivities_one": "Zobrazit {{count}} další aktivitu", + "showMoreActivities_other": "Zobrazit {{count}} dalších aktivit", + "comment": { + "label": "Komentář", + "placeholder": "Zanechat komentář", + "addButtonText": "Přidat komentář", + "deleteButtonText": "Smazat komentář" + }, + "from": "Od", + "to": "Do", + "events": { + "common": { + "toReturn": "K vrácení", + "toSend": "K odeslání" + }, + "placed": { + "title": "Objednávka zadána", + "fromSalesChannel": "z {{salesChannel}}" + }, + "canceled": { + "title": "Objednávka zrušena" + }, + "payment": { + "awaiting": "Čeká se na platbu", + "captured": "Platba zachycena", + "canceled": "Platba zrušena", + "refunded": "Platba vrácena" + }, + "fulfillment": { + "created": "Položky splněny", + "canceled": "Plnění zrušeno", + "shipped": "Položky odeslány", + "delivered": "Položky doručeny", + "items_one": "{{count}} položka", + "items_other": "{{count}} položek" + }, + "return": { + "created": "Vrácení #{{returnId}} požadováno", + "canceled": "Vrácení #{{returnId}} zrušeno", + "received": "Vrácení #{{returnId}} přijato", + "items_one": "{{count}} položka vrácena", + "items_other": "{{count}} položek vráceno" + }, + "note": { + "comment": "Komentář", + "byLine": "od {{author}}" + }, + "claim": { + "created": "Reklamace #{{claimId}} požadována", + "canceled": "Reklamace #{{claimId}} zrušena", + "itemsInbound": "{{count}} položka k vrácení", + "itemsOutbound": "{{count}} položka k odeslání" + }, + "exchange": { + "created": "Výměna #{{exchangeId}} požadována", + "canceled": "Výměna #{{exchangeId}} zrušena", + "itemsInbound": "{{count}} položka k vrácení", + "itemsOutbound": "{{count}} položka k odeslání" + }, + "edit": { + "requested": "Úprava objednávky #{{editId}} požadována", + "confirmed": "Úprava objednávky #{{editId}} potvrzena" + }, + "transfer": { + "requested": "Převod objednávky #{{transferId}} požadován", + "confirmed": "Převod objednávky #{{transferId}} potvrzen", + "declined": "Převod objednávky #{{transferId}} odmítnut" + }, + "update_order": { + "shipping_address": "Doručovací adresa aktualizována", + "billing_address": "Fakturační adresa aktualizována", + "email": "E-mail aktualizován" + } + } + }, + "fields": { + "displayId": "Zobrazit ID", + "refundableAmount": "Částka k vrácení", + "returnableQuantity": "Množství k vrácení" + } + }, + "draftOrders": { + "domain": "Koncepty objednávek", + "deleteWarning": "Chystáte se smazat koncept objednávky {{id}}. Tuto akci nelze vrátit zpět.", + "paymentLinkLabel": "Odkaz na platbu", + "cartIdLabel": "ID košíku", + "markAsPaid": { + "label": "Označit jako zaplaceno", + "warningTitle": "Označit jako zaplaceno", + "warningDescription": "Chystáte se označit koncept objednávky jako zaplacený. Tuto akci nelze vrátit zpět a později nebude možné vybrat platbu." + }, + "status": { + "open": "Otevřeno", + "completed": "Dokončeno" + }, + "create": { + "createDraftOrder": "Vytvořit koncept objednávky", + "createDraftOrderHint": "Vytvořte nový koncept objednávky pro správu detailů objednávky před jejím zadáním.", + "chooseRegionHint": "Vyberte region", + "existingItemsLabel": "Existující položky", + "existingItemsHint": "Přidat existující produkty do konceptu objednávky.", + "customItemsLabel": "Vlastní položky", + "customItemsHint": "Přidat vlastní položky do konceptu objednávky.", + "addExistingItemsAction": "Přidat existující položky", + "addCustomItemAction": "Přidat vlastní položku", + "noCustomItemsAddedLabel": "Zatím nebyly přidány žádné vlastní položky", + "noExistingItemsAddedLabel": "Zatím nebyly přidány žádné existující položky", + "chooseRegionTooltip": "Nejprve vyberte region", + "useExistingCustomerLabel": "Použít existujícího zákazníka", + "addShippingMethodsAction": "Přidat metody dopravy", + "unitPriceOverrideLabel": "Přepsat jednotkovou cenu", + "shippingOptionLabel": "Možnost dopravy", + "shippingOptionHint": "Vyberte možnost dopravy pro koncept objednávky.", + "shippingPriceOverrideLabel": "Přepsat cenu dopravy", + "shippingPriceOverrideHint": "Přepsat cenu dopravy pro koncept objednávky.", + "sendNotificationLabel": "Odeslat oznámení", + "sendNotificationHint": "Odeslat oznámení zákazníkovi při vytvoření konceptu objednávky." + }, + "validation": { + "requiredEmailOrCustomer": "E-mail nebo zákazník je povinný.", + "requiredItems": "Je vyžadována alespoň jedna položka.", + "invalidEmail": "E-mail musí být platná e-mailová adresa." + } + }, + "stockLocations": { + "domain": "Lokace & Doprava", + "list": { + "description": "Spravujte skladové lokace a možnosti dopravy vašeho obchodu." + }, + "create": { + "header": "Vytvořit skladovou lokaci", + "hint": "Skladová lokace je fyzické místo, kde jsou produkty skladovány a odesílány.", + "successToast": "Lokace {{name}} byla úspěšně vytvořena." + }, + "edit": { + "header": "Upravit skladovou lokaci", + "viewInventory": "Zobrazit inventář", + "successToast": "Lokace {{name}} byla úspěšně aktualizována." + }, + "delete": { + "confirmation": "Chystáte se smazat skladovou lokaci {{name}}. Tuto akci nelze vrátit zpět." + }, + "fulfillmentProviders": { + "header": "Poskytovatelé plnění", + "shippingOptionsTooltip": "Tento rozbalovací seznam bude obsahovat pouze poskytovatele povolené pro tuto lokaci. Přidejte je do lokace, pokud je rozbalovací seznam zakázán.", + "label": "Připojení poskytovatelé plnění", + "connectedTo": "Připojeno k {{count}} z {{total}} poskytovatelů plnění", + "noProviders": "Tato skladová lokace není připojena k žádným poskytovatelům plnění.", + "action": "Připojit poskytovatele", + "successToast": "Poskytovatelé plnění pro skladovou lokaci byli úspěšně aktualizováni." + }, + "fulfillmentSets": { + "pickup": { + "header": "Vyzdvihnutí" + }, + "shipping": { + "header": "Doprava" + }, + "disable": { + "confirmation": "Jste si jisti, že chcete zakázat {{name}}? Tímto budou smazány všechny přidružené zóny služeb a možnosti dopravy a tuto akci nelze vrátit zpět.", + "pickup": "Vyzdvihnutí bylo úspěšně zakázáno.", + "shipping": "Doprava byla úspěšně zakázána." + }, + "enable": { + "pickup": "Vyzdvihnutí bylo úspěšně povoleno.", + "shipping": "Doprava byla úspěšně povolena." + } + }, + "sidebar": { + "header": "Konfigurace dopravy", + "shippingProfiles": { + "label": "Profily dopravy", + "description": "Skupinové produkty podle požadavků na dopravu" + } + }, + "salesChannels": { + "header": "Prodejní kanály", + "label": "Připojené prodejní kanály", + "connectedTo": "Připojeno k {{count}} z {{total}} prodejních kanálů", + "noChannels": "Lokace není připojena k žádným prodejním kanálům.", + "action": "Připojit prodejní kanály", + "successToast": "Prodejní kanály byly úspěšně aktualizovány." + }, + "shippingOptions": { + "create": { + "shipping": { + "header": "Vytvořit možnost dopravy pro {{zone}}", + "hint": "Vytvořte novou možnost dopravy pro definování způsobu dopravy produktů z této lokace.", + "label": "Možnosti dopravy", + "successToast": "Možnost dopravy {{name}} byla úspěšně vytvořena." + }, + "returns": { + "header": "Vytvořit možnost vrácení pro {{zone}}", + "hint": "Vytvořte novou možnost vrácení pro definování způsobu vrácení produktů do této lokace.", + "label": "Možnosti vrácení", + "successToast": "Možnost vrácení {{name}} byla úspěšně vytvořena." + }, + "tabs": { + "details": "Detaily", + "prices": "Ceny" + }, + "action": "Vytvořit možnost" + }, + "delete": { + "confirmation": "Chystáte se smazat možnost dopravy {{name}}. Tuto akci nelze vrátit zpět.", + "successToast": "Možnost dopravy {{name}} byla úspěšně smazána." + }, + "edit": { + "header": "Upravit možnost dopravy", + "action": "Upravit možnost", + "successToast": "Možnost dopravy {{name}} byla úspěšně aktualizována." + }, + "pricing": { + "action": "Upravit ceny" + }, + "conditionalPrices": { + "header": "Podmíněné ceny pro {{name}}", + "description": "Spravujte podmíněné ceny pro tuto možnost dopravy na základě celkové částky položek v košíku.", + "attributes": { + "cartItemTotal": "Celková částka položek v košíku" + }, + "summaries": { + "range": "Pokud <0>{{attribute}} je mezi <1>{{gte}} a <2>{{lte}}", + "greaterThan": "Pokud <0>{{attribute}} ≥ <1>{{gte}}", + "lessThan": "Pokud <0>{{attribute}} ≤ <1>{{lte}}" + }, + "actions": { + "addPrice": "Přidat cenu", + "manageConditionalPrices": "Spravovat podmíněné ceny" + }, + "rules": { + "amount": "Cena možnosti dopravy", + "gte": "Minimální celková částka položek v košíku", + "lte": "Maximální celková částka položek v košíku" + }, + "customRules": { + "label": "Vlastní pravidla", + "tooltip": "Tato podmíněná cena má pravidla, která nelze spravovat v dashboardu.", + "eq": "Celková částka položek v košíku musí být rovna", + "gt": "Celková částka položek v košíku musí být větší než", + "lt": "Celková částka položek v košíku musí být menší než" + }, + "errors": { + "amountRequired": "Cena možnosti dopravy je povinná", + "minOrMaxRequired": "Musí být poskytnuta alespoň jedna z minimální nebo maximální celkové částky položek v košíku", + "minGreaterThanMax": "Minimální celková částka položek v košíku musí být menší nebo rovna maximální celkové částce položek v košíku", + "duplicateAmount": "Cena možnosti dopravy musí být jedinečná pro každou podmínku", + "overlappingConditions": "Podmínky musí být jedinečné pro všechna pravidla cen" + } + }, + "fields": { + "count": { + "shipping_one": "{{count}} možnost dopravy", + "shipping_other": "{{count}} možnosti dopravy", + "returns_one": "{{count}} možnost vrácení", + "returns_other": "{{count}} možnosti vrácení" + }, + "priceType": { + "label": "Typ ceny", + "options": { + "fixed": { + "label": "Pevná", + "hint": "Cena možnosti dopravy je pevná a nemění se na základě obsahu objednávky." + }, + "calculated": { + "label": "Vypočítaná", + "hint": "Cena možnosti dopravy je vypočítána poskytovatelem plnění během pokladny." + } + } + }, + "enableInStore": { + "label": "Povolit v obchodě", + "hint": "Zda zákazníci mohou použít tuto možnost během pokladny." + }, + "provider": "Poskytovatel plnění", + "profile": "Profil dopravy", + "fulfillmentOption": "Možnost plnění" + } + }, + "serviceZones": { + "create": { + "headerPickup": "Vytvořit zónu služeb pro vyzdvihnutí z {{location}}", + "headerShipping": "Vytvořit zónu služeb pro dopravu z {{location}}", + "action": "Vytvořit zónu služeb", + "successToast": "Zóna služeb {{name}} byla úspěšně vytvořena." + }, + "edit": { + "header": "Upravit zónu služeb", + "successToast": "Zóna služeb {{name}} byla úspěšně aktualizována." + }, + "delete": { + "confirmation": "Chystáte se smazat zónu služeb {{name}}. Tuto akci nelze vrátit zpět.", + "successToast": "Zóna služeb {{name}} byla úspěšně smazána." + }, + "manageAreas": { + "header": "Spravovat oblasti pro {{name}}", + "action": "Spravovat oblasti", + "label": "Oblasti", + "hint": "Vyberte geografické oblasti, které zóna služeb pokrývá.", + "successToast": "Oblasti pro {{name}} byly úspěšně aktualizovány." + }, + "fields": { + "noRecords": "Nejsou žádné zóny služeb, do kterých by bylo možné přidat možnosti dopravy.", + "tip": "Zóna služeb je sbírka geografických zón nebo oblastí. Používá se k omezení dostupných možností dopravy na definovanou sadu lokací." + } + } + }, + "shippingProfile": { + "domain": "Profily dopravy", + "subtitle": "Skupinové produkty s podobnými požadavky na dopravu do profilů.", + "create": { + "header": "Vytvořit profil dopravy", + "hint": "Vytvořte nový profil dopravy pro skupinové produkty s podobnými požadavky na dopravu.", + "successToast": "Profil dopravy {{name}} byl úspěšně vytvořen." + }, + "delete": { + "title": "Smazat profil dopravy", + "description": "Chystáte se smazat profil dopravy {{name}}. Tuto akci nelze vrátit zpět.", + "successToast": "Profil dopravy {{name}} byl úspěšně smazán." + }, + "tooltip": { + "type": "Zadejte typ profilu dopravy, například: Těžký, Nadrozměrný, Pouze nákladní doprava atd." + } + }, + "taxRegions": { + "domain": "Daňové regiony", + "list": { + "hint": "Spravujte, co účtujete svým zákazníkům, když nakupují z různých zemí a regionů." + }, + "delete": { + "confirmation": "Chystáte se smazat daňový region. Tuto akci nelze vrátit zpět.", + "successToast": "Daňový region byl úspěšně smazán." + }, + "create": { + "header": "Vytvořit daňový region", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní zemi.", + "errors": { + "rateIsRequired": "Daňová sazba je povinná při vytváření výchozí daňové sazby.", + "nameIsRequired": "Název je povinný při vytváření výchozí daňové sazby." + }, + "successToast": "Daňový region byl úspěšně vytvořen." + }, + "province": { + "header": "Provincie", + "create": { + "header": "Vytvořit daňový region provincie", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní provincii." + } + }, + "state": { + "header": "Státy", + "create": { + "header": "Vytvořit daňový region státu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní stát." + } + }, + "stateOrTerritory": { + "header": "Státy nebo teritoria", + "create": { + "header": "Vytvořit daňový region státu/teritoria", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní stát/teritorium." + } + }, + "county": { + "header": "Okresy", + "create": { + "header": "Vytvořit daňový region okresu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní okres." + } + }, + "region": { + "header": "Regiony", + "create": { + "header": "Vytvořit daňový region regionu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní region." + } + }, + "department": { + "header": "Oddělení", + "create": { + "header": "Vytvořit daňový region oddělení", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní oddělení." + } + }, + "territory": { + "header": "Teritoria", + "create": { + "header": "Vytvořit daňový region teritoria", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní teritorium." + } + }, + "prefecture": { + "header": "Prefektury", + "create": { + "header": "Vytvořit daňový region prefektury", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní prefekturu." + } + }, + "district": { + "header": "Okresy", + "create": { + "header": "Vytvořit daňový region okresu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní okres." + } + }, + "governorate": { + "header": "Guvernoráty", + "create": { + "header": "Vytvořit daňový region guvernorátu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní guvernorát." + } + }, + "canton": { + "header": "Kantony", + "create": { + "header": "Vytvořit daňový region kantonu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní kanton." + } + }, + "emirate": { + "header": "Emiráty", + "create": { + "header": "Vytvořit daňový region emirátu", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní emirát." + } + }, + "sublevel": { + "header": "Podúrovně", + "create": { + "header": "Vytvořit daňový region podúrovně", + "hint": "Vytvořte nový daňový region pro definování daňových sazeb pro konkrétní podúroveň." + } + }, + "taxOverrides": { + "header": "Přepsání", + "create": { + "header": "Vytvořit přepsání", + "hint": "Vytvořte daňovou sazbu, která přepíše výchozí daňové sazby pro vybrané podmínky." + }, + "edit": { + "header": "Upravit přepsání", + "hint": "Upravte daňovou sazbu, která přepíše výchozí daňové sazby pro vybrané podmínky." + } + }, + "taxRates": { + "create": { + "header": "Vytvořit daňovou sazbu", + "hint": "Vytvořte novou daňovou sazbu pro definování daňové sazby pro region.", + "successToast": "Daňová sazba byla úspěšně vytvořena." + }, + "edit": { + "header": "Upravit daňovou sazbu", + "hint": "Upravte daňovou sazbu pro definování daňové sazby pro region.", + "successToast": "Daňová sazba byla úspěšně aktualizována." + }, + "delete": { + "confirmation": "Chystáte se smazat daňovou sazbu {{name}}. Tuto akci nelze vrátit zpět.", + "successToast": "Daňová sazba byla úspěšně smazána." + } + }, + "fields": { + "isCombinable": { + "label": "Kombinovatelné", + "hint": "Zda lze tuto daňovou sazbu kombinovat s výchozí sazbou z daňového regionu.", + "true": "Kombinovatelné", + "false": "Nekombinovatelné" + }, + "defaultTaxRate": { + "label": "Výchozí daňová sazba", + "tooltip": "Výchozí daňová sazba pro tento region. Příkladem je standardní sazba DPH pro zemi nebo region.", + "action": "Vytvořit výchozí daňovou sazbu" + }, + "taxRate": "Daňová sazba", + "taxCode": "Daňový kód", + "targets": { + "label": "Cíle", + "hint": "Vyberte cíle, na které se tato daňová sazba bude vztahovat.", + "options": { + "product": "Produkty", + "productCollection": "Kolekce produktů", + "productTag": "Štítky produktů", + "productType": "Typy produktů", + "customerGroup": "Skupiny zákazníků" + }, + "operators": { + "in": "v", + "on": "na", + "and": "a" + }, + "placeholders": { + "product": "Hledat produkty", + "productCollection": "Hledat kolekce produktů", + "productTag": "Hledat štítky produktů", + "productType": "Hledat typy produktů", + "customerGroup": "Hledat skupiny zákazníků" + }, + "tags": { + "product": "Produkt", + "productCollection": "Kolekce produktů", + "productTag": "Štítek produktu", + "productType": "Typ produktu", + "customerGroup": "Skupina zákazníků" + }, + "modal": { + "header": "Přidat cíle" + }, + "values_one": "{{count}} hodnota", + "values_other": "{{count}} hodnot", + "numberOfTargets_one": "{{count}} cíl", + "numberOfTargets_other": "{{count}} cílů", + "additionalValues_one": "a {{count}} další hodnota", + "additionalValues_other": "a {{count}} dalších hodnot", + "action": "Přidat cíl" + }, + "sublevels": { + "labels": { + "province": "Provincie", + "state": "Stát", + "region": "Region", + "stateOrTerritory": "Stát/Teritorium", + "department": "Oddělení", + "county": "Okres", + "territory": "Teritorium", + "prefecture": "Prefektura", + "district": "Okres", + "governorate": "Guvernorát", + "emirate": "Emirát", + "canton": "Kanton", + "sublevel": "Kód podúrovně" + }, + "placeholders": { + "province": "Vyberte provincii", + "state": "Vyberte stát", + "region": "Vyberte region", + "stateOrTerritory": "Vyberte stát/teritorium", + "department": "Vyberte oddělení", + "county": "Vyberte okres", + "territory": "Vyberte teritorium", + "prefecture": "Vyberte prefekturu", + "district": "Vyberte okres", + "governorate": "Vyberte guvernorát", + "emirate": "Vyberte emirát", + "canton": "Vyberte kanton" + }, + "tooltips": { + "sublevel": "Zadejte kód ISO 3166-2 pro daňový region podúrovně.", + "notPartOfCountry": "{{province}} se nezdá být součástí {{country}}. Prosím zkontrolujte, zda je to správné." + }, + "alert": { + "header": "Podúrovně regionů jsou pro tento daňový region zakázány", + "description": "Podúrovně regionů jsou pro tento region ve výchozím nastavení zakázány. Můžete je povolit pro vytvoření podúrovní regionů, jako jsou provincie, státy nebo teritoria.", + "action": "Povolit podúrovně regionů" + } + }, + "noDefaultRate": { + "label": "Žádná výchozí sazba", + "tooltip": "Tento daňový region nemá výchozí daňovou sazbu. Pokud existuje standardní sazba, jako je DPH země, přidejte ji do tohoto regionu." + } + } + }, + "promotions": { + "domain": "Propagace", + "sections": { + "details": "Detaily propagace" + }, + "tabs": { + "template": "Typ", + "details": "Detaily", + "campaign": "Kampaň" + }, + "fields": { + "type": "Typ", + "value_type": "Typ hodnoty", + "value": "Hodnota", + "campaign": "Kampaň", + "method": "Metoda", + "allocation": "Přidělení", + "addCondition": "Přidat podmínku", + "clearAll": "Vymazat vše", + "amount": { + "tooltip": "Vyberte kód měny pro povolení nastavení částky" + }, + "conditions": { + "rules": { + "title": "Kdo může použít tento kód?", + "description": "Který zákazník může použít propagační kód? Propagační kód může být použit všemi zákazníky, pokud zůstane nedotčen." + }, + "target-rules": { + "title": "Na které položky bude propagace aplikována?", + "description": "Propagace bude aplikována na položky, které odpovídají následujícím podmínkám." + }, + "buy-rules": { + "title": "Co musí být v košíku, aby se propagace odemkla?", + "description": "Pokud tyto podmínky odpovídají, povolíme propagaci na cílové položky." + } + } + }, + "tooltips": { + "campaignType": "Kód měny musí být vybrán v propagaci pro nastavení rozpočtu výdajů." + }, + "errors": { + "requiredField": "Povinné pole", + "promotionTabError": "Opravte chyby v záložce Propagace před pokračováním" + }, + "toasts": { + "promotionCreateSuccess": "Propagace ({{code}}) byla úspěšně vytvořena." + }, + "create": {}, + "edit": { + "title": "Upravit detaily propagace", + "rules": { + "title": "Upravit podmínky použití" + }, + "target-rules": { + "title": "Upravit podmínky položek" + }, + "buy-rules": { + "title": "Upravit pravidla nákupu" + } + }, + "campaign": { + "header": "Kampaň", + "edit": { + "header": "Upravit kampaň", + "successToast": "Kampaň propagace byla úspěšně aktualizována." + }, + "actions": { + "goToCampaign": "Přejít na kampaň" + } + }, + "campaign_currency": { + "tooltip": "Toto je měna propagace. Změňte ji na záložce Detaily." + }, + "form": { + "required": "Povinné", + "and": "A", + "selectAttribute": "Vyberte atribut", + "campaign": { + "existing": { + "title": "Existující kampaň", + "description": "Přidat propagaci do existující kampaně.", + "placeholder": { + "title": "Žádné existující kampaně", + "desc": "Můžete vytvořit jednu pro sledování více propagací a nastavení limitů rozpočtu." + } + }, + "new": { + "title": "Nová kampaň", + "description": "Vytvořit novou kampaň pro tuto propagaci." + }, + "none": { + "title": "Bez kampaně", + "description": "Pokračovat bez přiřazení propagace ke kampani" + } + }, + "status": { + "label": "Stav", + "draft": { + "title": "Koncept", + "description": "Zákazníci nebudou moci použít kód zatím" + }, + "active": { + "title": "Aktivní", + "description": "Zákazníci budou moci použít kód" + }, + "inactive": { + "title": "Neaktivní", + "description": "Zákazníci již nebudou moci použít kód" + } + }, + "method": { + "label": "Metoda", + "code": { + "title": "Propagační kód", + "description": "Zákazníci musí zadat tento kód při pokladně" + }, + "automatic": { + "title": "Automatické", + "description": "Zákazníci uvidí tuto propagaci při pokladně" + } + }, + "max_quantity": { + "title": "Maximální množství", + "description": "Maximální množství položek, na které se tato propagace vztahuje." + }, + "type": { + "standard": { + "title": "Standardní", + "description": "Standardní propagace" + }, + "buyget": { + "title": "Koupit získat", + "description": "Koupit X získat Y propagace" + } + }, + "allocation": { + "each": { + "title": "Každý", + "description": "Aplikuje hodnotu na každou položku" + }, + "across": { + "title": "Napříč", + "description": "Aplikuje hodnotu napříč položkami" + } + }, + "code": { + "title": "Kód", + "description": "Kód, který vaši zákazníci zadají při pokladně." + }, + "value": { + "title": "Hodnota propagace" + }, + "value_type": { + "fixed": { + "title": "Hodnota propagace", + "description": "Částka, která bude odečtena. např. 100" + }, + "percentage": { + "title": "Hodnota propagace", + "description": "Procento, které bude odečteno z částky. např. 8%" + } + } + }, + "deleteWarning": "Chystáte se smazat propagaci {{code}}. Tuto akci nelze vrátit zpět.", + "createPromotionTitle": "Vytvořit propagaci", + "type": "Typ propagace", + "conditions": { + "add": "Přidat podmínku", + "list": { + "noRecordsMessage": "Přidejte podmínku pro omezení toho, na které položky se propagace vztahuje." + } + } + }, + "campaigns": { + "domain": "Kampaně", + "details": "Detaily kampaně", + "status": { + "active": "Aktivní", + "expired": "Vypršelo", + "scheduled": "Naplánováno" + }, + "delete": { + "title": "Jste si jisti?", + "description": "Chystáte se smazat kampaň '{{name}}'. Tuto akci nelze vrátit zpět.", + "successToast": "Kampaň '{{name}}' byla úspěšně vytvořena." + }, + "edit": { + "header": "Upravit kampaň", + "description": "Upravit detaily kampaně.", + "successToast": "Kampaň '{{name}}' byla úspěšně aktualizována." + }, + "configuration": { + "header": "Konfigurace", + "edit": { + "header": "Upravit konfiguraci kampaně", + "description": "Upravit konfiguraci kampaně.", + "successToast": "Konfigurace kampaně byla úspěšně aktualizována." + } + }, + "create": { + "title": "Vytvořit kampaň", + "description": "Vytvořit propagační kampaň.", + "hint": "Vytvořit propagační kampaň.", + "header": "Vytvořit kampaň", + "successToast": "Kampaň '{{name}}' byla úspěšně vytvořena." + }, + "fields": { + "name": "Název", + "identifier": "Identifikátor", + "start_date": "Datum začátku", + "end_date": "Datum konce", + "total_spend": "Utracený rozpočet", + "total_used": "Použitý rozpočet", + "budget_limit": "Limit rozpočtu", + "campaign_id": { + "hint": "Pouze kampaně se stejným kódem měny jako propagace jsou zobrazeny v tomto seznamu." + } + }, + "budget": { + "create": { + "hint": "Vytvořit rozpočet pro kampaň.", + "header": "Rozpočet kampaně" + }, + "details": "Rozpočet kampaně", + "fields": { + "type": "Typ", + "currency": "Měna", + "limit": "Limit", + "used": "Použito" + }, + "type": { + "spend": { + "title": "Utratit", + "description": "Nastavit limit na celkovou slevu všech použití propagace." + }, + "usage": { + "title": "Použití", + "description": "Nastavit limit na počet použití propagace." + } + }, + "edit": { + "header": "Upravit rozpočet kampaně" + } + }, + "promotions": { + "remove": { + "title": "Odstranit propagaci z kampaně", + "description": "Chystáte se odstranit {{count}} propagaci z kampaně. Tuto akci nelze vrátit zpět." + }, + "alreadyAdded": "Tato propagace již byla přidána do kampaně.", + "alreadyAddedDiffCampaign": "Tato propagace již byla přidána do jiné kampaně ({{name}}).", + "currencyMismatch": "Měna propagace a kampaně se neshoduje", + "toast": { + "success": "Úspěšně přidáno {{count}} propagací do kampaně" + }, + "add": { + "list": { + "noRecordsMessage": "Nejprve vytvořte propagaci." + } + }, + "list": { + "noRecordsMessage": "V kampani nejsou žádné propagace." + } + }, + "deleteCampaignWarning": "Chystáte se smazat kampaň {{name}}. Tuto akci nelze vrátit zpět.", + "totalSpend": "<0>{{amount}} <1>{{currency}}" + }, + "priceLists": { + "domain": "Ceníky", + "subtitle": "Vytvořte prodeje nebo přepište ceny pro specifické podmínky.", + "delete": { + "confirmation": "Chystáte se smazat ceník {{title}}. Tuto akci nelze vrátit zpět.", + "successToast": "Ceník {{title}} byl úspěšně smazán." + }, + "create": { + "header": "Vytvořit ceník", + "subheader": "Vytvořte nový ceník pro správu cen vašich produktů.", + "tabs": { + "details": "Detaily", + "products": "Produkty", + "prices": "Ceny" + }, + "successToast": "Ceník {{title}} byl úspěšně vytvořen.", + "products": { + "list": { + "noRecordsMessage": "Nejprve vytvořte produkt." + } + } + }, + "edit": { + "header": "Upravit ceník", + "successToast": "Ceník {{title}} byl úspěšně aktualizován." + }, + "configuration": { + "header": "Konfigurace", + "edit": { + "header": "Upravit konfiguraci ceníku", + "description": "Upravit konfiguraci ceníku.", + "successToast": "Konfigurace ceníku byla úspěšně aktualizována." + } + }, + "products": { + "header": "Produkty", + "actions": { + "addProducts": "Přidat produkty", + "editPrices": "Upravit ceny" + }, + "delete": { + "confirmation_one": "Chystáte se smazat ceny pro {{count}} produkt v ceníku. Tuto akci nelze vrátit zpět.", + "confirmation_other": "Chystáte se smazat ceny pro {{count}} produktů v ceníku. Tuto akci nelze vrátit zpět.", + "successToast_one": "Úspěšně smazány ceny pro {{count}} produkt.", + "successToast_other": "Úspěšně smazány ceny pro {{count}} produktů." + }, + "add": { + "successToast": "Ceny byly úspěšně přidány do ceníku." + }, + "edit": { + "successToast": "Ceny byly úspěšně aktualizovány." + } + }, + "fields": { + "priceOverrides": { + "label": "Přepsání cen", + "header": "Přepsání cen" + }, + "status": { + "label": "Stav", + "options": { + "active": "Aktivní", + "draft": "Koncept", + "expired": "Vypršelo", + "scheduled": "Naplánováno" + } + }, + "type": { + "label": "Typ", + "hint": "Vyberte typ ceníku, který chcete vytvořit.", + "options": { + "sale": { + "label": "Prodej", + "description": "Prodejní ceny jsou dočasné změny cen produktů." + }, + "override": { + "label": "Přepsání", + "description": "Přepsání se obvykle používají k vytvoření specifických cen pro zákazníky." + } + } + }, + "startsAt": { + "label": "Ceník má datum začátku?", + "hint": "Naplánujte ceník, aby se aktivoval v budoucnu." + }, + "endsAt": { + "label": "Ceník má datum vypršení?", + "hint": "Naplánujte ceník, aby se deaktivoval v budoucnu." + }, + "customerAvailability": { + "header": "Vyberte skupiny zákazníků", + "label": "Dostupnost pro zákazníky", + "hint": "Vyberte, které skupiny zákazníků by měly být ceníkem ovlivněny.", + "placeholder": "Hledat skupiny zákazníků", + "attribute": "Skupiny zákazníků" + } + } + }, + "profile": { + "domain": "Profil", + "manageYourProfileDetails": "Spravujte detaily svého profilu.", + "fields": { + "languageLabel": "Jazyk", + "usageInsightsLabel": "Přehledy používání" + }, + "edit": { + "header": "Upravit profil", + "languageHint": "Jazyk, který chcete používat v administrativním dashboardu. To nezmění jazyk vašeho obchodu.", + "languagePlaceholder": "Vyberte jazyk", + "usageInsightsHint": "Sdílejte přehledy používání a pomozte nám zlepšit Medusu. Více o tom, co shromažďujeme a jak to používáme, si můžete přečíst v naší <0>dokumentaci." + }, + "toast": { + "edit": "Změny profilu byly uloženy" + } + }, + "users": { + "domain": "Uživatelé", + "editUser": "Upravit uživatele", + "inviteUser": "Pozvat uživatele", + "inviteUserHint": "Pozvěte nového uživatele do vašeho obchodu.", + "sendInvite": "Odeslat pozvánku", + "pendingInvites": "Čekající pozvánky", + "deleteInviteWarning": "Chystáte se smazat pozvánku pro {{email}}. Tuto akci nelze vrátit zpět.", + "resendInvite": "Znovu odeslat pozvánku", + "copyInviteLink": "Zkopírovat odkaz na pozvánku", + "expiredOnDate": "Vypršelo dne {{date}}", + "validFromUntil": "Platné od <0>{{from}} - <1>{{until}}", + "acceptedOnDate": "Přijato dne {{date}}", + "inviteStatus": { + "accepted": "Přijato", + "pending": "Čeká se", + "expired": "Vypršelo" + }, + "roles": { + "admin": "Admin", + "developer": "Vývojář", + "member": "Člen" + }, + "list": { + "empty": { + "heading": "Žádní uživatelé nenalezeni", + "description": "Jakmile bude uživatel pozván, zobrazí se zde." + }, + "filtered": { + "heading": "Žádné výsledky", + "description": "Žádní uživatelé neodpovídají aktuálním kritériím filtru." + } + }, + "deleteUserWarning": "Chystáte se smazat uživatele {{name}}. Tuto akci nelze vrátit zpět.", + "deleteUserSuccess": "Uživatel {{name}} byl úspěšně smazán", + "invite": "Pozvat" + }, + "store": { + "domain": "Obchod", + "manageYourStoresDetails": "Spravujte detaily svého obchodu", + "editStore": "Upravit obchod", + "defaultCurrency": "Výchozí měna", + "defaultRegion": "Výchozí region", + "swapLinkTemplate": "Šablona odkazu na výměnu", + "paymentLinkTemplate": "Šablona odkazu na platbu", + "inviteLinkTemplate": "Šablona odkazu na pozvánku", + "currencies": "Měny", + "addCurrencies": "Přidat měny", + "enableTaxInclusivePricing": "Povolit ceny včetně daně", + "disableTaxInclusivePricing": "Zakázat ceny včetně daně", + "removeCurrencyWarning_one": "Chystáte se odstranit {{count}} měnu z vašeho obchodu. Ujistěte se, že jste odstranili všechny ceny používající tuto měnu před pokračováním.", + "removeCurrencyWarning_other": "Chystáte se odstranit {{count}} měn z vašeho obchodu. Ujistěte se, že jste odstranili všechny ceny používající tyto měny před pokračováním.", + "currencyAlreadyAdded": "Měna již byla přidána do vašeho obchodu.", + "edit": { + "header": "Upravit obchod" + }, + "toast": { + "update": "Obchod byl úspěšně aktualizován", + "currenciesUpdated": "Měny byly úspěšně aktualizovány", + "currenciesRemoved": "Měny byly úspěšně odstraněny z obchodu", + "updatedTaxInclusivitySuccessfully": "Ceny včetně daně byly úspěšně aktualizovány" + } + }, + "regions": { + "domain": "Regiony", + "subtitle": "Region je oblast, ve které prodáváte produkty. Může pokrývat více zemí a má různé daňové sazby, poskytovatele a měnu.", + "createRegion": "Vytvořit region", + "createRegionHint": "Spravujte daňové sazby a poskytovatele pro sadu zemí.", + "addCountries": "Přidat země", + "editRegion": "Upravit region", + "countriesHint": "Přidejte země zahrnuté v tomto regionu.", + "deleteRegionWarning": "Chystáte se smazat region {{name}}. Tuto akci nelze vrátit zpět.", + "removeCountriesWarning_one": "Chystáte se odstranit {{count}} zemi z regionu. Tuto akci nelze vrátit zpět.", + "removeCountriesWarning_other": "Chystáte se odstranit {{count}} zemí z regionu. Tuto akci nelze vrátit zpět.", + "removeCountryWarning": "Chystáte se odstranit zemi {{name}} z regionu. Tuto akci nelze vrátit zpět.", + "automaticTaxesHint": "Když je povoleno, daně budou vypočítány pouze při pokladně na základě doručovací adresy.", + "taxInclusiveHint": "Když je povoleno, ceny v regionu budou zahrnovat daň.", + "providersHint": "Přidejte, které platební poskytovatele jsou dostupné v tomto regionu.", + "shippingOptions": "Možnosti dopravy", + "deleteShippingOptionWarning": "Chystáte se smazat možnost dopravy {{name}}. Tuto akci nelze vrátit zpět.", + "return": "Vrácení", + "outbound": "Odchozí", + "priceType": "Typ ceny", + "flatRate": "Pevná sazba", + "calculated": "Vypočítaná", + "list": { + "noRecordsMessage": "Vytvořte region pro oblasti, ve kterých prodáváte." + }, + "toast": { + "delete": "Region byl úspěšně smazán", + "edit": "Úprava regionu byla uložena", + "create": "Region byl úspěšně vytvořen", + "countries": "Země regionu byly úspěšně aktualizovány" + }, + "shippingOption": { + "createShippingOption": "Vytvořit možnost dopravy", + "createShippingOptionHint": "Vytvořte novou možnost dopravy pro region.", + "editShippingOption": "Upravit možnost dopravy", + "fulfillmentMethod": "Metoda plnění", + "type": { + "outbound": "Odchozí", + "outboundHint": "Použijte to, pokud vytváříte možnost dopravy pro odesílání produktů zákazníkovi.", + "return": "Vrácení", + "returnHint": "Použijte to, pokud vytváříte možnost dopravy pro vrácení produktů zákazníkem." + }, + "priceType": { + "label": "Typ ceny", + "flatRate": "Pevná sazba", + "calculated": "Vypočítaná" + }, + "availability": { + "adminOnly": "Pouze pro administrátory", + "adminOnlyHint": "Když je povoleno, možnost dopravy bude dostupná pouze v administrativním dashboardu, a ne v obchodě." + }, + "taxInclusiveHint": "Když je povoleno, cena možnosti dopravy bude zahrnovat daň.", + "requirements": { + "label": "Požadavky", + "hint": "Určete požadavky pro možnost dopravy." + } + } + }, + "taxes": { + "domain": "Daňové regiony", + "domainDescription": "Spravujte svůj daňový region", + "countries": { + "taxCountriesHint": "Daňová nastavení se vztahují na uvedené země." + }, + "settings": { + "editTaxSettings": "Upravit daňová nastavení", + "taxProviderLabel": "Poskytovatel daní", + "systemTaxProviderLabel": "Systémový poskytovatel daní", + "calculateTaxesAutomaticallyLabel": "Automaticky vypočítávat daně", + "calculateTaxesAutomaticallyHint": "Když je povoleno, daňové sazby budou automaticky vypočítány a aplikovány na košíky. Když je zakázáno, daně musí být ručně vypočítány při pokladně. Ruční daně jsou doporučeny pro použití s poskytovateli třetích stran.", + "applyTaxesOnGiftCardsLabel": "Aplikovat daně na dárkové karty", + "applyTaxesOnGiftCardsHint": "Když je povoleno, daně budou aplikovány na dárkové karty při pokladně. V některých zemích vyžadují daňové předpisy aplikaci daní na dárkové karty při nákupu.", + "defaultTaxRateLabel": "Výchozí daňová sazba", + "defaultTaxCodeLabel": "Výchozí daňový kód" + }, + "defaultRate": { + "sectionTitle": "Výchozí daňová sazba" + }, + "taxRate": { + "sectionTitle": "Daňové sazby", + "createTaxRate": "Vytvořit daňovou sazbu", + "createTaxRateHint": "Vytvořte novou daňovou sazbu pro region.", + "deleteRateDescription": "Chystáte se smazat daňovou sazbu {{name}}. Tuto akci nelze vrátit zpět.", + "editTaxRate": "Upravit daňovou sazbu", + "editRateAction": "Upravit sazbu", + "editOverridesAction": "Upravit přepsání", + "editOverridesTitle": "Upravit přepsání daňové sazby", + "editOverridesHint": "Určete přepsání pro daňovou sazbu.", + "deleteTaxRateWarning": "Chystáte se smazat daňovou sazbu {{name}}. Tuto akci nelze vrátit zpět.", + "productOverridesLabel": "Přepsání produktů", + "productOverridesHint": "Určete přepsání produktů pro daňovou sazbu.", + "addProductOverridesAction": "Přidat přepsání produktů", + "productTypeOverridesLabel": "Přepsání typů produktů", + "productTypeOverridesHint": "Určete přepsání typů produktů pro daňovou sazbu.", + "addProductTypeOverridesAction": "Přidat přepsání typů produktů", + "shippingOptionOverridesLabel": "Přepsání možností dopravy", + "shippingOptionOverridesHint": "Určete přepsání možností dopravy pro daňovou sazbu.", + "addShippingOptionOverridesAction": "Přidat přepsání možností dopravy", + "productOverridesHeader": "Produkty", + "productTypeOverridesHeader": "Typy produktů", + "shippingOptionOverridesHeader": "Možnosti dopravy" + } + }, + "locations": { + "domain": "Lokace", + "editLocation": "Upravit lokaci", + "addSalesChannels": "Přidat prodejní kanály", + "noLocationsFound": "Nebyly nalezeny žádné lokace", + "selectLocations": "Vyberte lokace, které skladují položku.", + "deleteLocationWarning": "Chystáte se smazat lokaci {{name}}. Tuto akci nelze vrátit zpět.", + "removeSalesChannelsWarning_one": "Chystáte se odstranit {{count}} prodejní kanál z lokace.", + "removeSalesChannelsWarning_other": "Chystáte se odstranit {{count}} prodejních kanálů z lokace.", + "toast": { + "create": "Lokace byla úspěšně vytvořena", + "update": "Lokace byla úspěšně aktualizována", + "removeChannel": "Prodejní kanál byl úspěšně odstraněn" + } + }, + "reservations": { + "domain": "Rezervace", + "subtitle": "Spravujte rezervované množství inventárních položek.", + "deleteWarning": "Chystáte se smazat rezervaci. Tuto akci nelze vrátit zpět." + }, + "salesChannels": { + "domain": "Prodejní kanály", + "subtitle": "Spravujte online a offline kanály, na kterých prodáváte produkty.", + "createSalesChannel": "Vytvořit prodejní kanál", + "createSalesChannelHint": "Vytvořte nový prodejní kanál pro prodej vašich produktů.", + "enabledHint": "Určete, zda je prodejní kanál povolen.", + "removeProductsWarning_one": "Chystáte se odstranit {{count}} produkt z {{sales_channel}}.", + "removeProductsWarning_other": "Chystáte se odstranit {{count}} produktů z {{sales_channel}}.", + "addProducts": "Přidat produkty", + "editSalesChannel": "Upravit prodejní kanál", + "productAlreadyAdded": "Produkt již byl přidán do prodejního kanálu.", + "deleteSalesChannelWarning": "Chystáte se smazat prodejní kanál {{name}}. Tuto akci nelze vrátit zpět.", + "toast": { + "create": "Prodejní kanál byl úspěšně vytvořen", + "update": "Prodejní kanál byl úspěšně aktualizován", + "delete": "Prodejní kanál byl úspěšně smazán" + }, + "tooltip": { + "cannotDeleteDefault": "Nelze smazat výchozí prodejní kanál" + }, + "products": { + "list": { + "noRecordsMessage": "V prodejním kanálu nejsou žádné produkty." + }, + "add": { + "list": { + "noRecordsMessage": "Nejprve vytvořte produkt." + } + } + } + }, + "apiKeyManagement": { + "domain": { + "publishable": "Publikovatelné API klíče", + "secret": "Tajné API klíče" + }, + "subtitle": { + "publishable": "Spravujte API klíče používané v obchodě pro omezení rozsahu požadavků na specifické prodejní kanály.", + "secret": "Spravujte API klíče používané k autentizaci administrativních uživatelů v administrativních aplikacích." + }, + "status": { + "active": "Aktivní", + "revoked": "Odvoláno" + }, + "type": { + "publishable": "Publikovatelné", + "secret": "Tajné" + }, + "create": { + "createPublishableHeader": "Vytvořit publikovatelný API klíč", + "createPublishableHint": "Vytvořte nový publikovatelný API klíč pro omezení rozsahu požadavků na specifické prodejní kanály.", + "createSecretHeader": "Vytvořit tajný API klíč", + "createSecretHint": "Vytvořte nový tajný API klíč pro přístup k Medusa API jako autentizovaný administrativní uživatel.", + "secretKeyCreatedHeader": "Tajný klíč byl vytvořen", + "secretKeyCreatedHint": "Váš nový tajný klíč byl vygenerován. Zkopírujte a bezpečně uložte nyní. Toto je jediný čas, kdy bude zobrazen.", + "copySecretTokenSuccess": "Tajný klíč byl zkopírován do schránky.", + "copySecretTokenFailure": "Nepodařilo se zkopírovat tajný klíč do schránky.", + "successToast": "API klíč byl úspěšně vytvořen." + }, + "edit": { + "header": "Upravit API klíč", + "description": "Upravit název API klíče.", + "successToast": "API klíč {{title}} byl úspěšně aktualizován." + }, + "salesChannels": { + "title": "Přidat prodejní kanály", + "description": "Přidat prodejní kanály, na které by měl být API klíč omezen.", + "successToast_one": "{{count}} prodejní kanál byl úspěšně přidán do API klíče.", + "successToast_other": "{{count}} prodejních kanálů bylo úspěšně přidáno do API klíče.", + "alreadyAddedTooltip": "Prodejní kanál již byl přidán do API klíče.", + "list": { + "noRecordsMessage": "V rozsahu publikovatelného API klíče nejsou žádné prodejní kanály." + } + }, + "delete": { + "warning": "Chystáte se smazat API klíč {{title}}. Tuto akci nelze vrátit zpět.", + "successToast": "API klíč {{title}} byl úspěšně smazán." + }, + "revoke": { + "warning": "Chystáte se odvolat API klíč {{title}}. Tuto akci nelze vrátit zpět.", + "successToast": "API klíč {{title}} byl úspěšně odvolán." + }, + "addSalesChannels": { + "list": { + "noRecordsMessage": "Nejprve vytvořte prodejní kanál." + } + }, + "removeSalesChannel": { + "warning": "Chystáte se odstranit prodejní kanál {{name}} z API klíče. Tuto akci nelze vrátit zpět.", + "warningBatch_one": "Chystáte se odstranit {{count}} prodejní kanál z API klíče. Tuto akci nelze vrátit zpět.", + "warningBatch_other": "Chystáte se odstranit {{count}} prodejních kanálů z API klíče. Tuto akci nelze vrátit zpět.", + "successToast": "Prodejní kanál byl úspěšně odstraněn z API klíče.", + "successToastBatch_one": "{{count}} prodejní kanál byl úspěšně odstraněn z API klíče.", + "successToastBatch_other": "{{count}} prodejních kanálů bylo úspěšně odstraněno z API klíče." + }, + "actions": { + "revoke": "Odvolat API klíč", + "copy": "Zkopírovat API klíč", + "copySuccessToast": "API klíč byl zkopírován do schránky." + }, + "table": { + "lastUsedAtHeader": "Poslední použití", + "createdAtHeader": "Odvoláno dne" + }, + "fields": { + "lastUsedAtLabel": "Poslední použití", + "revokedByLabel": "Odvoláno kým", + "revokedAtLabel": "Odvoláno dne", + "createdByLabel": "Vytvořeno kým" + } + }, + "returnReasons": { + "domain": "Důvody vrácení", + "subtitle": "Spravujte důvody pro vrácené položky.", + "calloutHint": "Spravujte důvody pro kategorizaci vrácení.", + "editReason": "Upravit důvod vrácení", + "create": { + "header": "Přidat důvod vrácení", + "subtitle": "Určete nejčastější důvody pro vrácení.", + "hint": "Vytvořte nový důvod vrácení pro kategorizaci vrácení.", + "successToast": "Důvod vrácení {{label}} byl úspěšně vytvořen." + }, + "edit": { + "header": "Upravit důvod vrácení", + "subtitle": "Upravit hodnotu důvodu vrácení.", + "successToast": "Důvod vrácení {{label}} byl úspěšně aktualizován." + }, + "delete": { + "confirmation": "Chystáte se smazat důvod vrácení {{label}}. Tuto akci nelze vrátit zpět.", + "successToast": "Důvod vrácení {{label}} byl úspěšně smazán." + }, + "fields": { + "value": { + "label": "Hodnota", + "placeholder": "špatná_velikost", + "tooltip": "Hodnota by měla být jedinečný identifikátor pro důvod vrácení." + }, + "label": { "label": "Štítek", "placeholder": "Špatná velikost" }, + "description": { + "label": "Popis", + "placeholder": "Zákazník obdržel špatnou velikost" + } + } + }, + "login": { + "forgotPassword": "Zapomněli jste heslo? - <0>Obnovit", + "title": "Vítejte v Meduse", + "hint": "Přihlaste se pro přístup do oblasti účtu" + }, + "invite": { + "title": "Vítejte v Meduse", + "hint": "Vytvořte si svůj účet níže", + "backToLogin": "Zpět na přihlášení", + "createAccount": "Vytvořit účet", + "alreadyHaveAccount": "Již máte účet? - <0>Přihlásit se", + "emailTooltip": "Váš e-mail nelze změnit. Pokud byste chtěli použít jiný e-mail, musí být odeslána nová pozvánka.", + "invalidInvite": "Pozvánka je neplatná nebo vypršela.", + "successTitle": "Váš účet byl zaregistrován", + "successHint": "Začněte s Medusa Admin hned teď.", + "successAction": "Začít Medusa Admin", + "invalidTokenTitle": "Váš pozvánkový token je neplatný", + "invalidTokenHint": "Zkuste požádat o nový odkaz na pozvánku.", + "passwordMismatch": "Hesla se neshodují", + "toast": { + "accepted": "Pozvánka byla úspěšně přijata" + } + }, + "resetPassword": { + "title": "Obnovit heslo", + "hint": "Zadejte svůj e-mail níže a my vám zašleme pokyny, jak obnovit heslo.", + "email": "E-mail", + "sendResetInstructions": "Odeslat pokyny k obnovení", + "backToLogin": "<0>Zpět na přihlášení", + "newPasswordHint": "Vyberte nové heslo níže.", + "invalidTokenTitle": "Váš resetovací token je neplatný", + "invalidTokenHint": "Zkuste požádat o nový odkaz na reset.", + "expiredTokenTitle": "Váš resetovací token vypršel", + "goToResetPassword": "Přejít na obnovení hesla", + "resetPassword": "Obnovit heslo", + "newPassword": "Nové heslo", + "repeatNewPassword": "Zopakovat nové heslo", + "tokenExpiresIn": "Token vyprší za <0>{{time}} minut", + "successfulRequestTitle": "Úspěšně jsme vám zaslali e-mail", + "successfulRequest": "Poslali jsme vám e-mail, který můžete použít k obnovení hesla. Zkontrolujte složku se spamem, pokud jste jej neobdrželi po několika minutách.", + "successfulResetTitle": "Obnovení hesla bylo úspěšné", + "successfulReset": "Přihlaste se na přihlašovací stránce.", + "passwordMismatch": "Hesla se neshodují", + "invalidLinkTitle": "Váš odkaz na reset je neplatný", + "invalidLinkHint": "Zkuste znovu obnovit své heslo." + }, + "workflowExecutions": { + "domain": "Pracovní postupy", + "subtitle": "Zobrazit a sledovat provádění pracovních postupů ve vaší aplikaci Medusa.", + "transactionIdLabel": "ID transakce", + "workflowIdLabel": "ID pracovního postupu", + "progressLabel": "Pokrok", + "stepsCompletedLabel_one": "{{completed}} z {{count}} kroku", + "stepsCompletedLabel_other": "{{completed}} z {{count}} kroků", + "list": { + "noRecordsMessage": "Zatím nebyly provedeny žádné pracovní postupy." + }, + "history": { + "sectionTitle": "Historie", + "runningState": "Probíhá...", + "awaitingState": "Čeká se", + "failedState": "Selhalo", + "skippedState": "Přeskočeno", + "skippedFailureState": "Přeskočeno (Selhání)", + "definitionLabel": "Definice", + "outputLabel": "Výstup", + "compensateInputLabel": "Kompenzovat vstup", + "revertedLabel": "Vráceno", + "errorLabel": "Chyba" + }, + "state": { + "done": "Hotovo", + "failed": "Selhalo", + "reverted": "Vráceno", + "invoking": "Vyvolávání", + "compensating": "Kompenzování", + "notStarted": "Nezačalo" + }, + "transaction": { + "state": { + "waitingToCompensate": "Čeká se na kompenzaci" + } + }, + "step": { + "state": { + "skipped": "Přeskočeno", + "skippedFailure": "Přeskočeno (Selhání)", + "dormant": "Nečinné", + "timeout": "Časový limit" + } + } + }, + "productTypes": { + "domain": "Typy produktů", + "subtitle": "Organizujte své produkty do typů.", + "create": { + "header": "Vytvořit typ produktu", + "hint": "Vytvořte nový typ produktu pro kategorizaci vašich produktů.", + "successToast": "Typ produktu {{value}} byl úspěšně vytvořen." + }, + "edit": { + "header": "Upravit typ produktu", + "successToast": "Typ produktu {{value}} byl úspěšně aktualizován." + }, + "delete": { + "confirmation": "Chystáte se smazat typ produktu {{value}}. Tuto akci nelze vrátit zpět.", + "successToast": "Typ produktu {{value}} byl úspěšně smazán." + }, + "fields": { + "value": "Hodnota" + } + }, + "productTags": { + "domain": "Štítky produktů", + "create": { + "header": "Vytvořit štítek produktu", + "subtitle": "Vytvořte nový štítek produktu pro kategorizaci vašich produktů.", + "successToast": "Štítek produktu {{value}} byl úspěšně vytvořen." + }, + "edit": { + "header": "Upravit štítek produktu", + "subtitle": "Upravit hodnotu štítku produktu.", + "successToast": "Štítek produktu {{value}} byl úspěšně aktualizován." + }, + "delete": { + "confirmation": "Chystáte se smazat štítek produktu {{value}}. Tuto akci nelze vrátit zpět.", + "successToast": "Štítek produktu {{value}} byl úspěšně smazán." + }, + "fields": { + "value": "Hodnota" + } + }, + "notifications": { + "domain": "Oznámení", + "emptyState": { + "title": "Žádná oznámení", + "description": "Momentálně nemáte žádná oznámení, ale jakmile nějaká budete mít, budou zde." + }, + "accessibility": { + "description": "oznámení o aktivitách Medusy budou zde uvedena." + } + }, + "errors": { + "serverError": "Chyba serveru - Zkuste to později.", + "invalidCredentials": "Špatný e-mail nebo heslo" + }, + "statuses": { + "scheduled": "Naplánováno", + "expired": "Vypršelo", + "active": "Aktivní", + "inactive": "Neaktivní", + "draft": "Koncept", + "enabled": "Povoleno", + "disabled": "Zakázáno" + }, + "labels": { + "productVariant": "Varianta produktu", + "prices": "Ceny", + "available": "Dostupné", + "inStock": "Na skladě", + "added": "Přidáno", + "removed": "Odstraněno", + "from": "Od", + "to": "Do" + }, + "fields": { + "amount": "Částka", + "refundAmount": "Částka k vrácení", + "name": "Název", + "default": "Výchozí", + "lastName": "Příjmení", + "firstName": "Jméno", + "title": "Název", + "customTitle": "Vlastní název", + "manageInventory": "Spravovat inventář", + "inventoryKit": "Má sadu inventáře", + "inventoryItems": "Inventární položky", + "inventoryItem": "Inventární položka", + "requiredQuantity": "Požadované množství", + "description": "Popis", + "email": "E-mail", + "password": "Heslo", + "repeatPassword": "Zopakovat heslo", + "confirmPassword": "Potvrdit heslo", + "newPassword": "Nové heslo", + "repeatNewPassword": "Zopakovat nové heslo", + "categories": "Kategorie", + "shippingMethod": "Metoda dopravy", + "configurations": "Konfigurace", + "conditions": "Podmínky", + "category": "Kategorie", + "collection": "Kolekce", + "discountable": "Slevový", + "handle": "Handle", + "subtitle": "Podtitul", + "by": "Od", + "item": "Položka", + "qty": "množství", + "limit": "Limit", + "tags": "Štítky", + "type": "Typ", + "reason": "Důvod", + "none": "žádný", + "all": "vše", + "search": "Hledat", + "percentage": "Procento", + "sales_channels": "Prodejní kanály", + "customer_groups": "Skupiny zákazníků", + "product_tags": "Štítky produktů", + "product_types": "Typy produktů", + "product_collections": "Kolekce produktů", + "status": "Stav", + "code": "Kód", + "value": "Hodnota", + "disabled": "Zakázáno", + "dynamic": "Dynamický", + "normal": "Normální", + "years": "Roky", + "months": "Měsíce", + "days": "Dny", + "hours": "Hodiny", + "minutes": "Minuty", + "totalRedemptions": "Celkový počet uplatnění", + "countries": "Země", + "paymentProviders": "Poskytovatelé plateb", + "refundReason": "Důvod vrácení peněz", + "fulfillmentProviders": "Poskytovatelé plnění", + "fulfillmentProvider": "Poskytovatel plnění", + "providers": "Poskytovatelé", + "availability": "Dostupnost", + "inventory": "Inventář", + "optional": "Volitelné", + "note": "Poznámka", + "automaticTaxes": "Automatické daně", + "taxInclusivePricing": "Ceny včetně daně", + "currency": "Měna", + "address": "Adresa", + "address2": "Byt, apartmán, atd.", + "city": "Město", + "postalCode": "PSČ", + "country": "Země", + "state": "Stát", + "province": "Provincie", + "company": "Společnost", + "phone": "Telefon", + "metadata": "Metadata", + "selectCountry": "Vyberte zemi", + "products": "Produkty", + "variants": "Varianty", + "orders": "Objednávky", + "account": "Účet", + "total": "Celková částka objednávky", + "paidTotal": "Celková částka zachycena", + "totalExclTax": "Celková částka bez daně", + "subtotal": "Mezisoučet", + "shipping": "Doprava", + "outboundShipping": "Odchozí doprava", + "returnShipping": "Vrácení dopravy", + "tax": "Daň", + "created": "Vytvořeno", + "key": "Klíč", + "customer": "Zákazník", + "date": "Datum", + "order": "Objednávka", + "fulfillment": "Plnění", + "provider": "Poskytovatel", + "payment": "Platba", + "items": "Položky", + "salesChannel": "Prodejní kanál", + "region": "Region", + "discount": "Sleva", + "role": "Role", + "sent": "Odesláno", + "salesChannels": "Prodejní kanály", + "product": "Produkt", + "createdAt": "Vytvořeno", + "updatedAt": "Aktualizováno", + "revokedAt": "Odvoláno dne", + "true": "Pravda", + "false": "Nepravda", + "giftCard": "Dárková karta", + "tag": "Štítek", + "dateIssued": "Datum vydání", + "issuedDate": "Datum vydání", + "expiryDate": "Datum vypršení", + "price": "Cena", + "priceTemplate": "Cena {{regionOrCurrency}}", + "height": "Výška", + "width": "Šířka", + "length": "Délka", + "weight": "Hmotnost", + "midCode": "MID kód", + "hsCode": "HS kód", + "ean": "EAN", + "upc": "UPC", + "inventoryQuantity": "Množství inventáře", + "barcode": "Čárový kód", + "countryOfOrigin": "Země původu", + "material": "Materiál", + "thumbnail": "Miniatura", + "sku": "SKU", + "managedInventory": "Spravovaný inventář", + "allowBackorder": "Povolit zpětnou objednávku", + "inStock": "Na skladě", + "location": "Lokace", + "quantity": "Množství", + "variant": "Varianta", + "id": "ID", + "parent": "Rodič", + "minSubtotal": "Min. mezisoučet", + "maxSubtotal": "Max. mezisoučet", + "shippingProfile": "Profil dopravy", + "summary": "Souhrn", + "details": "Detaily", + "label": "Štítek", + "rate": "Sazba", + "requiresShipping": "Vyžaduje dopravu", + "unitPrice": "Jednotková cena", + "startDate": "Datum začátku", + "endDate": "Datum konce", + "draft": "Koncept", + "values": "Hodnoty" + }, + "dateTime": { + "years_one": "Rok", + "years_other": "Roky", + "months_one": "Měsíc", + "months_other": "Měsíce", + "weeks_one": "Týden", + "weeks_other": "Týdny", + "days_one": "Den", + "days_other": "Dny", + "hours_one": "Hodina", + "hours_other": "Hodiny", + "minutes_one": "Minuta", + "minutes_other": "Minuty", + "seconds_one": "Sekunda", + "seconds_other": "Sekundy" + } + } diff --git a/packages/admin/dashboard/src/i18n/translations/fa.json b/packages/admin/dashboard/src/i18n/translations/fa.json new file mode 100644 index 0000000000000..04fa773906d2a --- /dev/null +++ b/packages/admin/dashboard/src/i18n/translations/fa.json @@ -0,0 +1,2928 @@ +{ + "$schema": "./$schema.json", + "general": { + "ascending": "صعودی", + "descending": "نزولی", + "add": "اضافه کردن", + "start": "شروع", + "end": "پایان", + "open": "باز کردن", + "close": "بستن", + "apply": "اعمال", + "range": "محدوده", + "search": "جستجو", + "of": "از", + "results": "نتایج", + "pages": "صفحات", + "next": "بعدی", + "prev": "قبلی", + "is": "است", + "timeline": "جدول زمانی", + "success": "موفقیت", + "warning": "هشدار", + "tip": "نکته", + "error": "خطا", + "select": "انتخاب", + "selected": "انتخاب شده", + "enabled": "فعال", + "disabled": "غیرفعال", + "expired": "منقضی شده", + "active": "فعال", + "revoked": "لغو شده", + "new": "جدید", + "modified": "اصلاح شده", + "added": "اضافه شده", + "removed": "حذف شده", + "admin": "مدیر", + "store": "فروشگاه", + "details": "جزئیات", + "items_one": "{{count}} آیتم", + "items_other": "{{count}} آیتم‌", + "countSelected": "{{count}} انتخاب شده", + "countOfTotalSelected": "{{count}} از {{total}} انتخاب شده", + "plusCount": "+ {{count}}", + "plusCountMore": "+ {{count}} بیشتر", + "areYouSure": "آیا مطمئنید؟", + "noRecordsFound": "هیچ رکوردی پیدا نشد", + "typeToConfirm": "لطفاً برای تایید {val} را تایپ کنید:", + "noResultsTitle": "نتیجه‌ای یافت نشد", + "noResultsMessage": "لطفاً فیلترها یا عبارت جستجو را تغییر دهید", + "noSearchResults": "هیچ نتیجه‌ای برای جستجو پیدا نشد", + "noSearchResultsFor": "جستجو برای <0> '{{query}}' هیچ نتیجه‌ای نداشت", + "noRecordsTitle": "هیچ رکوردی", + "noRecordsMessage": "رکوردی برای نمایش وجود ندارد", + "unsavedChangesTitle": "آیا مطمئنید که می‌خواهید از این فرم خارج شوید؟", + "unsavedChangesDescription": "شما تغییرات ذخیره نشده دارید که در صورت خروج از فرم از دست خواهند رفت.", + "includesTaxTooltip": "قیمت‌های این ستون شامل مالیات هستند.", + "excludesTaxTooltip": "قیمت‌های این ستون بدون مالیات هستند.", + "noMoreData": "داده‌ی بیشتری وجود ندارد" + }, + "json": { + "header": "JSON", + "numberOfKeys_one": "{{count}} کلید", + "numberOfKeys_other": "{{count}} کلید", + "drawer": { + "header_one": "JSON <0>· {{count}} کلید", + "header_other": "JSON <0>· {{count}} کلیدها", + "description": "داده‌های JSON مربوط به این شیء را مشاهده کنید." + } + }, + "metadata": { + "header": "متادیتا", + "numberOfKeys_one": "{{count}} کلید", + "numberOfKeys_other": "{{count}} کلید", + "edit": { + "header": "ویرایش متادیتا", + "description": "متادیتای مربوط به این شیء را ویرایش کنید.", + "successToast": "متادیتا با موفقیت به‌روزرسانی شد.", + "actions": { + "insertRowAbove": "یک ردیف در بالا اضافه کنید", + "insertRowBelow": "یک ردیف در پایین اضافه کنید", + "deleteRow": "ردیف را حذف کنید" + }, + "labels": { + "key": "کلید", + "value": "مقدار" + }, + "complexRow": { + "label": "برخی ردیف‌ها غیرفعال هستند", + "description": "این شیء شامل متادیتای غیر ابتدایی مانند آرایه‌ها یا اشیاء است که در اینجا قابل ویرایش نیستند. برای ویرایش ردیف‌های غیرفعال، از API به‌طور مستقیم استفاده کنید.", + "tooltip": "این ردیف غیرفعال است زیرا شامل داده‌های غیر ابتدایی است." + } + } + }, + "validation": { + "mustBeInt": "مقدار باید یک عدد صحیح باشد.", + "mustBePositive": "مقدار باید یک عدد مثبت باشد." + }, + "actions": { + "save": "ذخیره", + "saveAsDraft": "ذخیره به‌عنوان پیش‌نویس", + "copy": "کپی", + "copied": "کپی شد", + "duplicate": "تکرار", + "publish": "منتشر کردن", + "create": "ایجاد", + "delete": "حذف", + "remove": "حذف", + "revoke": "لغو", + "cancel": "لغو", + "forceConfirm": "تایید اجباری", + "continueEdit": "ادامه ویرایش", + "enable": "فعال کردن", + "disable": "غیرفعال کردن", + "undo": "برگشت", + "complete": "تکمیل", + "viewDetails": "مشاهده جزئیات", + "back": "بازگشت", + "close": "بستن", + "showMore": "نمایش بیشتر", + "continue": "ادامه", + "continueWithEmail": "ادامه با ایمیل", + "idCopiedToClipboard": "شناسه در حافظه کپی شد", + "addReason": "اضافه کردن دلیل", + "addNote": "اضافه کردن یادداشت", + "reset": "بازنشانی", + "confirm": "تایید", + "edit": "ویرایش", + "addItems": "اضافه کردن آیتم‌", + "download": "دانلود", + "clear": "پاک کردن", + "clearAll": "پاک کردن همه", + "apply": "اعمال", + "add": "اضافه کردن", + "select": "انتخاب", + "browse": "کاوش", + "logout": "خروج", + "hide": "مخفی کردن", + "export": "گرفتن خروجی", + "import": "وارد کردن", + "cannotUndo": "این عمل قابل بازگشت نیست" + }, + "operators": { + "in": "در" + }, + "app": { + "search": { + "label": "جستجو", + "title": "جستجو", + "description": "تمام فروشگاه خود را جستجو کنید، از جمله سفارش‌ها، محصولات، مشتریان و بیشتر.", + "allAreas": "تمام بخش‌ها", + "navigation": "ناوبری", + "openResult": "نتیجه را باز کنید", + "showMore": "نمایش بیشتر", + "placeholder": "برای جستجو یا رفتن به هر چیزی...", + "noResultsTitle": "نتیجه‌ای پیدا نشد", + "noResultsMessage": "ما چیزی که با جستجوی شما مطابقت داشته باشد پیدا نکردیم.", + "emptySearchTitle": "برای جستجو تایپ کنید", + "emptySearchMessage": "یک کلمه کلیدی یا عبارت وارد کنید تا جستجو کنید.", + "loadMore": "بارگذاری {{count}} بیشتر", + "groups": { + "all": "تمام بخش‌ها", + "customer": "مشتریان", + "customerGroup": "گروه‌های مشتریان", + "product": "محصولات", + "productVariant": "تنوع محصولات", + "inventory": "موجودی", + "reservation": "رزروها", + "category": "دسته‌بندی‌ها", + "collection": "مجموعه‌ها", + "order": "سفارش‌ها", + "promotion": "تخفیف‌ها", + "campaign": "کمپین‌ها", + "priceList": "لیست قیمت‌ها", + "user": "کاربران", + "region": "مناطق", + "taxRegion": "مناطق مالیاتی", + "returnReason": "دلایل بازگشت", + "salesChannel": "کانال‌های فروش", + "productType": "نوع محصولات", + "productTag": "برچسب‌های محصول", + "location": "موقعیت‌ها", + "shippingProfile": "پروفایل‌های حمل و نقل", + "publishableApiKey": "کلیدهای API قابل انتشار", + "secretApiKey": "کلیدهای API مخفی", + "command": "دستورات", + "navigation": "ناوبری" + } + }, + "keyboardShortcuts": { + "pageShortcut": "پرش به", + "settingShortcut": "تنظیمات", + "commandShortcut": "دستورات", + "then": "سپس", + "navigation": { + "goToOrders": "سفارش‌ها", + "goToProducts": "محصولات", + "goToCollections": "مجموعه‌ها", + "goToCategories": "دسته‌بندی‌ها", + "goToCustomers": "مشتریان", + "goToCustomerGroups": "گروه‌های مشتریان", + "goToInventory": "موجودی", + "goToReservations": "رزروها", + "goToPriceLists": "لیست قیمت‌ها", + "goToPromotions": "تخفیف‌ها", + "goToCampaigns": "کمپین‌ها" + }, + "settings": { + "goToSettings": "تنظیمات", + "goToStore": "فروشگاه", + "goToUsers": "کاربران", + "goToRegions": "مناطق", + "goToTaxRegions": "مناطق مالیاتی", + "goToSalesChannels": "کانال‌های فروش", + "goToProductTypes": "نوع محصولات", + "goToLocations": "موقعیت‌ها", + "goToPublishableApiKeys": "کلیدهای API قابل انتشار", + "goToSecretApiKeys": "کلیدهای API مخفی", + "goToWorkflows": "فرایندها", + "goToProfile": "پروفایل", + "goToReturnReasons": "دلایل بازگشت" + } + }, + "menus": { + "user": { + "documentation": "مستندات", + "changelog": "تغییرات", + "shortcuts": "کلیدهای میانبر", + "profileSettings": "تنظیمات پروفایل", + "theme": { + "label": "تم", + "dark": "تاریک", + "light": "روشن", + "system": "سیستم" + } + }, + "store": { + "label": "فروشگاه", + "storeSettings": "تنظیمات فروشگاه" + }, + "actions": { + "logout": "خروج" + } + }, + "nav": { + "accessibility": { + "title": "ناوبری", + "description": "منوی ناوبری برای داشبورد." + }, + "common": { + "extensions": "افزونه‌ها" + }, + "main": { + "store": "فروشگاه", + "storeSettings": "تنظیمات فروشگاه" + }, + "settings": { + "header": "تنظیمات", + "general": "عمومی", + "developer": "توسعه‌دهنده", + "myAccount": "حساب من" + } + } + }, + "dataGrid": { + "columns": { + "view": "مشاهده", + "resetToDefault": "بازنشانی به پیش‌فرض", + "disabled": "تغییر ستون‌های قابل مشاهده غیرفعال است." + }, + "shortcuts": { + "label": "میانبرها", + "commands": { + "undo": "بازگشت", + "redo": "انجام دوباره", + "copy": "کپی", + "paste": "چسباندن", + "edit": "ویرایش", + "delete": "حذف", + "clear": "پاک کردن", + "moveUp": "جابجایی به بالا", + "moveDown": "جابجایی به پایین", + "moveLeft": "جابجایی به چپ", + "moveRight": "جابجایی به راست", + "moveTop": "جابجایی به بالاترین", + "moveBottom": "جابجایی به پایین‌ترین", + "selectDown": "انتخاب از پایین", + "selectUp": "انتخاب از بالا", + "selectColumnDown": "انتخاب ستون از پایین", + "selectColumnUp": "انتخاب ستون به بالا", + "focusToolbar": "تمرکز بر نوار ابزار", + "focusCancel": "تمرکز بر لغو" + } + }, + "errors": { + "fixError": "رفع خطا", + "count_one": "{{count}} خطا", + "count_other": "{{count}} خطا" + } + }, + "filters": { + "sortLabel": "مرتب‌سازی", + "filterLabel": "فیلتر", + "searchLabel": "جستجو", + "date": { + "today": "امروز", + "lastSevenDays": "۷ روز گذشته", + "lastThirtyDays": "۳۰ روز گذشته", + "lastNinetyDays": "۹۰ روز گذشته", + "lastTwelveMonths": "۱۲ ماه گذشته", + "custom": "سفارشی", + "from": "از", + "to": "تا", + "starting": "شروع", + "ending": "پایان" + }, + "compare": { + "lessThan": "کمتر از", + "greaterThan": "بیشتر از", + "exact": "دقیق", + "range": "بازه", + "lessThanLabel": "کمتر از {{value}}", + "greaterThanLabel": "بیشتر از {{value}}", + "andLabel": "و" + }, + "sorting": { + "alphabeticallyAsc": "از A به Z", + "alphabeticallyDesc": "از Z به A", + "dateAsc": "جدیدترین اول", + "dateDesc": "قدیمی‌ترین اول" + }, + "radio": { + "yes": "بله", + "no": "خیر", + "true": "درست", + "false": "نادرست" + }, + "addFilter": "افزودن فیلتر" + }, + "errorBoundary": { + "badRequestTitle": "۴۰۰ - درخواست نامعتبر", + "badRequestMessage": "درخواست به دلیل سینتکس نادرست قابل درک توسط سرور نبود.", + "notFoundTitle": "۴۰۴ - صفحه‌ای در این آدرس وجود ندارد", + "notFoundMessage": "آدرس URL را بررسی کرده و دوباره تلاش کنید، یا از نوار جستجو برای یافتن آنچه به دنبالش هستید استفاده کنید.", + "internalServerErrorTitle": "۵۰۰ - خطای داخلی سرور", + "internalServerErrorMessage": "یک خطای غیرمنتظره در سرور رخ داد. لطفاً بعداً دوباره تلاش کنید.", + "defaultTitle": "یک خطا رخ داده است", + "defaultMessage": "یک خطای غیرمنتظره در هنگام بارگذاری این صفحه رخ داده است.", + "noMatchMessage": "صفحه‌ای که به دنبال آن هستید وجود ندارد.", + "backToDashboard": "بازگشت به داشبورد" + }, + "addresses": { + "shippingAddress": { + "header": "آدرس حمل و نقل", + "editHeader": "ویرایش آدرس حمل و نقل", + "editLabel": "آدرس حمل و نقل", + "label": "آدرس حمل و نقل" + }, + "billingAddress": { + "header": "آدرس صورتحساب", + "editHeader": "ویرایش آدرس صورتحساب", + "editLabel": "آدرس صورتحساب", + "label": "آدرس صورتحساب", + "sameAsShipping": "یکسان با آدرس حمل و نقل" + }, + "contactHeading": "تماس", + "locationHeading": "موقعیت" + }, + "email": { + "editHeader": "ویرایش ایمیل", + "editLabel": "ایمیل", + "label": "ایمیل" + }, + "transferOwnership": { + "header": "انتقال مالکیت", + "label": "انتقال مالکیت", + "details": { + "order": "جزئیات سفارش", + "draft": "جزئیات پیش‌نویس" + }, + "currentOwner": { + "label": "مالک فعلی", + "hint": "مالک فعلی سفارش." + }, + "newOwner": { + "label": "مالک جدید", + "hint": "مالک جدیدی که باید سفارش به او منتقل شود." + }, + "validation": { + "mustBeDifferent": "مالک جدید باید متفاوت از مالک فعلی باشد.", + "required": "مالک جدید الزامی است." + } + }, + "sales_channels": { + "availableIn": "در <0>{{x}} از <1>{{y}} کانال‌ فروش موجود است" + }, + "products": { + "domain": "محصولات", + "list": { + "noRecordsMessage": "اولین محصول خود را ایجاد کنید تا شروع به فروش کنید." + }, + "edit": { + "header": "ویرایش محصول", + "description": "جزئیات محصول را ویرایش کنید.", + "successToast": "محصول {{title}} با موفقیت به‌روزرسانی شد." + }, + "create": { + "title": "ایجاد محصول", + "description": "یک محصول جدید ایجاد کنید.", + "header": "عمومی", + "tabs": { + "details": "جزئیات", + "organize": "سازماندهی", + "variants": "متغیرها", + "inventory": "کیت‌های موجودی" + }, + "errors": { + "variants": "لطفاً حداقل یک متغیر را انتخاب کنید.", + "options": "لطفاً حداقل یک گزینه ایجاد کنید.", + "uniqueSku": "SKU باید منحصر به فرد باشد." + }, + "inventory": { + "heading": "کیت‌های موجودی", + "label": "آیتم‌های موجودی را به کیت موجودی متغیر اضافه کنید.", + "itemPlaceholder": "آیتم موجودی را انتخاب کنید", + "quantityPlaceholder": "چند عدد از این آیتم برای کیت نیاز است؟" + }, + "variants": { + "header": "متغیرها", + "subHeadingTitle": "بله، این یک محصول متغیر است", + "subHeadingDescription": "هنگامی که این گزینه را لغو کنید، ما یک متغیر پیش‌فرض برای شما ایجاد خواهیم کرد", + "optionTitle": { + "placeholder": "اندازه" + }, + "optionValues": { + "placeholder": "کوچک، متوسط، بزرگ" + }, + "productVariants": { + "label": "متغیرهای محصول", + "hint": "این رتبه‌بندی بر ترتیب متغیرها در فروشگاه شما تأثیر خواهد گذاشت.", + "alert": "برای ایجاد متغیرها گزینه‌ها را اضافه کنید.", + "tip": "متغیرهایی که بررسی نشده‌اند ایجاد نخواهند شد. شما همیشه می‌توانید متغیرها را بعداً ایجاد و ویرایش کنید اما این لیست تناسبات گزینه‌های محصول شما را پوشش می‌دهد." + }, + "productOptions": { + "label": "گزینه‌های محصول", + "hint": "گزینه‌های محصول مانند رنگ، اندازه و غیره را تعریف کنید." + } + }, + "successToast": "محصول {{title}} با موفقیت ایجاد شد." + }, + "export": { + "header": "خروجی گرفتن لیست محصولات", + "description": "خروجی گرفتن لیست محصولات در یک فایل CSV.", + "success": { + "title": "ما در حال پردازش خروجی شما هستیم", + "description": "خروجی گرفتن از داده ها ممکن است چند دقیقه طول بکشد. زمانی که کار تمام شد به شما اطلاع خواهیم داد." + }, + "filters": { + "title": "فیلترها", + "description": "فیلترهایی را در جدول اعمال کنید تا نمایش اطلاعات بر اساس آن انجام شود" + }, + "columns": { + "title": "ستون‌ها", + "description": "داده‌های صادر شده را برای رفع نیازهای خاص سفارشی کنید" + } + }, + "import": { + "header": "وارد کردن لیست محصولات", + "uploadLabel": "وارد کردن محصولات", + "uploadHint": "فایل CSV را بکشید و رها کنید یا برای بارگذاری کلیک کنید", + "description": "محصولات را با ارائه یک فایل CSV در قالب از پیش تعیین شده وارد کنید", + "template": { + "title": "نمی‌دانید چگونه لیست خود را مرتب کنید؟", + "description": "برای اطمینان از دنبال کردن قالب صحیح، الگو را از پایین دانلود کنید." + }, + "upload": { + "title": "آپلود فایل CSV", + "description": "از طریق بارگزاری فایل می‌توانید محصولات را اضافه یا به‌روزرسانی کنید. برای به‌روزرسانی محصولات موجود باید از شناسه و دسته موجود استفاده کنید. قبل از وارد کردن محصولات از شما اجازه می‌گیریم.", + "preprocessing": "در حال بردازش داده‌ها...", + "productsToCreate": "محصولات ایجاد خواهند شد", + "productsToUpdate": "محصولات بروزرسانی خواهند شد" + }, + "success": { + "title": "ما در حال پردازش اطلاعات ورودی شما هستیم", + "description": "وارد کردن داده‌ها ممکن است مدتی طول بکشد. زمانی که کار تمام شد به شما اطلاع خواهیم داد." + } + }, + "deleteWarning": "شما در حال حذف محصول {{title}} هستید. این اقدام غیرقابل بازگشت است.", + "variants": { + "header": "تنوع‌ها", + "empty": { + "heading": "بدون تنوع", + "description": "هیچ تنوعی برای نمایش وجود ندارد." + }, + "filtered": { + "heading": "بدون نتیجه", + "description": "هیچ تنوعی با معیارهای فیلتر فعلی مطابقت ندارد." + } + }, + "attributes": "ویژگی‌ها", + "editAttributes": "ویرایش ویژگی‌ها", + "editOptions": "ویرایش گزینه‌ها", + "editPrices": "ویرایش قیمت‌ها", + "media": { + "label": "رسانه‌ها", + "editHint": "رسانه‌ها را به محصول اضافه کنید تا در فروشگاه شما نمایش داده شود.", + "makeThumbnail": "ایجاد تصویر بندانگشتی", + "uploadImagesLabel": "بارگذاری تصاویر", + "uploadImagesHint": "تصاویر را اینجا بکشید و رها کنید یا برای بارگذاری کلیک کنید.", + "invalidFileType": "'{{name}}' نوع فایل پشتیبانی‌شده نیست. نوع‌های پشتیبانی‌شده عبارتند از: {{types}}.", + "failedToUpload": "بارگذاری رسانه اضافه شده با شکست مواجه شد. لطفاً دوباره تلاش کنید.", + "deleteWarning_one": "شما در حال حذف {{count}} تصویر هستید. این عمل غیرقابل بازگشت است.", + "deleteWarning_other": "شما در حال حذف {{count}} تصویر هستید. این عمل غیرقابل بازگشت است.", + "deleteWarningWithThumbnail_one": "شما در حال حذف {{count}} تصویر به همراه تصویر کوچک آن هستید. این عمل غیرقابل بازگشت است.", + "deleteWarningWithThumbnail_other": "شما در حال حذف {{count}} تصویر به همراه تصاویر کوچک آن‌ها هستید. این عمل غیرقابل بازگشت است.", + "thumbnailTooltip": "تصویر کوچک", + "galleryLabel": "گالری", + "downloadImageLabel": "دانلود تصویر فعلی", + "deleteImageLabel": "حذف تصویر فعلی", + "emptyState": { + "header": "هیچ رسانه‌ای هنوز اضافه نشده است", + "description": "رسانه‌هایی به محصول اضافه کنید تا در ویترین فروشگاه شما نمایش داده شوند.", + "action": "افزودن رسانه" + }, + "successToast": "رسانه با موفقیت بروزرسانی شد." + }, + "discountableHint": "هنگامی که غیرفعال باشد، تخفیف‌ها به این محصول اعمال نخواهند شد.", + "noSalesChannels": "در هیچ کانال فروش موجود نیست", + "variantCount_one": "{{count}} متغیر", + "variantCount_other": "{{count}} متغیر", + "deleteVariantWarning": "آیا مطمئن هستید که می‌خواهید متغیر {{title}} را حذف کنید؟ این عمل غیرقابل بازگشت است.", + "productStatus": { + "draft": "پیش‌نویس", + "published": "منتشر شده", + "proposed": "پیشنهادی", + "rejected": "رد شده" + }, + "fields": { + "title": { + "label": "عنوان", + "hint": "عنوانی کوتاه و واضح برای محصول خود بدهید.<0/>طول 50-60 کاراکتر برای موتورهای جستجو توصیه می‌شود." + }, + "subtitle": { + "label": "زیرعنوان" + }, + "handle": { + "label": "شناسه", + "tooltip": "شناسه برای ارجاع به محصول در فروشگاه شما استفاده می‌شود. اگر مشخص نشود، شناسه از عنوان محصول ساخته خواهد شد." + }, + "description": { + "label": "توضیحات", + "hint": "توضیحی کوتاه و واضح برای محصول خود بنویسید.<0/>طول 120-160 کاراکتر برای موتورهای جستجو توصیه می‌شود." + }, + "discountable": { + "label": "قابل تخفیف", + "hint": "هنگامی که غیرفعال باشد، تخفیف‌ها به این محصول اعمال نخواهند شد." + }, + "type": { + "label": "نوع" + }, + "collection": { + "label": "مجموعه" + }, + "categories": { + "label": "دسته‌بندی‌ها" + }, + "tags": { + "label": "برچسب‌ها" + }, + "sales_channels": { + "label": "کانال‌های فروش", + "hint": "این محصول فقط در کانال فروش پیش‌فرض در دسترس خواهد بود اگر دست نخورده باقی بماند." + }, + "countryOrigin": { + "label": "کشور مبدأ" + }, + "material": { + "label": "مواد" + }, + "width": { + "label": "عرض" + }, + "length": { + "label": "طول" + }, + "height": { + "label": "ارتفاع" + }, + "weight": { + "label": "وزن" + }, + "options": { + "label": "گزینه‌های محصول", + "hint": "گزینه‌ها برای تعیین رنگ، اندازه و غیره محصول استفاده می‌شوند.", + "add": "افزودن گزینه", + "optionTitle": "عنوان گزینه", + "optionTitlePlaceholder": "رنگ", + "variations": "مقادیر متغییر (با کاما جدا شده)", + "variantionsPlaceholder": "قرمز، آبی، سبز" + }, + "variants": { + "label": "متغیرهای محصول", + "hint": "متغیرهایی که غیرفعال باقی بمانند ایجاد نخواهند شد. این رتبه‌بندی نحوه رتبه‌بندی متغیرها را در رابط کاربری شما تحت تأثیر قرار می‌دهد." + }, + "mid_code": { + "label": "کد Mid" + }, + "hs_code": { + "label": "کد HS" + } + }, + "variant": { + "edit": { + "header": "ویرایش متغیر", + "success": "متغیر با موفقیت ویرایش شد" + }, + "create": { + "header": "جزئیات متغیر" + }, + "deleteWarning": "آیا مطمئن هستید که می‌خواهید این متغیر را حذف کنید؟", + "pricesPagination": "1 - {{current}} از {{total}} قیمت‌", + "tableItemAvailable": "{{availableCount}} موجود", + "tableItem_one": "{{availableCount}} موجود در {{locationCount}} مکان", + "tableItem_other": "{{availableCount}} موجود در {{locationCount}} مکان‌", + "inventory": { + "notManaged": "مدیریت نمی‌شود", + "manageItems": "مدیریت اقلام موجودی", + "notManagedDesc": "برای این متغیر موجودی مدیریت نمی‌شود. برای پیگیری موجودی، گزینه 'مدیریت موجودی' را فعال کنید.", + "manageKit": "مدیریت کیت موجودی", + "navigateToItem": "برو به آیتم موجودی", + "actions": { + "inventoryItems": "برو به آیتم موجودی", + "inventoryKit": "نمایش اقلام موجودی" + }, + "inventoryKit": "کیت موجودی", + "inventoryKitHint": "آیا این متغیر از چندین آیتم موجودی تشکیل شده است؟", + "validation": { + "itemId": "لطفاً یک آیتم موجودی انتخاب کنید.", + "quantity": "مقدار مورد نیاز است. لطفاً یک عدد مثبت وارد کنید." + }, + "header": "موجودی و انبار", + "editItemDetails": "ویرایش جزئیات آیتم", + "manageInventoryLabel": "مدیریت موجودی", + "manageInventoryHint": "هنگامی که فعال شود، زمانی که سفارشات و بازگشت‌ها ایجاد شوند مقدار موجودی برای شما به روز می‌شود.", + "allowBackordersLabel": "اجازه به پیش‌سفارش‌ها", + "allowBackordersHint": "هنگامی که فعال شود، مشتریان می‌توانند محصول را حتی اگر موجودی آن تمام شده باشد خریداری کنند.", + "toast": { + "levelsBatch": "سطوح موجودی به روز شد.", + "update": "آیتم موجودی با موفقیت به روز شد.", + "updateLevel": "میزان موجودی با موفقیت به روز شد.", + "itemsManageSuccess": "اقلام موجودی با موفقیت به روز شدند." + } + } + }, + "options": { + "header": "گزینه‌ها", + "edit": { + "header": "ویرایش گزینه", + "successToast": "گزینه {{title}} با موفقیت به روز شد." + }, + "create": { + "header": "ایجاد گزینه", + "successToast": "گزینه {{title}} با موفقیت ایجاد شد." + }, + "deleteWarning": "شما در حال حذف گزینه محصول: {{title}} هستید. این عمل غیرقابل بازگشت است." + }, + "organization": { + "header": "سازماندهی", + "edit": { + "header": "ویرایش سازمان", + "toasts": { + "success": "سازمان {{title}} با موفقیت به روز شد." + } + } + }, + "stock": { + "heading": "مدیریت میزان موجودی و مکان‌ها", + "description": "مقدار موجودی برای تمامی متغیرهای محصول را به روز کنید.", + "loading": "لطفاً منتظر بمانید، ممکن است کمی زمان ببرد...", + "tooltips": { + "alreadyManaged": "این آیتم موجودی تحت عنوان {{title}} در حال ویرایش است.", + "alreadyManagedWithSku": "این آیتم موجودی تحت عنوان {{title}} ({{sku}}) در حال ویرایش است." + } + }, + "toasts": { + "delete": { + "success": { + "header": "محصول حذف شد", + "description": "{{title}} با موفقیت حذف شد." + }, + "error": { + "header": "حذف محصول با شکست مواجه شد" + } + } + } + }, + "collections": { + "domain": "مجموعه‌ها", + "subtitle": "محصولات را در مجموعه‌ها سازماندهی کنید.", + "createCollection": "ایجاد مجموعه", + "createCollectionHint": "یک مجموعه جدید ایجاد کنید تا محصولات خود را سازماندهی کنید.", + "createSuccess": "مجموعه با موفقیت ایجاد شد.", + "editCollection": "ویرایش مجموعه", + "handleTooltip": "شناسه برای ارجاع به مجموعه در ویترین فروشگاه شما استفاده می‌شود. اگر مشخص نشود، شناسه از عنوان مجموعه ساخته خواهد شد.", + "deleteWarning": "شما در حال حذف مجموعه {{title}} هستید. این عمل غیرقابل بازگشت است.", + "removeSingleProductWarning": "شما در حال حذف محصول {{title}} از مجموعه هستید. این عمل غیرقابل بازگشت است.", + "removeProductsWarning_one": "شما در حال حذف {{count}} محصول از مجموعه هستید. این عمل غیرقابل بازگشت است.", + "removeProductsWarning_other": "شما در حال حذف {{count}} محصول از مجموعه هستید. این عمل غیرقابل بازگشت است.", + "products": { + "list": { + "noRecordsMessage": "هیچ محصولی در مجموعه وجود ندارد." + }, + "add": { + "successToast_one": "محصول با موفقیت به مجموعه اضافه شد.", + "successToast_other": "محصولات با موفقیت به مجموعه اضافه شدند." + }, + "remove": { + "successToast_one": "محصول با موفقیت از مجموعه حذف شد.", + "successToast_other": "محصولات با موفقیت از مجموعه حذف شدند." + } + } + }, + "categories": { + "domain": "دسته‌بندی‌ها", + "subtitle": "محصولات را در دسته‌بندی‌ها سازماندهی کنید و رتبه‌بندی و سلسله مراتب آن‌ها را مدیریت کنید.", + "create": { + "header": "ایجاد دسته‌بندی", + "hint": "یک دسته‌بندی جدید ایجاد کنید تا محصولات خود را سازماندهی کنید.", + "tabs": { + "details": "جزئیات", + "organize": "رتبه‌بندی سازماندهی" + }, + "successToast": "دسته‌بندی {{name}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش دسته‌بندی", + "description": "دسته‌بندی را ویرایش کنید تا جزئیات آن را به روز کنید.", + "successToast": "دسته‌بندی با موفقیت به روز شد." + }, + "delete": { + "confirmation": "شما در حال حذف دسته‌بندی {{name}} هستید. این عمل غیرقابل بازگشت است.", + "successToast": "دسته‌بندی {{name}} با موفقیت حذف شد." + }, + "products": { + "add": { + "disabledTooltip": "محصول در این دسته‌بندی از قبل وجود دارد.", + "successToast_one": "{{count}} محصول به دسته‌بندی اضافه شد.", + "successToast_other": "{{count}} محصول به دسته‌بندی اضافه شدند." + }, + "remove": { + "confirmation_one": "شما در حال حذف {{count}} محصول از دسته‌بندی هستید. این عمل غیرقابل بازگشت است.", + "confirmation_other": "شما در حال حذف {{count}} محصول از دسته‌بندی هستید. این عمل غیرقابل بازگشت است.", + "successToast_one": "{{count}} محصول از دسته‌بندی حذف شد.", + "successToast_other": "{{count}} محصول از دسته‌بندی حذف شدند." + }, + "list": { + "noRecordsMessage": "هیچ محصولی در دسته‌بندی وجود ندارد." + } + }, + "organize": { + "header": "سازماندهی", + "action": "ویرایش رتبه‌بندی" + }, + "fields": { + "visibility": { + "label": "نمایش", + "internal": "داخلی", + "public": "عمومی" + }, + "status": { + "label": "وضعیت", + "active": "فعال", + "inactive": "غیرفعال" + }, + "path": { + "label": "مسیر", + "tooltip": "مسیر کامل دسته‌بندی را نمایش دهید." + }, + "children": { + "label": "فرزندان" + }, + "new": { + "label": "جدید" + } + } + }, + "inventory": { + "domain": "موجودی", + "subtitle": "اقلام موجودی خود را مدیریت کنید", + "reserved": "رزرو شده", + "available": "موجود", + "locationLevels": "مکان‌ها", + "associatedVariants": "متغیرهای مرتبط", + "manageLocations": "مدیریت مکان‌ها", + "deleteWarning": "شما در حال حذف یک آیتم موجودی هستید. این عمل غیرقابل بازگشت است.", + "editItemDetails": "ویرایش جزئیات آیتم", + "create": { + "title": "ایجاد آیتم موجودی", + "details": "جزئیات", + "availability": "موجودی", + "locations": "مکان‌ها", + "attributes": "ویژگی‌ها", + "requiresShipping": "آیا نیاز به حمل و نقل دارد؟", + "requiresShippingHint": "آیا این آیتم موجودی نیاز به حمل و نقل دارد؟", + "successToast": "آیتم موجودی با موفقیت ایجاد شد." + }, + "reservation": { + "header": "رزرو {{itemName}}", + "editItemDetails": "ویرایش", + "lineItemId": "شناسه آیتم خط", + "orderID": "شناسه سفارش", + "description": "توضیحات", + "location": "مکان", + "inStockAtLocation": "موجود در این مکان", + "availableAtLocation": "موجود در این مکان", + "reservedAtLocation": "رزرو شده در این مکان", + "reservedAmount": "مقدار رزرو", + "create": "ایجاد رزرو", + "itemToReserve": "آیتم برای رزرو", + "quantityPlaceholder": "چقدر می‌خواهید رزرو کنید؟", + "descriptionPlaceholder": "این رزرو چه نوعی است؟", + "successToast": "رزرو با موفقیت ایجاد شد.", + "updateSuccessToast": "رزرو با موفقیت به‌روزرسانی شد.", + "deleteSuccessToast": "رزرو با موفقیت حذف شد.", + "errors": { + "noAvaliableQuantity": "این مکان موجودی ندارد.", + "quantityOutOfRange": "حداقل مقدار ۱ و حداکثر مقدار {{max}} است." + } + }, + "adjustInventory": { + "errors": { + "stockedQuantity": "مقدار موجودی نمی‌تواند کمتر از مقدار رزرو شده‌ی {{quantity}} باشد." + } + }, + "toast": { + "updateLocations": "مکان‌ها با موفقیت به‌روزرسانی شدند.", + "updateLevel": "میزان موجودی با موفقیت به‌روزرسانی شد.", + "updateItem": "آیتم موجودی با موفقیت به‌روزرسانی شد." + }, + "stock": { + "title": "به‌روزرسانی میزان موجودی", + "description": "میزان موجودی برای آیتم‌های انتخاب شده را به‌روزرسانی کنید.", + "action": "ویرایش میزان موجودی", + "placeholder": "غیرفعال شده", + "disablePrompt_one": "شما در حال غیرفعال کردن سطح {{count}} مکان هستید. این عمل قابل بازگشت نیست.", + "disablePrompt_other": "شما در حال غیرفعال کردن سطح {{count}} مکان‌ هستید. این عمل قابل بازگشت نیست.", + "disabledToggleTooltip": "غیرفعال کردن امکان‌پذیر نیست: مقدار ورودی و/یا رزرو را قبل از غیرفعال کردن پاک کنید.", + "successToast": "سطح موجودی با موفقیت به‌روزرسانی شد." + } + }, + "giftCards": { + "domain": "کارت‌های هدیه", + "editGiftCard": "ویرایش کارت هدیه", + "createGiftCard": "ایجاد کارت هدیه", + "createGiftCardHint": "کارت هدیه‌ای به صورت دستی ایجاد کنید که به عنوان روش پرداخت در فروشگاه شما استفاده شود.", + "selectRegionFirst": "اول منطقه را انتخاب کنید", + "deleteGiftCardWarning": "شما در حال حذف کارت هدیه {{code}} هستید. این عمل قابل بازگشت نیست.", + "balanceHigherThanValue": "موجودی نمی‌تواند بیشتر از مبلغ اصلی باشد.", + "balanceLowerThanZero": "موجودی نمی‌تواند منفی باشد.", + "expiryDateHint": "کشورها قوانین مختلفی در مورد تاریخ انقضای کارت هدیه دارند. قبل از تنظیم تاریخ انقضاء، مطمئن شوید که مقررات محلی را بررسی کرده‌اید.", + "regionHint": "تغییر منطقه کارت هدیه همچنین ارز آن را تغییر خواهد داد که ممکن است بر ارزش پولی آن تأثیر بگذارد.", + "enabledHint": "مشخص کنید که آیا کارت هدیه فعال است یا غیرفعال.", + "balance": "موجودی", + "currentBalance": "موجودی فعلی", + "initialBalance": "موجودی اولیه", + "personalMessage": "پیام شخصی", + "recipient": "گیرنده" + }, + "customers": { + "domain": "مشتریان", + "list": { + "noRecordsMessage": "مشتریان شما اینجا نمایش داده خواهند شد." + }, + "create": { + "header": "ایجاد مشتری", + "hint": "مشتری جدید ایجاد کرده و جزئیات آن را مدیریت کنید.", + "successToast": "مشتری {{email}} با موفقیت ایجاد شد." + }, + "groups": { + "label": "گروه‌های مشتریان", + "remove": "آیا مطمئنید که می‌خواهید مشتری را از گروه مشتریان \"{{name}}\" حذف کنید؟", + "removeMany": "آیا مطمئنید که می‌خواهید مشتری را از گروه‌های زیر حذف کنید: {{groups}}؟", + "alreadyAddedTooltip": "مشتری از قبل در این گروه مشتریان است.", + "list": { + "noRecordsMessage": "این مشتری به هیچ گروهی تعلق ندارد." + }, + "add": { + "success": "مشتری به گروه‌های: {{groups}} اضافه شد.", + "list": { + "noRecordsMessage": "لطفاً ابتدا یک گروه مشتری ایجاد کنید." + } + }, + "removed": { + "success": "مشتری از گروه‌های: {{groups}} حذف شد.", + "list": { + "noRecordsMessage": "لطفاً ابتدا یک گروه مشتری ایجاد کنید." + } + } + }, + "edit": { + "header": "ویرایش مشتری", + "emailDisabledTooltip": "آدرس ایمیل برای مشتریان ثبت‌نامی قابل تغییر نیست.", + "successToast": "مشتری {{email}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "title": "حذف مشتری", + "description": "شما در حال حذف مشتری {{email}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "مشتری {{email}} با موفقیت حذف شد." + }, + "fields": { + "guest": "مهمان", + "registered": "ثبت‌نام‌شده", + "groups": "گروه‌ها" + }, + "registered": "ثبت‌نام‌شده", + "guest": "مهمان", + "hasAccount": "حساب دارد" + }, + "customerGroups": { + "domain": "گروه‌های مشتریان", + "subtitle": "مشتریان را به گروه‌ها تقسیم کنید. گروه‌ها می‌توانند تبلیغات و قیمت‌های متفاوتی داشته باشند.", + "list": { + "empty": { + "heading": "گروه مشتری وجود ندارد", + "description": "گروه مشتری برای نمایش وجود ندارد." + }, + "filtered": { + "heading": "نتیجه‌ای یافت نشد", + "description": "هیچ گروه مشتری با معیارهای فیلتر فعلی مطابقت ندارد." + } + }, + "create": { + "header": "ایجاد گروه مشتری", + "hint": "یک گروه مشتری جدید ایجاد کنید تا مشتریان خود را بخش‌بندی کنید.", + "successToast": "گروه مشتری {{name}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش گروه مشتری", + "successToast": "گروه مشتری {{name}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "title": "حذف گروه مشتری", + "description": "شما در حال حذف گروه مشتری {{name}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "گروه مشتری {{name}} با موفقیت حذف شد." + }, + "customers": { + "alreadyAddedTooltip": "مشتری قبلاً به این گروه اضافه شده است.", + "add": { + "successToast_one": "مشتری با موفقیت به گروه اضافه شد.", + "successToast_other": "مشتریان با موفقیت به گروه اضافه شدند.", + "list": { + "noRecordsMessage": "لطفاً ابتدا یک مشتری ایجاد کنید." + } + }, + "remove": { + "title_one": "حذف مشتری", + "title_other": "حذف مشتریان", + "description_one": "شما در حال حذف {{count}} مشتری از گروه مشتریان هستید. این عمل قابل بازگشت نیست.", + "description_other": "شما در حال حذف {{count}} مشتری از گروه مشتریان هستید. این عمل قابل بازگشت نیست." + }, + "list": { + "noRecordsMessage": "این گروه مشتری ندارد." + } + } + }, + "orders": { + "domain": "سفارشات", + "claim": "ادعا", + "exchange": "تعویض", + "return": "بازگشت", + "cancelWarning": "شما در حال لغو سفارش {{id}} هستید. این عمل قابل بازگشت نیست.", + "orderCanceled": "سفارش با موفقیت لغو شد", + "onDateFromSalesChannel": "{{date}} از {{salesChannel}}", + "list": { + "noRecordsMessage": "سفارشات شما اینجا نمایش داده خواهند شد." + }, + "status": { + "not_paid": "پرداخت نشده", + "pending": "در انتظار", + "completed": "تکمیل شده", + "draft": "پیش‌نویس", + "archived": "بایگانی شده", + "canceled": "لغو شده", + "requires_action": "نیاز به اقدام" + }, + "summary": { + "requestReturn": "درخواست بازگشت", + "allocateItems": "اختصاص آیتم‌ها", + "editOrder": "ویرایش سفارش", + "editOrderContinue": "ادامه ویرایش سفارش", + "inventoryKit": "شامل {{count}} آیتم موجودی", + "itemTotal": "جمع آیتم‌ها", + "shippingTotal": "جمع حمل و نقل", + "discountTotal": "جمع تخفیف", + "taxTotalIncl": "جمع مالیات (شامل)", + "itemSubtotal": "جمع فرعی آیتم‌ها", + "shippingSubtotal": "جمع فرعی حمل و نقل", + "discountSubtotal": "جمع فرعی تخفیف", + "taxTotal": "جمع مالیات" + }, + "transfer": { + "title": "انتقال مالکیت", + "requestSuccess": "درخواست انتقال سفارش به {{email}} ارسال شد.", + "currentOwner": "مالک فعلی", + "newOwner": "مالک جدید", + "currentOwnerDescription": "مشتری که در حال حاضر به این سفارش مرتبط است.", + "newOwnerDescription": "مشتری که سفارش به او منتقل می‌شود." + }, + "payment": { + "title": "پرداخت‌ها", + "isReadyToBeCaptured": "پرداخت <0/> آماده برای ثبت است.", + "totalPaidByCustomer": "مجموع پرداختی توسط مشتری", + "capture": "ثبت پرداخت", + "capture_short": "ثبت", + "refund": "استرداد", + "markAsPaid": "علامت‌گذاری به عنوان پرداخت‌شده", + "statusLabel": "وضعیت پرداخت", + "statusTitle": "وضعیت پرداخت", + "status": { + "notPaid": "پرداخت نشده", + "authorized": "موجودی کافی", + "partiallyAuthorized": "موجودی ناکافی", + "awaiting": "در انتظار", + "captured": "پرداخت شده", + "partiallyRefunded": "بخشی از مبلغ مسترد شده", + "partiallyCaptured": "بخشی از مبلغ پرداخت شده", + "refunded": "مسترد شده", + "canceled": "لغو شده", + "requiresAction": "نیاز به اقدام" + }, + "capturePayment": "مبلغ {{amount}} از مشتری دریافت خواهد شد.", + "capturePaymentSuccess": "مبلغ {{amount}} با موفقیت دریافت شد", + "markAsPaidPayment": "مبلغ {{amount}} به عنوان پرداخت‌ شده ثبت خواهد شد.", + "markAsPaidPaymentSuccess": "مبلغ {{amount}} با موفقیت به عنوان پرداخت شده ثبت شد", + "createRefund": "ایجاد استرداد", + "refundPaymentSuccess": "استرداد مبلغ {{amount}} با موفقیت انجام شد", + "createRefundWrongQuantity": "مقدار باید عددی بین 1 و {{number}} باشد", + "refundAmount": "استرداد {{amount}}", + "paymentLink": "لینک پرداخت برای {{amount}} را کپی کنید", + "selectPaymentToRefund": "پرداخت را برای استرداد انتخاب کنید" + }, + "edits": { + "title": "ویرایش سفارش", + "confirm": "تأیید ویرایش", + "confirmText": "شما در حال تأیید ویرایش سفارش هستید. این عمل قابل بازگشت نیست.", + "cancel": "لغو ویرایش", + "currentItems": "آیتم‌های فعلی", + "currentItemsDescription": "مقدار آیتم‌ها را تنظیم یا حذف کنید.", + "addItemsDescription": "شما می‌توانید آیتم‌های جدیدی به سفارش اضافه کنید.", + "addItems": "افزودن آیتم‌ها", + "amountPaid": "مقدار پرداخت ‌شده", + "newTotal": "مجموع جدید", + "differenceDue": "تفاوت بدهی", + "create": "ویرایش سفارش", + "currentTotal": "مجموع فعلی", + "noteHint": "یادداشت داخلی برای ویرایش اضافه کنید", + "cancelSuccessToast": "ویرایش سفارش لغو شد", + "createSuccessToast": "درخواست ویرایش سفارش ایجاد شد", + "activeChangeError": "در حال حاضر تغییری فعال روی سفارش (بازگشت، ادعا، تعویض و غیره) وجود دارد. لطفاً تغییرات را تکمیل یا لغو کنید قبل از اینکه سفارش را ویرایش کنید.", + "panel": { + "title": "درخواست ویرایش سفارش شده است", + "titlePending": "در انتظار ویرایش سفارش" + }, + "toast": { + "canceledSuccessfully": "ویرایش سفارش لغو شد", + "confirmedSuccessfully": "ویرایش سفارش تأیید شد" + }, + "validation": { + "quantityLowerThanFulfillment": "نمی‌توان مقدار را کمتر از یا برابر با مقدار انجام‌شده تنظیم کرد" + } + }, + "edit": { + "email": { + "title": "ویرایش ایمیل", + "requestSuccess": "ایمیل سفارش به {{email}} به‌روزرسانی شد." + }, + "shippingAddress": { + "title": "ویرایش آدرس ارسال", + "requestSuccess": "آدرس ارسال سفارش به‌روزرسانی شد." + }, + "billingAddress": { + "title": "ویرایش آدرس صورتحساب", + "requestSuccess": "آدرس صورتحساب سفارش به‌روزرسانی شد." + } + }, + "returns": { + "create": "ایجاد مرجوعی", + "confirm": "تأیید مرجوعی", + "confirmText": "شما در حال تأیید یک مرجوعی هستید. این عمل قابل بازگشت نیست.", + "inbound": "بازگشتی", + "outbound": "ارسالی", + "sendNotification": "ارسال اطلاع‌رسانی", + "sendNotificationHint": "به مشتری درباره مرجوعی اطلاع دهید.", + "returnTotal": "مجموع مرجوعی", + "inboundTotal": "مجموع بازگشتی", + "refundAmount": "مبلغ بازپرداخت", + "outstandingAmount": "مبلغ باقی‌مانده", + "reason": "دلیل", + "reasonHint": "دلیل مرجوعی محصولات توسط مشتری را انتخاب کنید.", + "note": "یادداشت", + "noInventoryLevel": "میزان موجودی وجود ندارد", + "noInventoryLevelDesc": "مکان انتخاب شده میزان موجودی برای آیتم‌های انتخاب شده را ندارد. درخواست مرجوعی امکان‌پذیر است، اما تا زمانی که میزان موجودی برای مکان انتخاب شده ایجاد نشود، دریافت آن امکان‌پذیر نخواهد بود.", + "noteHint": "در صورت نیاز می‌توانید آزادانه تایپ کنید.", + "location": "مکان", + "locationHint": "مکانی که می‌خواهید محصولات به آن مرجوع شوند را انتخاب کنید.", + "inboundShipping": "حمل و نقل بازگشتی", + "inboundShippingHint": "روشی که می‌خواهید استفاده کنید را انتخاب کنید.", + "returnableQuantityLabel": "تعداد قابل مرجوع", + "refundableAmountLabel": "مبلغ قابل بازپرداخت", + "returnRequestedInfo": "برای {{requestedItemsCount}}x آیتم درخواست مرجوعی داده شد", + "returnReceivedInfo": "{{requestedItemsCount}}x آیتم مرجوعی دریافت شد", + "itemReceived": "آیتم‌های دریافت شده", + "returnRequested": "درخواست مرجوعی داده شد", + "damagedItemReceived": "آیتم‌های آسیب‌ دیده‌ی دریافت شد", + "damagedItemsReturned": "{{quantity}}x آیتم‌ آسیب‌ دیده مرجوع شد", + "activeChangeError": "یک تغییر فعال در حال انجام روی این سفارش وجود دارد. لطفاً ابتدا آن تغییر را تکمیل یا لغو کنید.", + "cancel": { + "title": "لغو مرجوعی", + "description": "آیا مطمئن هستید که می‌خواهید درخواست مرجوعی را لغو کنید؟" + }, + "placeholders": { + "noReturnShippingOptions": { + "title": "هیچ گزینه حمل و نقل مرجوعی یافت نشد", + "hint": "هیچ گزینه حمل و نقل مرجوعی برای این مکان ایجاد نشده است. می‌توانید یکی در مکان و حمل و نقل ایجاد کنید." + }, + "outboundShippingOptions": { + "title": "هیچ گزینه حمل و نقلی برای ارسال یافت نشد", + "hint": "هیچ گزینه حمل و نقلی برای ارسال از این مکان ایجاد نشده است. می‌توانید یکی در مکان و حمل و نقل ایجاد کنید." + } + }, + "receive": { + "action": "دریافت آیتم‌ها", + "receiveItems": "{{ returnType }} {{ id }}", + "restockAll": "بازگرداندن همه‌ی آیتم‌ها به انبار", + "itemsLabel": "آیتم‌های دریافت شده", + "title": "دریافت آیتم‌ها برای #{{returnId}}", + "sendNotificationHint": "به مشتری درباره دریافت مرجوعی اطلاع دهید.", + "inventoryWarning": "لطفاً توجه داشته باشید که ما به‌طور خودکار سطح موجودی را بر اساس بازگشتی شما تنظیم خواهیم کرد.", + "writeOffInputLabel": "چند آیتم آسیب دیده است؟", + "toast": { + "success": "مرجوعی با موفقیت دریافت شد.", + "errorLargeValue": "تعداد درخواست شده از میزان موجودی بیشتر است.", + "errorNegativeValue": "تعداد نمی‌تواند مقدار منفی باشد.", + "errorLargeDamagedValue": "تعداد آیتم‌های آسیب‌دیده + تعداد آیتم‌های دریافت شده بدون آسیب از کل تعداد آیتم‌های مرجوعی بیشتر است. لطفاً تعداد آیتم‌های بدون آسیب را کاهش دهید." + } + }, + "toast": { + "canceledSuccessfully": "مرجوعی با موفقیت لغو شد", + "confirmedSuccessfully": "مرجوعی با موفقیت تأیید شد" + }, + "panel": { + "title": "مرجوعی آغاز شد", + "description": "یک درخواست مرجوعی باز برای تکمیل وجود دارد" + } + }, + "claims": { + "create": "ایجاد ادعا", + "confirm": "تأیید ادعا", + "confirmText": "شما در حال تأیید یک ادعا هستید. این عمل قابل بازگشت نیست.", + "manage": "مدیریت ادعا", + "outbound": "ارسالی", + "outboundItemAdded": "{{itemsCount}}x از طریق ادعا اضافه شد", + "outboundTotal": "مجموع ارسالی", + "outboundShipping": "حمل و نقل ارسالی", + "outboundShippingHint": "روشی که می‌خواهید استفاده کنید را انتخاب کنید.", + "refundAmount": "تفاوت تخمینی", + "activeChangeError": "یک تغییر فعال روی این سفارش وجود دارد. لطفاً ابتدا تغییر قبلی را تکمیل یا لغو کنید.", + "actions": { + "cancelClaim": { + "successToast": "ادعا با موفقیت لغو شد." + } + }, + "cancel": { + "title": "لغو ادعا", + "description": "آیا مطمئن هستید که می‌خواهید ادعا را لغو کنید؟" + }, + "tooltips": { + "onlyReturnShippingOptions": "این لیست فقط شامل گزینه‌های حمل و نقل مرجوعی خواهد بود." + }, + "toast": { + "canceledSuccessfully": "ادعا با موفقیت لغو شد", + "confirmedSuccessfully": "ادعا با موفقیت تأیید شد" + }, + "panel": { + "title": "ادعا آغاز شد", + "description": "یک درخواست ادعای باز برای تکمیل وجود دارد" + } + }, + "exchanges": { + "create": "ایجاد تعویض", + "manage": "مدیریت تعویض", + "confirm": "تأیید تعویض", + "confirmText": "شما در حال تأیید یک تعویض هستید. این عمل قابل بازگشت نیست.", + "outbound": "ارسالی", + "outboundItemAdded": "{{itemsCount}}x از طریق تعویض اضافه شد", + "outboundTotal": "مجموع ارسالی", + "outboundShipping": "حمل و نقل ارسالی", + "outboundShippingHint": "روشی که می‌خواهید استفاده کنید را انتخاب کنید.", + "refundAmount": "تفاوت تخمینی", + "activeChangeError": "یک تغییر فعال روی این سفارش وجود دارد. لطفاً ابتدا تغییر قبلی را تکمیل یا لغو کنید.", + "actions": { + "cancelExchange": { + "successToast": "تعویض با موفقیت لغو شد." + } + }, + "cancel": { + "title": "لغو تعویض", + "description": "آیا مطمئن هستید که می‌خواهید تعویض را لغو کنید؟" + }, + "tooltips": { + "onlyReturnShippingOptions": "این لیست فقط شامل گزینه‌های حمل و نقل مرجوعی خواهد بود." + }, + "toast": { + "canceledSuccessfully": "تعویض با موفقیت لغو شد", + "confirmedSuccessfully": "تعویض با موفقیت تأیید شد" + }, + "panel": { + "title": "تعویض آغاز شد", + "description": "یک درخواست تعویض باز برای تکمیل وجود دارد" + } + }, + "reservations": { + "allocatedLabel": "تخصیص داده شده", + "notAllocatedLabel": "تخصیص داده نشده" + }, + "allocateItems": { + "action": "تخصیص آیتم‌ها", + "title": "تخصیص آیتم‌های سفارش", + "locationDescription": "مکانی که می‌خواهید از آن تخصیص دهید را انتخاب کنید.", + "itemsToAllocate": "آیتم‌ها برای تخصیص", + "itemsToAllocateDesc": "تعداد آیتم‌هایی که می‌خواهید تخصیص دهید را انتخاب کنید", + "search": "جستجوی آیتم‌ها", + "consistsOf": "شامل {{num}}x آیتم‌ موجودی", + "requires": "نیاز به {{num}} نوع برای هر آیتم", + "toast": { + "created": "آیتم‌ها با موفقیت تخصیص داده شدند" + }, + "error": { + "quantityNotAllocated": "آیتم‌های تخصیص‌ نشده وجود دارند." + } + }, + "shipment": { + "title": "علامت ‌گذاری به عنوان پردازش شده", + "trackingNumber": "شماره رهگیری", + "addTracking": "افزودن شماره رهگیری", + "sendNotification": "ارسال اطلاع‌رسانی", + "sendNotificationHint": "به مشتری درباره این ارسال اطلاع دهید.", + "toastCreated": "ارسال با موفقیت ایجاد شد." + }, + "fulfillment": { + "cancelWarning": "شما در حال لغو یک پردازش در حال اجرا هستید. این عمل قابل بازگشت نیست.", + "markAsDeliveredWarning": "شما در حال علامت‌گذاری یک پردازش به عنوان تحویل داده شده هستید. این عمل قابل بازگشت نیست.", + "unfulfilledItems": "آیتم‌های پردازش نشده", + "statusLabel": "وضعیت پردازش", + "statusTitle": "وضعیت پردازش", + "fulfillItems": "آیتم‌های پردازش", + "awaitingFulfillmentBadge": "در انتظار پردازش", + "requiresShipping": "نیاز به حمل و نقل", + "number": "پردازش #{{number}}", + "itemsToFulfill": "آیتم‌ها برای پردازش", + "create": "ایجاد پردازش", + "available": "موجود", + "inStock": "در انبار", + "markAsShipped": "علامت‌گذاری به عنوان ارسال شده", + "markAsDelivered": "علامت‌گذاری به عنوان تحویل داده شده", + "itemsToFulfillDesc": "آیتم‌ها و تعداد آن‌ها را برای پردازش انتخاب کنید", + "locationDescription": "مکانی که می‌خواهید پردازش را انجام دهد انتخاب کنید.", + "sendNotificationHint": "به مشتریان درباره پردازش ایجاد شده اطلاع دهید.", + "methodDescription": "یک روش حمل و نقل متفاوت از روش انتخاب شده توسط مشتری انتخاب کنید", + "error": { + "wrongQuantity": "فقط یک آیتم برای پردازش موجود است", + "wrongQuantity_other": "تعداد باید بین 1 و {{number}} باشد", + "noItems": "هیچ آیتمی برای پردازش وجود ندارد." + }, + "status": { + "notFulfilled": "پردازش نشده", + "partiallyFulfilled": "بخشی از سفارش پردازش شده", + "fulfilled": "پردازش شده", + "partiallyShipped": "بخشی از سفارش ارسال شده", + "shipped": "ارسال شده", + "delivered": "تحویل داده شده", + "partiallyDelivered": "بخشی از سفارش تحویل داده شده", + "partiallyReturned": "بخشی از سفارش مرجوع شده", + "returned": "مرجوع شده", + "canceled": "لغو شده", + "requiresAction": "نیاز به اقدام" + }, + "toast": { + "created": "پردازش با موفقیت ایجاد شد", + "canceled": "پردازش با موفقیت لغو شد", + "fulfillmentShipped": "امکان لغو سفارشی که قبلاً ارسال شده است وجود ندارد", + "fulfillmentDelivered": "پردازش با موفقیت به عنوان تحویل داده شده علامت‌گذاری شد" + }, + "trackingLabel": "رهگیری", + "shippingFromLabel": "ارسال از", + "itemsLabel": "آیتم‌ها" + }, + "refund": { + "title": "ایجاد بازپرداخت", + "sendNotificationHint": "به مشتریان درباره بازپرداخت ایجاد شده اطلاع دهید.", + "systemPayment": "پرداخت سیستم", + "systemPaymentDesc": "یک یا چند پرداخت شما پرداخت سیستم است. توجه داشته باشید که برای چنین پرداخت‌هایی، دریافت و بازپرداخت توسط ما انجام نمی‌شود.", + "error": { + "amountToLarge": "امکان بازپرداخت بیشتر از مبلغ سفارش اصلی وجود ندارد.", + "amountNegative": "مبلغ بازپرداخت باید یک عدد مثبت باشد.", + "reasonRequired": "لطفاً دلیل بازپرداخت را انتخاب کنید." + } + }, + "customer": { + "contactLabel": "تماس", + "editEmail": "ویرایش ایمیل", + "transferOwnership": "انتقال مالکیت", + "editBillingAddress": "ویرایش آدرس صورتحساب", + "editShippingAddress": "ویرایش آدرس حمل ‌و نقل" + }, + "activity": { + "header": "فعالیت", + "showMoreActivities_one": "نمایش {{count}} فعالیت بیشتر", + "showMoreActivities_other": "نمایش {{count}} فعالیت بیشتر", + "comment": { + "label": "نظر", + "placeholder": "یک نظر بگذارید", + "addButtonText": "افزودن نظر", + "deleteButtonText": "حذف نظر" + }, + "from": "از", + "to": "به", + "events": { + "common": { + "toReturn": "برای مرجوعی", + "toSend": "برای ارسال" + }, + "placed": { + "title": "سفارش ثبت شد", + "fromSalesChannel": "از {{salesChannel}}" + }, + "canceled": { + "title": "سفارش لغو شد" + }, + "payment": { + "awaiting": "در انتظار پرداخت", + "captured": "پرداخت شد", + "canceled": "پرداخت لغو شد", + "refunded": "بازپرداخت انجام شد" + }, + "fulfillment": { + "created": "آیتم‌ها پردازش شدند", + "canceled": "پردازش لغو شد", + "shipped": "آیتم‌ها ارسال شدند", + "delivered": "آیتم‌ها تحویل داده شدند", + "items_one": "{{count}} آیتم", + "items_other": "{{count}} آیتم‌" + }, + "return": { + "created": "درخواست مرجوعی #{{returnId}} ثبت شد", + "canceled": "مرجوعی #{{returnId}} لغو شد", + "received": "مرجوعی #{{returnId}} دریافت شد", + "items_one": "{{count}} آیتم مرجوع شد", + "items_other": "{{count}} آیتم‌ مرجوع شد" + }, + "note": { + "comment": "نظر", + "byLine": "توسط {{author}}" + }, + "claim": { + "created": "درخواست ادعا #{{claimId}} ثبت شد", + "canceled": "ادعا #{{claimId}} لغو شد", + "itemsInbound": "{{count}} آیتم برای مرجوعی", + "itemsOutbound": "{{count}} آیتم برای ارسال" + }, + "exchange": { + "created": "درخواست تعویض #{{exchangeId}} ثبت شد", + "canceled": "تعویض #{{exchangeId}} لغو شد", + "itemsInbound": "{{count}} آیتم برای مرجوعی", + "itemsOutbound": "{{count}} آیتم برای ارسال" + }, + "edit": { + "requested": "درخواست ویرایش سفارش #{{editId}} ثبت شد", + "confirmed": "ویرایش سفارش #{{editId}} تأیید شد" + }, + "transfer": { + "requested": "درخواست انتقال سفارش #{{transferId}} ثبت شد", + "confirmed": "انتقال سفارش #{{transferId}} تأیید شد", + "declined": "انتقال سفارش #{{transferId}} رد شد" + }, + "update_order": { + "shipping_address": "آدرس حمل‌ و نقل به‌روزرسانی شد", + "billing_address": "آدرس صورتحساب به‌روزرسانی شد", + "email": "ایمیل به‌روزرسانی شد" + } + } + }, + "fields": { + "displayId": "شناسه نمایشی", + "refundableAmount": "مبلغ قابل بازپرداخت", + "returnableQuantity": "تعداد قابل مرجوع" + } + }, + "draftOrders": { + "domain": "سفارشات پیش‌نویس", + "deleteWarning": "شما در حال حذف سفارش پیش‌نویس {{id}} هستید. این عمل قابل بازگشت نیست.", + "paymentLinkLabel": "لینک پرداخت", + "cartIdLabel": "شناسه سبد خرید", + "markAsPaid": { + "label": "علامت‌گذاری به عنوان پرداخت شده", + "warningTitle": "علامت‌گذاری به عنوان پرداخت شده", + "warningDescription": "شما در حال علامت‌گذاری سفارش پیش‌نویس به عنوان پرداخت شده هستید. این عمل قابل بازگشت نیست و جمع‌آوری پرداخت بعداً امکان‌پذیر نخواهد بود." + }, + "status": { + "open": "باز", + "completed": "تکمیل شده" + }, + "create": { + "createDraftOrder": "ایجاد سفارش پیش‌نویس", + "createDraftOrderHint": "یک سفارش پیش‌نویس جدید ایجاد کنید تا جزئیات سفارش را قبل از ثبت مدیریت کنید.", + "chooseRegionHint": "منطقه را انتخاب کنید", + "existingItemsLabel": "آیتم‌های موجود", + "existingItemsHint": "محصولات موجود را به سفارش پیش‌نویس اضافه کنید.", + "customItemsLabel": "آیتم‌های سفارشی", + "customItemsHint": "آیتم‌های سفارشی را به سفارش پیش‌نویس اضافه کنید.", + "addExistingItemsAction": "افزودن آیتم‌های موجود", + "addCustomItemAction": "افزودن آیتم سفارشی", + "noCustomItemsAddedLabel": "هنوز هیچ آیتم سفارشی اضافه نشده است", + "noExistingItemsAddedLabel": "هنوز هیچ آیتم موجودی اضافه نشده است", + "chooseRegionTooltip": "ابتدا یک منطقه انتخاب کنید", + "useExistingCustomerLabel": "استفاده از مشتری موجود", + "addShippingMethodsAction": "افزودن روش‌های حمل‌ و نقل", + "unitPriceOverrideLabel": "تغییر قیمت واحد", + "shippingOptionLabel": "گزینه حمل و نقل", + "shippingOptionHint": "گزینه حمل و نقل را برای سفارش پیش‌نویس انتخاب کنید.", + "shippingPriceOverrideLabel": "تغییر قیمت حمل‌ و نقل", + "shippingPriceOverrideHint": "قیمت حمل‌ و نقل را برای سفارش پیش‌نویس تغییر دهید.", + "sendNotificationLabel": "ارسال اطلاع‌رسانی", + "sendNotificationHint": "هنگام ایجاد سفارش پیش‌نویس به مشتری اطلاع دهید." + }, + "validation": { + "requiredEmailOrCustomer": "ایمیل یا مشتری الزامی است.", + "requiredItems": "حداقل یک آیتم الزامی است.", + "invalidEmail": "ایمیل باید یک آدرس ایمیل معتبر باشد." + } + }, + "stockLocations": { + "domain": "مکان‌ها و حمل‌ و نقل", + "list": { + "description": "مکان‌های موجودی و گزینه‌های حمل‌ و نقل فروشگاه خود را مدیریت کنید." + }, + "create": { + "header": "ایجاد مکان موجودی", + "hint": "مکان موجودی یک انبار، فروشگاه فیزیکی، مرکز توزیع یا نمایندگی فروش است که محصولات در آن ذخیره و از آن ارسال می‌شوند.", + "successToast": "مکان {{name}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش مکان موجودی", + "viewInventory": "مشاهده موجودی", + "successToast": "مکان {{name}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "confirmation": "شما در حال حذف مکان موجودی {{name}} هستید. این عمل قابل بازگشت نیست." + }, + "fulfillmentProviders": { + "header": "ارائه‌ دهندگان پردازش", + "shippingOptionsTooltip": "این لیست فقط شامل ارائه‌دهندگانی است که برای این مکان فعال شده‌اند. اگر لیست غیرفعال است، آن‌ها را به این مکان اضافه کنید.", + "label": "ارائه‌دهندگان پردازش متصل", + "connectedTo": "متصل به {{count}} از {{total}} ارائه‌دهندگان پردازش", + "noProviders": "این مکان موجودی به هیچ ارائه‌دهنده پردازشی متصل نیست.", + "action": "اتصال ارائه‌ دهندگان", + "successToast": "ارائه‌ دهندگان پردازش برای مکان موجودی با موفقیت به‌روزرسانی شدند." + }, + "fulfillmentSets": { + "pickup": { + "header": "تحویل حضوری" + }, + "shipping": { + "header": "حمل و نقل" + }, + "disable": { + "confirmation": "آیا مطمئن هستید که می‌خواهید {{name}} را غیرفعال کنید؟ این عمل تمام مناطق سرویس و گزینه‌های حمل و نقل مرتبط را حذف می‌کند و قابل بازگشت نیست.", + "pickup": "تحویل حضوری با موفقیت غیرفعال شد.", + "shipping": "حمل و نقل با موفقیت غیرفعال شد." + }, + "enable": { + "pickup": "تحویل حضوری با موفقیت فعال شد.", + "shipping": "حمل و نقل با موفقیت فعال شد." + } + }, + "sidebar": { + "header": "پیکربندی حمل و نقل", + "shippingProfiles": { + "label": "پروفایل‌های حمل و نقل", + "description": "محصولات را بر اساس نیازهای حمل و نقل گروه‌بندی کنید" + } + }, + "salesChannels": { + "header": "کانال‌های فروش", + "label": "کانال‌های فروش متصل", + "connectedTo": "متصل به {{count}} از {{total}} کانال‌ فروش", + "noChannels": "این مکان به هیچ کانال فروشی متصل نیست.", + "action": "اتصال کانال‌های فروش", + "successToast": "کانال‌های فروش با موفقیت به‌روزرسانی شدند." + }, + "shippingOptions": { + "create": { + "shipping": { + "header": "ایجاد گزینه حمل‌ و نقل برای {{zone}}", + "hint": "یک گزینه حمل و نقل جدید ایجاد کنید تا نحوه‌ی ارسال محصولات از این مکان را تعریف کنید.", + "label": "گزینه‌های حمل‌ و نقل", + "successToast": "گزینه حمل‌ و نقل {{name}} با موفقیت ایجاد شد." + }, + "returns": { + "header": "ایجاد گزینه مرجوعی برای {{zone}}", + "hint": "یک گزینه مرجوعی جدید ایجاد کنید تا نحوه بازگشت محصولات به این مکان را تعریف کنید.", + "label": "گزینه‌های مرجوعی", + "successToast": "گزینه مرجوعی {{name}} با موفقیت ایجاد شد." + }, + "tabs": { + "details": "جزئیات", + "prices": "قیمت‌ها" + }, + "action": "ایجاد گزینه" + }, + "delete": { + "confirmation": "شما در حال حذف گزینه حمل‌ و نقل {{name}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "گزینه حمل‌ و نقل {{name}} با موفقیت حذف شد." + }, + "edit": { + "header": "ویرایش گزینه حمل و نقل", + "action": "ویرایش گزینه", + "successToast": "گزینه حمل و نقل {{name}} با موفقیت به‌روزرسانی شد." + }, + "pricing": { + "action": "ویرایش قیمت‌ها" + }, + "conditionalPrices": { + "header": "قیمت‌های شرطی برای {{name}}", + "description": "هزینه‌ی این گزینه‌ی حمل و نقل را بر اساس مجموع آیتم‌های سبد خرید مدیریت کنید.", + "attributes": { + "cartItemTotal": "مجموع آیتم‌های سبد خرید" + }, + "summaries": { + "range": "اگر <0>{{attribute}} بین <1>{{gte}} و <2>{{lte}} باشد", + "greaterThan": "اگر <0>{{attribute}} ≥ <1>{{gte}} باشد", + "lessThan": "اگر <0>{{attribute}} ≤ <1>{{lte}} باشد" + }, + "actions": { + "addPrice": "افزودن قیمت", + "manageConditionalPrices": "مدیریت قیمت‌های شرطی" + }, + "rules": { + "amount": "قیمت گزینه حمل و نقل", + "gte": "حداقل مجموع آیتم‌های سبد خرید", + "lte": "حداکثر مجموع آیتم‌های سبد خرید" + }, + "customRules": { + "label": "قوانین سفارشی", + "tooltip": "این قیمت شرطی قوانینی دارد که در داشبورد قابل مدیریت نیستند.", + "eq": "مجموع آیتم‌های سبد خرید باید برابر باشد", + "gt": "مجموع آیتم‌های سبد خرید باید بیشتر باشد", + "lt": "مجموع آیتم‌های سبد خرید باید کمتر باشد" + }, + "errors": { + "amountRequired": "قیمت گزینه حمل و نقل الزامی است", + "minOrMaxRequired": "حداقل یکی از موارد حداقل یا حداکثر مجموع آیتم‌های سبد خرید باید ارائه شود", + "minGreaterThanMax": "حداقل مجموع آیتم‌های سبد خرید باید کمتر یا مساوی حداکثر باشد", + "duplicateAmount": "قیمت گزینه حمل و نقل باید برای هر شرط منحصر به فرد باشد", + "overlappingConditions": "شرایط باید در تمام قوانین قیمت منحصر به فرد باشند" + } + }, + "fields": { + "count": { + "shipping_one": "{{count}} گزینه حمل و نقل", + "shipping_other": "{{count}} گزینه‌ حمل و نقل", + "returns_one": "{{count}} گزینه مرجوعی", + "returns_other": "{{count}} گزینه‌ مرجوعی" + }, + "priceType": { + "label": "نوع قیمت", + "options": { + "fixed": { + "label": "ثابت", + "hint": "قیمت گزینه حمل و نقل ثابت است و بر اساس محتوای سفارش تغییر نمی‌کند." + }, + "calculated": { + "label": "محاسبه‌ شده", + "hint": "قیمت گزینه حمل و نقل توسط ارائه‌ دهنده پردازش در هنگام تسویه‌ حساب محاسبه می‌شود." + } + } + }, + "enableInStore": { + "label": "فعال‌سازی در فروشگاه", + "hint": "آیا مشتریان می‌توانند از این گزینه در هنگام تسویه‌ حساب استفاده کنند." + }, + "provider": "ارائه‌دهنده پردازش", + "profile": "پروفایل حمل و نقل", + "fulfillmentOption": "گزینه پردازش" + } + }, + "serviceZones": { + "create": { + "headerPickup": "ایجاد منطقه سرویس‌دهی برای تحویل حضوری از {{location}}", + "headerShipping": "ایجاد منطقه سرویس‌دهی برای حمل و نقل از {{location}}", + "action": "ایجاد منطقه سرویس‌دهی", + "successToast": "منطقه سرویس {{name}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش منطقه سرویس‌دهی", + "successToast": "منطقه سروی‌دهی {{name}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "confirmation": "شما در حال حذف منطقه سرویس‌دهی {{name}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "منطقه سرویس‌دهی {{name}} با موفقیت حذف شد." + }, + "manageAreas": { + "header": "مدیریت مناطق برای {{name}}", + "action": "مدیریت مناطق", + "label": "مناطق", + "hint": "مناطق جغرافیایی که منطقه سرویس‌دهی پوشش می‌دهد را انتخاب کنید.", + "successToast": "مناطق برای {{name}} با موفقیت به‌روزرسانی شدند." + }, + "fields": { + "noRecords": "هیچ منطقه سرویسی‌دهی برای افزودن گزینه‌های حمل و نقل وجود ندارد.", + "tip": "منطقه سرویس‌دهی مجموعه‌ای از مناطق جغرافیایی است. از آن برای محدود کردن گزینه‌های حمل و نقل به مجموعه‌ای از مکان‌ها استفاده می‌شود." + } + } + }, + "shippingProfile": { + "domain": "پروفایل‌های حمل و نقل", + "subtitle": "محصولات با نیازهای حمل و نقل مشابه را در پروفایل‌ها گروه‌بندی کنید.", + "create": { + "header": "ایجاد پروفایل حمل و نقل", + "hint": "یک پروفایل حمل و نقل جدید ایجاد کنید تا محصولات با نیازهای حمل و نقل مشابه را گروه‌بندی کنید.", + "successToast": "پروفایل حمل و نقل {{name}} با موفقیت ایجاد شد." + }, + "delete": { + "title": "حذف پروفایل حمل و نقل", + "description": "شما در حال حذف پروفایل حمل و نقل {{name}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "پروفایل حمل و نقل {{name}} با موفقیت حذف شد." + }, + "tooltip": { + "type": "نوع پروفایل حمل و نقل را وارد کنید، به عنوان مثال: سنگین، بزرگ‌اندازه، فقط باربری و غیره." + } + }, + "taxRegions": { + "domain": "مناطق مالیاتی", + "list": { + "hint": "مدیریت هزینه‌هایی که از مشتریان برای خرید از کشورهای مختلف و مناطق متفاوت دریافت می‌کنید." + }, + "delete": { + "confirmation": "شما در حال حذف یک منطقه مالیاتی هستید. این اقدام قابل بازگشت نیست.", + "successToast": "منطقه مالیاتی با موفقیت حذف شد." + }, + "create": { + "header": "ایجاد منطقه مالیاتی", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک کشور مشخص.", + "errors": { + "rateIsRequired": "نرخ مالیات هنگام ایجاد یک نرخ مالیاتی پیش‌فرض ضروری است.", + "nameIsRequired": "نام هنگام ایجاد یک نرخ مالیاتی پیش‌فرض ضروری است." + }, + "successToast": "منطقه مالیاتی با موفقیت ایجاد شد." + }, + "province": { + "header": "استان‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای استان", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک استان مشخص." + } + }, + "state": { + "header": "ایالت‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای ایالت", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک ایالت مشخص." + } + }, + "stateOrTerritory": { + "header": "ایالت یا قلمرو", + "create": { + "header": "ایجاد منطقه مالیاتی برای ایالت یا قلمرو", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک ایالت یا قلمرو مشخص." + } + }, + "county": { + "header": "شهرستان‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای شهرستان", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک شهرستان مشخص." + } + }, + "region": { + "header": "مناطق", + "create": { + "header": "ایجاد منطقه مالیاتی برای منطقه", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک منطقه مشخص." + } + }, + "department": { + "header": "بخش‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای بخش", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک بخش مشخص." + } + }, + "territory": { + "header": "قلمروها", + "create": { + "header": "ایجاد منطقه مالیاتی برای قلمرو", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک قلمرو مشخص." + } + }, + "prefecture": { + "header": "استان‌ها (Prefectures)", + "create": { + "header": "ایجاد منطقه مالیاتی برای استان (Prefecture)", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک استان مشخص (Prefecture)." + } + }, + "district": { + "header": "ناحیه‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای ناحیه", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک ناحیه مشخص." + } + }, + "governorate": { + "header": "استانداری‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای استانداری", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک استانداری مشخص." + } + }, + "canton": { + "header": "کانتون‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای کانتون", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک کانتون مشخص." + } + }, + "emirate": { + "header": "امارت‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای امارت", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک امارت مشخص." + } + }, + "sublevel": { + "header": "زیربخش‌ها", + "create": { + "header": "ایجاد منطقه مالیاتی برای زیربخش", + "hint": "ایجاد یک منطقه مالیاتی جدید برای تعریف نرخ‌های مالیاتی یک زیربخش مشخص." + } + }, + "taxOverrides": { + "header": "نرخ‌های جایگزین", + "create": { + "header": "ایجاد نرخ جایگزین", + "hint": "ایجاد یک نرخ مالیاتی که جایگزین نرخ‌های پیش‌فرض برای شرایط انتخاب‌شده باشد." + }, + "edit": { + "header": "ویرایش نرخ جایگزین", + "hint": "ویرایش نرخ مالیاتی که جایگزین نرخ‌های پیش‌فرض برای شرایط انتخاب‌شده باشد." + } + }, + "taxRates": { + "create": { + "header": "ایجاد نرخ مالیات", + "hint": "ایجاد یک نرخ مالیاتی جدید برای تعریف نرخ مالیاتی یک منطقه.", + "successToast": "نرخ مالیاتی با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش نرخ مالیات", + "hint": "ویرایش نرخ مالیاتی برای تعریف نرخ مالیاتی یک منطقه.", + "successToast": "نرخ مالیاتی با موفقیت به‌روزرسانی شد." + }, + "delete": { + "confirmation": "شما در حال حذف نرخ مالیاتی {{name}} هستید. این اقدام قابل بازگشت نیست.", + "successToast": "نرخ مالیاتی با موفقیت حذف شد." + } + }, + "fields": { + "isCombinable": { + "label": "ترکیب‌پذیر", + "hint": "آیا این نرخ مالیاتی می‌تواند با نرخ پیش‌فرض منطقه مالیاتی ترکیب شود یا خیر.", + "true": "ترکیب‌پذیر", + "false": "غیر ترکیب‌پذیر" + }, + "defaultTaxRate": { + "label": "نرخ مالیاتی پیش‌فرض", + "tooltip": "نرخ مالیاتی پیش‌فرض برای این منطقه. نمونه‌ای از آن نرخ استاندارد مالیات بر ارزش افزوده (VAT) برای یک کشور یا منطقه است.", + "action": "ایجاد نرخ مالیاتی پیش‌فرض" + }, + "taxRate": "نرخ مالیات", + "taxCode": "کد مالیاتی", + "targets": { + "label": "اهداف", + "hint": "اهداف مورد نظر که این نرخ مالیاتی بر آن‌ها اعمال می‌شود را انتخاب کنید.", + "options": { + "product": "محصولات", + "productCollection": "مجموعه محصولات", + "productTag": "برچسب محصولات", + "productType": "نوع محصولات", + "customerGroup": "گروه مشتریان" + }, + "operators": { + "in": "در", + "on": "بر", + "and": "و" + }, + "placeholders": { + "product": "محصولات را جستجو کنید", + "productCollection": "مجموعه محصولات را جستجو کنید", + "productTag": "برچسب‌های محصولات را جستجو کنید", + "productType": "نوع محصولات را جستجو کنید", + "customerGroup": "گروه‌های مشتریان را جستجو کنید" + }, + "tags": { + "product": "محصول", + "productCollection": "مجموعه محصول", + "productTag": "برچسب محصول", + "productType": "نوع محصول", + "customerGroup": "گروه مشتریان" + }, + "modal": { + "header": "اضافه کردن اهداف" + }, + "values_one": "{{count}} مقدار", + "values_other": "{{count}} مقادیر", + "numberOfTargets_one": "{{count}} هدف", + "numberOfTargets_other": "{{count}} اهداف", + "additionalValues_one": "و {{count}} مقدار دیگر", + "additionalValues_other": "و {{count}} مقادیر دیگر", + "action": "اضافه کردن هدف" + }, + "sublevels": { + "labels": { + "province": "استان", + "state": "ایالت", + "region": "منطقه", + "stateOrTerritory": "ایالت/قلمرو", + "department": "بخش", + "county": "شهرستان", + "territory": "قلمرو", + "prefecture": "استان (Prefecture)", + "district": "ناحیه", + "governorate": "استانداری", + "emirate": "امارت", + "canton": "کانتون", + "sublevel": "کد زیربخش" + }, + "placeholders": { + "province": "انتخاب استان", + "state": "انتخاب ایالت", + "region": "انتخاب منطقه", + "stateOrTerritory": "انتخاب ایالت/قلمرو", + "department": "انتخاب دپارتمان", + "county": "انتخاب شهرستان", + "territory": "انتخاب قلمرو", + "prefecture": "انتخاب استان (Prefecture)", + "district": "انتخاب ناحیه", + "governorate": "انتخاب استانداری", + "emirate": "انتخاب امارت", + "canton": "انتخاب کانتون" + }, + "tooltips": { + "sublevel": "کد ISO 3166-2 را برای منطقه مالیاتی سطح فرعی وارد کنید.", + "notPartOfCountry": "به نظر می‌رسد {{province}} بخشی از {{country}} نیست. لطفاً دوباره بررسی کنید که آیا این درست است یا خیر." + }, + "alert": { + "header": "زیربخش‌ها برای این منطقه مالیاتی غیرفعال هستند", + "description": "زیربخش‌های این منطقه به‌صورت پیش‌فرض غیرفعال هستند. می‌توانید آن‌ها را فعال کنید تا زیربخش‌هایی مانند استان‌ها، ایالت‌ها یا نواحی ایجاد کنید.", + "action": "فعال‌سازی زیربخش‌ها" + } + }, + "noDefaultRate": { + "label": "بدون نرخ پیش‌فرض", + "tooltip": "این منطقه مالیاتی نرخ مالیاتی پیش‌فرض ندارد. اگر نرخ استانداردی مانند VAT یک کشور وجود دارد، لطفاً آن را به این منطقه اضافه کنید." + } + } + }, + "promotions": { + "domain": "تبلیغات", + "sections": { + "details": "جزئیات تبلیغات" + }, + "tabs": { + "template": "نوع", + "details": "جزئیات", + "campaign": "کمپین" + }, + "fields": { + "type": "نوع", + "value_type": "نوع مقدار", + "value": "مقدار", + "campaign": "کمپین", + "method": "روش", + "allocation": "تخصیص", + "addCondition": "افزودن شرط", + "clearAll": "پاک کردن همه", + "amount": { + "tooltip": "کد ارز را انتخاب کنید تا امکان تنظیم مقدار فعال شود" + }, + "conditions": { + "rules": { + "title": "چه کسی می‌تواند از این کد استفاده کند؟", + "description": "کدام مشتری مجاز به استفاده از کد تبلیغاتی است؟ اگر تغییری داده نشود، کد تبلیغاتی توسط همه مشتریان قابل استفاده خواهد بود." + }, + "target-rules": { + "title": "این تبلیغ روی چه آیتم‌هایی اعمال می‌شود؟", + "description": "تبلیغ روی آیتم‌هایی اعمال می‌شود که با شرایط زیر مطابقت داشته باشند." + }, + "buy-rules": { + "title": "برای فعال‌سازی تبلیغ چه چیزی باید در سبد خرید باشد؟", + "description": "اگر این شرایط مطابقت داشته باشند، تبلیغ روی آیتم‌های هدف فعال می‌شود." + } + } + }, + "tooltips": { + "campaignType": "برای تنظیم بودجه، کد ارز باید در تبلیغ انتخاب شود." + }, + "errors": { + "requiredField": "فیلد الزامی", + "promotionTabError": "قبل از ادامه، خطاهای تب تبلیغات را برطرف کنید" + }, + "toasts": { + "promotionCreateSuccess": "تبلیغ ({{code}}) با موفقیت ایجاد شد." + }, + "create": {}, + "edit": { + "title": "ویرایش جزئیات تبلیغ", + "rules": { + "title": "ویرایش شرایط استفاده" + }, + "target-rules": { + "title": "ویرایش شرایط آیتم" + }, + "buy-rules": { + "title": "ویرایش قوانین خرید" + } + }, + "campaign": { + "header": "کمپین", + "edit": { + "header": "ویرایش کمپین", + "successToast": "کمپین تبلیغ با موفقیت به‌روزرسانی شد." + }, + "actions": { + "goToCampaign": "برو به کمپین" + } + }, + "campaign_currency": { + "tooltip": "این ارز تبلیغ است. آن را از تب جزئیات تغییر دهید." + }, + "form": { + "required": "الزامی", + "and": "و", + "selectAttribute": "انتخاب ویژگی", + "campaign": { + "existing": { + "title": "کمپین موجود", + "description": "تبلیغ را به یک کمپین موجود اضافه کنید.", + "placeholder": { + "title": "هیچ کمپین وجود ندارد", + "desc": "می‌توانید یکی ایجاد کنید تا چندین تبلیغ را ردیابی کرده و محدودیت بودجه تعیین کنید." + } + }, + "new": { + "title": "کمپین جدید", + "description": "یک کمپین جدید برای این تبلیغ ایجاد کنید." + }, + "none": { + "title": "بدون کمپین", + "description": "بدون اتصال تبلیغ با یک کمپین ادامه دهید" + } + }, + "status": { + "label": "وضعیت", + "draft": { + "title": "پیش‌نویس", + "description": "مشتریان هنوز نمی‌توانند از کد استفاده کنند" + }, + "active": { + "title": "فعال", + "description": "مشتریان می‌توانند از کد استفاده کنند" + }, + "inactive": { + "title": "غیرفعال", + "description": "مشتریان دیگر نمی‌توانند از کد استفاده کنند" + } + }, + "method": { + "label": "روش", + "code": { + "title": "کد تبلیغاتی", + "description": "مشتریان باید این کد را در هنگام تسویه‌حساب وارد کنند" + }, + "automatic": { + "title": "خودکار", + "description": "مشتریان این تبلیغ را در هنگام تسویه‌حساب مشاهده خواهند کرد" + } + }, + "max_quantity": { + "title": "حداکثر تعداد", + "description": "حداکثر تعداد آیتم‌هایی که این تبلیغ روی آن‌ها اعمال می‌شود." + }, + "type": { + "standard": { + "title": "استاندارد", + "description": "یک تبلیغ استاندارد" + }, + "buyget": { + "title": "خرید و دریافت", + "description": "تبلیغ خرید X و دریافت Y" + } + }, + "allocation": { + "each": { + "title": "هر کدام", + "description": "مقدار را روی هر آیتم به صورت جداگانه اعمال می‌کند" + }, + "across": { + "title": "بر روی همه", + "description": "مقدار را به صورت کلی بر روی همه آیتم‌ها اعمال می‌کند" + } + }, + "code": { + "title": "کد", + "description": "کدی که مشتریان شما در هنگام تسویه‌حساب وارد می‌کنند." + }, + "value": { + "title": "مقدار تبلیغ" + }, + "value_type": { + "fixed": { + "title": "مقدار تبلیغ", + "description": "مقداری که باید تخفیف داده شود. مثلاً 100" + }, + "percentage": { + "title": "مقدار تبلیغ", + "description": "درصدی که باید از مقدار تخفیف داده شود. مثلاً 8%" + } + } + }, + "deleteWarning": "شما در حال حذف تبلیغ {{code}} هستید. این عمل قابل بازگشت نیست.", + "createPromotionTitle": "ایجاد تبلیغ", + "type": "نوع تبلیغ", + "conditions": { + "add": "افزودن شرط", + "list": { + "noRecordsMessage": "یک شرط اضافه کنید تا محدودیت‌هایی برای اعمال تبلیغ روی آیتم‌ها تعیین کنید." + } + } + }, + "campaigns": { + "domain": "کمپین‌ها", + "details": "جزئیات کمپین", + "status": { + "active": "فعال", + "expired": "منقضی شده", + "scheduled": "زمان‌بندی شده" + }, + "delete": { + "title": "آیا مطمئن هستید؟", + "description": "شما در حال حذف کمپین '{{name}}' هستید. این عمل قابل بازگشت نیست.", + "successToast": "کمپین '{{name}}' با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش کمپین", + "description": "جزئیات کمپین را ویرایش کنید.", + "successToast": "کمپین '{{name}}' با موفقیت به‌روزرسانی شد." + }, + "configuration": { + "header": "پیکربندی", + "edit": { + "header": "ویرایش پیکربندی کمپین", + "description": "پیکربندی کمپین را ویرایش کنید.", + "successToast": "پیکربندی کمپین با موفقیت به‌روزرسانی شد." + } + }, + "create": { + "title": "ایجاد کمپین", + "description": "یک کمپین تبلیغاتی ایجاد کنید.", + "hint": "یک کمپین تبلیغاتی ایجاد کنید.", + "header": "ایجاد کمپین", + "successToast": "کمپین '{{name}}' با موفقیت ایجاد شد." + }, + "fields": { + "name": "نام", + "identifier": "شناسه", + "start_date": "تاریخ شروع", + "end_date": "تاریخ پایان", + "total_spend": "بودجه خرج شده", + "total_used": "بودجه استفاده شده", + "budget_limit": "محدودیت بودجه", + "campaign_id": { + "hint": "فقط کمپین‌هایی که کد ارز آن‌ها با تبلیغ یکسان است در این لیست نمایش داده می‌شوند." + } + }, + "budget": { + "create": { + "hint": "یک بودجه برای کمپین ایجاد کنید.", + "header": "بودجه کمپین" + }, + "details": "بودجه کمپین", + "fields": { + "type": "نوع", + "currency": "ارز", + "limit": "محدودیت", + "used": "استفاده شده" + }, + "type": { + "spend": { + "title": "هزینه", + "description": "یک محدودیت برای کل مبلغ تخفیف‌هایی که از یک کد تخفیف یا تبلیغ اعمال می‌شود تعیین کنید." + }, + "usage": { + "title": "استفاده", + "description": "محدودیتی روی تعداد دفعاتی که تبلیغ می‌تواند استفاده شود تعیین کنید." + } + }, + "edit": { + "header": "ویرایش بودجه کمپین" + } + }, + "promotions": { + "remove": { + "title": "حذف تبلیغ از کمپین", + "description": "شما در حال حذف {{count}} تبلیغ از کمپین هستید. این عمل قابل بازگشت نیست." + }, + "alreadyAdded": "این تبلیغ قبلاً به کمپین اضافه شده است.", + "alreadyAddedDiffCampaign": "این تبلیغ قبلاً به یک کمپین دیگر اضافه شده است ({{name}}).", + "currencyMismatch": "ارز تبلیغ و کمپین مطابقت ندارد", + "toast": { + "success": "{{count}} تبلیغ با موفقیت به کمپین اضافه شد." + }, + "add": { + "list": { + "noRecordsMessage": "ابتدا یک تبلیغ ایجاد کنید." + } + }, + "list": { + "noRecordsMessage": "هیچ تبلیغی در کمپین وجود ندارد." + } + }, + "deleteCampaignWarning": "شما در حال حذف کمپین {{name}} هستید. این عمل قابل بازگشت نیست.", + "totalSpend": "<0>{{amount}} <1>{{currency}}" + }, + "priceLists": { + "domain": "لیست‌های قیمت", + "subtitle": "قیمت‌های فروش یا تغییر قیمت‌ها را برای شرایط خاص ایجاد کنید.", + "delete": { + "confirmation": "شما در حال حذف لیست قیمت {{title}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "لیست قیمت {{title}} با موفقیت حذف شد." + }, + "create": { + "header": "ایجاد لیست قیمت", + "subheader": "یک لیست قیمت جدید ایجاد کنید تا قیمت‌های محصولات خود را مدیریت کنید.", + "tabs": { + "details": "جزئیات", + "products": "محصولات", + "prices": "قیمت‌ها" + }, + "successToast": "لیست قیمت {{title}} با موفقیت ایجاد شد.", + "products": { + "list": { + "noRecordsMessage": "ابتدا یک محصول ایجاد کنید." + } + } + }, + "edit": { + "header": "ویرایش لیست قیمت", + "successToast": "لیست قیمت {{title}} با موفقیت به‌روزرسانی شد." + }, + "configuration": { + "header": "پیکربندی", + "edit": { + "header": "ویرایش پیکربندی لیست قیمت", + "description": "پیکربندی لیست قیمت را ویرایش کنید.", + "successToast": "پیکربندی لیست قیمت با موفقیت به‌روزرسانی شد." + } + }, + "products": { + "header": "محصولات", + "actions": { + "addProducts": "افزودن محصولات", + "editPrices": "ویرایش قیمت‌ها" + }, + "delete": { + "confirmation_one": "شما در حال حذف قیمت‌های {{count}} محصول در لیست قیمت هستید. این عمل قابل بازگشت نیست.", + "confirmation_other": "شما در حال حذف قیمت‌های {{count}} محصول در لیست قیمت هستید. این عمل قابل بازگشت نیست.", + "successToast_one": "قیمت‌های {{count}} محصول با موفقیت حذف شد.", + "successToast_other": "قیمت‌های {{count}} محصول با موفقیت حذف شد." + }, + "add": { + "successToast": "قیمت‌ها با موفقیت به لیست قیمت اضافه شدند." + }, + "edit": { + "successToast": "قیمت‌ها با موفقیت به‌روزرسانی شدند." + } + }, + "fields": { + "priceOverrides": { + "label": "بازنویسی قیمت‌ها", + "header": "بازنویسی قیمت‌ها" + }, + "status": { + "label": "وضعیت", + "options": { + "active": "فعال", + "draft": "پیش‌نویس", + "expired": "منقضی شده", + "scheduled": "زمان‌بندی شده" + } + }, + "type": { + "label": "نوع", + "hint": "نوع لیست قیمتی که می‌خواهید ایجاد کنید را انتخاب کنید.", + "options": { + "sale": { + "label": "فروش", + "description": "قیمت‌های فروش، تغییرات موقتی در قیمت محصولات هستند." + }, + "override": { + "label": "بازنویسی", + "description": "بازنویسی‌ها معمولاً برای ایجاد قیمت‌های خاص مشتری استفاده می‌شوند." + } + } + }, + "startsAt": { + "label": "لیست قیمت تاریخ شروع دارد؟", + "hint": "لیست قیمت را برای فعال‌سازی در آینده زمان‌بندی کنید." + }, + "endsAt": { + "label": "لیست قیمت تاریخ انقضا دارد؟", + "hint": "لیست قیمت را برای غیرفعال‌سازی در آینده زمان‌بندی کنید." + }, + "customerAvailability": { + "header": "انتخاب گروه‌های مشتری", + "label": "دسترسی مشتری", + "hint": "گروه‌های مشتری که لیست قیمت باید روی آن‌ها اعمال شود را انتخاب کنید.", + "placeholder": "جستجوی گروه‌های مشتری", + "attribute": "گروه‌های مشتری" + } + } + }, + "profile": { + "domain": "پروفایل", + "manageYourProfileDetails": "جزئیات پروفایل خود را مدیریت کنید.", + "fields": { + "languageLabel": "زبان", + "usageInsightsLabel": "تحلیل‌های مربوط به استفاده" + }, + "edit": { + "header": "ویرایش پروفایل", + "languageHint": "زبانی که می‌خواهید در داشبورد مدیریتی استفاده کنید. این مورد زبان فروشگاه شما را تغییر نمی‌دهد.", + "languagePlaceholder": "انتخاب زبان", + "usageInsightsHint": "تحلیل‌های مربوط به استفاده را به اشتراک بگذارید و به ما در بهبود مدوسا کمک کنید. می‌توانید در مورد اطلاعاتی که جمع‌آوری می‌کنیم و نحوه استفاده از آن‌ها در <0>مستندات بیشتر بخوانید." + }, + "toast": { + "edit": "تغییرات پروفایل ذخیره شد" + } + }, + "users": { + "domain": "کاربران", + "editUser": "ویرایش کاربر", + "inviteUser": "دعوت کاربر", + "inviteUserHint": "یک کاربر جدید به فروشگاه خود دعوت کنید.", + "sendInvite": "ارسال دعوت", + "pendingInvites": "دعوت‌های در انتظار", + "deleteInviteWarning": "شما در حال حذف دعوت برای {{email}} هستید. این عمل قابل بازگشت نیست.", + "resendInvite": "ارسال مجدد دعوت", + "copyInviteLink": "کپی لینک دعوت", + "expiredOnDate": "منقضی شده در {{date}}", + "validFromUntil": "معتبر از <0>{{from}} - <1>{{until}}", + "acceptedOnDate": "پذیرفته شده در {{date}}", + "inviteStatus": { + "accepted": "پذیرفته شده", + "pending": "در انتظار", + "expired": "منقضی شده" + }, + "roles": { + "admin": "ادمین", + "developer": "توسعه‌دهنده", + "member": "عضو" + }, + "list": { + "empty": { + "heading": "کاربری یافت نشد", + "description": "پس از دعوت یک کاربر، در اینجا نمایش داده خواهد شد." + }, + "filtered": { + "heading": "نتیجه‌ای یافت نشد", + "description": "هیچ کاربری با معیارهای فیلتر فعلی مطابقت ندارد." + } + }, + "deleteUserWarning": "شما در حال حذف کاربر {{name}} هستید. این عمل قابل بازگشت نیست.", + "deleteUserSuccess": "کاربر {{name}} با موفقیت حذف شد", + "invite": "دعوت" + }, + "store": { + "domain": "فروشگاه", + "manageYourStoresDetails": "جزئیات فروشگاه خود را مدیریت کنید", + "editStore": "ویرایش فروشگاه", + "defaultCurrency": "ارز پیش‌فرض", + "defaultRegion": "منطقه پیش‌فرض", + "swapLinkTemplate": "الگوی لینک تعویض", + "paymentLinkTemplate": "الگوی لینک پرداخت", + "inviteLinkTemplate": "الگوی لینک دعوت", + "currencies": "ارزها", + "addCurrencies": "افزودن ارزها", + "enableTaxInclusivePricing": "فعال‌سازی قیمت‌گذاری شامل مالیات", + "disableTaxInclusivePricing": "غیرفعال‌سازی قیمت‌گذاری شامل مالیات", + "removeCurrencyWarning_one": "شما در حال حذف {{count}} ارز از فروشگاه خود هستید. مطمئن شوید که تمام قیمت‌های استفاده‌کننده از این ارز را حذف کرده‌اید.", + "removeCurrencyWarning_other": "شما در حال حذف {{count}} ارز از فروشگاه خود هستید. مطمئن شوید که تمام قیمت‌های استفاده‌کننده از این ارزها را حذف کرده‌اید.", + "currencyAlreadyAdded": "این ارز قبلاً به فروشگاه شما اضافه شده است.", + "edit": { + "header": "ویرایش فروشگاه" + }, + "toast": { + "update": "فروشگاه با موفقیت به‌روزرسانی شد", + "currenciesUpdated": "ارزها با موفقیت به‌روزرسانی شدند", + "currenciesRemoved": "ارزها با موفقیت از فروشگاه حذف شدند", + "updatedTaxInclusivitySuccessfully": "قیمت‌گذاری شامل مالیات با موفقیت به‌روزرسانی شد" + } + }, + "regions": { + "domain": "مناطق", + "subtitle": "یک منطقه محدوده‌ای است که در آن محصولات خود را می‌فروشید. این منطقه می‌تواند چندین کشور را پوشش دهد و نرخ‌های مالیاتی، ارائه‌دهندگان و ارزهای متفاوتی داشته باشد.", + "createRegion": "ایجاد منطقه", + "createRegionHint": "نرخ‌های مالیاتی و ارائه‌دهندگان را برای مجموعه‌ای از کشورها مدیریت کنید.", + "addCountries": "افزودن کشورها", + "editRegion": "ویرایش منطقه", + "countriesHint": "کشورهای موجود در این منطقه را اضافه کنید.", + "deleteRegionWarning": "شما در حال حذف منطقه {{name}} هستید. این عمل قابل بازگشت نیست.", + "removeCountriesWarning_one": "شما در حال حذف {{count}} کشور از منطقه هستید. این عمل قابل بازگشت نیست.", + "removeCountriesWarning_other": "شما در حال حذف {{count}} کشور از منطقه هستید. این عمل قابل بازگشت نیست.", + "removeCountryWarning": "شما در حال حذف کشور {{name}} از منطقه هستید. این عمل قابل بازگشت نیست.", + "automaticTaxesHint": "در صورت فعال‌سازی، مالیات‌ها فقط در هنگام پرداخت بر اساس آدرس حمل و نقل محاسبه می‌شوند.", + "taxInclusiveHint": "در صورت فعال‌سازی، قیمت‌ها در این منطقه شامل مالیات خواهند بود.", + "providersHint": "روش‌های پرداخت موجود در این منطقه را اضافه کنید.", + "shippingOptions": "گزینه‌های حمل و نقل", + "deleteShippingOptionWarning": "شما در حال حذف گزینه حمل و نقل {{name}} هستید. این عمل غیر قابل بازگشت است.", + "return": "مرجوعی", + "outbound": "ارسالی", + "priceType": "نوع قیمت", + "flatRate": "نرخ ثابت", + "calculated": "محاسبه‌شده", + "list": { + "noRecordsMessage": "برای مناطقی که در آن‌ها فروش دارید، یک منطقه ایجاد کنید." + }, + "toast": { + "delete": "منطقه با موفقیت حذف شد", + "edit": "منطقه با موفقیت ویرایش شد", + "create": "منطقه با موفقیت ایجاد شد", + "countries": "کشورهای منطقه با موفقیت به‌روزرسانی شدند" + }, + "shippingOption": { + "createShippingOption": "ایجاد گزینه حمل و نقل", + "createShippingOptionHint": "یک گزینه حمل و نقل جدید برای منطقه ایجاد کنید.", + "editShippingOption": "ویرایش گزینه حمل و نقل", + "fulfillmentMethod": "روش پردازش", + "type": { + "outbound": "ارسالی", + "outboundHint": "اگر در حال ایجاد یک گزینه حمل و نقل برای ارسال محصولات به مشتری هستید، از این استفاده کنید.", + "return": "مرجوعی", + "returnHint": "اگر در حال ایجاد یک گزینه حمل و نقل برای بازگشت محصولات از مشتری به شما هستید، از این استفاده کنید." + }, + "priceType": { + "label": "نوع قیمت", + "flatRate": "نرخ ثابت", + "calculated": "محاسبه‌شده" + }, + "availability": { + "adminOnly": "فقط ادمین", + "adminOnlyHint": "در صورت فعال‌سازی، گزینه حمل و نقل فقط در داشبورد مدیریتی قابل دسترسی خواهد بود و در فروشگاه نمایش داده نمی‌شود." + }, + "taxInclusiveHint": "در صورت فعال‌سازی، قیمت گزینه حمل و نقل شامل مالیات خواهد بود.", + "requirements": { + "label": "نیازمندی‌ها", + "hint": "نیازمندی‌های گزینه حمل و نقل را مشخص کنید." + } + } + }, + "taxes": { + "domain": "مناطق مالیاتی", + "domainDescription": "منطقه مالیاتی خود را مدیریت کنید", + "countries": { + "taxCountriesHint": "تنظیمات مالیاتی برای کشورهای فهرست‌ شده اعمال می‌شود." + }, + "settings": { + "editTaxSettings": "ویرایش تنظیمات مالیاتی", + "taxProviderLabel": "ارائه‌ دهنده مالیات", + "systemTaxProviderLabel": "ارائه‌دهنده مالیات سیستم", + "calculateTaxesAutomaticallyLabel": "محاسبه خودکار مالیات", + "calculateTaxesAutomaticallyHint": "در صورت فعال‌سازی، نرخ‌های مالیاتی به‌طور خودکار محاسبه و به سبد خرید اعمال می‌شوند. در صورت غیرفعال‌سازی، مالیات‌ها باید به‌صورت دستی در هنگام پرداخت محاسبه شوند. مالیات‌های دستی برای استفاده با ارائه‌دهندگان مالیات شخص ثالث توصیه می‌شوند.", + "applyTaxesOnGiftCardsLabel": "اعمال مالیات بر کارت‌های هدیه", + "applyTaxesOnGiftCardsHint": "در صورت فعال‌سازی، مالیات‌ها در هنگام پرداخت به کارت‌های هدیه اعمال می‌شوند. در برخی کشورها، مقررات مالیاتی اعمال مالیات بر کارت‌های هدیه در هنگام خرید را الزامی می‌کند.", + "defaultTaxRateLabel": "نرخ مالیات پیش‌فرض", + "defaultTaxCodeLabel": "کد مالیات پیش‌فرض" + }, + "defaultRate": { + "sectionTitle": "نرخ مالیات پیش‌فرض" + }, + "taxRate": { + "sectionTitle": "نرخ‌های مالیاتی", + "createTaxRate": "ایجاد نرخ مالیات", + "createTaxRateHint": "یک نرخ مالیات جدید برای منطقه ایجاد کنید.", + "deleteRateDescription": "شما در حال حذف نرخ مالیات {{name}} هستید. این عمل قابل بازگشت نیست.", + "editTaxRate": "ویرایش نرخ مالیات", + "editRateAction": "ویرایش نرخ", + "editOverridesAction": "ویرایش جایگزین‌ها", + "editOverridesTitle": "ویرایش جایگزین‌های نرخ مالیات", + "editOverridesHint": "جایگزین‌های نرخ مالیات را مشخص کنید.", + "deleteTaxRateWarning": "شما در حال حذف نرخ مالیات {{name}} هستید. این عمل قابل بازگشت نیست.", + "productOverridesLabel": "جایگزین‌های محصول", + "productOverridesHint": "جایگزین‌های محصول برای نرخ مالیات را مشخص کنید.", + "addProductOverridesAction": "افزودن جایگزین‌های محصول", + "productTypeOverridesLabel": "جایگزین‌های نوع محصول", + "productTypeOverridesHint": "جایگزین‌های نوع محصول برای نرخ مالیات را مشخص کنید.", + "addProductTypeOverridesAction": "افزودن جایگزین‌های نوع محصول", + "shippingOptionOverridesLabel": "جایگزین‌های گزینه حمل و نقل", + "shippingOptionOverridesHint": "جایگزین‌های گزینه حمل و نقل برای نرخ مالیات را مشخص کنید.", + "addShippingOptionOverridesAction": "افزودن جایگزین‌های گزینه حمل و نقل", + "productOverridesHeader": "محصولات", + "productTypeOverridesHeader": "انواع محصولات", + "shippingOptionOverridesHeader": "گزینه‌های حمل و نقل" + } + }, + "locations": { + "domain": "مکان‌ها", + "editLocation": "ویرایش مکان", + "addSalesChannels": "افزودن کانال‌های فروش", + "noLocationsFound": "هیچ مکانی یافت نشد", + "selectLocations": "مکان‌هایی که موجودی کالا را دارند انتخاب کنید.", + "deleteLocationWarning": "شما در حال حذف مکان {{name}} هستید. این عمل قابل بازگشت نیست.", + "removeSalesChannelsWarning_one": "شما در حال حذف {{count}} کانال فروش از مکان هستید.", + "removeSalesChannelsWarning_other": "شما در حال حذف {{count}} کانال فروش از مکان هستید.", + "toast": { + "create": "مکان با موفقیت ایجاد شد", + "update": "مکان با موفقیت به‌روزرسانی شد", + "removeChannel": "کانال فروش با موفقیت حذف شد" + } + }, + "reservations": { + "domain": "رزروها", + "subtitle": "مقدار رزرو شده از اقلام موجودی را مدیریت کنید.", + "deleteWarning": "شما در حال حذف یک رزرو هستید. این عمل قابل بازگشت نیست." + }, + "salesChannels": { + "domain": "کانال‌های فروش", + "subtitle": "کانال‌های آنلاین و آفلاینی که محصولات خود را در آن‌ها می‌فروشید را مدیریت کنید.", + "createSalesChannel": "ایجاد کانال فروش", + "createSalesChannelHint": "یک کانال فروش جدید برای فروش محصولات خود ایجاد کنید.", + "enabledHint": "مشخص کنید که آیا کانال فروش فعال است یا خیر.", + "removeProductsWarning_one": "شما در حال حذف {{count}} محصول از {{sales_channel}} هستید.", + "removeProductsWarning_other": "شما در حال حذف {{count}} محصول از {{sales_channel}} هستید.", + "addProducts": "افزودن محصولات", + "editSalesChannel": "ویرایش کانال فروش", + "productAlreadyAdded": "این محصول قبلاً به کانال فروش اضافه شده است.", + "deleteSalesChannelWarning": "شما در حال حذف کانال فروش {{name}} هستید. این عمل قابل بازگشت نیست.", + "toast": { + "create": "کانال فروش با موفقیت ایجاد شد", + "update": "کانال فروش با موفقیت به‌روزرسانی شد", + "delete": "کانال فروش با موفقیت حذف شد" + }, + "tooltip": { + "cannotDeleteDefault": "امکان حذف کانال فروش پیش‌فرض وجود ندارد" + }, + "products": { + "list": { + "noRecordsMessage": "هیچ محصولی در کانال فروش وجود ندارد." + }, + "add": { + "list": { + "noRecordsMessage": "ابتدا یک محصول ایجاد کنید." + } + } + } + }, + "apiKeyManagement": { + "domain": { + "publishable": "کلیدهای API قابل انتشار", + "secret": "کلیدهای API محرمانه" + }, + "subtitle": { + "publishable": "کلیدهای API مورد استفاده در فروشگاه را مدیریت کنید تا محدوده درخواست‌ها به کانال‌های فروش خاص محدود شود.", + "secret": "کلیدهای API مورد استفاده برای احراز هویت کاربران ادمین در برنامه‌های مدیریتی را مدیریت کنید." + }, + "status": { + "active": "فعال", + "revoked": "لغو شده" + }, + "type": { + "publishable": "قابل انتشار", + "secret": "محرمانه" + }, + "create": { + "createPublishableHeader": "ایجاد کلید API قابل انتشار", + "createPublishableHint": "یک کلید API قابل انتشار جدید ایجاد کنید تا محدوده درخواست‌ها به کانال‌های فروش خاص محدود شود.", + "createSecretHeader": "ایجاد کلید API محرمانه", + "createSecretHint": "یک کلید API محرمانه جدید ایجاد کنید تا به عنوان یک کاربر ادمین احراز هویت شده به API مدوسا دسترسی داشته باشید.", + "secretKeyCreatedHeader": "کلید محرمانه ایجاد شد", + "secretKeyCreatedHint": "کلید محرمانه جدید شما ایجاد شده است. آن را کپی کرده و اکنون به‌طور ایمن ذخیره کنید. این تنها زمانی است که نمایش داده می‌شود.", + "copySecretTokenSuccess": "کلید محرمانه با موفقیت در کلیپ‌بورد کپی شد.", + "copySecretTokenFailure": "کپی کلید محرمانه به کلیپ‌بورد ناموفق بود.", + "successToast": "کلید API با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش کلید API", + "description": "عنوان کلید API را ویرایش کنید.", + "successToast": "کلید API {{title}} با موفقیت به‌روزرسانی شد." + }, + "salesChannels": { + "title": "افزودن کانال‌های فروش", + "description": "کانال‌های فروشی که کلید API باید به آن‌ها محدود شود را اضافه کنید.", + "successToast_one": "{{count}} کانال فروش با موفقیت به کلید API اضافه شد.", + "successToast_other": "{{count}} کانال فروش با موفقیت به کلید API اضافه شدند.", + "alreadyAddedTooltip": "این کانال فروش قبلاً به کلید API اضافه شده است.", + "list": { + "noRecordsMessage": "هیچ کانال فروشی در محدوده کلید API قابل انتشار وجود ندارد." + } + }, + "delete": { + "warning": "شما در حال حذف کلید API {{title}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "کلید API {{title}} با موفقیت حذف شد." + }, + "revoke": { + "warning": "شما در حال لغو کلید API {{title}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "کلید API {{title}} با موفقیت لغو شد." + }, + "addSalesChannels": { + "list": { + "noRecordsMessage": "ابتدا یک کانال فروش ایجاد کنید." + } + }, + "removeSalesChannel": { + "warning": "شما در حال حذف کانال فروش {{name}} از کلید API هستید. این عمل قابل بازگشت نیست.", + "warningBatch_one": "شما در حال حذف {{count}} کانال فروش از کلید API هستید. این عمل قابل بازگشت نیست.", + "warningBatch_other": "شما در حال حذف {{count}} کانال فروش از کلید API هستید. این عمل قابل بازگشت نیست.", + "successToast": "کانال فروش با موفقیت از کلید API حذف شد.", + "successToastBatch_one": "{{count}} کانال فروش با موفقیت از کلید API حذف شد.", + "successToastBatch_other": "{{count}} کانال فروش با موفقیت از کلید API حذف شدند." + }, + "actions": { + "revoke": "لغو کلید API", + "copy": "کپی کلید API", + "copySuccessToast": "کلید API در کلیپ‌بورد کپی شد." + }, + "table": { + "lastUsedAtHeader": "آخرین استفاده در", + "createdAtHeader": "لغو شده در" + }, + "fields": { + "lastUsedAtLabel": "آخرین استفاده در", + "revokedByLabel": "لغو شده توسط", + "revokedAtLabel": "لغو شده در", + "createdByLabel": "ایجاد شده توسط" + } + }, + "returnReasons": { + "domain": "دلایل بازگشت", + "subtitle": "دلایل بازگشت اقلام را مدیریت کنید.", + "calloutHint": "دلایل دسته‌بندی بازگشت‌ها را مدیریت کنید.", + "editReason": "ویرایش دلیل بازگشت", + "create": { + "header": "افزودن دلیل بازگشت", + "subtitle": "متداول‌ترین دلایل بازگشت را مشخص کنید.", + "hint": "یک دلیل بازگشت جدید ایجاد کنید تا بازگشت‌ها دسته‌بندی شوند.", + "successToast": "دلیل بازگشت {{label}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش دلیل بازگشت", + "subtitle": "مقدار دلیل بازگشت را ویرایش کنید.", + "successToast": "دلیل بازگشت {{label}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "confirmation": "شما در حال حذف دلیل بازگشت {{label}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "دلیل بازگشت {{label}} با موفقیت حذف شد." + }, + "fields": { + "value": { + "label": "مقدار", + "placeholder": "wrong_size", + "tooltip": "مقدار باید یک شناسه منحصر به فرد برای دلیل بازگشت باشد." + }, + "label": { "label": "برچسب", "placeholder": "سایز اشتباه" }, + "description": { + "label": "توضیحات", + "placeholder": "مشتری سایز اشتباه دریافت کرده است" + } + } + }, + "login": { + "forgotPassword": "رمز عبور را فراموش کرده‌اید؟ - <0>بازنشانی", + "title": "به مدوسا خوش آمدید", + "hint": "برای دسترسی به بخش حساب کاربری وارد شوید" + }, + "invite": { + "title": "به مدوسا خوش آمدید", + "hint": "در زیر حساب کاربری خود را ایجاد کنید", + "backToLogin": "بازگشت به ورود", + "createAccount": "ایجاد حساب کاربری", + "alreadyHaveAccount": "قبلاً حساب کاربری دارید؟ - <0>وارد شوید", + "emailTooltip": "ایمیل شما قابل تغییر نیست. اگر می‌خواهید از ایمیل دیگری استفاده کنید، باید دعوت‌نامه جدیدی ارسال شود.", + "invalidInvite": "دعوت‌نامه نامعتبر است یا منقضی شده است.", + "successTitle": "حساب کاربری شما ثبت شد", + "successHint": "همین حالا کار با مدوسا ادمین را شروع کنید.", + "successAction": "شروع مدوسا ادمین", + "invalidTokenTitle": "توکن دعوت شما نامعتبر است", + "invalidTokenHint": "سعی کنید لینک دعوت جدیدی درخواست دهید.", + "passwordMismatch": "رمزهای عبور مطابقت ندارند", + "toast": { + "accepted": "دعوت‌نامه با موفقیت پذیرفته شد" + } + }, + "resetPassword": { + "title": "بازنشانی رمز عبور", + "hint": "ایمیل خود را در زیر وارد کنید و ما دستورالعمل‌هایی برای بازنشانی رمز عبور شما ارسال خواهیم کرد.", + "email": "ایمیل", + "sendResetInstructions": "ارسال دستورالعمل‌های بازنشانی", + "backToLogin": "<0>بازگشت به ورود", + "newPasswordHint": "در زیر یک رمز عبور جدید انتخاب کنید.", + "invalidTokenTitle": "توکن بازنشانی شما نامعتبر است", + "invalidTokenHint": "سعی کنید لینک بازنشانی جدیدی درخواست دهید.", + "expiredTokenTitle": "توکن بازنشانی شما منقضی شده است", + "goToResetPassword": "برو به بازنشانی رمز عبور", + "resetPassword": "بازنشانی رمز عبور", + "newPassword": "رمز عبور جدید", + "repeatNewPassword": "تکرار رمز عبور جدید", + "tokenExpiresIn": "توکن در <0>{{time}} دقیقه منقضی می‌شود", + "successfulRequestTitle": "ایمیل با موفقیت ارسال شد", + "successfulRequest": "ما ایمیلی برای شما ارسال کرده‌ایم که می‌توانید از آن برای بازنشانی رمز عبور خود استفاده کنید. اگر پس از چند دقیقه آن را دریافت نکرده‌اید، پوشه اسپم خود را بررسی کنید.", + "successfulResetTitle": "بازنشانی رمز عبور موفقیت‌آمیز بود", + "successfulReset": "لطفاً در صفحه ورود وارد شوید.", + "passwordMismatch": "رمزهای عبور مطابقت ندارند", + "invalidLinkTitle": "لینک بازنشانی شما نامعتبر است", + "invalidLinkHint": "سعی کنید دوباره رمز عبور خود را بازنشانی کنید." + }, + "workflowExecutions": { + "domain": "گردش‌های کاری", + "subtitle": "مشاهده و پیگیری اجرای گردش‌های کاری در اپلیکیشن مدوسا شما.", + "transactionIdLabel": "شناسه تراکنش", + "workflowIdLabel": "شناسه گردش کاری", + "progressLabel": "پیشرفت", + "stepsCompletedLabel_one": "{{completed}} از {{count}} مرحله", + "stepsCompletedLabel_other": "{{completed}} از {{count}} مرحله", + "list": { + "noRecordsMessage": "هنوز هیچ گردش کاری اجرا نشده است." + }, + "history": { + "sectionTitle": "تاریخچه", + "runningState": "در حال اجرا...", + "awaitingState": "در انتظار", + "failedState": "ناموفق", + "skippedState": "رد شده", + "skippedFailureState": "رد شده (خطا)", + "definitionLabel": "تعریف", + "outputLabel": "خروجی", + "compensateInputLabel": "ورودی جبران", + "revertedLabel": "برگشت داده شده", + "errorLabel": "خطا" + }, + "state": { + "done": "انجام شده", + "failed": "ناموفق", + "reverted": "برگشت داده شده", + "invoking": "در حال فراخوانی", + "compensating": "در حال جبران", + "notStarted": "شروع نشده" + }, + "transaction": { + "state": { + "waitingToCompensate": "در انتظار جبران" + } + }, + "step": { + "state": { + "skipped": "رد شده", + "skippedFailure": "رد شده (خطا)", + "dormant": "غیرفعال", + "timeout": "زمان‌سنج" + } + } + }, + "productTypes": { + "domain": "انواع محصولات", + "subtitle": "محصولات خود را در انواع دسته‌بندی کنید.", + "create": { + "header": "ایجاد نوع محصول", + "hint": "یک نوع محصول جدید ایجاد کنید تا محصولات خود را دسته‌بندی کنید.", + "successToast": "نوع محصول {{value}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش نوع محصول", + "successToast": "نوع محصول {{value}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "confirmation": "شما در حال حذف نوع محصول {{value}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "نوع محصول {{value}} با موفقیت حذف شد." + }, + "fields": { + "value": "مقدار" + } + }, + "productTags": { + "domain": "برچسب‌های محصول", + "create": { + "header": "ایجاد برچسب محصول", + "subtitle": "یک برچسب محصول جدید ایجاد کنید تا محصولات خود را دسته‌بندی کنید.", + "successToast": "برچسب محصول {{value}} با موفقیت ایجاد شد." + }, + "edit": { + "header": "ویرایش برچسب محصول", + "subtitle": "مقدار برچسب محصول را ویرایش کنید.", + "successToast": "برچسب محصول {{value}} با موفقیت به‌روزرسانی شد." + }, + "delete": { + "confirmation": "شما در حال حذف برچسب محصول {{value}} هستید. این عمل قابل بازگشت نیست.", + "successToast": "برچسب محصول {{value}} با موفقیت حذف شد." + }, + "fields": { + "value": "مقدار" + } + }, + "notifications": { + "domain": "اعلان‌ها", + "emptyState": { + "title": "هیچ اعلانی وجود ندارد", + "description": "در حال حاضر هیچ اعلانی ندارید، اما به محض داشتن، آن‌ها در اینجا نمایش داده می‌شوند." + }, + "accessibility": { + "description": "اعلان‌های مربوط به فعالیت‌های مدوسا در اینجا فهرست می‌شوند." + } + }, + "errors": { + "serverError": "خطای سرور - بعداً دوباره تلاش کنید.", + "invalidCredentials": "ایمیل یا رمز عبور اشتباه است" + }, + "statuses": { + "scheduled": "زمان‌بندی شده", + "expired": "منقضی شده", + "active": "فعال", + "inactive": "غیرفعال", + "draft": "پیش‌نویس", + "enabled": "فعال شده", + "disabled": "غیرفعال شده" + }, + "labels": { + "productVariant": "تنوع محصول", + "prices": "قیمت‌ها", + "available": "موجود", + "inStock": "در انبار", + "added": "اضافه شده", + "removed": "حذف شده", + "from": "از", + "to": "به" + }, + "fields": { + "amount": "مبلغ", + "refundAmount": "مبلغ بازپرداخت", + "name": "نام", + "default": "پیش‌فرض", + "lastName": "نام خانوادگی", + "firstName": "نام", + "title": "عنوان", + "customTitle": "عنوان سفارشی", + "manageInventory": "مدیریت موجودی", + "inventoryKit": "دارای کیت موجودی", + "inventoryItems": "موجودی اقلام", + "inventoryItem": "آیتم موجودی", + "requiredQuantity": "مقدار مورد نیاز", + "description": "توضیحات", + "email": "ایمیل", + "password": "رمز عبور", + "repeatPassword": "تکرار رمز عبور", + "confirmPassword": "تأیید رمز عبور", + "newPassword": "رمز عبور جدید", + "repeatNewPassword": "تکرار رمز عبور جدید", + "categories": "دسته‌بندی‌ها", + "shippingMethod": "روش حمل و نقل", + "configurations": "پیکربندی‌ها", + "conditions": "شرایط", + "category": "دسته‌بندی", + "collection": "مجموعه", + "discountable": "قابل تخفیف", + "handle": "مدیریت", + "subtitle": "زیرعنوان", + "by": "توسط", + "item": "آیتم", + "qty": "تعداد", + "limit": "محدودیت", + "tags": "برچسب‌ها", + "type": "نوع", + "reason": "دلیل", + "none": "هیچ‌کدام", + "all": "همه", + "search": "جستجو", + "percentage": "درصد", + "sales_channels": "کانال‌های فروش", + "customer_groups": "گروه‌های مشتری", + "product_tags": "برچسب‌های محصول", + "product_types": "انواع محصول", + "product_collections": "مجموعه‌های محصول", + "status": "وضعیت", + "code": "کد", + "value": "مقدار", + "disabled": "غیرفعال", + "dynamic": "پویا", + "normal": "عادی", + "years": "سال", + "months": "ماه", + "days": "روز", + "hours": "ساعت", + "minutes": "دقیقه", + "totalRedemptions": "کل بازخریدها", + "countries": "کشورها", + "paymentProviders": "ارائه‌دهندگان پرداخت", + "refundReason": "دلیل بازپرداخت", + "fulfillmentProviders": "ارائه‌دهندگان پردازش", + "fulfillmentProvider": "ارائه‌دهنده پردازش", + "providers": "ارائه‌دهندگان", + "availability": "دسترسی", + "inventory": "موجودی", + "optional": "اختیاری", + "note": "یادداشت", + "automaticTaxes": "مالیات خودکار", + "taxInclusivePricing": "قیمت‌گذاری شامل مالیات", + "currency": "ارز", + "address": "آدرس", + "address2": "آپارتمان، سوئیت و غیره", + "city": "شهر", + "postalCode": "کد پستی", + "country": "کشور", + "state": "استان", + "province": "استان", + "company": "شرکت", + "phone": "تلفن", + "metadata": "متادیتا", + "selectCountry": "انتخاب کشور", + "products": "محصولات", + "variants": "تنوع‌ها", + "orders": "سفارشات", + "account": "حساب کاربری", + "total": "مجموع سفارش", + "paidTotal": "مجموع پرداخت شده", + "totalExclTax": "مجموع بدون مالیات", + "subtotal": "جمع جزء", + "shipping": "حمل و نقل", + "outboundShipping": "حمل و نقل ارسالی", + "returnShipping": "حمل و نقل مرجوعی", + "tax": "مالیات", + "created": "ایجاد شده", + "key": "کلید", + "customer": "مشتری", + "date": "تاریخ", + "order": "سفارش", + "fulfillment": "پردازش", + "provider": "ارائه‌دهنده", + "payment": "پرداخت", + "items": "اقلام", + "salesChannel": "کانال فروش", + "region": "منطقه", + "discount": "تخفیف", + "role": "نقش", + "sent": "ارسال شده", + "salesChannels": "کانال‌های فروش", + "product": "محصول", + "createdAt": "ایجاد شده در", + "updatedAt": "به‌روزرسانی شده در", + "revokedAt": "لغو شده در", + "true": "صحیح", + "false": "غلط", + "giftCard": "کارت هدیه", + "tag": "برچسب", + "dateIssued": "تاریخ صدور", + "issuedDate": "تاریخ صدور", + "expiryDate": "تاریخ انقضا", + "price": "قیمت", + "priceTemplate": "قیمت {{regionOrCurrency}}", + "height": "ارتفاع", + "width": "عرض", + "length": "طول", + "weight": "وزن", + "midCode": "کد MID", + "hsCode": "کد HS", + "ean": "EAN", + "upc": "UPC", + "inventoryQuantity": "مقدار موجودی", + "barcode": "بارکد", + "countryOfOrigin": "کشور مبدأ", + "material": "جنس", + "thumbnail": "تصویر کوچک", + "sku": "SKU", + "managedInventory": "موجودی مدیریت شده", + "allowBackorder": "اجازه پیش‌سفارش", + "inStock": "موجود در انبار", + "location": "مکان", + "quantity": "تعداد", + "variant": "تنوع", + "id": "شناسه", + "parent": "والد", + "minSubtotal": "حداقل جمع جزء", + "maxSubtotal": "حداکثر جمع جزء", + "shippingProfile": "پروفایل حمل و نقل", + "summary": "خلاصه", + "details": "جزئیات", + "label": "برچسب", + "rate": "نرخ", + "requiresShipping": "نیاز به حمل و نقل", + "unitPrice": "قیمت واحد", + "startDate": "تاریخ شروع", + "endDate": "تاریخ پایان", + "draft": "پیش‌نویس", + "values": "مقادیر" + }, + "dateTime": { + "years_one": "سال", + "years_other": "سال", + "months_one": "ماه", + "months_other": "ماه", + "weeks_one": "هفته", + "weeks_other": "هفته", + "days_one": "روز", + "days_other": "روز", + "hours_one": "ساعت", + "hours_other": "ساعت", + "minutes_one": "دقیقه", + "minutes_other": "دقیقه", + "seconds_one": "ثانیه", + "seconds_other": "ثانیه" + } +} diff --git a/packages/admin/dashboard/src/i18n/translations/index.ts b/packages/admin/dashboard/src/i18n/translations/index.ts index 78fd69e466e00..726caf48deabc 100644 --- a/packages/admin/dashboard/src/i18n/translations/index.ts +++ b/packages/admin/dashboard/src/i18n/translations/index.ts @@ -14,6 +14,8 @@ import mk from "./mk.json" import mn from "./mn.json" import ar from "./ar.json" import zhCN from "./zhCN.json" +import fa from "./fa.json" +import cs from "./cs.json" export default { de: { @@ -64,4 +66,10 @@ export default { zhCN: { translation: zhCN, }, + fa: { + translation: fa, + }, + cs: { + translation: cs, + }, } diff --git a/packages/admin/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx b/packages/admin/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx index 838fae3740ead..07dc491ddfc34 100644 --- a/packages/admin/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx +++ b/packages/admin/dashboard/src/routes/locations/location-service-zone-shipping-option-create/components/create-shipping-options-form/create-shipping-options-form.tsx @@ -151,13 +151,13 @@ export function CreateShippingOptionsForm({ rules: [ { // eslint-disable-next-line - value: isReturn ? '"true"' : '"false"', + value: isReturn ? "true" : "false", attribute: "is_return", operator: "eq", }, { // eslint-disable-next-line - value: data.enabled_in_store ? '"true"' : '"false"', + value: data.enabled_in_store ? "true" : "false", attribute: "enabled_in_store", operator: "eq", }, diff --git a/packages/cli/medusa-cli/src/create-cli.ts b/packages/cli/medusa-cli/src/create-cli.ts index 20ae5d8ca09b3..14c2c38dc348d 100644 --- a/packages/cli/medusa-cli/src/create-cli.ts +++ b/packages/cli/medusa-cli/src/create-cli.ts @@ -204,6 +204,16 @@ function buildLocalCommands(cli, isLocalProject) { }) ), }) + .command({ + command: "db:migrate:scripts", + desc: "Run all migration scripts", + handler: handlerP( + getCommandHandler("db/run-scripts", (args, cmd) => { + process.env.NODE_ENV = process.env.NODE_ENV || `development` + return cmd(args) + }) + ), + }) .command({ command: "db:rollback [modules...]", desc: "Rollback last batch of executed migrations for a given module", diff --git a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts index a8b00dc037ca6..1fc550029e09b 100644 --- a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts +++ b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts @@ -1,4 +1,4 @@ -import { ShippingOptionPriceType } from "@medusajs/framework/utils" +import { isDefined, ShippingOptionPriceType } from "@medusajs/framework/utils" import { createWorkflow, parallelize, @@ -6,8 +6,8 @@ import { WorkflowData, WorkflowResponse, } from "@medusajs/framework/workflows-sdk" -import { - CalculateShippingOptionPriceDTO, +import { + CalculateShippingOptionPriceDTO, ListShippingOptionsForCartWithPricingWorkflowInput, } from "@medusajs/types" @@ -44,13 +44,13 @@ export const listShippingOptionsForCartWithPricingWorkflowId = /** * This workflow lists shipping options that can be used during checkout for a cart. It also retrieves the prices * of these shipping options, including calculated prices that may be retrieved from third-party providers. - * + * * This workflow is executed in other cart-related workflows, such as {@link addShippingMethodToCartWorkflow} to retrieve the * price of the shipping method being added to the cart. - * - * You can use this workflow within your own customizations or custom workflows, allowing you to retrieve the shipping options of a cart and their prices + * + * You can use this workflow within your own customizations or custom workflows, allowing you to retrieve the shipping options of a cart and their prices * in your custom flows. - * + * * @example * const { result } = await listShippingOptionsForCartWithPricingWorkflow(container) * .run({ @@ -66,16 +66,14 @@ export const listShippingOptionsForCartWithPricingWorkflowId = * ] * } * }) - * + * * @summary - * + * * List a cart's shipping options with prices. */ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow( listShippingOptionsForCartWithPricingWorkflowId, - ( - input: WorkflowData - ) => { + (input: WorkflowData) => { const optionIds = transform({ input }, ({ input }) => (input.options ?? []).map(({ id }) => id) ) @@ -141,8 +139,12 @@ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow( { input, cart, fulfillmentSetIds }, ({ input, cart, fulfillmentSetIds }) => ({ context: { - is_return: input.is_return ?? false, - enabled_in_store: input.enabled_in_store ?? true, + is_return: input.is_return ? "true" : "false", + enabled_in_store: !isDefined(input.enabled_in_store) + ? "true" + : input.enabled_in_store + ? "true" + : "false", }, filters: { diff --git a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts index 18193c986ab5a..2a177673f6a8f 100644 --- a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts @@ -8,23 +8,24 @@ import { useQueryGraphStep, validatePresenceOfStep } from "../../common" import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { cartFieldsForPricingContext } from "../utils/fields" import { ListShippingOptionsForCartWorkflowInput } from "@medusajs/types" +import { isDefined } from "@medusajs/framework/utils" export const listShippingOptionsForCartWorkflowId = "list-shipping-options-for-cart" /** - * This workflow lists the shipping options of a cart. It's executed by the + * This workflow lists the shipping options of a cart. It's executed by the * [List Shipping Options Store API Route](https://docs.medusajs.com/api/store#shipping-options_getshippingoptions). - * + * * :::note - * + * * This workflow doesn't retrieve the calculated prices of the shipping options. If you need to retrieve the prices of the shipping options, * use the {@link listShippingOptionsForCartWithPricingWorkflow} workflow. - * + * * ::: - * - * You can use this workflow within your own customizations or custom workflows, allowing you to wrap custom logic around to retrieve the shipping options of a cart + * + * You can use this workflow within your own customizations or custom workflows, allowing you to wrap custom logic around to retrieve the shipping options of a cart * in your custom flows. - * + * * @example * const { result } = await listShippingOptionsForCartWorkflow(container) * .run({ @@ -33,16 +34,14 @@ export const listShippingOptionsForCartWorkflowId = * option_ids: ["so_123"] * } * }) - * + * * @summary - * + * * List a cart's shipping options. */ export const listShippingOptionsForCartWorkflow = createWorkflow( listShippingOptionsForCartWorkflowId, - ( - input: WorkflowData - ) => { + (input: WorkflowData) => { const cartQuery = useQueryGraphStep({ entity: "cart", filters: { id: input.cart_id }, @@ -92,27 +91,33 @@ export const listShippingOptionsForCartWorkflow = createWorkflow( const queryVariables = transform( { input, fulfillmentSetIds, cart }, - ({ input, fulfillmentSetIds, cart }) => ({ - id: input.option_ids, - - context: { - is_return: input.is_return ?? false, - enabled_in_store: input.enabled_in_store ?? true, - }, - - filters: { - fulfillment_set_id: fulfillmentSetIds, - - address: { - country_code: cart.shipping_address?.country_code, - province_code: cart.shipping_address?.province, - city: cart.shipping_address?.city, - postal_expression: cart.shipping_address?.postal_code, + ({ input, fulfillmentSetIds, cart }) => { + return { + id: input.option_ids, + + context: { + is_return: input.is_return ? "true" : "false", + enabled_in_store: !isDefined(input.enabled_in_store) + ? "true" + : input.enabled_in_store + ? "true" + : "false", + }, + + filters: { + fulfillment_set_id: fulfillmentSetIds, + + address: { + country_code: cart.shipping_address?.country_code, + province_code: cart.shipping_address?.province, + city: cart.shipping_address?.city, + postal_expression: cart.shipping_address?.postal_code, + }, }, - }, - calculated_price: { context: cart }, - }) + calculated_price: { context: cart }, + } + } ) const shippingOptions = useRemoteQueryStep({ diff --git a/packages/core/core-flows/src/product-category/workflows/create-product-categories.ts b/packages/core/core-flows/src/product-category/workflows/create-product-categories.ts index 42fe507116366..fabd95eb8bba0 100644 --- a/packages/core/core-flows/src/product-category/workflows/create-product-categories.ts +++ b/packages/core/core-flows/src/product-category/workflows/create-product-categories.ts @@ -1,10 +1,14 @@ -import { ProductCategoryDTO, ProductCategoryWorkflow } from "@medusajs/framework/types" +import { + ProductCategoryDTO, + ProductCategoryWorkflow, +} from "@medusajs/framework/types" import { ProductCategoryWorkflowEvents } from "@medusajs/framework/utils" import { - WorkflowData, - WorkflowResponse, + createHook, createWorkflow, transform, + WorkflowData, + WorkflowResponse, } from "@medusajs/framework/workflows-sdk" import { emitEventStep } from "../../common" import { createProductCategoriesStep } from "../steps" @@ -18,10 +22,10 @@ export const createProductCategoriesWorkflowId = "create-product-categories" /** * This workflow creates one or more product categories. It's used by the * [Create Product Category Admin API Route](https://docs.medusajs.com/api/admin#product-categories_postproductcategories). - * + * * You can use this workflow within your customizations or your own custom workflows, allowing you to * create product categories within your custom flows. - * + * * @example * const { result } = await createProductCategoriesWorkflow(container) * .run({ @@ -33,22 +37,22 @@ export const createProductCategoriesWorkflowId = "create-product-categories" * ] * } * }) - * + * * @summary - * + * * Create product categories. */ export const createProductCategoriesWorkflow = createWorkflow( createProductCategoriesWorkflowId, ( input: WorkflowData - ): WorkflowResponse => { - const createdProducts = createProductCategoriesStep(input) + ) => { + const createdCategories = createProductCategoriesStep(input) const productCategoryIdEvents = transform( - { createdProducts }, - ({ createdProducts }) => { - return createdProducts.map((v) => { + { createdCategories }, + ({ createdCategories }) => { + return createdCategories.map((v) => { return { id: v.id } }) } @@ -59,6 +63,12 @@ export const createProductCategoriesWorkflow = createWorkflow( data: productCategoryIdEvents, }) - return new WorkflowResponse(createdProducts) + const categoriesCreated = createHook("categoriesCreated", { + categories: createdCategories, + }) + + return new WorkflowResponse(createdCategories, { + hooks: [categoriesCreated], + }) } ) diff --git a/packages/core/core-flows/src/product-category/workflows/delete-product-categories.ts b/packages/core/core-flows/src/product-category/workflows/delete-product-categories.ts index d29c0e3dc450f..c86d5a180baa3 100644 --- a/packages/core/core-flows/src/product-category/workflows/delete-product-categories.ts +++ b/packages/core/core-flows/src/product-category/workflows/delete-product-categories.ts @@ -4,6 +4,7 @@ import { WorkflowResponse, createWorkflow, transform, + createHook } from "@medusajs/framework/workflows-sdk" import { emitEventStep } from "../../common" import { deleteProductCategoriesStep } from "../steps" @@ -47,6 +48,12 @@ export const deleteProductCategoriesWorkflow = createWorkflow( data: productCategoryIdEvents, }) - return new WorkflowResponse(deleted) + const categoriesDeleted = createHook("categoriesDeleted", { + ids: input, + }) + + return new WorkflowResponse(deleted, { + hooks: [categoriesDeleted] + }) } ) diff --git a/packages/core/core-flows/src/product-category/workflows/update-product-categories.ts b/packages/core/core-flows/src/product-category/workflows/update-product-categories.ts index f99ed0019e03d..ac520774164fd 100644 --- a/packages/core/core-flows/src/product-category/workflows/update-product-categories.ts +++ b/packages/core/core-flows/src/product-category/workflows/update-product-categories.ts @@ -5,6 +5,7 @@ import { WorkflowResponse, createWorkflow, transform, + createHook, } from "@medusajs/framework/workflows-sdk" import { emitEventStep } from "../../common" import { updateProductCategoriesStep } from "../steps" @@ -43,7 +44,7 @@ export const updateProductCategoriesWorkflow = createWorkflow( updateProductCategoriesWorkflowId, ( input: WorkflowData - ): WorkflowResponse => { + ) => { const updatedCategories = updateProductCategoriesStep(input) const productCategoryIdEvents = transform( @@ -64,6 +65,12 @@ export const updateProductCategoriesWorkflow = createWorkflow( data: productCategoryIdEvents, }) - return new WorkflowResponse(updatedCategories) + const categoriesUpdated = createHook("categoriesUpdated", { + categories: updatedCategories + }) + + return new WorkflowResponse(updatedCategories, { + hooks: [categoriesUpdated] + }) } ) diff --git a/packages/core/framework/package.json b/packages/core/framework/package.json index ad389bf4ddcef..56e2b1a9cb6c9 100644 --- a/packages/core/framework/package.json +++ b/packages/core/framework/package.json @@ -82,6 +82,7 @@ "@medusajs/workflows-sdk": "~2.3.1", "@opentelemetry/api": "^1.9.0", "@types/express": "^4.17.17", + "chokidar": "^3.4.2", "compression": "1.7.4", "connect-redis": "5.2.0", "cookie-parser": "^1.4.6", diff --git a/packages/core/framework/src/build-tools/compiler.ts b/packages/core/framework/src/build-tools/compiler.ts index a0f821eb204bb..a13a9b2076604 100644 --- a/packages/core/framework/src/build-tools/compiler.ts +++ b/packages/core/framework/src/build-tools/compiler.ts @@ -1,8 +1,9 @@ import path from "path" -import { getConfigFile } from "@medusajs/utils" -import type { AdminOptions, ConfigModule, Logger } from "@medusajs/types" -import { rm, access, constants, copyFile, writeFile, mkdir } from "fs/promises" +import chokidar from "chokidar" import type tsStatic from "typescript" +import { FileSystem, getConfigFile } from "@medusajs/utils" +import { rm, access, constants, copyFile } from "fs/promises" +import type { AdminOptions, ConfigModule, Logger } from "@medusajs/types" /** * The compiler exposes the opinionated APIs for compiling Medusa @@ -27,7 +28,6 @@ export class Compiler { #adminSourceFolder: string #pluginsDistFolder: string #backendIgnoreFiles: string[] - #pluginOptionsPath: string #adminOnlyDistFolder: string #tsCompiler?: typeof tsStatic @@ -38,10 +38,6 @@ export class Compiler { this.#adminSourceFolder = path.join(this.#projectRoot, "src/admin") this.#adminOnlyDistFolder = path.join(this.#projectRoot, ".medusa/admin") this.#pluginsDistFolder = path.join(this.#projectRoot, ".medusa/server") - this.#pluginOptionsPath = path.join( - this.#projectRoot, - ".medusa/server/medusa-plugin-options.json" - ) this.#backendIgnoreFiles = [ "integration-tests", "test", @@ -141,13 +137,14 @@ export class Compiler { } /** - * Ensures a directory exists + * Returns a boolean indicating if a file extension belongs + * to a JavaScript or TypeScript file */ - async #ensureDir(path: string, clean?: boolean) { - if (clean) { - await this.#clean(path) + #isScriptFile(filePath: string) { + if (filePath.endsWith(".ts") && !filePath.endsWith(".d.ts")) { + return true } - await mkdir(path, { recursive: true }) + return filePath.endsWith(".js") } /** @@ -167,24 +164,6 @@ export class Compiler { return { configFilePath, configModule } } - /** - * Creates medusa-plugin-options.json file that contains some - * metadata related to the plugin, which could be helpful - * for MedusaJS loaders during development - */ - async #createPluginOptionsFile() { - await writeFile( - this.#pluginOptionsPath, - JSON.stringify( - { - srcDir: path.join(this.#projectRoot, "src"), - }, - null, - 2 - ) - ) - } - /** * Prints typescript diagnostic messages */ @@ -437,7 +416,7 @@ export class Compiler { */ const { emitResult, diagnostics } = await this.#emitBuildOutput( tsConfig, - ["integration-tests", "test", "unit-tests", "src/admin"], + this.#backendIgnoreFiles, dist ) @@ -472,54 +451,71 @@ export class Compiler { * The "onFileChange" argument can be used to get notified when * a file has changed. */ - async developPluginBackend(onFileChange?: () => void) { - await this.#ensureDir(this.#pluginsDistFolder, true) - await this.#createPluginOptionsFile() - const ts = await this.#loadTSCompiler() + async developPluginBackend( + transformer: (filePath: string) => Promise, + onFileChange?: ( + filePath: string, + action: "add" | "change" | "unlink" + ) => void + ) { + const fs = new FileSystem(this.#pluginsDistFolder) + await fs.createJson("medusa-plugin-options.json", { + srcDir: path.join(this.#projectRoot, "src"), + }) - /** - * Format host is needed to print diagnostic messages - */ - const formatHost: tsStatic.FormatDiagnosticsHost = { - getCanonicalFileName: (path) => path, - getCurrentDirectory: ts.sys.getCurrentDirectory, - getNewLine: () => ts.sys.newLine, - } + const watcher = chokidar.watch(["."], { + ignoreInitial: true, + cwd: this.#projectRoot, + ignored: [ + /(^|[\\/\\])\../, + "node_modules", + "dist", + "static", + "private", + ".medusa/**/*", + ...this.#backendIgnoreFiles, + ], + }) - /** - * Creating a watcher compiler host to watch files and recompile - * them as they are changed - */ - const host = ts.createWatchCompilerHost( - this.#tsConfigPath, - { - outDir: this.#pluginsDistFolder, - noCheck: true, - }, - ts.sys, - ts.createEmitAndSemanticDiagnosticsBuilderProgram, - (diagnostic) => this.#printDiagnostics(ts, [diagnostic]), - (diagnostic) => { - if (typeof diagnostic.messageText === "string") { - this.#logger.info(diagnostic.messageText) - } else { - this.#logger.info( - ts.formatDiagnosticsWithColorAndContext([diagnostic], formatHost) - ) - } - }, - { - excludeDirectories: this.#backendIgnoreFiles, + watcher.on("add", async (file) => { + if (!this.#isScriptFile(file)) { + return } - ) + const relativePath = path.relative(this.#projectRoot, file) + const outputPath = relativePath.replace(/\.ts$/, ".js") - const origPostProgramCreate = host.afterProgramCreate - host.afterProgramCreate = (program) => { - origPostProgramCreate!(program) - onFileChange?.() - } + this.#logger.info(`${relativePath} updated: Republishing changes`) + await fs.create(outputPath, await transformer(file)) - ts.createWatchProgram(host) + onFileChange?.(file, "add") + }) + watcher.on("change", async (file) => { + if (!this.#isScriptFile(file)) { + return + } + const relativePath = path.relative(this.#projectRoot, file) + const outputPath = relativePath.replace(/\.ts$/, ".js") + + this.#logger.info(`${relativePath} updated: Republishing changes`) + await fs.create(outputPath, await transformer(file)) + + onFileChange?.(file, "change") + }) + watcher.on("unlink", async (file) => { + if (!this.#isScriptFile(file)) { + return + } + const relativePath = path.relative(this.#projectRoot, file) + const outputPath = relativePath.replace(/\.ts$/, ".js") + + this.#logger.info(`${relativePath} removed: Republishing changes`) + await fs.remove(outputPath) + onFileChange?.(file, "unlink") + }) + + watcher.on("ready", () => { + this.#logger.info("watching for file changes") + }) } async buildPluginAdminExtensions(bundler: { diff --git a/packages/medusa/src/commands/db/migrate.ts b/packages/medusa/src/commands/db/migrate.ts index 1828115ecd4ef..046210360bf3b 100644 --- a/packages/medusa/src/commands/db/migrate.ts +++ b/packages/medusa/src/commands/db/migrate.ts @@ -1,20 +1,22 @@ -import { join } from "path" +import { MEDUSA_CLI_PATH, MedusaAppLoader } from "@medusajs/framework" +import { LinkLoader } from "@medusajs/framework/links" +import { logger } from "@medusajs/framework/logger" import { ContainerRegistrationKeys, mergePluginModules, } from "@medusajs/framework/utils" -import { LinkLoader } from "@medusajs/framework/links" -import { logger } from "@medusajs/framework/logger" -import { MedusaAppLoader } from "@medusajs/framework" +import { join } from "path" -import { syncLinks } from "./sync-links" -import { ensureDbExists } from "../utils" +import { fork } from "child_process" +import path from "path" import { initializeContainer } from "../../loaders" import { getResolvedPlugins } from "../../loaders/helpers/resolve-plugins" -import { runMigrationScripts } from "./run-scripts" - +import { ensureDbExists } from "../utils" +import { syncLinks } from "./sync-links" const TERMINAL_SIZE = process.stdout.columns +const cliPath = path.resolve(MEDUSA_CLI_PATH, "..", "..", "cli.js") + /** * A low-level utility to migrate the database. This util should * never exit the process implicitly. @@ -77,9 +79,18 @@ export async function migrate({ * Run migration scripts */ console.log(new Array(TERMINAL_SIZE).join("-")) - await runMigrationScripts({ - directory, - container, + const childProcess = fork(cliPath, ["db:migrate:scripts"], { + cwd: directory, + env: process.env, + }) + + await new Promise((resolve, reject) => { + childProcess.on("error", (error) => { + reject(error) + }) + childProcess.on("close", () => { + resolve() + }) }) } diff --git a/packages/medusa/src/commands/db/run-scripts.ts b/packages/medusa/src/commands/db/run-scripts.ts index 60d7cc4468ece..67a4241a6cc24 100644 --- a/packages/medusa/src/commands/db/run-scripts.ts +++ b/packages/medusa/src/commands/db/run-scripts.ts @@ -9,7 +9,7 @@ import { import { dirname, join } from "path" import { MedusaModule } from "@medusajs/framework/modules-sdk" -import { MedusaContainer } from "@medusajs/types" +import { MedusaContainer, PluginDetails } from "@medusajs/types" import { initializeContainer } from "../../loaders" import { getResolvedPlugins } from "../../loaders/helpers/resolve-plugins" import { ensureDbExists } from "../utils" @@ -22,46 +22,30 @@ const TERMINAL_SIZE = process.stdout.columns */ export async function runMigrationScripts({ directory, - container, }: { directory: string - container?: MedusaContainer }): Promise { - /** - * Clear all module instances to prevent cache from kicking in - */ - MedusaModule.clearInstances() - - let container_: MedusaContainer = container! let onApplicationPrepareShutdown: () => Promise = async () => Promise.resolve() let onApplicationShutdown: () => Promise = async () => Promise.resolve() + let container_: MedusaContainer + let plugins: PluginDetails[] try { - /** - * Setup - */ - container_ ??= await initializeContainer(directory) + container_ = await initializeContainer(directory) await ensureDbExists(container_) const configModule = container_.resolve( ContainerRegistrationKeys.CONFIG_MODULE ) - const plugins = await getResolvedPlugins(directory, configModule, true) + plugins = await getResolvedPlugins(directory, configModule, true) mergePluginModules(configModule, plugins) - const linksSourcePaths = plugins.map((plugin) => - join(plugin.resolve, "links") - ) - await new LinkLoader(linksSourcePaths).load() - - const medusaAppResources = await new MedusaAppLoader().load() - onApplicationPrepareShutdown = - medusaAppResources.onApplicationPrepareShutdown - onApplicationShutdown = medusaAppResources.onApplicationShutdown - await medusaAppResources.onApplicationStart() + const resources = await loadResources(plugins) + onApplicationPrepareShutdown = resources.onApplicationPrepareShutdown + onApplicationShutdown = resources.onApplicationShutdown const scriptsSourcePaths = [ join(dirname(require.resolve("@medusajs/medusa")), "migration-scripts"), @@ -97,7 +81,42 @@ export async function runMigrationScripts({ } } -const main = async function ({ directory }: { directory: string }) { +async function loadResources(plugins: any): Promise<{ + onApplicationPrepareShutdown: () => Promise + onApplicationShutdown: () => Promise +}> { + /** + * Clear all module instances to prevent cache from kicking in + */ + MedusaModule.clearInstances() + + /** + * Setup + */ + + const linksSourcePaths = plugins.map((plugin) => + join(plugin.resolve, "links") + ) + await new LinkLoader(linksSourcePaths).load() + + const medusaAppResources = await new MedusaAppLoader().load() + const onApplicationPrepareShutdown = + medusaAppResources.onApplicationPrepareShutdown + const onApplicationShutdown = medusaAppResources.onApplicationShutdown + await medusaAppResources.onApplicationStart() + + return { + onApplicationPrepareShutdown, + onApplicationShutdown, + } +} + +const main = async function ({ + directory, +}: { + directory: string + container?: MedusaContainer +}) { try { const migrated = await runMigrationScripts({ directory, diff --git a/packages/medusa/src/commands/plugin/develop.ts b/packages/medusa/src/commands/plugin/develop.ts index 623d8a64a9d32..b808bdad29836 100644 --- a/packages/medusa/src/commands/plugin/develop.ts +++ b/packages/medusa/src/commands/plugin/develop.ts @@ -1,4 +1,5 @@ import path from "path" +import * as swcCore from "@swc/core" import { execFile } from "child_process" import { logger } from "@medusajs/framework/logger" import { Compiler } from "@medusajs/framework/build-tools" @@ -10,9 +11,18 @@ export default async function developPlugin({ }) { let isBusy = false const compiler = new Compiler(directory, logger) + const parsedConfig = await compiler.loadTSConfigFile() + if (!parsedConfig) { + return + } + const yalcBin = path.join(path.dirname(require.resolve("yalc")), "yalc.js") - await compiler.developPluginBackend(async () => { + /** + * Publishes the build output to the registry and updates + * installations + */ + function publishChanges() { /** * Here we avoid multiple publish calls when the filesystem is * changed too quickly. This might result in stale content in @@ -46,5 +56,47 @@ export default async function developPlugin({ console.error(stderr) } ) - }) + } + + /** + * Transforms a given file using @swc/core + */ + async function transformFile(filePath: string) { + const output = await swcCore.transformFile(filePath, { + sourceMaps: "inline", + module: { + type: "commonjs", + strictMode: true, + noInterop: false, + }, + jsc: { + externalHelpers: false, + target: "es2021", + parser: { + syntax: "typescript", + tsx: true, + decorators: true, + dynamicImport: true, + }, + transform: { + legacyDecorator: true, + decoratorMetadata: true, + react: { + throwIfNamespace: false, + useBuiltins: false, + pragma: "React.createElement", + pragmaFrag: "React.Fragment", + importSource: "react", + runtime: "automatic", + }, + }, + keepClassNames: true, + baseUrl: directory, + }, + }) + return output.code + } + + await compiler.buildPluginBackend(parsedConfig) + await compiler.developPluginBackend(transformFile, publishChanges) } diff --git a/packages/modules/fulfillment/src/migrations/Migration20250113122235.ts b/packages/modules/fulfillment/src/migrations/Migration20250113122235.ts index 2a409cd85b99b..96d27cbbb97ac 100644 --- a/packages/modules/fulfillment/src/migrations/Migration20250113122235.ts +++ b/packages/modules/fulfillment/src/migrations/Migration20250113122235.ts @@ -4,26 +4,26 @@ export class Migration20250113122235 extends Migration { override async up(): Promise { this.addSql(` UPDATE shipping_option_rule - SET value = 'true'::jsonb - WHERE value = '"true"'::jsonb; + SET value = '"true"' + WHERE value = '"\\"true\\""'; `) this.addSql(` UPDATE shipping_option_rule - SET value = 'false'::jsonb - WHERE value = '"false"'::jsonb; + SET value = '"false"' + WHERE value = '"\\"false\\""'; `) } override async down(): Promise { this.addSql(` UPDATE shipping_option_rule - SET value = '"true"'::jsonb - WHERE value = 'true'::jsonb; + SET value = '"\\"true\\""' + WHERE value = '"true"'; `) this.addSql(` UPDATE shipping_option_rule - SET value = '"false"'::jsonb - WHERE value = 'false'::jsonb; + SET value = '"\\"false\\""' + WHERE value = '"false"'; `) } } diff --git a/www/apps/api-reference/components/Tags/Section/Schema/index.tsx b/www/apps/api-reference/components/Tags/Section/Schema/index.tsx index ff3e06eb0cdd8..60e63f1973bb7 100644 --- a/www/apps/api-reference/components/Tags/Section/Schema/index.tsx +++ b/www/apps/api-reference/components/Tags/Section/Schema/index.tsx @@ -7,6 +7,8 @@ import { Badge, CodeBlock, isElmWindow, + Link, + Note, useIsBrowser, useScrollController, useSidebar, @@ -20,6 +22,7 @@ import { InView } from "react-intersection-observer" import checkElementInViewport from "../../../../utils/check-element-in-viewport" import { singular } from "pluralize" import clsx from "clsx" +import { useArea } from "../../../../providers/area" export type TagSectionSchemaProps = { schema: SchemaObject @@ -29,6 +32,7 @@ export type TagSectionSchemaProps = { const TagSectionSchema = ({ schema, tagName }: TagSectionSchemaProps) => { const paramsRef = useRef(null) const { addItems, setActivePath, activePath } = useSidebar() + const { displayedArea } = useArea() const tagSlugName = useMemo(() => getSectionId([tagName]), [tagName]) const formattedName = useMemo( () => singular(tagName).replaceAll(" ", ""), @@ -129,6 +133,16 @@ const TagSectionSchema = ({ schema, tagName }: TagSectionSchemaProps) => { mainContent={

{formattedName} Object

+ + This object's schema is as returned by Medusa's{" "} + {displayedArea} API routes. However, the related model in the + Medusa application may support more fields and relations. To + view the models in the Medusa application and their relations, + visit the{" "} + + Commerce Modules Documentation + +

Fields

diff --git a/www/apps/api-reference/providers/area.tsx b/www/apps/api-reference/providers/area.tsx index de4db69d6410e..84ad5cbb01c5d 100644 --- a/www/apps/api-reference/providers/area.tsx +++ b/www/apps/api-reference/providers/area.tsx @@ -1,12 +1,13 @@ "use client" import type { Area } from "@/types/openapi" -import { usePrevious, useSearch } from "docs-ui" -import { createContext, useContext, useEffect, useState } from "react" +import { capitalize, usePrevious, useSearch } from "docs-ui" +import { createContext, useContext, useEffect, useMemo, useState } from "react" type AreaContextType = { area: Area prevArea: Area | undefined + displayedArea: string setArea: (value: Area) => void } @@ -22,6 +23,10 @@ const AreaProvider = ({ area: passedArea, children }: AreaProviderProps) => { const prevArea = usePrevious(area) const { defaultFilters, setDefaultFilters } = useSearch() + const displayedArea = useMemo(() => { + return capitalize(area) + }, [area]) + useEffect(() => { if (!defaultFilters.includes(`${area}-v2`)) { setDefaultFilters([`${area}-v2`]) @@ -34,6 +39,7 @@ const AreaProvider = ({ area: passedArea, children }: AreaProviderProps) => { area, prevArea, setArea, + displayedArea, }} > {children} diff --git a/www/apps/api-reference/providers/page-title.tsx b/www/apps/api-reference/providers/page-title.tsx index ec004ebb8e38b..776b88a219089 100644 --- a/www/apps/api-reference/providers/page-title.tsx +++ b/www/apps/api-reference/providers/page-title.tsx @@ -1,7 +1,7 @@ "use client" import { createContext, useEffect } from "react" -import { capitalize, useSidebar } from "docs-ui" +import { useSidebar } from "docs-ui" import { useArea } from "./area" import { SidebarItemLink } from "types" @@ -13,10 +13,10 @@ type PageTitleProviderProps = { const PageTitleProvider = ({ children }: PageTitleProviderProps) => { const { activePath, activeItem } = useSidebar() - const { area } = useArea() + const { displayedArea } = useArea() useEffect(() => { - const titleSuffix = `Medusa ${capitalize(area)} API Reference` + const titleSuffix = `Medusa ${displayedArea} API Reference` if (!activePath?.length) { document.title = titleSuffix @@ -33,7 +33,7 @@ const PageTitleProvider = ({ children }: PageTitleProviderProps) => { } } } - }, [activePath, area, activeItem]) + }, [activePath, displayedArea, activeItem]) return ( diff --git a/www/apps/api-reference/specs/admin/openapi.full.yaml b/www/apps/api-reference/specs/admin/openapi.full.yaml index 634d7e3500f98..bcf4eeea587b6 100644 --- a/www/apps/api-reference/specs/admin/openapi.full.yaml +++ b/www/apps/api-reference/specs/admin/openapi.full.yaml @@ -27276,7 +27276,6 @@ paths: $ref: '#/components/responses/invalid_request_error' '500': $ref: '#/components/responses/500_error' - x-workflow: importProductsWorkflowId /admin/products/{id}: get: operationId: GetProductsId diff --git a/www/apps/api-reference/specs/admin/paths/admin_products_import_{transaction_id}_confirm.yaml b/www/apps/api-reference/specs/admin/paths/admin_products_import_{transaction_id}_confirm.yaml index b461de4b1568b..d45e77c4e3317 100644 --- a/www/apps/api-reference/specs/admin/paths/admin_products_import_{transaction_id}_confirm.yaml +++ b/www/apps/api-reference/specs/admin/paths/admin_products_import_{transaction_id}_confirm.yaml @@ -37,4 +37,3 @@ post: $ref: ../components/responses/invalid_request_error.yaml '500': $ref: ../components/responses/500_error.yaml - x-workflow: importProductsWorkflowId diff --git a/www/apps/book/app/learn/customization/customize-admin/route/page.mdx b/www/apps/book/app/learn/customization/customize-admin/route/page.mdx index 5a093589c4e38..d9149b5692f4f 100644 --- a/www/apps/book/app/learn/customization/customize-admin/route/page.mdx +++ b/www/apps/book/app/learn/customization/customize-admin/route/page.mdx @@ -410,6 +410,12 @@ You first define pagination-related variables: Then, you use `useQuery` from [Tanstack (React) Query](https://tanstack.com/query/latest) to query the Medusa server. Tanstack Query provides features like asynchronous state management and optimized caching. + + +Do not install Tanstack Query as that will cause unexpected errors in your development. If you prefer installing it for better auto-completion in your code editor, make sure to install `v5.64.2` as a development dependency. + + + In the `queryFn` function that executes the query, you use the JS SDK's `client.fetch` method to send a request to your custom API route. The first parameter is the route's path, and the second is an object of request configuration and data. You pass the query parameters in the `query` property. This sends a request to the [Get Brands API route](#1-get-brands-api-route), passing the pagination query parameters. Whenever `currentPage` is updated, the `offset` is also updated, which will send a new request to retrieve the brands for the current page. diff --git a/www/apps/book/app/learn/customization/customize-admin/widget/page.mdx b/www/apps/book/app/learn/customization/customize-admin/widget/page.mdx index 13ac3187e9bb5..547c5f473d87c 100644 --- a/www/apps/book/app/learn/customization/customize-admin/widget/page.mdx +++ b/www/apps/book/app/learn/customization/customize-admin/widget/page.mdx @@ -147,6 +147,12 @@ Since the widget is injected at the top of the product details page, the widget In the widget, you use [Tanstack (React) Query](https://tanstack.com/query/latest) to query the Medusa server. Tanstack Query provides features like asynchronous state management and optimized caching. In the `queryFn` function that executes the query, you use the JS SDK to send a request to the [Get Product API Route](!api!/admin#products_getproductsid), passing `+brand.*` in the `fields` query parameter to retrieve the product's brand. + + +Do not install Tanstack Query as that will cause unexpected errors in your development. If you prefer installing it for better auto-completion in your code editor, make sure to install `v5.64.2` as a development dependency. + + + You then render a section that shows the brand's name. In admin customizations, use components from the [Medusa UI package](!ui!) to maintain a consistent user interface and design in the dashboard. --- diff --git a/www/apps/book/app/learn/fundamentals/admin/tips/page.mdx b/www/apps/book/app/learn/fundamentals/admin/tips/page.mdx index 83d158fd72ee0..7def7227504d6 100644 --- a/www/apps/book/app/learn/fundamentals/admin/tips/page.mdx +++ b/www/apps/book/app/learn/fundamentals/admin/tips/page.mdx @@ -12,6 +12,12 @@ In this chapter, you'll find some tips for your admin development. To send a request to an API route in the Medusa Application, use Medusa's [JS SDK](!resources!/js-sdk) with [Tanstack Query](https://tanstack.com/query/latest). Both of these tools are installed in your project by default. + + +Do not install Tanstack Query as that will cause unexpected errors in your development. If you prefer installing it for better auto-completion in your code editor, make sure to install `v5.64.2` as a development dependency. + + + First, create the file `src/admin/lib/config.ts` to setup the SDK for use in your customizations: ```ts diff --git a/www/apps/book/app/learn/fundamentals/api-routes/additional-data/page.mdx b/www/apps/book/app/learn/fundamentals/api-routes/additional-data/page.mdx index e57debb477aca..a81643ddd95a6 100644 --- a/www/apps/book/app/learn/fundamentals/api-routes/additional-data/page.mdx +++ b/www/apps/book/app/learn/fundamentals/api-routes/additional-data/page.mdx @@ -26,6 +26,9 @@ For example, the [Create Product API Route](!api!/admin#products_postproducts) a - Cart - [Create Cart](!api!/store#carts_postcarts) - [Update Cart](!api!/store#carts_postcartsid) +- Collections + - [Create Collection](https://docs.medusajs.com/api/admin#collections_postcollections) + - [Update Collection](https://docs.medusajs.com/api/admin#collections_postcollectionsid) - Customers - [Create Customer](!api!/admin#customers_postcustomers) - [Update Customer](!api!/admin#customers_postcustomersid) @@ -45,6 +48,12 @@ For example, the [Create Product API Route](!api!/admin#products_postproducts) a - [Update Product Variant](!api!/admin#products_postproductsidvariantsvariant_id) - [Create Product Option](!api!/admin#products_postproductsidoptions) - [Update Product Option](!api!/admin#products_postproductsidoptionsoption_id) +- Product Tags + - [Create Product Tag](https://docs.medusajs.com/api/admin#product-tags_postproducttags) + - [Update Product Tag](https://docs.medusajs.com/api/admin#product-tags_postproducttagsid) +- Product Types + - [Create Product Type](https://docs.medusajs.com/api/admin#product-types_postproducttypes) + - [Update Product Type](https://docs.medusajs.com/api/admin#product-types_postproducttypesid) - Promotions - [Create Promotion](!api!/admin#promotions_postpromotions) - [Update Promotion](!api!/admin#promotions_postpromotionsid) diff --git a/www/apps/book/app/learn/fundamentals/workflows/conditions/page.mdx b/www/apps/book/app/learn/fundamentals/workflows/conditions/page.mdx index 2398d441cb7b9..c40f3c765fabb 100644 --- a/www/apps/book/app/learn/fundamentals/workflows/conditions/page.mdx +++ b/www/apps/book/app/learn/fundamentals/workflows/conditions/page.mdx @@ -14,6 +14,12 @@ So, you can't use an if-condition that checks a variable's value, as the conditi Instead, use when-then from the Workflows SDK. It allows you to perform steps in a workflow only if a condition that you specify is satisfied. + + +Restrictions for conditions is only applicable in a workflow's definition. You can still use if-conditions in your step's code. + + + --- ## How to use When-Then? diff --git a/www/apps/book/app/learn/fundamentals/workflows/long-running-workflow/page.mdx b/www/apps/book/app/learn/fundamentals/workflows/long-running-workflow/page.mdx index 32f003cdff5a6..4f07d29e9b593 100644 --- a/www/apps/book/app/learn/fundamentals/workflows/long-running-workflow/page.mdx +++ b/www/apps/book/app/learn/fundamentals/workflows/long-running-workflow/page.mdx @@ -282,6 +282,12 @@ You use this step in another workflow that changes the status of an async step i To access the status and result of a long-running workflow execution, use the `subscribe` and `unsubscribe` methods of the Workflow Engine Module's main service. + + +To retrieve the workflow execution's details at a later point, you must enable [storing the workflow's executions](../store-executions/page.mdx). + + + For example: export const highlights = [ diff --git a/www/apps/book/app/learn/fundamentals/workflows/store-executions/page.mdx b/www/apps/book/app/learn/fundamentals/workflows/store-executions/page.mdx new file mode 100644 index 0000000000000..663bb65c01cc6 --- /dev/null +++ b/www/apps/book/app/learn/fundamentals/workflows/store-executions/page.mdx @@ -0,0 +1,173 @@ +import { Prerequisites } from "docs-ui" + +export const metadata = { + title: `${pageNumber} Store Workflow Executions`, +} + +# {metadata.title} + +In this chapter, you'll learn how to store workflow executions in the database and access them later. + +## Workflow Execution Retention + +Medusa doesn't store your workflow's execution details by default. However, you can configure a workflow to keep its execution details stored in the database. + +This is useful for auditing and debugging purposes. When you store a workflow's execution, you can view details around its steps, their states and their output. You can also check whether the workflow or any of its steps failed. + + + +You can view stored workflow executions from the Medusa Admin dashboard by going to Settings -> Workflows. + + + +--- + +## How to Store Workflow's Executions? + + + +`createWorkflow` from the Workflows SDK can accept an object as a first parameter to set the workflow's configuration. To enable storing a workflow's executions: + +- Enable the `store` option. If your workflow is a [Long-Running Workflow](../long-running-workflow/page.mdx), this option is enabled by default. +- Set the `retentionTime` option to the number of milliseconds that the workflow execution should be stored in the database. + +For example: + +export const highlights = [ + ["15", "retentionTime", "The number of milliseconds that the workflow's executions should be stored in the database."], + ["16", "store", "Enable storing the workflow's executions in the database."], +] + +```ts highlights={highlights} +import { createStep, createWorkflow } from "@medusajs/framework/workflows-sdk" + +const step1 = createStep( + { + name: "step-1" + }, + async () => { + console.log("Hello from step 1") + } +) + +export const helloWorkflow = createWorkflow( + { + name: "hello-workflow", + retentionTime: 99999, + store: true + }, + () => { + step1() + } +) +``` + +Whenever you execute the `helloWorkflow` now, its execution details will be stored in the database. + +--- + +## Retrieve Workflow Executions + + + +You can view stored workflow executions from the Medusa Admin dashboard by going to Settings -> Workflows. + + + +When you execute a workflow, the returned object has a `transaction` property containing the workflow execution's transaction details: + +```ts +const { transaction } = await helloWorkflow(container).run() +``` + +To retrieve a workflow's execution details from the database, resolve the Workflow Engine Module from the container and use its `listWorkflowExecutions` method. + +For example, you can create a `GET` API Route at `src/workflows/[id]/route.ts` that retrieves a workflow execution for the specified transaction ID: + +export const retrieveHighlights = [ + ["8", "transaction_id", "Get the transaction ID from a path parameter."], + ["10", "workflowEngineService", "Resolve the Workflow Engine Module from the container."], + ["14", "workflowExecution", "Retrieve the workflow execution for the specified transaction ID."], +] + +```ts title="src/workflows/[id]/route.ts" highlights={retrieveHighlights} +import { MedusaRequest, MedusaResponse } from "@medusajs/framework"; +import { Modules } from "@medusajs/framework/utils"; + +export async function GET( + req: MedusaRequest, + res: MedusaResponse +) { + const { transaction_id } = req.params + + const workflowEngineService = req.scope.resolve( + Modules.WORKFLOW_ENGINE + ) + + const [workflowExecution] = await workflowEngineService.listWorkflowExecutions({ + transaction_id: transaction_id + }) + + res.json({ + workflowExecution + }) +} +``` + +In the above example, you resolve the Workflow Engine Module from the container and use its `listWorkflowExecutions` method, passing the `transaction_id` as a filter to retrieve its workflow execution details. + +A workflow execution object will be similar to the following: + +```json +{ + "workflow_id": "hello-workflow", + "transaction_id": "01JJC2T6AVJCQ3N4BRD1EB88SP", + "id": "wf_exec_01JJC2T6B3P76JD35F12QTTA78", + "execution": { + "state": "done", + "steps": {}, + "modelId": "hello-workflow", + "options": {}, + "metadata": {}, + "startedAt": 1737719880027, + "definition": {}, + "timedOutAt": null, + "hasAsyncSteps": false, + "transactionId": "01JJC2T6AVJCQ3N4BRD1EB88SP", + "hasFailedSteps": false, + "hasSkippedSteps": false, + "hasWaitingSteps": false, + "hasRevertedSteps": false, + "hasSkippedOnFailureSteps": false + }, + "context": { + "data": {}, + "errors": [] + }, + "state": "done", + "created_at": "2025-01-24T09:58:00.036Z", + "updated_at": "2025-01-24T09:58:00.046Z", + "deleted_at": null +} +``` + +### Example: Check if Stored Workflow Execution Failed + +To check if a stored workflow execution failed, you can check its `state` property: + +```ts +if (workflowExecution.state === "failed") { + return res.status(500).json({ + error: "Workflow failed" + }) +} +``` + +Other state values include `done`, `invoking`, and `compensating`. \ No newline at end of file diff --git a/www/apps/book/app/learn/fundamentals/workflows/variable-manipulation/page.mdx b/www/apps/book/app/learn/fundamentals/workflows/variable-manipulation/page.mdx index a9ae233f36529..48b1526ed176c 100644 --- a/www/apps/book/app/learn/fundamentals/workflows/variable-manipulation/page.mdx +++ b/www/apps/book/app/learn/fundamentals/workflows/variable-manipulation/page.mdx @@ -16,6 +16,12 @@ So, you can only pass variables as parameters to steps. But, in a workflow, you Instead, use `transform` from the Workflows SDK. + + +Restrictions for variable manipulation is only applicable in a workflow's definition. You can still manipulate variables in your step's code. + + + --- ## What is the transform Utility? diff --git a/www/apps/book/generated/edit-dates.mjs b/www/apps/book/generated/edit-dates.mjs index b3b1b9136f5f6..c7a90f86e6cfd 100644 --- a/www/apps/book/generated/edit-dates.mjs +++ b/www/apps/book/generated/edit-dates.mjs @@ -80,7 +80,7 @@ export const generatedEditDates = { "app/learn/fundamentals/modules/multiple-services/page.mdx": "2024-10-21T13:30:21.370Z", "app/learn/fundamentals/modules/page.mdx": "2024-12-09T15:55:25.858Z", "app/learn/debugging-and-testing/instrumentation/page.mdx": "2024-12-09T15:33:05.121Z", - "app/learn/fundamentals/api-routes/additional-data/page.mdx": "2024-12-09T13:04:04.995Z", + "app/learn/fundamentals/api-routes/additional-data/page.mdx": "2025-01-23T15:54:44.613Z", "app/learn/fundamentals/workflows/variable-manipulation/page.mdx": "2024-12-09T15:57:54.506Z", "app/learn/customization/custom-features/api-route/page.mdx": "2024-12-09T10:39:30.046Z", "app/learn/customization/custom-features/module/page.mdx": "2024-12-09T14:36:02.100Z", @@ -108,5 +108,6 @@ export const generatedEditDates = { "app/learn/fundamentals/workflows/multiple-step-usage/page.mdx": "2024-11-25T16:19:32.169Z", "app/learn/installation/page.mdx": "2025-01-06T09:12:48.690Z", "app/learn/fundamentals/data-models/check-constraints/page.mdx": "2024-12-06T14:34:50.384Z", - "app/learn/fundamentals/module-links/link/page.mdx": "2025-01-06T09:27:25.604Z" + "app/learn/fundamentals/module-links/link/page.mdx": "2025-01-06T09:27:25.604Z", + "app/learn/fundamentals/workflows/store-executions/page.mdx": "2025-01-24T12:09:24.087Z" } \ No newline at end of file diff --git a/www/apps/book/sidebar.mjs b/www/apps/book/sidebar.mjs index b4f31c19dfd80..82c99b9a0362b 100644 --- a/www/apps/book/sidebar.mjs +++ b/www/apps/book/sidebar.mjs @@ -382,6 +382,11 @@ export const sidebar = numberSidebarItems( path: "/learn/fundamentals/workflows/workflow-timeout", title: "Workflow Timeout", }, + { + type: "link", + path: "/learn/fundamentals/workflows/store-executions", + title: "Store Workflow Executions", + }, { type: "link", path: "/learn/fundamentals/workflows/long-running-workflow", diff --git a/www/apps/resources/app/admin-components/components/table/page.mdx b/www/apps/resources/app/admin-components/components/table/page.mdx index 411fe1551292c..95a4ab3d45bb1 100644 --- a/www/apps/resources/app/admin-components/components/table/page.mdx +++ b/www/apps/resources/app/admin-components/components/table/page.mdx @@ -311,6 +311,12 @@ You can change the query to send a request to a custom API route as explained in + + +Do not install Tanstack Query as that will cause unexpected errors in your development. If you prefer installing it for better auto-completion in your code editor, make sure to install `v5.64.2` as a development dependency. + + + `useQuery` returns an object containing `data`, which holds the response fields including the products and pagination fields. Then, to display the table, replace the `TODO` with the following: diff --git a/www/apps/resources/app/commerce-modules/cart/events/_content.mdx b/www/apps/resources/app/commerce-modules/cart/events/_content.mdx index 234872f8647af..ddd4bad6a298c 100644 --- a/www/apps/resources/app/commerce-modules/cart/events/_content.mdx +++ b/www/apps/resources/app/commerce-modules/cart/events/_content.mdx @@ -45,7 +45,7 @@ import { Table } from "docs-ui" ```ts blockStyle="inline" { - id, // The ID of the customer + id, // The ID of the cart } ``` @@ -66,11 +66,11 @@ import { Table } from "docs-ui" ```ts blockStyle="inline" { - id, // The ID of the customer + id, // The ID of the cart } ``` - \ No newline at end of file + diff --git a/www/apps/resources/app/integrations/guides/sanity/page.mdx b/www/apps/resources/app/integrations/guides/sanity/page.mdx index 155c866a02b9c..352ce131d6320 100644 --- a/www/apps/resources/app/integrations/guides/sanity/page.mdx +++ b/www/apps/resources/app/integrations/guides/sanity/page.mdx @@ -1442,6 +1442,12 @@ In this section, you'll add a widget in the product details page. The widget wil To send requests from admin customizations to the Medusa server, you need to use Medusa's [JS SDK](../../../js-sdk/page.mdx). You'll also use [Tanstack Query](https://tanstack.com/query/latest) to benefit from features like data caching and invalidation. + + +Do not install Tanstack Query as that will cause unexpected errors in your development. If you prefer installing it for better auto-completion in your code editor, make sure to install `v5.64.2` as a development dependency. + + + To configure the JS SDK, create the file `src/admin/lib/sdk.ts` with the following content: ```ts title="src/admin/lib/sdk.ts" diff --git a/www/apps/resources/app/js-sdk/page.mdx b/www/apps/resources/app/js-sdk/page.mdx index a84f9942d14bd..b9970b4c4ceb0 100644 --- a/www/apps/resources/app/js-sdk/page.mdx +++ b/www/apps/resources/app/js-sdk/page.mdx @@ -352,6 +352,12 @@ In admin customizations, use [Tanstack Query](https://tanstack.com/query/latest) Tanstack Query is installed by default in your Medusa application. + + +Do not install Tanstack Query as that will cause unexpected errors in your development. If you prefer installing it for better auto-completion in your code editor, make sure to install `v5.64.2` as a development dependency. + + + Use the [configured SDK](#setup-js-sdk) with the [useQuery](https://tanstack.com/query/latest/docs/framework/react/reference/useQuery#usequery) Tanstack Query hook to send `GET` requests, and [useMutation](https://tanstack.com/query/latest/docs/framework/react/reference/useMutation#usemutation) hook to send `POST` or `DELETE` requests. For example: diff --git a/www/packages/docs-ui/src/components/Link/index.tsx b/www/packages/docs-ui/src/components/Link/index.tsx index cb70392d0722c..5009bed334246 100644 --- a/www/packages/docs-ui/src/components/Link/index.tsx +++ b/www/packages/docs-ui/src/components/Link/index.tsx @@ -4,14 +4,13 @@ import type { LinkProps as NextLinkProps } from "next/link" import clsx from "clsx" import { TriangleRightMini } from "@medusajs/icons" -export type LinkProps = { - href?: string - children?: React.ReactNode - className?: string - target?: string - rel?: string - withIcon?: boolean -} & Partial +export type LinkProps = Partial & + React.AllHTMLAttributes & { + href?: string + children?: React.ReactNode + className?: string + withIcon?: boolean + } export const Link = ({ href, diff --git a/www/utils/generated/oas-output/operations/admin/post_admin_products_import_[transaction_id]_confirm.ts b/www/utils/generated/oas-output/operations/admin/post_admin_products_import_[transaction_id]_confirm.ts index 6f8b0b757b47d..e7e2ea133a78e 100644 --- a/www/utils/generated/oas-output/operations/admin/post_admin_products_import_[transaction_id]_confirm.ts +++ b/www/utils/generated/oas-output/operations/admin/post_admin_products_import_[transaction_id]_confirm.ts @@ -36,7 +36,6 @@ * $ref: "#/components/responses/invalid_request_error" * "500": * $ref: "#/components/responses/500_error" - * x-workflow: importProductsWorkflowId * */ diff --git a/www/utils/packages/docs-generator/src/classes/kinds/oas.ts b/www/utils/packages/docs-generator/src/classes/kinds/oas.ts index 0b5dac43ea9a1..878f77c3bd702 100644 --- a/www/utils/packages/docs-generator/src/classes/kinds/oas.ts +++ b/www/utils/packages/docs-generator/src/classes/kinds/oas.ts @@ -2398,7 +2398,11 @@ class OasKindGenerator extends FunctionKindGenerator { const workflowName = childImport.name.getText() - if (fnText.includes(workflowName)) { + if ( + fnText.includes(`${workflowName}(`) || + fnText.includes(`${workflowName} (`) || + fnText.includes(`${workflowName}.`) + ) { workflow = workflowName } }) diff --git a/www/yarn.lock b/www/yarn.lock index 83c6850c5b243..9f3c9ddd01041 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -1676,53 +1676,50 @@ __metadata: languageName: node linkType: hard -"@medusajs/icons@npm:^1.2.1": - version: 1.2.1 - resolution: "@medusajs/icons@npm:1.2.1" +"@medusajs/icons@npm:^1.2.2": + version: 1.2.2 + resolution: "@medusajs/icons@npm:1.2.2" peerDependencies: react: ^16.x || ^17.x || ^18.x - checksum: bdda0af295d5cd83682b5689a8fc711a03639b7d4eb5aa2a6648e99af969363ec942dc7fe3cb21e27b6b70ea5a94a9e1b5e10b28f57ae4c7211a8807f84200c8 + checksum: 610117b959ddbd68f927caa12e70fb5fc849e8c68a25ca38f4d137aca1363f36552455aa83669847bd42753cccf36ad57b82f9bd5be7794e5b23af1046f78967 languageName: node linkType: hard -"@medusajs/icons@npm:^2.0.0": - version: 2.0.0 - resolution: "@medusajs/icons@npm:2.0.0" +"@medusajs/icons@npm:^2.2.0": + version: 2.3.1 + resolution: "@medusajs/icons@npm:2.3.1" peerDependencies: - react: ^16.x || ^17.x || ^18.x - checksum: 4cffedba777c08abc038b3bdb384c65233ef9921cd0c3132489d8ec18b146249df23b1a0492bdb3671125b435ee035db40eb2587dae1171c2bf0d3fdaba44345 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: ad37dc6061e89661b6a1158edceb8efa3106b5a8fe0284e600372133ca42a16d4f8c9575066d94cf07facf0ed28a20abf06b2d7f20cdf8b744b9eaa564322ee5 languageName: node linkType: hard -"@medusajs/ui-preset@npm:^1.1.2": - version: 1.1.2 - resolution: "@medusajs/ui-preset@npm:1.1.2" - dependencies: - "@tailwindcss/forms": ^0.5.3 - tailwindcss-animate: ^1.0.6 +"@medusajs/icons@npm:~2.0.0": + version: 2.0.7 + resolution: "@medusajs/icons@npm:2.0.7" peerDependencies: - tailwindcss: ">=3.0.0" - checksum: 63b525eee5d5a6a7d2d9596f6cc9015c221a3a55c83f524511d35eeb6916261baeae472e8748725480016a38e379f6a1a34e373d4ca824bbabdb151605086f94 + react: ^16.x || ^17.x || ^18.x + checksum: 84d9d0c8fe2fb3174e286291a86292f80a71a1582b4e8bcba001bcf061a8a4b7654c88bc80c69aee6fd68961e618011e059641c92174eba413e380e148a7ea52 languageName: node linkType: hard -"@medusajs/ui-preset@npm:^1.1.3": - version: 1.1.3 - resolution: "@medusajs/ui-preset@npm:1.1.3" +"@medusajs/ui-preset@npm:~1.1.2, @medusajs/ui-preset@npm:~1.1.3": + version: 1.1.4 + resolution: "@medusajs/ui-preset@npm:1.1.4" dependencies: "@tailwindcss/forms": ^0.5.3 tailwindcss-animate: ^1.0.6 peerDependencies: tailwindcss: ">=3.0.0" - checksum: 36b3cbe3d1b3ab2666abe84499dc19a57fe88e886704ca82b42105b5ba078638c6af8d2032d09da12d2324c485966ef2840f6a06192690b986b3c5f025308c68 + checksum: 49ffcecc49c9971fe4e195b46fde3da9c3c0e8e12c7cbf0ab6186ffd71a4027019603e72496288d32742add61905e621318d379ac2dcaea6ed2d0330efecbe3c languageName: node linkType: hard -"@medusajs/ui@npm:^3.0.0": - version: 3.0.0 - resolution: "@medusajs/ui@npm:3.0.0" +"@medusajs/ui@npm:~3.0.0": + version: 3.0.1 + resolution: "@medusajs/ui@npm:3.0.1" dependencies: - "@medusajs/icons": ^1.2.1 + "@medusajs/icons": ^1.2.2 "@radix-ui/react-accordion": ^1.1.2 "@radix-ui/react-alert-dialog": ^1.0.4 "@radix-ui/react-avatar": ^1.0.3 @@ -1754,15 +1751,15 @@ __metadata: peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 - checksum: 06d34783a4954f51ef3a5282e59cb3fd367f58d435739525a543af84213fc22c745f10849f0178fdf7c4e19bda3872a7e3ca628e1f4498ac03c95affa98b5266 + checksum: 07284402f4cb8c24937f4330c7217bf909fa0fb923f545cafbe24a8aa5a467d179d76d723c9faaea74516766444d6beb4ba8248496e70dbfd2750ea87383c9ad languageName: node linkType: hard -"@medusajs/ui@npm:^4.0.0": - version: 4.0.0 - resolution: "@medusajs/ui@npm:4.0.0" +"@medusajs/ui@npm:~4.0.0": + version: 4.0.3 + resolution: "@medusajs/ui@npm:4.0.3" dependencies: - "@medusajs/icons": ^2.0.0 + "@medusajs/icons": ^2.2.0 "@radix-ui/react-accordion": 1.2.0 "@radix-ui/react-alert-dialog": 1.1.1 "@radix-ui/react-avatar": 1.1.0 @@ -1789,9 +1786,9 @@ __metadata: sonner: ^1.5.0 tailwind-merge: ^2.2.1 peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - checksum: e4a8ebb9f937c081067e16de43c78401b2f7b17c8005f00b3be607a91326463e3ccdc7df7384100ca53199d26d3a7f961cbd3610f2fbae2336ba0c66a2dd0218 + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: 8f45adfc52c2d6500c748bf0bd08bf3b9a4eeb0fa848f27c50521474b6572a97cf76a91ee8370d1d9af26575e6ab8048ec2c95156219456d3bfc608984321690 languageName: node linkType: hard @@ -6789,8 +6786,8 @@ __metadata: dependencies: "@mdx-js/loader": ^3.1.0 "@mdx-js/react": ^3.1.0 - "@medusajs/icons": ^2.0.0 - "@medusajs/ui": ^3.0.0 + "@medusajs/icons": ~2.0.0 + "@medusajs/ui": ~3.0.0 "@next/bundle-analyzer": 15.0.4 "@next/mdx": 15.0.4 "@react-hook/resize-observer": ^2.0.2 @@ -7131,7 +7128,7 @@ __metadata: dependencies: "@mdx-js/loader": ^3.1.0 "@mdx-js/react": ^3.1.0 - "@medusajs/icons": ^2.0.0 + "@medusajs/icons": ~2.0.0 "@next/mdx": 15.0.4 "@types/mdx": ^2.0.13 "@types/node": ^20 @@ -8430,8 +8427,8 @@ __metadata: resolution: "docs-ui@workspace:packages/docs-ui" dependencies: "@emotion/is-prop-valid": ^1.3.1 - "@medusajs/icons": ^2.0.0 - "@medusajs/ui": ^4.0.0 + "@medusajs/icons": ~2.0.0 + "@medusajs/ui": ~4.0.0 "@next/third-parties": 15.0.4 "@octokit/request": ^8.1.1 "@react-hook/resize-observer": ^1.2.6 @@ -14830,7 +14827,7 @@ __metadata: dependencies: "@mdx-js/loader": ^3.1.0 "@mdx-js/react": ^3.1.0 - "@medusajs/icons": ^2.0.0 + "@medusajs/icons": ~2.0.0 "@next/bundle-analyzer": ^15.1.1 "@next/mdx": 15.0.4 "@types/mdx": ^2.0.13 @@ -15713,7 +15710,7 @@ __metadata: version: 0.0.0-use.local resolution: "tailwind@workspace:packages/tailwind" dependencies: - "@medusajs/ui-preset": ^1.1.2 + "@medusajs/ui-preset": ~1.1.2 tailwindcss-animate: ^1.0.7 peerDependencies: docs-ui: "*" @@ -16270,7 +16267,7 @@ turbo@latest: version: 0.0.0-use.local resolution: "types@workspace:packages/types" dependencies: - "@medusajs/icons": ^2.0.0 + "@medusajs/icons": ~2.0.0 "@types/node": ^20.11.20 rimraf: ^5.0.5 tsconfig: "*" @@ -16358,9 +16355,9 @@ turbo@latest: dependencies: "@faker-js/faker": ^8.0.2 "@mdx-js/react": ^3.1.0 - "@medusajs/icons": ^2.0.0 - "@medusajs/ui": ^4.0.0 - "@medusajs/ui-preset": ^1.1.3 + "@medusajs/icons": ~2.0.0 + "@medusajs/ui": ~4.0.0 + "@medusajs/ui-preset": ~1.1.3 "@types/node": 20.4.9 "@types/react": "npm:types-react@rc" "@types/react-dom": "npm:types-react@rc" @@ -16736,7 +16733,7 @@ turbo@latest: dependencies: "@mdx-js/loader": ^3.1.0 "@mdx-js/react": ^3.1.0 - "@medusajs/icons": ^2.0.0 + "@medusajs/icons": ~2.0.0 "@next/mdx": 15.0.4 "@types/mdx": ^2.0.13 "@types/node": ^20 diff --git a/yarn.lock b/yarn.lock index a1052c33e9282..a80ddea19e54c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -79,36 +79,36 @@ __metadata: languageName: node linkType: hard -"@ariakit/core@npm:0.4.6": - version: 0.4.6 - resolution: "@ariakit/core@npm:0.4.6" - checksum: ca95be5acfd55ad99fa2eaddfdcf2dd178622ac64634bec80709dc4c722f8f15ac6d321831c72ab034001fe00964f7a2531e519916f29cf885d8cf3ffdbb6776 +"@ariakit/core@npm:0.4.14": + version: 0.4.14 + resolution: "@ariakit/core@npm:0.4.14" + checksum: 7faf79069d25b9a869143fc8d25f87ce02be3fbc87183055a5cb93abf6a7989281155493cf1fe18b5d8144f6fab5a60063699d6d53b7e3d3de253e8afd0c33c2 languageName: node linkType: hard -"@ariakit/react-core@npm:0.4.6": - version: 0.4.6 - resolution: "@ariakit/react-core@npm:0.4.6" +"@ariakit/react-core@npm:0.4.15": + version: 0.4.15 + resolution: "@ariakit/react-core@npm:0.4.15" dependencies: - "@ariakit/core": 0.4.6 + "@ariakit/core": 0.4.14 "@floating-ui/dom": ^1.0.0 use-sync-external-store: ^1.2.0 peerDependencies: - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - checksum: cd24d020a380a5de48607119c7f46a1b64bc8780d7b4a18f09207b2a3c13957cfc1c5dc0256ad8dd0924714b074e30f4af5702d25b438885516d9c900cc8ce91 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 8da567eadee423b38b54ea4c58ec19a84e329da141bf0277906a8a69b428ea6326e31e28a7f0fc67c4c8b1c420500137b6bee04e8c12253f2b7b290fb2173439 languageName: node linkType: hard -"@ariakit/react@npm:^0.4.1": - version: 0.4.6 - resolution: "@ariakit/react@npm:0.4.6" +"@ariakit/react@npm:^0.4.15": + version: 0.4.15 + resolution: "@ariakit/react@npm:0.4.15" dependencies: - "@ariakit/react-core": 0.4.6 + "@ariakit/react-core": 0.4.15 peerDependencies: - react: ^17.0.0 || ^18.0.0 - react-dom: ^17.0.0 || ^18.0.0 - checksum: 647d540c81d116de690e80544152471be59ced91ca1a31e81dbafea162397e3ce16844401eac708c06e8ad834ca6779eb373fc4634e28d6ecdb7e0f2fce4a061 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: e89ccb1e56df17cf372b6f6df3217f2e2258bad920ac21044303948f59de4a61ae42142162d12c05b65e4ff63f08a450fa7429aafbb74a9817a65f36607ff980 languageName: node linkType: hard @@ -5253,6 +5253,7 @@ __metadata: "@medusajs/admin-vite-plugin": 2.3.1 "@medusajs/dashboard": 2.3.1 "@medusajs/types": ~2.3.1 + "@rollup/plugin-node-resolve": ^16.0.0 "@types/compression": ^1.7.5 "@vitejs/plugin-react": ^4.2.1 autoprefixer: ^10.4.16 @@ -5600,7 +5601,7 @@ __metadata: version: 0.0.0-use.local resolution: "@medusajs/dashboard@workspace:packages/admin/dashboard" dependencies: - "@ariakit/react": ^0.4.1 + "@ariakit/react": ^0.4.15 "@dnd-kit/core": ^6.1.0 "@dnd-kit/sortable": ^8.0.0 "@hookform/error-message": ^2.0.1 @@ -5613,7 +5614,7 @@ __metadata: "@medusajs/ui": 4.0.3 "@medusajs/ui-preset": 2.3.1 "@radix-ui/react-collapsible": 1.1.0 - "@tanstack/react-query": ^5.28.14 + "@tanstack/react-query": 5.64.2 "@tanstack/react-table": 8.20.5 "@tanstack/react-virtual": ^3.8.3 "@types/node": ^20.11.15 @@ -5766,6 +5767,7 @@ __metadata: "@types/express": ^4.17.17 "@types/jsonwebtoken": ^8.5.9 awilix: ^8.0.1 + chokidar: ^3.4.2 compression: 1.7.4 connect-redis: 5.2.0 cookie-parser: ^1.4.6 @@ -10931,6 +10933,24 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-node-resolve@npm:^16.0.0": + version: 16.0.0 + resolution: "@rollup/plugin-node-resolve@npm:16.0.0" + dependencies: + "@rollup/pluginutils": ^5.0.1 + "@types/resolve": 1.20.2 + deepmerge: ^4.2.2 + is-module: ^1.0.0 + resolve: ^1.22.1 + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: b63deb6fc14b37070ccaffacc8c10c9720f28ce7632f4fe2ee77064c0c79bcc3fe060fb77160e673c9fd847307252f25a2983030bd54f1888324063c69ae1399 + languageName: node + linkType: hard + "@rollup/plugin-replace@npm:^5.0.2": version: 5.0.5 resolution: "@rollup/plugin-replace@npm:5.0.5" @@ -13031,21 +13051,21 @@ __metadata: languageName: node linkType: hard -"@tanstack/query-core@npm:5.35.1": - version: 5.35.1 - resolution: "@tanstack/query-core@npm:5.35.1" - checksum: c991efeb29ec42f9aadf43130dac5e4e9e0651880ef96e0cb5f0dc3224b9b919b34f0e4af53231a7de32582aa7ba801ed6683ed7448e41e7b2a344803f08f3fe +"@tanstack/query-core@npm:5.64.2": + version: 5.64.2 + resolution: "@tanstack/query-core@npm:5.64.2" + checksum: 96dfaa334d2e3aeb3bcd55a3b8b3f3b4f7283b435d90681302ca6c08d0a597a5745c3c790d0242908266af6188efe804aac3c82ca8ed3fd7cd73c24220d93acc languageName: node linkType: hard -"@tanstack/react-query@npm:^5.28.14": - version: 5.35.1 - resolution: "@tanstack/react-query@npm:5.35.1" +"@tanstack/react-query@npm:5.64.2": + version: 5.64.2 + resolution: "@tanstack/react-query@npm:5.64.2" dependencies: - "@tanstack/query-core": 5.35.1 + "@tanstack/query-core": 5.64.2 peerDependencies: - react: ^18.0.0 - checksum: 80b3d4e295b05171e34f522c1856bcd561c58963e7661ae2340f3406a3097b7c9896d4f67005876c634ce1d808791498a987b200f00341e6df9fcc862060e6ad + react: ^18 || ^19 + checksum: 4e81c8e922ced8ef5f2e5975d7784409b532ce007b1771fe8569e380d08666b5323a90fa91de6ef10f9f2f8882d3fdf1be109eeb99a54bd84b1fa2075de9e75b languageName: node linkType: hard