我创造了条纹产品。这些产品的描述是英文的。我不知道如何用另一种语言输入第二个描述。
当我用法语创建结账会话时,我希望产品描述以法语显示在购物车中。目前,除了英文的产品名称和说明外,结账界面均使用法语。
不幸的是,产品只能有 1 个描述,您是正确的,该描述将显示在结帐会话中。
如果您事先知道您的受众语言,也许您可以使用各自的语言创建单独的产品并相应地展示它们。
我认为如果管理您的 stripe 产品的人也可以访问您的翻译,那么 sweethuman 提出的解决方案(使用描述/标题作为翻译键)是很好的。
我觉得最好直接将所有可用的内容都放在条带中,因此,即使它远不是一个好的解决方案,我还是做了以下操作:
将产品元数据设置为
en_<fieldName>
和 fr_<fieldName>
,然后在代码中您可以使用区域设置检索正确的产品字段。
例如,使用 Nextjs (与 next-international):
import { stripe } from "@/lib/stripe";
import { getCurrentLocale } from "locales/server";
import { cache } from "react";
export default async function Product(props: { productId: string }) {
const locale = getCurrentLocale();
const product = await getProduct(props.productId);
return (
<>
<h3>{product.metadata[`${locale}_title`]}</h3>
<p>{product.metadata[`${locale}_description`]}</p>
</>
);
}
export const getProduct = cache(async (id: string) => {
return await stripe.products.retrieve(id);
});
我们甚至可以通过从本地化键中删除当前区域设置并在原始产品数据中添加替换它们来改进代码,其想法是转换:
{
name: "Product",
description: "Product description",
metadata: {
"es_name": "Producto",
"es_description": "Descripción de producto",
"fr_name": "Produit",
"fr_description": "Description du produit"
},
}
如果当前区域设置为
fr
,则执行以下操作:
{
name: "Produit",
description: "Description du produit",
metadata: {
"es_name": "Producto",
"es_description": "Descripción de producto",
"fr_name": "Produit",
"fr_description": "Description du produit"
},
}
这将允许开发人员忽略根据区域设置编写元数据字段名称的所有无意义,并且他可以直接访问
product.title
:
import { stripe } from "@/lib/stripe";
import { getCurrentLocale } from "locales/server";
import { cache } from "react";
import Stripe from "stripe";
type Product = Stripe.Response<Stripe.Product>;
export default async function Product(props: { productId: string }) {
const locale = getCurrentLocale();
const product = await getProduct(props.productId, locale);
return (
<>
<h3>{product.name}</h3>
<p>{product.description}</p>
</>
);
}
export const getProduct = cache(async (id: string, locale?: string) => {
let product = await stripe.products.retrieve(id);
if (locale) {
product = localizedProduct(product, locale);
}
return product;
});
function localizedProduct(product: Product, locale: string): Product {
const localizedMetadata = Object.fromEntries(
Object.entries(product.metadata).map(([localizedK, v]) => {
let k = localizedK;
if (k.startsWith(`${locale}_`)) {
k = k.slice(locale.length + 1);
}
return [k, v] as const;
}),
);
return {
...product,
...localizedMetadata,
metadata: product.metadata,
};
}
返回的最后部分
metadata: product.metadata
只是为了避免在元数据字段本身命名为<locale>_metadata
时替换实际元数据。