Sobes.tech
Middle

Kaip turėtų būti suformatuota puslapis, kuriame turinys yra prieinamas įvairiomis kalbomis?

sobes.tech AI

Atsakymas iš AI

SEO ir naudotojo patogumui kiekviename puslapyje turėtų būti naudojamas lang atributas <html> žymėje.

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

Alternatyvių puslapio versijų kitomis kalbomis nurodymui naudojamas <head> viduje hreflang meta žymė. Ji rodo paieškos sistemoms (pvz., Google), kad egzistuoja kitos kalbų versijos to paties puslapio.

Pavyzdys:

<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": nurodo rusų kalbos versiją.
  • hreflang="en": nurodo anglų kalbos versiją.
  • hreflang="x-default": nurodo numatytąją puslapio versiją, kai nė viena kalba neatitinka naudotojo pageidaujamos kalbos. Dažniausiai tai pagrindinis puslapis arba kalbos pasirinkimo puslapis.

Kalbų perjungimo funkcionalumas gali būti įvairus:

  1. Atskiri URL kiekvienai kalbai: example.com/ru/page, example.com/en/page. Tai yra pageidautinas SEO požiūriu.
  2. Užklausos parametrai: example.com/page?lang=ru, example.com/page?lang=en. Mažiau pageidautina SEO.
  3. Cookie arba Local Storage: Kalba saugoma kliento pusėje. Reikalingas serverio ar kliento pusės apdorojimas, kad būtų rodomas atitinkamas turinys.

Kalbų valdymui dažnai naudojamos internacionalizacijos bibliotekos:

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

Šios bibliotekos leidžia:

  • išgauti teksto eilutes iš kodo vertimui.
  • valdyti skirtingus kalbų failus (pvz., JSON formatu).
  • dinamiškai keisti kalbą be puslapio perkrovimo (nors pilnam URL ir turinio keitimui geriau naudoti serverio renderinimą arba atskirus URL).
  • tvarkyti kalbos linksniavimą, daugiskaitą ir datos/skaičiaus formatavimą pagal kalbą.

Pavyzdys i18next naudojimo su React (schematiškai):

// 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) // perduoda i18n react-i18next
  .init({
    resources,
    lng: 'ru', // numatytoji kalba
    interpolation: {
      escapeValue: false, // react jau saugo nuo 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')}>Rusų</button>
      <button onClick={() => changeLanguage('en')}>Anglų</button>
    </div>
  );
}

export default App;

Turinys (tekstas, paveikslėliai su tekstu) turi būti išverstas ir rodomas priklausomai nuo pasirinktos kalbos/URL.