Sobes.tech
Middle

Como deve formatar-se a página onde o conteúdo está disponível em diferentes idiomas?

sobes.tech IA

Resposta da IA

Para SEO e conveniência do utilizador, deve-se usar o atributo lang na tag <html> em cada página.

<html lang="ru">
  ...
</html>

Para indicar versões alternativas da página em outros idiomas, usa-se a meta tag hreflang no <head>. Ela mostra aos motores de busca (por exemplo, Google) que existem outras versões nesta mesma página em diferentes idiomas.

Exemplo:

<head>
  <link rel="alternate" hreflang="ru" href="https://example.com/страница" />
  <link rel="alternate" hreflang="en" href="https://example.com/en/page" />
  <link rel="alternate" hreflang="x-default" href="https://example.com/" />
</head>
  • hreflang="ru": indica a versão em russo da página.
  • hreflang="en": indica a versão em inglês.
  • hreflang="x-default": indica a página padrão quando nenhuma língua corresponde à preferência do utilizador. Geralmente, é a página principal ou a página de seleção de idioma.

A implementação da troca de idiomas no frontend pode variar:

  1. URLs separadas para cada idioma: example.com/ru/page, example.com/en/page. É a abordagem preferida para SEO.
  2. Parâmetros na query: example.com/page?lang=ru, example.com/page?lang=en. Menos preferido para SEO.
  3. Cookies ou armazenamento local: O idioma é guardado no lado do cliente. Requer processamento no servidor ou renderização no cliente para mostrar o conteúdo no idioma correto.

Para gerir as traduções no frontend, costuma-se usar bibliotecas de internacionalização (i18n):

  • React: react-i18next, react-intl
  • Vue: vue-i18n
  • Angular: @angular/localize
  • Vanilla JS: i18next

Estas bibliotecas permitem:

  • Extrair strings para tradução do código.
  • Gerir diferentes ficheiros de idiomas (por exemplo, em formato JSON).
  • Alterar dinamicamente o idioma sem recarregar a página (embora, para uma troca completa de URL e conteúdo, seja melhor usar renderização no servidor ou URLs separadas).
  • Processar declinações, pluralização e formatação de datas/números específicos do idioma.

Exemplo de uso do i18next com React (de forma esquemática):

// src/i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

import translationEN from './locales/en/translation.json';
import translationRU from './locales/ru/translation.json';

const resources = {
  en: {
    translation: translationEN,
  },
  ru: {
    translation: translationRU,
  },
};

i18n
  .use(initReactI18next) // passa o i18n para react-i18next
  .init({
    resources,
    lng: 'ru', // idioma padrão
    interpolation: {
      escapeValue: false, // react já protege contra XSS
    },
  });

export default i18n;
// src/locales/ru/translation.json
{
  "title": "Привет, мир!"
}
// src/locales/en/translation.json
{
  "title": "Hello, world!"
}
// src/App.js
import React from 'react';
import { useTranslation } from 'react-i18next';

function App() {
  const { t, i18n } = useTranslation();

  const changeLanguage = (lng) => {
    i18n.changeLanguage(lng);
  };

  return (
    <div>
      <h1>{t('title')}</h1>
      <button onClick={() => changeLanguage('ru')}>Russo</button>
      <button onClick={() => changeLanguage('en')}>Inglês</button>
    </div>
  );
}

export default App;

O conteúdo da página (textos, imagens com texto) deve ser traduzido e exibido de acordo com o idioma/URL selecionado.