Localization
Meudsa localization plugin, supports deepseek automatic translation
Medusa Plugin Localization
The is a localization plugin for Medusa v2. The plugin stores localized content in the product's metadata. The frontend displays the localized language based on the current language setting. The plugin also supports automatic translation of localized languages using DeepSeek (requiring a DeepSeek API key). If no API key is available, localized languages need to be stored separately
Admin Demo
[
Front-end Demo
[
Dependency Version
Install
Metadata struct
If an SEO section is added to the metadata, DeepSeek's API will automatically include it in the multilingual translation process
name | value | description |
---|---|---|
seo | {"title":"xxx","description":"xxx"} | for page keyword optimization |
locale | {"en-GB":{"title":"...","seo_title":"..."}} | multiple languages via deepseek or manually written |
medusa-config.js
Front-end
For frontend localization, I use (Doc:Without-i18n-routing) and retrieve the current locale value with . Then I specifically developed a component to render the title value.
I18nTitle Component Example
import { getLocale } from 'next-intl/server';type I18nTitleProps = {metadata: Record<string, unknown> | null | undefined;defaultTitle: string;}const I18nTitle = async ({ metadata, defaultTitle }: I18nTitleProps) => {const locale = await getLocale();if (!metadata || !metadata?.locale) return defaultTitletry {const localeMaps = JSON.parse(metadata?.locale as string) || {}return localeMaps[locale]?.title || defaultTitle} catch (_) {return defaultTitle}}export default I18nTitle;
Compoent Using
// src/modules/products/templates/product-info/index.tsx// Before<Heading level="h2" className="text-3xl leading-10 text-ui-fg-base" >{product.title}</Heading>// After<Heading level="h2" className="text-3xl leading-10 text-ui-fg-base" ><I18nTitle metadata={product.metadata} defaultTitle={product.title} /></Heading>
Create Function @/lib/util/get-i18n
import { getLocale } from "next-intl/server";async function getI18n(metadata: { locale?: string } | null | undefined): Promise<Record<string, string> | null> {if (!metadata || !metadata.locale) {return null;}const localeCode = await getLocale();try {const localeObj = JSON.parse(metadata.locale);return localeObj[localeCode]} catch (e) {return null}}export default getI18n;
Using
export async function generateMetadata(props: Props): Promise<Metadata> {// ...const localeData = await getI18n(product.metadata);if (localeData) {return {title: localeData.title?localeData.title:product.title,description: localeData.description?localeData.description:product.description,openGraph: {title: localeData.title?localeData.title:product.title,description: localeData.title?localeData.description:product.description||'',images: product.thumbnail ? [product.thumbnail] : [],},}}return {title: `${product.title} `,description: `${product.title}`,openGraph: {title: `${product.title}`,description: `${product.title}`,images: product.thumbnail ? [product.thumbnail] : [],},}}