mirror of
https://github.com/vercel/commerce.git
synced 2025-05-19 16:07:01 +00:00
SEO and language tests
This commit is contained in:
parent
7dc550291e
commit
182e245fd7
@ -1,14 +1,16 @@
|
|||||||
// 'use client';
|
|
||||||
|
|
||||||
import getQueryFromSlug from 'helpers/getQueryFromSlug';
|
import getQueryFromSlug from 'helpers/getQueryFromSlug';
|
||||||
import { docQuery } from 'lib/sanity/queries';
|
import { docQuery } from 'lib/sanity/queries';
|
||||||
import { client } from 'lib/sanity/sanity.client';
|
import { client } from 'lib/sanity/sanity.client';
|
||||||
|
import type { Metadata } from 'next';
|
||||||
import { groq } from 'next-sanity';
|
import { groq } from 'next-sanity';
|
||||||
import CategoryPage from './category-page';
|
import CategoryPage from './category-page';
|
||||||
import HomePage from './home-page';
|
import HomePage from './home-page';
|
||||||
import ProductPage from './product-page';
|
import ProductPage from './product-page';
|
||||||
import SinglePage from './single-page';
|
import SinglePage from './single-page';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get paths for each page.
|
||||||
|
*/
|
||||||
export async function generateStaticParams() {
|
export async function generateStaticParams() {
|
||||||
const paths = await client.fetch(groq`${docQuery}`, {
|
const paths = await client.fetch(groq`${docQuery}`, {
|
||||||
next: { revalidate: 10 },
|
next: { revalidate: 10 },
|
||||||
@ -43,6 +45,45 @@ function filterDataToSingleItem(data: any, preview = false) {
|
|||||||
return data[0]
|
return data[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate metadata for each page.
|
||||||
|
*/
|
||||||
|
export async function generateMetadata({ params }: {params: { slug: string[], locale: string }}): Promise<Metadata> {
|
||||||
|
const { slug, locale } = params
|
||||||
|
|
||||||
|
const { query = '', queryParams } = getQueryFromSlug(slug, locale)
|
||||||
|
|
||||||
|
const pageData = await client.fetch(query, queryParams)
|
||||||
|
|
||||||
|
const data = filterDataToSingleItem(pageData, false)
|
||||||
|
|
||||||
|
const { seo, title } = data
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: seo?.title ? seo?.title : title,
|
||||||
|
description: seo?.description
|
||||||
|
? seo.description
|
||||||
|
: 'Webb och digitalbyrå från Göteborg',
|
||||||
|
openGraph: {
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: seo?.image?.asset?.url
|
||||||
|
? seo.image.asset.url
|
||||||
|
: '/og-image.jpg',
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: seo?.coverImage?.alt
|
||||||
|
? seo.coverImage.alt
|
||||||
|
: 'Kodamera AB',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render pages depending on type.
|
||||||
|
*/
|
||||||
export default async function Page({
|
export default async function Page({
|
||||||
params,
|
params,
|
||||||
}: {
|
}: {
|
||||||
|
@ -6,13 +6,29 @@ import { notFound } from 'next/navigation';
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import './globals.css';
|
import './globals.css';
|
||||||
|
|
||||||
const { TWITTER_CREATOR, TWITTER_SITE, SITE_NAME } = process.env;
|
const SITE_NAME = "KM Storefront"
|
||||||
|
const SITE_DESCRIPTION = "Webb och digitalbyrå från Göteborg"
|
||||||
|
const TWITTER_CREATOR = "@kodamera.se"
|
||||||
|
const TWITTER_SITE = "https://kodamera.se"
|
||||||
|
const OG_IMAGE_URL = "/og-image.jpg"
|
||||||
|
const OG_IMAGE_ALT = "Kodamera"
|
||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: {
|
title: {
|
||||||
default: SITE_NAME,
|
default: SITE_NAME,
|
||||||
template: `%s | ${SITE_NAME}`
|
template: `%s | ${SITE_NAME}`
|
||||||
},
|
},
|
||||||
|
description: SITE_DESCRIPTION,
|
||||||
|
openGraph: {
|
||||||
|
images: [
|
||||||
|
{
|
||||||
|
url: OG_IMAGE_URL,
|
||||||
|
width: 1200,
|
||||||
|
height: 630,
|
||||||
|
alt: OG_IMAGE_ALT
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
robots: {
|
robots: {
|
||||||
follow: true,
|
follow: true,
|
||||||
index: true
|
index: true
|
||||||
@ -34,7 +50,7 @@ const inter = Inter({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export function generateStaticParams() {
|
export function generateStaticParams() {
|
||||||
return [{locale: 'sv'}, {locale: 'en'}, {locale: 'nn'}];
|
return [{locale: 'sv'}, {locale: 'en'}];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LocaleLayoutProps {
|
interface LocaleLayoutProps {
|
||||||
@ -46,6 +62,7 @@ interface LocaleLayoutProps {
|
|||||||
|
|
||||||
export default async function LocaleLayout({children, params: {locale}}: LocaleLayoutProps) {
|
export default async function LocaleLayout({children, params: {locale}}: LocaleLayoutProps) {
|
||||||
let messages;
|
let messages;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
messages = (await import(`../../messages/${locale}.json`)).default;
|
messages = (await import(`../../messages/${locale}.json`)).default;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
{
|
{
|
||||||
"Index": {
|
|
||||||
"title": "Welcome"
|
|
||||||
},
|
|
||||||
"ui": {
|
"ui": {
|
||||||
"button": {
|
"button": {
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
|
176
messages/nn.json
176
messages/nn.json
@ -1,176 +0,0 @@
|
|||||||
{
|
|
||||||
"Index": {
|
|
||||||
"title": "Velkommen"
|
|
||||||
},
|
|
||||||
"ui": {
|
|
||||||
"button": {
|
|
||||||
"close": "Lukk",
|
|
||||||
"back": "Tilbake",
|
|
||||||
"wishList": "Legg til i favorittlisten"
|
|
||||||
},
|
|
||||||
"previewBanner": {
|
|
||||||
"titlePart": "Forhåndsvisning av:",
|
|
||||||
"exitPreviewLabel": "Avslutt forhåndsvisning"
|
|
||||||
},
|
|
||||||
"copyright": "Alle rettigheter forbeholdt."
|
|
||||||
},
|
|
||||||
"search": {
|
|
||||||
"search": "Søk",
|
|
||||||
"placeholder": "Søk etter produkter...",
|
|
||||||
"globalPlaceholder": "Søk produkter og kategorier...",
|
|
||||||
"categories": "Kategorier",
|
|
||||||
"priceRange": "Prisklasse",
|
|
||||||
"clearAllFilters": "Fjern alle filtre",
|
|
||||||
"submitTitle": "Send inn søket ditt",
|
|
||||||
"clearTitle": "Fjern søket ditt",
|
|
||||||
"resetTitle": "Tilbakestill søket ditt",
|
|
||||||
"seo": {
|
|
||||||
"title": "Søk",
|
|
||||||
"description": "Søk etter produkt eller kategori"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"product": {
|
|
||||||
"description": "Beskrivelse",
|
|
||||||
"specification": "Spesifikasjon",
|
|
||||||
"shippingAndReturns": "Frakt og retur",
|
|
||||||
"reviews": "anmeldelser",
|
|
||||||
"noReviews": "Ingen recensioner",
|
|
||||||
"addToCart": "Legg i handlekurv",
|
|
||||||
"notAvailable": "Ikke tilgjengelig",
|
|
||||||
"related": "Relaterte produkter",
|
|
||||||
"selectSize": "Velg størrelse"
|
|
||||||
},
|
|
||||||
"cart": {
|
|
||||||
"myCarttitle": "Handlekurven min",
|
|
||||||
"subTotal": "Delsum",
|
|
||||||
"taxes": "Skatter",
|
|
||||||
"calculatedAtCheckout": "Beregned i kassen",
|
|
||||||
"free": "Gratis",
|
|
||||||
"shipping": "Shipping",
|
|
||||||
"estimatedShipping": "Estimert shipping",
|
|
||||||
"total": "Totalt",
|
|
||||||
"proceedToCheckout": "Fortsett til utsjekking",
|
|
||||||
"empty": {
|
|
||||||
"title": "Handlekurven din er tom",
|
|
||||||
"text": "Legg til et produkt for å begynne å handle."
|
|
||||||
},
|
|
||||||
"error": "Vi kunne ikke fullføre kjøpet ditt. Sjekk kortinformasjonen din og prøv igjen.",
|
|
||||||
"success": "Takk for din bestilling.",
|
|
||||||
"addShippingAddress": "+ Legg til leveringsadresse",
|
|
||||||
"addShippingMethod": "+ Legg til leveringsmetode",
|
|
||||||
"addPaymentMethod": "+ Legg til betalingsmåte",
|
|
||||||
"continueShopping": "Fortsette å handle",
|
|
||||||
"seo": {
|
|
||||||
"title": "Min handlekurv",
|
|
||||||
"description": "Alle produktene i handlekurven din vises her"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"checkout": {
|
|
||||||
"checkoutTitle": "Kasse",
|
|
||||||
"subTotal": "Delsum",
|
|
||||||
"taxes": "Skatter",
|
|
||||||
"calculatedAtCheckout": "Beregned i kassen",
|
|
||||||
"free": "Gratis",
|
|
||||||
"shipping": "Shipping",
|
|
||||||
"total": "Totalt",
|
|
||||||
"confirmPurchase": "Bekreft kjøp"
|
|
||||||
},
|
|
||||||
"paymentMethod": {
|
|
||||||
"paymentMethodTitle": "Betalingsmåte",
|
|
||||||
"cardHolderName": "Kortholder",
|
|
||||||
"cardNumber": "Kortnummer",
|
|
||||||
"expires": "Utløpsdato",
|
|
||||||
"cvc": "CVC",
|
|
||||||
"firstName": "Fornavn",
|
|
||||||
"lastName": "Etternavn",
|
|
||||||
"company": "Firma (valgfritt)",
|
|
||||||
"streetAndHouseNumber": "Gate og husnummer",
|
|
||||||
"apartment": "Leilighet, suite osv. (valgfritt)",
|
|
||||||
"postalCode": "Post kode",
|
|
||||||
"city": "By",
|
|
||||||
"countryAndRegion": "Land/Region",
|
|
||||||
"continue": "Fortsette"
|
|
||||||
},
|
|
||||||
"shipping": {
|
|
||||||
"shippingTitle": "Shipping",
|
|
||||||
"shippingAdress": {
|
|
||||||
"same": "Samme som betalingsadresse",
|
|
||||||
"different": "Bruk en annen leveringsadresse"
|
|
||||||
},
|
|
||||||
"addShippingAddress": "Legg til leveringsadresse",
|
|
||||||
"firstName": "Fornavn",
|
|
||||||
"lastName": "Etternavn",
|
|
||||||
"company": "Firma (valgfritt)",
|
|
||||||
"streetAndHouseNumber": "Gate og husnummer",
|
|
||||||
"apartment": "Leilighet, suite osv. (valgfritt)",
|
|
||||||
"postalCode": "Post kode",
|
|
||||||
"city": "By",
|
|
||||||
"countryAndRegion": "Land/Region",
|
|
||||||
"continue": "Fortsette"
|
|
||||||
},
|
|
||||||
"orders": {
|
|
||||||
"title": "Mine bestillinger",
|
|
||||||
"notFound": "Ingen bestillinger funnet",
|
|
||||||
"seo": {
|
|
||||||
"title": "Mine bestillinger",
|
|
||||||
"description": "Mine bestillinger vises her"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profile": {
|
|
||||||
"title": "Min profil",
|
|
||||||
"fullName": "Navn",
|
|
||||||
"email": "E-post",
|
|
||||||
"seo": {
|
|
||||||
"title": "Min profil",
|
|
||||||
"description": "Se og konfigurer kontoen min"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"wishlist": {
|
|
||||||
"title": "Min ønskeliste",
|
|
||||||
"empty": "Din ønskeliste er tom",
|
|
||||||
"seo": {
|
|
||||||
"title": "Min ønskeliste",
|
|
||||||
"description": "Ønskelisten min vises her"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"auth": {
|
|
||||||
"signUp": {
|
|
||||||
"firstName": "Fornavn",
|
|
||||||
"lastName": "Etternavn",
|
|
||||||
"email": "E-post",
|
|
||||||
"password": "Passord",
|
|
||||||
"informationPre": "Info",
|
|
||||||
"information": "Passord må være lengre enn 7 bokstaver og inneholde tall.",
|
|
||||||
"register": "Registrere",
|
|
||||||
"existingAccount": "Har du en konto?",
|
|
||||||
"loginLabel": "Logg inn"
|
|
||||||
},
|
|
||||||
"login": {
|
|
||||||
"email": "E-post",
|
|
||||||
"password": "Passord",
|
|
||||||
"logIn": "Logg inn",
|
|
||||||
"noExistingAccount": "Har du ikke en konto?",
|
|
||||||
"noExistingAccountLabel": "Registrere",
|
|
||||||
"forgotPasswordText": "E-post og passord er obligatorisk for å logge inn, har du",
|
|
||||||
"forgotPasswordLinkLabel": "glemt passordet?"
|
|
||||||
},
|
|
||||||
"forgotPassword": {
|
|
||||||
"email": "E-post",
|
|
||||||
"recover": "Tilbakestille passord",
|
|
||||||
"existingAccount": "Har du en konto?",
|
|
||||||
"loginLabel": "Logg inn"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"customerMenu": {
|
|
||||||
"myOrders": "Mine bestillinger",
|
|
||||||
"myProfile": "Min profil",
|
|
||||||
"myCart": "Min handlekurv",
|
|
||||||
"logOut": "Logg ut"
|
|
||||||
},
|
|
||||||
"notFound": {
|
|
||||||
"seo": {
|
|
||||||
"title": "Siden kan ikke bli funnet",
|
|
||||||
"description": "Siden kan ikke bli funnet"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,4 @@
|
|||||||
{
|
{
|
||||||
"Index": {
|
|
||||||
"title": "Välkommen"
|
|
||||||
},
|
|
||||||
"ui": {
|
"ui": {
|
||||||
"button": {
|
"button": {
|
||||||
"close": "Stäng",
|
"close": "Stäng",
|
||||||
|
BIN
public/og-image.jpg
Normal file
BIN
public/og-image.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
Loading…
x
Reference in New Issue
Block a user