Internaționalizarea PHP (i18n): Ghid practic pentru dezvoltatori

more

Yee

Aug 03, 2024

cover-img

Dă-ți site-ul PHP pe internațional: O soluție mai eficientă pentru internaționalizare

Dacă ești ca mine și ai proiecte PHP „vanilla” care nu se bazează pe framework-uri mari (gen Laravel sau Symfony), atunci suportul pentru mai multe limbi (i18n) probabil a fost mereu un mic punct sensibil.

Soluția tradițională, gettext, deși puternică, e destul de complicată de configurat. Mai ales la proiectele mici, parcă „folosești un baros ca să spargi o nucă”. Ce ne trebuie cu adevărat e o metodă care să poată fi implementată rapid, fără prea multă bătaie de cap.

După multe încercări și erori pe diverse proiecte, am ajuns la o soluție lightweight de internaționalizare, bazată pe fișiere array PHP și unelte online de traducere. Abordarea asta nu doar că e simplu de pus în practică, dar are și costuri de mentenanță extrem de mici. Azi îți dau toată soluția asta, fără nicio obligație.

Ghid practic: Cum am rezolvat suportul multi-limbă în PHP cu O.Translator

Ideea noastră de bază e foarte simplă: Fiecare limbă are un fișier PHP, care conține o instrucțiune return ce întoarce un array asociativ. Metoda asta e simplă, intuitivă și are un impact minim asupra performanței.

Pasul 1: Planifică-ți structura directoarelor

O structură clară a directoarelor e jumătate din bătălie. Ca să păstrăm totul organizat, vom pune toate fișierele de limbă în același director și le vom denumi folosind coduri de limbă, cam așa:

project_root/
├── index.php         // Your main logic file
├── i18n/             // Folder for all language files
│   ├── lang.cn.php   // Chinese language pack
│   ├── lang.en.php   // English language pack
│   └── lang.fr.php   // French language pack

Pasul 2: Creează-ți „arsenalul de limbi”

Următorul pas: creăm fișierul de bază pentru limbă. Hai să folosim chineza ca exemplu și să creăm un fișier lang.cn.php. Conținutul fișierului este un array PHP simplu, unde cheile sunt identificatori unici, iar valorile sunt șirurile de text corespunzătoare.

Exemplu lang.cn.php: Cheile rămân aceleași, valorile se schimbă în funcție de limbă

Pasul 3: Intră în scenă vrăjitorul traducerilor, O.Translator

Să traduci manual zeci sau sute de intrări? Genul ăsta de muncă repetitivă e coșmarul oricărui programator. Aici intervine arma noastră secretă: O.Translator.

Este o platformă profesională de traducere online pentru documente, care suportă perfect fișierele PHP, permițându-i să citească direct array-ul tău și să-l traducă în peste 70 de limbi.

Procesul e incredibil de simplu:

  1. Intră pe pagina principală O.Translator și încarcă fișierul tău de bază cu limba (de exemplu, lang.cn.php).
  2. Alege limbile țintă, cum ar fi engleza și franceza.
  3. Apasă pe translate, așteaptă puțin și fișierele tale traduse lang.en.php și lang.fr.php vor fi gata pentru tine.

Ce m-a impresionat cel mai mult e că O.Translator îți permite să previzualizezi gratuit o parte din traducere. Dacă ești mulțumit de rezultat, poți decide apoi dacă vrei să plătești pentru traducerea completă. După cum spun chiar ei: "Niciodată să nu plătești pentru un produs cu care nu ești mulțumit."

Pasul 4: Dă viață codului

Totul e pregătit; mai avem nevoie doar de ultima atingere. Acum, hai să modificăm fișierul principal index.php ca să poată încărca dinamic pachetul de limbă potrivit, în funcție de selecția utilizatorului.

<?php

// 1. Determine the current language (using a GET parameter for demonstration)
$supported_langs = ['en', 'cn', 'fr'];
$default_lang = 'en';
$lang = isset($_GET['lang']) && in_array($_GET['lang'], $supported_langs) ? $_GET['lang'] : $default_lang;

// 2. Load the corresponding language file
// Use a global variable like $_ or a specific variable like $TEXTS to store the strings
$_ = require_once __DIR__ . "/i18n/lang.{$lang}.php";

?>

În șablonul tău HTML, poți apoi să apelezi ușor șirurile de text astfel:

<!DOCTYPE html>
<html lang="<?php echo htmlspecialchars($lang); ?>">
<head>
    <meta charset="UTF-8">
    <title><?php echo htmlspecialchars($_['heading_home']); ?></title>
</head>
<body>
    <header>
      <h1><?php echo htmlspecialchars($_['heading_home']); ?></h1>
      <nav>
        <ul>
          <li><?php echo htmlspecialchars($_['heading_about']); ?></li>
          <li><?php echo htmlspecialchars($_['button_read_more']); ?></li>
        </ul>
      </nav>
    </header>
</body>
</html>

Și gata—așa se naște un site multi-limbă, simplu și rapid!

Considerații și gândire avansată

Deși soluția asta e lightweight, sunt câteva aspecte de luat în calcul înainte să o pui în producție:

  • Cum detectezi limba utilizatorului? Exemplul folosește un parametru GET, gen ?lang=en. Într-o aplicație reală, poți folosi și $_SESSION, $_COOKIE sau poți parsa header-ul Accept-Language al browserului pentru detectare automată.
  • Considerații de performanță: Pentru site-uri mici sau medii, impactul de performanță al unui require_once pentru un fișier PHP la fiecare request e practic neglijabil. Dacă site-ul tău are trafic mare, ia în calcul tehnologii de caching pentru bytecode, cum ar fi APC sau OPcache, pentru optimizare suplimentară.
  • Scalabilitate: Pe măsură ce crește numărul de limbi sau de texte, gestionarea manuală a fișierelor poate deveni complicată. În acel moment, ar trebui să explorezi soluții i18n mai profesionale, cum ar fi extensia gettext a PHP sau componentele de localizare oferite de framework-uri.
  • Consistența traducerilor: Ca să te asiguri că numele de brand și terminologia rămân consecvente în toate versiunile de limbă, îți recomandăm cu tărie să folosești funcția de Glosar din O.Translator.
  • Strategie la nivel înalt: Articolul acesta se concentrează pe implementarea tehnică. Dacă vrei să afli mai multe despre strategia generală de internaționalizare a site-ului, poți citi și celălalt articol detaliat al nostru.

Temă

Scenarii

Scenarii

Articole publicate11

Lectură recomandată