Faça sua pergunta e obtenha um resumo do documento referenciando esta página e o provedor AI de sua escolha
O conteúdo desta página foi traduzido com uma IA.
Veja a última versão do conteúdo original em inglêsIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Novo Intlayer v8 - O que há de novo?
Bem-vindo ao Intlayer v8! Esta versão foca em aprimorar a experiência do desenvolvedor com detecção automática de conteúdo, garantir a integridade dos dados com validação de esquemas e oferecer mais controlo sobre a gestão de dicionários.
Índice
Evolução do Conteúdo Rico: Markdown & HTML
O Intlayer v8 traz melhorias importantes na forma como o conteúdo rico é tratado, introduzindo os nós HTML (que não existiam na v7) e unificando a API com os nós Markdown (que existiam na v7 mas foram aprimorados).
A API Unificada .use()
Introduzimos o método .use() para nós Markdown e HTML. Este método permite que você personalize as tags HTML ou componentes usados durante a renderização.
- Substituição de Componentes: Você pode facilmente substituir tags HTML ou componentes personalizados por seus próprios componentes de framework (por exemplo, substituir
<a>porNextLinkou<CustomCmp>por um componente React). - Segurança de Tipos: Todas as funções para fornecer componentes são totalmente tipadas, garantindo que você receba as props corretas.
Comportamento de Renderização Padrão
Na v7, se nenhum provedor fosse definido, os nós Markdown eram renderizados como strings brutas, muitas vezes exigindo bibliotecas externas para analisá-los.
Na v8, o Intlayer inclui seu próprio analisador Markdown interno. Por padrão, os nós Markdown agora são renderizados diretamente como HTML sem a necessidade de bibliotecas externas.
Novos Utilitários de Renderer & Provider
Introduzimos novas funções e componentes de renderização independentes para oferecer mais controlo fora do fluxo padrão do useIntlayer.
- Markdown:
MarkdownRenderer,useMarkdownRenderer,renderMarkdown. (Nota: oMarkdownProviderexistia na v7 mas agora se integra com essas novas ferramentas). - HTML:
HTMLRenderer,useHTMLRenderer,renderHTML,HTMLProvider.
Exemplos: Ferramentas de Renderização Markdown
1. Usando o Componente:
Copiar o código para a área de transferência
import { MarkdownRenderer } from "react-intlayer/markdown";<MarkdownRenderer forceBlock={true} components={{ h1: ({ children }) => <h1 className="text-2xl">{children}</h1> }}> {"# Meu Título"}</MarkdownRenderer>2. Usando o Hook:
Copiar o código para a área de transferência
import { useMarkdownRenderer } from "react-intlayer/markdown";const renderMarkdown = useMarkdownRenderer({ components: { h1: ({ children }) => <h1 className="text-red-500">{children}</h1> }});return <div>{renderMarkdown("# Meu Título")}</div>;3. Usando a Função Utilitária:
Copiar o código para a área de transferência
import { renderMarkdown } from "react-intlayer/markdown";const html = renderMarkdown("# Meu Título", { forceBlock: true});Exemplos: Ferramentas de Renderização HTML
1. Usando o Componente:
Copiar o código para a área de transferência
import { HTMLRenderer } from "react-intlayer/html";<HTMLRenderer components={{ p: ({ children }) => <p className="mb-4">{children}</p> }}> {"<p>Hello World</p>"}</HTMLRenderer>2. Usando o Hook:
Copiar o código para a área de transferência
import { useHTMLRenderer } from "react-intlayer/html";const renderHTML = useHTMLRenderer({ components: { strong: ({ children }) => <b className="font-bold">{children}</b> }});return <div>{renderHTML("<p>Hello <strong>World</strong></p>")}</div>;3. Usando a Função Utilitária:
Copiar o código para a área de transferência
import { renderHTML } from "react-intlayer/html";const html = renderHTML("<p>Hello World</p>");Para mais detalhes, consulte a Documentação de Conteúdo HTML e a Documentação de Markdown.
Reescritas de URL Personalizadas
O Intlayer v8 introduz suporte para Reescritas de URL Personalizadas, permitindo que você defina caminhos específicos por localidade que diferem da estrutura padrão /locale/path. Este é um recurso poderoso para melhorar o local SEO e proporcionar uma experiência de usuário mais natural para usuários que não falam inglês.
Principais melhorias na v8:
- Framework Formatters: Novos
nextjsRewrite,svelteKitRewrite,reactRouterRewrite,vueRouterRewrite,solidRouterRewrite,tanstackRouterRewrite,nuxtRewrite, eviteRewritepara fornecer sintaxe de padrão idiomática para cada router. useRewriteURLHook: Um novo hook do lado do cliente que corrige silenciosamente la barra de endereços para a URL localizada "bonita" sem acionar navegações do roteador.- Redirecionamentos automáticos de SEO: Proxies embutidos agora redirecionam automaticamente os usuários de caminhos canônicos digitados manualmente (por exemplo,
/fr/about) para suas versões localizadas mais amigáveis (por exemplo,/fr/a-propos).
Exemplo de Configuração:
Copiar o código para a área de transferência
import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = { internationalization: { locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH], defaultLocale: Locales.ENGLISH, }, routing: { mode: "prefix-no-default", rewrite: nextjsRewrite({ "/[locale]/about": { fr: "/[locale]/a-propos", es: "/[locale]/acerca-de", }, "/[locale]/products/[id]": { fr: "/[locale]/produits/[id]", es: "/[locale]/productos/[id]", }, }), },};export default config;Este recurso é suportado nativamente no Next.js e no Vite através dos proxies do Intlayer, e pode ser facilmente integrado em outros routers como TanStack Router, React Router, Vue Router, SvelteKit e Solid Router.
Para mais informações e guias de integração, veja a Documentação de Reescritas de URL Personalizadas.
Valores de Inserção Aprimorados
Na v8, os valores de inserção podem agora aceitar elementos React (ou nós Vue) além de strings e números. Isso permite que você injete componentes ricos e interativos diretamente em seus modelos de inserção.
O Intlayer agora lida de forma robusta com nós React e Preact aninhados dentro de inserções, garantindo que estruturas de UI complexas sejam preservadas e renderizadas corretamente.
Exemplo:
Copiar o código para a área de transferência
import { insert } from "intlayer";export default { key: "my-key", content: { myInsertion: insert("Olá {{name}}"), },};Copiar o código para a área de transferência
import { useIntlayer } from "next-intlayer";const { myInsertion } = useIntlayer("my-key");return ( <div> {myInsertion({ name: 2, // número // ou name: "John", // string // ou name: <span>John</span>, // elemento React })} </div>);Validação de Esquema de Conteúdo
O Intlayer v8 introduz a validação de esquema para dicionários. Agora você pode definir esquemas de validação reutilizáveis em sua configuração usando Zod e aplicá-los aos seus arquivos de conteúdo. Isso garante que seu conteúdo sempre adira à estrutura esperada, capturando erros em tempo de build.
1. Definir Esquemas
Defina seus esquemas em intlayer.config.ts:
Copiar o código para a área de transferência
import { z } from "zod";export default { schemas: { "seo-metadata": z.object({ title: z.string().min(50).max(60), description: z.string().min(150).max(160), }), },};2. Aplicar Esquemas a Dicionários
Referencie a chave do esquema em sua definição de dicionário:
Copiar o código para a área de transferência
import { type Dictionary } from "intlayer";const aboutPageMetaContent = { key: "about-page-meta", schema: "seo-metadata", // <-- content: { title: "Sobre Nossa Empresa - Saiba Mais Sobre Nós", description: "Descubra a missão, os valores e a equipa da nossa empresa.", },} satisfies Dictionary;export default aboutPageMetaContent;Se o conteúdo não corresponder ao esquema (por exemplo, o título é muito curto), o processo de build gerará um erro.
Detecção Automática de Conteúdo Aprimorada
Na v8, o Intlayer detecta inteligentemente a sintaxe Markdown, tags HTML e inserções de variáveis em suas strings de conteúdo. Isso significa que muitas vezes você pode omitir funções auxiliares como md(), html() ou insert().
Este comportamento está ativado por padrão. Agora você pode ajustar essa detecção globalmente em seu intlayer.config.ts ou por dicionário.
Controlo Granular
Você pode ativar ou desativar tipos específicos de transformações:
Copiar o código para a área de transferência
export default { dictionary: { // contentAutoTransformation: false (default) contentAutoTransformation: { markdown: true, html: true, insertion: false, // Desativar a detecção automática de inserções }, },};Comportamento v7 (Encapsulamento manual):
Copiar o código para a área de transferência
import { md, insert } from "intlayer";export default { key: "my-key", content: { myMarkdown: md("## Hello World"), myInsertion: insert("Olá {{name}}"), },};Comportamento v8 (Detecção automática):
Copiar o código para a área de transferência
export default { key: "my-key", contentAutoTransformation: true, // Também pode ser definido pela definição do dicionário ou globalmente em intlayer.config.ts content: { myMarkdown: "## Hello World", // Detectado automaticamente como Markdown myHTML: "<p>Hello World</p>", // Detectado automaticamente como HTML myInsertion: "Olá {{name}}", // Detectado automaticamente como Inserção },};O resultado JSON subjacente permanece o mesmo, preservando a rica informação de tipo necessária para a renderização:
Copiar o código para a área de transferência
{ "key": "my-key", "content": { "myMarkdown": { "nodeType": "markdown", "markdown": "## Hello World" }, "myHTML": { "nodeType": "html", "html": "<p>Hello World</p>" }, "myInsertion": { "nodeType": "insertion", "insertion": "Olá {{name}}" } }}Localização: novo hook useIntl
Um novo hook useIntl() está agora disponível em React, Next.js e Vue. Ele fornece um objeto Intl vinculado à localidade que usa automaticamente o idioma atual para formatar números, datas e mais, sem necessidade de passar a localidade manualmente.
Copiar o código para a área de transferência
import { useIntl } from "next-intlayer";const intl = useIntl();const formattedPrice = new intl.NumberFormat({ style: "currency", currency: "USD",}).format(123.45);Ferramentas: Melhorias na Extensão VSCode
A extensão Intlayer para VSCode recebe atualizações significativas na v8 para otimizar o seu fluxo de trabalho de internacionalização:
- Tempo de Inicialização: Melhorias de desempenho ao abrir um projeto.
- Cache: Camada de cache melhorada para validação e autocompletação quase instantâneas.
- Detecção de Chaves Não Utilizadas & Chaves Duplicadas: Novas funcionalidades para detectar automaticamente chaves não utilizadas e chaves duplicadas em todos os seus dicionários, ajudando a manter o seu conteúdo limpo e eficiente.
Otimizações do Compilador
Intlayer v8 inclui uma nova camada de cache para o compilador Markdown e HTML. Isso garante que strings de conteúdo idênticas com a mesma configuração sejam analisadas apenas uma vez, reduzindo significativamente a sobrecarga durante re-renders ou quando o mesmo conteúdo é usado em vários lugares.
Copiar o código para a área de transferência
const { intlayerExtractBabelPlugin, intlayerOptimizeBabelPlugin, getExtractPluginOptions, getOptimizePluginOptions,} = require('@intlayer/babel');module.exports = { presets: ['next/babel'], plugins: [ // Extrair conteúdo de componentes para os dicionários [intlayerExtractBabelPlugin, getExtractPluginOptions()], // Otimiza as importações substituindo useIntlayer por importações diretas de dicionários [intlayerOptimizeBabelPlugin, getOptimizePluginOptions()], ],};Flexibilidade: Modo Unificado de Importação
A propriedade booleana live foi descontinuada em favor de uma propriedade mais abrangente importMode. Isso permite a definição explícita de como os dicionários devem ser carregados: estaticamente, dinamicamente ou via sincronização ao vivo.
Modos
static(Padrão): O dicionário é empacotado em tempo de build. Melhor para desempenho.dynamic: O dicionário é carregado em tempo de execução (por exemplo, via fetch de JSON ou suspense).fetch: O dicionário é buscado do CMS/Server em tempo de execução e sincronizado.
Geçiş:
Abrir a tabela em um modal para ver todo o conteúdo claramente
| Configuração v7 | Configuração v8 |
|---|---|
live: true | importMode: 'fetch' |
live: false | importMode: 'static' (ou 'dynamic') |
Nota: No Intlayer v8, a propriedade importMode foi movida da configuração build para a configuração dictionary em intlayer.config.ts. Isso permite definir um modo de importação padrão para todos os seus dicionários, ao mesmo tempo em que ainda é possível sobrescrevê-lo por dicionário.
Exemplo de Configuração Global:
Copiar o código para a área de transferência
export default { dictionary: { importMode: "dynamic", // Padrão global }, // ...};Exemplo de Dicionário:
Copiar o código para a área de transferência
export default { key: 'my-key', importMode: "fetch", // Sobrescreve a configuração global content: { ... }}Controlo da Localização do Dicionário
v8 introduz a propriedade location para gerir explicitamente onde os dicionários residem e como eles se sincronizam. Isto é particularmente útil para fluxos de trabalho híbridos envolvendo tanto ficheiros locais quanto conteúdo de CMS remoto.
Opções
local: O dicionário existe apenas localmente. Não será enviado para o CMS remoto.remote: O dicionário é gerido remotamente. Uma vez enviado para o CMS, será desvinculado do local. O dicionário remoto será obtido a partir do CMS.local_and_remote: O dicionário existe em ambos os locais. Alterações locais são enviadas, e alterações remotas são obtidas (sincronizadas).
Exemplo:
Copiar o código para a área de transferência
export default { key: 'my-key', location: "local", // Mantenha este dicionário apenas local content: { ... }}Separação da Configuração do Sistema
Intlayer v8 separa a configuração das fontes de conteúdo dos caminhos internos do sistema e de saída. Isso desobstrui a propriedade content e deixa claro quais configurações são destinadas ao gerenciamento pelo usuário versus as que são gerenciadas pelo sistema Intlayer.
As seguintes propriedades foram movidas de content para uma nova propriedade system em intlayer.config.ts:
dictionariesDirmoduleAugmentationDirunmergedDictionariesDirtypesDirmainDirconfigDircacheDiroutputFilesPatternWithPath
Comportamento v7:
Copiar o código para a área de transferência
export default { content: { contentDir: ["src"], dictionariesDir: ".intlayer/dictionary", // Misturado com a configuração de origem },};Comportamento v8:
Copiar o código para a área de transferência
export default { content: { contentDir: ["src"], }, system: { dictionariesDir: ".intlayer/dictionary", // Claramente separado },};Separação de Diretórios de Conteúdo e Código
O Intlayer v8 separa a configuração dos ficheiros de definição de conteúdo da configuração para transformação de código. Isto permite uma monitorização e varredura mais precisas, melhorando o desempenho da build.
Anteriormente, contentDir era usado tanto para monitorizar ficheiros .content.* como para escanear o código à procura de chamadas a useIntlayer. Agora:
contentDir: Especificamente para os seus ficheiros de declaração de conteúdo.codeDir: Especificamente para o código da sua aplicação que necessita de transformação (por exemplo, pruning, optimization).
Migração:
Se anteriormente você tinha contentDir definido, o Intlayer v8 o usará como padrão para codeDir também, mas registrará um aviso. Você deve definir explicitamente codeDir na sua configuração.
Comportamento v7:
Copiar o código para a área de transferência
export default { content: { contentDir: ["src", "@packages/design-system"], // Usado tanto para conteúdo quanto para código },};Comportamento v8:
Copiar o código para a área de transferência
export default { content: { contentDir: ["src/content", "@packages/design-system"], // Somente observa arquivos src/content/*.content.* e @packages/design-system/dist/*.content.* aqui codeDir: ["src", "@packages/design-system"], // Somente escaneia para transformação de código aqui e arquivos @packages/design-system/src/*.content.* },};Framework: Melhorias no Svelte
Conteúdo Markdown e HTML no Svelte agora é automaticamente convertido para HTML quando convertido em string. Isso facilita muito o uso com a sintaxe {@html} do Svelte, pois agora você pode simplesmente passar o nó de conteúdo diretamente.
Notas de migração da v7
Alterações na Configuração
- Propriedade
live: A propriedadeliveem dicionários foi removida. UseimportMode: 'fetch'em vez disso. - importMode: A propriedade
build.importModena configuração foi obsoleta. Usedictionary.importModeem vez disso. contentDirecodeDir:contentDiragora é especificamente para ficheiros de conteúdo. Foi adicionada uma nova propriedadecodeDirpara transformação de código. SecodeDirnão estiver definido, o Intlayer recorrerá acontentDircomo fallback e registará um aviso.- Validação de Schema: Para utilizar a nova funcionalidade
schema, assegure-se de ter ozodinstalado no seu projeto.