finish next intl template translation
This commit is contained in:
parent
00ec0449e3
commit
1697ce8d6f
@ -112,7 +112,7 @@ export async function generateStaticParams(
|
|||||||
|
|
||||||
This will create each static page for each blog post.
|
This will create each static page for each blog post.
|
||||||
|
|
||||||
You can get the metadata of the .mdx file too.
|
You can get the metadata of the `.mdx` file too.
|
||||||
|
|
||||||
```tsx title="src/app/[locale]/blog/[slug]/page.tsx"
|
```tsx title="src/app/[locale]/blog/[slug]/page.tsx"
|
||||||
//...
|
//...
|
||||||
|
139
src/content/portfolio/es/next-intl-blog-template.mdx
Normal file
139
src/content/portfolio/es/next-intl-blog-template.mdx
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
---
|
||||||
|
title: Next Intl Blog Template
|
||||||
|
description: ¡Comienza tu blog en múltiples idiomas!
|
||||||
|
tags: [Next.js, next-intl, tailwindcss]
|
||||||
|
image: /portfolio/next-intl-blog-template/banner.png
|
||||||
|
imageCaption: Next Intl Blog Template banner
|
||||||
|
date: 2023-12-18
|
||||||
|
author: Juan Manzanero
|
||||||
|
rss: true
|
||||||
|
---
|
||||||
|
|
||||||
|

|
||||||
|
_Next Intl Blog Template banner_
|
||||||
|
|
||||||
|
[GitHub](https://github.com/juancmandev/next-intl-blog-template)
|
||||||
|
|
||||||
|
[Website](https://next-intl-blog-template.vercel.app/en)
|
||||||
|
|
||||||
|
## Introducción
|
||||||
|
|
||||||
|
Recientemente actualicé este website, y como sabrás, es un website con **contenido en Inglés y Español**.
|
||||||
|
|
||||||
|
No estoy usando un plugin de traducción, en su lugar escribo cada palabra en ambos idiomas.
|
||||||
|
|
||||||
|
Gracias a Next.js y [next-intl](https://next-intl-docs.vercel.app/) puedo lograr esto, renderizando rutas para cada idioma en el website, accediendo a un diccionario que contiene el contenido traducido por mí.
|
||||||
|
|
||||||
|
Para los archivos .mdx, creé un directorio para cada idioma, y dentro de esos directorios contiene el contenido en ambos idiomas también.
|
||||||
|
|
||||||
|
## Cómo usar
|
||||||
|
|
||||||
|
Este template es una extensión de [next-intl](https://next-intl-docs.vercel.app/), revisa la [guía de inicio](https://next-intl-docs.vercel.app/docs/getting-started) para aprender lo básico, el propósito del template es crear un layout simple para futuras personalizaciones.
|
||||||
|
|
||||||
|
### Agregar o quitar locales
|
||||||
|
|
||||||
|
Puedes agregar o remover locales en el archivo `src/lang/locales.ts`.
|
||||||
|
|
||||||
|
```ts title="src/lang/locales.ts"
|
||||||
|
export type locales = "en" | "es";
|
||||||
|
|
||||||
|
export const localesList: locales[] = ["en", "es"];
|
||||||
|
```
|
||||||
|
|
||||||
|
Solo agrega o remueve un locale de la constante `locales`, y agrega o remueve el locale de la lista.
|
||||||
|
|
||||||
|
El primer item en `localesList` debe ser el locale por default.
|
||||||
|
|
||||||
|
La lista es usada para la generación de rutas estáticas en
|
||||||
|
`src/app/[locale]/layout.tsx`.
|
||||||
|
|
||||||
|
```ts title="src/app/[locale]/layout.tsx"
|
||||||
|
import { localesList } from "@/lang/locales";
|
||||||
|
|
||||||
|
export function generateStaticParams() {
|
||||||
|
return localesList.map((locale) => ({ locale }));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Recuerda actualizar el matcher en `src/middleware.ts`.
|
||||||
|
|
||||||
|
```ts title="src/middleware.ts"
|
||||||
|
//...
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
matcher: ["/", "/(en|es)/:path*"],
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Y por supuesto, actualiza los archivos `src/lang/[locale].json`.
|
||||||
|
|
||||||
|
### Crear contenido
|
||||||
|
|
||||||
|
Usa `src/content/[locale]` para crear contenido, en el directorio `/[locale]/` crea un directorio para cada propósito, por ejemplo: `/[locale]/blog`.
|
||||||
|
|
||||||
|
Dentro crea el archivo .mdx con un nombre único, el nombre será usado como slug para crear la página estática para ese post.
|
||||||
|
|
||||||
|
Para crear una sección de blog, usarás la función _getAllContent_ en tu ruta, por ejemplo: `src/app/[locale]/blog/[slug]/page.tsx`.
|
||||||
|
|
||||||
|
```tsx title="src/app/[locale]/blog/[slug]/page.tsx"
|
||||||
|
import { Mdx } from "@/components";
|
||||||
|
import { TParamsLocale, TPage, TSlugLang } from "@/types";
|
||||||
|
import { Metadata } from "next";
|
||||||
|
import { getAllContent, getContent } from "@/utils/getContent";
|
||||||
|
|
||||||
|
export async function generateStaticParams(
|
||||||
|
props: TParamsLocale,
|
||||||
|
): Promise<TSlugLang[]> {
|
||||||
|
const blogs = await getAllContent(props.params.locale, "blog");
|
||||||
|
|
||||||
|
if (!blogs) return [];
|
||||||
|
|
||||||
|
return blogs.map((blog) => ({
|
||||||
|
slug: blog.slug,
|
||||||
|
locale: props.params.locale,
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
//...
|
||||||
|
```
|
||||||
|
|
||||||
|
Esto creará una página estática para cada post de blog.
|
||||||
|
|
||||||
|
Puedes obtener la metadata del archivo `.mdx` también.
|
||||||
|
|
||||||
|
```tsx title="src/app/[locale]/blog/[slug]/page.tsx"
|
||||||
|
//...
|
||||||
|
|
||||||
|
export async function generateMetadata(props: TPage): Promise<Metadata> {
|
||||||
|
const blog = await getContent(props.params.locale, "blog", props.params.slug);
|
||||||
|
|
||||||
|
if (!blog) return {};
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: blog.title,
|
||||||
|
//...
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
//...
|
||||||
|
```
|
||||||
|
|
||||||
|
Entonces, renderiza el contenido usando el componente _Mdx_.
|
||||||
|
|
||||||
|
```tsx title="src/app/[locale]/blog/[slug]/page.tsx"
|
||||||
|
//...
|
||||||
|
|
||||||
|
export default async function Page(props: TPage) {
|
||||||
|
const post = await getContent(props.params.locale, "blog", props.params.slug);
|
||||||
|
|
||||||
|
if (!post) return null;
|
||||||
|
|
||||||
|
return <Mdx code={post.body.code} />;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
[Puedes hacer un fork de este template aquí](https://github.com/juancmandev/next-intl-blog-template)
|
||||||
|
|
||||||
|
## Contacto
|
||||||
|
|
||||||
|
Si te interesa **trabajar juntos** en un website con internacionalización con Next.js, envíame un correo a [contact@juancman.dev](mailto:contact@juancman.dev)
|
Loading…
x
Reference in New Issue
Block a user