feat(translation,fulfillment,customer,product,region,tax,core-flows,medusa,types): Implement dynamic translation settings management (#14536)

* Add is_active field to translation_settings model

* Types

* Workflows

* Api layer

* Tests

* Add changeset

* Add comment

* Hook to create or deactivate translatable entities on startup

* Cleanup old code

* Configure translatable option for core entities

* Validation step and snake case correction

* Cleanup

* Tests

* Comment in PR

* Update changeset

* Mock DmlEntity.getTranslatableEntities

* Move validation to module service layer

* Remove validation from remaining workflow

* Return object directly

* Type improvements

* Remove .only from tests

* Apply snakeCase

* Fix tests

* Fix tests

* Remove unnecessary map and use set instead

* Fix tests

* Comments

* Include translatable product properties

* Avoid race condition in translations tests

* Update test
This commit is contained in:
Nicolas Gorga
2026-01-14 07:09:49 -03:00
committed by GitHub
parent 42235825ee
commit d60ea7268a
50 changed files with 1397 additions and 199 deletions

View File

@@ -5,6 +5,7 @@ import {
} from "@medusajs/framework"
import {
AdminBatchTranslations,
AdminBatchTranslationSettings,
AdminGetTranslationsParams,
AdminTranslationEntitiesParams,
AdminTranslationSettingsParams,
@@ -44,6 +45,11 @@ export const adminTranslationsRoutesMiddlewares: MiddlewareRoute[] = [
validateAndTransformQuery(AdminTranslationSettingsParams, {}),
],
},
{
method: ["POST"],
matcher: "/admin/translations/settings/batch",
middlewares: [validateAndTransformBody(AdminBatchTranslationSettings)],
},
{
method: ["GET"],
matcher: "/admin/translations/entities",

View File

@@ -0,0 +1,39 @@
import { batchTranslationSettingsWorkflow } from "@medusajs/core-flows"
import { AuthenticatedMedusaRequest, MedusaResponse } from "@medusajs/framework"
import { defineFileConfig, FeatureFlag } from "@medusajs/framework/utils"
import { HttpTypes } from "@medusajs/types"
import TranslationFeatureFlag from "../../../../../feature-flags/translation"
import { AdminBatchTranslationSettingsType } from "../../validators"
/**
* @since 2.12.5
* @featureFlag translation
*/
export const POST = async (
req: AuthenticatedMedusaRequest<AdminBatchTranslationSettingsType>,
res: MedusaResponse<HttpTypes.AdminBatchTranslationSettingsResponse>
) => {
const { create = [], update = [], delete: deleteIds = [] } = req.validatedBody
const { result } = await batchTranslationSettingsWorkflow(req.scope).run({
input: {
create,
update,
delete: deleteIds,
},
})
return res.status(200).json({
created: result.created,
updated: result.updated,
deleted: {
ids: deleteIds,
object: "translation_settings",
deleted: true,
},
})
}
defineFileConfig({
isDisabled: () => !FeatureFlag.isFeatureEnabled(TranslationFeatureFlag.key),
})

View File

@@ -72,6 +72,27 @@ export const AdminTranslationSettingsParams = z.object({
entity_type: z.string().optional(),
})
const AdminUpdateTranslationSettings = z.object({
id: z.string(),
entity_type: z.string().optional(),
fields: z.array(z.string()).optional(),
is_active: z.boolean().optional(),
})
const AdminCreateTranslationSettings = z.object({
entity_type: z.string(),
fields: z.array(z.string()),
is_active: z.boolean().optional(),
})
export type AdminBatchTranslationSettingsType = z.infer<
typeof AdminBatchTranslationSettings
>
export const AdminBatchTranslationSettings = createBatchBody(
AdminCreateTranslationSettings,
AdminUpdateTranslationSettings
)
export type AdminTranslationEntitiesParamsType = z.infer<
typeof AdminTranslationEntitiesParams
>