This commit is contained in:
Your Name committed 2026-07-21 21:22:40 -04:00
1 parent cfd642dee0
commit ae3799d8ce
21 files changed
+172 -30

No files matched your search

@@ -13,6 +13,7 @@ import DynamicPageRenderer from '@/components/dynamic/DynamicPageRenderer'
import ProductCard from '@/components/ProductCard'
import { getCategoriesResult, getProduct, getProductDetailSectionsResult, getProductResult, getProductReviewsResult, getProductsResult, getStoreSettingsResult, type ProductReview } from '@/lib/cms'
import { resolveCategoryName, resolveLocalized } from '@/lib/localization'
import { SUPPORTED_LOCALES } from '@/lib/locales'
import { extractIdFromSlug, generateProductSlug } from '@/lib/slugify'
import type { ProductAttribute } from '@homaroma/types'
@@ -361,8 +362,7 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://www.homaroma.com'
const customLanguages: Record<string, string> = {}
const languages = ['th', 'en', 'ja', 'zh', 'vi', 'ko']
for (const l of languages) {
for (const l of SUPPORTED_LOCALES) {
const locName = resolveLocalized(product.name, l) || product.brand.name
customLanguages[l] = `${baseUrl}/${l}/products/${generateProductSlug(locName, product.id)}`
}
+9 -10
View File
@@ -2,14 +2,13 @@ import { MetadataRoute } from 'next';
import { getCategories, getProducts, getArticlesResult } from '../lib/cms';
import { generateProductSlug } from '../lib/slugify';
import { resolveLocalized } from '../lib/localization';
import { DEFAULT_LOCALE, SUPPORTED_LOCALES } from '../lib/locales';
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'http://localhost:3000';
const languages = ['th', 'en', 'ja', 'zh', 'vi', 'ko'];
function createAlternates(path: string) {
const alternates: Record<string, string> = {};
for (const lang of languages) {
for (const lang of SUPPORTED_LOCALES) {
alternates[lang] = `${baseUrl}/${lang}${path}`;
}
return alternates;
@@ -32,7 +31,7 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
];
const routes: MetadataRoute.Sitemap = staticPages.map((route) => ({
url: `${baseUrl}/th${route}`,
url: `${baseUrl}/${DEFAULT_LOCALE}${route}`,
lastModified: new Date(),
changeFrequency: 'daily',
priority: route === '' ? 1 : 0.8,
@@ -42,7 +41,7 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
}));
const categoryRoutes: MetadataRoute.Sitemap = categories.map((category) => ({
url: `${baseUrl}/th/category/${category.id}`,
url: `${baseUrl}/${DEFAULT_LOCALE}/category/${category.id}`,
lastModified: new Date(),
changeFrequency: 'weekly',
priority: 0.7,
@@ -53,17 +52,17 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const productRoutes: MetadataRoute.Sitemap = products.map((product) => {
const alternates: Record<string, string> = {};
let thSlug = '';
let defaultSlug = '';
for (const lang of languages) {
for (const lang of SUPPORTED_LOCALES) {
const localizedName = resolveLocalized(product.name, lang) || (product.brand ? product.brand.name : 'product');
const slug = generateProductSlug(localizedName, product.id);
alternates[lang] = `${baseUrl}/${lang}/products/${slug}`;
if (lang === 'th') thSlug = slug;
if (lang === DEFAULT_LOCALE) defaultSlug = slug;
}
return {
url: `${baseUrl}/th/products/${thSlug}`,
url: `${baseUrl}/${DEFAULT_LOCALE}/products/${defaultSlug}`,
lastModified: new Date(),
changeFrequency: 'daily',
priority: 0.9,
@@ -77,7 +76,7 @@ export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
if (articlesResult.ok && articlesResult.data) {
articlesResult.data.forEach((article) => {
articleRoutes.push({
url: `${baseUrl}/th/article/${article.slug}`,
url: `${baseUrl}/${DEFAULT_LOCALE}/article/${article.slug}`,
lastModified: new Date(article.updatedAt || article.createdAt),
changeFrequency: 'monthly',
priority: 0.6,