Browse Source

Revert "Scheduled tasks"

Michael Bromley 9 months ago
parent
commit
f96c46fe30
100 changed files with 1903 additions and 4480 deletions
  1. 80 233
      docs/docs/guides/developer-guide/scheduled-tasks/index.md
  2. 0 12
      docs/docs/reference/graphql-api/admin/input-types.md
  3. 0 9
      docs/docs/reference/graphql-api/admin/mutations.md
  4. 0 26
      docs/docs/reference/graphql-api/admin/object-types.md
  5. 0 9
      docs/docs/reference/graphql-api/admin/queries.md
  6. 0 36
      docs/docs/reference/graphql-api/shop/object-types.md
  7. 0 24
      docs/docs/reference/graphql-api/shop/queries.md
  8. 1 1
      docs/docs/reference/typescript-api/assets/asset-options.md
  9. 1 1
      docs/docs/reference/typescript-api/auth/auth-options.md
  10. 1 1
      docs/docs/reference/typescript-api/auth/cookie-options.md
  11. 1 1
      docs/docs/reference/typescript-api/auth/superadmin-credentials.md
  12. 1 1
      docs/docs/reference/typescript-api/common/permission.md
  13. 1 1
      docs/docs/reference/typescript-api/configuration/api-options.md
  14. 1 1
      docs/docs/reference/typescript-api/configuration/entity-options.md
  15. 1 7
      docs/docs/reference/typescript-api/configuration/runtime-vendure-config.md
  16. 1 1
      docs/docs/reference/typescript-api/configuration/system-options.md
  17. 1 7
      docs/docs/reference/typescript-api/configuration/vendure-config.md
  18. 1 1
      docs/docs/reference/typescript-api/import-export/import-export-options.md
  19. 1 1
      docs/docs/reference/typescript-api/job-queue/job-queue-options.md
  20. 1 1
      docs/docs/reference/typescript-api/orders/order-options.md
  21. 1 1
      docs/docs/reference/typescript-api/payment/payment-options.md
  22. 1 1
      docs/docs/reference/typescript-api/products-stock/catalog-options.md
  23. 1 1
      docs/docs/reference/typescript-api/promotions/promotion-options.md
  24. 0 44
      docs/docs/reference/typescript-api/scheduled-tasks/clean-sessions-task.md
  25. 0 83
      docs/docs/reference/typescript-api/scheduled-tasks/default-scheduler-plugin.md
  26. 0 68
      docs/docs/reference/typescript-api/scheduled-tasks/default-scheduler-strategy.md
  27. 0 14
      docs/docs/reference/typescript-api/scheduled-tasks/index.md
  28. 0 164
      docs/docs/reference/typescript-api/scheduled-tasks/scheduled-task.md
  29. 0 41
      docs/docs/reference/typescript-api/scheduled-tasks/scheduler-options.md
  30. 0 54
      docs/docs/reference/typescript-api/scheduled-tasks/scheduler-service.md
  31. 0 119
      docs/docs/reference/typescript-api/scheduled-tasks/scheduler-strategy.md
  32. 5 23
      docs/docs/reference/typescript-api/services/session-service.md
  33. 1 1
      docs/docs/reference/typescript-api/shipping/shipping-options.md
  34. 1 1
      docs/docs/reference/typescript-api/tax/tax-options.md
  35. 0 27
      package-lock.json
  36. 0 3
      packages/admin-ui/.eslintrc.json
  37. 52 52
      packages/admin-ui/i18n-coverage.json
  38. 2 2
      packages/admin-ui/scripts/extract-translations.js
  39. 0 37
      packages/admin-ui/src/lib/core/src/common/generated-types.ts
  40. 0 6
      packages/admin-ui/src/lib/core/src/components/base-nav/base-nav.component.ts
  41. 2 2
      packages/admin-ui/src/lib/core/src/shared/pipes/locale-base.pipe.ts
  42. 39 52
      packages/admin-ui/src/lib/static/i18n-messages/ar.json
  43. 198 211
      packages/admin-ui/src/lib/static/i18n-messages/cs.json
  44. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/de.json
  45. 7 16
      packages/admin-ui/src/lib/static/i18n-messages/en.json
  46. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/es.json
  47. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/fa.json
  48. 6 19
      packages/admin-ui/src/lib/static/i18n-messages/fr.json
  49. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/he.json
  50. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/hr.json
  51. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/it.json
  52. 8 17
      packages/admin-ui/src/lib/static/i18n-messages/ja.json
  53. 7 22
      packages/admin-ui/src/lib/static/i18n-messages/nb.json
  54. 15 28
      packages/admin-ui/src/lib/static/i18n-messages/ne.json
  55. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/pl.json
  56. 2 15
      packages/admin-ui/src/lib/static/i18n-messages/pt_BR.json
  57. 5 17
      packages/admin-ui/src/lib/static/i18n-messages/pt_PT.json
  58. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/ru.json
  59. 11 31
      packages/admin-ui/src/lib/static/i18n-messages/sv.json
  60. 813 826
      packages/admin-ui/src/lib/static/i18n-messages/tr.json
  61. 4 17
      packages/admin-ui/src/lib/static/i18n-messages/uk.json
  62. 224 237
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json
  63. 356 364
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json
  64. 0 96
      packages/admin-ui/src/lib/system/src/components/scheduled-tasks/scheduled-task-list.component.html
  65. 0 8
      packages/admin-ui/src/lib/system/src/components/scheduled-tasks/scheduled-task-list.component.scss
  66. 0 72
      packages/admin-ui/src/lib/system/src/components/scheduled-tasks/scheduled-task-list.component.ts
  67. 0 1
      packages/admin-ui/src/lib/system/src/public_api.ts
  68. 1 7
      packages/admin-ui/src/lib/system/src/system.module.ts
  69. 0 8
      packages/admin-ui/src/lib/system/src/system.routes.ts
  70. 0 23
      packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts
  71. 0 25
      packages/common/src/generated-types.ts
  72. 0 23
      packages/core/e2e/graphql/generated-e2e-admin-types.ts
  73. 0 3
      packages/core/package.json
  74. 0 4
      packages/core/src/api/api-internal-modules.ts
  75. 0 22
      packages/core/src/api/resolvers/admin/scheduled-task.resolver.ts
  76. 1 1
      packages/core/src/api/schema/admin-api/province.api.graphql
  77. 0 24
      packages/core/src/api/schema/admin-api/scheduled-task.api.graphql
  78. 0 2
      packages/core/src/config/config.module.ts
  79. 0 5
      packages/core/src/config/config.service.ts
  80. 2 7
      packages/core/src/config/default-config.ts
  81. 0 33
      packages/core/src/config/vendure-config.ts
  82. 0 1
      packages/core/src/index.ts
  83. 0 2
      packages/core/src/plugin/default-scheduler-plugin/constants.ts
  84. 0 174
      packages/core/src/plugin/default-scheduler-plugin/default-scheduler-strategy.ts
  85. 0 59
      packages/core/src/plugin/default-scheduler-plugin/default-scheduler.plugin.ts
  86. 0 26
      packages/core/src/plugin/default-scheduler-plugin/scheduled-task-record.entity.ts
  87. 0 17
      packages/core/src/plugin/default-scheduler-plugin/types.ts
  88. 0 1
      packages/core/src/plugin/index.ts
  89. 0 4
      packages/core/src/scheduler/index.ts
  90. 0 25
      packages/core/src/scheduler/noop-scheduler-strategy.ts
  91. 0 138
      packages/core/src/scheduler/scheduled-task.ts
  92. 0 71
      packages/core/src/scheduler/scheduler-strategy.ts
  93. 0 12
      packages/core/src/scheduler/scheduler.module.ts
  94. 0 132
      packages/core/src/scheduler/scheduler.service.ts
  95. 0 49
      packages/core/src/scheduler/tasks/clean-sessions-task.ts
  96. 1 2
      packages/core/src/service/service.module.ts
  97. 4 62
      packages/core/src/service/services/session.service.ts
  98. 0 2
      packages/create/templates/vendure-config.hbs
  99. 8 7
      packages/dashboard/src/app/routes/_authenticated/_system/job-queue.tsx
  100. 0 206
      packages/dashboard/src/app/routes/_authenticated/_system/scheduled-tasks.tsx

+ 80 - 233
docs/docs/guides/developer-guide/scheduled-tasks/index.md

@@ -1,9 +1,9 @@
 ---
-title: 'Scheduled Tasks'
+title: "Scheduled Tasks"
 showtoc: true
 ---
 
-Scheduled tasks are a way of executing some code at pre-defined intervals. There are many examples of work that can be done using scheduled tasks,
+Scheduled tasks are a way of executing some code at pre-defined intervals. There are many examples of work that can be done using scheduled tasks, 
 such as:
 
 - Generating a sitemap
@@ -11,284 +11,131 @@ such as:
 - Sending abandoned cart emails
 - Cleaning up old data
 
-Since Vendure v3.3, there is a built-in mechanism which allows you to define scheduled tasks in a convenient and powerful way.
-
-:::info
-All the information on page applies to Vendure v3.3+
-
-For older versions, there is no built-in support for scheduled tasks, but you can
-instead use a [stand-alone script](/guides/developer-guide/stand-alone-scripts/) triggered by a cron job.
-:::
-
-## Setting up the DefaultSchedulerPlugin
-
-In your Vendure config, import and add the [DefaultSchedulerPlugin](/reference/typescript-api/scheduled-tasks/default-scheduler-plugin) to your
-plugins array. If you created your project with a version newer than v3.3, this should already be configured.
-
-```ts title="vendure-config.ts"
-import { DefaultSchedulerPlugin, VendureConfig } from '@vendure/core';
-
-export const config: VendureConfig = {
-    // ...
-    plugins: [DefaultSchedulerPlugin.init()],
-};
-```
-
-When you first add this plugin to your config, you'll need to [generate a migration](/guides/developer-guide/migrations/) because the
-plugin will make use of a new database table in order to guarantee only-once execution of tasks.
-
-You can then start adding tasks. Vendure ships with a task that will clean up old sessions from the database.
-
-:::note
-The `cleanSessionsTask` task is actually configured by default from v3.3+, so normally you won't have to specify this
-manually unless you wish to change any of the default configuration using the `.configure()` method.
-:::
-
-```ts title="vendure-config.ts"
-import { cleanSessionsTask, DefaultSchedulerPlugin, VendureConfig } from '@vendure/core';
-
-export const config: VendureConfig = {
-    // ...
-    schedulerOptions: {
-        tasks: [
-            // Use the task as is
-            cleanSessionsTask,
-            // or further configure the task
-            cleanSessionsTask.configure({
-                // Run the task every day at 3:00am
-                // The default schedule is every day at 00:00am
-                schedule: cron => cron.everyDayAt(3, 0),
-                params: {
-                    // How many sessions to process in each batch
-                    // Default: 10_000
-                    batchSize: 5_000,
-                },
-            }),
-        ],
-    },
-    plugins: [DefaultSchedulerPlugin.init()],
-};
-```
+In Vendure you can create scheduled tasks by defining a [standalone script](/guides/developer-guide/stand-alone-scripts/) which can then 
+be executed via any scheduling mechanism you like, such as a cron job or similar mechanism provided by your hosting provider.
 
 ## Creating a Scheduled Task
 
-Let's imagine that you have created a `SitemapPlugin` that exposes a `SitemapService` which generates a sitemap for your store. You want to run this
-task every night at midnight.
-
-Inside the plugin, you would first define a new [ScheduledTask](/reference/typescript-api/scheduled-tasks/scheduled-task) instance:
-
-```ts title="/plugins/sitemap/config/generate-sitemap-task.ts"
-import { ScheduledTask, RequestContextService } from '@vendure/core';
-
-import { SitemapService } from '../services/sitemap.service';
-
-export const generateSitemapTask = new ScheduledTask({
-    // Give your task a unique ID
-    id: 'generate-sitemap',
-    // A human-readable description of the task
-    description: 'Generates a sitemap file',
-    // Params can be used to further configure aspects of the
-    // task. They get passed in to the `execute` function as the
-    // second argument.
-    // They can be later modified using the `.configure()` method on the instance
-    params: {
-        shopBaseUrl: 'https://www.myshop.com',
-    },
-    // Define a default schedule. This can be modified using the
-    // `.configure()` method on the instance later.
-    schedule: cron => cron.everyDayAt(0, 0),
-    // This is the function that will be executed per the schedule.
-    async execute(injector, params) {
-        // Using `app.get()` we can grab an instance of _any_ provider defined in the
-        // Vendure core as well as by our plugins.
-        const sitemapService = app.get(SitemapService);
-
-        // For most service methods, we'll need to pass a RequestContext object.
-        // We can use the RequestContextService to create one.
-        const ctx = await app.get(RequestContextService).create({
-            apiType: 'admin',
-        });
+Let's imagine that you have created a plugin that exposes a `SitemapService` which generates a sitemap for your store. You want to run this
+task every night at midnight. 
 
-        // Here's the actual work we want to perform.
-        const result = await sitemapService.generateSitemap(ctx);
+First we need to create a standalone script which will run the task. This script will look something like this:
 
-        // The return value from the `execute` function will be available
-        // as the `lastResult` property when viewing tasks.
-        return { result };
-    },
-});
-```
+```ts title="scheduled-tasks.ts"
+import { bootstrapWorker, Logger, RequestContextService } from '@vendure/core';
+import { SitemapService } from './plugins/sitemap';
 
-## Using a task
-
-Now that the task has been defined, we need to tell Vendure to use it.
-
-To do so we need to add it to the [schedulerOptions.tasks](/reference/typescript-api/scheduled-tasks/scheduler-options#tasks) array.
-
-### Adding directly in Vendure config
-
-This can be done directly in your Vendure config file:
-
-```ts title="vendure-config.ts"
-import { cleanSessionsTask, DefaultSchedulerPlugin, VendureConfig } from '@vendure/core';
-
-// highlight-next-line
-import { SitemapPlugin, generateSitemapTask } from './plugins/sitemap';
-
-export const config: VendureConfig = {
-    // ...
-    schedulerOptions: {
-        tasks: [
-            cleanSessionsTask,
-            // highlight-start
-            // Here's an example of overriding the
-            // default params using the `configure()` method.
-            generateSitemapTask.configure({
-                params: {
-                    shopBaseUrl: 'https://www.shoes.com'
-                }
-            }),
-            // highlight-end
-        ],
-    },
-    plugins: [
-        // highlight-next-line
-        SitemapPlugin,
-        DefaultSchedulerPlugin.init()
-    ],
-};
-```
+import { config } from './vendure-config';
 
-### Adding in plugin configuration function
-
-An alternative is that a plugin can automatically add the task to the config using the
-plugin's [configuration function](/reference/typescript-api/plugin/vendure-plugin-metadata#configuration), which allows plugins to alter the Vendure config.
-
-This allows a plugin to encapsulate any scheduled tasks so that the plugin consumer only needs to add the plugin, and not worry about
-separately adding the task to the tasks array.
-
-```ts title="src/plugins/sitemap/sitemap.plugin.ts"
-import { VendurePlugin, PluginCommonModule, Type, ScheduledTask, VendureConfig } from '@vendure/core';
-
-import { PLUGIN_OPTIONS } from './constants';
-import { SitemapPluginOptions } from './types';
-import { SitemapService } from './services/sitemap.service';
-import { generateSitemapTask } from './config/generate-sitemap-task';
-
-@VendurePlugin({
-    imports: [PluginCommonModule],
-    providers: [SitemapService],
-    configuration: (config: VendureConfig) => {
-        // highlight-start
-        // Add the task to the schedulerOptions.tasks array
-        config.schedulerOptions.tasks.push(
-            generateSitemapTask.configure({
-                params: {
-                    shopBaseUrl: SitemapPlugin.options.shopBaseUrl,
-                }
-            })
-        );
-        // highlight-end
-        return config;
-    },
-})
-export class SitemapPlugin {
-    static options: SitemapPluginOptions;
-
-    static init(options?: SitemapPluginOptions) {
-        this.options = {
-            shopBaseUrl: '',
-            ...(options ?? {}),
-        }
-    }
+if (require.main === module) {
+    generateSitemap()
+        .then(() => process.exit(0))
+        .catch(err => {
+            Logger.error(err);
+            process.exit(1);
+        });
 }
-```
 
-This plugin can now be consumed like this:
-
-```ts title="vendure-config.ts"
-import { DefaultSchedulerPlugin, VendureConfig } from '@vendure/core';
-
-// highlight-next-line
-import { SitemapPlugin } from './plugins/sitemap';
-
-export const config: VendureConfig = {
-    // ...
-    plugins: [
-        // highlight-start
-        SitemapPlugin.init({
-            shopBaseUrl: 'https://www.shoes.com'
-        }),
-        // highlight-end
-        DefaultSchedulerPlugin.init()
-    ],
-};
+async function generateSitemap() {
+    // This will bootstrap an instance of the Vendure Worker, providing
+    // us access to all of the services defined in the Vendure core.
+    // (but without the unnecessary overhead of the API layer).
+    const { app } = await bootstrapWorker(config);
+
+    // Using `app.get()` we can grab an instance of _any_ provider defined in the
+    // Vendure core as well as by our plugins.
+    const sitemapService = app.get(SitemapService);
+
+    // For most service methods, we'll need to pass a RequestContext object.
+    // We can use the RequestContextService to create one.
+    const ctx = await app.get(RequestContextService).create({
+        apiType: 'admin',
+    });
+    
+    await sitemapService.generateSitemap(ctx);
+
+    Logger.info(`Completed sitemap generation`);
+}
 ```
 
-## How scheduled tasks work
+### Schedule the task
 
-The key problems solved by Vendure's task scheduler are:
+Each hosting provider has its own way of scheduling tasks. A common way is to use a cron job. 
+For example, to run the above script every night at midnight, you could add the following line to your crontab:
 
-- Ensuring that a task is only run a single time per scheduled execution, even when you have multiple instances of servers and workers running.
-- Keeping scheduled task work away from the server instances, so that it does not affect API responsiveness.
+```bash
+0 0 * * * node /path/to/scheduled-tasks.js
+```
 
-The first problem is handled by the [SchedulerStrategy](/reference/typescript-api/scheduled-tasks/scheduler-strategy), which implements a locking
-mechanism to ensure that the task is executed only once.
+This will run the script `/path/to/scheduled-tasks.js` every night at midnight.
 
-The second problem is handled by having tasks only executed on worker processes.
+### Long-running tasks
 
-## Scheduled tasks vs job queue
+What if the scheduled task does a significant amount of work that would take many minutes to complete? In this case
+you should consider using the [job queue](/guides/developer-guide/worker-job-queue/#using-job-queues-in-a-plugin) to
+execute the work on the worker.
 
-There is some overlap between the use of a scheduled task and a [job queue job](/guides/developer-guide/worker-job-queue/). They both perform some
-task on the worker, independent of requests coming in to the server.
+Taking the above example, let's now imagine that the `SitemapService` exposes a `triggerGenerate()` method which
+adds a new job to the job queue. The job queue will then execute the task in the background, allowing the scheduled
+task to complete quickly.
 
-The first difference is that jobs must be triggered explicitly, whereas scheduled tasks are triggered automatically according to the schedule.
+```ts title="scheduled-tasks.ts"
+import { bootstrapWorker, Logger, RequestContextService } from '@vendure/core';
+import { SitemapService } from './plugins/sitemap';
 
-Secondly, jobs are put in a _queue_ and executed once any prior pending jobs have been processed. On the other hand, scheduled tasks are executed
-as soon as the schedule dictates.
+import { config } from './vendure-config';
 
-It is possible to combine the two: namely, you can define a scheduled task which adds a job to the job queue. This is, for instance, how the
-built-in [cleanSessionsTask](/reference/typescript-api/scheduled-tasks/clean-sessions-task) works. This pattern is something you should
-consider if the scheduled task may take a significant amount of time or resources and you want to let the job queue manage that.
+if (require.main === module) {
+    generateSitemap()
+        .then(() => process.exit(0))
+        .catch(err => {
+            Logger.error(err);
+            process.exit(1);
+        });
+}
 
-It also has the advantage of giving you a record of results for that work that has been put on the job queue, whereas scheduled tasks
-only record that result of the last execution.
+async function generateSitemap() {
+    const { app } = await bootstrapWorker(config);
+    const sitemapService = app.get(SitemapService);
+    const ctx = await app.get(RequestContextService).create({
+        apiType: 'admin',
+    });
+    
+    await sitemapService.triggerGenerate(ctx);
 
+    Logger.info(`Sitemap generation triggered`);
+}
+```
 
-## A note on @nestjs/schedule
+## Using @nestjs/schedule
 
-NestJS provides a [dedicated package for scheduling tasks](https://docs.nestjs.com/techniques/task-scheduling), called `@nestjs/schedule`.
+NestJS provides a [dedicated package for scheduling tasks](https://docs.nestjs.com/techniques/task-scheduling), called `@nestjs/schedule`. 
 
 You can also use this approach to schedule tasks, but you need to aware of a very important caveat:
 
 :::warning
 When using `@nestjs/schedule`, any method decorated with the `@Cron()` decorator will run
-on _all_ instances of the application. This means it will run on the server _and_ on the
+on _all_ instances of the application. This means it will run on the server _and_ on the 
 worker. If you are running multiple instances, then it will run on all instances.
-
-This is the specific issue solved by the built-in ScheduledTask system described above.
-Therefore it is not recommended to use the `@nestjs/schedule` package under normal
-circumstances.
 :::
 
-You can, for instance, inject the [ProcessContext](/reference/typescript-api/common/process-context) into the service and check if the current instance is the worker or the server.
+You can, for instance, inject the ProcessContext into the service and check if the current instance is the worker or the server.
 
 ```ts
 import { Injectable } from '@nestjs/common';
 import { Cron } from '@nestjs/schedule';
 
+
 @Injectable()
 export class SitemapService {
     constructor(private processContext: ProcessContext) {}
 
     @Cron('0 0 * * *')
     async generateSitemap() {
-        // highlight-start
         if (this.processContext.isWorker) {
             // Only run on the worker
             await this.triggerGenerate();
         }
-        // highlight-end
     }
 }
 ```

+ 0 - 12
docs/docs/reference/graphql-api/admin/input-types.md

@@ -4321,18 +4321,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
 <div class="graphql-code-line ">channelIds: [<a href="/reference/graphql-api/admin/object-types#id">ID</a>!]</div>
 
 
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## UpdateScheduledTaskInput
-
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level">input <span class="graphql-code-identifier">UpdateScheduledTaskInput</span> &#123;</div>
-<div class="graphql-code-line ">id: <a href="/reference/graphql-api/admin/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">enabled: <a href="/reference/graphql-api/admin/object-types#boolean">Boolean</a></div>
-
-
 <div class="graphql-code-line top-level">&#125;</div>
 </div>
 

+ 0 - 9
docs/docs/reference/graphql-api/admin/mutations.md

@@ -1838,15 +1838,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
 <div class="graphql-code-line ">updateRole(input: <a href="/reference/graphql-api/admin/input-types#updateroleinput">UpdateRoleInput</a>!): <a href="/reference/graphql-api/admin/object-types#role">Role</a>!</div>
 
 
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## updateScheduledTask
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">Mutation</span> &#123;</div>
-<div class="graphql-code-line ">updateScheduledTask(input: <a href="/reference/graphql-api/admin/input-types#updatescheduledtaskinput">UpdateScheduledTaskInput</a>!): <a href="/reference/graphql-api/admin/object-types#scheduledtask">ScheduledTask</a>!</div>
-
-
 <div class="graphql-code-line top-level">&#125;</div>
 </div>
 

+ 0 - 26
docs/docs/reference/graphql-api/admin/object-types.md

@@ -3519,32 +3519,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
 <div class="graphql-code-line ">customFields: <a href="/reference/graphql-api/admin/object-types#json">JSON</a></div>
 
 
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## ScheduledTask
-
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">ScheduledTask</span> &#123;</div>
-<div class="graphql-code-line ">id: <a href="/reference/graphql-api/admin/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">description: <a href="/reference/graphql-api/admin/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">schedule: <a href="/reference/graphql-api/admin/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">scheduleDescription: <a href="/reference/graphql-api/admin/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">lastExecutedAt: <a href="/reference/graphql-api/admin/object-types#datetime">DateTime</a></div>
-
-<div class="graphql-code-line ">nextExecutionAt: <a href="/reference/graphql-api/admin/object-types#datetime">DateTime</a></div>
-
-<div class="graphql-code-line ">isRunning: <a href="/reference/graphql-api/admin/object-types#boolean">Boolean</a>!</div>
-
-<div class="graphql-code-line ">lastResult: <a href="/reference/graphql-api/admin/object-types#json">JSON</a></div>
-
-<div class="graphql-code-line ">enabled: <a href="/reference/graphql-api/admin/object-types#boolean">Boolean</a>!</div>
-
-
 <div class="graphql-code-line top-level">&#125;</div>
 </div>
 

+ 0 - 9
docs/docs/reference/graphql-api/admin/queries.md

@@ -517,15 +517,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
 <div class="graphql-code-line ">roles(options: <a href="/reference/graphql-api/admin/input-types#rolelistoptions">RoleListOptions</a>): <a href="/reference/graphql-api/admin/object-types#rolelist">RoleList</a>!</div>
 
 
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## scheduledTasks
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">Query</span> &#123;</div>
-<div class="graphql-code-line ">scheduledTasks: [<a href="/reference/graphql-api/admin/object-types#scheduledtask">ScheduledTask</a>!]!</div>
-
-
 <div class="graphql-code-line top-level">&#125;</div>
 </div>
 

+ 0 - 36
docs/docs/reference/graphql-api/shop/object-types.md

@@ -2432,42 +2432,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
 <div class="graphql-code-line ">totalItems: <a href="/reference/graphql-api/shop/object-types#int">Int</a>!</div>
 
 
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## PublicPaymentMethod
-
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">PublicPaymentMethod</span> &#123;</div>
-<div class="graphql-code-line ">id: <a href="/reference/graphql-api/shop/object-types#id">ID</a>!</div>
-
-<div class="graphql-code-line ">code: <a href="/reference/graphql-api/shop/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">name: <a href="/reference/graphql-api/shop/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">description: <a href="/reference/graphql-api/shop/object-types#string">String</a></div>
-
-<div class="graphql-code-line ">translations: [<a href="/reference/graphql-api/shop/object-types#paymentmethodtranslation">PaymentMethodTranslation</a>!]!</div>
-
-
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## PublicShippingMethod
-
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">PublicShippingMethod</span> &#123;</div>
-<div class="graphql-code-line ">id: <a href="/reference/graphql-api/shop/object-types#id">ID</a>!</div>
-
-<div class="graphql-code-line ">code: <a href="/reference/graphql-api/shop/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">name: <a href="/reference/graphql-api/shop/object-types#string">String</a>!</div>
-
-<div class="graphql-code-line ">description: <a href="/reference/graphql-api/shop/object-types#string">String</a></div>
-
-<div class="graphql-code-line ">translations: [<a href="/reference/graphql-api/shop/object-types#shippingmethodtranslation">ShippingMethodTranslation</a>!]!</div>
-
-
 <div class="graphql-code-line top-level">&#125;</div>
 </div>
 

+ 0 - 24
docs/docs/reference/graphql-api/shop/queries.md

@@ -47,30 +47,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
 <div class="graphql-code-line ">activeOrder: <a href="/reference/graphql-api/shop/object-types#order">Order</a></div>
 
 
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## activePaymentMethods
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level comment">"""</div>
-<div class="graphql-code-line top-level comment">Get active payment methods</div>
-<div class="graphql-code-line top-level comment">"""</div>
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">Query</span> &#123;</div>
-<div class="graphql-code-line ">activePaymentMethods: [<a href="/reference/graphql-api/shop/object-types#publicpaymentmethod">PublicPaymentMethod</a>]!</div>
-
-
-<div class="graphql-code-line top-level">&#125;</div>
-</div>
-
-## activeShippingMethods
-<div class="graphql-code-block">
-<div class="graphql-code-line top-level comment">"""</div>
-<div class="graphql-code-line top-level comment">Get active shipping methods</div>
-<div class="graphql-code-line top-level comment">"""</div>
-<div class="graphql-code-line top-level">type <span class="graphql-code-identifier">Query</span> &#123;</div>
-<div class="graphql-code-line ">activeShippingMethods: [<a href="/reference/graphql-api/shop/object-types#publicshippingmethod">PublicShippingMethod</a>]!</div>
-
-
 <div class="graphql-code-line top-level">&#125;</div>
 </div>
 

+ 1 - 1
docs/docs/reference/typescript-api/assets/asset-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## AssetOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="650" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="648" packageName="@vendure/core" />
 
 The AssetOptions define how assets (images and other files) are named and stored, and how preview images are generated.
 

+ 1 - 1
docs/docs/reference/typescript-api/auth/auth-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## AuthOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="335" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="333" packageName="@vendure/core" />
 
 The AuthOptions define how authentication and authorization is managed.
 

+ 1 - 1
docs/docs/reference/typescript-api/auth/cookie-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## CookieOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="230" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="228" packageName="@vendure/core" />
 
 Options for the handling of the cookies used to track sessions (only applicable if
 `authOptions.tokenMethod` is set to `'cookie'`). These options are passed directly

+ 1 - 1
docs/docs/reference/typescript-api/auth/superadmin-credentials.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## SuperadminCredentials
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="826" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="824" packageName="@vendure/core" />
 
 These credentials will be used to create the Superadmin user & administrator
 when Vendure first bootstraps.

+ 1 - 1
docs/docs/reference/typescript-api/common/permission.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## Permission
 
-<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="4443" packageName="@vendure/common" />
+<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="4437" packageName="@vendure/common" />
 
 Permissions for administrators and customers. Used to control access to
 GraphQL resolvers via the <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.

+ 1 - 1
docs/docs/reference/typescript-api/configuration/api-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## ApiOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="73" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="71" packageName="@vendure/core" />
 
 The ApiOptions define how the Vendure GraphQL APIs are exposed, as well as allowing the API layer
 to be extended with middleware.

+ 1 - 1
docs/docs/reference/typescript-api/configuration/entity-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## EntityOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="999" packageName="@vendure/core" since="1.3.0" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="974" packageName="@vendure/core" since="1.3.0" />
 
 Options relating to the internal handling of entities.
 

+ 1 - 7
docs/docs/reference/typescript-api/configuration/runtime-vendure-config.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## RuntimeVendureConfig
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="1262" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="1230" packageName="@vendure/core" />
 
 This interface represents the VendureConfig object available at run-time, i.e. the user-supplied
 config values have been merged with the <a href='/reference/typescript-api/configuration/default-config#defaultconfig'>defaultConfig</a> values.
@@ -26,7 +26,6 @@ interface RuntimeVendureConfig extends Required<VendureConfig> {
     entityOptions: Required<Omit<EntityOptions, 'entityIdStrategy'>> & EntityOptions;
     importExportOptions: Required<ImportExportOptions>;
     jobQueueOptions: Required<JobQueueOptions>;
-    schedulerOptions: Required<SchedulerOptions>;
     orderOptions: Required<OrderOptions>;
     promotionOptions: Required<PromotionOptions>;
     shippingOptions: Required<ShippingOptions>;
@@ -80,11 +79,6 @@ interface RuntimeVendureConfig extends Required<VendureConfig> {
 <MemberInfo kind="property" type={`Required&#60;<a href='/reference/typescript-api/job-queue/job-queue-options#jobqueueoptions'>JobQueueOptions</a>&#62;`}   />
 
 
-### schedulerOptions
-
-<MemberInfo kind="property" type={`Required&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-options#scheduleroptions'>SchedulerOptions</a>&#62;`}   />
-
-
 ### orderOptions
 
 <MemberInfo kind="property" type={`Required&#60;<a href='/reference/typescript-api/orders/order-options#orderoptions'>OrderOptions</a>&#62;`}   />

+ 1 - 1
docs/docs/reference/typescript-api/configuration/system-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## SystemOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="1088" packageName="@vendure/core" since="1.6.0" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="1063" packageName="@vendure/core" since="1.6.0" />
 
 Options relating to system functions.
 

+ 1 - 7
docs/docs/reference/typescript-api/configuration/vendure-config.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## VendureConfig
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="1125" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="1100" packageName="@vendure/core" />
 
 All possible configuration options are defined by the
 [`VendureConfig`](https://github.com/vendure-ecommerce/vendure/blob/master/packages/core/src/config/vendure-config.ts) interface.
@@ -37,7 +37,6 @@ interface VendureConfig {
     logger?: VendureLogger;
     taxOptions?: TaxOptions;
     jobQueueOptions?: JobQueueOptions;
-    schedulerOptions?: SchedulerOptions;
     systemOptions?: SystemOptions;
 }
 ```
@@ -148,11 +147,6 @@ Configures how taxes are calculated on products.
 <MemberInfo kind="property" type={`<a href='/reference/typescript-api/job-queue/job-queue-options#jobqueueoptions'>JobQueueOptions</a>`}   />
 
 Configures how the job queue is persisted and processed.
-### schedulerOptions
-
-<MemberInfo kind="property" type={`<a href='/reference/typescript-api/scheduled-tasks/scheduler-options#scheduleroptions'>SchedulerOptions</a>`}  since="3.3.0"  />
-
-Configures the scheduler mechanism and tasks.
 ### systemOptions
 
 <MemberInfo kind="property" type={`<a href='/reference/typescript-api/configuration/system-options#systemoptions'>SystemOptions</a>`}  since="1.6.0"  />

+ 1 - 1
docs/docs/reference/typescript-api/import-export/import-export-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## ImportExportOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="911" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="909" packageName="@vendure/core" />
 
 Options related to importing & exporting data.
 

+ 1 - 1
docs/docs/reference/typescript-api/job-queue/job-queue-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## JobQueueOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="935" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="933" packageName="@vendure/core" />
 
 Options related to the built-in job queue.
 

+ 1 - 1
docs/docs/reference/typescript-api/orders/order-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## OrderOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="496" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="494" packageName="@vendure/core" />
 
 
 

+ 1 - 1
docs/docs/reference/typescript-api/payment/payment-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## PaymentOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="848" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="846" packageName="@vendure/core" />
 
 Defines payment-related options in the <a href='/reference/typescript-api/configuration/vendure-config#vendureconfig'>VendureConfig</a>.
 

+ 1 - 1
docs/docs/reference/typescript-api/products-stock/catalog-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## CatalogOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="697" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="695" packageName="@vendure/core" />
 
 Options related to products and collections.
 

+ 1 - 1
docs/docs/reference/typescript-api/promotions/promotion-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## PromotionOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="759" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="757" packageName="@vendure/core" />
 
 
 

+ 0 - 44
docs/docs/reference/typescript-api/scheduled-tasks/clean-sessions-task.md

@@ -1,44 +0,0 @@
----
-title: "CleanSessionsTask"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## cleanSessionsTask
-
-<GenerationInfo sourceFile="packages/core/src/scheduler/tasks/clean-sessions-task.ts" sourceLine="37" packageName="@vendure/core" since="3.3.0" />
-
-A scheduled task that cleans expired & inactive sessions from the database.
-
-*Example*
-
-```ts
-import { cleanSessionsTask, VendureConfig } from '@vendure/core';
-
-export const config: VendureConfig = {
-  // ...
-  schedulerOptions: {
-    tasks: [
-      // Use the task as is
-      cleanSessionsTask,
-      // or configure the task
-      cleanSessionsTask.configure({
-        // Run the task every day at 3:00am
-        // The default schedule is every day at 00:00am
-        schedule: cron => cron.everyDayAt(3, 0),
-        params: {
-          // How many sessions to process in each batch
-          // Default: 10_000
-          batchSize: 5_000,
-        },
-      }),
-    ],
-  },
-};
-```
-

+ 0 - 83
docs/docs/reference/typescript-api/scheduled-tasks/default-scheduler-plugin.md

@@ -1,83 +0,0 @@
----
-title: "DefaultSchedulerPlugin"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## DefaultSchedulerPlugin
-
-<GenerationInfo sourceFile="packages/core/src/plugin/default-scheduler-plugin/default-scheduler.plugin.ts" sourceLine="35" packageName="@vendure/core" since="3.3.0" />
-
-This plugin configures a default scheduling strategy that executes scheduled
-tasks using the database to ensure that each task is executed exactly once
-at the scheduled time, even if there are multiple instances of the worker
-running.
-
-*Example*
-
-```ts
-import { DefaultSchedulerPlugin, VendureConfig } from '@vendure/core';
-
-export const config: VendureConfig = {
-  plugins: [
-    DefaultSchedulerPlugin.init({
-      // The default is 60s, but you can override it here
-      defaultTimeout: '10s',
-    }),
-  ],
-};
-```
-
-```ts title="Signature"
-class DefaultSchedulerPlugin {
-    static options: DefaultSchedulerPluginOptions = {
-        defaultTimeout: DEFAULT_TIMEOUT,
-    };
-    init(config: DefaultSchedulerPluginOptions) => ;
-}
-```
-
-<div className="members-wrapper">
-
-### options
-
-<MemberInfo kind="property" type={`<a href='/reference/typescript-api/scheduled-tasks/default-scheduler-plugin#defaultschedulerpluginoptions'>DefaultSchedulerPluginOptions</a>`}   />
-
-
-### init
-
-<MemberInfo kind="method" type={`(config: <a href='/reference/typescript-api/scheduled-tasks/default-scheduler-plugin#defaultschedulerpluginoptions'>DefaultSchedulerPluginOptions</a>) => `}   />
-
-
-
-
-</div>
-
-
-## DefaultSchedulerPluginOptions
-
-<GenerationInfo sourceFile="packages/core/src/plugin/default-scheduler-plugin/types.ts" sourceLine="9" packageName="@vendure/core" since="3.3.0" />
-
-The options for the <a href='/reference/typescript-api/scheduled-tasks/default-scheduler-plugin#defaultschedulerplugin'>DefaultSchedulerPlugin</a>.
-
-```ts title="Signature"
-interface DefaultSchedulerPluginOptions {
-    defaultTimeout?: string | number;
-}
-```
-
-<div className="members-wrapper">
-
-### defaultTimeout
-
-<MemberInfo kind="property" type={`string | number`} default={`60_000ms`}   />
-
-The default timeout for scheduled tasks.
-
-
-</div>

+ 0 - 68
docs/docs/reference/typescript-api/scheduled-tasks/default-scheduler-strategy.md

@@ -1,68 +0,0 @@
----
-title: "DefaultSchedulerStrategy"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## DefaultSchedulerStrategy
-
-<GenerationInfo sourceFile="packages/core/src/plugin/default-scheduler-plugin/default-scheduler-strategy.ts" sourceLine="25" packageName="@vendure/core" since="3.3.0" />
-
-The default <a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#schedulerstrategy'>SchedulerStrategy</a> implementation that uses the database to
-execute scheduled tasks. This strategy is configured when you use the
-<a href='/reference/typescript-api/scheduled-tasks/default-scheduler-plugin#defaultschedulerplugin'>DefaultSchedulerPlugin</a>.
-
-```ts title="Signature"
-class DefaultSchedulerStrategy implements SchedulerStrategy {
-    init(injector: Injector) => ;
-    destroy() => ;
-    executeTask(task: ScheduledTask) => ;
-    getTasks() => Promise<TaskReport[]>;
-    getTask(id: string) => Promise<TaskReport | undefined>;
-    updateTask(input: UpdateScheduledTaskInput) => Promise<TaskReport>;
-}
-```
-* Implements: <code><a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#schedulerstrategy'>SchedulerStrategy</a></code>
-
-
-
-<div className="members-wrapper">
-
-### init
-
-<MemberInfo kind="method" type={`(injector: <a href='/reference/typescript-api/common/injector#injector'>Injector</a>) => `}   />
-
-
-### destroy
-
-<MemberInfo kind="method" type={`() => `}   />
-
-
-### executeTask
-
-<MemberInfo kind="method" type={`(task: <a href='/reference/typescript-api/scheduled-tasks/scheduled-task#scheduledtask'>ScheduledTask</a>) => `}   />
-
-
-### getTasks
-
-<MemberInfo kind="method" type={`() => Promise&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#taskreport'>TaskReport</a>[]&#62;`}   />
-
-
-### getTask
-
-<MemberInfo kind="method" type={`(id: string) => Promise&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#taskreport'>TaskReport</a> | undefined&#62;`}   />
-
-
-### updateTask
-
-<MemberInfo kind="method" type={`(input: UpdateScheduledTaskInput) => Promise&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#taskreport'>TaskReport</a>&#62;`}   />
-
-
-
-
-</div>

+ 0 - 14
docs/docs/reference/typescript-api/scheduled-tasks/index.md

@@ -1,14 +0,0 @@
----
-title: "Scheduled Tasks"
-isDefaultIndex: true
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-import DocCardList from '@theme/DocCardList';
-
-<DocCardList />

+ 0 - 164
docs/docs/reference/typescript-api/scheduled-tasks/scheduled-task.md

@@ -1,164 +0,0 @@
----
-title: "ScheduledTask"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## ScheduledTask
-
-<GenerationInfo sourceFile="packages/core/src/scheduler/scheduled-task.ts" sourceLine="90" packageName="@vendure/core" since="3.3.0" />
-
-Use this class to define a scheduled task that will be executed at a given cron schedule.
-
-*Example*
-
-```ts
-import { ScheduledTask } from '@vendure/core';
-
-const task = new ScheduledTask({
-    id: 'test-job',
-    schedule: cron => cron.every(2).minutes(),
-    execute: async (injector, params) => {
-        // some logic here
-    },
-});
-```
-
-```ts title="Signature"
-class ScheduledTask<C extends Record<string, any> = Record<string, any>> {
-    constructor(config: ScheduledTaskConfig<C>)
-    id: void
-    options: void
-    execute(injector: Injector) => ;
-    configure(additionalConfig: Partial<Pick<ScheduledTaskConfig<C>, 'schedule' | 'timeout' | 'params'>>) => ;
-}
-```
-
-<div className="members-wrapper">
-
-### constructor
-
-<MemberInfo kind="method" type={`(config: <a href='/reference/typescript-api/scheduled-tasks/scheduled-task#scheduledtaskconfig'>ScheduledTaskConfig</a>&#60;C&#62;) => ScheduledTask`}   />
-
-
-### id
-
-<MemberInfo kind="property" type={``}   />
-
-
-### options
-
-<MemberInfo kind="property" type={``}   />
-
-
-### execute
-
-<MemberInfo kind="method" type={`(injector: <a href='/reference/typescript-api/common/injector#injector'>Injector</a>) => `}   />
-
-
-### configure
-
-<MemberInfo kind="method" type={`(additionalConfig: Partial&#60;Pick&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduled-task#scheduledtaskconfig'>ScheduledTaskConfig</a>&#60;C&#62;, 'schedule' | 'timeout' | 'params'&#62;&#62;) => `}   />
-
-This method allows you to further configure existing scheduled tasks. For example, you may
-wish to change the schedule or timeout of a task, without having to define a new task.
-
-*Example*
-
-```ts
-import { ScheduledTask } from '@vendure/core';
-
-const task = new ScheduledTask({
-    id: 'test-job',
-    schedule: cron => cron.every(2).minutes(),
-    execute: async (injector, params) => {
-        // some logic here
-    },
-});
-
-// later, you can configure the task
-task.configure({ schedule: cron => cron.every(5).minutes() });
-```
-
-
-</div>
-
-
-## ScheduledTaskConfig
-
-<GenerationInfo sourceFile="packages/core/src/scheduler/scheduled-task.ts" sourceLine="12" packageName="@vendure/core" since="3.3.0" />
-
-The configuration for a scheduled task.
-
-```ts title="Signature"
-interface ScheduledTaskConfig<C extends Record<string, any> = Record<string, any>> {
-    id: string;
-    description?: string;
-    params?: C;
-    schedule: string | ((cronTime: typeof CronTime) => string);
-    timeout?: number | string;
-    preventOverlap?: boolean;
-    execute(injector: Injector, config: C): Promise<any>;
-}
-```
-
-<div className="members-wrapper">
-
-### id
-
-<MemberInfo kind="property" type={`string`}   />
-
-The unique identifier for the scheduled task.
-### description
-
-<MemberInfo kind="property" type={`string`}   />
-
-The description for the scheduled task.
-### params
-
-<MemberInfo kind="property" type={`C`}   />
-
-Optional parameters that will be passed to the `execute` function.
-### schedule
-
-<MemberInfo kind="property" type={`string | ((cronTime: typeof CronTime) =&#62; string)`}   />
-
-The cron schedule for the scheduled task. This can be a standard cron expression or
-a function that returns a [cron-time-generator](https://www.npmjs.com/package/cron-time-generator)
-expression.
-
-*Example*
-
-```ts
-// Standard cron expression
-{ schedule: '0 0-23/5 * * *', } // every 5 hours
-{ schedule: '0 22 * * *', } // every day at 10:00 PM
-
-// Cron-time-generator expression
-{ schedule: cronTime => cronTime.every(2).minutes(), }
-{ schedule: cronTime => cronTime.every(5).hours(), }
-```
-### timeout
-
-<MemberInfo kind="property" type={`number | string`} default={`60_000ms`}   />
-
-The timeout for the scheduled task. If the task takes longer than the timeout, the task
-will be considered to have failed with a timeout error.
-### preventOverlap
-
-<MemberInfo kind="property" type={`boolean`} default={`true`}   />
-
-Whether the scheduled task should be prevented from running if it is already running.
-### execute
-
-<MemberInfo kind="method" type={`(injector: <a href='/reference/typescript-api/common/injector#injector'>Injector</a>, config: C) => Promise&#60;any&#62;`}   />
-
-The function that will be executed when the scheduled task is run.
-
-
-</div>

+ 0 - 41
docs/docs/reference/typescript-api/scheduled-tasks/scheduler-options.md

@@ -1,41 +0,0 @@
----
-title: "SchedulerOptions"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## SchedulerOptions
-
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="974" packageName="@vendure/core" since="3.3.0" />
-
-Options related to scheduled tasks..
-
-```ts title="Signature"
-interface SchedulerOptions {
-    schedulerStrategy?: SchedulerStrategy;
-    tasks?: ScheduledTask[];
-}
-```
-
-<div className="members-wrapper">
-
-### schedulerStrategy
-
-<MemberInfo kind="property" type={`<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#schedulerstrategy'>SchedulerStrategy</a>`}   />
-
-The strategy used to execute scheduled tasks. If you are using the
-<a href='/reference/typescript-api/scheduled-tasks/default-scheduler-plugin#defaultschedulerplugin'>DefaultSchedulerPlugin</a> (which is recommended) then this will be set to the
-<a href='/reference/typescript-api/scheduled-tasks/default-scheduler-strategy#defaultschedulerstrategy'>DefaultSchedulerStrategy</a>.
-### tasks
-
-<MemberInfo kind="property" type={`<a href='/reference/typescript-api/scheduled-tasks/scheduled-task#scheduledtask'>ScheduledTask</a>[]`}   />
-
-The tasks to be executed.
-
-
-</div>

+ 0 - 54
docs/docs/reference/typescript-api/scheduled-tasks/scheduler-service.md

@@ -1,54 +0,0 @@
----
-title: "SchedulerService"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## SchedulerService
-
-<GenerationInfo sourceFile="packages/core/src/scheduler/scheduler.service.ts" sourceLine="33" packageName="@vendure/core" since="3.3.0" />
-
-The service that is responsible for setting up and querying the scheduled tasks.
-
-```ts title="Signature"
-class SchedulerService implements OnApplicationBootstrap {
-    constructor(configService: ConfigService)
-    onApplicationBootstrap() => ;
-    getTaskList() => Promise<TaskInfo[]>;
-    updateTask(input: UpdateScheduledTaskInput) => Promise<TaskInfo>;
-}
-```
-* Implements: <code>OnApplicationBootstrap</code>
-
-
-
-<div className="members-wrapper">
-
-### constructor
-
-<MemberInfo kind="method" type={`(configService: ConfigService) => SchedulerService`}   />
-
-
-### onApplicationBootstrap
-
-<MemberInfo kind="method" type={`() => `}   />
-
-
-### getTaskList
-
-<MemberInfo kind="method" type={`() => Promise&#60;TaskInfo[]&#62;`}   />
-
-Returns a list of all the scheduled tasks and their current status.
-### updateTask
-
-<MemberInfo kind="method" type={`(input: UpdateScheduledTaskInput) => Promise&#60;TaskInfo&#62;`}   />
-
-
-
-
-</div>

+ 0 - 119
docs/docs/reference/typescript-api/scheduled-tasks/scheduler-strategy.md

@@ -1,119 +0,0 @@
----
-title: "SchedulerStrategy"
-isDefaultIndex: false
-generated: true
----
-<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
-import MemberInfo from '@site/src/components/MemberInfo';
-import GenerationInfo from '@site/src/components/GenerationInfo';
-import MemberDescription from '@site/src/components/MemberDescription';
-
-
-## SchedulerStrategy
-
-<GenerationInfo sourceFile="packages/core/src/scheduler/scheduler-strategy.ts" sourceLine="42" packageName="@vendure/core" since="3.3.0" />
-
-This strategy is used to define the mechanism by which scheduled tasks are executed
-and how they are reported on. The main purpose of this strategy is to ensure
-that a given task is executed exactly once at the scheduled time, even if there
-are multiple instances of the worker running.
-
-To do this, the strategy must use some form of shared storage and a method of
-locking so that only a single worker is allowed to execute the task.
-
-By default, the <a href='/reference/typescript-api/scheduled-tasks/default-scheduler-strategy#defaultschedulerstrategy'>DefaultSchedulerStrategy</a> will use the database to enable
-this functionality.
-
-```ts title="Signature"
-interface SchedulerStrategy extends InjectableStrategy {
-    executeTask(task: ScheduledTask): (job: Cron) => Promise<any> | any;
-    getTasks(): Promise<TaskReport[]>;
-    getTask(id: string): Promise<TaskReport | undefined>;
-    updateTask(input: UpdateScheduledTaskInput): Promise<TaskReport>;
-}
-```
-* Extends: <code><a href='/reference/typescript-api/common/injectable-strategy#injectablestrategy'>InjectableStrategy</a></code>
-
-
-
-<div className="members-wrapper">
-
-### executeTask
-
-<MemberInfo kind="method" type={`(task: <a href='/reference/typescript-api/scheduled-tasks/scheduled-task#scheduledtask'>ScheduledTask</a>) => (job: Cron) =&#62; Promise&#60;any&#62; | any`}   />
-
-Execute a scheduled task. This method must also take care of
-ensuring that the task is executed exactly once at the scheduled time,
-even if there are multiple instances of the worker running.
-
-For instance, in the <a href='/reference/typescript-api/scheduled-tasks/default-scheduler-strategy#defaultschedulerstrategy'>DefaultSchedulerStrategy</a> we make use of a
-dedicated database table and a locking mechansim. If you implement a custom
-SchedulerStrategy, you must use some other form of shared locking mechanism
-that could make use of something like Redis etc. to ensure that the task
-is executed exactly once at the scheduled time.
-### getTasks
-
-<MemberInfo kind="method" type={`() => Promise&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#taskreport'>TaskReport</a>[]&#62;`}   />
-
-Get all scheduled tasks.
-### getTask
-
-<MemberInfo kind="method" type={`(id: string) => Promise&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#taskreport'>TaskReport</a> | undefined&#62;`}   />
-
-Get a single scheduled task by its id.
-### updateTask
-
-<MemberInfo kind="method" type={`(input: UpdateScheduledTaskInput) => Promise&#60;<a href='/reference/typescript-api/scheduled-tasks/scheduler-strategy#taskreport'>TaskReport</a>&#62;`}   />
-
-Update a scheduled task.
-
-
-</div>
-
-
-## TaskReport
-
-<GenerationInfo sourceFile="packages/core/src/scheduler/scheduler-strategy.ts" sourceLine="16" packageName="@vendure/core" since="3.3.0" />
-
-A report on the status of a scheduled task.
-
-```ts title="Signature"
-interface TaskReport {
-    id: string;
-    lastExecutedAt: Date | null;
-    isRunning: boolean;
-    lastResult: any;
-    enabled: boolean;
-}
-```
-
-<div className="members-wrapper">
-
-### id
-
-<MemberInfo kind="property" type={`string`}   />
-
-
-### lastExecutedAt
-
-<MemberInfo kind="property" type={`Date | null`}   />
-
-
-### isRunning
-
-<MemberInfo kind="property" type={`boolean`}   />
-
-
-### lastResult
-
-<MemberInfo kind="property" type={`any`}   />
-
-
-### enabled
-
-<MemberInfo kind="property" type={`boolean`}   />
-
-
-
-
-</div>

+ 5 - 23
docs/docs/reference/typescript-api/services/session-service.md

@@ -11,14 +11,13 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## SessionService
 
-<GenerationInfo sourceFile="packages/core/src/service/services/session.service.ts" sourceLine="31" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/service/services/session.service.ts" sourceLine="28" packageName="@vendure/core" />
 
 Contains methods relating to <a href='/reference/typescript-api/entities/session#session'>Session</a> entities.
 
 ```ts title="Signature"
-class SessionService implements EntitySubscriberInterface, OnApplicationBootstrap {
-    constructor(connection: TransactionalConnection, configService: ConfigService, orderService: OrderService, jobQueueService: JobQueueService, requestContextService: RequestContextService)
-    onApplicationBootstrap() => ;
+class SessionService implements EntitySubscriberInterface {
+    constructor(connection: TransactionalConnection, configService: ConfigService, orderService: OrderService)
     createNewAuthenticatedSession(ctx: RequestContext, user: User, authenticationStrategyName: string) => Promise<AuthenticatedSession>;
     createAnonymousSession() => Promise<CachedSession>;
     getSessionFromToken(sessionToken: string) => Promise<CachedSession | undefined>;
@@ -28,11 +27,9 @@ class SessionService implements EntitySubscriberInterface, OnApplicationBootstra
     setActiveChannel(serializedSession: CachedSession, channel: Channel) => Promise<CachedSession>;
     deleteSessionsByUser(ctx: RequestContext, user: User) => Promise<void>;
     deleteSessionsByActiveOrderId(ctx: RequestContext, activeOrderId: ID) => Promise<void>;
-    triggerCleanSessionsJob(batchSize: number) => ;
-    cleanExpiredSessions(ctx: RequestContext, batchSize: number) => ;
 }
 ```
-* Implements: <code>EntitySubscriberInterface</code>, <code>OnApplicationBootstrap</code>
+* Implements: <code>EntitySubscriberInterface</code>
 
 
 
@@ -40,12 +37,7 @@ class SessionService implements EntitySubscriberInterface, OnApplicationBootstra
 
 ### constructor
 
-<MemberInfo kind="method" type={`(connection: <a href='/reference/typescript-api/data-access/transactional-connection#transactionalconnection'>TransactionalConnection</a>, configService: ConfigService, orderService: <a href='/reference/typescript-api/services/order-service#orderservice'>OrderService</a>, jobQueueService: <a href='/reference/typescript-api/job-queue/job-queue-service#jobqueueservice'>JobQueueService</a>, requestContextService: <a href='/reference/typescript-api/request/request-context-service#requestcontextservice'>RequestContextService</a>) => SessionService`}   />
-
-
-### onApplicationBootstrap
-
-<MemberInfo kind="method" type={`() => `}   />
+<MemberInfo kind="method" type={`(connection: <a href='/reference/typescript-api/data-access/transactional-connection#transactionalconnection'>TransactionalConnection</a>, configService: ConfigService, orderService: <a href='/reference/typescript-api/services/order-service#orderservice'>OrderService</a>) => SessionService`}   />
 
 
 ### createNewAuthenticatedSession
@@ -94,16 +86,6 @@ Deletes all existing sessions for the given user.
 <MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, activeOrderId: <a href='/reference/typescript-api/common/id#id'>ID</a>) => Promise&#60;void&#62;`}   />
 
 Deletes all existing sessions with the given activeOrder.
-### triggerCleanSessionsJob
-
-<MemberInfo kind="method" type={`(batchSize: number) => `}   />
-
-Triggers the clean sessions job.
-### cleanExpiredSessions
-
-<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, batchSize: number) => `}   />
-
-Cleans expired sessions from the database & the session cache.
 
 
 </div>

+ 1 - 1
docs/docs/reference/typescript-api/shipping/shipping-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## ShippingOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="775" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="773" packageName="@vendure/core" />
 
 
 

+ 1 - 1
docs/docs/reference/typescript-api/tax/tax-options.md

@@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## TaxOptions
 
-<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="888" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/vendure-config.ts" sourceLine="886" packageName="@vendure/core" />
 
 
 

+ 0 - 27
package-lock.json

@@ -22242,30 +22242,6 @@
         "node": ">=12.0.0"
       }
     },
-    "node_modules/cron-time-generator": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/cron-time-generator/-/cron-time-generator-2.0.3.tgz",
-      "integrity": "sha512-02Ab5okFEMpcDernEwUXY16hLCryUxATAFGYyzyLymin0xl/udC50LkBFHX+qOeXnwXMRyK+uH4doXzUSpOoQA==",
-      "license": "MIT"
-    },
-    "node_modules/croner": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/croner/-/croner-9.0.0.tgz",
-      "integrity": "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=18.0"
-      }
-    },
-    "node_modules/cronstrue": {
-      "version": "2.57.0",
-      "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.57.0.tgz",
-      "integrity": "sha512-gQOfxJa1RA9uDT4hx37NshhX4dW9t9zTCtIYu15LUziH+mkpuLXYcSEyM8ZewMJ2p8UVuHGjI3n4hGpu3HtCbg==",
-      "license": "MIT",
-      "bin": {
-        "cronstrue": "bin/cli.js"
-      }
-    },
     "node_modules/cross-env": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
@@ -45794,9 +45770,6 @@
         "bcrypt": "^5.1.1",
         "body-parser": "^1.20.2",
         "cookie-session": "^2.1.0",
-        "cron-time-generator": "^2.0.3",
-        "croner": "^9.0.0",
-        "cronstrue": "^2.57.0",
         "csv-parse": "^5.6.0",
         "express": "^5.0.1",
         "fs-extra": "^11.2.0",

+ 0 - 3
packages/admin-ui/.eslintrc.json

@@ -39,9 +39,6 @@
             "style": "kebab-case"
           }
         ],
-        "@angular-eslint/prefer-standalone": [
-          "off"
-        ],
         "@angular-eslint/no-input-rename": "off",
         "@typescript-eslint/array-type": [
           "error",

+ 52 - 52
packages/admin-ui/i18n-coverage.json

@@ -1,116 +1,116 @@
 {
-  "generatedOn": "2025-04-08T07:15:55.418Z",
-  "lastCommit": "6243ab84efd87ea325ecc4042db6df71476e1c82",
+  "generatedOn": "2025-03-07T07:52:20.824Z",
+  "lastCommit": "f59b60092015fc28f282a23ce9d60754d58f0b6b",
   "translationStatus": {
     "ar": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "cs": {
-      "tokenCount": 793,
-      "translatedCount": 793,
-      "percentage": 100
+      "tokenCount": 780,
+      "translatedCount": 590,
+      "percentage": 76
     },
     "de": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "en": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 784,
+      "translatedCount": 783,
       "percentage": 100
     },
     "es": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "fa": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "fr": {
-      "tokenCount": 793,
-      "translatedCount": 793,
-      "percentage": 100
+      "tokenCount": 780,
+      "translatedCount": 776,
+      "percentage": 99
     },
     "he": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "hr": {
-      "tokenCount": 793,
-      "translatedCount": 792,
+      "tokenCount": 780,
+      "translatedCount": 777,
       "percentage": 100
     },
     "it": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "ja": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 784,
+      "translatedCount": 784,
       "percentage": 100
     },
     "nb": {
-      "tokenCount": 793,
-      "translatedCount": 793,
-      "percentage": 100
+      "tokenCount": 778,
+      "translatedCount": 773,
+      "percentage": 99
     },
     "ne": {
-      "tokenCount": 793,
-      "translatedCount": 793,
-      "percentage": 100
+      "tokenCount": 780,
+      "translatedCount": 767,
+      "percentage": 98
     },
     "pl": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 779,
       "percentage": 100
     },
     "pt_BR": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 780,
       "percentage": 100
     },
     "pt_PT": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 781,
+      "translatedCount": 781,
       "percentage": 100
     },
     "ru": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "sv": {
-      "tokenCount": 793,
-      "translatedCount": 789,
+      "tokenCount": 773,
+      "translatedCount": 767,
       "percentage": 99
     },
     "tr": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 780,
       "percentage": 100
     },
     "uk": {
-      "tokenCount": 793,
-      "translatedCount": 793,
+      "tokenCount": 780,
+      "translatedCount": 778,
       "percentage": 100
     },
     "zh_Hans": {
-      "tokenCount": 793,
-      "translatedCount": 793,
-      "percentage": 100
+      "tokenCount": 780,
+      "translatedCount": 560,
+      "percentage": 72
     },
     "zh_Hant": {
-      "tokenCount": 793,
-      "translatedCount": 793,
-      "percentage": 100
+      "tokenCount": 780,
+      "translatedCount": 407,
+      "percentage": 52
     }
   }
 }

+ 2 - 2
packages/admin-ui/scripts/extract-translations.js

@@ -50,11 +50,11 @@ async function extractTranslations() {
 }
 
 function runExtraction(locale) {
-    const command = 'npx';
+    const command = 'npm';
     const args = getNgxTranslateExtractCommand(locale);
     return new Promise((resolve, reject) => {
         try {
-            const child = spawn(command, args, { stdio: ['inherit', 'inherit', 'inherit'] });
+            const child = spawn(`yarnpkg`, args, { stdio: ['inherit', 'inherit', 'inherit'] });
             child.on('close', x => {
                 resolve();
             });

File diff suppressed because it is too large
+ 0 - 37
packages/admin-ui/src/lib/core/src/common/generated-types.ts


+ 0 - 6
packages/admin-ui/src/lib/core/src/components/base-nav/base-nav.component.ts

@@ -316,12 +316,6 @@ export class BaseNavComponent implements OnInit, OnDestroy {
                             })),
                         ),
                     },
-                    {
-                        id: 'scheduled-tasks',
-                        label: _('nav.scheduled-tasks'),
-                        routerLink: ['/system', 'scheduled-tasks'],
-                        icon: 'clock',
-                    },
                 ],
             },
         ]);

+ 2 - 2
packages/admin-ui/src/lib/core/src/shared/pipes/locale-base.pipe.ts

@@ -19,7 +19,7 @@ export abstract class LocaleBasePipe implements OnDestroy, PipeTransform {
                 .mapStream(data => data.uiState)
                 .subscribe(({ language, locale }) => {
                     this.locale = language.replace(/_/g, '-');
-                    if (locale && !this.locale.includes('-')) {
+                    if (locale) {
                         this.locale += `-${locale}`;
                     }
                     changeDetectorRef.markForCheck();
@@ -38,7 +38,7 @@ export abstract class LocaleBasePipe implements OnDestroy, PipeTransform {
      * is valid for the Intl API.
      */
     protected getActiveLocale(localeOverride?: unknown): string {
-        const locale = typeof localeOverride === 'string' ? localeOverride : (this.locale ?? 'en');
+        const locale = typeof localeOverride === 'string' ? localeOverride : this.locale ?? 'en';
         const hyphenated = locale?.replace(/_/g, '-');
 
         // Check for a double-region string, containing 2 region codes like

+ 39 - 52
packages/admin-ui/src/lib/static/i18n-messages/ar.json

@@ -4,9 +4,8 @@
   },
   "asset": {
     "add-asset": "إضافة أصل",
-    "add-asset-with-count": "إضافة {count, plural, =0 {أصول} one {1 أصل} other {{count} أصول}}",
+    "add-asset-with-count": "إضافة {count , plural , = 0 {أصول} {1 أصل} {{count} أصول}}",
     "assets-selected-count": "{count} أصول محددة",
-    "change-asset": "تعديل الأصل",
     "dimensions": "أبعاد",
     "focal-point": "النقطة المحورية",
     "notify-create-assets-success": "إنشاء {count, plural, one {أصل جديد} other {{count} أصول جديدة}}",
@@ -17,7 +16,6 @@
     "select-assets": "حدد الأصول",
     "set-as-featured-asset": "تعيين كأصل مميز",
     "set-focal-point": "تعيين نقطة بؤرية",
-    "size": "الحجم",
     "source-file": "مصدر الملف",
     "unset-focal-point": "غير معرف",
     "update-focal-point": "نقطة التحديث",
@@ -47,7 +45,6 @@
     "profile": "حساب تعريفي",
     "promotions": "العروض",
     "roles": "الأدوار",
-    "scheduled-tasks": "المهام المجدولة",
     "seller-orders": "أوامر البائع",
     "sellers": "البائعون",
     "shipping-methods": "طرق الشحن",
@@ -67,10 +64,10 @@
     "asset": "أصل",
     "asset-preview-links": "روابط معاينة النماذج",
     "assets": "نماذج",
-    "assign-product-to-channel-success": "تم تعيينه بنجاح {count, plural, one {1 منتج} other {{count} منتجات}} إلى {channel}",
+    "assign-product-to-channel-success": "تم تعيينه بنجاح {count , الجمع , واحد {1 منتج} {{count} products}} إلى {channel}",
     "assign-products-to-channel": "تعيين المنتجات للقناة",
-    "assign-to-named-channel": "تعيين إلى {channelCode}",
-    "assign-variant-to-channel-success": "تم تعيين {count, plural, one {1 متغير المنتج} other {{count} متغيرات المنتج}} إلى {channel}",
+    "assign-to-named-channel": "تعيين إلى {ChannelCode}",
+    "assign-variant-to-channel-success": "تم تعيين {count , الجمع , واحد {1 متغير المنتج} {{count} متغيرات المنتج}} إلى {channel}",
     "assign-variants-to-channel": "تعيين متغيرات المنتج للقناة",
     "auto-update-option-variant-name": "تحديث أسماء ProductVariants تلقائيًا باستخدام هذا الخيار",
     "auto-update-product-variant-name": "تحديث أسماء ProductVariants تلقائيًا",
@@ -83,12 +80,12 @@
     "collections": "مجموعات",
     "confirm-bulk-delete-products": "حذف {count} منتجات؟",
     "confirm-cancel": "إلغاء؟",
-    "confirm-delete-assets": "حذف {count} {count, plural, one {أصل} other {أصول}}؟",
+    "confirm-delete-assets": "حذف {count} {count , الجمع , واحد {Asset} آخر {الأصول}}؟",
     "confirm-delete-facet-value": "حذف قيمة الفئة؟",
     "confirm-delete-product": "حذف المنتج؟",
     "confirm-delete-product-option": "حذف خيار المنتج \" {name} \"؟",
     "confirm-delete-product-option-group": "حذف مجموعة خيار المنتج \" {name} \"؟",
-    "confirm-delete-product-option-group-body": "يتم استخدام مجموعة الخيار هذه بواسطة {count} {count, plural, one {متغير} other {متغيرات}}. هل أنت متأكد أنك تريد حذفه؟",
+    "confirm-delete-product-option-group-body": "يتم استخدام مجموعة الخيار هذه بواسطة {count} {count , الجمع , واحد {variant} {{المتغيرات}}. هل أنت متأكد أنك تريد حذفه؟",
     "confirm-delete-product-variant": "حذف متغير المنتج \" {name} \"؟",
     "confirm-deletion-of-unused-variants-body": "تم إجراء متغيرات المنتج التالية قديمة بسبب إضافة خيارات جديدة. سيتم حذفها أثناء إنشاء متغيرات المنتج الجديدة.",
     "confirm-deletion-of-unused-variants-title": "حذف متغيرات المنتجات القديمة؟",
@@ -120,7 +117,7 @@
     "manage-variants": "إدارة المتغيرات",
     "move-collection-to": "انتقل إلى {name}",
     "move-collections": "تحرك المجموعات",
-    "move-collections-success": "تم نقل {count, plural, one {1 مجموعة} other {{count} مجموعات}}",
+    "move-collections-success": "تم نقل {count , الجمع , واحد {1 collection} {{count} collections}}",
     "move-down": "تحرك لأسفل",
     "move-to": "الانتقال إلى",
     "move-up": "تحرك",
@@ -130,7 +127,7 @@
     "no-selection": "لا اختيار",
     "no-stock-locations-available-on-current-channel": "لا توجد مواقع مخزون متوفرة على القناة الحالية. قم بإعداد موقع مخزون واحد على الأقل قبل إضافة منتجات.",
     "notify-bulk-delete-products-success": "تم بنجاح إزالة {count, plural, one {منتج واحد} other {{count} منتجات}}",
-    "notify-remove-facets-from-channel-success": "تم بنجاح إزالة {count, plural, one {فئة واحدة} other {{count} فئات}} من {channelCode}",
+    "notify-remove-facets-from-channel-success": "تم بنجاح إزالة {count, plural, one {فئة واحدة} other {{count} فئات}} from { channelCode }",
     "notify-remove-product-from-channel-error": "لا يمكن إزالة المنتج من القناة",
     "notify-remove-product-from-channel-success": "تمت إزالة المنتج بنجاح من القناة",
     "notify-remove-variant-from-channel-error": "لا يمكن إزالة متغير المنتج من القناة",
@@ -159,16 +156,16 @@
     "quick-jump-placeholder": "القفزة السريعة إلى البديل",
     "rebuild-search-index": "إعادة بناء مؤشر البحث",
     "reindex-error": "حدث خطأ أثناء إعادة بناء مؤشر البحث",
-    "reindex-successful": "مفهرسة {count, plural, one {متغير المنتج} other {{count} متغيرات المنتج}} في {time} ms",
+    "reindex-successful": "مفهرسة {count , الجمع , واحد {متغير المنتج} آخر {{count} متغيرات المنتج}} في {time} ms",
     "reindexing": "إعادة بناء مؤشر البحث",
-    "remove-from-channel": "إزالة من {channelCode, plural, one {قناة} other {القنوات}}",
+    "remove-from-channel": "إزالة من {channelcode , حدد , غير محدد {Channel} {{{channelcode}}}",
     "remove-option": "إزالة الخيار",
     "remove-product-from-channel": "إزالة المنتج من القناة",
     "remove-product-variant-from-channel": "إزالة متغير المنتج من القناة",
     "reorder-collection": "إعادة الترتيب",
     "root-collection": "مجموعة الجذر",
-    "run-pending-search-index-updates": "فهرس البحث: تشغيل {count, plural, one {1 تحديث معلق} other {{count} تحديثات معلقة}}",
-    "running-search-index-updates": "تشغيل {count, plural, one {1 تحديث} other {{count} تحديثات}} للبحث عن فهرس",
+    "run-pending-search-index-updates": "فهرس البحث: تشغيل {count , الجمع , واحد {1 معلق تحديث} {{count} تحديثات معلقة}}",
+    "running-search-index-updates": "تشغيل {count , الجمع , واحد {1 تحديث} {{count} تحديثات}}} للبحث عن فهرس",
     "search-asset-name-or-tag": "ابحث باسم النماذج أو العلامات",
     "search-for-term": "ابحث عن المصطلح",
     "search-product-name-or-code": "البحث حسب اسم المنتج أو الرمز",
@@ -193,7 +190,7 @@
     "use-global-value": "استخدام القيمة العالمية",
     "values": "قيم",
     "variant": "البديل",
-    "variant-count": "{count, plural, one {1 متغير} other {{count} متغيرات}}",
+    "variant-count": "{count , الجمع , واحد {1 متغير} {{count} المتغيرات}}",
     "view-contents": "عرض المحتويات",
     "visibility": "الرؤية"
   },
@@ -240,14 +237,12 @@
     "delete": "إزالة",
     "description": "وصف",
     "details": "تفاصيل",
-    "disable": "إيقاف",
     "disabled": "عاجز",
     "discard-changes": "تجاهل التغييرات",
     "duplicate": "تكرار",
     "edit": "تحرير",
     "edit-field": "تحرير الحقل",
     "edit-note": "تحرير مذكرة",
-    "enable": "تمكين",
     "enabled": "تمكين",
     "end-date": "تاريخ الانتهاء",
     "expand-entries": "توسيع إدخالات",
@@ -261,7 +256,7 @@
     "id": "بطاقة تعريف",
     "image": "صورة",
     "items-per-page-option": "{count} لكل صفحة",
-    "items-selected-count": "{count} {count, plural, one {عنصر} other {عناصر}} المحددة",
+    "items-selected-count": "{count} {count , الجمع , واحد {item} آخر {العناصر}} المحددة",
     "keep-editing": "استمر في التحرير",
     "language": "لغة",
     "launch-extension": "تمديد الإطلاق",
@@ -279,21 +274,21 @@
     "name": "اسم",
     "no-alerts": "لا تنبيهات",
     "no-bulk-actions-available": "لا توجد إجراءات كبيرة متوفرة",
-    "no-channel-selected": "لا يوجد قناة",
+    "no-channel-selected": "",
     "no-results": "لا توجد نتائج",
     "not-applicable": "غير قابل للتطبيق",
     "not-set": "غير مضبوط",
-    "notify-assign-to-channel-success-with-count": "تم تعيينه بنجاح {count, plural, one {1 عنصر} other {{count} عناصر}} إلى {channelCode}",
+    "notify-assign-to-channel-success-with-count": "تم تعيينه بنجاح {count , الجمع , واحد {1 عنصر} {{count} العناصر}} إلى {channelcode}",
     "notify-bulk-update-success": "تم تحديث {count} { entity }",
     "notify-create-error": "حدث خطأ , لم يستطع إنشاء { entity }",
     "notify-create-success": "تم إنشاء { entity }",
     "notify-delete-error": "حدث خطأ , لم يستطع حذف { entity }",
-    "notify-delete-error-with-count": "لا يمكن حذف {count, plural, one {1 عنصر} other {{count} عناصر}}",
+    "notify-delete-error-with-count": "لا يمكن حذف {count , الجمع , واحد {1 عنصر} {{count} العناصر}}",
     "notify-delete-success": "تم حذف { entity }",
-    "notify-delete-success-with-count": "تم حذفه بنجاح {count, plural, one {1 عنصر} other {{count} عناصر}}",
+    "notify-delete-success-with-count": "تم حذفه بنجاح {count , الجمع , واحد {1 item} {{count} head}}",
     "notify-duplicate-error": "تعذر تكرار { name } بسبب خطأ: { error }",
-    "notify-duplicate-error-excess": "تعذر تكرار {count} {count, plural, one {عنصر} other {عناصر}} إضافي{count, plural, one {} other {ن}} بسبب أخطاء",
-    "notify-duplicate-success": "تم تكرار {count, plural, one {عنصر واحد} other {{count} عناصر}} بنجاح: {names}",
+    "notify-duplicate-error-excess": "تعذر تكرار { count } {count, plural, one {عنصر} other {عناصر}} إضافي{count, plural, one {} other {ن}} بسبب أخطاء",
+    "notify-duplicate-success": "تم تكرار {count, plural, one {عنصر واحد} other {{count} عناصر}} بنجاح: { names }",
     "notify-remove-from-channel-success-with-count": "تم إزالته بنجاح {count} عناصر من القناة",
     "notify-save-changes-error": "حدث خطأ , لم يستطع حفظ التغييرات",
     "notify-saved-changes": "التغييرات المحفوظة",
@@ -321,14 +316,14 @@
     "remove-item-from-list": "إزالة العنصر من القائمة",
     "rename-filter-preset": "إعادة تسمية الضبط",
     "reset-columns": "إعادة تعيين الأعمدة",
-    "results-count": "{count} {count, plural, one {نتيجة واحدة} other {من النتائج}}",
+    "results-count": "{ count } {count, plural, one {نتيجة واحدة} other {من النتائج}}",
     "sample-formatting": "تنسيق العينة",
     "save-filter-preset": "حفظ كإعداد مُسبق للتصفية",
     "search-and-filter-list": "البحث وتصفية هذه القائمة",
     "search-by-name": "البحث عن طريق الإسم",
     "select": "يختار...",
     "select-display-language": "حدد لغة العرض",
-    "select-items-with-count": "حدد {count} {count, plural, one {عنصر} other {عناصر}}",
+    "select-items-with-count": "حدد {count} {count , الجمع , واحد {item} آخر {عناصر}}",
     "select-products": "اختيار المنتجات",
     "select-relation-id": "حدد معرف العلاقة",
     "select-table-columns": "حدد أعمدة الجدول",
@@ -359,8 +354,8 @@
     "add-customer-to-group": "أضف العميل إلى مجموعة",
     "add-customer-to-groups-with-count": "أضف العميل إلى {count, plural, one {مجموعة واحدة} other {{count} مجموعات}}",
     "add-customers-to-group": "أضف العملاء إلى مجموعة",
-    "add-customers-to-group-success": "تمت إضافة {customercount, plural, one {1 عميل} other {{customercount} عملاء}} إلى \"{groupname}\"",
-    "add-customers-to-group-with-count": "إضافة {count, plural, one {1 عميل} other {{count} عملاء}}",
+    "add-customers-to-group-success": "تمت إضافة {customercount , الجمع , واحد {1 عميل} آخر {{customercount} العملاء}} إلى \" {groupname} \"",
+    "add-customers-to-group-with-count": "إضافة {count , الجمع , واحد {1 عميل} {{count} عملاء}}",
     "add-customers-to-group-with-name": "إضافة العملاء إلى \" {groupName} \"",
     "addresses": "عناوين",
     "city": "مدينة",
@@ -411,7 +406,7 @@
     "postal-code": "رمز بريدي",
     "province": "مقاطعة",
     "registered": "مسجل",
-    "remove-customers-from-group-success": "تمت إزالة {customercount, plural, one {1 عميل} other {{customercount} عملاء}} من \"{groupname}\"",
+    "remove-customers-from-group-success": "تمت إزالة {customercount , الجمع , واحد {1 customer} {{customercount}}}} من \" {groupname} \"",
     "remove-from-group": "إزالة من هذه المجموعة",
     "search-customers-by-email": "البحث عن طريق عنوان البريد الإلكتروني",
     "search-customers-by-email-last-name-postal-code": "ابحث عن طريق البريد الإلكتروني / الاسم الأخير / الرمز البريدي",
@@ -480,17 +475,15 @@
     "year": "سنة"
   },
   "editor": {
-    "height": "الارتفاع",
     "image-alt": "الوصف (بديل)",
     "image-src": "مصدر",
     "image-title": "عنوان",
     "insert-image": "إدراج صورة",
-    "link-href": "رابط الهدف",
+    "link-href": "Link Href",
     "link-target": "رابط الهدف",
     "link-title": "عنوان الرابط",
     "remove-link": "إزالة",
-    "set-link": "تعيين الرابط",
-    "width": "العرض"
+    "set-link": "Set Link"
   },
   "error": {
     "403-forbidden": "أنت غير مخول حاليًا للوصول إلى \" {path} \". إما أنك تفتقر إلى الأذونات , أو انتهت جلستك.",
@@ -535,7 +528,6 @@
     "promotions": "العروض",
     "roles": "الأدوار",
     "sales": "مبيعات",
-    "scheduled-tasks": "المهام المجدولة",
     "sellers": "البائعون",
     "settings": "إعدادات",
     "shipping-methods": "طرق الشحن",
@@ -569,7 +561,7 @@
     "cancel-selected-items": "إلغاء العناصر المحددة",
     "cancel-specified-items": "إلغاء العناصر المحددة",
     "cancellation-reason": "سبب الإلغاء",
-    "cancelled-order-items-success": "تم إلغاء {count} {count, plural, one {عنصر} other {عناصر}} من الطلب",
+    "cancelled-order-items-success": "تم إلغاء { count } { count, plural, one {عنصر} other {عناصر} } من الطلب",
     "cancelled-order-success": "الطلب الذي تم إلغاؤه بنجاح",
     "complete-draft-order": "إنهاء المسودة",
     "confirm-modifications": "تأكيد التعديلات",
@@ -596,7 +588,7 @@
     "history-fulfillment-delivered": "الوفاء بتسليم",
     "history-fulfillment-shipped": "تم شحن الوفاء",
     "history-fulfillment-transition": "تم نقل الوفاء من {من} إلى {إلى}",
-    "history-items-cancelled": "{count} {count, plural, one {عنصر} other {عناصر}} تم إلغاؤه",
+    "history-items-cancelled": "{count} {count , الجمع , واحد {item} آخر {العناصر}} تم إلغاؤه",
     "history-order-cancelled": "تم الغاء الأمر او الطلب",
     "history-order-created": "أجل خلق",
     "history-order-fulfilled": "أمر تم تحقيقه",
@@ -604,16 +596,16 @@
     "history-order-transition": "تم نقل الطلب من {من} إلى {إلى}",
     "history-payment-settled": "الدفع المستقر",
     "history-payment-transition": "الدفع #{id} انتقل من {من} إلى {إلى}",
-    "history-refund-transition": "REFUND #{id} انتقل من {من} إلى {إلى}",
-    "item-count": "{count} {count, plural, one {عنصر} other {عناصر}}",
+    "history-refund-transition": "REWNDUND #{id} انتقل من {من} إلى {إلى}",
+    "item-count": "{count} {count , الجمع , واحد {item} آخر {عناصر}}",
     "line-fulfillment-all": "جميع العناصر التي تم الوفاء بها",
     "line-fulfillment-none": "لا توجد عناصر تحققت",
     "line-fulfillment-partial": "{count} من العناصر {total} تم الوفاء بها",
     "manually-transition-to-state": "الانتقال يدويًا إلى الدولة ...",
     "manually-transition-to-state-message": "نقل الأمر يدويًا إلى دولة أخرى. لاحظ أن حالات النظام تخضع لقواعد قد تمنع بعض التحولات.",
-    "modification-adding-items": "إضافة {count} {count, plural, one {عنصر} other {عناصر}}",
-    "modification-adding-surcharges": "إضافة {count} {count, plural, one {رسوم إضافية} other {رسوم إضافية}}",
-    "modification-adjusting-lines": "ضبط {count} {count, plural, one {سطر} other {أسطر}}",
+    "modification-adding-items": "إضافة {count} {count , الجمع , واحد {item} آخر {العناصر}}",
+    "modification-adding-surcharges": "إضافة {count} {count , الجمع , واحد {رسوم إضافية} {surghres}}",
+    "modification-adjusting-lines": "ضبط {count} {count , الجمع , واحد {line} آخر {lines}}",
     "modification-not-settled": "ليس مستقر",
     "modification-recalculate-shipping": "إعادة حساب الشحن",
     "modification-settled": "تسوية",
@@ -672,7 +664,7 @@
     "refund-total-warning": "يرجى تحديد مبالغ الاسترداد التي تساوي إجمالي الاسترداد.",
     "refund-with-amount": "المبلغ المسترد}",
     "refundable-amount": "المبلغ القابل للاسترداد",
-    "refunded-count": "{count} {count, plural, one {عنصر} other {عناصر}} مسترد",
+    "refunded-count": "{count} {count , الجمع , واحد {item} آخر {العناصر}}",
     "removed-items": "العناصر التي تمت إزالتها",
     "return-to-stock": "العودة إلى المخزون",
     "search-by-order-filters": "ابحث بالاسم / الكود / معرف المعاملة",
@@ -683,7 +675,7 @@
     "set-billing-address": "تعيين عنوان الفواتير",
     "set-coupon-codes": "تعيين رموز القسيمة",
     "set-customer-for-order": "تعيين العميل",
-    "set-customer-success": "تم تعيين العميل بنجاح",
+    "set-customer-success": "",
     "set-fulfillment-state": "مارك كـ {state}",
     "set-shipping-address": "تعيين عنوان الشحن",
     "set-shipping-method": "تعيين طريقة الشحن",
@@ -718,7 +710,7 @@
   },
   "settings": {
     "add-countries-to-zone": "أضف البلدان إلى {zonename}",
-    "add-countries-to-zone-success": "تمت إضافة {countryCount, plural, one {1 بلد} other {{countryCount} بلدان}} إلى المنطقة \"{zoneName}\"",
+    "add-countries-to-zone-success": "تمت إضافة {CountryCount} {CountryCount , الجمع , واحد {Country} آخر {البلدان}} إلى Zone \" {Zonename} \"",
     "add-products-to-test-order": "إضافة منتجات إلى ترتيب الاختبار",
     "administrator": "مدير",
     "channel": "قناة",
@@ -756,7 +748,7 @@
     "prices-include-tax": "تشمل الأسعار ضريبة على المنطقة الافتراضية",
     "profile": "حساب تعريفي",
     "rate": "معدل",
-    "remove-countries-from-zone-success": "تمت إزالة {countryCount, plural, one {1 بلد} other {{countryCount} بلدان}} من المنطقة \"{zoneName}\"",
+    "remove-countries-from-zone-success": "تمت إزالة {CountryCount} {CountryCount , الجمع , واحد {Country} آخر {البلدان}} من Zone \" {Zonename} \"",
     "remove-from-zone": "إزالة من المنطقة",
     "role": "دور",
     "roles": "الأدوار",
@@ -817,11 +809,6 @@
     "job-state-completed": "تمت",
     "job-state-failed": "فشل",
     "job-state-pending": "قيد الانتظار",
-    "job-state-running": "قيد التشغيل",
-    "last-executed-at": "آخر تنفيذ",
-    "last-result": "آخر نتيجة",
-    "next-execution-at": "التالي",
-    "schedule": "الجدول",
-    "task-id": "معرف المهمة"
+    "job-state-running": "قيد التشغيل"
   }
 }

+ 198 - 211
packages/admin-ui/src/lib/static/i18n-messages/cs.json

@@ -6,18 +6,16 @@
     "add-asset": "Přidat médium",
     "add-asset-with-count": "Přidat {count, plural, =0 {médium} =1 {médium} few {{count} média} other {{count} médií}}",
     "assets-selected-count": "{ count } médií vybráno",
-    "change-asset": "Změnit médium",
     "dimensions": "Rozměry",
     "focal-point": "Ohnisko",
     "notify-create-assets-success": "{count, plural, =1 {Vytvořeno} few {Vytvořena} other {Vytvořeno}} {count, plural, =1 {médium} few {{count} média} other {{count} médií}}",
     "original-asset-size": "Originální velikost",
     "preview": "Náhled",
     "remove-asset": "Smazat médium",
-    "select-asset": "Vybrat médium",
+    "select-asset": "",
     "select-assets": "Vybrat média",
     "set-as-featured-asset": "Zvýraznit médium",
     "set-focal-point": "Nastavit ohnisko",
-    "size": "Velikost",
     "source-file": "Zdrojový soubor",
     "unset-focal-point": "Odebrat",
     "update-focal-point": "Aktualizovat ohnisko",
@@ -42,14 +40,13 @@
     "modifying-order": "Modifikace objednávky",
     "orders": "Objednávky",
     "payment-methods": "Platební metody",
-    "product-options": "Volby produktu",
+    "product-options": "",
     "products": "Produkty",
     "profile": "Profil",
     "promotions": "Propagace",
     "roles": "Role",
-    "scheduled-tasks": "Úlohy",
-    "seller-orders": "Objednávky prodávajícího",
-    "sellers": "Prodávající",
+    "seller-orders": "",
+    "sellers": "",
     "shipping-methods": "Dopravní metody",
     "stock-locations": "Místa skladování",
     "system-status": "Status systému",
@@ -61,12 +58,12 @@
     "add-facet-value": "Přidat hodnotu atributu",
     "add-facets": "Přidat atribut",
     "add-option": "Přidat možnost",
-    "add-price-in-another-currency": "Přidat cenu v jiné měně",
-    "add-stock-location": "Přidat místo skladování",
-    "add-stock-to-location": "Přidat sklad",
-    "asset": "Médium",
-    "asset-preview-links": "Náhledy médií",
-    "assets": "Média",
+    "add-price-in-another-currency": "",
+    "add-stock-location": "",
+    "add-stock-to-location": "",
+    "asset": "",
+    "asset-preview-links": "",
+    "assets": "",
     "assign-product-to-channel-success": "Produkt byl úspěšně přiřazen do \"{ channel }\"",
     "assign-products-to-channel": "Přiřadit produkty do kanálu",
     "assign-to-named-channel": "Přiřadit do { channelCode }",
@@ -76,87 +73,87 @@
     "auto-update-product-variant-name": "Automaticky aktualizovat jména variant",
     "calculated-price": "Vypočtená cena",
     "calculated-price-tooltip": "Je zde konfigurován vlastní výpočet ceny, který upravuje cenu nastavenou výše:",
-    "cannot-create-variants-without-options": "Nelze vytvořit varianty bez volb",
+    "cannot-create-variants-without-options": "",
     "channel-price-preview": "Náhled ceny v kanálu",
-    "collection": "Kolekce",
+    "collection": "",
     "collection-contents": "Obsah kolekce",
-    "collections": "Kolekce",
-    "confirm-bulk-delete-products": "Smazat {count} {count, plural, one {produkt} few {produkty} other {produktů}}?",
-    "confirm-cancel": "Zrušit",
+    "collections": "",
+    "confirm-bulk-delete-products": "",
+    "confirm-cancel": "",
     "confirm-delete-assets": "Smazat {count} {count, plural, one {médium} few {média} other {médií}}?",
     "confirm-delete-facet-value": "Smazat hodnotu atributu?",
     "confirm-delete-product": "Smazat produkt?",
-    "confirm-delete-product-option": "Smazat volbu?",
-    "confirm-delete-product-option-group": "Smazat skupinu volby?",
-    "confirm-delete-product-option-group-body": "Opravdu chcete smazat skupinu volby \"{ groupName }\"?",
+    "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
+    "confirm-delete-product-option-group-body": "",
     "confirm-delete-product-variant": "Smazat variantu produktu?",
-    "confirm-deletion-of-unused-variants-body": "Opravdu chcete smazat {count} {count, plural, one {nepoužitou variantu} few {nepoužité varianty} other {nepoužitých variant}}?",
-    "confirm-deletion-of-unused-variants-title": "Smazat nepoužité varianty",
-    "create-draft-order": "Vytvořit návrh objednávky",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
+    "create-draft-order": "",
     "create-facet-value": "Vytvořit novou hodnotu atributu",
     "create-new-collection": "Vytvořit kolekci",
     "create-new-facet": "Vytvořit nový atribut",
     "create-new-product": "Nový produkt",
-    "create-new-stock-location": "Vytvořit nové místo skladování",
-    "create-product-option-group": "Vytvořit skupinu volby",
-    "create-product-variant": "Vytvořit variantu produktu",
-    "default-currency": "Výchozí měna",
-    "do-not-inherit-filters": "Nezdědit filtry",
+    "create-new-stock-location": "",
+    "create-product-option-group": "",
+    "create-product-variant": "",
+    "default-currency": "",
+    "do-not-inherit-filters": "",
     "drop-files-to-upload": "Přetáhněte soubory k nahrávání",
     "duplicate-collections": "Duplikovat kolekce",
     "duplicate-facets": "Duplikovat prvky",
     "duplicate-products": "Duplikovat produkty",
-    "edit-facet-values": "Upravit hodnoty atributu",
-    "edit-options": "Upravit volby",
-    "facet": "Atribut",
-    "facet-value-not-available": "Hodnota atributu není k dispozici",
+    "edit-facet-values": "",
+    "edit-options": "",
+    "facet": "",
+    "facet-value-not-available": "",
     "facet-values": "Hodnoty atributů",
-    "facets": "Atributy",
+    "facets": "",
     "filter-by-name": "Filtrovat dle jména",
-    "filter-inheritance": "Zdědit filtry",
+    "filter-inheritance": "",
     "filters": "Filtry",
-    "inherit-filters-from-parent": "Zdědit filtry z nadřazené kolekce",
-    "live-preview-contents": "Živý náhled obsahu",
+    "inherit-filters-from-parent": "",
+    "live-preview-contents": "",
     "manage-variants": "Správa variant",
-    "move-collection-to": "Přesunout kolekci",
-    "move-collections": "Přesunout kolekce",
-    "move-collections-success": "Kolekce byla úspěšně přesunuta",
+    "move-collection-to": "",
+    "move-collections": "",
+    "move-collections-success": "",
     "move-down": "Posunout dolů",
     "move-to": "Posunout",
     "move-up": "Posunout nahoru",
-    "name": "Jméno",
+    "name": "",
     "no-channel-selected": "Žádný kanál nevybrán",
     "no-featured-asset": "Žádné zvýrazněné médium",
     "no-selection": "Žádný výběr",
-    "no-stock-locations-available-on-current-channel": "Žádné místo skladování není k dispozici na aktuálním kanálu",
-    "notify-bulk-delete-products-success": "Produkty byly úspěšně smazány",
-    "notify-remove-facets-from-channel-success": "Atributy byly úspěšně odebrány z kanálu",
+    "no-stock-locations-available-on-current-channel": "",
+    "notify-bulk-delete-products-success": "",
+    "notify-remove-facets-from-channel-success": "",
     "notify-remove-product-from-channel-error": "Produkt se nepovedlo odebrat z kanálu",
     "notify-remove-product-from-channel-success": "Produkt byl úspěšně odebrán z kanálu",
     "notify-remove-variant-from-channel-error": "Variantu se nepovedlo odebrat z kanálu",
     "notify-remove-variant-from-channel-success": "Varianta byla úspěšně odebrána z kanálu",
-    "number-of-variants": "Počet variant",
+    "number-of-variants": "",
     "option": "Volba",
     "option-name": "Jméno volby",
     "option-values": "Hodnoty volby",
     "out-of-stock-threshold": "Prahová hodnota pro vyprodání zásob",
     "out-of-stock-threshold-tooltip": "Nastaví hodnotu skladu, při které je tato varianta považována za vyprodanou. Použití záporné hodnoty umožňuje objednávat \"na objednávku\".",
-    "page-description-options-editor": "Upravit popis stránky",
+    "page-description-options-editor": "",
     "price": "Cena",
-    "price-and-tax": "Cena a daň",
+    "price-and-tax": "",
     "price-conversion-factor": "Přepočítávací koeficient ceny",
     "price-in-channel": "Cena v { channel }",
     "price-includes-tax-at": "Včetně daně { rate }%",
     "price-with-tax-in-default-zone": "Včetně { rate }% daně: { price }",
     "private": "Soukromý",
-    "product": "Produkt",
+    "product": "",
     "product-name": "Jméno produktu",
-    "product-options": "Volby produktu",
-    "product-variant-exists": "Varianta produktu již existuje",
+    "product-options": "",
+    "product-variant-exists": "",
     "product-variants": "Varianty produktu",
     "products": "Produkty",
     "public": "Veřejný",
-    "quick-jump-placeholder": "Hledat produkt",
+    "quick-jump-placeholder": "",
     "rebuild-search-index": "Obnovit vyhledávací index",
     "reindex-error": "Při regeneraci vyhledávacího indexu došlo k chybě",
     "reindex-successful": "Zaindexováno: {count, plural, one {varianta produktu} other {{count} variant produktu}} během {time}ms",
@@ -165,21 +162,21 @@
     "remove-option": "Odebrat volbu",
     "remove-product-from-channel": "Odebrat produkt z kanálu",
     "remove-product-variant-from-channel": "Odebrat variantu z kanálu",
-    "reorder-collection": "Přeřadit kolekci",
-    "root-collection": "Hlavní kolekce",
-    "run-pending-search-index-updates": "Spustit aktualizace vyhledávacího indexu",
-    "running-search-index-updates": "Aktualizace vyhledávacího indexu",
-    "search-asset-name-or-tag": "Hledat médium dle jména nebo tagu",
+    "reorder-collection": "",
+    "root-collection": "",
+    "run-pending-search-index-updates": "",
+    "running-search-index-updates": "",
+    "search-asset-name-or-tag": "",
     "search-for-term": "Hledat výraz",
     "search-product-name-or-code": "Hledat produkt dle jména, nebo kódu",
-    "select-product": "Vybrat produkt",
-    "select-product-variant": "Vybrat variantu produktu",
+    "select-product": "",
+    "select-product-variant": "",
     "sku": "SKU",
     "slug": "Odkaz",
     "slug-pattern-error": "Špatný formát odkazu",
     "stock-allocated": "Alokováno",
-    "stock-levels": "Úrovně skladu",
-    "stock-location": "Místo skladování",
+    "stock-levels": "",
+    "stock-location": "",
     "stock-locations": "Místa skladování",
     "stock-on-hand": "Sklad",
     "tax-category": "Skupina daní",
@@ -193,41 +190,41 @@
     "use-global-value": "Dle globálního nastavení",
     "values": "Hodnoty",
     "variant": "Varianta",
-    "variant-count": "Počet variant",
+    "variant-count": "",
     "view-contents": "Zobrazit obsah",
     "visibility": "Viditelnost"
   },
   "common": {
     "ID": "ID",
-    "add-filter": "Přidat filtr",
+    "add-filter": "",
     "add-item-to-list": "Přidat položku do seznamu",
     "add-note": "Přidat poznámku",
-    "apply": "Použít",
-    "assign-to-channel": "Přiřadit do { channelCode }",
+    "apply": "",
+    "assign-to-channel": "",
     "assign-to-channels": "Přiřadit k {count, plural, one {kanálu} other {kanálům}}",
-    "available-currencies": "Dostupné měny",
+    "available-currencies": "",
     "available-languages": "Dostupné jazyky",
-    "boolean-and": "A",
-    "boolean-false": "Ne",
-    "boolean-or": "Nebo",
-    "boolean-true": "Ano",
-    "breadcrumb": "Cesta",
-    "browser-default": "Výchozí prohlížeč",
+    "boolean-and": "",
+    "boolean-false": "",
+    "boolean-or": "",
+    "boolean-true": "",
+    "breadcrumb": "",
+    "browser-default": "",
     "cancel": "Zrušit",
     "cancel-navigation": "Zrušit navigaci",
-    "change-selection": "Změnit výběr",
+    "change-selection": "",
     "channel": "Kanál",
     "channels": "Kanály",
-    "clear-selection": "Vymazat výběr",
+    "clear-selection": "",
     "code": "Kód",
     "collapse-entries": "Schovat vstupy",
     "confirm": "Potvrdit",
-    "confirm-bulk-assign-to-channel": "Přiřadit do kanálu",
-    "confirm-bulk-delete": "Smazat",
-    "confirm-bulk-remove-from-channel": "Odebrat z kanálu",
+    "confirm-bulk-assign-to-channel": "",
+    "confirm-bulk-delete": "",
+    "confirm-bulk-remove-from-channel": "",
     "confirm-delete-note": "Smazat poznámku?",
     "confirm-navigation": "Potvrdit navigaci",
-    "contents": "Obsah",
+    "contents": "",
     "create": "Vytvořit",
     "created-at": "Vytvořeno",
     "custom-fields": "Extra pole",
@@ -236,111 +233,109 @@
     "data-table-filter-date-relative": "Relativní datum",
     "default-channel": "Výchozí kanál",
     "default-language": "Výchozí jazyk",
-    "default-tax-category": "Výchozí skupina daní",
+    "default-tax-category": "",
     "delete": "Smazat",
     "description": "Popis",
     "details": "Detaily",
-    "disable": "Vypnout",
     "disabled": "Vypnuto",
     "discard-changes": "Zrušit změny",
     "duplicate": "Duplikovat",
     "edit": "Upravit",
     "edit-field": "Upravit pole",
     "edit-note": "Upravit poznámku",
-    "enable": "Zapnout",
     "enabled": "Zapnuto",
-    "end-date": "Datum konce",
+    "end-date": "",
     "expand-entries": "Otevřít vstupy",
     "extension-running-in-separate-window": "Rozšíření běží v novém okně",
-    "filter": "Filtr",
+    "filter": "",
     "filter-preset-name": "Název předvolby filtru",
-    "force-delete": "Vynutit smazat",
-    "force-remove": "Vynutit odebrat",
-    "general": "Obecné",
+    "force-delete": "",
+    "force-remove": "",
+    "general": "",
     "guest": "Host",
-    "id": "ID",
-    "image": "Obrázek",
+    "id": "",
+    "image": "",
     "items-per-page-option": "{ count } na stránku",
-    "items-selected-count": "Vybrané { count } {count, plural, one {položka} other {položek}}",
-    "keep-editing": "Pokračovat v úpravách",
+    "items-selected-count": "",
+    "keep-editing": "",
     "language": "Jazyk",
     "launch-extension": "Spustit rozšíření",
-    "list-items-and-n-more": "Seznam { count } {count, plural, one {položka} other {položek}} a dalších",
+    "list-items-and-n-more": "",
     "live-update": "Živé aktualizace",
-    "locale": "Místní nastavení",
+    "locale": "",
     "log-out": "Odhlásit",
     "login": "Přihlásit",
-    "login-image-title": "Přihlásit se",
-    "login-title": "Přihlásit se",
-    "manage-tags": "Spravovat tagy",
-    "manage-tags-description": "Přidat, upravit nebo smazat tagy",
-    "medium-date": "Měsíc, den, rok",
+    "login-image-title": "",
+    "login-title": "",
+    "manage-tags": "",
+    "manage-tags-description": "",
+    "medium-date": "",
     "more": "Více...",
     "name": "jméno",
-    "no-alerts": "Žádné upozornění",
-    "no-bulk-actions-available": "Žádné dostupné akce",
-    "no-channel-selected": "Žádný kanál nevybrán",
+    "no-alerts": "",
+    "no-bulk-actions-available": "",
+    "no-channel-selected": "",
     "no-results": "Žádné výsledky",
-    "not-applicable": "Neplatné",
+    "not-applicable": "",
     "not-set": "Nenastaveno",
-    "notify-assign-to-channel-success-with-count": "Přiřazeno do { count } {count, plural, one {kanálu} other {kanálů}}",
-    "notify-bulk-update-success": "Úspěšně aktualizováno { count } {count, plural, one {položka} other {položek}}",
+    "notify-assign-to-channel-success-with-count": "",
+    "notify-bulk-update-success": "",
     "notify-create-error": "Vyskytla se chyba, nebylo vytvořeno: { entity }",
     "notify-create-success": "Vytvořeno: { entity }",
     "notify-delete-error": "Vyskytla se chyba, nebylo smazáno: { entity }",
-    "notify-delete-error-with-count": "Vyskytla se chyba, nebylo smazáno: { count } {count, plural, one {položka} other {položek}}",
+    "notify-delete-error-with-count": "",
     "notify-delete-success": "Smazáno: { entity }",
-    "notify-delete-success-with-count": "Smazáno: { count } {count, plural, one {položka} other {položek}}",
+    "notify-delete-success-with-count": "",
     "notify-duplicate-error": "Nelze duplikovat { name } kvůli chybě: { error }",
     "notify-duplicate-error-excess": "Nelze duplikovat dalších { count } {count, plural, one {položka} other {položek}} kvůli chybám",
     "notify-duplicate-success": "Bylo úspěšně zduplikováno {count, plural, one {1 položka} other {{count} položek}}: { names }",
-    "notify-remove-from-channel-success-with-count": "Odebráno z { count } {count, plural, one {kanálu} other {kanálů}}",
+    "notify-remove-from-channel-success-with-count": "",
     "notify-save-changes-error": "Vyskytla se chyba, nebylo možné uložit změny",
     "notify-saved-changes": "Změny uloženy",
     "notify-update-error": "Vyskytla se chyba, nebylo aktualizováno: { entity }",
     "notify-update-success": "Aktualizováno: { entity }",
-    "notify-updated-tags-success": "Úspěšně aktualizováno { count } {count, plural, one {tag} other {tagů}}",
-    "okay": "V pořádku",
-    "operator-contains": "Obsahuje",
-    "operator-eq": "Je rovno",
-    "operator-gt": "Je větší než",
-    "operator-lt": "Je menší než",
-    "operator-not-contains": "Neobsahuje",
-    "operator-not-eq": "Není rovno",
-    "operator-notContains": "Neobsahuje",
-    "operator-regex": "Vyhledávání podle regulárního výrazu",
+    "notify-updated-tags-success": "",
+    "okay": "",
+    "operator-contains": "",
+    "operator-eq": "",
+    "operator-gt": "",
+    "operator-lt": "",
+    "operator-not-contains": "",
+    "operator-not-eq": "",
+    "operator-notContains": "",
+    "operator-regex": "",
     "password": "Heslo",
-    "position": "Pozice",
+    "position": "",
     "price": "Cena",
     "price-with-tax": "Cena s daní",
     "private": "Soukromé",
     "public": "Veřejné",
     "remember-me": "Zapamatovat",
     "remove": "Smazat",
-    "remove-from-channel": "Odebrat z kanálu",
+    "remove-from-channel": "",
     "remove-item-from-list": "Odebrat položku ze seznamu",
     "rename-filter-preset": "Přejmenovat předvolbu",
-    "reset-columns": "Obnovit sloupce",
+    "reset-columns": "",
     "results-count": "{ count } {count, plural, one {výsledek} other {výsledků/y}}",
-    "sample-formatting": "Ukázka formátování",
+    "sample-formatting": "",
     "save-filter-preset": "Uložit jako předvolbu",
-    "search-and-filter-list": "Vyhledat a filtrovat seznam",
-    "search-by-name": "Vyhledat podle jména",
+    "search-and-filter-list": "",
+    "search-by-name": "",
     "select": "Vybrat...",
     "select-display-language": "Vyberte jazyk",
-    "select-items-with-count": "Vybrat { count } {count, plural, one {položku} other {položek}}",
-    "select-products": "Vybrat produkty",
-    "select-relation-id": "Vybrat relaci",
-    "select-table-columns": "Vybrat sloupce",
+    "select-items-with-count": "",
+    "select-products": "",
+    "select-relation-id": "",
+    "select-table-columns": "",
     "select-today": "Vybrat dnešní datum",
-    "select-variants": "Vybrat varianty",
-    "seller": "Prodávající",
-    "set-language": "Nastavit jazyk",
-    "short-date": "Měsíc, den, rok",
-    "slug": "Odkaz",
-    "start-date": "Datum začátku",
-    "status": "Stav",
-    "tags": "Tagy",
+    "select-variants": "",
+    "seller": "",
+    "set-language": "",
+    "short-date": "",
+    "slug": "",
+    "start-date": "",
+    "status": "",
+    "tags": "",
     "theme": "Motiv",
     "there-are-unsaved-changes": "Provedené změny nebyly uloženy. Přechod na jinou stránku způsobí ztrátu těchto změn.",
     "toggle-all": "Přepnout vše",
@@ -348,11 +343,11 @@
     "update": "Aktualizovat",
     "updated-at": "Aktualizováno",
     "username": "Uživatelské jméno",
-    "value": "Hodnota",
-    "view-contents": "Zobrazit obsah",
+    "value": "",
+    "view-contents": "",
     "view-next-month": "Další měsíc",
     "view-previous-month": "Předchozí měsíc",
-    "visibility": "Viditelnost",
+    "visibility": "",
     "with-selected": "S vybranými..."
   },
   "customer": {
@@ -364,18 +359,18 @@
     "add-customers-to-group-with-name": "Add customers to \"{ groupName }\"",
     "addresses": "Adresy",
     "city": "Město",
-    "company": "Firma",
-    "confirm-remove-customer-from-group": "Odebrat zákazníka ze skupiny?",
+    "company": "",
+    "confirm-remove-customer-from-group": "Remove customer from group?",
     "country": "Země",
-    "create-customer-group": "Vytvořit skupinu zákazníka",
-    "create-new-address": "Vytvořit novou adresu",
-    "create-new-customer": "Vytvořit nového zákazníka",
-    "create-new-customer-group": "Vytvořit novou skupinu zákazníka",
-    "customer": "Zákazník",
-    "customer-group": "Skupina zákazníka",
+    "create-customer-group": "Create customer group",
+    "create-new-address": "Create new address",
+    "create-new-customer": "Create new customer",
+    "create-new-customer-group": "Create new customer group",
+    "customer": "",
+    "customer-group": "",
     "customer-groups": "Skupiny zákazníka",
     "customer-history": "Historie zákazníka",
-    "customers": "Zákazníci",
+    "customers": "",
     "default-billing-address": "Výchozí fakturační",
     "default-shipping-address": "Výchozí dodací",
     "email-address": "E-mailová adresa",
@@ -414,8 +409,8 @@
     "remove-customers-from-group-success": "Odebrán: {customerCount, plural, one {1 zákazník} other {{customerCount} zákazníci/zákazníků}} z \"{ groupName }\"",
     "remove-from-group": "Odebrat ze skupiny",
     "search-customers-by-email": "Hledat podle e-mailové adresy",
-    "search-customers-by-email-last-name-postal-code": "Hledat podle e-mailové adresy, příjmení a PSČ",
-    "select-customer": "Vybrat zákazníka",
+    "search-customers-by-email-last-name-postal-code": "",
+    "select-customer": "",
     "set-as-default-billing-address": "Nastavit jako výchozí fakturační adresu",
     "set-as-default-shipping-address": "Nastavit jako výchozí dodací adresu",
     "street-line-1": "Adresa",
@@ -428,10 +423,10 @@
   "dashboard": {
     "add-widget": "Přidat widget",
     "latest-orders": "Poslední objednávky",
-    "metric-average-order-value": "Průměrná hodnota objednávky",
-    "metric-number-of-orders": "Počet objednávek",
-    "metric-order-total-value": "Celková hodnota objednávek",
-    "metrics": "Metriky",
+    "metric-average-order-value": "",
+    "metric-number-of-orders": "",
+    "metric-order-total-value": "",
+    "metrics": "",
     "orders-summary": "Souhrn objednávek",
     "remove-widget": "Odebrat widget",
     "thisMonth": "Tento měsíc",
@@ -480,17 +475,15 @@
     "year": "rok"
   },
   "editor": {
-    "height": "Výška",
     "image-alt": "Popisek (alt)",
     "image-src": "Zdroj",
     "image-title": "Titulek",
     "insert-image": "Vložit obrázek",
     "link-href": "Odkaz",
-    "link-target": "Cíl odkazu",
+    "link-target": "",
     "link-title": "Odkaz titulky",
     "remove-link": "Odebrat odkaz",
-    "set-link": "Nastavit odkaz",
-    "width": "Šířka"
+    "set-link": "Nastavit odkaz"
   },
   "error": {
     "403-forbidden": "Neautorizovaný přístup k \"{ path }\". Buďto nemáte oprávnění, nebo Vaše relace vypršela.",
@@ -510,8 +503,8 @@
     "ends-at": "Končí",
     "per-customer-limit": "Limit za zákazníka",
     "per-customer-limit-tooltip": "Maximální počet použití tohoto promočního kódu jedním zákazníkem",
-    "promotion": "Propagace",
-    "search-by-name-or-coupon-code": "Hledat podle jména nebo kódu kupónu",
+    "promotion": "",
+    "search-by-name-or-coupon-code": "",
     "starts-at": "Začíná",
     "usage-limit": "Celkový limit použití",
     "usage-limit-tooltip": "Maximální počet použití tohoto promočního kódu celkově"
@@ -535,8 +528,7 @@
     "promotions": "Propagace",
     "roles": "Role",
     "sales": "Prodeje",
-    "scheduled-tasks": "Naplánované úlohy",
-    "sellers": "Prodávající",
+    "sellers": "",
     "settings": "Nastavení",
     "shipping-methods": "Dopravní metody",
     "stock-locations": "Místa skladování",
@@ -555,36 +547,36 @@
     "add-surcharge": "Přidat příplatek",
     "added-items": "Přidat položky",
     "amount": "Částka",
-    "arrange-additional-payment": "Přidat další platbu",
+    "arrange-additional-payment": "",
     "assign-order-to-another-customer": "Přiřadit objednávku jinému zákazníkovi",
     "billing-address": "Fakturační adresa",
     "cancel": "Zrušit",
-    "cancel-entire-order": "Zrušit celou objednávku",
+    "cancel-entire-order": "",
     "cancel-fulfillment": "Zrušit zpracování",
     "cancel-modification": "Zrušit úpravy",
     "cancel-order": "Zrušit objednávku",
-    "cancel-payment": "Zrušit platbu",
+    "cancel-payment": "",
     "cancel-reason-customer-request": "Požadavek zákazníka",
     "cancel-reason-not-available": "Neuveden",
     "cancel-selected-items": "Zrušit vybrané položky",
-    "cancel-specified-items": "Zrušit určené položky",
+    "cancel-specified-items": "",
     "cancellation-reason": "Důvod zrušení",
     "cancelled-order-items-success": "Storno { count } { count, plural, one {položka} other {položky} } z objednávky",
     "cancelled-order-success": "Objednávka úspěšně zrušena",
-    "complete-draft-order": "Dokončit objednávku",
+    "complete-draft-order": "",
     "confirm-modifications": "Potvrdit úpravy",
     "contents": "Obsah",
     "create-fulfillment": "Zpracovat",
     "create-fulfillment-success": "Zpracováno",
     "customer": "Zákazník",
-    "delete-draft-order": "Odstranit návrh objednávky",
-    "draft-order": "Návrh objednávky",
+    "delete-draft-order": "",
+    "draft-order": "",
     "edit-billing-address": "Upravit fakturační adresu",
     "edit-shipping-address": "Upravit dodací adresu",
-    "error-message": "Chyba",
-    "existing-address": "Existující adresa",
-    "existing-customer": "Existující zákazník",
-    "filter-is-active": "Filtr je aktivní",
+    "error-message": "",
+    "existing-address": "",
+    "existing-customer": "",
+    "filter-is-active": "",
     "fulfill": "Zpracovat",
     "fulfill-order": "Zpracovat objednávku",
     "fulfillment": "Zpracování",
@@ -630,22 +622,22 @@
     "note-is-private": "Interní poznámka",
     "note-only-visible-to-administrators": "Pouze pro adminy",
     "note-visible-to-customer": "Pro adminy i zákazníka",
-    "order": "Objednávka",
+    "order": "",
     "order-history": "Historie objednávky",
-    "order-is-empty": "Objednávka je prázdná",
+    "order-is-empty": "",
     "order-state-diagram": "Přehled stavu objednávky",
-    "order-type": "Typ objednávky",
-    "order-type-aggregate": "Agregovaná objednávka",
-    "order-type-regular": "Obecná objednávka",
-    "order-type-seller": "Prodávající",
-    "orders": "Objednávky",
+    "order-type": "",
+    "order-type-aggregate": "",
+    "order-type-regular": "",
+    "order-type-seller": "",
+    "orders": "",
     "original-quantity-at-checkout": "Původní množství při pokladně",
     "payment": "Platba",
     "payment-amount": "Částka platby",
     "payment-metadata": "Data platby",
     "payment-method": "Platební metoda",
     "payment-state": "Stav",
-    "payments": "Platby",
+    "payments": "",
     "placed-at": "Datum objednávky",
     "preview-changes": "Náhled změn",
     "previous-customer": "Předchozí zákazník",
@@ -660,8 +652,8 @@
     "refund-cancellation-reason": "Důvod refundace/zrušení",
     "refund-cancellation-reason-required": "Uvedení důvodu refundace/zrušení je povinné",
     "refund-metadata": "Data refundace",
-    "refund-order-failed": "Neúspěšná refundace objednávky",
-    "refund-order-success": "Objednávka úspěšně refundována",
+    "refund-order-failed": "",
+    "refund-order-success": "Successfully refunded order",
     "refund-reason": "Důvod refundace",
     "refund-reason-customer-request": "Požadavek zákazníka",
     "refund-reason-not-available": "Neuveden",
@@ -676,17 +668,17 @@
     "removed-items": "Odebrané položky",
     "return-to-stock": "Vrátit do skladu",
     "search-by-order-filters": "Hledat na základě kódu objednávky / Příjmení / ID transakce",
-    "select-address": "Vybrat adresu",
-    "select-shipping-method": "Vybrat dodací metodu",
+    "select-address": "",
+    "select-shipping-method": "",
     "select-state": "Vyberte stav",
-    "seller-orders": "Objednávky prodávajícího",
-    "set-billing-address": "Nastavit fakturační adresu",
-    "set-coupon-codes": "Nastavit kupónové kódy",
-    "set-customer-for-order": "Nastavit zákazníka pro objednávku",
-    "set-customer-success": "Zákazník úspěšně nastaven",
+    "seller-orders": "",
+    "set-billing-address": "",
+    "set-coupon-codes": "",
+    "set-customer-for-order": "",
+    "set-customer-success": "",
     "set-fulfillment-state": "Označit jako {state}",
-    "set-shipping-address": "Nastavit dodací adresu",
-    "set-shipping-method": "Nastavit dodací metodu",
+    "set-shipping-address": "",
+    "set-shipping-method": "",
     "settle-payment": "Vypořádání platby",
     "settle-payment-error": "Nelze vyřídit platbu",
     "settle-payment-success": "Platba úspěšně vypořádana",
@@ -695,7 +687,7 @@
     "settle-refund-success": "Úspěšně vypořádana refundace",
     "shipping": "Dodání",
     "shipping-address": "Dodací adresa",
-    "shipping-cancelled": "Dodání zrušeno",
+    "shipping-cancelled": "",
     "shipping-method": "Dodací metoda",
     "state": "Stav",
     "sub-total": "Mezisoučet",
@@ -710,7 +702,7 @@
     "tracking-code": "Kód sledování zásilky",
     "transaction-id": "ID transakce",
     "transition-to-state": "Změna stavu na { state }",
-    "transitioned-payment-to-state-success": "Platba úspěšně přesunuta do stavu { state }",
+    "transitioned-payment-to-state-success": "",
     "transitioned-to-state-success": "Stav úspěšně změněn na { state }",
     "unable-to-transition-to-state-try-another": "Objednávka nemohla být přesunuta do stavu \"{state}\". Prosím, vyberte jiný stav.",
     "unfulfilled": "Nevyřízeno",
@@ -720,48 +712,48 @@
     "add-countries-to-zone": "Přidat země do { zoneName }",
     "add-countries-to-zone-success": "Přidáno: { countryCount } {countryCount, plural, one {země} other {země}} do zóny \"{ zoneName }\"",
     "add-products-to-test-order": "Přidat produkty do testovací objednávky",
-    "administrator": "Administrátor",
+    "administrator": "",
     "channel": "Kanál",
     "channel-token": "Token kanálu",
-    "country": "Země",
+    "country": "",
     "create-new-channel": "Vytvořit kanál",
     "create-new-country": "Vytvořit zemi",
-    "create-new-payment-method": "Vytvořit platební metodu",
+    "create-new-payment-method": "",
     "create-new-role": "Vytvořit roli",
-    "create-new-seller": "Vytvořit prodávajícího",
+    "create-new-seller": "",
     "create-new-shipping-method": "Vytvořit dodací metodu",
     "create-new-tax-category": "Vytvořit daňovou kategorii",
     "create-new-tax-rate": "Vytvořit daňovou sazbu",
     "create-new-zone": "Vytvořit zónu",
-    "default-currency": "Výchozí měna",
+    "default-currency": "",
     "default-role-label": "Toto je výchozí role a nemůže být změněna.",
     "default-shipping-zone": "Výchozí dodací zóna",
     "default-tax-zone": "Výchozí daňová zóna",
-    "defaults": "Výchozí",
+    "defaults": "",
     "eligible": "Způsobilé",
     "email-address": "E-mailová adresa",
-    "email-address-or-identifier": "E-mailová adresa nebo identifikátor",
+    "email-address-or-identifier": "",
     "first-name": "Jméno",
     "fulfillment-handler": "Způsob zpracování",
-    "global-available-languages-tooltip": "Dostupné jazyky",
+    "global-available-languages-tooltip": "",
     "global-out-of-stock-threshold": "Globální prahová hodnota pro vyprodání zásob",
     "global-out-of-stock-threshold-tooltip": "Nastaví hodnotu skladu, při které je tato varianta považována za vyprodanou. Použití záporné hodnoty umožňuje objednávat \"na objednávku\". Lze přepsat u jednotlivých variant produktu.",
     "last-name": "Příjmení",
     "no-eligible-shipping-methods": "Nezpůsobilé pro žádnou dodací metodu",
     "password": "Heslo",
-    "payment-eligibility-checker": "Kontrola způsobilosti pro platbu",
-    "payment-handler": "Způsob zpracování platby",
-    "payment-method": "Platební metoda",
+    "payment-eligibility-checker": "",
+    "payment-handler": "",
+    "payment-method": "",
     "permissions": "Oprávnění",
     "prices-include-tax": "Zadávané ceny jsou včetně daně pro výchozí zónu",
     "profile": "Profil",
     "rate": "Sazba",
     "remove-countries-from-zone-success": "Odebráno: { countryCount } {countryCount, plural, one {země} other {země}} ze zóny \"{ zoneName }\"",
     "remove-from-zone": "Odebrat ze zóny",
-    "role": "Rola",
+    "role": "",
     "roles": "Role",
     "search-by-product-name-or-sku": "Hledat dle názvu nebo SKU produktu",
-    "seller": "Prodávající",
+    "seller": "",
     "shipping-calculator": "Kalkulátor poštovného",
     "shipping-eligibility-checker": "Test způsobilosti k dodací metodě",
     "shipping-method": "Dodací metoda",
@@ -784,7 +776,7 @@
     "created": "Vytvořeno",
     "declined": "Odmítnuto",
     "delivered": "Doručeno",
-    "draft": "Návrh",
+    "draft": "",
     "error": "Chyba",
     "failed": "Selhalo",
     "modifying": "Upravuje se",
@@ -817,11 +809,6 @@
     "job-state-completed": "Dokončeno",
     "job-state-failed": "Selhalo",
     "job-state-pending": "Čeká",
-    "job-state-running": "Běží",
-    "last-executed-at": "Poslední spuštění",
-    "last-result": "Poslední výsledek",
-    "next-execution-at": "Další spuštění",
-    "schedule": "Plán",
-    "task-id": "ID úlohy"
+    "job-state-running": "Běží"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/de.json

@@ -6,7 +6,6 @@
     "add-asset": "Asset hinzufügen",
     "add-asset-with-count": "{count, plural, =0 {Assets} one {1 Asset} other {{count} Assets}} hinzufügen",
     "assets-selected-count": "{count, plural, =0 {Kein Asset} one {1 Asset} other {{count} Assets}} ausgewählt",
-    "change-asset": "Asset ändern",
     "dimensions": "Abmessungen",
     "focal-point": "Fokuspunkt",
     "notify-create-assets-success": "{count, plural, one {Neues Asset} other {{count} neue Assets}} erstellt",
@@ -17,7 +16,6 @@
     "select-assets": "Assets auswählen",
     "set-as-featured-asset": "Als \"Featured Asset\" festlegen",
     "set-focal-point": "Fokuspunkt setzen",
-    "size": "Größe",
     "source-file": "Quelldatei",
     "unset-focal-point": "Zurücksetzen",
     "update-focal-point": "Punkt aktualisieren",
@@ -47,7 +45,6 @@
     "profile": "Profil",
     "promotions": "Promotionen",
     "roles": "Rollen",
-    "scheduled-tasks": "Geplante Aufgaben",
     "seller-orders": "Verkäufer Bestellungen",
     "sellers": "Verkäufer",
     "shipping-methods": "Versandarten",
@@ -240,14 +237,12 @@
     "delete": "Löschen",
     "description": "Beschreibung",
     "details": "Details",
-    "disable": "Deaktivieren",
     "disabled": "Deaktiviert",
     "discard-changes": "Änderungen verwerfen",
     "duplicate": "Duplizieren",
     "edit": "Bearbeiten",
     "edit-field": "Feld bearbeiten",
     "edit-note": "Notiz bearbeiten",
-    "enable": "Aktivieren",
     "enabled": "Aktiviert",
     "end-date": "Enddatum",
     "expand-entries": "Einträge erweitern",
@@ -279,7 +274,7 @@
     "name": "Name",
     "no-alerts": "Keine Alarme",
     "no-bulk-actions-available": "Keine Sammelaktionen verfügbar",
-    "no-channel-selected": "Kein Kanal ausgewählt",
+    "no-channel-selected": "",
     "no-results": "Keine Ergebnisse",
     "not-applicable": "Nicht zutreffend",
     "not-set": "Nicht festgelegt",
@@ -480,7 +475,6 @@
     "year": "Jahr"
   },
   "editor": {
-    "height": "Höhe",
     "image-alt": "Beschreibung ('alt')",
     "image-src": "Quelle",
     "image-title": "Titel",
@@ -489,8 +483,7 @@
     "link-target": "Link 'target'",
     "link-title": "Link 'title'",
     "remove-link": "Entfernen",
-    "set-link": "Link setzen",
-    "width": "Breite"
+    "set-link": "Link setzen"
   },
   "error": {
     "403-forbidden": "Sie sind derzeit nicht berechtigt, auf \"{ path }\" zuzugreifen. Entweder fehlen Ihnen die Berechtigungen, oder Ihre Sitzung ist abgelaufen.",
@@ -535,7 +528,6 @@
     "promotions": "Werbeaktionen",
     "roles": "Rollen",
     "sales": "Verkäufe",
-    "scheduled-tasks": "Geplante Aufgaben",
     "sellers": "Verkäufer",
     "settings": "Einstellungen",
     "shipping-methods": "Versandarten",
@@ -683,7 +675,7 @@
     "set-billing-address": "Rechnungsadresse festlegen",
     "set-coupon-codes": "Gutscheincodes festlegen",
     "set-customer-for-order": "Kunde der Bestellung zuordnen",
-    "set-customer-success": "Kunde erfolgreich zugeordnet",
+    "set-customer-success": "",
     "set-fulfillment-state": "Abwicklungsstatus wählen",
     "set-shipping-address": "Versandadresse festlegen",
     "set-shipping-method": "Versandart festlegen",
@@ -817,11 +809,6 @@
     "job-state-completed": "Abgeschlossen",
     "job-state-failed": "Fehlgeschlagen",
     "job-state-pending": "Ausstehend",
-    "job-state-running": "Wird ausgeführt",
-    "last-executed-at": "Letzte Ausführung",
-    "last-result": "Letztes Ergebnis",
-    "next-execution-at": "Nächste Ausführung",
-    "schedule": "Plan",
-    "task-id": "Aufgaben-ID"
+    "job-state-running": "Wird ausgeführt"
   }
 }

+ 7 - 16
packages/admin-ui/src/lib/static/i18n-messages/en.json

@@ -5,8 +5,8 @@
   "asset": {
     "add-asset": "Add asset",
     "add-asset-with-count": "Add {count, plural, =0 {assets} one {1 asset} other {{count} assets}}",
-    "assets-selected-count": "{ count } assets selected",
     "change-asset": "Change asset",
+    "assets-selected-count": "{ count } assets selected",
     "dimensions": "Dimensions",
     "focal-point": "Focal point",
     "notify-create-assets-success": "Created {count, plural, one {new Asset} other {{count} new Assets}}",
@@ -17,14 +17,14 @@
     "select-assets": "Select assets",
     "set-as-featured-asset": "Set as featured asset",
     "set-focal-point": "Set focal point",
-    "size": "Size",
     "source-file": "Source file",
     "unset-focal-point": "Unset",
     "update-focal-point": "Update point",
     "update-focal-point-error": "Could not update focal point",
     "update-focal-point-success": "Updated focal point",
     "upload-assets": "Upload assets",
-    "uploading": "Uploading..."
+    "uploading": "Uploading...",
+    "size": "Size"
   },
   "breadcrumb": {
     "administrators": "Administrators",
@@ -47,7 +47,6 @@
     "profile": "Profile",
     "promotions": "Promotions",
     "roles": "Roles",
-    "scheduled-tasks": "Scheduled tasks",
     "seller-orders": "Seller orders",
     "sellers": "Sellers",
     "shipping-methods": "Shipping methods",
@@ -240,14 +239,12 @@
     "delete": "Delete",
     "description": "Description",
     "details": "Details",
-    "disable": "Disable",
     "disabled": "Disabled",
     "discard-changes": "Discard changes",
     "duplicate": "Duplicate",
     "edit": "Edit",
     "edit-field": "Edit field",
     "edit-note": "Edit note",
-    "enable": "Enable",
     "enabled": "Enabled",
     "end-date": "End date",
     "expand-entries": "Expand entries",
@@ -279,7 +276,7 @@
     "name": "Name",
     "no-alerts": "No alerts",
     "no-bulk-actions-available": "No bulk actions available",
-    "no-channel-selected": "No channel selected",
+    "no-channel-selected": "",
     "no-results": "No results",
     "not-applicable": "Not applicable",
     "not-set": "Not set",
@@ -480,7 +477,6 @@
     "year": "year"
   },
   "editor": {
-    "height": "Height",
     "image-alt": "Description (alt)",
     "image-src": "Source",
     "image-title": "Title",
@@ -490,7 +486,8 @@
     "link-title": "Link title",
     "remove-link": "Remove",
     "set-link": "Set link",
-    "width": "Width"
+    "width": "Width",
+    "height": "Height"
   },
   "error": {
     "403-forbidden": "You are not currently authorized to access \"{ path }\". Either you lack permissions, or your session has expired.",
@@ -535,7 +532,6 @@
     "promotions": "Promotions",
     "roles": "Roles",
     "sales": "Sales",
-    "scheduled-tasks": "Scheduled tasks",
     "sellers": "Sellers",
     "settings": "Settings",
     "shipping-methods": "Shipping methods",
@@ -817,11 +813,6 @@
     "job-state-completed": "Completed",
     "job-state-failed": "Failed",
     "job-state-pending": "Pending",
-    "job-state-running": "Running",
-    "last-executed-at": "Last executed",
-    "last-result": "Last result",
-    "next-execution-at": "Next execution",
-    "schedule": "Schedule",
-    "task-id": "Task ID"
+    "job-state-running": "Running"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/es.json

@@ -6,7 +6,6 @@
     "add-asset": "Añadir recurso",
     "add-asset-with-count": "Añadir {count, plural, =0 {recurso} one {1 recurso} other {{count} recursos}}",
     "assets-selected-count": "{ count } recursos seleccionados",
-    "change-asset": "Cambiar recurso",
     "dimensions": "Dimensiones",
     "focal-point": "Punto focal",
     "notify-create-assets-success": "{count, plural, one {Nuevo recurso} other {{count} Nuevos recursos}} {count, plural, one {creado} other {creados}} con éxito",
@@ -17,7 +16,6 @@
     "select-assets": "Seleccionar recursos",
     "set-as-featured-asset": "Seleccionar como recurso por defecto",
     "set-focal-point": "Fijar punto focal",
-    "size": "Tamaño",
     "source-file": "Fichero original",
     "unset-focal-point": "Quitar punto focal",
     "update-focal-point": "Actualizar punto focal",
@@ -47,7 +45,6 @@
     "profile": "Perfil",
     "promotions": "Promociones",
     "roles": "Roles",
-    "scheduled-tasks": "Tareas programadas",
     "seller-orders": "Órdenes de vendedores",
     "sellers": "Vendedores",
     "shipping-methods": "Métodos de envío",
@@ -240,14 +237,12 @@
     "delete": "Eliminar",
     "description": "Descripción",
     "details": "Detalles",
-    "disable": "Deshabilitar",
     "disabled": "Deshabilitado",
     "discard-changes": "Descartar cambios",
     "duplicate": "Duplicar",
     "edit": "Editar",
     "edit-field": "Editar campo",
     "edit-note": "Editar nota",
-    "enable": "Habilitar",
     "enabled": "Habilitado",
     "end-date": "Fecha final",
     "expand-entries": "Mostrar entradas",
@@ -279,7 +274,7 @@
     "name": "Nombre",
     "no-alerts": "No hay alertas",
     "no-bulk-actions-available": "No hay acciones agrupadas disponibles",
-    "no-channel-selected": "Ningún canal seleccionado",
+    "no-channel-selected": "",
     "no-results": "Sin resultados",
     "not-applicable": "No aplicable",
     "not-set": "Sin fijar",
@@ -480,7 +475,6 @@
     "year": "año"
   },
   "editor": {
-    "height": "Altura",
     "image-alt": "Descripción (alt)",
     "image-src": "Archivo",
     "image-title": "Título",
@@ -489,8 +483,7 @@
     "link-target": "Enlace target",
     "link-title": "Título del enlace",
     "remove-link": "Eliminar",
-    "set-link": "Establecer enlace",
-    "width": "Ancho"
+    "set-link": "Establecer enlace"
   },
   "error": {
     "403-forbidden": "Actualmente no está autorizado para acceder a \"{ path }\". O bien carece de permisos, o su sesión ha expirado.",
@@ -535,7 +528,6 @@
     "promotions": "Promociones",
     "roles": "Roles",
     "sales": "Ventas",
-    "scheduled-tasks": "Tareas programadas",
     "sellers": "Vendedores",
     "settings": "Ajustes",
     "shipping-methods": "Envíos",
@@ -683,7 +675,7 @@
     "set-billing-address": "Añadir dirección de facturación",
     "set-coupon-codes": "Añadir cupón de descuento",
     "set-customer-for-order": "Añadir cliente",
-    "set-customer-success": "Cliente añadido con éxito",
+    "set-customer-success": "",
     "set-fulfillment-state": "Fijar como {state}",
     "set-shipping-address": "Añadir dirección de envío",
     "set-shipping-method": "Añadir método de envío",
@@ -817,11 +809,6 @@
     "job-state-completed": "Completado",
     "job-state-failed": "Fallido",
     "job-state-pending": "Pendiente",
-    "job-state-running": "En ejecución",
-    "last-executed-at": "Última ejecución",
-    "last-result": "Último resultado",
-    "next-execution-at": "Próxima ejecución",
-    "schedule": "Programación",
-    "task-id": "ID de la tarea"
+    "job-state-running": "En ejecución"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/fa.json

@@ -6,7 +6,6 @@
     "add-asset": "افزودن دارایی",
     "add-asset-with-count": "اضافه کردن {count} دارایی",
     "assets-selected-count": "{ count } دارایی انتخاب شده است.",
-    "change-asset": "تغییر دارایی",
     "dimensions": "ابعاد",
     "focal-point": "نقطه کانونی",
     "notify-create-assets-success": "{count} دارایی جدید ایجاد شد.",
@@ -17,7 +16,6 @@
     "select-assets": "دارایی ها را انتخاب کنید",
     "set-as-featured-asset": "تنظیم به عنوان دارایی برجسته",
     "set-focal-point": "نقطه کانونی را تنظیم کنید",
-    "size": "اندازه",
     "source-file": "فایل منبع",
     "unset-focal-point": "نقطه کانونی را حذف کنید",
     "update-focal-point": "نقطه کانونی را بروزرسانی کنید",
@@ -47,7 +45,6 @@
     "profile": "پروفایل",
     "promotions": "تبلیغات",
     "roles": "نقش ها",
-    "scheduled-tasks": "وظایف مجدول",
     "seller-orders": "سفارشات فروشنده",
     "sellers": "فروشندگان",
     "shipping-methods": "روش های حمل و نقل",
@@ -240,14 +237,12 @@
     "delete": "حذف",
     "description": "توضیحات",
     "details": "جزئیات",
-    "disable": "غیرفعال",
     "disabled": "غیرفعال است",
     "discard-changes": "لغو تغییرات",
     "duplicate": "تکثیر",
     "edit": "ویرایش",
     "edit-field": "ویرایش فیلد",
     "edit-note": "ویرایش یادداشت",
-    "enable": "فعال",
     "enabled": "فعال است",
     "end-date": "تاریخ پایان",
     "expand-entries": "مشاهده گزینه ها",
@@ -279,7 +274,7 @@
     "name": "نام",
     "no-alerts": "هیچ پیغامی وجود ندارد",
     "no-bulk-actions-available": "هیچ اقدام انبوهی در دسترس نیست.",
-    "no-channel-selected": "هیچ کانالی انتخاب نشده است",
+    "no-channel-selected": "",
     "no-results": "بدون نتیجه",
     "not-applicable": "قابل اجرا نیست",
     "not-set": "تنظیم نشده است.",
@@ -480,7 +475,6 @@
     "year": "سال"
   },
   "editor": {
-    "height": "ارتفاع",
     "image-alt": "توضیحات",
     "image-src": "منبع",
     "image-title": "عنوان",
@@ -489,8 +483,7 @@
     "link-target": "نحوه اجرای لینک",
     "link-title": "عنوان لینک",
     "remove-link": "حذف",
-    "set-link": "تنظیم لینک",
-    "width": "عرض"
+    "set-link": "تنظیم لینک"
   },
   "error": {
     "403-forbidden": "شما در حال حاضر مجاز به دسترسی به \"{ path }\" نیستید. یا فاقد مجوز هستید یا جلسه شما منقضی شده است.",
@@ -535,7 +528,6 @@
     "promotions": "تبلیغات",
     "roles": "نقش ها",
     "sales": "فروش",
-    "scheduled-tasks": "وظایف مجدول",
     "sellers": "فروشندگان",
     "settings": "تنظیمات",
     "shipping-methods": "روش های حمل و نقل",
@@ -683,7 +675,7 @@
     "set-billing-address": "تعیین آدرس صورتحساب",
     "set-coupon-codes": "تعیین کد تخفیف",
     "set-customer-for-order": "تعیین مشتری",
-    "set-customer-success": "مشتری با موفقیت تعیین شد",
+    "set-customer-success": "",
     "set-fulfillment-state": "علامت زدن بعنوان {state}",
     "set-shipping-address": "تنظیم آدرس حمل و نقل",
     "set-shipping-method": "تنظیم شیوه حمل و نقل",
@@ -817,11 +809,6 @@
     "job-state-completed": "تکمیل شده",
     "job-state-failed": "ناموفق",
     "job-state-pending": "در انتظار",
-    "job-state-running": "در حال اجرا",
-    "last-executed-at": "آخرین اجرا",
-    "last-result": "آخرین نتیجه",
-    "next-execution-at": "تالی",
-    "schedule": "جدول",
-    "task-id": "شناسه کار"
+    "job-state-running": "در حال اجرا"
   }
 }

+ 6 - 19
packages/admin-ui/src/lib/static/i18n-messages/fr.json

@@ -6,7 +6,6 @@
     "add-asset": "Ajout fichier",
     "add-asset-with-count": "Ajout {count, plural, =0 {fichier} one {d'un fichier} other {de {count} fichiers}}",
     "assets-selected-count": "{ count } ressources selectionnées",
-    "change-asset": "Changer ressource",
     "dimensions": "Dimensions",
     "focal-point": "Point de focale",
     "notify-create-assets-success": "Création {count, plural, one {d'un nouveau fichier} other {de {count} nouveaux fichiers}}",
@@ -17,7 +16,6 @@
     "select-assets": "Sélectionner fichiers",
     "set-as-featured-asset": "Définir en tant que fichier en vedette",
     "set-focal-point": "Définir point de focale",
-    "size": "Taille",
     "source-file": "Fichier source",
     "unset-focal-point": "Enlever",
     "update-focal-point": "Mettre à jour le point",
@@ -47,7 +45,6 @@
     "profile": "Profil",
     "promotions": "Promotions",
     "roles": "Roles",
-    "scheduled-tasks": "Tâches programmées",
     "seller-orders": "Commandes vendeur",
     "sellers": "Vendeurs",
     "shipping-methods": "Modes d'expédition",
@@ -199,7 +196,7 @@
   },
   "common": {
     "ID": "ID",
-    "add-filter": "Ajouter un filtre",
+    "add-filter": "",
     "add-item-to-list": "Ajouter un article à la liste",
     "add-note": "Ajouter une note",
     "apply": "Appliquer",
@@ -240,14 +237,12 @@
     "delete": "Supprimer",
     "description": "Description",
     "details": "Détails",
-    "disable": "Désactiver",
     "disabled": "Désactivé",
     "discard-changes": "Annuler les changements",
     "duplicate": "Dupliquer",
     "edit": "Editer",
     "edit-field": "Editer champ",
     "edit-note": "Editer note",
-    "enable": "Activer",
     "enabled": "Activé",
     "end-date": "Date de fin",
     "expand-entries": "Développer les éléments",
@@ -279,9 +274,9 @@
     "name": "Nom",
     "no-alerts": "Pas d'alerte",
     "no-bulk-actions-available": "Aucune action groupée disponible",
-    "no-channel-selected": "Aucun canal sélectionné",
+    "no-channel-selected": "",
     "no-results": "Aucun resultat",
-    "not-applicable": "Non applicable",
+    "not-applicable": "",
     "not-set": "Non défini",
     "notify-assign-to-channel-success-with-count": "{count, plural, one {1 item} other {{count} items}} ont bien été attribués à { channelCode }",
     "notify-bulk-update-success": "{ count } { entity } ont été mis à jour",
@@ -480,7 +475,6 @@
     "year": "an"
   },
   "editor": {
-    "height": "Hauteur",
     "image-alt": "Description (alt)",
     "image-src": "Source",
     "image-title": "Titre",
@@ -489,8 +483,7 @@
     "link-target": "Target du lien",
     "link-title": "Titre du lien",
     "remove-link": "Retirer le lien",
-    "set-link": "Définir lien",
-    "width": "Largeur"
+    "set-link": "Définir lien"
   },
   "error": {
     "403-forbidden": "Vous n'êtes pas autorisés à accéder à \"{ path }\". Vous n'avez pas la permission ou votre session a expiré.",
@@ -535,7 +528,6 @@
     "promotions": "Promotions",
     "roles": "Roles",
     "sales": "Ventes",
-    "scheduled-tasks": "Tâches programmées",
     "sellers": "Vendeurs",
     "settings": "Paramètres",
     "shipping-methods": "Mode d'expédition",
@@ -683,7 +675,7 @@
     "set-billing-address": "Définir adresse de livraison",
     "set-coupon-codes": "Définir les codes promo",
     "set-customer-for-order": "Définir le client pour la commande",
-    "set-customer-success": "Client défini avec succès",
+    "set-customer-success": "",
     "set-fulfillment-state": "Marquer {state}",
     "set-shipping-address": "Définir l'adresse de livraison",
     "set-shipping-method": "Définir la méthode de livraison",
@@ -817,11 +809,6 @@
     "job-state-completed": "Terminé",
     "job-state-failed": "Échoué",
     "job-state-pending": "En attente",
-    "job-state-running": "En cours",
-    "last-executed-at": "Dernière exécution",
-    "last-result": "Dernier résultat",
-    "next-execution-at": "Prochaine exécution",
-    "schedule": "Programmation",
-    "task-id": "ID de la tâche"
+    "job-state-running": "En cours"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/he.json

@@ -6,7 +6,6 @@
     "add-asset": "הוסף נכס",
     "add-asset-with-count": "הוסף {count, plural, =0 {נכסים} one {1 נכס} other {{count} נכסים}}",
     "assets-selected-count": "{ count } נכסים נבחרו",
-    "change-asset": "שנה נכס",
     "dimensions": "ממדים",
     "focal-point": "נקודת מוקד",
     "notify-create-assets-success": "נוצר {count, plural, one {נכס חדש} other {{count} נכסים חדשים}}",
@@ -17,7 +16,6 @@
     "select-assets": "בחר נכסים",
     "set-as-featured-asset": "סמן כנכס מובחר",
     "set-focal-point": "קבע נקודת מוקד",
-    "size": "גודל",
     "source-file": "קובץ מקור",
     "unset-focal-point": "בטל קביעת נקודת מוקד",
     "update-focal-point": "עדכן נקודת מוקד",
@@ -47,7 +45,6 @@
     "profile": "פרופיל",
     "promotions": "מבצעים",
     "roles": "תפקידים",
-    "scheduled-tasks": "משימות מתוכנות",
     "seller-orders": "הזמנות מוכר",
     "sellers": "מוכרים",
     "shipping-methods": "שיטות משלוח",
@@ -240,14 +237,12 @@
     "delete": "מחק",
     "description": "תיאור",
     "details": "פרטים",
-    "disable": "מספר",
     "disabled": "מושבת",
     "discard-changes": "בטל שינויים",
     "duplicate": "שכפול",
     "edit": "ערוך",
     "edit-field": "ערוך שדה",
     "edit-note": "ערוך הערה",
-    "enable": "אפשר",
     "enabled": "מאופשר",
     "end-date": "תאריך סיום",
     "expand-entries": "הרחב רשומות",
@@ -279,7 +274,7 @@
     "name": "שם",
     "no-alerts": "אין התראות",
     "no-bulk-actions-available": "אין פעולות גורפות זמינות",
-    "no-channel-selected": "אין ערוץ נבחר",
+    "no-channel-selected": "",
     "no-results": "אין תוצאות",
     "not-applicable": "לא רלוונטי",
     "not-set": "לא מוגדר",
@@ -480,7 +475,6 @@
     "year": "שנה"
   },
   "editor": {
-    "height": "גובה",
     "image-alt": "תיאור (טקסט חלופי)",
     "image-src": "מקור (כתובת)",
     "image-title": "כותרת",
@@ -489,8 +483,7 @@
     "link-target": "יעד הקישור",
     "link-title": "כותרת הקישור",
     "remove-link": "הסר",
-    "set-link": "הגדר קישור",
-    "width": "רוחב"
+    "set-link": "הגדר קישור"
   },
   "error": {
     "403-forbidden": "אין לך הרשאות לגשת כרגע ל \"{path}\". יתכן כי אין לך הרשאות מתאימות או שהפעלת ההפעלה שלך פגה.",
@@ -535,7 +528,6 @@
     "promotions": "מבצעים",
     "roles": "תפקידים",
     "sales": "מכירות",
-    "scheduled-tasks": "משימות מתוכנות",
     "sellers": "מוכרים",
     "settings": "הגדרות",
     "shipping-methods": "אמצעי משלוח",
@@ -683,7 +675,7 @@
     "set-billing-address": "קבע כתובת לחיוב",
     "set-coupon-codes": "קבע קודי קופון",
     "set-customer-for-order": "קבע לקוח",
-    "set-customer-success": "לקוח נקבע בהצלחה",
+    "set-customer-success": "",
     "set-fulfillment-state": "סמן כ{state}",
     "set-shipping-address": "קבע כתובת למשלוח",
     "set-shipping-method": "קבע שיטת משלוח",
@@ -817,11 +809,6 @@
     "job-state-completed": "הושלם",
     "job-state-failed": "נכשל",
     "job-state-pending": "ממתין",
-    "job-state-running": "רץ",
-    "last-executed-at": "התבצע לאחרונה בתאריך",
-    "last-result": "תוצאה אחרונה",
-    "next-execution-at": "התבצע הבא בתאריך",
-    "schedule": "תיקון",
-    "task-id": "מזהה משימה"
+    "job-state-running": "רץ"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/hr.json

@@ -6,7 +6,6 @@
     "add-asset": "Dodaj medij",
     "add-asset-with-count": "Dodaj {count, plural, =0 {medija} one {1 medij} few {{count} medija} other {{count} medija}}",
     "assets-selected-count": "Odabrano {count} medija",
-    "change-asset": "Promijeni medij",
     "dimensions": "Dimenzije",
     "focal-point": "Fokalna točka",
     "notify-create-assets-success": "Kreirano {count, plural, one {1 novo sredstvo} few {{count} nova sredstva} other {{count} novih sredstava}}",
@@ -17,7 +16,6 @@
     "select-assets": "Odaberi medije",
     "set-as-featured-asset": "Postavi kao istaknuti medij",
     "set-focal-point": "Postavi fokalnu točku",
-    "size": "Veličina",
     "source-file": "Izvorna datoteka",
     "unset-focal-point": "Poništi",
     "update-focal-point": "Ažuriraj točku",
@@ -47,7 +45,6 @@
     "profile": "Profil",
     "promotions": "Promocije",
     "roles": "Uloge",
-    "scheduled-tasks": "Zakazane zadatke",
     "seller-orders": "Narudžbe prodavača",
     "sellers": "Prodavači",
     "shipping-methods": "Načini dostave",
@@ -240,14 +237,12 @@
     "delete": "Izbriši",
     "description": "Opis",
     "details": "Detalji",
-    "disable": "Onemogućeno",
     "disabled": "Onemogućeno",
     "discard-changes": "Odbaci promjene",
     "duplicate": "Duplicirati",
     "edit": "Uredi",
     "edit-field": "Uredi polje",
     "edit-note": "Uredi bilješku",
-    "enable": "Omogućeno",
     "enabled": "Omogućeno",
     "end-date": "Datum završetka",
     "expand-entries": "Proširi unose",
@@ -279,7 +274,7 @@
     "name": "Ime",
     "no-alerts": "Nema upozorenja",
     "no-bulk-actions-available": "Nema dostupnih grupnih radnji",
-    "no-channel-selected": "Nije odabran kanal",
+    "no-channel-selected": "",
     "no-results": "Nema rezultata",
     "not-applicable": "Nije primjenjivo",
     "not-set": "Nije postavljeno",
@@ -480,7 +475,6 @@
     "year": "godina"
   },
   "editor": {
-    "height": "Visina",
     "image-alt": "Opis (alt)",
     "image-src": "Izvor",
     "image-title": "Naziv",
@@ -489,8 +483,7 @@
     "link-target": "Target linka",
     "link-title": "Naziv linka",
     "remove-link": "Ukloni",
-    "set-link": "Postavi link",
-    "width": "Širina"
+    "set-link": "Postavi link"
   },
   "error": {
     "403-forbidden": "Trenutno nemate ovlaštenje za pristup \"{ path }\". Ili vam nedostaju ovlasti ili je vaša sesija istekla.",
@@ -535,7 +528,6 @@
     "promotions": "Promocije",
     "roles": "Uloge",
     "sales": "Prodaja",
-    "scheduled-tasks": "Zakazane zadatke",
     "sellers": "Prodavači",
     "settings": "Postavke",
     "shipping-methods": "Načini dostave",
@@ -683,7 +675,7 @@
     "set-billing-address": "Postavi adresu za naplatu",
     "set-coupon-codes": "Postavi kôdove kupona",
     "set-customer-for-order": "Postavi kupca",
-    "set-customer-success": "Kupac postavljen",
+    "set-customer-success": "",
     "set-fulfillment-state": "Označi kao {state}",
     "set-shipping-address": "Postavi adresu za dostavu",
     "set-shipping-method": "Postavi metodu dostave",
@@ -817,11 +809,6 @@
     "job-state-completed": "Završeno",
     "job-state-failed": "Neuspjelo",
     "job-state-pending": "Na čekanju",
-    "job-state-running": "U tijeku",
-    "last-executed-at": "Poslednja izvršenja",
-    "last-result": "Poslednji rezultat",
-    "next-execution-at": "Sljedeće izvršenje",
-    "schedule": "Planiranje",
-    "task-id": "ID zadatka"
+    "job-state-running": "U tijeku"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/it.json

@@ -6,7 +6,6 @@
     "add-asset": "Aggiungi immagine",
     "add-asset-with-count": "Aggiungi {count, plural, =0 {media} one {1 media} other {{count} media}}",
     "assets-selected-count": "{ count } media selezionati",
-    "change-asset": "Cambia media",
     "dimensions": "Dimensioni",
     "focal-point": "Punto focale",
     "notify-create-assets-success": "Creati {count, plural, one {nuovo media} other {{count} nuovi media}}",
@@ -17,7 +16,6 @@
     "select-assets": "Seleziona media",
     "set-as-featured-asset": "Imposta come media in evidenza",
     "set-focal-point": "Imposta punto focale",
-    "size": "Dimensione",
     "source-file": "File sorgente",
     "unset-focal-point": "Deseleziona",
     "update-focal-point": "Aggiorna punto",
@@ -47,7 +45,6 @@
     "profile": "Profilo",
     "promotions": "Promozioni",
     "roles": "Ruoli",
-    "scheduled-tasks": "Attività pianificate",
     "seller-orders": "Ordini venditori",
     "sellers": "Venditori",
     "shipping-methods": "Metodi di spedizione",
@@ -240,14 +237,12 @@
     "delete": "Cancella",
     "description": "Descrizione",
     "details": "Dettagli",
-    "disable": "Disabilitato",
     "disabled": "Disabilitato",
     "discard-changes": "Annulla modifiche",
     "duplicate": "Duplica",
     "edit": "Modifica",
     "edit-field": "Modifica campo",
     "edit-note": "Modifica nota",
-    "enable": "Abilitato",
     "enabled": "Abilitato",
     "end-date": "Data di fine",
     "expand-entries": "Espandi elementi",
@@ -279,7 +274,7 @@
     "name": "Nome",
     "no-alerts": "Nessun avviso",
     "no-bulk-actions-available": "Nessuna azione di massa disponibile",
-    "no-channel-selected": "Nessun canale selezionato",
+    "no-channel-selected": "",
     "no-results": "Nessun risultato",
     "not-applicable": "Non applicabile",
     "not-set": "Non impostato",
@@ -480,7 +475,6 @@
     "year": "anno"
   },
   "editor": {
-    "height": "Altezza",
     "image-alt": "Descrizione (alt)",
     "image-src": "Fonte (indirizzo immagine)",
     "image-title": "Titolo",
@@ -489,8 +483,7 @@
     "link-target": "Destinazione link",
     "link-title": "Titolo link",
     "remove-link": "Rimuovi",
-    "set-link": "Imposta link",
-    "width": "Larghezza"
+    "set-link": "Imposta link"
   },
   "error": {
     "403-forbidden": "Non sei autorizzato ad accedere a \"{ path }\". Potresti non avere sufficienti permessi, oppure la tua sessione è scaduta.",
@@ -535,7 +528,6 @@
     "promotions": "Promozioni",
     "roles": "Ruoli",
     "sales": "Vendite",
-    "scheduled-tasks": "Attività pianificate",
     "sellers": "Venditori",
     "settings": "Impostazioni",
     "shipping-methods": "Metodi di Spedizione",
@@ -683,7 +675,7 @@
     "set-billing-address": "Inserisci indirizzo di fatturazioine",
     "set-coupon-codes": "Inserisci i codici coupon",
     "set-customer-for-order": "Seleziona cliente",
-    "set-customer-success": "Cliente impostato con successo",
+    "set-customer-success": "",
     "set-fulfillment-state": "Segna come {state}",
     "set-shipping-address": "Seleziona indirizzo di spedizione",
     "set-shipping-method": "Seleziona metodo di consegna",
@@ -817,11 +809,6 @@
     "job-state-completed": "Completato",
     "job-state-failed": "Fallito",
     "job-state-pending": "In attesa",
-    "job-state-running": "In esecuzione",
-    "last-executed-at": "Ultimo esecuzione",
-    "last-result": "Ultimo risultato",
-    "next-execution-at": "Prossima esecuzione",
-    "schedule": "Programmazione",
-    "task-id": "ID attività"
+    "job-state-running": "In esecuzione"
   }
 }

+ 8 - 17
packages/admin-ui/src/lib/static/i18n-messages/ja.json

@@ -5,8 +5,8 @@
   "asset": {
     "add-asset": "アセット追加",
     "add-asset-with-count": "{ count }個のアセットを追加",
-    "assets-selected-count": "{ count }個のアセットを選択",
     "change-asset": "アセット変更",
+    "assets-selected-count": "{ count }個のアセットを選択",
     "dimensions": "元画像サイズ",
     "focal-point": "注目点",
     "notify-create-assets-success": "{count}個のアセットが作成されました",
@@ -17,14 +17,14 @@
     "select-assets": "アセット選択",
     "set-as-featured-asset": "代表アセットにする",
     "set-focal-point": "注目点を指定",
-    "size": "サイズ",
     "source-file": "元画像ファイル名",
     "unset-focal-point": "注目点解除",
     "update-focal-point": "注目点更新",
     "update-focal-point-error": "注目点の更新ができませんでした",
     "update-focal-point-success": "注目点を更新しました",
     "upload-assets": "アセットをアップロード",
-    "uploading": "アップロード中..."
+    "uploading": "アップロード中...",
+    "size": "サイズ"
   },
   "breadcrumb": {
     "administrators": "管理者",
@@ -47,7 +47,6 @@
     "profile": "プロフィール",
     "promotions": "プロモーション",
     "roles": "ロール",
-    "scheduled-tasks": "スケジュールされたタスク",
     "seller-orders": "販売者の注文",
     "sellers": "販売者",
     "shipping-methods": "配送方法",
@@ -240,14 +239,12 @@
     "delete": "削除",
     "description": "説明",
     "details": "詳細",
-    "disable": "無効",
     "disabled": "Disabled",
     "discard-changes": "変更の破棄",
     "duplicate": "複製",
     "edit": "編集",
     "edit-field": "フィールドを編集",
     "edit-note": "ノート編集",
-    "enable": "有効",
     "enabled": "Enabled",
     "end-date": "終了日",
     "expand-entries": "折りたたみ開閉",
@@ -293,7 +290,7 @@
     "notify-delete-success-with-count": "{count} 個のアイテムを削除しました。",
     "notify-duplicate-error": "{ name } の複製ができませんでした。エラー: { error }",
     "notify-duplicate-error-excess": "エラーのため追加の { count } 件は複製できませんでした",
-    "notify-duplicate-success": "複製しました: {count} 件 ({names})",
+    "notify-duplicate-success": "複製しました。 {count, plural, one {1 item} other {{count} items}}: { names }",
     "notify-remove-from-channel-success-with-count": "{ count } 個のアイテムをチャンネルから除去しました。",
     "notify-save-changes-error": "エラーが発生しました。変更を保存できませんでした。",
     "notify-saved-changes": "変更を保存しました",
@@ -480,7 +477,6 @@
     "year": "年間"
   },
   "editor": {
-    "height": "高さ",
     "image-alt": "説明文 (alt)",
     "image-src": "ソース",
     "image-title": "題名",
@@ -490,7 +486,8 @@
     "link-title": "リンクタイトル",
     "remove-link": "除去",
     "set-link": "リンクを設定",
-    "width": "幅"
+    "width": "幅",
+    "height": "高さ"
   },
   "error": {
     "403-forbidden": "現在 \"{ path }\" のアクセス権限がありません。権限がないかセッション有効期限が切れています。",
@@ -535,7 +532,6 @@
     "promotions": "プロモーション",
     "roles": "ロール",
     "sales": "販売",
-    "scheduled-tasks": "スケジュールされたタスク",
     "sellers": "販売者",
     "settings": "設定",
     "shipping-methods": "配送方法",
@@ -817,11 +813,6 @@
     "job-state-completed": "完了",
     "job-state-failed": "失敗",
     "job-state-pending": "保留中",
-    "job-state-running": "実行中",
-    "last-executed-at": "最後の実行日時",
-    "last-result": "最後の結果",
-    "next-execution-at": "次回の実行日時",
-    "schedule": "スケジュール",
-    "task-id": "タスクID"
+    "job-state-running": "実行中"
   }
-}
+}

+ 7 - 22
packages/admin-ui/src/lib/static/i18n-messages/nb.json

@@ -6,7 +6,6 @@
     "add-asset": "Legg til ressurs",
     "add-asset-with-count": "Legg til {count, plural, =0 {ressurser} one {1 ressurs} other {{count} ressurser}}",
     "assets-selected-count": "{ count } ressurser valgt",
-    "change-asset": "Endre medie",
     "dimensions": "Dimensjoner",
     "focal-point": "Fokuspunkt",
     "notify-create-assets-success": "Opprettet {count, plural, one {ny ressurs} other {{count} nye ressurser}}",
@@ -17,7 +16,6 @@
     "select-assets": "Velg ressurser",
     "set-as-featured-asset": "Sett som fremhevet ressurs",
     "set-focal-point": "Sett fokuspunkt",
-    "size": "Størrelse",
     "source-file": "Kildefil",
     "unset-focal-point": "Fjern fokuspunkt",
     "update-focal-point": "Oppdater fokuspunkt",
@@ -47,7 +45,6 @@
     "profile": "Profil",
     "promotions": "Promosjoner",
     "roles": "Roller",
-    "scheduled-tasks": "Planlagte oppgaver",
     "seller-orders": "Selgerordrer",
     "sellers": "Selgere",
     "shipping-methods": "Fraktmetoder",
@@ -74,8 +71,6 @@
     "assign-variants-to-channel": "Legg til produktvarianter til kanal",
     "auto-update-option-variant-name": "Oppdater automatisk navnene på produktvarianter ved bruk av dette alternativet",
     "auto-update-product-variant-name": "Oppdater automatisk navnene på produktvarianter",
-    "calculated-price": "Beregnet pris",
-    "calculated-price-tooltip": "Prisene for produktvarianter beregnes automatisk basert på prisene for produktalternativer",
     "cannot-create-variants-without-options": "Produktvarianter kan ikke opprettes før en alternativgruppe med minst to produktalternativer er definert",
     "channel-price-preview": "Forhåndsvisning av pris i kanal",
     "collection": "Samling",
@@ -240,14 +235,12 @@
     "delete": "Slett",
     "description": "Beskrivelse",
     "details": "Detaljer",
-    "disable": "Deaktivert",
     "disabled": "Deaktivert",
     "discard-changes": "Forkast endringer",
     "duplicate": "Duplisere",
     "edit": "Rediger",
     "edit-field": "Rediger felt",
     "edit-note": "Rediger notat",
-    "enable": "Aktiver",
     "enabled": "Aktivert",
     "end-date": "Sluttdato",
     "expand-entries": "Utvid oppføringer",
@@ -279,7 +272,7 @@
     "name": "Navn",
     "no-alerts": "Ingen varsler",
     "no-bulk-actions-available": "Ingen massehandlinger tilgjengelige",
-    "no-channel-selected": "Ingen kanal valgt",
+    "no-channel-selected": "",
     "no-results": "Ingen resultater",
     "not-applicable": "Ikke relevant",
     "not-set": "Ikke satt",
@@ -480,7 +473,6 @@
     "year": "år"
   },
   "editor": {
-    "height": "Høyde",
     "image-alt": "Beskrivelse (alt)",
     "image-src": "Kilde",
     "image-title": "Tittel",
@@ -489,8 +481,7 @@
     "link-target": "Lenkemål",
     "link-title": "Lenketittel",
     "remove-link": "Fjern",
-    "set-link": "Sett lenke",
-    "width": "Bredde"
+    "set-link": "Sett lenke"
   },
   "error": {
     "403-forbidden": "Du har for øyeblikket ikke autorisasjon til å få tilgang til \"{ path }\". Enten mangler du tillatelser, eller økten din har utløpt.",
@@ -535,7 +526,6 @@
     "promotions": "Promosjoner",
     "roles": " Roller",
     "sales": "Salg",
-    "scheduled-tasks": "Planlagte oppgaver",
     "sellers": "Selgere",
     "settings": "Innstillinger",
     "shipping-methods": "Fraktmetoder",
@@ -569,7 +559,7 @@
     "cancel-selected-items": "Avbryt valgte varer",
     "cancel-specified-items": "Avbryt spesifikke varer",
     "cancellation-reason": "Årsak til avbestilling",
-    "cancelled-order-items-success": "Varer ble avlyst",
+    "cancelled-order-items-success": "",
     "cancelled-order-success": "Ordren ble avlyst",
     "complete-draft-order": "Fullfør utkast",
     "confirm-modifications": "Bekreft endringer",
@@ -683,7 +673,7 @@
     "set-billing-address": "Sett faktureringsadresse",
     "set-coupon-codes": "Angi kupongkoder",
     "set-customer-for-order": "Sett kunde",
-    "set-customer-success": "Kunde ble satt",
+    "set-customer-success": "",
     "set-fulfillment-state": "Merk som {state}",
     "set-shipping-address": "Sett leveringsadresse",
     "set-shipping-method": "Sett leveringsmetode",
@@ -713,8 +703,8 @@
     "transitioned-payment-to-state-success": "Betaling ble vellykket overført til { state }",
     "transitioned-to-state-success": "Overgangen til { state } ble vellykket",
     "unable-to-transition-to-state-try-another": "Ordren kunne ikke overføres tilbake til tilstanden \"{state}\". Velg en alternativ tilstand.",
-    "unfulfilled": "Ikke utført",
-    "unit-price": "Enhetspris"
+    "unfulfilled": "",
+    "unit-price": ""
   },
   "settings": {
     "add-countries-to-zone": "Legg til land i { zoneName }",
@@ -817,11 +807,6 @@
     "job-state-completed": "Fullført",
     "job-state-failed": "Feilet",
     "job-state-pending": "Venter",
-    "job-state-running": "Kjører",
-    "last-executed-at": "Sist kjørt",
-    "last-result": "Siste resultat",
-    "next-execution-at": "Neste kjøring",
-    "schedule": "Plan",
-    "task-id": "Jobb-ID"
+    "job-state-running": "Kjører"
   }
 }

+ 15 - 28
packages/admin-ui/src/lib/static/i18n-messages/ne.json

@@ -6,7 +6,6 @@
     "add-asset": "फाइल थप्नुहोस्",
     "add-asset-with-count": "थप्नुहोस् {count, plural, =0 {फाइल} one {१ फाइल} other {{count} फाइल}}",
     "assets-selected-count": "{ count } फाइल चयन गरियो",
-    "change-asset": "फाइल परिवर्तन गर्नुहोस्",
     "dimensions": "आयामहरू",
     "focal-point": "बिन्दु",
     "notify-create-assets-success": "{count, plural, one {नयाँ फाइल} other {{count} नयाँ फाइलहरू}} सिर्जना गरियो",
@@ -17,7 +16,6 @@
     "select-assets": "फाइलहरू चयन गर्नुहोस्",
     "set-as-featured-asset": "फिचर्ड फाइल बनाउनुहोस्",
     "set-focal-point": "फोकल प्वाइट सेट गर्नुहोस्",
-    "size": "आकार",
     "source-file": "स्रोत फाइल",
     "unset-focal-point": "अनसेट-केन्द्र बिन्दु",
     "update-focal-point": "अपडेट-केन्द्र बिन्दु",
@@ -30,7 +28,7 @@
     "administrators": "प्रशासकहरू",
     "assets": "फाइलहरू",
     "channels": "च्यानलहरू",
-    "collections": "संग्रहहरू",
+    "collections": "",
     "countries": "देशहरू",
     "customer-groups": "ग्राहक समूहहरू",
     "customers": "ग्राहकहरू",
@@ -47,7 +45,6 @@
     "profile": "प्रोफाइल",
     "promotions": "प्रमोशनहरू",
     "roles": "भूमिकाहरू",
-    "scheduled-tasks": "स्थानान्तरण गर्ने कामहरू",
     "seller-orders": "विक्रेता ओर्दरहरु",
     "sellers": "विक्रेता व्यक्तिहरू",
     "shipping-methods": "ढुवानी गर्ने तरिकाहरू",
@@ -78,9 +75,9 @@
     "calculated-price-tooltip": "उपर सेट गरिएको मूल्यलाई परिवर्तन गर्दछ जुन कस्टम मूल्य गणना गर्नुहोस्:",
     "cannot-create-variants-without-options": "कम्ति दुई समान विकल्पसम्म विकल्प संग समावेश गरिएको पर्याप्त छेनपछि समान विविधता सिर्जना गर्न सकिदैन",
     "channel-price-preview": "च्यानल मूल्य पूर्वावलोकन",
-    "collection": "संग्रह",
-    "collection-contents": "संग्रह सामग्री",
-    "collections": "संग्रहहरू",
+    "collection": "",
+    "collection-contents": "",
+    "collections": "",
     "confirm-bulk-delete-products": "{count} समानहरू मेटाउनुहोस्?",
     "confirm-cancel": "रद्द गर्नुहोस्?",
     "confirm-delete-assets": "{count} {count, plural, one {संपत्ति} other {संपत्तिहरू}} मेटाउनुहोस्?",
@@ -94,7 +91,7 @@
     "confirm-deletion-of-unused-variants-title": "अपयोगित समान विविधताहरू मेटाउनुहोस्?",
     "create-draft-order": "मस्यौदा ओर्दर सिर्जना गर्नुहोस्",
     "create-facet-value": "नयाँ गुणस्तर मान बनाउनुहोस्",
-    "create-new-collection": "नयाँ संग्रह सिर्जना गर्नुहोस्",
+    "create-new-collection": "",
     "create-new-facet": "नयाँ मूल्य सिर्जना गर्नुहोस्",
     "create-new-product": "नयाँ समान",
     "create-new-stock-location": "नयाँ स्टक स्थान सिर्जना गर्नुहोस्",
@@ -118,9 +115,9 @@
     "inherit-filters-from-parent": "उत्तराधिकारीबाट फिल्टरहरू समावेश गर्नुहोस्",
     "live-preview-contents": "सामग्री लाइभ पूर्वावलोकन",
     "manage-variants": "विविधताहरू प्रबन्धन गर्नुहोस्",
-    "move-collection-to": "संग्रह स्थानान्तरण गर्नुहोस्",
-    "move-collections": "संग्रहहरू स्थानान्तरण गर्नुहोस्",
-    "move-collections-success": "संग्रहहरू स्थानान्तरण गर्नुहोस्",
+    "move-collection-to": "",
+    "move-collections": "",
+    "move-collections-success": "",
     "move-down": "तल सार्नुहोस्",
     "move-to": "यहाँ सार्नुहोस्",
     "move-up": "माथि सार्नुहोस्",
@@ -165,8 +162,8 @@
     "remove-option": "विकल्प हटाउनुहोस्",
     "remove-product-from-channel": "च्यानलबाट समान हटाउनुहोस्",
     "remove-product-variant-from-channel": "च्यानलबाट समान वेरिएन्ट हटाउनुहोस्",
-    "reorder-collection": "संग्रह सूची पुनर्व्यवस्थापन गर्नुहोस्",
-    "root-collection": "मुख्य संग्रह",
+    "reorder-collection": "",
+    "root-collection": "",
     "run-pending-search-index-updates": "खोज सूची: चलाउँदै छ {count, plural, one {1 पेन्डिङ अपडेट} other {{count} पेन्डिङ अपडेटहरू}}",
     "running-search-index-updates": "चलाउँदै छ {count, plural, one {1 अपडेट} other {{count} अपडेटहरू}} खोज सूचीमा",
     "search-asset-name-or-tag": "संपत्ति नाम वा ट्यागका लागि खोज्नुहोस्",
@@ -240,14 +237,12 @@
     "delete": "मेटाउनुहोस्",
     "description": "विवरण",
     "details": "विवरणहरू",
-    "disable": "निष्कृय",
     "disabled": "निष्कृय",
     "discard-changes": "परिवर्तन फाल्नुहोस्",
     "duplicate": "डुप्लिकेट",
     "edit": "सम्पादन गर्नुहोस्",
     "edit-field": "क्षेत्र सम्पादन गर्नुहोस्",
     "edit-note": "नोट सम्पादन गर्नुहोस्",
-    "enable": "सक्षम",
     "enabled": "सक्षम",
     "end-date": "समाप्ति मिति",
     "expand-entries": "प्रवेशहरू बढाउनुहोस्",
@@ -279,7 +274,7 @@
     "name": "नाम",
     "no-alerts": "कुनै सूचना छैन",
     "no-bulk-actions-available": "कुनै थप्दा कार्यक्रम उपलब्ध छैन",
-    "no-channel-selected": "कुनै च्यानल चयन गरिएको छैन",
+    "no-channel-selected": "",
     "no-results": "कुनै परिणाम छैन",
     "not-applicable": "लागू छैन",
     "not-set": "सेट गरिएको छैन",
@@ -480,7 +475,6 @@
     "year": "बर्ष"
   },
   "editor": {
-    "height": "उचाइ",
     "image-alt": "विवरण (आल्ट)",
     "image-src": "स्रोत",
     "image-title": "शीर्षक",
@@ -489,8 +483,7 @@
     "link-target": "लिङ्क लक्ष्य",
     "link-title": "लिङ्क शीर्षक",
     "remove-link": "हटाउनुहोस्",
-    "set-link": "लिङ्क सेट गर्नुहोस्",
-    "width": "चौडाइ"
+    "set-link": "लिङ्क सेट गर्नुहोस्"
   },
   "error": {
     "403-forbidden": "तपाईंलाई हालको गरेदिनुपर्दै \"{ path }\" मा पहुँच गर्न पाइएन। तपाईंको पासवर्ड, वा तपाईंको सत्र समाप्त भएको छ भने हेरचाह गर्नुहोस्।",
@@ -521,7 +514,7 @@
     "assets": "फाइलहरू",
     "catalog": "क्याटलग",
     "channels": "च्यानलहरू",
-    "collections": "संग्रहहरू",
+    "collections": "",
     "countries": "देशहरू",
     "customer-groups": "ग्राहक समूहहरू",
     "customers": "ग्राहकहरू",
@@ -535,7 +528,6 @@
     "promotions": "प्रमोशनहरू",
     "roles": "भूमिकाहरू",
     "sales": "बिक्री",
-    "scheduled-tasks": "स्थानान्तरण गर्ने कामहरू",
     "sellers": "बेच्नेहरू",
     "settings": "सेटिङ्ग्स",
     "shipping-methods": "ढुवानी तरिकाहरू",
@@ -683,7 +675,7 @@
     "set-billing-address": "बिलिङ ठेगाना सेट गर्नुहोस्",
     "set-coupon-codes": "कुपन कोड सेट गर्नुहोस्",
     "set-customer-for-order": "ग्राहक सेट गर्नुहोस्",
-    "set-customer-success": "ग्राहक सेट गरियो",
+    "set-customer-success": "",
     "set-fulfillment-state": "{state} मा चिन्ह गर्नुहोस्",
     "set-shipping-address": "ढुवानी ठेगाना सेट गर्नुहोस्",
     "set-shipping-method": "ढुवानी तरिका सेट गर्नुहोस्",
@@ -817,11 +809,6 @@
     "job-state-completed": "पूरा गरिएको",
     "job-state-failed": "असफल",
     "job-state-pending": "बाँकी",
-    "job-state-running": "चलिरहेको",
-    "last-executed-at": "अन्तिम प्रयोग",
-    "last-result": "अन्तिम परिणाम",
-    "next-execution-at": "अर्को प्रयोग",
-    "schedule": "निर्धारण",
-    "task-id": "काम ID"
+    "job-state-running": "चलिरहेको"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/pl.json

@@ -6,7 +6,6 @@
     "add-asset": "Dodaj zasób",
     "add-asset-with-count": "Dodaj {count, plural, =0 {assets} one {1 zasób} other {{count} zasobów}}",
     "assets-selected-count": "Zaznaczono { count } zasobów",
-    "change-asset": "Zmień zasób",
     "dimensions": "Wymiary",
     "focal-point": "Punkt centralny",
     "notify-create-assets-success": "Utworzono {count, plural, one {nowy zasób} other {{count} nowych zasobów}}",
@@ -17,7 +16,6 @@
     "select-assets": "Wybierz zasoby",
     "set-as-featured-asset": "Ustaw jako polecany",
     "set-focal-point": "Ustaw punk centralny",
-    "size": "Rozmiar",
     "source-file": "Plik źródłowy",
     "unset-focal-point": "Usuń punkt centralny",
     "update-focal-point": "Zaktualizuj punkt centralny",
@@ -47,7 +45,6 @@
     "profile": "Profil",
     "promotions": "Promocje",
     "roles": "Role",
-    "scheduled-tasks": "Zadania planowane",
     "seller-orders": "Zamówienia sprzedawcy",
     "sellers": "Sprzedawcy",
     "shipping-methods": "Metody wysyłki",
@@ -240,15 +237,13 @@
     "delete": "Usuń",
     "description": "Opis",
     "details": "Szczegóły",
-    "disable": "Wyłącz",
     "disabled": "Wyłączony",
     "discard-changes": "Odrzuć zmiany",
     "duplicate": "Zduplikować",
     "edit": "Edytuj",
     "edit-field": "Edytuj pole",
     "edit-note": "Edytuj notatkę",
-    "enable": "Włącz",
-    "enabled": "Włączony",
+    "enabled": "Aktywny",
     "end-date": "Data zakończenia",
     "expand-entries": "Rozwiń wpisy",
     "extension-running-in-separate-window": "Rozszerzenie jest włączone w innym oknie",
@@ -279,7 +274,7 @@
     "name": "Nazwa",
     "no-alerts": "Brak alertów",
     "no-bulk-actions-available": "Brak dostępnych akcji zbiorowych",
-    "no-channel-selected": "Brak wybranego kanału",
+    "no-channel-selected": "",
     "no-results": "Brak wyników",
     "not-applicable": "Nie dotyczy",
     "not-set": "Nie ustawione",
@@ -480,7 +475,6 @@
     "year": "rok"
   },
   "editor": {
-    "height": "Wysokość",
     "image-alt": "Opis (alt)",
     "image-src": "Źródło",
     "image-title": "Tytuł",
@@ -489,8 +483,7 @@
     "link-target": "Otwórz w nowym oknie",
     "link-title": "Tytuł linku",
     "remove-link": "Usuń",
-    "set-link": "Ustaw link",
-    "width": "Szerokość"
+    "set-link": "Ustaw link"
   },
   "error": {
     "403-forbidden": "Brak autoryzacji dla \"{ path }\". Brak uprawnień lub wygasła sesja.",
@@ -535,7 +528,6 @@
     "promotions": "Promocje",
     "roles": "Role",
     "sales": "Sprzedaż",
-    "scheduled-tasks": "Zadania planowane",
     "sellers": "Sprzedawcy",
     "settings": "Ustawienia",
     "shipping-methods": "Metody wysyłki",
@@ -817,11 +809,6 @@
     "job-state-completed": "Ukończono",
     "job-state-failed": "Nie powiodło się",
     "job-state-pending": "Oczekujące",
-    "job-state-running": "Uruchomione",
-    "last-executed-at": "Ostatnio wykonano",
-    "last-result": "Ostatni wynik",
-    "next-execution-at": "Następne wykonanie",
-    "schedule": "Harmonogram",
-    "task-id": "ID zadania"
+    "job-state-running": "Uruchomione"
   }
 }

+ 2 - 15
packages/admin-ui/src/lib/static/i18n-messages/pt_BR.json

@@ -6,7 +6,6 @@
     "add-asset": "Adicionar imagens",
     "add-asset-with-count": "Adiciona {count, plural, =0 {assets} one {1 asset} other {{count} assets}}",
     "assets-selected-count": "{ count } imagens selecionadas",
-    "change-asset": "Alterar imagem",
     "dimensions": "Dimensões",
     "focal-point": "Ponto central",
     "notify-create-assets-success": "Criado {count, plural, one {new Asset} other {{count} new Assets}}",
@@ -17,7 +16,6 @@
     "select-assets": "Selecione imagens",
     "set-as-featured-asset": "Definir como imagem em destaque",
     "set-focal-point": "Definir ponto central",
-    "size": "Tamanho",
     "source-file": "Arquivo fonte",
     "unset-focal-point": "Desativar",
     "update-focal-point": "Atualizar ponto central",
@@ -47,7 +45,6 @@
     "profile": "Perfil",
     "promotions": "Promoções",
     "roles": "Regras",
-    "scheduled-tasks": "Tarefas agendadas",
     "seller-orders": "Pedidos do vendedor",
     "sellers": "Vendedores",
     "shipping-methods": "Métodos de envio",
@@ -240,14 +237,12 @@
     "delete": "Excluir",
     "description": "Descrição",
     "details": "Detalhes",
-    "disable": "Desabilitar",
     "disabled": "Desabilitado",
     "discard-changes": "Descartar modificações",
     "duplicate": "Duplicar",
     "edit": "Editar",
     "edit-field": "Editar campo",
     "edit-note": "Editar nota",
-    "enable": "Habilitar",
     "enabled": "Habilitado",
     "end-date": "Data de encerramento",
     "expand-entries": "Expandir entradas",
@@ -480,7 +475,6 @@
     "year": "ano"
   },
   "editor": {
-    "height": "Altura",
     "image-alt": "Descrição (alt)",
     "image-src": "Código",
     "image-title": "Título",
@@ -489,8 +483,7 @@
     "link-target": "Escolha onde abrir o link:",
     "link-title": "Título do link",
     "remove-link": "Remover",
-    "set-link": "Definir link",
-    "width": "Largura"
+    "set-link": "Definir link"
   },
   "error": {
     "403-forbidden": "No momento, você não está autorizado a acessar \"{ path }\". Você não tem permissão ou sua sessão expirou.",
@@ -535,7 +528,6 @@
     "promotions": "Promoções",
     "roles": "Regras de permissão",
     "sales": "Vendas",
-    "scheduled-tasks": "Tarefas agendadas",
     "sellers": "Vendedores",
     "settings": "Configurações",
     "shipping-methods": "Métodos de envio",
@@ -817,11 +809,6 @@
     "job-state-completed": "Concluído",
     "job-state-failed": "Falhou",
     "job-state-pending": "Pendente",
-    "job-state-running": "Em execução",
-    "last-executed-at": "Última execução",
-    "last-result": "Último resultado",
-    "next-execution-at": "Próxima execução",
-    "schedule": "Agendamento",
-    "task-id": "ID da tarefa"
+    "job-state-running": "Em execução"
   }
 }

+ 5 - 17
packages/admin-ui/src/lib/static/i18n-messages/pt_PT.json

@@ -5,8 +5,8 @@
   "asset": {
     "add-asset": "Adicionar imagens",
     "add-asset-with-count": "Adiciona {count, plural, =0 {assets} one {1 asset} other {{count} assets}}",
-    "assets-selected-count": "{ count } imagens selecionadas",
     "change-asset": "Mudar imagem",
+    "assets-selected-count": "{ count } imagens selecionadas",
     "dimensions": "Dimensões",
     "focal-point": "Ponto central",
     "notify-create-assets-success": "Criado {count, plural, one {new Asset} other {{count} new Assets}}",
@@ -17,7 +17,6 @@
     "select-assets": "Seleccione as imagens",
     "set-as-featured-asset": "Definir como imagem em destaque",
     "set-focal-point": "Definir ponto central",
-    "size": "Tamanho",
     "source-file": "Ficheiro original",
     "unset-focal-point": "Desactivar",
     "update-focal-point": "Actualizar ponto central",
@@ -47,7 +46,6 @@
     "profile": "Perfil",
     "promotions": "Promoções",
     "roles": "Regras",
-    "scheduled-tasks": "Tarefas agendadas",
     "seller-orders": "Encomendas de vendedores",
     "sellers": "Vendedores",
     "shipping-methods": "Métodos de envio",
@@ -240,15 +238,13 @@
     "delete": "Eliminar",
     "description": "Descrição",
     "details": "Detalhes",
-    "disable": "Desativar",
-    "disabled": "Inativo",
+    "disabled": "Inactivo",
     "discard-changes": "Descartar modificações",
     "duplicate": "Duplicar",
     "edit": "Editar",
     "edit-field": "Editar campo",
     "edit-note": "Editar nota",
-    "enable": "Ativar",
-    "enabled": "Ativo",
+    "enabled": "Activo",
     "end-date": "Data de fim",
     "expand-entries": "Expandir entradas",
     "extension-running-in-separate-window": "A extensão está a ser executada em uma janela separada",
@@ -480,7 +476,6 @@
     "year": "ano"
   },
   "editor": {
-    "height": "Altura",
     "image-alt": "Descrição (alt)",
     "image-src": "Código",
     "image-title": "Título",
@@ -489,8 +484,7 @@
     "link-target": "Escolha onde abrir o link",
     "link-title": "Título do link",
     "remove-link": "Remover",
-    "set-link": "Atribuir link",
-    "width": "Largura"
+    "set-link": "Atribuir link"
   },
   "error": {
     "403-forbidden": "No momento, você não está autorizado a aceder \"{ path }\". Você não tem permissão ou a sua sessão expirou.",
@@ -535,7 +529,6 @@
     "promotions": "Promoções",
     "roles": "Gerir permissões",
     "sales": "Vendas",
-    "scheduled-tasks": "Tarefas agendadas",
     "sellers": "Vendedores",
     "settings": "Configurações",
     "shipping-methods": "Métodos de envio",
@@ -817,11 +810,6 @@
     "job-state-completed": "Concluído",
     "job-state-failed": "Falhou",
     "job-state-pending": "Pendente",
-    "job-state-running": "Em execução",
-    "last-executed-at": "Última execução",
-    "last-result": "Último resultado",
-    "next-execution-at": "Próxima execução",
-    "schedule": "Agendamento",
-    "task-id": "ID da tarefa"
+    "job-state-running": "Em execução"
   }
 }

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/ru.json

@@ -6,7 +6,6 @@
     "add-asset": "Добавить медиафайл",
     "add-asset-with-count": "Добавить {count, plural, =0 {медиафайлов} one {1 медиафайл} other {{count} медиафайлов}}",
     "assets-selected-count": "Выбрано { count } медиафайлов",
-    "change-asset": "Изменить медиафайл",
     "dimensions": "Размеры",
     "focal-point": "Точка фокуса",
     "notify-create-assets-success": "Создано {count, plural, one {1 новый медиафайл} other {{count} новых медиафайлов}}",
@@ -17,7 +16,6 @@
     "select-assets": "Выбрать медиафайлы",
     "set-as-featured-asset": "Установить как основной медиафайл",
     "set-focal-point": "Установить точку фокуса",
-    "size": "Размер",
     "source-file": "Исходный файл",
     "unset-focal-point": "Удалить точку фокуса",
     "update-focal-point": "Обновить точку фокуса",
@@ -47,7 +45,6 @@
     "profile": "Профиль",
     "promotions": "Акции",
     "roles": "Роли",
-    "scheduled-tasks": "Задачи",
     "seller-orders": "Заказы продавца",
     "sellers": "Продавцы",
     "shipping-methods": "Способы доставки",
@@ -240,14 +237,12 @@
     "delete": "Удалить",
     "description": "Описание",
     "details": "Детали",
-    "disable": "Выключить",
     "disabled": "Выключен",
     "discard-changes": "Отменить изменения",
     "duplicate": "Дублировать",
     "edit": "Редактировать",
     "edit-field": "Редактировать поле",
     "edit-note": "Редактировать заметку",
-    "enable": "Включить",
     "enabled": "Включен",
     "end-date": "Дата окончания",
     "expand-entries": "Развернуть записи",
@@ -279,7 +274,7 @@
     "name": "Имя",
     "no-alerts": "Нет уведомлений",
     "no-bulk-actions-available": "Нет доступных массовых действий",
-    "no-channel-selected": "Не выбран канал",
+    "no-channel-selected": "",
     "no-results": "Нет результатов",
     "not-applicable": "Непригодный",
     "not-set": "Не задано",
@@ -480,7 +475,6 @@
     "year": "год"
   },
   "editor": {
-    "height": "Высота",
     "image-alt": "Описание (alt)",
     "image-src": "Источник",
     "image-title": "Заголовок",
@@ -489,8 +483,7 @@
     "link-target": "Целевая ссылка",
     "link-title": "Заголовок ссылки",
     "remove-link": "Удалять",
-    "set-link": "Установить ссылку",
-    "width": "Ширина"
+    "set-link": "Установить ссылку"
   },
   "error": {
     "403-forbidden": "В настоящее время у вас нет прав доступа \"{ path }\". Либо у вас нет разрешений на просмотр, либо срок вашего сеанса истек.",
@@ -535,7 +528,6 @@
     "promotions": "Промо-акции",
     "roles": "Роли",
     "sales": "Продажи",
-    "scheduled-tasks": "Задачи",
     "sellers": "Продавцы",
     "settings": "Настройки",
     "shipping-methods": "Способы доставки",
@@ -683,7 +675,7 @@
     "set-billing-address": "Установить платёжный адрес",
     "set-coupon-codes": "Применить код купона",
     "set-customer-for-order": "Выбрать клиента для заказа",
-    "set-customer-success": "Клиент успешно установлен",
+    "set-customer-success": "",
     "set-fulfillment-state": "Отметить как {state}",
     "set-shipping-address": "Установить адрес доставки",
     "set-shipping-method": "Установить метод доставки",
@@ -817,11 +809,6 @@
     "job-state-completed": "Завершено",
     "job-state-failed": "Не удалось",
     "job-state-pending": "В ожидании",
-    "job-state-running": "Выполняется",
-    "last-executed-at": "Последнее выполнение",
-    "last-result": "Последний результат",
-    "next-execution-at": "Следующее выполнение",
-    "schedule": "Расписание",
-    "task-id": "ID задачи"
+    "job-state-running": "Выполняется"
   }
 }

+ 11 - 31
packages/admin-ui/src/lib/static/i18n-messages/sv.json

@@ -2,11 +2,10 @@
   "admin": {
     "create-new-administrator": "Lägg till ny administratör"
   },
-  "asset": {
+ "asset": {
     "add-asset": "Lägg till",
     "add-asset-with-count": "Lägg till {count, plural, =0 {fil} one {1 fil} other {{count} filer}}",
     "assets-selected-count": "{count} filer valda",
-    "change-asset": "Ändra fil",
     "dimensions": "Dimensioner",
     "focal-point": "Fokuspunkt",
     "notify-create-assets-success": "La till {count, plural, one {ny fil} other {{count} nya filer}}",
@@ -17,7 +16,6 @@
     "select-assets": "Välj filer",
     "set-as-featured-asset": "Ange som utvald fil",
     "set-focal-point": "Ange fokuspunkt",
-    "size": "Storlek",
     "source-file": "Källfil",
     "unset-focal-point": "Återställ",
     "update-focal-point": "Uppdatera fokuspunkt",
@@ -39,7 +37,7 @@
     "global-settings": "Globala inställningar",
     "job-queue": "Kö",
     "manage-variants": "Hantera varianter",
-    "modifying-order": "",
+    "modifying": "Modifierar",
     "orders": "Ordrar",
     "payment-methods": "Betalningsmetoder",
     "product-options": "Produktalternativ",
@@ -47,7 +45,6 @@
     "profile": "Profil",
     "promotions": "Kampanjer",
     "roles": "Roller",
-    "scheduled-tasks": "Schemalagda uppgifter",
     "seller-orders": "Säljarordrar",
     "sellers": "Säljare",
     "shipping-methods": "Fraktmetoder",
@@ -69,6 +66,7 @@
     "assets": "Filer",
     "assign-product-to-channel-success": "Lyckades tilldela {count, plural, one {1 produkt} other {{count} produkter}} till { channel }",
     "assign-products-to-channel": "Tilldela produkter till kanal",
+    "assign-to-channel": "Tilldela till kanal",
     "assign-to-named-channel": "Tilldela till { channelCode }",
     "assign-variant-to-channel-success": "Lyckades tilldela {count, plural, one {1 produktvariant} other {{count} produktvarianter}} till { channel }",
     "assign-variants-to-channel": "Tilldela produktvarianter till kanal",
@@ -93,7 +91,6 @@
     "confirm-deletion-of-unused-variants-body": "Följande produktvarianter har blivit överflödiga på grund av tillägg av nya alternativ. De kommer att raderas vid skapandet av nya produktvarianter.",
     "confirm-deletion-of-unused-variants-title": "Radera överflödiga produktvarianter?",
     "create-draft-order": "Lägg till utkast till order",
-    "create-facet-value": "",
     "create-new-collection": "Lägg till ny samling",
     "create-new-facet": "Lägg till ny etikett",
     "create-new-product": "Lägg till ny produkt",
@@ -113,6 +110,7 @@
     "facet-values": "Etikettvärden",
     "facets": "Etiketter",
     "filter-by-name": "Filtrera efter namn",
+    "filter-by-sku": "",
     "filter-inheritance": "Filterarv",
     "filters": "Filter",
     "inherit-filters-from-parent": "Ärva filter från förälder",
@@ -240,14 +238,12 @@
     "delete": "Radera",
     "description": "Beskrivning",
     "details": "Detaljer",
-    "disable": "Inaktivera",
     "disabled": "Inaktiverad",
     "discard-changes": "Släng ändringar",
     "duplicate": "Duplicera",
     "edit": "Redigera",
     "edit-field": "Redigera fält",
     "edit-note": "Redigera anteckning",
-    "enable": "Aktivera",
     "enabled": "Aktiverad",
     "end-date": "Slutdatum",
     "expand-entries": "Expandera poster",
@@ -279,7 +275,7 @@
     "name": "Namn",
     "no-alerts": "Inga aviseringar",
     "no-bulk-actions-available": "Inga massåtgärder tillgängliga",
-    "no-channel-selected": "Ingen kanal vald",
+    "no-channel-selected": "",
     "no-results": "Inga resultat",
     "not-applicable": "Ej tillämpligt",
     "not-set": "Ej inställt",
@@ -480,7 +476,6 @@
     "year": "år"
   },
   "editor": {
-    "height": "Höjd",
     "image-alt": "Beskrivning (alt-text)",
     "image-src": "Källa",
     "image-title": "Titel",
@@ -489,12 +484,12 @@
     "link-target": "Länkmål",
     "link-title": "Länktitel",
     "remove-link": "Ta bort länk",
-    "set-link": "Ange länk",
-    "width": "Bredd"
+    "set-link": "Ange länk"
   },
   "error": {
     "403-forbidden": "Du har för närvarande inte behörighet att komma åt \"{ path }\". Antingen saknar du behörighet eller så har din session gått ut.",
     "could-not-connect-to-server": "Kunde inte ansluta till Vendure-servern på { url }",
+    "facet-value-form-values-do-not-match": "",
     "health-check-failed": "Systemets hälsokontroll misslyckades",
     "no-default-shipping-zone-set": "Den här kanalen har ingen förvald leveransadress. Detta kan orsaka fel vid beräkning av fraktkostnader för ordrar.",
     "no-default-tax-zone-set": "Den här kanalen har ingen standard-momszon, vilket kommer att orsaka fel vid beräkning av priser. Var god lägg till eller välj en zon."
@@ -535,7 +530,6 @@
     "promotions": "Kampanjer",
     "roles": "Roller",
     "sales": "Försäljning",
-    "scheduled-tasks": "Schemalagda uppgifter",
     "sellers": "Säljare",
     "settings": "Inställningar",
     "shipping-methods": "Fraktmetoder",
@@ -556,7 +550,6 @@
     "added-items": "Tillagda artiklar",
     "amount": "Belopp",
     "arrange-additional-payment": "Arrangera ytterligare betalning",
-    "assign-order-to-another-customer": "Tilldela order till en annan kund",
     "billing-address": "Faktureringsadress",
     "cancel": "Avbryt",
     "cancel-entire-order": "Avbryt hela ordern",
@@ -569,7 +562,6 @@
     "cancel-selected-items": "Avbryt markerade artiklar",
     "cancel-specified-items": "Avbryt angivna artiklar",
     "cancellation-reason": "Avbokningsorsak",
-    "cancelled-order-items-success": "",
     "cancelled-order-success": "Ordern har avbokats",
     "complete-draft-order": "Slutför utkast",
     "confirm-modifications": "Bekräfta ändringar",
@@ -591,7 +583,6 @@
     "fulfillment-method": "Metod",
     "history-coupon-code-applied": "Rabattkod använd",
     "history-coupon-code-removed": "Rabattkod borttagen",
-    "history-customer-updated": "",
     "history-fulfillment-created": "Order godkänd",
     "history-fulfillment-delivered": "Order levererad",
     "history-fulfillment-shipped": "Leverans skickad",
@@ -620,12 +611,10 @@
     "modification-summary": "Sammanfattning av ändringar",
     "modification-updating-billing-address": "Uppdaterar faktureringsadress",
     "modification-updating-shipping-address": "Uppdaterar leveransadress",
-    "modified-items": "Ändrade objekt",
+    "modifications": "",
     "modify-order": "Ändra order",
     "modify-order-price-difference": "Prisskillnad",
     "net-price": "Nettopris",
-    "new-customer": "Ny kund",
-    "no-modifications-made": "Inga ändringar gjorda",
     "note": "Anteckning",
     "note-is-private": "Anteckning är privat",
     "note-only-visible-to-administrators": "Synlig endast för administratörer",
@@ -645,17 +634,17 @@
     "payment-metadata": "Betalningsmetadata",
     "payment-method": "Betalningsmetod",
     "payment-state": "Status",
+    "payment-to-refund": "",
     "payments": "Betalningar",
     "placed-at": "Lagd den",
     "preview-changes": "Förhandsgranska ändringar",
-    "previous-customer": "Tidigare kund",
     "product-name": "Produktnamn",
     "product-sku": "SKU",
     "promotions-applied": "Tillämpade kampanjer",
     "prorated-unit-price": "Andelat enhetspris",
     "quantity": "Kvantitet",
     "refund": "Återbetalning",
-    "refund-amount": "Återbetalningsbelopp",
+    "refund-adjustment": "",
     "refund-and-cancel-order": "Återbetalning & avbryt order",
     "refund-cancellation-reason": "Orsak till återbetalning/avbokning",
     "refund-cancellation-reason-required": "Orsak till återbetalning/avbokning krävs",
@@ -666,15 +655,12 @@
     "refund-reason-customer-request": "Kundförfrågan",
     "refund-reason-not-available": "Inte tillgänglig",
     "refund-shipping": "Återbetala frakt",
-    "refund-this-payment": "Återbetala denna betalning",
     "refund-total": "Total återbetalning",
     "refund-total-error": "Total återbetalning måste vara mellan {min} och {max}",
     "refund-total-warning": "Total återbetalning överstiger det valda betalningsbeloppet. Återstående återbetalningsbelopp kommer att återbetalas från andra betalningar.",
     "refund-with-amount": "Återbetala {belopp}",
-    "refundable-amount": "Återbetalningsbar belopp",
     "refunded-count": "{count} {count, plural, one {återbetalat objekt} other {återbetalade objekt}}",
     "removed-items": "Borttagna objekt",
-    "return-to-stock": "Återlämna till lager",
     "search-by-order-filters": "Sök efter namn / kod / transaktions-ID",
     "select-address": "Välj adress",
     "select-shipping-method": "Välj leveranssätt",
@@ -683,7 +669,6 @@
     "set-billing-address": "Ange faktureringsadress",
     "set-coupon-codes": "Ange kupongkoder",
     "set-customer-for-order": "Ange kund",
-    "set-customer-success": "Kunden har satts",
     "set-fulfillment-state": "Markera som {state}",
     "set-shipping-address": "Ange leveransadress",
     "set-shipping-method": "Ange leveranssätt",
@@ -817,11 +802,6 @@
     "job-state-completed": "Slutfört",
     "job-state-failed": "Misslyckat",
     "job-state-pending": "Väntande",
-    "job-state-running": "Pågående",
-    "last-executed-at": "Senast körd",
-    "last-result": "Senaste resultat",
-    "next-execution-at": "Nästa körning",
-    "schedule": "Schema",
-    "task-id": "Jobb-ID"
+    "job-state-running": "Pågående"
   }
 }

+ 813 - 826
packages/admin-ui/src/lib/static/i18n-messages/tr.json

@@ -1,827 +1,814 @@
 {
-  "admin": {
-    "create-new-administrator": "Yeni yönetici oluştur"
-  },
-  "asset": {
-    "add-asset": "Dosya ekle",
-    "add-asset-with-count": "{count, plural, =0 {dosya} one {bir dosya} other {{count} dosya}} ekle",
-    "assets-selected-count": "{ count } kaynak seçildi",
-    "change-asset": "Dosyayı değiştir",
-    "dimensions": "Boyutlar",
-    "focal-point": "Odak noktası",
-    "notify-create-assets-success": "{count, plural, one {yeni bir dosya} other {{count} yeni dosya}} oluşturuldu",
-    "original-asset-size": "Orijinal boyut",
-    "preview": "Önizleme",
-    "remove-asset": "Dosyayı kaldır",
-    "select-asset": "Bir dosya seç",
-    "select-assets": "Dosyaları seç",
-    "set-as-featured-asset": "Öne çıkan dosya olarak ayarla",
-    "set-focal-point": "Odak noktasını ayarla",
-    "size": "Boyut",
-    "source-file": "Kaynak dosya",
-    "unset-focal-point": "Kaldır",
-    "update-focal-point": "Noktayı güncelle",
-    "update-focal-point-error": "Nokta güncellenemedi",
-    "update-focal-point-success": "Odak noktası güncellendi",
-    "upload-assets": "Kaynakları yükle",
-    "uploading": "Yükleniyor..."
-  },
-  "breadcrumb": {
-    "administrators": "Yöneticiler",
-    "assets": "Dosyalar",
-    "channels": "Kanallar",
-    "collections": "Koleksiyonlar",
-    "countries": "Ülkeler",
-    "customer-groups": "Müşteri Grupları",
-    "customers": "Müşteriler",
-    "dashboard": "Gösterge Paneli",
-    "facets": "Bileşenler",
-    "global-settings": "Genel Ayarlar",
-    "job-queue": "İş Kuyruğu",
-    "manage-variants": "Varyantları Yönet",
-    "modifying-order": "Siparişi Düzenleme",
-    "orders": "Siparişler",
-    "payment-methods": "Ödeme Yöntemleri",
-    "product-options": "Ürün Seçenekleri",
-    "products": "Ürünler",
-    "profile": "Profil",
-    "promotions": "Promosyonlar",
-    "roles": "Roller",
-    "scheduled-tasks": "Planlanmış Görevler",
-    "seller-orders": "Satıcı Siparişleri",
-    "sellers": "Satıcılar",
-    "shipping-methods": "Nakliye Yöntemleri",
-    "stock-locations": "Stok Konumları",
-    "system-status": "Sistem Durumu",
-    "tax-categories": "Vergi Kategorileri",
-    "tax-rates": "Vergi Oranları",
-    "zones": "Bölgeler"
-  },
-  "catalog": {
-    "add-facet-value": "Faset değeri ekle",
-    "add-facets": "Faset ekle",
-    "add-option": "Seçenek ekle",
-    "add-price-in-another-currency": "Başka bir para biriminde fiyat ekle",
-    "add-stock-location": "Stok konumu ekle",
-    "add-stock-to-location": "Konuma stok ekle",
-    "asset": "Varlık",
-    "asset-preview-links": "Varlık önizleme bağlantıları",
-    "assets": "Varlıklar",
-    "assign-product-to-channel-success": "Ürün \"{ channel }\" kanalına atandı",
-    "assign-products-to-channel": "Ürünleri kanala ata",
-    "assign-to-named-channel": "{ channelCode } kanalına ata",
-    "assign-variant-to-channel-success": "Ürün varyantı \"{ channel }\" kanalına atandı",
-    "assign-variants-to-channel": "Ürün varyantını kanala ata",
-    "auto-update-option-variant-name": "Bu seçeneği kullanarak ürün varyant adlarını otomatik güncelle",
-    "auto-update-product-variant-name": "Ürün varyant adlarını otomatik güncelle",
-    "calculated-price": "Hesaplanan fiyat",
-    "calculated-price-tooltip": "Yukarıda belirtilen fiyatı değiştiren özel bir fiyat hesaplaması yapılandırıldı:",
-    "cannot-create-variants-without-options": "Seçenekler olmadan varyant oluşturulamaz",
-    "channel-price-preview": "Kanal fiyatı önizlemesi",
-    "collection": "Koleksiyon",
-    "collection-contents": "Koleksiyon İçeriği",
-    "collections": "Koleksiyonlar",
-    "confirm-bulk-delete-products": "Toplu ürün silme işlemini onayla?",
-    "confirm-cancel": "İptali onayla?",
-    "confirm-delete-assets": "{count} {count, plural, one {dosya} other {dosya}} silinsin mi?",
-    "confirm-delete-facet-value": "Faset değeri silinsin mi?",
-    "confirm-delete-product": "Ürün silinsin mi?",
-    "confirm-delete-product-option": "\"{name}\" seçeneği silinsin mi?",
-    "confirm-delete-product-option-group": "\"{name}\" seçenek grubu silinsin mi?",
-    "confirm-delete-product-option-group-body": "Bu seçenek grubu {count} {count, plural, one {varyant} other {varyant}} tarafından kullanılıyor. Silmek istediğinize emin misiniz?",
-    "confirm-delete-product-variant": "\"{name}\" ürün varyantı silinsin mi?",
-    "confirm-deletion-of-unused-variants-body": "Yeni seçeneklerin eklenmesi nedeniyle aşağıdaki ürün varyantları kullanılmaz hale geldi. Yeni ürün varyantları oluşturulurken silinecekler.",
-    "confirm-deletion-of-unused-variants-title": "Kullanılmayan ürün varyantları silinsin mi?",
-    "create-draft-order": "Taslak sipariş oluştur",
-    "create-facet-value": "Yeni faset değeri oluştur",
-    "create-new-collection": "Yeni koleksiyon oluştur",
-    "create-new-facet": "Yeni faset oluştur",
-    "create-new-product": "Yeni ürün oluştur",
-    "create-new-stock-location": "Yeni stok konumu oluştur",
-    "create-product-option-group": "Ürün seçenek grubu oluştur",
-    "create-product-variant": "Ürün varyantı oluştur",
-    "default-currency": "Varsayılan para birimi",
-    "do-not-inherit-filters": "Filtreleri miras alma",
-    "drop-files-to-upload": "Yüklemek için dosyaları sürükle",
-    "duplicate-collections": "Koleksiyonları çoğalt",
-    "duplicate-facets": "Fasetleri çoğalt",
-    "duplicate-products": "Ürünleri çoğalt",
-    "edit-facet-values": "Faset değerlerini düzenle",
-    "edit-options": "Seçenekleri düzenle",
-    "facet": "Faset değeri",
-    "facet-value-not-available": "\"{ id }\" faset değeri mevcut değil",
-    "facet-values": "Faset değerleri",
-    "facets": "Fasetler",
-    "filter-by-name": "İsme göre filtrele",
-    "filter-inheritance": "Filtre mirası",
-    "filters": "Filtreler",
-    "inherit-filters-from-parent": "Filtreleri üst öğeden miras al",
-    "live-preview-contents": "Canlı içerik önizlemesi",
-    "manage-variants": "Varyantları yönet",
-    "move-collection-to": "{ name } koleksiyonuna taşı",
-    "move-collections": "Koleksiyonları taşı",
-    "move-collections-success": "{count, plural, one {1 koleksiyon} other {{count} koleksiyon}} taşındı",
-    "move-down": "Aşağı taşı",
-    "move-to": "Taşı",
-    "move-up": "Yukarı taşı",
-    "name": "İsim",
-    "no-channel-selected": "Kanal seçilmedi",
-    "no-featured-asset": "Öne çıkan varlık yok",
-    "no-selection": "Seçim yok",
-    "no-stock-locations-available-on-current-channel": "Mevcut kanalda stok konumu bulunmamaktadır. Ürün eklemeden önce en az bir stok konumu yapılandırın.",
-    "notify-bulk-delete-products-success": "{count, plural, one {1 ürün} other {{count} ürün}} başarıyla silindi",
-    "notify-remove-facets-from-channel-success": "{count, plural, one {1 faset} other {{count} faset}} { channelCode } kanalından başarıyla kaldırıldı",
-    "notify-remove-product-from-channel-error": "Ürün kanaldan kaldırılırken hata oluştu",
-    "notify-remove-product-from-channel-success": "Ürün kanaldan başarıyla kaldırıldı",
-    "notify-remove-variant-from-channel-error": "Ürün varyantı kanaldan kaldırılırken hata oluştu",
-    "notify-remove-variant-from-channel-success": "Ürün varyantı kanaldan başarıyla kaldırıldı",
-    "number-of-variants": "Varyant sayısı",
-    "option": "Seçenek",
-    "option-name": "Seçenek adı",
-    "option-values": "Seçenek değerleri",
-    "out-of-stock-threshold": "Stok tükenme eşiği",
-    "out-of-stock-threshold-tooltip": "Varyantın stokta tükendiği kabul edilecek stok seviyesini ayarlayın. Negatif bir değer, bekleyen siparişleri kabul etmenizi sağlar.",
-    "page-description-options-editor": "Bu ürün için seçenek adlarını ve kodlarını düzenleyin. Seçenek eklemek veya kaldırmak için, ürün varyantları listesinin altındaki \"varyantları yönet\" düğmesini kullanın.",
-    "price": "Fiyat",
-    "price-and-tax": "Fiyat ve vergi",
-    "price-conversion-factor": "Fiyat dönüşüm faktörü",
-    "price-in-channel": "{ channel } kanalındaki fiyat",
-    "price-includes-tax-at": "{ rate }% vergi dahil",
-    "price-with-tax-in-default-zone": "{ rate }% vergi dahil: { price }",
-    "private": "Özel",
-    "product": "Ürün",
-    "product-name": "Ürün adı",
-    "product-options": "Ürün seçenekleri",
-    "product-variant-exists": "Bu seçeneklere sahip bir ürün varyantı zaten var",
-    "product-variants": "Ürün varyantları",
-    "products": "Ürünler",
-    "public": "Herkese açık",
-    "quick-jump-placeholder": "Varyanta git",
-    "rebuild-search-index": "Arama indeksini yeniden oluştur",
-    "reindex-error": "Arama indeksi yeniden oluşturulurken bir hata oluştu",
-    "reindex-successful": "{count, plural, one {1 ürün varyantı} other {{count} ürün varyantı}} {time} ms içinde indekslendi",
-    "reindexing": "Arama indeksi yeniden oluşturuluyor",
-    "remove-from-channel": "Kanaldan kaldır",
-    "remove-option": "Seçeneği kaldır",
-    "remove-product-from-channel": "Ürünü kanaldan kaldır",
-    "remove-product-variant-from-channel": "Ürün varyantını kanaldan kaldır",
-    "reorder-collection": "Koleksiyonu yeniden sırala",
-    "root-collection": "Kök koleksiyon",
-    "run-pending-search-index-updates": "Arama indeksi: {count, plural, one {1 bekleyen güncelleme} other {{count} bekleyen güncelleme}} çalıştır",
-    "running-search-index-updates": "{count, plural, one {1 güncelleme} other {{count} güncelleme}} çalıştırılıyor",
-    "search-asset-name-or-tag": "Varlık adı veya etikete göre ara",
-    "search-for-term": "Terim ara",
-    "search-product-name-or-code": "Ürün adı veya koda göre ara",
-    "select-product": "Ürün seç",
-    "select-product-variant": "Ürün varyantı seç",
-    "sku": "SKU",
-    "slug": "Slug",
-    "slug-pattern-error": "Geçersiz slug",
-    "stock-allocated": "Ayrılmış",
-    "stock-levels": "Stok seviyeleri",
-    "stock-location": "Stok konumu",
-    "stock-locations": "Stok konumları",
-    "stock-on-hand": "Stokta mevcut",
-    "tax-category": "Vergi kategorisi",
-    "taxes": "Vergiler",
-    "track-inventory": "Stok takibi",
-    "track-inventory-false": "Takip etme",
-    "track-inventory-inherit": "Genel ayarlardan miras al",
-    "track-inventory-tooltip": "Etkinleştirildiğinde, ürün varyantlarının stok seviyeleri satış sonrası otomatik olarak güncellenir.",
-    "track-inventory-true": "Takip et",
-    "update-product-option": "Ürün seçeneğini güncelle",
-    "use-global-value": "Genel değeri kullan",
-    "values": "Değerler",
-    "variant": "Varyant",
-    "variant-count": "{count, plural, one {1 varyant} other {{count} varyant}}",
-    "view-contents": "İçeriği görüntüle",
-    "visibility": "Görünürlük"
-  },
-  "common": {
-    "ID": "Kimlik",
-    "add-filter": "Filtre ekle",
-    "add-item-to-list": "Listeye öğe ekle",
-    "add-note": "Not ekle",
-    "apply": "Uygula",
-    "assign-to-channel": "Kanala ata",
-    "assign-to-channels": "{count, plural, one {kanal} other {kanallar}} ata",
-    "available-currencies": "Mevcut para birimleri",
-    "available-languages": "Mevcut diller",
-    "boolean-and": "ve",
-    "boolean-false": "yanlış",
-    "boolean-or": "veya",
-    "boolean-true": "doğru",
-    "breadcrumb": "Gezinti yolu",
-    "browser-default": "Tarayıcı varsayılanı",
-    "cancel": "İptal",
-    "cancel-navigation": "Gezintiyi iptal et",
-    "change-selection": "Seçimi değiştir",
-    "channel": "Kanal",
-    "channels": "Kanallar",
-    "clear-selection": "Seçimi temizle",
-    "code": "Kod",
-    "collapse-entries": "Girdileri daralt",
-    "confirm": "Onayla",
-    "confirm-bulk-assign-to-channel": "Öğeleri kanala atamak istiyor musunuz?",
-    "confirm-bulk-delete": "Seçili öğeleri silmek istiyor musunuz?",
-    "confirm-bulk-remove-from-channel": "Öğeleri mevcut kanaldan kaldırmak istiyor musunuz?",
-    "confirm-delete-note": "Notu silmek istiyor musunuz?",
-    "confirm-navigation": "Gezintiyi onayla",
-    "contents": "İçerik",
-    "create": "Oluştur",
-    "created-at": "Oluşturulma zamanı",
-    "custom-fields": "Özel alanlar",
-    "data-table-filter-date-mode": "Tarih modu",
-    "data-table-filter-date-range": "Tarih aralığı",
-    "data-table-filter-date-relative": "Göreceli tarih",
-    "default-channel": "Varsayılan kanal",
-    "default-language": "Varsayılan dil",
-    "default-tax-category": "Varsayılan vergi kategorisi",
-    "delete": "Sil",
-    "description": "Açıklama",
-    "details": "Detaylar",
-    "disable": "Devre dışı",
-    "disabled": "Devre dışı",
-    "discard-changes": "Değişiklikleri iptal et",
-    "duplicate": "Çoğalt",
-    "edit": "Düzenle",
-    "edit-field": "Alanı düzenle",
-    "edit-note": "Notu düzenle",
-    "enable": "Etkinleştir",
-    "enabled": "Etkin",
-    "end-date": "Bitiş tarihi",
-    "expand-entries": "Girdileri genişlet",
-    "extension-running-in-separate-window": "Eklenti ayrı bir pencerede çalışıyor",
-    "filter": "Filtre",
-    "filter-preset-name": "Filtre ön ayar adı",
-    "force-delete": "Zorla sil",
-    "force-remove": "Zorla kaldır",
-    "general": "Genel",
-    "guest": "Misafir",
-    "id": "Kimlik",
-    "image": "Görüntü",
-    "items-per-page-option": "Sayfa başına { count }",
-    "items-selected-count": "{ count } {count, plural, one {öğe} other {öğeler}} seçildi",
-    "keep-editing": "Düzenlemeye devam et",
-    "language": "Dil",
-    "launch-extension": "Eklentiyi başlat",
-    "list-items-and-n-more": "{ articles } ve {nMore} daha",
-    "live-update": "Canlı güncelleme",
-    "locale": "Yerel ayar",
-    "log-out": "Çıkış yap",
-    "login": "Giriş yap",
-    "login-image-title": "Merhaba! Tekrar hoş geldiniz.",
-    "login-title": "{brand} ile giriş yapın",
-    "manage-tags": "Etiketleri yönet",
-    "manage-tags-description": "Etiketleri toplu olarak güncelle veya sil",
-    "medium-date": "Orta tarih",
-    "more": "Daha fazla...",
-    "name": "Ad",
-    "no-alerts": "Uyarı yok",
-    "no-bulk-actions-available": "Toplu işlem yok",
-    "no-channel-selected": "Kanal seçilmedi",
-    "no-results": "Sonuç yok",
-    "not-applicable": "Uygulanamaz",
-    "not-set": "Ayarlanmadı",
-    "notify-assign-to-channel-success-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} başarıyla { channelCode } kanalına atandı",
-    "notify-bulk-update-success": "{ count } { entity } güncellendi",
-    "notify-create-error": "{ entity } oluşturulurken bir hata oluştu",
-    "notify-create-success": "Yeni { entity } oluşturuldu",
-    "notify-delete-error": "{ entity } silinirken bir hata oluştu",
-    "notify-delete-error-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} silinemedi",
-    "notify-delete-success": "{ entity } silindi",
-    "notify-delete-success-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} başarıyla silindi",
-    "notify-duplicate-error": "{ name } çoğaltılamadı: { error }",
-    "notify-duplicate-error-excess": "{ count } {count, plural, one {öğe} other {öğeler}} çoğaltılamadı: { error }",
-    "notify-duplicate-success": "{count, plural, one {1 öğe} other {{count} öğe}} başarıyla çoğaltıldı: { names }",
-    "notify-remove-from-channel-success-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} kanaldan başarıyla kaldırıldı",
-    "notify-save-changes-error": "Değişiklikler kaydedilemedi",
-    "notify-saved-changes": "Değişiklikler kaydedildi",
-    "notify-update-error": "{ entity } güncellenirken bir hata oluştu",
-    "notify-update-success": "{ entity } güncellendi",
-    "notify-updated-tags-success": "Etiketler başarıyla güncellendi",
-    "okay": "Tamam",
-    "operator-contains": "içerir",
-    "operator-eq": "eşittir",
-    "operator-gt": "büyüktür",
-    "operator-lt": "küçüktür",
-    "operator-not-contains": "içermez",
-    "operator-not-eq": "eşit değildir",
-    "operator-notContains": "içermez",
-    "operator-regex": "düzenli ifadeye uyar",
-    "password": "Şifre",
-    "position": "Pozisyon",
-    "price": "Fiyat",
-    "price-with-tax": "Vergi dahil fiyat",
-    "private": "Özel",
-    "public": "Genel",
-    "remember-me": "Beni hatırla",
-    "remove": "Kaldır",
-    "remove-from-channel": "Kanaldan kaldır",
-    "remove-item-from-list": "Liste öğesini kaldır",
-    "rename-filter-preset": "Filtre ön ayarını yeniden adlandır",
-    "reset-columns": "Sütunları sıfırla",
-    "results-count": "{ count } {count, plural, one {sonuç} other {sonuçlar}}",
-    "sample-formatting": "Örnek biçimlendirme",
-    "save-filter-preset": "Ön ayar olarak kaydet",
-    "search-and-filter-list": "Listeyi ara ve filtrele",
-    "search-by-name": "İsme göre ara",
-    "select": "Seç...",
-    "select-display-language": "Görüntüleme dilini seç",
-    "select-items-with-count": "{ count } {count, plural, one {öğe} other {öğeler}} seç",
-    "select-products": "Ürünleri seç",
-    "select-relation-id": "İlişki kimliğini seç",
-    "select-table-columns": "Tablo sütunlarını seç",
-    "select-today": "Bugünü seç",
-    "select-variants": "Varyantları seç",
-    "seller": "Satıcı",
-    "set-language": "Dili ayarla",
-    "short-date": "Kısa tarih",
-    "slug": "Kısa ad",
-    "start-date": "Başlangıç tarihi",
-    "status": "Durum",
-    "tags": "Etiketler",
-    "theme": "Tema",
-    "there-are-unsaved-changes": "Kaydedilmemiş değişiklikler var. Başka bir yere gitmek bu değişiklikleri kaybettirir.",
-    "toggle-all": "Tümünü seç/deselect",
-    "total-items": "{currentStart} - {currentEnd} / {totalItems}",
-    "update": "Güncelle",
-    "updated-at": "Güncellenme zamanı",
-    "username": "Kullanıcı adı",
-    "value": "Değer",
-    "view-contents": "İçeriği görüntüle",
-    "view-next-month": "Sonraki ayı görüntüle",
-    "view-previous-month": "Önceki ayı görüntüle",
-    "visibility": "Görünürlük",
-    "with-selected": "Seçilenlerle..."
-  },
-  "customer": {
-    "add-customer-to-group": "Müşteriyi gruba ekle",
-    "add-customer-to-groups-with-count": "Müşteriyi {count, plural, one {bir gruba} other {{count} gruba}} ekle",
-    "add-customers-to-group": "Müşterileri gruba ekle",
-    "add-customers-to-group-success": "{customerCount, plural, one {Bir müşteri} other {{customerCount} müşteri}} \"{ groupName }\" grubuna eklendi",
-    "add-customers-to-group-with-count": "{count, plural, one {Bir müşteri} other {{count} müşteri}} eklendi",
-    "add-customers-to-group-with-name": "Müşterileri \"{ groupName }\" grubuna ekle",
-    "addresses": "Adresler",
-    "city": "Şehir",
-    "company": "Şirket",
-    "confirm-remove-customer-from-group": "Müşteriyi gruptan kaldırmak istiyor musunuz?",
-    "country": "Ülke",
-    "create-customer-group": "Müşteri grubu oluştur",
-    "create-new-address": "Yeni adres oluştur",
-    "create-new-customer": "Yeni müşteri oluştur",
-    "create-new-customer-group": "Yeni müşteri grubu oluştur",
-    "customer": "Müşteri",
-    "customer-group": "Müşteri grubu",
-    "customer-groups": "Müşteri grupları",
-    "customer-history": "Müşteri geçmişi",
-    "customers": "Müşteriler",
-    "default-billing-address": "Varsayılan fatura adresi",
-    "default-shipping-address": "Varsayılan teslimat adresi",
-    "email-address": "E-posta adresi",
-    "email-verification-sent": "{ emailAddress } adresine doğrulama e-postası gönderildi",
-    "first-name": "Ad",
-    "full-name": "Tam ad",
-    "guest": "Misafir",
-    "history-customer-added-to-group": "Müşteri \"{ groupName }\" grubuna eklendi",
-    "history-customer-address-created": "Adres oluşturuldu",
-    "history-customer-address-deleted": "Adres silindi",
-    "history-customer-address-updated": "Adres güncellendi",
-    "history-customer-detail-updated": "Detaylar güncellendi",
-    "history-customer-email-update-requested": "E-posta güncelleme talep edildi",
-    "history-customer-email-update-verified": "E-posta güncellemesi doğrulandı",
-    "history-customer-password-reset-requested": "Şifre sıfırlama talep edildi",
-    "history-customer-password-reset-verified": "Şifre sıfırlama doğrulandı",
-    "history-customer-password-updated": "Şifre güncellendi",
-    "history-customer-registered": "Müşteri kaydedildi",
-    "history-customer-removed-from-group": "Müşteri \"{ groupName }\" grubundan kaldırıldı",
-    "history-customer-verified": "Müşteri doğrulandı",
-    "history-using-external-auth-strategy": "{ strategy } kullanıldı",
-    "history-using-native-auth-strategy": "E-posta adresi kullanıldı",
-    "last-login": "Son giriş",
-    "last-name": "Soyad",
-    "name": "Ad",
-    "new-email-address": "Yeni e-posta adresi",
-    "no-orders-placed": "Hiç sipariş verilmedi",
-    "not-a-member-of-any-groups": "Bu müşteri hiçbir grubun üyesi değil",
-    "old-email-address": "Eski e-posta adresi",
-    "orders": "Siparişler",
-    "password": "Şifre",
-    "phone-number": "Telefon numarası",
-    "postal-code": "Posta kodu",
-    "province": "İl",
-    "registered": "Kayıtlı",
-    "remove-customers-from-group-success": "{customerCount, plural, one {Bir müşteri} other {{customerCount} müşteri}} \"{ groupName }\" grubundan kaldırıldı",
-    "remove-from-group": "Bu gruptan kaldır",
-    "search-customers-by-email": "E-posta adresine göre ara",
-    "search-customers-by-email-last-name-postal-code": "Ad / E-posta adresi / Posta koduna göre ara",
-    "select-customer": "Müşteri seç",
-    "set-as-default-billing-address": "Varsayılan fatura adresi olarak ayarla",
-    "set-as-default-shipping-address": "Varsayılan teslimat adresi olarak ayarla",
-    "street-line-1": "Sokak satırı 1",
-    "street-line-2": "Sokak satırı 2",
-    "title": "Başlık",
-    "update-customer-group": "Müşteri grubunu güncelle",
-    "verified": "Doğrulandı",
-    "view-group-members": "Grup üyelerini görüntüle"
-  },
-  "dashboard": {
-    "add-widget": "Widget ekle",
-    "latest-orders": "Son siparişler",
-    "metric-average-order-value": "Ortalama sipariş değeri",
-    "metric-number-of-orders": "Sipariş sayısı",
-    "metric-order-total-value": "Toplam sipariş değeri",
-    "metrics": "İstatistikler",
-    "orders-summary": "Sipariş özeti",
-    "remove-widget": "Widget'ı kaldır",
-    "thisMonth": "Bu ay",
-    "thisWeek": "Bu hafta",
-    "today": "Bugün",
-    "total-order-value": "Toplam değer",
-    "total-orders": "Toplam siparişler",
-    "widget-resize": "Yeniden boyutlandır",
-    "widget-width": "Genişlik: {width}",
-    "yesterday": "Dün"
-  },
-  "datetime": {
-    "ago-days": "{count, plural, one {1 gün} other {{count} gün}} önce",
-    "ago-hours": "{count, plural, one {1 saat} other {{count} saat}} önce",
-    "ago-minutes": "{count, plural, one {1 dakika} other {{count} dakika}} önce",
-    "ago-seconds": "{count, plural, =0 {az önce} one {1 saniye} other {{count} saniye}} önce",
-    "ago-years": "{count, plural, one {1 yıl} other {{count} yıl}} önce",
-    "day": "gün",
-    "duration-milliseconds": "{ms}ms",
-    "duration-minutes:seconds": "{m}:{s}dk",
-    "duration-seconds": "{s}sn",
-    "month": "ay",
-    "month-apr": "Nisan",
-    "month-aug": "Ağustos",
-    "month-dec": "Aralık",
-    "month-feb": "Şubat",
-    "month-jan": "Ocak",
-    "month-jul": "Temmuz",
-    "month-jun": "Haziran",
-    "month-mar": "Mart",
-    "month-may": "Mayıs",
-    "month-nov": "Kasım",
-    "month-oct": "Ekim",
-    "month-sep": "Eylül",
-    "relative-past-days": "{count} {count, plural, one {gün} other {gün}} önce",
-    "relative-past-months": "{count} {count, plural, one {ay} other {ay}} önce",
-    "relative-past-years": "{count} {count, plural, one {yıl} other {yıl}} önce",
-    "time": "Zaman",
-    "weekday-fr": "Cuma",
-    "weekday-mo": "Pazartesi",
-    "weekday-sa": "Cumartesi",
-    "weekday-su": "Pazar",
-    "weekday-th": "Perşembe",
-    "weekday-tu": "Salı",
-    "weekday-we": "Çarşamba",
-    "year": "yıl"
-  },
-  "editor": {
-    "height": "Yükseklik",
-    "image-alt": "Açıklama (alt)",
-    "image-src": "Kaynak",
-    "image-title": "Başlık",
-    "insert-image": "Resim ekle",
-    "link-href": "Bağlantı adresi",
-    "link-target": "Bağlantı hedefi",
-    "link-title": "Bağlantı başlığı",
-    "remove-link": "Bağlantıyı kaldır",
-    "set-link": "Bağlantıyı ayarla",
-    "width": "Genişlik"
-  },
-  "error": {
-    "403-forbidden": "\"{ path }\" yoluna erişim izniniz yok. İzniniz yok veya oturumunuz sona erdi.",
-    "could-not-connect-to-server": "{ url } adresindeki Vendure sunucusuna bağlanılamadı",
-    "health-check-failed": "Sistem sağlık kontrolü başarısız oldu",
-    "no-default-shipping-zone-set": "Bu kanalın varsayılan bir teslimat bölgesi yok. Bu, nakliye maliyeti hesaplamasında hatalara neden olabilir.",
-    "no-default-tax-zone-set": "Bu kanalın varsayılan bir vergi bölgesi yok, bu da fiyat hesaplamasında hatalara neden olabilir. Bir bölge oluşturun veya seçin."
-  },
-  "marketing": {
-    "actions": "Eylemler",
-    "add-action": "Eylem ekle",
-    "add-condition": "Koşul ekle",
-    "conditions": "Koşullar",
-    "coupon-code": "Kupon kodu",
-    "create-new-promotion": "Yeni promosyon oluştur",
-    "duplicate-promotions": "Promosyonları çoğalt",
-    "ends-at": "Bitiş tarihi",
-    "per-customer-limit": "Müşteri başına limit",
-    "per-customer-limit-tooltip": "Bu promosyonun bir müşteri tarafından kullanılabileceği maksimum sayı",
-    "promotion": "Promosyon",
-    "search-by-name-or-coupon-code": "İsme veya kupon koduna göre ara",
-    "starts-at": "Başlangıç tarihi",
-    "usage-limit": "Toplam kullanım limiti",
-    "usage-limit-tooltip": "Bu promosyonun toplamda kullanılabileceği maksimum sayı"
-  },
-  "nav": {
-    "administrators": "Yöneticiler",
-    "assets": "Dosyalar",
-    "catalog": "Katalog",
-    "channels": "Kanallar",
-    "collections": "Koleksiyonlar",
-    "countries": "Ülkeler",
-    "customer-groups": "Müşteri grupları",
-    "customers": "Müşteriler",
-    "facets": "Bileşenler",
-    "global-settings": "Genel ayarlar",
-    "job-queue": "Görev kuyruğu",
-    "marketing": "Pazarlama",
-    "orders": "Siparişler",
-    "payment-methods": "Ödeme yöntemleri",
-    "products": "Ürünler",
-    "promotions": "Promosyonlar",
-    "roles": "Roller",
-    "sales": "Satışlar",
-    "scheduled-tasks": "Planlanmış Görevler",
-    "sellers": "Satıcılar",
-    "settings": "Ayarlar",
-    "shipping-methods": "Nakliye yöntemleri",
-    "stock-locations": "Stok konumları",
-    "system": "Sistem",
-    "system-status": "Sistem durumu",
-    "tax-categories": "Vergi kategorileri",
-    "tax-rates": "Vergi oranları",
-    "zones": "Bölgeler"
-  },
-  "order": {
-    "add-item-to-order": "Siparişe öğe ekle",
-    "add-note": "Not ekle",
-    "add-payment": "Ödeme yöntemi ekle",
-    "add-payment-to-order": "Siparişe ödeme yöntemi ekle",
-    "add-payment-to-order-success": "Ödeme yöntemi başarıyla eklendi",
-    "add-surcharge": "Ek ücret ekle",
-    "added-items": "Öğeler eklendi",
-    "amount": "Miktar",
-    "arrange-additional-payment": "Ek ödeme düzenle",
-    "assign-order-to-another-customer": "Siparişi başka bir müşteriye ata",
-    "billing-address": "Fatura adresi",
-    "cancel": "İptal",
-    "cancel-entire-order": "Tüm siparişi iptal et",
-    "cancel-fulfillment": "Hazırlığı iptal et",
-    "cancel-modification": "Değişikliği iptal et",
-    "cancel-order": "Siparişi iptal et",
-    "cancel-payment": "Ödemeyi iptal et",
-    "cancel-reason-customer-request": "Müşteri talebi",
-    "cancel-reason-not-available": "Mevcut değil",
-    "cancel-selected-items": "Seçili öğeleri iptal et",
-    "cancel-specified-items": "Belirtilen öğeleri iptal et",
-    "cancellation-reason": "İptal nedeni",
-    "cancelled-order-items-success": "{ count } { count, plural, one {öğe} other {öğeler} } iptal edildi",
-    "cancelled-order-success": "Sipariş iptal edildi",
-    "complete-draft-order": "Taslağı tamamla",
-    "confirm-modifications": "Değişiklikleri onayla",
-    "contents": "İçerik",
-    "create-fulfillment": "Hazırlık oluştur",
-    "create-fulfillment-success": "Hazırlık başarıyla oluşturuldu",
-    "customer": "Müşteri",
-    "delete-draft-order": "Taslağı sil",
-    "draft-order": "Taslak sipariş",
-    "edit-billing-address": "Fatura adresini düzenle",
-    "edit-shipping-address": "Teslimat adresini düzenle",
-    "error-message": "Hata mesajı",
-    "existing-address": "Mevcut adres",
-    "existing-customer": "Mevcut müşteri",
-    "filter-is-active": "Filtre aktif",
-    "fulfill": "Hazırla",
-    "fulfill-order": "Siparişi hazırla",
-    "fulfillment": "Hazırlık",
-    "fulfillment-method": "Hazırlık yöntemi",
-    "history-coupon-code-applied": "Kupon kodu uygulandı",
-    "history-coupon-code-removed": "Kupon kodu kaldırıldı",
-    "history-customer-updated": "Müşteri güncellendi",
-    "history-fulfillment-created": "Hazırlık oluşturuldu",
-    "history-fulfillment-delivered": "Hazırlık teslim edildi",
-    "history-fulfillment-shipped": "Hazırlık gönderildi",
-    "history-fulfillment-transition": "Hazırlık {from} durumundan {to} durumuna geçirildi",
-    "history-items-cancelled": "{count} {count, plural, one {öğe iptal edildi} other {öğeler iptal edildi}}",
-    "history-order-cancelled": "Sipariş iptal edildi",
-    "history-order-created": "Sipariş oluşturuldu",
-    "history-order-fulfilled": "Sipariş hazırlandı",
-    "history-order-modified": "Sipariş değiştirildi",
-    "history-order-transition": "Sipariş {from} durumundan {to} durumuna geçirildi",
-    "history-payment-settled": "Ödeme tamamlandı",
-    "history-payment-transition": "Ödeme #{id} {from} durumundan {to} durumuna geçirildi",
-    "history-refund-transition": "İade #{id} {from} durumundan {to} durumuna geçirildi",
-    "item-count": "{count} {count, plural, one {öğe} other {öğeler}}",
-    "line-fulfillment-all": "Tüm öğeler hazırlandı",
-    "line-fulfillment-none": "Hiçbir öğe hazırlanmadı",
-    "line-fulfillment-partial": "{ count } / { total } {count, plural, one {öğe hazırlandı} other {öğeler hazırlandı}}",
-    "manually-transition-to-state": "Sipariş durumunu manuel olarak değiştir...",
-    "manually-transition-to-state-message": "Sipariş durumunu manuel olarak değiştirin. Durumlar belirli kurallara tabidir ve bazı geçişler engellenebilir.",
-    "modification-adding-items": "{count} {count, plural, one {öğe} other {öğeler}} ekleniyor",
-    "modification-adding-surcharges": "{count} {count, plural, one {ek ücret} other {ek ücretler}} ekleniyor",
-    "modification-adjusting-lines": "{count} {count, plural, one {satır} other {satırlar}} ayarlanıyor",
-    "modification-not-settled": "Tamamlanmadı",
-    "modification-recalculate-shipping": "Nakliye maliyetini yeniden hesapla",
-    "modification-settled": "Değişiklik tamamlandı",
-    "modification-summary": "Değişiklik özeti",
-    "modification-updating-billing-address": "Fatura adresi güncelleniyor",
-    "modification-updating-shipping-address": "Teslimat adresi güncelleniyor",
-    "modified-items": "Değiştirilen öğeler",
-    "modify-order": "Siparişi değiştir",
-    "modify-order-price-difference": "Fiyat farkı",
-    "net-price": "Net fiyat",
-    "new-customer": "Yeni müşteri",
-    "no-modifications-made": "Hiçbir değişiklik yapılmadı",
-    "note": "Not",
-    "note-is-private": "Not özel",
-    "note-only-visible-to-administrators": "Sadece yöneticiler tarafından görülebilir",
-    "note-visible-to-customer": "Yöneticiler ve müşteri tarafından görülebilir",
-    "order": "Sipariş",
-    "order-history": "Sipariş geçmişi",
-    "order-is-empty": "Sipariş boş",
-    "order-state-diagram": "Sipariş durumu diyagramı",
-    "order-type": "Sipariş türü",
-    "order-type-aggregate": "Toplu",
-    "order-type-regular": "Normal",
-    "order-type-seller": "Satıcı",
-    "orders": "Siparişler",
-    "original-quantity-at-checkout": "Ödeme sırasında orijinal miktar",
-    "payment": "Ödeme",
-    "payment-amount": "Ödeme miktarı",
-    "payment-metadata": "Ödeme meta verileri",
-    "payment-method": "Ödeme yöntemi",
-    "payment-state": "Durum",
-    "payments": "Ödemeler",
-    "placed-at": "Yerleştirildi",
-    "preview-changes": "Değişiklikleri önizle",
-    "previous-customer": "Önceki müşteri",
-    "product-name": "Ürün adı",
-    "product-sku": "SKU",
-    "promotions-applied": "Uygulanan promosyonlar",
-    "prorated-unit-price": "Birim fiyat",
-    "quantity": "Miktar",
-    "refund": "İade",
-    "refund-amount": "İade miktarı",
-    "refund-and-cancel-order": "İade ve siparişi iptal et",
-    "refund-cancellation-reason": "İade/iptal nedeni",
-    "refund-cancellation-reason-required": "İade/iptal nedeni gerekli",
-    "refund-metadata": "İade meta verileri",
-    "refund-order-failed": "Sipariş başarısız oldu",
-    "refund-order-success": "Sipariş iade edildi",
-    "refund-reason": "İade nedeni",
-    "refund-reason-customer-request": "Müşteri talebi",
-    "refund-reason-not-available": "Mevcut değil",
-    "refund-shipping": "Nakliye iadesi",
-    "refund-this-payment": "Bu ödemeyi iade et",
-    "refund-total": "Toplam iade",
-    "refund-total-error": "Toplam iade {min} ile {max} arasında olmalıdır",
-    "refund-total-warning": "Lütfen toplam iade miktarına eşdeğer iade tutarlarını belirtin.",
-    "refund-with-amount": "{amount} iade et",
-    "refundable-amount": "İade edilebilir miktar",
-    "refunded-count": "{count} {count, plural, one {öğe iade edildi} other {öğeler iade edildi}}",
-    "removed-items": "Kaldırılan öğeler",
-    "return-to-stock": "Stoka geri dön",
-    "search-by-order-filters": "Sipariş numarası / müşteri adı / işlem numarasına göre ara",
-    "select-address": "Adres seç",
-    "select-shipping-method": "Nakliye yöntemini seç",
-    "select-state": "Durum seç",
-    "seller-orders": "Satıcı siparişleri",
-    "set-billing-address": "Fatura adresini ayarla",
-    "set-coupon-codes": "Kupon kodlarını ayarla",
-    "set-customer-for-order": "Sipariş için müşteri ayarla",
-    "set-customer-success": "Müşteri başarıyla ayarlandı",
-    "set-fulfillment-state": "{state} olarak işaretle",
-    "set-shipping-address": "Teslimat adresini ayarla",
-    "set-shipping-method": "Nakliye yöntemini ayarla",
-    "settle-payment": "Ödemeyi tamamla",
-    "settle-payment-error": "Ödeme başarısız oldu",
-    "settle-payment-success": "Ödeme başarıyla tamamlandı",
-    "settle-refund": "İadeyi tamamla",
-    "settle-refund-manual-instructions": "Ödeme sağlayıcısı ({method}) aracılığıyla manuel olarak iade ettikten sonra, işlem numarasını buraya girin.",
-    "settle-refund-success": "İade başarıyla tamamlandı",
-    "shipping": "Nakliye",
-    "shipping-address": "Teslimat adresi",
-    "shipping-cancelled": "Nakliye iptal edildi",
-    "shipping-method": "Nakliye yöntemi",
-    "state": "Durum",
-    "sub-total": "Ara toplam",
-    "successfully-updated-fulfillment": "Hazırlık başarıyla güncellendi",
-    "surcharges": "Ek ücretler",
-    "tax-base": "Vergi matrahı",
-    "tax-description": "Vergi açıklaması",
-    "tax-rate": "Vergi oranı",
-    "tax-summary": "Vergi özeti",
-    "tax-total": "Toplam vergi",
-    "total": "Toplam",
-    "tracking-code": "Takip numarası",
-    "transaction-id": "İşlem numarası",
-    "transition-to-state": "Duruma geçiş: { state }",
-    "transitioned-payment-to-state-success": "Ödeme durumu { state } olarak başarıyla değiştirildi",
-    "transitioned-to-state-success": "Duruma geçiş { state } başarıyla tamamlandı",
-    "unable-to-transition-to-state-try-another": "Sipariş \"{state}\" durumuna geçirilemedi. Lütfen başka bir durum seçin.",
-    "unfulfilled": "Hazırlanmamış",
-    "unit-price": "Birim fiyat"
-  },
-  "settings": {
-    "add-countries-to-zone": "{ zoneName } bölgesine ülke ekle",
-    "add-countries-to-zone-success": "{ countryCount } {countryCount, plural, one {ülke eklendi} other {ülke eklendi}} \"{ zoneName }\" bölgesine eklendi",
-    "add-products-to-test-order": "Test siparişine ürün ekle",
-    "administrator": "Yönetici",
-    "channel": "Kanal",
-    "channel-token": "Kanal jetonu",
-    "country": "Ülke",
-    "create-new-channel": "Yeni kanal oluştur",
-    "create-new-country": "Yeni ülke oluştur",
-    "create-new-payment-method": "Yeni ödeme yöntemi oluştur",
-    "create-new-role": "Yeni rol oluştur",
-    "create-new-seller": "Yeni satıcı oluştur",
-    "create-new-shipping-method": "Yeni nakliye yöntemi oluştur",
-    "create-new-tax-category": "Yeni vergi kategorisi oluştur",
-    "create-new-tax-rate": "Yeni vergi oranı oluştur",
-    "create-new-zone": "Yeni bölge oluştur",
-    "default-currency": "Varsayılan para birimi",
-    "default-role-label": "Bu varsayılan roldür ve değiştirilemez",
-    "default-shipping-zone": "Varsayılan teslimat bölgesi",
-    "default-tax-zone": "Varsayılan vergi bölgesi",
-    "defaults": "Varsayılanlar",
-    "eligible": "Uygun",
-    "email-address": "E-posta adresi",
-    "email-address-or-identifier": "E-posta adresi veya kimlik",
-    "first-name": "Ad",
-    "fulfillment-handler": "Hazırlık yöneticisi",
-    "global-available-languages-tooltip": "Tüm kanallar için kullanılabilir dilleri belirler. Bireysel kanallar bu dillerin bir alt kümesini destekleyebilir.",
-    "global-out-of-stock-threshold": "Genel stok tükenme eşiği",
-    "global-out-of-stock-threshold-tooltip": "Bir varyantın stokta tükenmiş olarak kabul edileceği stok seviyesini ayarlayın. Negatif bir değer girmek, bekleyen siparişleri kabul etmeyi sağlar. Değer, ürün varyantı bazında ayrı ayrı ayarlanabilir.",
-    "last-name": "Soyad",
-    "no-eligible-shipping-methods": "Uygun nakliye yöntemi yok",
-    "password": "Şifre",
-    "payment-eligibility-checker": "Ödeme uygunluk denetleyicisi",
-    "payment-handler": "Ödeme yöneticisi",
-    "payment-method": "Ödeme yöntemi",
-    "permissions": "İzinler",
-    "prices-include-tax": "Varsayılan bölge için KDV dahil fiyatlar",
-    "profile": "Profil",
-    "rate": "Oran",
-    "remove-countries-from-zone-success": "{ countryCount } {countryCount, plural, one {ülke kaldırıldı} other {ülke kaldırıldı}} \"{ zoneName }\" bölgesinden kaldırıldı",
-    "remove-from-zone": "Bölgeden kaldır",
-    "role": "Rol",
-    "roles": "Roller",
-    "search-by-product-name-or-sku": "Ürün adı veya SKU'ya göre ara",
-    "seller": "Satıcı",
-    "shipping-calculator": "Nakliye hesaplayıcı",
-    "shipping-eligibility-checker": "Nakliye uygunluk denetleyicisi",
-    "shipping-method": "Nakliye yöntemi",
-    "tax-category": "Vergi kategorisi",
-    "tax-rate": "Vergi oranı",
-    "test-address": "Test adresi",
-    "test-result": "Test sonucu",
-    "test-shipping-method": "Test nakliye yöntemi",
-    "test-shipping-methods": "Test nakliye yöntemleri",
-    "track-inventory-default": "Varsayılan olarak envanteri takip et",
-    "view-zone-members": "Bölge üyelerini görüntüle",
-    "zone": "Bölge"
-  },
-  "state": {
-    "adding-items": "Öğeler ekleniyor",
-    "arranging-additional-payment": "Ek ödeme düzenleniyor",
-    "arranging-payment": "Ödeme düzenleniyor",
-    "authorized": "Yetkilendirilmiş",
-    "cancelled": "İptal edildi",
-    "created": "Oluşturuldu",
-    "declined": "Reddedildi",
-    "delivered": "Teslim edildi",
-    "draft": "Taslak",
-    "error": "Hata",
-    "failed": "Başarısız",
-    "modifying": "Değiştiriliyor",
-    "partially-delivered": "Kısmen teslim edildi",
-    "partially-shipped": "Kısmen gönderildi",
-    "payment-authorized": "Ödeme yetkilendirildi",
-    "payment-settled": "Ödeme tamamlandı",
-    "pending": "Beklemede",
-    "settled": "Tamamlandı",
-    "shipped": "Gönderildi"
-  },
-  "system": {
-    "all-job-queues": "Tüm görev kuyrukları",
-    "health-all-systems-up": "Tüm sistemler çalışıyor",
-    "health-error": "Hata: bir veya daha fazla sistem arızalı!",
-    "health-last-checked": "Son kontrol",
-    "health-message": "Mesaj",
-    "health-refresh": "Yenile",
-    "health-status": "Durum",
-    "health-status-down": "Arızalı",
-    "health-status-up": "Çalışıyor",
-    "job-data": "Görev verisi",
-    "job-duration": "Süre",
-    "job-error": "Görev hatası",
-    "job-queue-name": "Görev kuyruğu adı",
-    "job-result": "Görev sonucu",
-    "job-state": "Görev durumu",
-    "job-state-all": "Tüm durumlar",
-    "job-state-cancelled": "İptal edildi",
-    "job-state-completed": "Tamamlandı",
-    "job-state-failed": "Başarısız",
-    "job-state-pending": "Beklemede",
-    "job-state-running": "Çalışıyor",
-    "last-executed-at": "Son çalıştırma",
-    "last-result": "Son sonuç",
-    "next-execution-at": "Sonraki çalıştırma",
-    "schedule": "Plan",
-    "task-id": "Görev ID"
-  }
-}
+    "admin": {
+        "create-new-administrator": "Yeni yönetici oluştur"
+    },
+    "asset": {
+        "add-asset": "Dosya ekle",
+        "add-asset-with-count": "{count, plural, =0 {dosya} one {bir dosya} other {{count} dosya}} ekle",
+        "assets-selected-count": "{ count } kaynak seçildi",
+        "dimensions": "Boyutlar",
+        "focal-point": "Odak noktası",
+        "notify-create-assets-success": "{count, plural, one {yeni bir dosya} other {{count} yeni dosya}} oluşturuldu",
+        "original-asset-size": "Orijinal boyut",
+        "preview": "Önizleme",
+        "remove-asset": "Dosyayı kaldır",
+        "select-asset": "Bir dosya seç",
+        "select-assets": "Dosyaları seç",
+        "set-as-featured-asset": "Öne çıkan dosya olarak ayarla",
+        "set-focal-point": "Odak noktasını ayarla",
+        "source-file": "Kaynak dosya",
+        "unset-focal-point": "Kaldır",
+        "update-focal-point": "Noktayı güncelle",
+        "update-focal-point-error": "Nokta güncellenemedi",
+        "update-focal-point-success": "Odak noktası güncellendi",
+        "upload-assets": "Kaynakları yükle",
+        "uploading": "Yükleniyor..."
+    },
+    "breadcrumb": {
+        "administrators": "Yöneticiler",
+        "assets": "Dosyalar",
+        "channels": "Kanallar",
+        "collections": "Koleksiyonlar",
+        "countries": "Ülkeler",
+        "customer-groups": "Müşteri Grupları",
+        "customers": "Müşteriler",
+        "dashboard": "Gösterge Paneli",
+        "facets": "Bileşenler",
+        "global-settings": "Genel Ayarlar",
+        "job-queue": "İş Kuyruğu",
+        "manage-variants": "Varyantları Yönet",
+        "modifying-order": "Siparişi Düzenleme",
+        "orders": "Siparişler",
+        "payment-methods": "Ödeme Yöntemleri",
+        "product-options": "Ürün Seçenekleri",
+        "products": "Ürünler",
+        "profile": "Profil",
+        "promotions": "Promosyonlar",
+        "roles": "Roller",
+        "seller-orders": "Satıcı Siparişleri",
+        "sellers": "Satıcılar",
+        "shipping-methods": "Nakliye Yöntemleri",
+        "stock-locations": "Stok Konumları",
+        "system-status": "Sistem Durumu",
+        "tax-categories": "Vergi Kategorileri",
+        "tax-rates": "Vergi Oranları",
+        "zones": "Bölgeler"
+    },
+    "catalog": {
+        "add-facet-value": "Faset değeri ekle",
+        "add-facets": "Faset ekle",
+        "add-option": "Seçenek ekle",
+        "add-price-in-another-currency": "Başka bir para biriminde fiyat ekle",
+        "add-stock-location": "Stok konumu ekle",
+        "add-stock-to-location": "Konuma stok ekle",
+        "asset": "Varlık",
+        "asset-preview-links": "Varlık önizleme bağlantıları",
+        "assets": "Varlıklar",
+        "assign-product-to-channel-success": "Ürün \"{ channel }\" kanalına atandı",
+        "assign-products-to-channel": "Ürünleri kanala ata",
+        "assign-to-named-channel": "{ channelCode } kanalına ata",
+        "assign-variant-to-channel-success": "Ürün varyantı \"{ channel }\" kanalına atandı",
+        "assign-variants-to-channel": "Ürün varyantını kanala ata",
+        "auto-update-option-variant-name": "Bu seçeneği kullanarak ürün varyant adlarını otomatik güncelle",
+        "auto-update-product-variant-name": "Ürün varyant adlarını otomatik güncelle",
+        "calculated-price": "Hesaplanan fiyat",
+        "calculated-price-tooltip": "Yukarıda belirtilen fiyatı değiştiren özel bir fiyat hesaplaması yapılandırıldı:",
+        "cannot-create-variants-without-options": "Seçenekler olmadan varyant oluşturulamaz",
+        "channel-price-preview": "Kanal fiyatı önizlemesi",
+        "collection": "Koleksiyon",
+        "collection-contents": "Koleksiyon İçeriği",
+        "collections": "Koleksiyonlar",
+        "confirm-bulk-delete-products": "Toplu ürün silme işlemini onayla?",
+        "confirm-cancel": "İptali onayla?",
+        "confirm-delete-assets": "{count} {count, plural, one {dosya} other {dosya}} silinsin mi?",
+        "confirm-delete-facet-value": "Faset değeri silinsin mi?",
+        "confirm-delete-product": "Ürün silinsin mi?",
+        "confirm-delete-product-option": "\"{name}\" seçeneği silinsin mi?",
+        "confirm-delete-product-option-group": "\"{name}\" seçenek grubu silinsin mi?",
+        "confirm-delete-product-option-group-body": "Bu seçenek grubu {count} {count, plural, one {varyant} other {varyant}} tarafından kullanılıyor. Silmek istediğinize emin misiniz?",
+        "confirm-delete-product-variant": "\"{name}\" ürün varyantı silinsin mi?",
+        "confirm-deletion-of-unused-variants-body": "Yeni seçeneklerin eklenmesi nedeniyle aşağıdaki ürün varyantları kullanılmaz hale geldi. Yeni ürün varyantları oluşturulurken silinecekler.",
+        "confirm-deletion-of-unused-variants-title": "Kullanılmayan ürün varyantları silinsin mi?",
+        "create-draft-order": "Taslak sipariş oluştur",
+        "create-facet-value": "Yeni faset değeri oluştur",
+        "create-new-collection": "Yeni koleksiyon oluştur",
+        "create-new-facet": "Yeni faset oluştur",
+        "create-new-product": "Yeni ürün oluştur",
+        "create-new-stock-location": "Yeni stok konumu oluştur",
+        "create-product-option-group": "Ürün seçenek grubu oluştur",
+        "create-product-variant": "Ürün varyantı oluştur",
+        "default-currency": "Varsayılan para birimi",
+        "do-not-inherit-filters": "Filtreleri miras alma",
+        "drop-files-to-upload": "Yüklemek için dosyaları sürükle",
+        "duplicate-collections": "Koleksiyonları çoğalt",
+        "duplicate-facets": "Fasetleri çoğalt",
+        "duplicate-products": "Ürünleri çoğalt",
+        "edit-facet-values": "Faset değerlerini düzenle",
+        "edit-options": "Seçenekleri düzenle",
+        "facet": "Faset değeri",
+        "facet-value-not-available": "\"{ id }\" faset değeri mevcut değil",
+        "facet-values": "Faset değerleri",
+        "facets": "Fasetler",
+        "filter-by-name": "İsme göre filtrele",
+        "filter-inheritance": "Filtre mirası",
+        "filters": "Filtreler",
+        "inherit-filters-from-parent": "Filtreleri üst öğeden miras al",
+        "live-preview-contents": "Canlı içerik önizlemesi",
+        "manage-variants": "Varyantları yönet",
+        "move-collection-to": "{ name } koleksiyonuna taşı",
+        "move-collections": "Koleksiyonları taşı",
+        "move-collections-success": "{count, plural, one {1 koleksiyon} other {{count} koleksiyon}} taşındı",
+        "move-down": "Aşağı taşı",
+        "move-to": "Taşı",
+        "move-up": "Yukarı taşı",
+        "name": "İsim",
+        "no-channel-selected": "Kanal seçilmedi",
+        "no-featured-asset": "Öne çıkan varlık yok",
+        "no-selection": "Seçim yok",
+        "no-stock-locations-available-on-current-channel": "Mevcut kanalda stok konumu bulunmamaktadır. Ürün eklemeden önce en az bir stok konumu yapılandırın.",
+        "notify-bulk-delete-products-success": "{count, plural, one {1 ürün} other {{count} ürün}} başarıyla silindi",
+        "notify-remove-facets-from-channel-success": "{count, plural, one {1 faset} other {{count} faset}} { channelCode } kanalından başarıyla kaldırıldı",
+        "notify-remove-product-from-channel-error": "Ürün kanaldan kaldırılırken hata oluştu",
+        "notify-remove-product-from-channel-success": "Ürün kanaldan başarıyla kaldırıldı",
+        "notify-remove-variant-from-channel-error": "Ürün varyantı kanaldan kaldırılırken hata oluştu",
+        "notify-remove-variant-from-channel-success": "Ürün varyantı kanaldan başarıyla kaldırıldı",
+        "number-of-variants": "Varyant sayısı",
+        "option": "Seçenek",
+        "option-name": "Seçenek adı",
+        "option-values": "Seçenek değerleri",
+        "out-of-stock-threshold": "Stok tükenme eşiği",
+        "out-of-stock-threshold-tooltip": "Varyantın stokta tükendiği kabul edilecek stok seviyesini ayarlayın. Negatif bir değer, bekleyen siparişleri kabul etmenizi sağlar.",
+        "page-description-options-editor": "Bu ürün için seçenek adlarını ve kodlarını düzenleyin. Seçenek eklemek veya kaldırmak için, ürün varyantları listesinin altındaki \"varyantları yönet\" düğmesini kullanın.",
+        "price": "Fiyat",
+        "price-and-tax": "Fiyat ve vergi",
+        "price-conversion-factor": "Fiyat dönüşüm faktörü",
+        "price-in-channel": "{ channel } kanalındaki fiyat",
+        "price-includes-tax-at": "{ rate }% vergi dahil",
+        "price-with-tax-in-default-zone": "{ rate }% vergi dahil: { price }",
+        "private": "Özel",
+        "product": "Ürün",
+        "product-name": "Ürün adı",
+        "product-options": "Ürün seçenekleri",
+        "product-variant-exists": "Bu seçeneklere sahip bir ürün varyantı zaten var",
+        "product-variants": "Ürün varyantları",
+        "products": "Ürünler",
+        "public": "Herkese açık",
+        "quick-jump-placeholder": "Varyanta git",
+        "rebuild-search-index": "Arama indeksini yeniden oluştur",
+        "reindex-error": "Arama indeksi yeniden oluşturulurken bir hata oluştu",
+        "reindex-successful": "{count, plural, one {1 ürün varyantı} other {{count} ürün varyantı}} {time} ms içinde indekslendi",
+        "reindexing": "Arama indeksi yeniden oluşturuluyor",
+        "remove-from-channel": "Kanaldan kaldır",
+        "remove-option": "Seçeneği kaldır",
+        "remove-product-from-channel": "Ürünü kanaldan kaldır",
+        "remove-product-variant-from-channel": "Ürün varyantını kanaldan kaldır",
+        "reorder-collection": "Koleksiyonu yeniden sırala",
+        "root-collection": "Kök koleksiyon",
+        "run-pending-search-index-updates": "Arama indeksi: {count, plural, one {1 bekleyen güncelleme} other {{count} bekleyen güncelleme}} çalıştır",
+        "running-search-index-updates": "{count, plural, one {1 güncelleme} other {{count} güncelleme}} çalıştırılıyor",
+        "search-asset-name-or-tag": "Varlık adı veya etikete göre ara",
+        "search-for-term": "Terim ara",
+        "search-product-name-or-code": "Ürün adı veya koda göre ara",
+        "select-product": "Ürün seç",
+        "select-product-variant": "Ürün varyantı seç",
+        "sku": "SKU",
+        "slug": "Slug",
+        "slug-pattern-error": "Geçersiz slug",
+        "stock-allocated": "Ayrılmış",
+        "stock-levels": "Stok seviyeleri",
+        "stock-location": "Stok konumu",
+        "stock-locations": "Stok konumları",
+        "stock-on-hand": "Stokta mevcut",
+        "tax-category": "Vergi kategorisi",
+        "taxes": "Vergiler",
+        "track-inventory": "Stok takibi",
+        "track-inventory-false": "Takip etme",
+        "track-inventory-inherit": "Genel ayarlardan miras al",
+        "track-inventory-tooltip": "Etkinleştirildiğinde, ürün varyantlarının stok seviyeleri satış sonrası otomatik olarak güncellenir.",
+        "track-inventory-true": "Takip et",
+        "update-product-option": "Ürün seçeneğini güncelle",
+        "use-global-value": "Genel değeri kullan",
+        "values": "Değerler",
+        "variant": "Varyant",
+        "variant-count": "{count, plural, one {1 varyant} other {{count} varyant}}",
+        "view-contents": "İçeriği görüntüle",
+        "visibility": "Görünürlük"
+    },
+    "common": {
+        "ID": "Kimlik",
+        "add-filter": "Filtre ekle",
+        "add-item-to-list": "Listeye öğe ekle",
+        "add-note": "Not ekle",
+        "apply": "Uygula",
+        "assign-to-channel": "Kanala ata",
+        "assign-to-channels": "{count, plural, one {kanal} other {kanallar}} ata",
+        "available-currencies": "Mevcut para birimleri",
+        "available-languages": "Mevcut diller",
+        "boolean-and": "ve",
+        "boolean-false": "yanlış",
+        "boolean-or": "veya",
+        "boolean-true": "doğru",
+        "breadcrumb": "Gezinti yolu",
+        "browser-default": "Tarayıcı varsayılanı",
+        "cancel": "İptal",
+        "cancel-navigation": "Gezintiyi iptal et",
+        "change-selection": "Seçimi değiştir",
+        "channel": "Kanal",
+        "channels": "Kanallar",
+        "clear-selection": "Seçimi temizle",
+        "code": "Kod",
+        "collapse-entries": "Girdileri daralt",
+        "confirm": "Onayla",
+        "confirm-bulk-assign-to-channel": "Öğeleri kanala atamak istiyor musunuz?",
+        "confirm-bulk-delete": "Seçili öğeleri silmek istiyor musunuz?",
+        "confirm-bulk-remove-from-channel": "Öğeleri mevcut kanaldan kaldırmak istiyor musunuz?",
+        "confirm-delete-note": "Notu silmek istiyor musunuz?",
+        "confirm-navigation": "Gezintiyi onayla",
+        "contents": "İçerik",
+        "create": "Oluştur",
+        "created-at": "Oluşturulma zamanı",
+        "custom-fields": "Özel alanlar",
+        "data-table-filter-date-mode": "Tarih modu",
+        "data-table-filter-date-range": "Tarih aralığı",
+        "data-table-filter-date-relative": "Göreceli tarih",
+        "default-channel": "Varsayılan kanal",
+        "default-language": "Varsayılan dil",
+        "default-tax-category": "Varsayılan vergi kategorisi",
+        "delete": "Sil",
+        "description": "Açıklama",
+        "details": "Detaylar",
+        "disabled": "Devre dışı",
+        "discard-changes": "Değişiklikleri iptal et",
+        "duplicate": "Çoğalt",
+        "edit": "Düzenle",
+        "edit-field": "Alanı düzenle",
+        "edit-note": "Notu düzenle",
+        "enabled": "Etkin",
+        "end-date": "Bitiş tarihi",
+        "expand-entries": "Girdileri genişlet",
+        "extension-running-in-separate-window": "Eklenti ayrı bir pencerede çalışıyor",
+        "filter": "Filtre",
+        "filter-preset-name": "Filtre ön ayar adı",
+        "force-delete": "Zorla sil",
+        "force-remove": "Zorla kaldır",
+        "general": "Genel",
+        "guest": "Misafir",
+        "id": "Kimlik",
+        "image": "Görüntü",
+        "items-per-page-option": "Sayfa başına { count }",
+        "items-selected-count": "{ count } {count, plural, one {öğe} other {öğeler}} seçildi",
+        "keep-editing": "Düzenlemeye devam et",
+        "language": "Dil",
+        "launch-extension": "Eklentiyi başlat",
+        "list-items-and-n-more": "{ articles } ve {nMore} daha",
+        "live-update": "Canlı güncelleme",
+        "locale": "Yerel ayar",
+        "log-out": "Çıkış yap",
+        "login": "Giriş yap",
+        "login-image-title": "Merhaba! Tekrar hoş geldiniz.",
+        "login-title": "{brand} ile giriş yapın",
+        "manage-tags": "Etiketleri yönet",
+        "manage-tags-description": "Etiketleri toplu olarak güncelle veya sil",
+        "medium-date": "Orta tarih",
+        "more": "Daha fazla...",
+        "name": "Ad",
+        "no-alerts": "Uyarı yok",
+        "no-bulk-actions-available": "Toplu işlem yok",
+        "no-channel-selected": "Kanal seçilmedi",
+        "no-results": "Sonuç yok",
+        "not-applicable": "Uygulanamaz",
+        "not-set": "Ayarlanmadı",
+        "notify-assign-to-channel-success-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} başarıyla { channelCode } kanalına atandı",
+        "notify-bulk-update-success": "{ count } { entity } güncellendi",
+        "notify-create-error": "{ entity } oluşturulurken bir hata oluştu",
+        "notify-create-success": "Yeni { entity } oluşturuldu",
+        "notify-delete-error": "{ entity } silinirken bir hata oluştu",
+        "notify-delete-error-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} silinemedi",
+        "notify-delete-success": "{ entity } silindi",
+        "notify-delete-success-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} başarıyla silindi",
+        "notify-duplicate-error": "{ name } çoğaltılamadı: { error }",
+        "notify-duplicate-error-excess": "{ count } {count, plural, one {öğe} other {öğeler}} çoğaltılamadı: { error }",
+        "notify-duplicate-success": "{count, plural, one {1 öğe} other {{count} öğe}} başarıyla çoğaltıldı: { names }",
+        "notify-remove-from-channel-success-with-count": "{count, plural, one {1 öğe} other {{count} öğe}} kanaldan başarıyla kaldırıldı",
+        "notify-save-changes-error": "Değişiklikler kaydedilemedi",
+        "notify-saved-changes": "Değişiklikler kaydedildi",
+        "notify-update-error": "{ entity } güncellenirken bir hata oluştu",
+        "notify-update-success": "{ entity } güncellendi",
+        "notify-updated-tags-success": "Etiketler başarıyla güncellendi",
+        "okay": "Tamam",
+        "operator-contains": "içerir",
+        "operator-eq": "eşittir",
+        "operator-gt": "büyüktür",
+        "operator-lt": "küçüktür",
+        "operator-not-contains": "içermez",
+        "operator-not-eq": "eşit değildir",
+        "operator-notContains": "içermez",
+        "operator-regex": "düzenli ifadeye uyar",
+        "password": "Şifre",
+        "position": "Pozisyon",
+        "price": "Fiyat",
+        "price-with-tax": "Vergi dahil fiyat",
+        "private": "Özel",
+        "public": "Genel",
+        "remember-me": "Beni hatırla",
+        "remove": "Kaldır",
+        "remove-from-channel": "Kanaldan kaldır",
+        "remove-item-from-list": "Liste öğesini kaldır",
+        "rename-filter-preset": "Filtre ön ayarını yeniden adlandır",
+        "reset-columns": "Sütunları sıfırla",
+        "results-count": "{ count } {count, plural, one {sonuç} other {sonuçlar}}",
+        "sample-formatting": "Örnek biçimlendirme",
+        "save-filter-preset": "Ön ayar olarak kaydet",
+        "search-and-filter-list": "Listeyi ara ve filtrele",
+        "search-by-name": "İsme göre ara",
+        "select": "Seç...",
+        "select-display-language": "Görüntüleme dilini seç",
+        "select-items-with-count": "{ count } {count, plural, one {öğe} other {öğeler}} seç",
+        "select-products": "Ürünleri seç",
+        "select-relation-id": "İlişki kimliğini seç",
+        "select-table-columns": "Tablo sütunlarını seç",
+        "select-today": "Bugünü seç",
+        "select-variants": "Varyantları seç",
+        "seller": "Satıcı",
+        "set-language": "Dili ayarla",
+        "short-date": "Kısa tarih",
+        "slug": "Kısa ad",
+        "start-date": "Başlangıç tarihi",
+        "status": "Durum",
+        "tags": "Etiketler",
+        "theme": "Tema",
+        "there-are-unsaved-changes": "Kaydedilmemiş değişiklikler var. Başka bir yere gitmek bu değişiklikleri kaybettirir.",
+        "toggle-all": "Tümünü seç/deselect",
+        "total-items": "{currentStart} - {currentEnd} / {totalItems}",
+        "update": "Güncelle",
+        "updated-at": "Güncellenme zamanı",
+        "username": "Kullanıcı adı",
+        "value": "Değer",
+        "view-contents": "İçeriği görüntüle",
+        "view-next-month": "Sonraki ayı görüntüle",
+        "view-previous-month": "Önceki ayı görüntüle",
+        "visibility": "Görünürlük",
+        "with-selected": "Seçilenlerle..."
+    },
+    "customer": {
+        "add-customer-to-group": "Müşteriyi gruba ekle",
+        "add-customer-to-groups-with-count": "Müşteriyi {count, plural, one {bir gruba} other {{count} gruba}} ekle",
+        "add-customers-to-group": "Müşterileri gruba ekle",
+        "add-customers-to-group-success": "{customerCount, plural, one {Bir müşteri} other {{customerCount} müşteri}} \"{ groupName }\" grubuna eklendi",
+        "add-customers-to-group-with-count": "{count, plural, one {Bir müşteri} other {{count} müşteri}} eklendi",
+        "add-customers-to-group-with-name": "Müşterileri \"{ groupName }\" grubuna ekle",
+        "addresses": "Adresler",
+        "city": "Şehir",
+        "company": "Şirket",
+        "confirm-remove-customer-from-group": "Müşteriyi gruptan kaldırmak istiyor musunuz?",
+        "country": "Ülke",
+        "create-customer-group": "Müşteri grubu oluştur",
+        "create-new-address": "Yeni adres oluştur",
+        "create-new-customer": "Yeni müşteri oluştur",
+        "create-new-customer-group": "Yeni müşteri grubu oluştur",
+        "customer": "Müşteri",
+        "customer-group": "Müşteri grubu",
+        "customer-groups": "Müşteri grupları",
+        "customer-history": "Müşteri geçmişi",
+        "customers": "Müşteriler",
+        "default-billing-address": "Varsayılan fatura adresi",
+        "default-shipping-address": "Varsayılan teslimat adresi",
+        "email-address": "E-posta adresi",
+        "email-verification-sent": "{ emailAddress } adresine doğrulama e-postası gönderildi",
+        "first-name": "Ad",
+        "full-name": "Tam ad",
+        "guest": "Misafir",
+        "history-customer-added-to-group": "Müşteri \"{ groupName }\" grubuna eklendi",
+        "history-customer-address-created": "Adres oluşturuldu",
+        "history-customer-address-deleted": "Adres silindi",
+        "history-customer-address-updated": "Adres güncellendi",
+        "history-customer-detail-updated": "Detaylar güncellendi",
+        "history-customer-email-update-requested": "E-posta güncelleme talep edildi",
+        "history-customer-email-update-verified": "E-posta güncellemesi doğrulandı",
+        "history-customer-password-reset-requested": "Şifre sıfırlama talep edildi",
+        "history-customer-password-reset-verified": "Şifre sıfırlama doğrulandı",
+        "history-customer-password-updated": "Şifre güncellendi",
+        "history-customer-registered": "Müşteri kaydedildi",
+        "history-customer-removed-from-group": "Müşteri \"{ groupName }\" grubundan kaldırıldı",
+        "history-customer-verified": "Müşteri doğrulandı",
+        "history-using-external-auth-strategy": "{ strategy } kullanıldı",
+        "history-using-native-auth-strategy": "E-posta adresi kullanıldı",
+        "last-login": "Son giriş",
+        "last-name": "Soyad",
+        "name": "Ad",
+        "new-email-address": "Yeni e-posta adresi",
+        "no-orders-placed": "Hiç sipariş verilmedi",
+        "not-a-member-of-any-groups": "Bu müşteri hiçbir grubun üyesi değil",
+        "old-email-address": "Eski e-posta adresi",
+        "orders": "Siparişler",
+        "password": "Şifre",
+        "phone-number": "Telefon numarası",
+        "postal-code": "Posta kodu",
+        "province": "İl",
+        "registered": "Kayıtlı",
+        "remove-customers-from-group-success": "{customerCount, plural, one {Bir müşteri} other {{customerCount} müşteri}} \"{ groupName }\" grubundan kaldırıldı",
+        "remove-from-group": "Bu gruptan kaldır",
+        "search-customers-by-email": "E-posta adresine göre ara",
+        "search-customers-by-email-last-name-postal-code": "Ad / E-posta adresi / Posta koduna göre ara",
+        "select-customer": "Müşteri seç",
+        "set-as-default-billing-address": "Varsayılan fatura adresi olarak ayarla",
+        "set-as-default-shipping-address": "Varsayılan teslimat adresi olarak ayarla",
+        "street-line-1": "Sokak satırı 1",
+        "street-line-2": "Sokak satırı 2",
+        "title": "Başlık",
+        "update-customer-group": "Müşteri grubunu güncelle",
+        "verified": "Doğrulandı",
+        "view-group-members": "Grup üyelerini görüntüle"
+    },
+    "dashboard": {
+        "add-widget": "Widget ekle",
+        "latest-orders": "Son siparişler",
+        "metric-average-order-value": "Ortalama sipariş değeri",
+        "metric-number-of-orders": "Sipariş sayısı",
+        "metric-order-total-value": "Toplam sipariş değeri",
+        "metrics": "İstatistikler",
+        "orders-summary": "Sipariş özeti",
+        "remove-widget": "Widget'ı kaldır",
+        "thisMonth": "Bu ay",
+        "thisWeek": "Bu hafta",
+        "today": "Bugün",
+        "total-order-value": "Toplam değer",
+        "total-orders": "Toplam siparişler",
+        "widget-resize": "Yeniden boyutlandır",
+        "widget-width": "Genişlik: {width}",
+        "yesterday": "Dün"
+    },
+    "datetime": {
+        "ago-days": "{count, plural, one {1 gün} other {{count} gün}} önce",
+        "ago-hours": "{count, plural, one {1 saat} other {{count} saat}} önce",
+        "ago-minutes": "{count, plural, one {1 dakika} other {{count} dakika}} önce",
+        "ago-seconds": "{count, plural, =0 {az önce} one {1 saniye} other {{count} saniye}} önce",
+        "ago-years": "{count, plural, one {1 yıl} other {{count} yıl}} önce",
+        "day": "gün",
+        "duration-milliseconds": "{ms}ms",
+        "duration-minutes:seconds": "{m}:{s}dk",
+        "duration-seconds": "{s}sn",
+        "month": "ay",
+        "month-apr": "Nisan",
+        "month-aug": "Ağustos",
+        "month-dec": "Aralık",
+        "month-feb": "Şubat",
+        "month-jan": "Ocak",
+        "month-jul": "Temmuz",
+        "month-jun": "Haziran",
+        "month-mar": "Mart",
+        "month-may": "Mayıs",
+        "month-nov": "Kasım",
+        "month-oct": "Ekim",
+        "month-sep": "Eylül",
+        "relative-past-days": "{count} {count, plural, one {gün} other {gün}} önce",
+        "relative-past-months": "{count} {count, plural, one {ay} other {ay}} önce",
+        "relative-past-years": "{count} {count, plural, one {yıl} other {yıl}} önce",
+        "time": "Zaman",
+        "weekday-fr": "Cuma",
+        "weekday-mo": "Pazartesi",
+        "weekday-sa": "Cumartesi",
+        "weekday-su": "Pazar",
+        "weekday-th": "Perşembe",
+        "weekday-tu": "Salı",
+        "weekday-we": "Çarşamba",
+        "year": "yıl"
+    },
+    "editor": {
+        "image-alt": "Açıklama (alt)",
+        "image-src": "Kaynak",
+        "image-title": "Başlık",
+        "insert-image": "Resim ekle",
+        "link-href": "Bağlantı adresi",
+        "link-target": "Bağlantı hedefi",
+        "link-title": "Bağlantı başlığı",
+        "remove-link": "Bağlantıyı kaldır",
+        "set-link": "Bağlantıyı ayarla"
+    },
+    "error": {
+        "403-forbidden": "\"{ path }\" yoluna erişim izniniz yok. İzniniz yok veya oturumunuz sona erdi.",
+        "could-not-connect-to-server": "{ url } adresindeki Vendure sunucusuna bağlanılamadı",
+        "health-check-failed": "Sistem sağlık kontrolü başarısız oldu",
+        "no-default-shipping-zone-set": "Bu kanalın varsayılan bir teslimat bölgesi yok. Bu, nakliye maliyeti hesaplamasında hatalara neden olabilir.",
+        "no-default-tax-zone-set": "Bu kanalın varsayılan bir vergi bölgesi yok, bu da fiyat hesaplamasında hatalara neden olabilir. Bir bölge oluşturun veya seçin."
+    },
+    "marketing": {
+        "actions": "Eylemler",
+        "add-action": "Eylem ekle",
+        "add-condition": "Koşul ekle",
+        "conditions": "Koşullar",
+        "coupon-code": "Kupon kodu",
+        "create-new-promotion": "Yeni promosyon oluştur",
+        "duplicate-promotions": "Promosyonları çoğalt",
+        "ends-at": "Bitiş tarihi",
+        "per-customer-limit": "Müşteri başına limit",
+        "per-customer-limit-tooltip": "Bu promosyonun bir müşteri tarafından kullanılabileceği maksimum sayı",
+        "promotion": "Promosyon",
+        "search-by-name-or-coupon-code": "İsme veya kupon koduna göre ara",
+        "starts-at": "Başlangıç tarihi",
+        "usage-limit": "Toplam kullanım limiti",
+        "usage-limit-tooltip": "Bu promosyonun toplamda kullanılabileceği maksimum sayı"
+    },
+    "nav": {
+        "administrators": "Yöneticiler",
+        "assets": "Dosyalar",
+        "catalog": "Katalog",
+        "channels": "Kanallar",
+        "collections": "Koleksiyonlar",
+        "countries": "Ülkeler",
+        "customer-groups": "Müşteri grupları",
+        "customers": "Müşteriler",
+        "facets": "Bileşenler",
+        "global-settings": "Genel ayarlar",
+        "job-queue": "Görev kuyruğu",
+        "marketing": "Pazarlama",
+        "orders": "Siparişler",
+        "payment-methods": "Ödeme yöntemleri",
+        "products": "Ürünler",
+        "promotions": "Promosyonlar",
+        "roles": "Roller",
+        "sales": "Satışlar",
+        "sellers": "Satıcılar",
+        "settings": "Ayarlar",
+        "shipping-methods": "Nakliye yöntemleri",
+        "stock-locations": "Stok konumları",
+        "system": "Sistem",
+        "system-status": "Sistem durumu",
+        "tax-categories": "Vergi kategorileri",
+        "tax-rates": "Vergi oranları",
+        "zones": "Bölgeler"
+    },
+    "order": {
+        "add-item-to-order": "Siparişe öğe ekle",
+        "add-note": "Not ekle",
+        "add-payment": "Ödeme yöntemi ekle",
+        "add-payment-to-order": "Siparişe ödeme yöntemi ekle",
+        "add-payment-to-order-success": "Ödeme yöntemi başarıyla eklendi",
+        "add-surcharge": "Ek ücret ekle",
+        "added-items": "Öğeler eklendi",
+        "amount": "Miktar",
+        "arrange-additional-payment": "Ek ödeme düzenle",
+        "assign-order-to-another-customer": "Siparişi başka bir müşteriye ata",
+        "billing-address": "Fatura adresi",
+        "cancel": "İptal",
+        "cancel-entire-order": "Tüm siparişi iptal et",
+        "cancel-fulfillment": "Hazırlığı iptal et",
+        "cancel-modification": "Değişikliği iptal et",
+        "cancel-order": "Siparişi iptal et",
+        "cancel-payment": "Ödemeyi iptal et",
+        "cancel-reason-customer-request": "Müşteri talebi",
+        "cancel-reason-not-available": "Mevcut değil",
+        "cancel-selected-items": "Seçili öğeleri iptal et",
+        "cancel-specified-items": "Belirtilen öğeleri iptal et",
+        "cancellation-reason": "İptal nedeni",
+        "cancelled-order-items-success": "{ count } { count, plural, one {öğe} other {öğeler} } iptal edildi",
+        "cancelled-order-success": "Sipariş iptal edildi",
+        "complete-draft-order": "Taslağı tamamla",
+        "confirm-modifications": "Değişiklikleri onayla",
+        "contents": "İçerik",
+        "create-fulfillment": "Hazırlık oluştur",
+        "create-fulfillment-success": "Hazırlık başarıyla oluşturuldu",
+        "customer": "Müşteri",
+        "delete-draft-order": "Taslağı sil",
+        "draft-order": "Taslak sipariş",
+        "edit-billing-address": "Fatura adresini düzenle",
+        "edit-shipping-address": "Teslimat adresini düzenle",
+        "error-message": "Hata mesajı",
+        "existing-address": "Mevcut adres",
+        "existing-customer": "Mevcut müşteri",
+        "filter-is-active": "Filtre aktif",
+        "fulfill": "Hazırla",
+        "fulfill-order": "Siparişi hazırla",
+        "fulfillment": "Hazırlık",
+        "fulfillment-method": "Hazırlık yöntemi",
+        "history-coupon-code-applied": "Kupon kodu uygulandı",
+        "history-coupon-code-removed": "Kupon kodu kaldırıldı",
+        "history-customer-updated": "Müşteri güncellendi",
+        "history-fulfillment-created": "Hazırlık oluşturuldu",
+        "history-fulfillment-delivered": "Hazırlık teslim edildi",
+        "history-fulfillment-shipped": "Hazırlık gönderildi",
+        "history-fulfillment-transition": "Hazırlık {from} durumundan {to} durumuna geçirildi",
+        "history-items-cancelled": "{count} {count, plural, one {öğe iptal edildi} other {öğeler iptal edildi}}",
+        "history-order-cancelled": "Sipariş iptal edildi",
+        "history-order-created": "Sipariş oluşturuldu",
+        "history-order-fulfilled": "Sipariş hazırlandı",
+        "history-order-modified": "Sipariş değiştirildi",
+        "history-order-transition": "Sipariş {from} durumundan {to} durumuna geçirildi",
+        "history-payment-settled": "Ödeme tamamlandı",
+        "history-payment-transition": "Ödeme #{id} {from} durumundan {to} durumuna geçirildi",
+        "history-refund-transition": "İade #{id} {from} durumundan {to} durumuna geçirildi",
+        "item-count": "{count} {count, plural, one {öğe} other {öğeler}}",
+        "line-fulfillment-all": "Tüm öğeler hazırlandı",
+        "line-fulfillment-none": "Hiçbir öğe hazırlanmadı",
+        "line-fulfillment-partial": "{ count } / { total } {count, plural, one {öğe hazırlandı} other {öğeler hazırlandı}}",
+        "manually-transition-to-state": "Sipariş durumunu manuel olarak değiştir...",
+        "manually-transition-to-state-message": "Sipariş durumunu manuel olarak değiştirin. Durumlar belirli kurallara tabidir ve bazı geçişler engellenebilir.",
+        "modification-adding-items": "{count} {count, plural, one {öğe} other {öğeler}} ekleniyor",
+        "modification-adding-surcharges": "{count} {count, plural, one {ek ücret} other {ek ücretler}} ekleniyor",
+        "modification-adjusting-lines": "{count} {count, plural, one {satır} other {satırlar}} ayarlanıyor",
+        "modification-not-settled": "Tamamlanmadı",
+        "modification-recalculate-shipping": "Nakliye maliyetini yeniden hesapla",
+        "modification-settled": "Değişiklik tamamlandı",
+        "modification-summary": "Değişiklik özeti",
+        "modification-updating-billing-address": "Fatura adresi güncelleniyor",
+        "modification-updating-shipping-address": "Teslimat adresi güncelleniyor",
+        "modified-items": "Değiştirilen öğeler",
+        "modify-order": "Siparişi değiştir",
+        "modify-order-price-difference": "Fiyat farkı",
+        "net-price": "Net fiyat",
+        "new-customer": "Yeni müşteri",
+        "no-modifications-made": "Hiçbir değişiklik yapılmadı",
+        "note": "Not",
+        "note-is-private": "Not özel",
+        "note-only-visible-to-administrators": "Sadece yöneticiler tarafından görülebilir",
+        "note-visible-to-customer": "Yöneticiler ve müşteri tarafından görülebilir",
+        "order": "Sipariş",
+        "order-history": "Sipariş geçmişi",
+        "order-is-empty": "Sipariş boş",
+        "order-state-diagram": "Sipariş durumu diyagramı",
+        "order-type": "Sipariş türü",
+        "order-type-aggregate": "Toplu",
+        "order-type-regular": "Normal",
+        "order-type-seller": "Satıcı",
+        "orders": "Siparişler",
+        "original-quantity-at-checkout": "Ödeme sırasında orijinal miktar",
+        "payment": "Ödeme",
+        "payment-amount": "Ödeme miktarı",
+        "payment-metadata": "Ödeme meta verileri",
+        "payment-method": "Ödeme yöntemi",
+        "payment-state": "Durum",
+        "payments": "Ödemeler",
+        "placed-at": "Yerleştirildi",
+        "preview-changes": "Değişiklikleri önizle",
+        "previous-customer": "Önceki müşteri",
+        "product-name": "Ürün adı",
+        "product-sku": "SKU",
+        "promotions-applied": "Uygulanan promosyonlar",
+        "prorated-unit-price": "Birim fiyat",
+        "quantity": "Miktar",
+        "refund": "İade",
+        "refund-amount": "İade miktarı",
+        "refund-and-cancel-order": "İade ve siparişi iptal et",
+        "refund-cancellation-reason": "İade/iptal nedeni",
+        "refund-cancellation-reason-required": "İade/iptal nedeni gerekli",
+        "refund-metadata": "İade meta verileri",
+        "refund-order-failed": "Sipariş başarısız oldu",
+        "refund-order-success": "Sipariş iade edildi",
+        "refund-reason": "İade nedeni",
+        "refund-reason-customer-request": "Müşteri talebi",
+        "refund-reason-not-available": "Mevcut değil",
+        "refund-shipping": "Nakliye iadesi",
+        "refund-this-payment": "Bu ödemeyi iade et",
+        "refund-total": "Toplam iade",
+        "refund-total-error": "Toplam iade {min} ile {max} arasında olmalıdır",
+        "refund-total-warning": "Lütfen toplam iade miktarına eşdeğer iade tutarlarını belirtin.",
+        "refund-with-amount": "{amount} iade et",
+        "refundable-amount": "İade edilebilir miktar",
+        "refunded-count": "{count} {count, plural, one {öğe iade edildi} other {öğeler iade edildi}}",
+        "removed-items": "Kaldırılan öğeler",
+        "return-to-stock": "Stoka geri dön",
+        "search-by-order-filters": "Sipariş numarası / müşteri adı / işlem numarasına göre ara",
+        "select-address": "Adres seç",
+        "select-shipping-method": "Nakliye yöntemini seç",
+        "select-state": "Durum seç",
+        "seller-orders": "Satıcı siparişleri",
+        "set-billing-address": "Fatura adresini ayarla",
+        "set-coupon-codes": "Kupon kodlarını ayarla",
+        "set-customer-for-order": "Sipariş için müşteri ayarla",
+        "set-customer-success": "Müşteri başarıyla ayarlandı",
+        "set-fulfillment-state": "{state} olarak işaretle",
+        "set-shipping-address": "Teslimat adresini ayarla",
+        "set-shipping-method": "Nakliye yöntemini ayarla",
+        "settle-payment": "Ödemeyi tamamla",
+        "settle-payment-error": "Ödeme başarısız oldu",
+        "settle-payment-success": "Ödeme başarıyla tamamlandı",
+        "settle-refund": "İadeyi tamamla",
+        "settle-refund-manual-instructions": "Ödeme sağlayıcısı ({method}) aracılığıyla manuel olarak iade ettikten sonra, işlem numarasını buraya girin.",
+        "settle-refund-success": "İade başarıyla tamamlandı",
+        "shipping": "Nakliye",
+        "shipping-address": "Teslimat adresi",
+        "shipping-cancelled": "Nakliye iptal edildi",
+        "shipping-method": "Nakliye yöntemi",
+        "state": "Durum",
+        "sub-total": "Ara toplam",
+        "successfully-updated-fulfillment": "Hazırlık başarıyla güncellendi",
+        "surcharges": "Ek ücretler",
+        "tax-base": "Vergi matrahı",
+        "tax-description": "Vergi açıklaması",
+        "tax-rate": "Vergi oranı",
+        "tax-summary": "Vergi özeti",
+        "tax-total": "Toplam vergi",
+        "total": "Toplam",
+        "tracking-code": "Takip numarası",
+        "transaction-id": "İşlem numarası",
+        "transition-to-state": "Duruma geçiş: { state }",
+        "transitioned-payment-to-state-success": "Ödeme durumu { state } olarak başarıyla değiştirildi",
+        "transitioned-to-state-success": "Duruma geçiş { state } başarıyla tamamlandı",
+        "unable-to-transition-to-state-try-another": "Sipariş \"{state}\" durumuna geçirilemedi. Lütfen başka bir durum seçin.",
+        "unfulfilled": "Hazırlanmamış",
+        "unit-price": "Birim fiyat"
+    },
+    "settings": {
+        "add-countries-to-zone": "{ zoneName } bölgesine ülke ekle",
+        "add-countries-to-zone-success": "{ countryCount } {countryCount, plural, one {ülke eklendi} other {ülke eklendi}} \"{ zoneName }\" bölgesine eklendi",
+        "add-products-to-test-order": "Test siparişine ürün ekle",
+        "administrator": "Yönetici",
+        "channel": "Kanal",
+        "channel-token": "Kanal jetonu",
+        "country": "Ülke",
+        "create-new-channel": "Yeni kanal oluştur",
+        "create-new-country": "Yeni ülke oluştur",
+        "create-new-payment-method": "Yeni ödeme yöntemi oluştur",
+        "create-new-role": "Yeni rol oluştur",
+        "create-new-seller": "Yeni satıcı oluştur",
+        "create-new-shipping-method": "Yeni nakliye yöntemi oluştur",
+        "create-new-tax-category": "Yeni vergi kategorisi oluştur",
+        "create-new-tax-rate": "Yeni vergi oranı oluştur",
+        "create-new-zone": "Yeni bölge oluştur",
+        "default-currency": "Varsayılan para birimi",
+        "default-role-label": "Bu varsayılan roldür ve değiştirilemez",
+        "default-shipping-zone": "Varsayılan teslimat bölgesi",
+        "default-tax-zone": "Varsayılan vergi bölgesi",
+        "defaults": "Varsayılanlar",
+        "eligible": "Uygun",
+        "email-address": "E-posta adresi",
+        "email-address-or-identifier": "E-posta adresi veya kimlik",
+        "first-name": "Ad",
+        "fulfillment-handler": "Hazırlık yöneticisi",
+        "global-available-languages-tooltip": "Tüm kanallar için kullanılabilir dilleri belirler. Bireysel kanallar bu dillerin bir alt kümesini destekleyebilir.",
+        "global-out-of-stock-threshold": "Genel stok tükenme eşiği",
+        "global-out-of-stock-threshold-tooltip": "Bir varyantın stokta tükenmiş olarak kabul edileceği stok seviyesini ayarlayın. Negatif bir değer girmek, bekleyen siparişleri kabul etmeyi sağlar. Değer, ürün varyantı bazında ayrı ayrı ayarlanabilir.",
+        "last-name": "Soyad",
+        "no-eligible-shipping-methods": "Uygun nakliye yöntemi yok",
+        "password": "Şifre",
+        "payment-eligibility-checker": "Ödeme uygunluk denetleyicisi",
+        "payment-handler": "Ödeme yöneticisi",
+        "payment-method": "Ödeme yöntemi",
+        "permissions": "İzinler",
+        "prices-include-tax": "Varsayılan bölge için KDV dahil fiyatlar",
+        "profile": "Profil",
+        "rate": "Oran",
+        "remove-countries-from-zone-success": "{ countryCount } {countryCount, plural, one {ülke kaldırıldı} other {ülke kaldırıldı}} \"{ zoneName }\" bölgesinden kaldırıldı",
+        "remove-from-zone": "Bölgeden kaldır",
+        "role": "Rol",
+        "roles": "Roller",
+        "search-by-product-name-or-sku": "Ürün adı veya SKU'ya göre ara",
+        "seller": "Satıcı",
+        "shipping-calculator": "Nakliye hesaplayıcı",
+        "shipping-eligibility-checker": "Nakliye uygunluk denetleyicisi",
+        "shipping-method": "Nakliye yöntemi",
+        "tax-category": "Vergi kategorisi",
+        "tax-rate": "Vergi oranı",
+        "test-address": "Test adresi",
+        "test-result": "Test sonucu",
+        "test-shipping-method": "Test nakliye yöntemi",
+        "test-shipping-methods": "Test nakliye yöntemleri",
+        "track-inventory-default": "Varsayılan olarak envanteri takip et",
+        "view-zone-members": "Bölge üyelerini görüntüle",
+        "zone": "Bölge"
+    },
+    "state": {
+        "adding-items": "Öğeler ekleniyor",
+        "arranging-additional-payment": "Ek ödeme düzenleniyor",
+        "arranging-payment": "Ödeme düzenleniyor",
+        "authorized": "Yetkilendirilmiş",
+        "cancelled": "İptal edildi",
+        "created": "Oluşturuldu",
+        "declined": "Reddedildi",
+        "delivered": "Teslim edildi",
+        "draft": "Taslak",
+        "error": "Hata",
+        "failed": "Başarısız",
+        "modifying": "Değiştiriliyor",
+        "partially-delivered": "Kısmen teslim edildi",
+        "partially-shipped": "Kısmen gönderildi",
+        "payment-authorized": "Ödeme yetkilendirildi",
+        "payment-settled": "Ödeme tamamlandı",
+        "pending": "Beklemede",
+        "settled": "Tamamlandı",
+        "shipped": "Gönderildi"
+    },
+    "system": {
+        "all-job-queues": "Tüm görev kuyrukları",
+        "health-all-systems-up": "Tüm sistemler çalışıyor",
+        "health-error": "Hata: bir veya daha fazla sistem arızalı!",
+        "health-last-checked": "Son kontrol",
+        "health-message": "Mesaj",
+        "health-refresh": "Yenile",
+        "health-status": "Durum",
+        "health-status-down": "Arızalı",
+        "health-status-up": "Çalışıyor",
+        "job-data": "Görev verisi",
+        "job-duration": "Süre",
+        "job-error": "Görev hatası",
+        "job-queue-name": "Görev kuyruğu adı",
+        "job-result": "Görev sonucu",
+        "job-state": "Görev durumu",
+        "job-state-all": "Tüm durumlar",
+        "job-state-cancelled": "İptal edildi",
+        "job-state-completed": "Tamamlandı",
+        "job-state-failed": "Başarısız",
+        "job-state-pending": "Beklemede",
+        "job-state-running": "Çalışıyor"
+    }
+}

+ 4 - 17
packages/admin-ui/src/lib/static/i18n-messages/uk.json

@@ -6,7 +6,6 @@
     "add-asset": "Додати медіа-об'єкт",
     "add-asset-with-count": "Додати {count, plural, =0 {медіа-об'єктів} one {1 медіа-об'єкт} other {{count} медіа-об'єктів}}",
     "assets-selected-count": "Вибрано { count } медіа-об'єктів",
-    "change-asset": "Змінити медіа-об'єкт",
     "dimensions": "Розміри",
     "focal-point": "Точка фокусу",
     "notify-create-assets-success": "Створено {count, plural, one {новий медіа-об'єкт} other {{count} нових медіа-об'єктів}}",
@@ -17,7 +16,6 @@
     "select-assets": "Вибрати медіа-об'єкты",
     "set-as-featured-asset": "Встановити як обраний медіа-об'єкт",
     "set-focal-point": "Встановити точку фокусу",
-    "size": "Розмір",
     "source-file": "Початковий файл",
     "unset-focal-point": "Видалити точку фокусу",
     "update-focal-point": "Оновити точку фокусу",
@@ -47,7 +45,6 @@
     "profile": "Профіль",
     "promotions": "Акції",
     "roles": "Ролі",
-    "scheduled-tasks": "Завдання",
     "seller-orders": "Замовлення продавця",
     "sellers": "Продавці",
     "shipping-methods": "Способи доставки",
@@ -240,14 +237,12 @@
     "delete": "Видалити",
     "description": "Опис",
     "details": "Подробиці",
-    "disable": "Виключити",
     "disabled": "Виключений",
     "discard-changes": "Скасувати зміни",
     "duplicate": "Дублювати",
     "edit": "Редагувати",
     "edit-field": "Редагувати поле",
     "edit-note": "Редагувати замітку",
-    "enable": "Включити",
     "enabled": "Включений",
     "end-date": "Дата закінчення",
     "expand-entries": "Розгорнути записи",
@@ -279,7 +274,7 @@
     "name": "Ім'я",
     "no-alerts": "Немає сповіщень",
     "no-bulk-actions-available": "Масові дії недоступні",
-    "no-channel-selected": "Не вибрано канал",
+    "no-channel-selected": "",
     "no-results": "Немає результатів",
     "not-applicable": "Не застосовно",
     "not-set": "Не задано",
@@ -480,7 +475,6 @@
     "year": "рік"
   },
   "editor": {
-    "height": "Висота",
     "image-alt": "Опис (alt)",
     "image-src": "Джерело",
     "image-title": "Заголовок",
@@ -489,8 +483,7 @@
     "link-target": "Ціль посилання",
     "link-title": "Заголовок посилання",
     "remove-link": "Удалить",
-    "set-link": "Встановити посилання",
-    "width": "Ширина"
+    "set-link": "Встановити посилання"
   },
   "error": {
     "403-forbidden": "В даний час у вас немає прав доступу \"{ path }\". Або у вас немає дозволів на перегляд, або термін вашого сеансу минув.",
@@ -535,7 +528,6 @@
     "promotions": "Промо-акції",
     "roles": "Ролі",
     "sales": "Продажі",
-    "scheduled-tasks": "Завдання",
     "sellers": "Продавці",
     "settings": "Налаштування",
     "shipping-methods": "Способи доставки",
@@ -683,7 +675,7 @@
     "set-billing-address": "Встановити адресу для рахунків",
     "set-coupon-codes": "Встановити промокоди",
     "set-customer-for-order": "Встановити клієнта",
-    "set-customer-success": "Клієнт успішно встановлений",
+    "set-customer-success": "",
     "set-fulfillment-state": "Помітити як {state}",
     "set-shipping-address": "Встановити адресу доставки",
     "set-shipping-method": "Встановити спосіб доставки",
@@ -817,11 +809,6 @@
     "job-state-completed": "Завершено",
     "job-state-failed": "Не вдалося",
     "job-state-pending": "В очікуванні",
-    "job-state-running": "Виконується",
-    "last-executed-at": "Останнє виконання",
-    "last-result": "Останній результат",
-    "next-execution-at": "Наступне виконання",
-    "schedule": "Розклад",
-    "task-id": "ID завдання"
+    "job-state-running": "Виконується"
   }
 }

+ 224 - 237
packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json

@@ -6,7 +6,6 @@
     "add-asset": "添加资源",
     "add-asset-with-count": "添加{count}个资源",
     "assets-selected-count": "已选择{ count }个资源",
-    "change-asset": "修改资源",
     "dimensions": "图片尺寸",
     "focal-point": "图片焦点",
     "notify-create-assets-success": "创建了{count}个新资源",
@@ -17,7 +16,6 @@
     "select-assets": "选择资源",
     "set-as-featured-asset": "设置为特征图片",
     "set-focal-point": "设置图片焦点",
-    "size": "图片尺寸",
     "source-file": "源文件",
     "unset-focal-point": "删除焦点设置",
     "update-focal-point": "重新设置焦点",
@@ -42,14 +40,13 @@
     "modifying-order": "修改订单",
     "orders": "订单管理",
     "payment-methods": "支付管理",
-    "product-options": "商品规格",
+    "product-options": "",
     "products": "产品",
     "profile": "个人资料",
     "promotions": "优惠券管理",
     "roles": "角色管理",
-    "scheduled-tasks": "任务管理",
-    "seller-orders": "卖家订单",
-    "sellers": "卖家管理",
+    "seller-orders": "",
+    "sellers": "",
     "shipping-methods": "配送方式管理",
     "stock-locations": "库存位置",
     "system-status": "系统状态",
@@ -61,12 +58,12 @@
     "add-facet-value": "添加特征值",
     "add-facets": "添加特征",
     "add-option": "添加规格组",
-    "add-price-in-another-currency": "在其他货币中添加价格",
-    "add-stock-location": "添加库存位置",
-    "add-stock-to-location": "添加库存到位置",
-    "asset": "资源",
-    "asset-preview-links": "资源预览链接",
-    "assets": "资源",
+    "add-price-in-another-currency": "",
+    "add-stock-location": "",
+    "add-stock-to-location": "",
+    "asset": "",
+    "asset-preview-links": "",
+    "assets": "",
     "assign-product-to-channel-success": "成功将产品添加至销售渠道\"{ channel }\"",
     "assign-products-to-channel": "分配产品到销售渠道",
     "assign-to-named-channel": "分配到{ channelCode }",
@@ -76,87 +73,87 @@
     "auto-update-product-variant-name": "自动更新不同商品变体名称",
     "calculated-price": "计算价格",
     "calculated-price-tooltip": "有一个配置的自定义价格计算,修改了上面设置的价格:",
-    "cannot-create-variants-without-options": "无法在没有选项的情况下创建变体",
+    "cannot-create-variants-without-options": "",
     "channel-price-preview": "渠道价格预览",
-    "collection": "系列",
+    "collection": "",
     "collection-contents": "系列产品",
-    "collections": "系列",
-    "confirm-bulk-delete-products": "确认删除商品?",
-    "confirm-cancel": "确认取消?",
+    "collections": "",
+    "confirm-bulk-delete-products": "",
+    "confirm-cancel": "",
     "confirm-delete-assets": "确认删除{count}个资源吗?",
     "confirm-delete-facet-value": "确认删除特征值?",
     "confirm-delete-product": "确认删除商品?",
-    "confirm-delete-product-option": "确认删除规格?",
-    "confirm-delete-product-option-group": "确认删除规格组?",
-    "confirm-delete-product-option-group-body": "确认删除规格组?",
+    "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
+    "confirm-delete-product-option-group-body": "",
     "confirm-delete-product-variant": "确认删除商品规格?",
-    "confirm-deletion-of-unused-variants-body": "确认删除未使用的规格?",
-    "confirm-deletion-of-unused-variants-title": "确认删除未使用的规格?",
-    "create-draft-order": "创建草稿订单",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
+    "create-draft-order": "",
     "create-facet-value": "创建新特征值",
     "create-new-collection": "添加系列",
     "create-new-facet": "添加特征",
     "create-new-product": "添加商品",
-    "create-new-stock-location": "添加库存位置",
-    "create-product-option-group": "创建规格组",
-    "create-product-variant": "创建商品规格",
-    "default-currency": "默认货币",
-    "do-not-inherit-filters": "不继承过滤条件",
+    "create-new-stock-location": "",
+    "create-product-option-group": "",
+    "create-product-variant": "",
+    "default-currency": "",
+    "do-not-inherit-filters": "",
     "drop-files-to-upload": "拖拽文件上传",
     "duplicate-collections": "复制集合",
     "duplicate-facets": "复制外观",
     "duplicate-products": "复制产品",
-    "edit-facet-values": "编辑特征值",
-    "edit-options": "编辑规格",
-    "facet": "特征",
-    "facet-value-not-available": "特征值不存在",
+    "edit-facet-values": "",
+    "edit-options": "",
+    "facet": "",
+    "facet-value-not-available": "",
     "facet-values": "特征值列表",
-    "facets": "特征",
+    "facets": "",
     "filter-by-name": "按名字过滤",
-    "filter-inheritance": "继承过滤条件",
+    "filter-inheritance": "",
     "filters": "过滤条件",
-    "inherit-filters-from-parent": "从父级继承过滤条件",
-    "live-preview-contents": "实时预览",
+    "inherit-filters-from-parent": "",
+    "live-preview-contents": "",
     "manage-variants": "商品规格管理",
-    "move-collection-to": "移动系列到",
-    "move-collections": "移动系列",
-    "move-collections-success": "系列移动成功",
+    "move-collection-to": "",
+    "move-collections": "",
+    "move-collections-success": "",
     "move-down": "向下移",
     "move-to": "移至",
     "move-up": "向上移",
-    "name": "名称",
+    "name": "",
     "no-channel-selected": "未选择销售渠道",
     "no-featured-asset": "无特征图片",
     "no-selection": "尚未选择",
-    "no-stock-locations-available-on-current-channel": "当前渠道没有库存位置",
-    "notify-bulk-delete-products-success": "成功删除商品",
-    "notify-remove-facets-from-channel-success": "成功从渠道中移除特征",
+    "no-stock-locations-available-on-current-channel": "",
+    "notify-bulk-delete-products-success": "",
+    "notify-remove-facets-from-channel-success": "",
     "notify-remove-product-from-channel-error": "从渠道中移除商品失败",
     "notify-remove-product-from-channel-success": "成功从渠道中移除商品",
     "notify-remove-variant-from-channel-error": "从渠道中移除商品变体失败",
     "notify-remove-variant-from-channel-success": "成功从渠道中移除商品变体",
-    "number-of-variants": "商品规格数量",
+    "number-of-variants": "",
     "option": "规格",
     "option-name": "规格名称",
     "option-values": "规格列表(按回车键添加)",
     "out-of-stock-threshold": "售空限制",
     "out-of-stock-threshold-tooltip": "当此规格产品库存值低于此限制时,产品将为售空状态。设置为负数设置此规格产品为缺货状态。",
-    "page-description-options-editor": "规格编辑器",
+    "page-description-options-editor": "",
     "price": "价格",
-    "price-and-tax": "价格(含税)",
+    "price-and-tax": "",
     "price-conversion-factor": "价格换算因数",
     "price-in-channel": "渠道{ channel }价格",
     "price-includes-tax-at": "含税{ rate }%",
     "price-with-tax-in-default-zone": "含税{ rate }% 价格{ price }",
     "private": "隐藏",
-    "product": "商品",
+    "product": "",
     "product-name": "商品名称",
-    "product-options": "商品规格",
-    "product-variant-exists": "商品规格已存在",
+    "product-options": "",
+    "product-variant-exists": "",
     "product-variants": "商品规格",
     "products": "产品",
     "public": "公开",
-    "quick-jump-placeholder": "快速跳转",
+    "quick-jump-placeholder": "",
     "rebuild-search-index": "重建搜索索引",
     "reindex-error": "重建索引失败",
     "reindex-successful": "已成功重建{count}个产品索引,耗时{time}毫秒",
@@ -165,10 +162,10 @@
     "remove-option": "移除选项",
     "remove-product-from-channel": "从销售渠道移除商品",
     "remove-product-variant-from-channel": "从销售渠道移除商品变体",
-    "reorder-collection": "重新排序系列",
-    "root-collection": "根系列",
-    "run-pending-search-index-updates": "运行待处理搜索索引更新",
-    "running-search-index-updates": "正在运行搜索索引更新",
+    "reorder-collection": "",
+    "root-collection": "",
+    "run-pending-search-index-updates": "",
+    "running-search-index-updates": "",
     "search-asset-name-or-tag": "输入要搜索的资源名称或标签",
     "search-for-term": "输入搜索条目",
     "search-product-name-or-code": "输入要搜索的商品名称或商品编码",
@@ -178,56 +175,56 @@
     "slug": "名称缩写",
     "slug-pattern-error": "名称缩写无效",
     "stock-allocated": "已分配",
-    "stock-levels": "库存水平",
-    "stock-location": "库存位置",
+    "stock-levels": "",
+    "stock-location": "",
     "stock-locations": "库存位置",
     "stock-on-hand": "当前库存",
     "tax-category": "税表分类",
     "taxes": "价格(含税)",
     "track-inventory": "跟踪库存",
     "track-inventory-false": "不跟踪",
-    "track-inventory-inherit": "继承",
+    "track-inventory-inherit": "",
     "track-inventory-tooltip": "当设置跟踪,当前规格产品库存数量会跟进销售数量自动减少",
     "track-inventory-true": "跟踪",
     "update-product-option": "更新产品规格",
     "use-global-value": "使用系统默认值",
     "values": "值",
     "variant": "商品规格",
-    "variant-count": "商品规格数量",
+    "variant-count": "",
     "view-contents": "查看详情",
     "visibility": "访问控制"
   },
   "common": {
     "ID": "ID",
-    "add-filter": "添加过滤器",
+    "add-filter": "",
     "add-item-to-list": "添加到列表",
     "add-note": "添加注释",
-    "apply": "应用",
-    "assign-to-channel": "分配到{count, plural, one {渠道} other {渠道}}",
+    "apply": "",
+    "assign-to-channel": "",
     "assign-to-channels": "分配到{count, plural, one {渠道} other {渠道}}",
-    "available-currencies": "可用货币",
+    "available-currencies": "",
     "available-languages": "可用语言",
-    "boolean-and": "",
-    "boolean-false": "",
-    "boolean-or": "",
-    "boolean-true": "",
-    "breadcrumb": "面包屑",
-    "browser-default": "浏览器默认",
+    "boolean-and": "",
+    "boolean-false": "",
+    "boolean-or": "",
+    "boolean-true": "",
+    "breadcrumb": "",
+    "browser-default": "",
     "cancel": "取消",
     "cancel-navigation": "取消",
     "change-selection": "更改选项",
     "channel": "销售渠道",
     "channels": "销售渠道",
-    "clear-selection": "清除选项",
+    "clear-selection": "",
     "code": "编码",
     "collapse-entries": "收起",
     "confirm": "确认",
-    "confirm-bulk-assign-to-channel": "确认分配到{count, plural, one {渠道} other {渠道}}",
-    "confirm-bulk-delete": "确认删除",
-    "confirm-bulk-remove-from-channel": "确认从{count, plural, one {渠道} other {渠道}}中移除",
-    "confirm-delete-note": "确认删除笔记",
+    "confirm-bulk-assign-to-channel": "",
+    "confirm-bulk-delete": "",
+    "confirm-bulk-remove-from-channel": "",
+    "confirm-delete-note": "删除笔记",
     "confirm-navigation": "导航确认",
-    "contents": "内容",
+    "contents": "",
     "create": "添加",
     "created-at": "创建时间",
     "custom-fields": "客户化字段",
@@ -240,106 +237,104 @@
     "delete": "删除",
     "description": "描述",
     "details": "详情",
-    "disable": "禁用",
     "disabled": "禁用",
     "discard-changes": "放弃修改",
     "duplicate": "复制",
     "edit": "编辑",
     "edit-field": "编辑域",
     "edit-note": "编辑笔记",
-    "enable": "启用",
     "enabled": "启用",
-    "end-date": "结束日期",
+    "end-date": "",
     "expand-entries": "展开",
     "extension-running-in-separate-window": "扩展已在另一个窗口启动",
     "filter": "过滤",
     "filter-preset-name": "过滤器预设名称",
-    "force-delete": "强制删除",
-    "force-remove": "强制移除",
-    "general": "常规",
+    "force-delete": "",
+    "force-remove": "",
+    "general": "",
     "guest": "游客",
-    "id": "ID",
-    "image": "图片",
+    "id": "",
+    "image": "",
     "items-per-page-option": "每页显示 { count } 条",
-    "items-selected-count": "已选择{count}个",
-    "keep-editing": "继续编辑",
+    "items-selected-count": "",
+    "keep-editing": "",
     "language": "语言",
     "launch-extension": "启动扩展插件",
-    "list-items-and-n-more": "显示{count}个项目",
+    "list-items-and-n-more": "",
     "live-update": "在线更新",
-    "locale": "区域",
+    "locale": "",
     "log-out": "退出",
     "login": "登陆",
-    "login-image-title": "登录图片",
-    "login-title": "登录",
+    "login-image-title": "",
+    "login-title": "",
     "manage-tags": "管理标签",
     "manage-tags-description": "更新或删除标签",
-    "medium-date": "日期",
+    "medium-date": "",
     "more": "更多...",
     "name": "名称",
-    "no-alerts": "无警报",
-    "no-bulk-actions-available": "无批量操作",
-    "no-channel-selected": "未选择销售渠道",
+    "no-alerts": "",
+    "no-bulk-actions-available": "",
+    "no-channel-selected": "",
     "no-results": "没找到任何结果",
-    "not-applicable": "不适用",
+    "not-applicable": "",
     "not-set": "未设置",
-    "notify-assign-to-channel-success-with-count": "成功分配到{count, plural, one {渠道} other {渠道}}",
-    "notify-bulk-update-success": "成功更新{count}个项目",
+    "notify-assign-to-channel-success-with-count": "",
+    "notify-bulk-update-success": "",
     "notify-create-error": "添加{ entity }失败",
     "notify-create-success": "{ entity }已添加",
     "notify-delete-error": "删除{ entity }失败",
-    "notify-delete-error-with-count": "删除{count}个项目失败",
+    "notify-delete-error-with-count": "",
     "notify-delete-success": "{ entity }已删除",
-    "notify-delete-success-with-count": "成功删除{count}个项目",
+    "notify-delete-success-with-count": "",
     "notify-duplicate-error": "由于错误无法复制 { name } :{ error }",
     "notify-duplicate-error-excess": "由于错误,无法复制额外的 { count } {count, plural, one {项目} other {项目}}",
     "notify-duplicate-success": "成功复制 {count, plural, one {1 项目} other {{count} 项目}} :{ names }",
-    "notify-remove-from-channel-success-with-count": "成功从{count, plural, one {渠道} other {渠道}}中移除{count}个项目",
+    "notify-remove-from-channel-success-with-count": "",
     "notify-save-changes-error": "保存失败",
     "notify-saved-changes": "修改已保存",
     "notify-update-error": "更新{ entity }失败",
     "notify-update-success": "{ entity }已更新",
     "notify-updated-tags-success": "成功更新标签",
-    "okay": "确定",
-    "operator-contains": "包含",
-    "operator-eq": "等于",
-    "operator-gt": "大于",
-    "operator-lt": "小于",
-    "operator-not-contains": "不包含",
-    "operator-not-eq": "不等于",
-    "operator-notContains": "不包含",
-    "operator-regex": "正则表达式",
+    "okay": "",
+    "operator-contains": "",
+    "operator-eq": "",
+    "operator-gt": "",
+    "operator-lt": "",
+    "operator-not-contains": "",
+    "operator-not-eq": "",
+    "operator-notContains": "",
+    "operator-regex": "",
     "password": "密码",
-    "position": "位置",
+    "position": "",
     "price": "价格",
     "price-with-tax": "价格(含税)",
     "private": "隐藏",
     "public": "公开",
     "remember-me": "记住我",
     "remove": "删除",
-    "remove-from-channel": "从渠道中移除",
+    "remove-from-channel": "",
     "remove-item-from-list": "从列表中移除",
     "rename-filter-preset": "重命名预设",
-    "reset-columns": "重置列",
+    "reset-columns": "",
     "results-count": "{count, plural, =0{无} other {{count}个过滤结果}}",
-    "sample-formatting": "示例格式化",
+    "sample-formatting": "",
     "save-filter-preset": "保存为预设",
-    "search-and-filter-list": "搜索和过滤列表",
-    "search-by-name": "按名称搜索",
+    "search-and-filter-list": "",
+    "search-by-name": "",
     "select": "选择...",
     "select-display-language": "选择显示语言",
-    "select-items-with-count": "选择{count}个项目",
-    "select-products": "选择商品",
-    "select-relation-id": "选择关系ID",
-    "select-table-columns": "选择表格列",
+    "select-items-with-count": "",
+    "select-products": "",
+    "select-relation-id": "",
+    "select-table-columns": "",
     "select-today": "选择今天",
-    "select-variants": "选择规格",
-    "seller": "卖家",
-    "set-language": "设置语言",
-    "short-date": "日期",
-    "slug": "缩写",
-    "start-date": "开始日期",
-    "status": "状态",
+    "select-variants": "",
+    "seller": "",
+    "set-language": "",
+    "short-date": "",
+    "slug": "",
+    "start-date": "",
+    "status": "",
     "tags": "标签",
     "theme": "主题",
     "there-are-unsaved-changes": "修改尚未被保存,现在离开会导致您的修改会被删除",
@@ -348,11 +343,11 @@
     "update": "确认修改",
     "updated-at": "修改时间",
     "username": "用户名",
-    "value": "",
-    "view-contents": "查看详情",
+    "value": "",
+    "view-contents": "",
     "view-next-month": "查看下个月",
     "view-previous-month": "查看下个月",
-    "visibility": "访问控制",
+    "visibility": "",
     "with-selected": "从已选中..."
   },
   "customer": {
@@ -364,18 +359,18 @@
     "add-customers-to-group-with-name": "添加客户到\"{ groupName }\"分组",
     "addresses": "地址",
     "city": "市",
-    "company": "公司",
+    "company": "",
     "confirm-remove-customer-from-group": "确认从分组移除客户?",
     "country": "国家",
     "create-customer-group": "添加分组",
     "create-new-address": "添加地址",
     "create-new-customer": "添加客户",
     "create-new-customer-group": "确认添加",
-    "customer": "客户",
-    "customer-group": "客户分组",
+    "customer": "",
+    "customer-group": "",
     "customer-groups": "客户分组",
     "customer-history": "客户记录",
-    "customers": "客户",
+    "customers": "",
     "default-billing-address": "默认账单地址",
     "default-shipping-address": "默认邮寄地址",
     "email-address": "电子邮件地址",
@@ -414,7 +409,7 @@
     "remove-customers-from-group-success": "成功从分组\"{ groupName }\"中移除{customerCount}个客户",
     "remove-from-group": "从分组中移除",
     "search-customers-by-email": "输入要搜索的客户邮件地址",
-    "search-customers-by-email-last-name-postal-code": "输入要搜索的客户邮件地址,姓氏,邮政编码",
+    "search-customers-by-email-last-name-postal-code": "",
     "select-customer": "选择客户",
     "set-as-default-billing-address": "设置为默认账单地址",
     "set-as-default-shipping-address": "设置为默认邮寄地址",
@@ -428,10 +423,10 @@
   "dashboard": {
     "add-widget": "添加窗口工具",
     "latest-orders": "最新订单",
-    "metric-average-order-value": "平均订单价值",
-    "metric-number-of-orders": "订单数量",
-    "metric-order-total-value": "订单总额",
-    "metrics": "指标",
+    "metric-average-order-value": "",
+    "metric-number-of-orders": "",
+    "metric-order-total-value": "",
+    "metrics": "",
     "orders-summary": "订单预览",
     "remove-widget": "移除窗口",
     "thisMonth": "本月",
@@ -480,17 +475,15 @@
     "year": "年"
   },
   "editor": {
-    "height": "高度",
     "image-alt": "图片备注",
     "image-src": "图片源文件",
     "image-title": "图片标题",
     "insert-image": "插入图片",
     "link-href": "链接",
-    "link-target": "目标",
+    "link-target": "",
     "link-title": "链接标题",
     "remove-link": "删除链接",
-    "set-link": "设置链接",
-    "width": "宽度"
+    "set-link": "设置链接"
   },
   "error": {
     "403-forbidden": "无权限访问路径 \"{ path }\"。无权限或会话已过期,请重新登陆",
@@ -510,14 +503,14 @@
     "ends-at": "有效起始时间",
     "per-customer-limit": "每人限领数",
     "per-customer-limit-tooltip": "单个客户可以使用此优惠的最大次数",
-    "promotion": "促销活动",
-    "search-by-name-or-coupon-code": "按名称或优惠码搜索",
+    "promotion": "",
+    "search-by-name-or-coupon-code": "",
     "starts-at": "有效结束时间",
     "usage-limit": "总使用限制",
     "usage-limit-tooltip": "此优惠的总使用次数上限"
   },
   "nav": {
-    "administrators": "管理",
+    "administrators": "登陆管理",
     "assets": "资源列表",
     "catalog": "商品管理",
     "channels": "销售渠道",
@@ -535,8 +528,7 @@
     "promotions": "优惠券管理",
     "roles": "角色管理",
     "sales": "销售管理",
-    "scheduled-tasks": "计划任务",
-    "sellers": "卖家管理",
+    "sellers": "",
     "settings": "系统设置",
     "shipping-methods": "配送方式",
     "stock-locations": "库存位置",
@@ -559,7 +551,7 @@
     "assign-order-to-another-customer": "分配订单给另一个客户",
     "billing-address": "账单地址",
     "cancel": "取消",
-    "cancel-entire-order": "取消整个订单",
+    "cancel-entire-order": "",
     "cancel-fulfillment": "取消发货",
     "cancel-modification": "取消修改",
     "cancel-order": "取消订单",
@@ -567,24 +559,24 @@
     "cancel-reason-customer-request": "客户要求",
     "cancel-reason-not-available": "产品无库存",
     "cancel-selected-items": "取消已选",
-    "cancel-specified-items": "取消指定项目",
+    "cancel-specified-items": "",
     "cancellation-reason": "取消原因",
     "cancelled-order-items-success": "从订单中取消 { count } { count, plural, one {项} other {项} }",
     "cancelled-order-success": "订单成功取消",
-    "complete-draft-order": "完成草稿订单",
+    "complete-draft-order": "",
     "confirm-modifications": "确认修改",
     "contents": "具体内容",
     "create-fulfillment": "确认配货",
     "create-fulfillment-success": "确认配货成功",
     "customer": "客户",
-    "delete-draft-order": "删除草稿订单",
-    "draft-order": "草稿订单",
+    "delete-draft-order": "",
+    "draft-order": "",
     "edit-billing-address": "编辑账单地址",
     "edit-shipping-address": "编辑邮寄地址",
     "error-message": "错误消息",
-    "existing-address": "现有地址",
-    "existing-customer": "现有客户",
-    "filter-is-active": "过滤器已激活",
+    "existing-address": "",
+    "existing-customer": "",
+    "filter-is-active": "",
     "fulfill": "已配货",
     "fulfill-order": "接受订单",
     "fulfillment": "配货记录",
@@ -592,15 +584,15 @@
     "history-coupon-code-applied": "优惠卷已使用",
     "history-coupon-code-removed": "优惠卷已移除",
     "history-customer-updated": "客户已更新",
-    "history-fulfillment-created": "配货已创建",
-    "history-fulfillment-delivered": "配货已交付",
-    "history-fulfillment-shipped": "配货已发货",
-    "history-fulfillment-transition": "配货状态从{from}更新至{to}",
+    "history-fulfillment-created": "",
+    "history-fulfillment-delivered": "",
+    "history-fulfillment-shipped": "",
+    "history-fulfillment-transition": "",
     "history-items-cancelled": "{count}个已取消",
     "history-order-cancelled": "订单已取消",
-    "history-order-created": "订单已创建",
+    "history-order-created": "",
     "history-order-fulfilled": "订单已配货",
-    "history-order-modified": "订单已修改",
+    "history-order-modified": "",
     "history-order-transition": "订单状态从{from}更新至{to}",
     "history-payment-settled": "已结算付款",
     "history-payment-transition": "付款交易 #{id} 状态从{from}更新至{to}",
@@ -609,58 +601,58 @@
     "line-fulfillment-all": "订单已全部配货完成",
     "line-fulfillment-none": "无订单配货记录",
     "line-fulfillment-partial": "总共{ total }个订单项,{ count }个已配货",
-    "manually-transition-to-state": "手动更新状态",
-    "manually-transition-to-state-message": "请输入要更新的状态",
-    "modification-adding-items": "添加项目",
-    "modification-adding-surcharges": "添加附加费",
-    "modification-adjusting-lines": "调整项目",
-    "modification-not-settled": "未结算",
-    "modification-recalculate-shipping": "重新计算运费",
-    "modification-settled": "已结算",
-    "modification-summary": "修改总结",
-    "modification-updating-billing-address": "更新账单地址",
-    "modification-updating-shipping-address": "更新配送地址",
+    "manually-transition-to-state": "",
+    "manually-transition-to-state-message": "",
+    "modification-adding-items": "",
+    "modification-adding-surcharges": "",
+    "modification-adjusting-lines": "",
+    "modification-not-settled": "",
+    "modification-recalculate-shipping": "",
+    "modification-settled": "",
+    "modification-summary": "",
+    "modification-updating-billing-address": "",
+    "modification-updating-shipping-address": "",
     "modified-items": "修改过的商品",
-    "modify-order": "修改订单",
-    "modify-order-price-difference": "修改订单价格差异",
+    "modify-order": "",
+    "modify-order-price-difference": "",
     "net-price": "净价",
     "new-customer": "新客户",
     "no-modifications-made": "没有进行任何修改",
-    "note": "备注",
+    "note": "",
     "note-is-private": "隐藏备注",
     "note-only-visible-to-administrators": "仅管理员可见",
     "note-visible-to-customer": "管理员及客户可见",
-    "order": "订单",
+    "order": "",
     "order-history": "历史订单",
-    "order-is-empty": "订单为空",
-    "order-state-diagram": "订单状态图",
-    "order-type": "订单类型",
-    "order-type-aggregate": "聚合订单",
-    "order-type-regular": "常规订单",
-    "order-type-seller": "卖家订单",
-    "orders": "订单",
+    "order-is-empty": "",
+    "order-state-diagram": "",
+    "order-type": "",
+    "order-type-aggregate": "",
+    "order-type-regular": "",
+    "order-type-seller": "",
+    "orders": "",
     "original-quantity-at-checkout": "结账时的原始数量",
     "payment": "付款信息",
     "payment-amount": "付款金额",
     "payment-metadata": "付款元数据",
     "payment-method": "付款方式",
     "payment-state": "付款状态",
-    "payments": "付款信息",
-    "placed-at": "下单时间",
-    "preview-changes": "预览修改",
+    "payments": "",
+    "placed-at": "",
+    "preview-changes": "",
     "previous-customer": "以前的客户",
     "product-name": "产品名称",
     "product-sku": "库存编码",
     "promotions-applied": "已使用代金券",
-    "prorated-unit-price": "分摊单价",
+    "prorated-unit-price": "",
     "quantity": "数量",
     "refund": "退款",
     "refund-amount": "退款金额",
     "refund-and-cancel-order": "退款|取消订单",
-    "refund-cancellation-reason": "退款原因",
-    "refund-cancellation-reason-required": "请输入退款原因",
+    "refund-cancellation-reason": "",
+    "refund-cancellation-reason-required": "",
     "refund-metadata": "退款元数据",
-    "refund-order-failed": "退款订单处理失败",
+    "refund-order-failed": "",
     "refund-order-success": "退款订单处理成功",
     "refund-reason": "退款原因",
     "refund-reason-customer-request": "客户要求",
@@ -673,20 +665,20 @@
     "refund-with-amount": "退款金额{amount}",
     "refundable-amount": "可退款金额",
     "refunded-count": "{count}个商品已退款",
-    "removed-items": "已移除项目",
+    "removed-items": "",
     "return-to-stock": "返回库存",
     "search-by-order-filters": "输入要搜索的订单编号 / 姓 / 交易ID ",
-    "select-address": "选择地址",
-    "select-shipping-method": "选择配送方式",
-    "select-state": "选择状态",
-    "seller-orders": "卖家订单",
-    "set-billing-address": "设置账单地址",
-    "set-coupon-codes": "设置优惠券",
-    "set-customer-for-order": "设置客户",
-    "set-customer-success": "客户设置成功",
-    "set-fulfillment-state": "设置配货状态",
-    "set-shipping-address": "设置配送地址",
-    "set-shipping-method": "设置配送方式",
+    "select-address": "",
+    "select-shipping-method": "",
+    "select-state": "",
+    "seller-orders": "",
+    "set-billing-address": "",
+    "set-coupon-codes": "",
+    "set-customer-for-order": "",
+    "set-customer-success": "",
+    "set-fulfillment-state": "",
+    "set-shipping-address": "",
+    "set-shipping-method": "",
     "settle-payment": "结算付款",
     "settle-payment-error": "结算付款失败",
     "settle-payment-success": "结算付款成功",
@@ -695,24 +687,24 @@
     "settle-refund-success": "结算退款成功",
     "shipping": "运费",
     "shipping-address": "配送地址",
-    "shipping-cancelled": "配送已取消",
+    "shipping-cancelled": "",
     "shipping-method": "配送方式",
     "state": "状态",
     "sub-total": "小计金额",
-    "successfully-updated-fulfillment": "配货更新成功",
-    "surcharges": "附加费",
-    "tax-base": "税基",
-    "tax-description": "税描述",
-    "tax-rate": "税率",
-    "tax-summary": "税总结",
-    "tax-total": "税总计",
+    "successfully-updated-fulfillment": "",
+    "surcharges": "",
+    "tax-base": "",
+    "tax-description": "",
+    "tax-rate": "",
+    "tax-summary": "",
+    "tax-total": "",
     "total": "总计金额",
     "tracking-code": "物流码",
     "transaction-id": "交易ID",
-    "transition-to-state": "更新状态",
-    "transitioned-payment-to-state-success": "付款状态更新成功",
-    "transitioned-to-state-success": "状态更新成功",
-    "unable-to-transition-to-state-try-another": "无法更新状态,请尝试其他状态",
+    "transition-to-state": "",
+    "transitioned-payment-to-state-success": "",
+    "transitioned-to-state-success": "",
+    "unable-to-transition-to-state-try-another": "",
     "unfulfilled": "未配货",
     "unit-price": "单价"
   },
@@ -720,48 +712,48 @@
     "add-countries-to-zone": "添加国家到销售区域...",
     "add-countries-to-zone-success": "{ countryCount }个国家已到销售区域 \"{ zoneName }\"",
     "add-products-to-test-order": "添加产品到测试订单",
-    "administrator": "管理员",
+    "administrator": "",
     "channel": "销售渠道",
     "channel-token": "渠道唯一码",
-    "country": "国家",
+    "country": "",
     "create-new-channel": "添加销售渠道",
     "create-new-country": "添加国家",
-    "create-new-payment-method": "添加付款方式",
+    "create-new-payment-method": "",
     "create-new-role": "添加角色",
-    "create-new-seller": "添加卖家",
+    "create-new-seller": "",
     "create-new-shipping-method": "添加配送方式",
     "create-new-tax-category": "创建税表分类",
     "create-new-tax-rate": "添加税率",
-    "create-new-zone": "创建销售区域",
-    "default-currency": "默认货币",
+    "create-new-zone": "",
+    "default-currency": "",
     "default-role-label": "默认角色不可修改",
     "default-shipping-zone": "默认配送区域",
     "default-tax-zone": "默认销售区域",
-    "defaults": "默认",
+    "defaults": "",
     "eligible": "符合条件",
     "email-address": "电子邮件",
-    "email-address-or-identifier": "电子邮件或标识符",
+    "email-address-or-identifier": "",
     "first-name": "名",
-    "fulfillment-handler": "配货处理",
-    "global-available-languages-tooltip": "系统支持的语言",
+    "fulfillment-handler": "",
+    "global-available-languages-tooltip": "",
     "global-out-of-stock-threshold": "默认售空限制",
     "global-out-of-stock-threshold-tooltip": "当此规格产品库存值低于此限制时,产品将为售空状态。设置为负数设置此规格产品为缺货状态。可以在产品页面更改默认限制",
     "last-name": "姓",
     "no-eligible-shipping-methods": "没有符合条件的配送方式",
     "password": "密码",
-    "payment-eligibility-checker": "付款合格条件",
-    "payment-handler": "付款处理",
-    "payment-method": "付款方式",
+    "payment-eligibility-checker": "",
+    "payment-handler": "",
+    "payment-method": "",
     "permissions": "权限",
     "prices-include-tax": "设置默认销售区域价格含税",
-    "profile": "配置文件",
+    "profile": "",
     "rate": "税率",
     "remove-countries-from-zone-success": "{ countryCount }个国际已从\"{ zoneName }\"中移除",
-    "remove-from-zone": "移除",
-    "role": "角色",
+    "remove-from-zone": "",
+    "role": "",
     "roles": "角色列表",
     "search-by-product-name-or-sku": "输入要搜索的产品名称或库存编码",
-    "seller": "卖家",
+    "seller": "",
     "shipping-calculator": "配送费计算",
     "shipping-eligibility-checker": "使用此配送方式的合格条件",
     "shipping-method": "配送方式",
@@ -772,7 +764,7 @@
     "test-shipping-method": "模拟测试配送方式",
     "test-shipping-methods": "模拟测试配送方式",
     "track-inventory-default": "默认跟踪库存",
-    "view-zone-members": "查看销售区域成员",
+    "view-zone-members": "",
     "zone": "销售区域"
   },
   "state": {
@@ -784,7 +776,7 @@
     "created": "已创建",
     "declined": "已拒绝",
     "delivered": "已完成",
-    "draft": "草稿",
+    "draft": "",
     "error": "错误",
     "failed": "失败",
     "modifying": "正在修改",
@@ -817,11 +809,6 @@
     "job-state-completed": "已完成",
     "job-state-failed": "失败",
     "job-state-pending": "等待中",
-    "job-state-running": "运行中",
-    "last-executed-at": "最后执行时间",
-    "last-result": "最后结果",
-    "next-execution-at": "下次执行时间",
-    "schedule": "计划",
-    "task-id": "任务ID"
+    "job-state-running": "运行中"
   }
 }

File diff suppressed because it is too large
+ 356 - 364
packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json


+ 0 - 96
packages/admin-ui/src/lib/system/src/components/scheduled-tasks/scheduled-task-list.component.html

@@ -1,96 +0,0 @@
-<vdr-page-header>
-    <vdr-page-title></vdr-page-title>
-</vdr-page-header>
-<vdr-page-body>
-    <vdr-page-block>
-        <vdr-action-bar>
-            <vdr-ab-left> </vdr-ab-left>
-            <vdr-ab-right> </vdr-ab-right>
-        </vdr-action-bar>
-    </vdr-page-block>
-
-    <vdr-data-table-2 id="scheduled-task-list" [items]="tasks$ | async">
-        <vdr-dt2-column [heading]="'system.task-id' | translate" id="task-id" [optional]="false">
-            <ng-template let-task="item">
-                {{ task.id }}
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'common.description' | translate" id="description">
-            <ng-template let-task="item">
-                {{ task.description }}
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'system.schedule' | translate" id="schedule">
-            <ng-template let-task="item">
-                <div class="">{{ task.scheduleDescription }}</div>
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'system.last-executed-at' | translate" id="last-executed-at">
-            <ng-template let-task="item">
-                <span *ngIf="task.lastExecutedAt" [title]="task.lastExecutedAt | localeDate">
-                    {{ task.lastExecutedAt | timeAgo }}
-                </span>
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column
-            [heading]="'system.next-execution-at' | translate"
-            id="next-execution-at"
-            [hiddenByDefault]="true"
-        >
-            <ng-template let-task="item">
-                {{ task.nextExecutionAt | localeDate }}
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'system.last-result' | translate" id="last-result">
-            <ng-template let-task="item">
-                <vdr-dropdown *ngIf="task.lastResult">
-                    <button class="button-small mr-1" vdrDropdownTrigger>
-                        <clr-icon shape="details"></clr-icon>
-                        {{ 'system.last-result' | translate }}
-                    </button>
-                    <vdr-dropdown-menu>
-                        <div class="result-detail">
-                            <vdr-object-tree [value]="task.lastResult"></vdr-object-tree>
-                        </div>
-                    </vdr-dropdown-menu>
-                </vdr-dropdown>
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'common.enabled' | translate" id="enabled">
-            <ng-template let-task="item">
-                <ng-container *ngIf="task.enabled">
-                    <vdr-chip [colorType]="'success'">{{ 'common.enabled' | translate }}</vdr-chip>
-                </ng-container>
-                <ng-container *ngIf="!task.enabled">
-                    <vdr-chip [colorType]="'warning'">{{ 'common.disabled' | translate }}</vdr-chip>
-                </ng-container>
-            </ng-template>
-        </vdr-dt2-column>
-        <vdr-dt2-column id="actions">
-            <ng-template let-task="item">
-                <vdr-dropdown *ngIf="!task.isSettled && task.state !== 'FAILED'">
-                    <button class="icon-button" vdrDropdownTrigger>
-                        <clr-icon shape="ellipsis-vertical" size="12"></clr-icon>
-                    </button>
-                    <vdr-dropdown-menu vdrPosition="bottom-right">
-                        <button
-                            type="button"
-                            class="delete-button"
-                            (click)="toggleEnabled(task)"
-                            [disabled]="!(['UpdateSettings', 'UpdateSystem'] | hasPermission)"
-                            vdrDropdownItem
-                        >
-                            <clr-icon shape="ban" class="is-danger"></clr-icon>
-                            <div *ngIf="task.enabled">
-                                {{ 'common.disable' | translate }}
-                            </div>
-                            <div *ngIf="!task.enabled">
-                                {{ 'common.enable' | translate }}
-                            </div>
-                        </button>
-                    </vdr-dropdown-menu>
-                </vdr-dropdown>
-            </ng-template>
-        </vdr-dt2-column>
-    </vdr-data-table-2>
-</vdr-page-body>

+ 0 - 8
packages/admin-ui/src/lib/system/src/components/scheduled-tasks/scheduled-task-list.component.scss

@@ -1,8 +0,0 @@
-.result-detail {
-    margin: 0 12px;
-}
-
-.retry-info {
-    margin-inline-start: 6px;
-    color: var(--color-grey-400);
-}

+ 0 - 72
packages/admin-ui/src/lib/system/src/components/scheduled-tasks/scheduled-task-list.component.ts

@@ -1,72 +0,0 @@
-import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
-import { FormControl } from '@angular/forms';
-import {
-    DataService,
-    GetAllScheduledTasksQuery,
-    ToggleScheduledTaskEnabledMutation,
-    ToggleScheduledTaskEnabledMutationVariables,
-} from '@vendure/admin-ui/core';
-import { gql } from 'apollo-angular';
-import { Observable } from 'rxjs';
-
-export const GET_SCHEDULED_TASKS_LIST = gql`
-    query GetAllScheduledTasks {
-        scheduledTasks {
-            id
-            description
-            schedule
-            scheduleDescription
-            lastExecutedAt
-            nextExecutionAt
-            isRunning
-            lastResult
-            enabled
-        }
-    }
-`;
-
-const TOGGLE_SCHEDULED_TASK_ENABLED = gql`
-    mutation ToggleScheduledTaskEnabled($input: UpdateScheduledTaskInput!) {
-        updateScheduledTask(input: $input) {
-            id
-            enabled
-        }
-    }
-`;
-
-@Component({
-    selector: 'vdr-scheduled-task-list',
-    templateUrl: './scheduled-task-list.component.html',
-    styleUrls: ['./scheduled-task-list.component.scss'],
-    changeDetection: ChangeDetectionStrategy.OnPush,
-    standalone: false,
-})
-export class ScheduledTaskListComponent implements OnInit {
-    tasks$: Observable<GetAllScheduledTasksQuery['scheduledTasks']>;
-    liveUpdate = new FormControl(true);
-
-    constructor(private dataService: DataService) {}
-
-    ngOnInit(): void {
-        this.tasks$ = this.dataService
-            .query<GetAllScheduledTasksQuery>(GET_SCHEDULED_TASKS_LIST)
-            .mapStream(res => {
-                console.log(res.scheduledTasks);
-                return res.scheduledTasks;
-            });
-    }
-
-    toggleEnabled(task: GetAllScheduledTasksQuery['scheduledTasks'][0]) {
-        this.dataService
-            .mutate<ToggleScheduledTaskEnabledMutation, ToggleScheduledTaskEnabledMutationVariables>(
-                TOGGLE_SCHEDULED_TASK_ENABLED,
-                {
-                    input: {
-                        id: task.id,
-                        enabled: !task.enabled,
-                    },
-                },
-            )
-            .subscribe();
-    }
-}

+ 0 - 1
packages/admin-ui/src/lib/system/src/public_api.ts

@@ -2,6 +2,5 @@
 export * from './components/health-check/health-check.component';
 export * from './components/job-list/job-list.component';
 export * from './components/job-state-label/job-state-label.component';
-export * from './components/scheduled-tasks/scheduled-task-list.component';
 export * from './system.module';
 export * from './system.routes';

+ 1 - 7
packages/admin-ui/src/lib/system/src/system.module.ts

@@ -5,16 +5,10 @@ import { SharedModule } from '@vendure/admin-ui/core';
 import { HealthCheckComponent } from './components/health-check/health-check.component';
 import { JobListComponent } from './components/job-list/job-list.component';
 import { JobStateLabelComponent } from './components/job-state-label/job-state-label.component';
-import { ScheduledTaskListComponent } from './components/scheduled-tasks/scheduled-task-list.component';
 import { systemRoutes } from './system.routes';
 
 @NgModule({
-    declarations: [
-        HealthCheckComponent,
-        JobListComponent,
-        JobStateLabelComponent,
-        ScheduledTaskListComponent,
-    ],
+    declarations: [HealthCheckComponent, JobListComponent, JobStateLabelComponent],
     imports: [SharedModule, RouterModule.forChild(systemRoutes)],
 })
 export class SystemModule {}

+ 0 - 8
packages/admin-ui/src/lib/system/src/system.routes.ts

@@ -3,7 +3,6 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 
 import { HealthCheckComponent } from './components/health-check/health-check.component';
 import { JobListComponent } from './components/job-list/job-list.component';
-import { ScheduledTaskListComponent } from './components/scheduled-tasks/scheduled-task-list.component';
 
 export const systemRoutes: Route[] = [
     {
@@ -20,11 +19,4 @@ export const systemRoutes: Route[] = [
             breadcrumb: _('breadcrumb.system-status'),
         },
     },
-    {
-        path: 'scheduled-tasks',
-        component: ScheduledTaskListComponent,
-        data: {
-            breadcrumb: _('breadcrumb.scheduled-tasks'),
-        },
-    },
 ];

+ 0 - 23
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -2990,7 +2990,6 @@ export type Mutation = {
     updateProvince: Province;
     /** Update an existing Role */
     updateRole: Role;
-    updateScheduledTask: ScheduledTask;
     /** Update an existing Seller */
     updateSeller: Seller;
     /** Update an existing ShippingMethod */
@@ -3655,10 +3654,6 @@ export type MutationUpdateRoleArgs = {
     input: UpdateRoleInput;
 };
 
-export type MutationUpdateScheduledTaskArgs = {
-    input: UpdateScheduledTaskInput;
-};
-
 export type MutationUpdateSellerArgs = {
     input: UpdateSellerInput;
 };
@@ -4891,7 +4886,6 @@ export type Query = {
     provinces: ProvinceList;
     role?: Maybe<Role>;
     roles: RoleList;
-    scheduledTasks: Array<ScheduledTask>;
     search: SearchResponse;
     seller?: Maybe<Seller>;
     sellers: SellerList;
@@ -5394,18 +5388,6 @@ export type Sale = Node &
         updatedAt: Scalars['DateTime']['output'];
     };
 
-export type ScheduledTask = {
-    description: Scalars['String']['output'];
-    enabled: Scalars['Boolean']['output'];
-    id: Scalars['String']['output'];
-    isRunning: Scalars['Boolean']['output'];
-    lastExecutedAt?: Maybe<Scalars['DateTime']['output']>;
-    lastResult?: Maybe<Scalars['JSON']['output']>;
-    nextExecutionAt?: Maybe<Scalars['DateTime']['output']>;
-    schedule: Scalars['String']['output'];
-    scheduleDescription: Scalars['String']['output'];
-};
-
 export type SearchInput = {
     collectionId?: InputMaybe<Scalars['ID']['input']>;
     collectionSlug?: InputMaybe<Scalars['String']['input']>;
@@ -6347,11 +6329,6 @@ export type UpdateRoleInput = {
     permissions?: InputMaybe<Array<Permission>>;
 };
 
-export type UpdateScheduledTaskInput = {
-    enabled?: InputMaybe<Scalars['Boolean']['input']>;
-    id: Scalars['String']['input'];
-};
-
 export type UpdateSellerInput = {
     customFields?: InputMaybe<Scalars['JSON']['input']>;
     id: Scalars['ID']['input'];

+ 0 - 25
packages/common/src/generated-types.ts

@@ -3041,7 +3041,6 @@ export type Mutation = {
   updateProvince: Province;
   /** Update an existing Role */
   updateRole: Role;
-  updateScheduledTask: ScheduledTask;
   /** Update an existing Seller */
   updateSeller: Seller;
   /** Update an existing ShippingMethod */
@@ -3861,11 +3860,6 @@ export type MutationUpdateRoleArgs = {
 };
 
 
-export type MutationUpdateScheduledTaskArgs = {
-  input: UpdateScheduledTaskInput;
-};
-
-
 export type MutationUpdateSellerArgs = {
   input: UpdateSellerInput;
 };
@@ -5153,7 +5147,6 @@ export type Query = {
   provinces: ProvinceList;
   role?: Maybe<Role>;
   roles: RoleList;
-  scheduledTasks: Array<ScheduledTask>;
   search: SearchResponse;
   seller?: Maybe<Seller>;
   sellers: SellerList;
@@ -5713,19 +5706,6 @@ export type Sale = Node & StockMovement & {
   updatedAt: Scalars['DateTime']['output'];
 };
 
-export type ScheduledTask = {
-  __typename?: 'ScheduledTask';
-  description: Scalars['String']['output'];
-  enabled: Scalars['Boolean']['output'];
-  id: Scalars['String']['output'];
-  isRunning: Scalars['Boolean']['output'];
-  lastExecutedAt?: Maybe<Scalars['DateTime']['output']>;
-  lastResult?: Maybe<Scalars['JSON']['output']>;
-  nextExecutionAt?: Maybe<Scalars['DateTime']['output']>;
-  schedule: Scalars['String']['output'];
-  scheduleDescription: Scalars['String']['output'];
-};
-
 export type SearchInput = {
   collectionId?: InputMaybe<Scalars['ID']['input']>;
   collectionSlug?: InputMaybe<Scalars['String']['input']>;
@@ -6682,11 +6662,6 @@ export type UpdateRoleInput = {
   permissions?: InputMaybe<Array<Permission>>;
 };
 
-export type UpdateScheduledTaskInput = {
-  enabled?: InputMaybe<Scalars['Boolean']['input']>;
-  id: Scalars['String']['input'];
-};
-
 export type UpdateSellerInput = {
   customFields?: InputMaybe<Scalars['JSON']['input']>;
   id: Scalars['ID']['input'];

+ 0 - 23
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -2990,7 +2990,6 @@ export type Mutation = {
     updateProvince: Province;
     /** Update an existing Role */
     updateRole: Role;
-    updateScheduledTask: ScheduledTask;
     /** Update an existing Seller */
     updateSeller: Seller;
     /** Update an existing ShippingMethod */
@@ -3655,10 +3654,6 @@ export type MutationUpdateRoleArgs = {
     input: UpdateRoleInput;
 };
 
-export type MutationUpdateScheduledTaskArgs = {
-    input: UpdateScheduledTaskInput;
-};
-
 export type MutationUpdateSellerArgs = {
     input: UpdateSellerInput;
 };
@@ -4891,7 +4886,6 @@ export type Query = {
     provinces: ProvinceList;
     role?: Maybe<Role>;
     roles: RoleList;
-    scheduledTasks: Array<ScheduledTask>;
     search: SearchResponse;
     seller?: Maybe<Seller>;
     sellers: SellerList;
@@ -5394,18 +5388,6 @@ export type Sale = Node &
         updatedAt: Scalars['DateTime']['output'];
     };
 
-export type ScheduledTask = {
-    description: Scalars['String']['output'];
-    enabled: Scalars['Boolean']['output'];
-    id: Scalars['String']['output'];
-    isRunning: Scalars['Boolean']['output'];
-    lastExecutedAt?: Maybe<Scalars['DateTime']['output']>;
-    lastResult?: Maybe<Scalars['JSON']['output']>;
-    nextExecutionAt?: Maybe<Scalars['DateTime']['output']>;
-    schedule: Scalars['String']['output'];
-    scheduleDescription: Scalars['String']['output'];
-};
-
 export type SearchInput = {
     collectionId?: InputMaybe<Scalars['ID']['input']>;
     collectionSlug?: InputMaybe<Scalars['String']['input']>;
@@ -6347,11 +6329,6 @@ export type UpdateRoleInput = {
     permissions?: InputMaybe<Array<Permission>>;
 };
 
-export type UpdateScheduledTaskInput = {
-    enabled?: InputMaybe<Scalars['Boolean']['input']>;
-    id: Scalars['String']['input'];
-};
-
 export type UpdateSellerInput = {
     customFields?: InputMaybe<Scalars['JSON']['input']>;
     id: Scalars['ID']['input'];

+ 0 - 3
packages/core/package.json

@@ -53,9 +53,6 @@
         "bcrypt": "^5.1.1",
         "body-parser": "^1.20.2",
         "cookie-session": "^2.1.0",
-        "cron-time-generator": "^2.0.3",
-        "croner": "^9.0.0",
-        "cronstrue": "^2.57.0",
         "csv-parse": "^5.6.0",
         "express": "^5.0.1",
         "fs-extra": "^11.2.0",

+ 0 - 4
packages/core/src/api/api-internal-modules.ts

@@ -6,7 +6,6 @@ import { ConnectionModule } from '../connection/connection.module';
 import { DataImportModule } from '../data-import/data-import.module';
 import { JobQueueModule } from '../job-queue/job-queue.module';
 import { createDynamicGraphQlModulesForPlugins } from '../plugin/dynamic-plugin-api.module';
-import { SchedulerModule } from '../scheduler/scheduler.module';
 import { ServiceModule } from '../service/service.module';
 
 import { ConfigurableOperationCodec } from './common/configurable-operation-codec';
@@ -32,7 +31,6 @@ import { ProductOptionResolver } from './resolvers/admin/product-option.resolver
 import { ProductResolver } from './resolvers/admin/product.resolver';
 import { PromotionResolver } from './resolvers/admin/promotion.resolver';
 import { RoleResolver } from './resolvers/admin/role.resolver';
-import { ScheduledTaskResolver } from './resolvers/admin/scheduled-task.resolver';
 import { SearchResolver } from './resolvers/admin/search.resolver';
 import { SellerResolver } from './resolvers/admin/seller.resolver';
 import { ShippingMethodResolver } from './resolvers/admin/shipping-method.resolver';
@@ -114,7 +112,6 @@ const adminResolvers = [
     PromotionResolver,
     RoleResolver,
     SearchResolver,
-    ScheduledTaskResolver,
     ShippingMethodResolver,
     StockLocationResolver,
     TagResolver,
@@ -200,7 +197,6 @@ export class ApiSharedModule {}
     imports: [
         ApiSharedModule,
         JobQueueModule,
-        SchedulerModule,
         DataImportModule,
         ...createDynamicGraphQlModulesForPlugins('admin'),
     ],

+ 0 - 22
packages/core/src/api/resolvers/admin/scheduled-task.resolver.ts

@@ -1,22 +0,0 @@
-import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
-import { MutationUpdateScheduledTaskArgs, Permission } from '@vendure/common/lib/generated-types';
-
-import { SchedulerService } from '../../../scheduler/scheduler.service';
-import { Allow } from '../../decorators/allow.decorator';
-
-@Resolver()
-export class ScheduledTaskResolver {
-    constructor(private readonly schedulerService: SchedulerService) {}
-
-    @Query()
-    @Allow(Permission.ReadSettings, Permission.ReadSystem)
-    scheduledTasks() {
-        return this.schedulerService.getTaskList();
-    }
-
-    @Mutation()
-    @Allow(Permission.UpdateSettings, Permission.UpdateSystem)
-    updateScheduledTask(@Args() { input }: MutationUpdateScheduledTaskArgs) {
-        return this.schedulerService.updateTask(input);
-    }
-}

+ 1 - 1
packages/core/src/api/schema/admin-api/province.api.graphql

@@ -19,7 +19,7 @@ input ProvinceTranslationInput {
     languageCode: LanguageCode!
     name: String
 }
- 
+
 input CreateProvinceInput {
     code: String!
     translations: [ProvinceTranslationInput!]!

+ 0 - 24
packages/core/src/api/schema/admin-api/scheduled-task.api.graphql

@@ -1,24 +0,0 @@
-type Query {
-    scheduledTasks: [ScheduledTask!]!
-}
-
-input UpdateScheduledTaskInput {
-    id: String!
-    enabled: Boolean
-}
-
-type Mutation {
-    updateScheduledTask(input: UpdateScheduledTaskInput!): ScheduledTask!
-}
-
-type ScheduledTask {
-    id: String!
-    description: String!
-    schedule: String!
-    scheduleDescription: String!
-    lastExecutedAt: DateTime
-    nextExecutionAt: DateTime
-    isRunning: Boolean!
-    lastResult: JSON
-    enabled: Boolean!
-} 

+ 0 - 2
packages/core/src/config/config.module.ts

@@ -87,7 +87,6 @@ export class ConfigModule implements OnApplicationBootstrap, OnApplicationShutdo
         } = this.configService.authOptions;
         const { taxZoneStrategy, taxLineCalculationStrategy } = this.configService.taxOptions;
         const { jobQueueStrategy, jobBufferStorageStrategy } = this.configService.jobQueueOptions;
-        const { schedulerStrategy } = this.configService.schedulerOptions;
         const {
             mergeStrategy,
             checkoutMergeStrategy,
@@ -157,7 +156,6 @@ export class ConfigModule implements OnApplicationBootstrap, OnApplicationShutdo
             ...refundProcess,
             cacheStrategy,
             ...orderInterceptors,
-            schedulerStrategy,
         ];
     }
 

+ 0 - 5
packages/core/src/config/config.service.ts

@@ -18,7 +18,6 @@ import {
     PaymentOptions,
     PromotionOptions,
     RuntimeVendureConfig,
-    SchedulerOptions,
     ShippingOptions,
     SystemOptions,
     TaxOptions,
@@ -117,10 +116,6 @@ export class ConfigService implements VendureConfig {
         return this.activeConfig.jobQueueOptions;
     }
 
-    get schedulerOptions(): Required<SchedulerOptions> {
-        return this.activeConfig.schedulerOptions;
-    }
-
     get systemOptions(): Required<SystemOptions> {
         return this.activeConfig.systemOptions;
     }

+ 2 - 7
packages/core/src/config/default-config.ts

@@ -1,17 +1,15 @@
 import { LanguageCode } from '@vendure/common/lib/generated-types';
 import {
     DEFAULT_AUTH_TOKEN_HEADER_KEY,
-    DEFAULT_CHANNEL_TOKEN_KEY,
     SUPER_ADMIN_USER_IDENTIFIER,
     SUPER_ADMIN_USER_PASSWORD,
+    DEFAULT_CHANNEL_TOKEN_KEY,
 } from '@vendure/common/lib/shared-constants';
 import { randomBytes } from 'crypto';
 
 import { TypeORMHealthCheckStrategy } from '../health-check/typeorm-health-check-strategy';
 import { InMemoryJobQueueStrategy } from '../job-queue/in-memory-job-queue-strategy';
 import { InMemoryJobBufferStorageStrategy } from '../job-queue/job-buffer/in-memory-job-buffer-storage-strategy';
-import { NoopSchedulerStrategy } from '../scheduler/noop-scheduler-strategy';
-import { cleanSessionsTask } from '../scheduler/tasks/clean-sessions-task';
 
 import { DefaultAssetImportStrategy } from './asset-import-strategy/default-asset-import-strategy';
 import { DefaultAssetNamingStrategy } from './asset-naming-strategy/default-asset-naming-strategy';
@@ -26,6 +24,7 @@ import { DefaultProductVariantPriceCalculationStrategy } from './catalog/default
 import { DefaultProductVariantPriceSelectionStrategy } from './catalog/default-product-variant-price-selection-strategy';
 import { DefaultProductVariantPriceUpdateStrategy } from './catalog/default-product-variant-price-update-strategy';
 import { DefaultStockDisplayStrategy } from './catalog/default-stock-display-strategy';
+import { DefaultStockLocationStrategy } from './catalog/default-stock-location-strategy';
 import { MultiChannelStockLocationStrategy } from './catalog/multi-channel-stock-location-strategy';
 import { AutoIncrementIdStrategy } from './entity/auto-increment-id-strategy';
 import { DefaultMoneyStrategy } from './entity/default-money-strategy';
@@ -195,10 +194,6 @@ export const defaultConfig: RuntimeVendureConfig = {
         activeQueues: [],
         prefix: '',
     },
-    schedulerOptions: {
-        schedulerStrategy: new NoopSchedulerStrategy(),
-        tasks: [cleanSessionsTask],
-    },
     customFields: {
         Address: [],
         Administrator: [],

+ 0 - 33
packages/core/src/config/vendure-config.ts

@@ -9,8 +9,6 @@ import { DataSourceOptions } from 'typeorm';
 import { Middleware } from '../common';
 import { PermissionDefinition } from '../common/permission-definition';
 import { JobBufferStorageStrategy } from '../job-queue/job-buffer/job-buffer-storage-strategy';
-import { ScheduledTask } from '../scheduler/scheduled-task';
-import { SchedulerStrategy } from '../scheduler/scheduler-strategy';
 
 import { AssetImportStrategy } from './asset-import-strategy/asset-import-strategy';
 import { AssetNamingStrategy } from './asset-naming-strategy/asset-naming-strategy';
@@ -964,29 +962,6 @@ export interface JobQueueOptions {
     prefix?: string;
 }
 
-/**
- * @description
- * Options related to scheduled tasks..
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- */
-export interface SchedulerOptions {
-    /**
-     * @description
-     * The strategy used to execute scheduled tasks. If you are using the
-     * {@link DefaultSchedulerPlugin} (which is recommended) then this will be set to the
-     * {@link DefaultSchedulerStrategy}.
-     */
-    schedulerStrategy?: SchedulerStrategy;
-
-    /**
-     * @description
-     * The tasks to be executed.
-     */
-    tasks?: ScheduledTask[];
-}
-
 /**
  * @description
  * Options relating to the internal handling of entities.
@@ -1236,13 +1211,6 @@ export interface VendureConfig {
      * Configures how the job queue is persisted and processed.
      */
     jobQueueOptions?: JobQueueOptions;
-    /**
-     * @description
-     * Configures the scheduler mechanism and tasks.
-     *
-     * @since 3.3.0
-     */
-    schedulerOptions?: SchedulerOptions;
     /**
      * @description
      * Configures system options
@@ -1268,7 +1236,6 @@ export interface RuntimeVendureConfig extends Required<VendureConfig> {
     entityOptions: Required<Omit<EntityOptions, 'entityIdStrategy'>> & EntityOptions;
     importExportOptions: Required<ImportExportOptions>;
     jobQueueOptions: Required<JobQueueOptions>;
-    schedulerOptions: Required<SchedulerOptions>;
     orderOptions: Required<OrderOptions>;
     promotionOptions: Required<PromotionOptions>;
     shippingOptions: Required<ShippingOptions>;

+ 0 - 1
packages/core/src/index.ts

@@ -16,7 +16,6 @@ export * from './data-import/index';
 export * from './service/index';
 export * from './i18n/index';
 export * from './worker/index';
-export * from './scheduler/index';
 export * from '@vendure/common/lib/shared-types';
 export {
     Permission,

+ 0 - 2
packages/core/src/plugin/default-scheduler-plugin/constants.ts

@@ -1,2 +0,0 @@
-export const DEFAULT_SCHEDULER_PLUGIN_OPTIONS = Symbol('DEFAULT_SCHEDULER_PLUGIN_OPTIONS');
-export const DEFAULT_TIMEOUT = 60000;

+ 0 - 174
packages/core/src/plugin/default-scheduler-plugin/default-scheduler-strategy.ts

@@ -1,174 +0,0 @@
-import { UpdateScheduledTaskInput } from '@vendure/common/lib/generated-types';
-import { Cron } from 'croner';
-import ms from 'ms';
-
-import { Injector } from '../../common';
-import { assertFound } from '../../common/utils';
-import { Logger } from '../../config/logger/vendure-logger';
-import { TransactionalConnection } from '../../connection';
-import { ProcessContext } from '../../process-context';
-import { ScheduledTask } from '../../scheduler/scheduled-task';
-import { SchedulerStrategy, TaskReport } from '../../scheduler/scheduler-strategy';
-
-import { DEFAULT_SCHEDULER_PLUGIN_OPTIONS } from './constants';
-import { ScheduledTaskRecord } from './scheduled-task-record.entity';
-import { DefaultSchedulerPluginOptions } from './types';
-/**
- * @description
- * The default {@link SchedulerStrategy} implementation that uses the database to
- * execute scheduled tasks. This strategy is configured when you use the
- * {@link DefaultSchedulerPlugin}.
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- */
-export class DefaultSchedulerStrategy implements SchedulerStrategy {
-    private connection: TransactionalConnection;
-    private injector: Injector;
-    private processContext: ProcessContext;
-    private tasks: Map<string, { task: ScheduledTask; isRegistered: boolean }> = new Map();
-    private pluginOptions: DefaultSchedulerPluginOptions;
-    private runningTasks: ScheduledTask[] = [];
-
-    init(injector: Injector) {
-        this.connection = injector.get(TransactionalConnection);
-        this.processContext = injector.get(ProcessContext);
-        this.pluginOptions = injector.get(DEFAULT_SCHEDULER_PLUGIN_OPTIONS);
-        this.injector = injector;
-    }
-
-    async destroy() {
-        for (const task of this.runningTasks) {
-            await this.connection.rawConnection
-                .getRepository(ScheduledTaskRecord)
-                .update({ taskId: task.id }, { lockedAt: null });
-            Logger.info(`Released lock for task "${task.id}"`);
-        }
-    }
-
-    executeTask(task: ScheduledTask) {
-        return async (job: Cron) => {
-            if (this.processContext.isServer) {
-                return;
-            }
-            await this.ensureTaskIsRegistered(task);
-            const taskEntity = await this.connection.rawConnection
-                .getRepository(ScheduledTaskRecord)
-                .createQueryBuilder('task')
-                .update()
-                .set({ lockedAt: new Date() })
-                .where('taskId = :taskId', { taskId: task.id })
-                .andWhere('lockedAt IS NULL')
-                .andWhere('enabled = TRUE')
-                .execute();
-            if (!taskEntity.affected) {
-                return;
-            }
-
-            Logger.verbose(`Executing scheduled task "${task.id}"`);
-            try {
-                this.runningTasks.push(task);
-                const timeout = task.options.timeout ?? (this.pluginOptions.defaultTimeout as number);
-                const timeoutMs = typeof timeout === 'number' ? timeout : ms(timeout);
-
-                let timeoutTimer: NodeJS.Timeout | undefined;
-                const timeoutPromise = new Promise((_, reject) => {
-                    timeoutTimer = setTimeout(() => {
-                        Logger.warn(`Scheduled task ${task.id} timed out after ${timeoutMs}ms`);
-                        reject(new Error('Task timed out'));
-                    }, timeoutMs);
-                });
-
-                const result = await Promise.race([task.execute(this.injector), timeoutPromise]);
-
-                if (timeoutTimer) {
-                    clearTimeout(timeoutTimer);
-                }
-
-                await this.connection.rawConnection.getRepository(ScheduledTaskRecord).update(
-                    {
-                        taskId: task.id,
-                    },
-                    {
-                        lastExecutedAt: new Date(),
-                        lockedAt: null,
-                        lastResult: result ?? '',
-                    },
-                );
-                Logger.verbose(`Scheduled task "${task.id}" completed successfully`);
-                this.runningTasks = this.runningTasks.filter(t => t !== task);
-            } catch (error) {
-                let errorMessage = 'Unknown error';
-                if (error instanceof Error) {
-                    errorMessage = error.message;
-                }
-                Logger.error(`Scheduled task "${task.id}" failed with error: ${errorMessage}`);
-                await this.connection.rawConnection.getRepository(ScheduledTaskRecord).update(
-                    {
-                        taskId: task.id,
-                    },
-                    {
-                        lockedAt: null,
-                        lastResult: { error: errorMessage } as any,
-                    },
-                );
-                this.runningTasks = this.runningTasks.filter(t => t !== task);
-            }
-        };
-    }
-
-    getTasks(): Promise<TaskReport[]> {
-        return this.connection.rawConnection
-            .getRepository(ScheduledTaskRecord)
-            .createQueryBuilder('task')
-            .getMany()
-            .then(tasks => {
-                return tasks.map(task => this.entityToReport(task));
-            });
-    }
-
-    getTask(id: string): Promise<TaskReport | undefined> {
-        return this.connection.rawConnection
-            .getRepository(ScheduledTaskRecord)
-            .createQueryBuilder('task')
-            .where('task.taskId = :id', { id })
-            .getOne()
-            .then(task => (task ? this.entityToReport(task) : undefined));
-    }
-
-    async updateTask(input: UpdateScheduledTaskInput): Promise<TaskReport> {
-        await this.connection.rawConnection
-            .getRepository(ScheduledTaskRecord)
-            .createQueryBuilder('task')
-            .update()
-            .set({ enabled: input.enabled })
-            .where('taskId = :id', { id: input.id })
-            .execute();
-        return assertFound(this.getTask(input.id));
-    }
-
-    private entityToReport(task: ScheduledTaskRecord): TaskReport {
-        return {
-            id: task.taskId,
-            lastExecutedAt: task.lastExecutedAt,
-            isRunning: task.lockedAt !== null,
-            lastResult: task.lastResult,
-            enabled: task.enabled,
-        };
-    }
-
-    private async ensureTaskIsRegistered(task: ScheduledTask) {
-        if (!this.tasks.get(task.id)?.isRegistered) {
-            await this.connection.rawConnection
-                .getRepository(ScheduledTaskRecord)
-                .createQueryBuilder()
-                .insert()
-                .into(ScheduledTaskRecord)
-                .values({ taskId: task.id })
-                .orIgnore()
-                .execute();
-
-            this.tasks.set(task.id, { task, isRegistered: true });
-        }
-    }
-}

+ 0 - 59
packages/core/src/plugin/default-scheduler-plugin/default-scheduler.plugin.ts

@@ -1,59 +0,0 @@
-import { PluginCommonModule } from '../../plugin/plugin-common.module';
-import { VendurePlugin } from '../../plugin/vendure-plugin';
-
-import { DEFAULT_SCHEDULER_PLUGIN_OPTIONS, DEFAULT_TIMEOUT } from './constants';
-import { DefaultSchedulerStrategy } from './default-scheduler-strategy';
-import { ScheduledTaskRecord } from './scheduled-task-record.entity';
-import { DefaultSchedulerPluginOptions } from './types';
-
-/**
- * @description
- * This plugin configures a default scheduling strategy that executes scheduled
- * tasks using the database to ensure that each task is executed exactly once
- * at the scheduled time, even if there are multiple instances of the worker
- * running.
- *
- * @example
- * ```ts
- * import { DefaultSchedulerPlugin, VendureConfig } from '@vendure/core';
- *
- * export const config: VendureConfig = {
- *   plugins: [
- *     DefaultSchedulerPlugin.init({
- *       // The default is 60s, but you can override it here
- *       defaultTimeout: '10s',
- *     }),
- *   ],
- * };
- * ```
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- * @docsPage DefaultSchedulerPlugin
- * @docsWeight 0
- */
-@VendurePlugin({
-    imports: [PluginCommonModule],
-    entities: [ScheduledTaskRecord],
-    configuration: config => {
-        config.schedulerOptions.schedulerStrategy = new DefaultSchedulerStrategy();
-        return config;
-    },
-    providers: [
-        {
-            provide: DEFAULT_SCHEDULER_PLUGIN_OPTIONS,
-            useValue: DefaultSchedulerPlugin.options,
-        },
-    ],
-    compatibility: '>0.0.0',
-})
-export class DefaultSchedulerPlugin {
-    static options: DefaultSchedulerPluginOptions = {
-        defaultTimeout: DEFAULT_TIMEOUT,
-    };
-
-    static init(config?: DefaultSchedulerPluginOptions) {
-        this.options = { ...this.options, ...(config || {}) };
-        return this;
-    }
-}

+ 0 - 26
packages/core/src/plugin/default-scheduler-plugin/scheduled-task-record.entity.ts

@@ -1,26 +0,0 @@
-import { Column, Entity, Unique } from 'typeorm';
-
-import { VendureEntity } from '../../entity/base/base.entity';
-
-@Entity()
-@Unique(['taskId'])
-export class ScheduledTaskRecord extends VendureEntity {
-    constructor(input: Partial<ScheduledTaskRecord>) {
-        super(input);
-    }
-
-    @Column()
-    taskId: string;
-
-    @Column({ default: true })
-    enabled: boolean;
-
-    @Column({ nullable: true, type: 'datetime', precision: 3 })
-    lockedAt: Date | null;
-
-    @Column({ nullable: true, type: 'datetime', precision: 3 })
-    lastExecutedAt: Date | null;
-
-    @Column({ type: 'json', nullable: true })
-    lastResult: Record<string, any> | string | number | null;
-}

+ 0 - 17
packages/core/src/plugin/default-scheduler-plugin/types.ts

@@ -1,17 +0,0 @@
-/**
- * @description
- * The options for the {@link DefaultSchedulerPlugin}.
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- * @docsPage DefaultSchedulerPlugin
- */
-export interface DefaultSchedulerPluginOptions {
-    /**
-     * @description
-     * The default timeout for scheduled tasks.
-     *
-     * @default 60_000ms
-     */
-    defaultTimeout?: string | number;
-}

+ 0 - 1
packages/core/src/plugin/index.ts

@@ -4,7 +4,6 @@ export * from './default-job-queue-plugin/job-record-buffer.entity';
 export * from './default-job-queue-plugin/sql-job-buffer-storage-strategy';
 export * from './default-cache-plugin/default-cache-plugin';
 export * from './default-cache-plugin/sql-cache-strategy';
-export * from './default-scheduler-plugin/default-scheduler.plugin';
 export * from './redis-cache-plugin/redis-cache-plugin';
 export * from './redis-cache-plugin/redis-cache-strategy';
 export * from './redis-cache-plugin/types';

+ 0 - 4
packages/core/src/scheduler/index.ts

@@ -1,4 +0,0 @@
-export * from './tasks/clean-sessions-task';
-export * from './scheduled-task';
-export * from './scheduler.service';
-export * from './scheduler-strategy';

+ 0 - 25
packages/core/src/scheduler/noop-scheduler-strategy.ts

@@ -1,25 +0,0 @@
-import { UpdateScheduledTaskInput } from '@vendure/common/lib/generated-types';
-
-import { Logger } from '../config/logger/vendure-logger';
-
-import { ScheduledTask } from './scheduled-task';
-import { SchedulerStrategy, TaskReport } from './scheduler-strategy';
-
-export class NoopSchedulerStrategy implements SchedulerStrategy {
-    getTasks(): Promise<TaskReport[]> {
-        return Promise.resolve([]);
-    }
-
-    getTask(id: string): Promise<TaskReport | undefined> {
-        return Promise.resolve(undefined);
-    }
-
-    executeTask(task: ScheduledTask) {
-        Logger.warn(`No task scheduler is configured! The task ${task.id} will not be executed.`);
-        return () => Promise.resolve();
-    }
-
-    updateTask(input: UpdateScheduledTaskInput): Promise<TaskReport> {
-        throw new Error(`Not implemented`);
-    }
-}

+ 0 - 138
packages/core/src/scheduler/scheduled-task.ts

@@ -1,138 +0,0 @@
-import CronTime from 'cron-time-generator';
-
-import { Injector } from '../common/index';
-/**
- * @description
- * The configuration for a scheduled task.
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- * @docsPage ScheduledTask
- */
-export interface ScheduledTaskConfig<C extends Record<string, any> = Record<string, any>> {
-    /**
-     * @description
-     * The unique identifier for the scheduled task.
-     */
-    id: string;
-    /**
-     * @description
-     * The description for the scheduled task.
-     */
-    description?: string;
-    /**
-     * @description
-     * Optional parameters that will be passed to the `execute` function.
-     */
-    params?: C;
-    /**
-     * @description
-     * The cron schedule for the scheduled task. This can be a standard cron expression or
-     * a function that returns a [cron-time-generator](https://www.npmjs.com/package/cron-time-generator)
-     * expression.
-     *
-     * @example
-     * ```ts
-     * // Standard cron expression
-     * { schedule: '0 0-23/5 * * *', } // every 5 hours
-     * { schedule: '0 22 * * *', } // every day at 10:00 PM
-     *
-     * // Cron-time-generator expression
-     * { schedule: cronTime => cronTime.every(2).minutes(), }
-     * { schedule: cronTime => cronTime.every(5).hours(), }
-     * ```
-     */
-    schedule: string | ((cronTime: typeof CronTime) => string);
-    /**
-     * @description
-     * The timeout for the scheduled task. If the task takes longer than the timeout, the task
-     * will be considered to have failed with a timeout error.
-     *
-     * @default 60_000ms
-     */
-    timeout?: number | string;
-    /**
-     * @description
-     * Whether the scheduled task should be prevented from running if it is already running.
-     *
-     * @default true
-     */
-    preventOverlap?: boolean;
-    /**
-     * @description
-     * The function that will be executed when the scheduled task is run.
-     */
-    execute(injector: Injector, config: C): Promise<any>;
-}
-
-/**
- * @description
- * Use this class to define a scheduled task that will be executed at a given cron schedule.
- *
- * @example
- * ```ts
- * import { ScheduledTask } from '\@vendure/core';
- *
- * const task = new ScheduledTask({
- *     id: 'test-job',
- *     schedule: cron => cron.every(2).minutes(),
- *     execute: async (injector, params) => {
- *         // some logic here
- *     },
- * });
- * ```
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- * @docsPage ScheduledTask
- * @docsWeight 0
- */
-export class ScheduledTask<C extends Record<string, any> = Record<string, any>> {
-    constructor(private readonly config: ScheduledTaskConfig<C>) {}
-
-    get id() {
-        return this.config.id;
-    }
-
-    get options() {
-        return this.config;
-    }
-
-    async execute(injector: Injector) {
-        return this.config.execute(injector, this.config.params ?? ({} as any));
-    }
-
-    /**
-     * @description
-     * This method allows you to further configure existing scheduled tasks. For example, you may
-     * wish to change the schedule or timeout of a task, without having to define a new task.
-     *
-     * @example
-     * ```ts
-     * import { ScheduledTask } from '\@vendure/core';
-     *
-     * const task = new ScheduledTask({
-     *     id: 'test-job',
-     *     schedule: cron => cron.every(2).minutes(),
-     *     execute: async (injector, params) => {
-     *         // some logic here
-     *     },
-     * });
-     *
-     * // later, you can configure the task
-     * task.configure({ schedule: cron => cron.every(5).minutes() });
-     * ```
-     */
-    configure(additionalConfig: Partial<Pick<ScheduledTaskConfig<C>, 'schedule' | 'timeout' | 'params'>>) {
-        if (additionalConfig.schedule) {
-            this.config.schedule = additionalConfig.schedule;
-        }
-        if (additionalConfig.timeout) {
-            this.config.timeout = additionalConfig.timeout;
-        }
-        if (additionalConfig.params) {
-            this.config.params = additionalConfig.params;
-        }
-        return this;
-    }
-}

+ 0 - 71
packages/core/src/scheduler/scheduler-strategy.ts

@@ -1,71 +0,0 @@
-import { UpdateScheduledTaskInput } from '@vendure/common/lib/generated-types';
-import { Cron } from 'croner';
-
-import { InjectableStrategy } from '../common';
-
-import { ScheduledTask } from './scheduled-task';
-
-/**
- * @description
- * A report on the status of a scheduled task.
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- * @docsPage SchedulerStrategy
- */
-export interface TaskReport {
-    id: string;
-    lastExecutedAt: Date | null;
-    isRunning: boolean;
-    lastResult: any;
-    enabled: boolean;
-}
-
-/**
- * @description
- * This strategy is used to define the mechanism by which scheduled tasks are executed
- * and how they are reported on. The main purpose of this strategy is to ensure
- * that a given task is executed exactly once at the scheduled time, even if there
- * are multiple instances of the worker running.
- *
- * To do this, the strategy must use some form of shared storage and a method of
- * locking so that only a single worker is allowed to execute the task.
- *
- * By default, the {@link DefaultSchedulerStrategy} will use the database to enable
- * this functionality.
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- * @docsPage SchedulerStrategy
- * @docsWeight 0
- */
-export interface SchedulerStrategy extends InjectableStrategy {
-    /**
-     * @description
-     * Execute a scheduled task. This method must also take care of
-     * ensuring that the task is executed exactly once at the scheduled time,
-     * even if there are multiple instances of the worker running.
-     *
-     * For instance, in the {@link DefaultSchedulerStrategy} we make use of a
-     * dedicated database table and a locking mechansim. If you implement a custom
-     * SchedulerStrategy, you must use some other form of shared locking mechanism
-     * that could make use of something like Redis etc. to ensure that the task
-     * is executed exactly once at the scheduled time.
-     */
-    executeTask(task: ScheduledTask): (job: Cron) => Promise<any> | any;
-    /**
-     * @description
-     * Get all scheduled tasks.
-     */
-    getTasks(): Promise<TaskReport[]>;
-    /**
-     * @description
-     * Get a single scheduled task by its id.
-     */
-    getTask(id: string): Promise<TaskReport | undefined>;
-    /**
-     * @description
-     * Update a scheduled task.
-     */
-    updateTask(input: UpdateScheduledTaskInput): Promise<TaskReport>;
-}

+ 0 - 12
packages/core/src/scheduler/scheduler.module.ts

@@ -1,12 +0,0 @@
-import { Module } from '@nestjs/common';
-
-import { ConfigModule } from '../config/index';
-
-import { SchedulerService } from './scheduler.service';
-
-@Module({
-    imports: [ConfigModule],
-    providers: [SchedulerService],
-    exports: [SchedulerService],
-})
-export class SchedulerModule {}

+ 0 - 132
packages/core/src/scheduler/scheduler.service.ts

@@ -1,132 +0,0 @@
-import { Injectable, OnApplicationBootstrap } from '@nestjs/common';
-import { UpdateScheduledTaskInput } from '@vendure/common/lib/generated-types';
-import CronTime from 'cron-time-generator';
-import { Cron } from 'croner';
-import cronstrue from 'cronstrue';
-
-import { ConfigService } from '../config/config.service';
-import { Logger } from '../config/logger/vendure-logger';
-
-import { NoopSchedulerStrategy } from './noop-scheduler-strategy';
-import { ScheduledTask } from './scheduled-task';
-import { TaskReport } from './scheduler-strategy';
-
-export interface TaskInfo {
-    id: string;
-    description: string;
-    schedule: string;
-    scheduleDescription: string;
-    lastExecutedAt: Date | null;
-    nextExecutionAt: Date | null;
-    isRunning: boolean;
-    lastResult: any;
-    enabled: boolean;
-}
-
-/**
- * @description
- * The service that is responsible for setting up and querying the scheduled tasks.
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- */
-@Injectable()
-export class SchedulerService implements OnApplicationBootstrap {
-    private jobs: Map<string, { task: ScheduledTask; job: Cron }> = new Map();
-    constructor(private configService: ConfigService) {}
-
-    onApplicationBootstrap() {
-        const schedulerStrategy = this.configService.schedulerOptions.schedulerStrategy;
-        if (!schedulerStrategy || schedulerStrategy instanceof NoopSchedulerStrategy) {
-            Logger.warn('No scheduler strategy is configured! Scheduled tasks will not be executed.');
-            Logger.warn(
-                'Please use the `DefaultSchedulerPlugin` (or alternative) to enable scheduled tasks.',
-            );
-            return;
-        }
-        const scheduledTasks = this.configService.schedulerOptions.tasks ?? [];
-
-        for (const task of scheduledTasks) {
-            const job = this.createCronJob(task);
-            const pattern = job.getPattern();
-            if (!pattern) {
-                Logger.warn(`Invalid cron pattern for task ${task.id}`);
-                continue;
-            } else {
-                const schedule = cronstrue.toString(pattern);
-                Logger.info(`Registered scheduled task: ${task.id} - ${schedule}`);
-                this.jobs.set(task.id, { task, job });
-            }
-        }
-    }
-
-    /**
-     * @description
-     * Returns a list of all the scheduled tasks and their current status.
-     */
-    getTaskList(): Promise<TaskInfo[]> {
-        return this.configService.schedulerOptions.schedulerStrategy
-            .getTasks()
-            .then(taskReports =>
-                taskReports.map(taskReport => this.createTaskInfo(taskReport)).filter(x => x !== undefined),
-            );
-    }
-
-    updateTask(input: UpdateScheduledTaskInput): Promise<TaskInfo> {
-        return this.configService.schedulerOptions.schedulerStrategy.updateTask(input).then(taskReport => {
-            const taskInfo = this.createTaskInfo(taskReport);
-            if (!taskInfo) {
-                throw new Error(`Task ${input.id} not found`);
-            }
-            return taskInfo;
-        });
-    }
-
-    private createTaskInfo(taskReport: TaskReport): TaskInfo | undefined {
-        const job = this.jobs.get(taskReport.id)?.job;
-        const task = this.jobs.get(taskReport.id)?.task;
-        if (!job || !task) {
-            return;
-        }
-
-        const pattern = job.getPattern();
-        return {
-            id: taskReport.id,
-            description: task.options.description ?? '',
-            schedule: pattern ?? 'unknown',
-            scheduleDescription: pattern ? cronstrue.toString(pattern) : 'unknown',
-            lastExecutedAt: taskReport.lastExecutedAt,
-            nextExecutionAt: job.nextRun(),
-            isRunning: taskReport.isRunning,
-            lastResult: taskReport.lastResult,
-            enabled: taskReport.enabled,
-        };
-    }
-
-    private createCronJob(task: ScheduledTask) {
-        const schedulerStrategy = this.configService.schedulerOptions.schedulerStrategy;
-        const protectCallback = (_job: Cron) => {
-            const currentRun = _job.currentRun();
-            if (currentRun) {
-                Logger.warn(
-                    `Task invocation of ${task.id} at ${new Date().toISOString()} was blocked because an existing task is still running at ${currentRun.toISOString()}`,
-                );
-            }
-        };
-
-        const schedule =
-            typeof task.options.schedule === 'function'
-                ? task.options.schedule(CronTime)
-                : task.options.schedule;
-
-        const job = new Cron(
-            schedule,
-            {
-                name: task.id,
-                protect: task.options.preventOverlap ? protectCallback : undefined,
-            },
-            () => schedulerStrategy.executeTask(task)(job),
-        );
-        return job;
-    }
-}

+ 0 - 49
packages/core/src/scheduler/tasks/clean-sessions-task.ts

@@ -1,49 +0,0 @@
-import { SessionService } from '../../service/services/session.service';
-import { ScheduledTask } from '../scheduled-task';
-
-/**
- * @description
- * A scheduled task that cleans expired & inactive sessions from the database.
- *
- * @example
- * ```ts
- * import { cleanSessionsTask, VendureConfig } from '\@vendure/core';
- *
- * export const config: VendureConfig = {
- *   // ...
- *   schedulerOptions: {
- *     tasks: [
- *       // Use the task as is
- *       cleanSessionsTask,
- *       // or configure the task
- *       cleanSessionsTask.configure({
- *         // Run the task every day at 3:00am
- *         // The default schedule is every day at 00:00am
- *         schedule: cron => cron.everyDayAt(3, 0),
- *         params: {
- *           // How many sessions to process in each batch
- *           // Default: 10_000
- *           batchSize: 5_000,
- *         },
- *       }),
- *     ],
- *   },
- * };
- * ```
- *
- * @since 3.3.0
- * @docsCategory scheduled-tasks
- */
-export const cleanSessionsTask = new ScheduledTask({
-    id: 'clean-sessions',
-    description: 'Clean expired & inactive sessions from the database',
-    params: {
-        batchSize: 10_000,
-    },
-    schedule: cron => cron.everyDayAt(0, 0),
-    async execute(injector, params) {
-        const sessionService = injector.get(SessionService);
-        await sessionService.triggerCleanSessionsJob(params.batchSize);
-        return { result: 'Triggered clean sessions job' };
-    },
-});

+ 1 - 2
packages/core/src/service/service.module.ts

@@ -5,7 +5,6 @@ import { ConfigModule } from '../config/config.module';
 import { ConnectionModule } from '../connection/connection.module';
 import { EventBusModule } from '../event-bus/event-bus.module';
 import { JobQueueModule } from '../job-queue/job-queue.module';
-import { SchedulerModule } from '../scheduler/scheduler.module';
 
 import { ActiveOrderService } from './helpers/active-order/active-order.service';
 import { ConfigArgService } from './helpers/config-arg/config-arg.service';
@@ -141,7 +140,7 @@ const helpers = [
  * only run a single time.
  */
 @Module({
-    imports: [ConnectionModule, ConfigModule, EventBusModule, CacheModule, JobQueueModule, SchedulerModule],
+    imports: [ConnectionModule, ConfigModule, EventBusModule, CacheModule, JobQueueModule],
     providers: [...services, ...helpers, InitializerService],
     exports: [...services, ...helpers],
 })

+ 4 - 62
packages/core/src/service/services/session.service.ts

@@ -1,11 +1,10 @@
-import { Injectable, OnApplicationBootstrap } from '@nestjs/common';
+import { Injectable } from '@nestjs/common';
 import { ID } from '@vendure/common/lib/shared-types';
 import crypto from 'crypto';
 import ms from 'ms';
-import { Brackets, EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
+import { EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from 'typeorm';
 
 import { RequestContext } from '../../api/common/request-context';
-import { Logger } from '../../config';
 import { ConfigService } from '../../config/config.service';
 import { CachedSession, SessionCacheStrategy } from '../../config/session-cache/session-cache-strategy';
 import { TransactionalConnection } from '../../connection/transactional-connection';
@@ -16,12 +15,10 @@ import { AnonymousSession } from '../../entity/session/anonymous-session.entity'
 import { AuthenticatedSession } from '../../entity/session/authenticated-session.entity';
 import { Session } from '../../entity/session/session.entity';
 import { User } from '../../entity/user/user.entity';
-import { JobQueue } from '../../job-queue/job-queue';
-import { JobQueueService } from '../../job-queue/job-queue.service';
-import { RequestContextService } from '../helpers/request-context/request-context.service';
 import { getUserChannelsPermissions } from '../helpers/utils/get-user-channels-permissions';
 
 import { OrderService } from './order.service';
+
 /**
  * @description
  * Contains methods relating to {@link Session} entities.
@@ -29,9 +26,8 @@ import { OrderService } from './order.service';
  * @docsCategory services
  */
 @Injectable()
-export class SessionService implements EntitySubscriberInterface, OnApplicationBootstrap {
+export class SessionService implements EntitySubscriberInterface {
     private sessionCacheStrategy: SessionCacheStrategy;
-    private cleanSessionsJobQueue: JobQueue<{ batchSize: number }>;
     private readonly sessionDurationInMs: number;
     private readonly sessionCacheTimeoutMs = 50;
 
@@ -39,8 +35,6 @@ export class SessionService implements EntitySubscriberInterface, OnApplicationB
         private connection: TransactionalConnection,
         private configService: ConfigService,
         private orderService: OrderService,
-        private jobQueueService: JobQueueService,
-        private requestContextService: RequestContextService,
     ) {
         this.sessionCacheStrategy = this.configService.authOptions.sessionCacheStrategy;
 
@@ -53,22 +47,6 @@ export class SessionService implements EntitySubscriberInterface, OnApplicationB
         this.connection.rawConnection.subscribers.push(this);
     }
 
-    async onApplicationBootstrap() {
-        this.cleanSessionsJobQueue = await this.jobQueueService.createQueue({
-            name: 'clean-sessions',
-            process: async job => {
-                const ctx = await this.requestContextService.create({
-                    apiType: 'admin',
-                });
-                const result = await this.cleanExpiredSessions(ctx, job.data.batchSize);
-                return {
-                    batchSize: job.data.batchSize,
-                    sessionsRemoved: result,
-                };
-            },
-        });
-    }
-
     /** @internal */
     async afterInsert(event: InsertEvent<any>): Promise<any> {
         await this.clearSessionCacheOnDataChange(event);
@@ -320,42 +298,6 @@ export class SessionService implements EntitySubscriberInterface, OnApplicationB
         }
     }
 
-    /**
-     * @description
-     * Triggers the clean sessions job.
-     */
-    async triggerCleanSessionsJob(batchSize: number) {
-        await this.cleanSessionsJobQueue.add({ batchSize });
-    }
-
-    /**
-     * @description
-     * Cleans expired sessions from the database & the session cache.
-     */
-    async cleanExpiredSessions(ctx: RequestContext, batchSize: number) {
-        const sessions = await this.connection
-            .getRepository(ctx, Session)
-            .createQueryBuilder('session')
-            .where('session.expires < :now', { now: new Date() })
-            .orWhere(
-                new Brackets(qb1 => {
-                    qb1.where('session.userId IS NULL')
-                        .andWhere('session.activeOrderId IS NULL')
-                        .andWhere('session.updatedAt < :updatedAt', {
-                            updatedAt: new Date(Date.now() - ms('7d')),
-                        });
-                }),
-            )
-            .take(batchSize)
-            .getMany();
-        Logger.verbose(`Cleaning ${sessions.length} expired sessions`);
-        await this.connection.getRepository(ctx, Session).remove(sessions);
-        for (const session of sessions) {
-            await this.withTimeout(this.sessionCacheStrategy.delete(session.token));
-        }
-        Logger.verbose(`Cleaned ${sessions.length} expired sessions`);
-        return sessions.length;
-    }
     /**
      * If we are over half way to the current session's expiry date, then we update it.
      *

+ 0 - 2
packages/create/templates/vendure-config.hbs

@@ -1,7 +1,6 @@
 import {
     dummyPaymentHandler,
     DefaultJobQueuePlugin,
-    DefaultSchedulerPlugin,
     DefaultSearchPlugin,
     VendureConfig,
 } from '@vendure/core';
@@ -83,7 +82,6 @@ export const config: VendureConfig = {
             // to be set manually to match your production url.
             assetUrlPrefix: IS_DEV ? undefined : 'https://www.my-shop.com/assets/',
         }),
-        DefaultSchedulerPlugin.init(),
         DefaultJobQueuePlugin.init({ useDatabaseForBuffer: true }),
         DefaultSearchPlugin.init({ bufferUpdates: false, indexStockStatus: true }),
         EmailPlugin.init({

+ 8 - 7
packages/dashboard/src/app/routes/_authenticated/_system/job-queue.tsx

@@ -1,13 +1,14 @@
-import { Badge } from '@/components/ui/badge.js';
-import { Button } from '@/components/ui/button.js';
 import { ListPage } from '@/framework/page/list-page.js';
-import { api } from '@/graphql/api.js';
 import { Trans } from '@/lib/trans.js';
 import { createFileRoute } from '@tanstack/react-router';
-import { formatRelative } from 'date-fns';
-import { Ban, CheckCircle2Icon, CircleXIcon, ClockIcon, LoaderIcon, RotateCcw } from 'lucide-react';
-import { PayloadDialog } from './components/payload-dialog.js';
 import { jobListDocument, jobQueueListDocument } from './job-queue.graphql.js';
+import { Badge } from '@/components/ui/badge.js';
+import { Button } from '@/components/ui/button.js';
+import { PayloadDialog } from './components/payload-dialog.js';
+import { differenceInMilliseconds, formatDuration, formatRelative } from 'date-fns';
+import { Ban, CircleXIcon, ClockIcon, LoaderIcon, RotateCcw } from 'lucide-react';
+import { CheckCircle2Icon } from 'lucide-react';
+import { api } from '@/graphql/api.js';
 
 export const Route = createFileRoute('/_authenticated/_system/job-queue')({
     component: JobQueuePage,
@@ -57,7 +58,7 @@ function JobQueuePage() {
             customizeColumns={{
                 createdAt: {
                     header: 'Created At',
-                    cell: ({ row }) => <div title={row.original.createdAt}>{formatRelative(new Date(row.original.createdAt), new Date())}</div>,
+                    cell: ({ row }) => formatRelative(row.original.createdAt, new Date()),
                 },
                 data: {
                     header: 'Data',

+ 0 - 206
packages/dashboard/src/app/routes/_authenticated/_system/scheduled-tasks.tsx

@@ -1,206 +0,0 @@
-import { FullWidthPageBlock, Page, PageLayout, PageTitle } from '@/framework/layout-engine/page-layout.js';
-import { api } from '@/graphql/api.js';
-import { graphql } from '@/graphql/graphql.js';
-import { DataTable } from '@/components/data-table/data-table.js';
-import { Trans } from '@/lib/trans.js';
-import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
-import { createFileRoute } from '@tanstack/react-router';
-import { createColumnHelper } from '@tanstack/react-table';
-import { ResultOf } from '@/graphql/graphql.js';
-import { PayloadDialog } from './components/payload-dialog.js';
-import { Button } from '@/components/ui/button.js';
-import { Badge } from '@/components/ui/badge.js';
-import { useLocalFormat } from '@/hooks/use-local-format.js';
-import {
-    DropdownMenu,
-    DropdownMenuContent,
-    DropdownMenuItem,
-    DropdownMenuTrigger,
-} from '@/components/ui/dropdown-menu.js';
-import { EllipsisIcon } from 'lucide-react';
-
-export const Route = createFileRoute('/_authenticated/_system/scheduled-tasks')({
-    component: ScheduledTasksPage,
-    loader: () => ({ breadcrumb: () => <Trans>Scheduled Tasks</Trans> }),
-});
-
-const getScheduledTasksDocument = graphql(`
-    query ScheduledTasks {
-        scheduledTasks {
-            id
-            description
-            schedule
-            scheduleDescription
-            lastExecutedAt
-            nextExecutionAt
-            isRunning
-            lastResult
-            enabled
-        }
-    }
-`);
-
-const updateScheduledTaskDocument = graphql(`
-    mutation UpdateScheduledTask($input: UpdateScheduledTaskInput!) {
-        updateScheduledTask(input: $input) {
-            id
-            enabled
-        }
-    }
-`);
-
-type ScheduledTask = ResultOf<typeof getScheduledTasksDocument>['scheduledTasks'][number];
-
-function ScheduledTasksPage() {
-    const { data } = useQuery({
-        queryKey: ['scheduledTasks'],
-        queryFn: () => api.query(getScheduledTasksDocument),
-    });
-    const queryClient = useQueryClient();
-    const { mutate: updateScheduledTask } = useMutation({
-        mutationFn: api.mutate(updateScheduledTaskDocument),
-        onSuccess: () => {
-            queryClient.invalidateQueries({ queryKey: ['scheduledTasks'] });
-        },
-    });
-    const { formatDate, formatRelativeDate } = useLocalFormat();
-    const intlDateOptions = {
-        year: 'numeric',
-        month: 'short',
-        day: 'numeric',
-        hour: 'numeric',
-        minute: 'numeric',
-        second: 'numeric',
-    } as const;
-
-    const columnHelper = createColumnHelper<ScheduledTask>();
-    const columns = [
-        columnHelper.accessor('id', {
-            header: 'ID',
-        }),
-        columnHelper.accessor('description', {
-            header: 'Description',
-        }),
-        columnHelper.accessor('enabled', {
-            header: 'Enabled',
-            cell: ({ row }) => {
-                return row.original.enabled ? (
-                    <Badge variant="success">
-                        <Trans>Enabled</Trans>
-                    </Badge>
-                ) : (
-                    <Badge variant="secondary">
-                        <Trans>Disabled</Trans>
-                    </Badge>
-                );
-            },
-        }),
-        columnHelper.accessor('schedule', {
-            header: 'Schedule Pattern',
-        }),
-        columnHelper.accessor('scheduleDescription', {
-            header: 'Schedule',
-        }),
-        columnHelper.accessor('lastExecutedAt', {
-            header: 'Last Executed',
-            cell: ({ row }) => {
-                return row.original.lastExecutedAt ? (
-                    <div title={row.original.lastExecutedAt}>
-                        {formatRelativeDate(row.original.lastExecutedAt)}
-                    </div>
-                ) : (
-                    <Trans>Never</Trans>
-                );
-            },
-        }),
-        columnHelper.accessor('nextExecutionAt', {
-            header: 'Next Execution',
-            cell: ({ row }) => {
-                return row.original.nextExecutionAt ? (
-                    formatDate(row.original.nextExecutionAt, intlDateOptions)
-                ) : (
-                    <Trans>Never</Trans>
-                );
-            },
-        }),
-        columnHelper.accessor('isRunning', {
-            header: 'Running',
-            cell: ({ row }) => {
-                return row.original.isRunning ? (
-                    <Badge variant="success">
-                        <Trans>Running</Trans>
-                    </Badge>
-                ) : (
-                    <Badge variant="secondary">
-                        <Trans>Not Running</Trans>
-                    </Badge>
-                );
-            },
-        }),
-        columnHelper.accessor('lastResult', {
-            header: 'Last Result',
-            cell: ({ row }) => {
-                return row.original.lastResult ? (
-                    <PayloadDialog
-                        payload={row.original.lastResult}
-                        title={<Trans>View task result</Trans>}
-                        description={<Trans>The result of the task</Trans>}
-                        trigger={
-                            <Button size="sm" variant="secondary">
-                                View result
-                            </Button>
-                        }
-                    />
-                ) : (
-                    <div className="text-muted-foreground">
-                        <Trans>No result yet</Trans>
-                    </div>
-                );
-            },
-        }),
-        columnHelper.display({
-            id: 'actions',
-            header: 'Actions',
-            cell: ({ row }) => {
-                return (
-                    <DropdownMenu>
-                        <DropdownMenuTrigger asChild>
-                            <Button variant="ghost" size="icon">
-                                <EllipsisIcon />
-                            </Button>
-                        </DropdownMenuTrigger>
-                        <DropdownMenuContent>
-                            <DropdownMenuItem
-                                onClick={() =>
-                                    updateScheduledTask({
-                                        input: { id: row.original.id, enabled: !row.original.enabled },
-                                    })
-                                }
-                            >
-                                {row.original.enabled ? <Trans>Disable</Trans> : <Trans>Enable</Trans>}
-                            </DropdownMenuItem>
-                        </DropdownMenuContent>
-                    </DropdownMenu>
-                );
-            },
-        }),
-    ];
-
-    return (
-        <Page pageId="scheduled-tasks-list">
-            <PageTitle>Scheduled Tasks</PageTitle>
-            <PageLayout>
-                <FullWidthPageBlock blockId="list-table">
-                    <DataTable
-                        columns={columns}
-                        data={data?.scheduledTasks ?? []}
-                        totalItems={data?.scheduledTasks?.length ?? 0}
-                        defaultColumnVisibility={{
-                            schedule: false,
-                        }}
-                    />
-                </FullWidthPageBlock>
-            </PageLayout>
-        </Page>
-    );
-}

Some files were not shown because too many files changed in this diff