PHP Internationalisatie (i18n): Een praktische gids voor ontwikkelaars

more

Yee

Aug 03, 2024

cover-img

Maak je PHP-website wereldwijd: een efficiëntere oplossing voor internationalisatie

Als je net als ik "vanilla" PHP-projecten onderhoudt die niet afhankelijk zijn van grote frameworks (zoals Laravel of Symfony), dan is meertalige ondersteuning (i18n) waarschijnlijk altijd een kleine, maar hardnekkige uitdaging geweest.

De traditionele oplossing, gettext, is krachtig, maar behoorlijk omslachtig om te configureren. Vooral bij kleine projecten voelt het als "met een kanon op een mug schieten." Wat we eigenlijk nodig hebben, is een methode die je snel kunt implementeren zonder al te veel complexiteit toe te voegen.

Na veel proberen en testen in verschillende projecten hebben we een lichte internationalisatie-oplossing ontwikkeld op basis van PHP-arraybestanden en online vertaaltools. Deze aanpak is niet alleen eenvoudig te implementeren, maar heeft ook extreem lage onderhoudskosten. Vandaag deel ik deze hele oplossing met jou, helemaal gratis.

Praktische gids: zo heb ik meertalige ondersteuning in PHP geregeld met O.Translator

Ons kernidee is heel simpel: Elke taal hoort bij een PHP-bestand, dat een return-statement bevat met een associatieve array. Deze methode is eenvoudig, intuïtief en heeft nauwelijks invloed op de performance.

Stap 1: Plan je mappenstructuur

Een duidelijke mappenstructuur is het halve werk. Om alles overzichtelijk te houden, zetten we alle taalbestanden in dezelfde map en geven we ze namen met taalcodes, zoals dit:

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

Stap 2: Maak je 'taal-arsenaal'

Nu maken we het basistaalbestand aan. Laten we Chinees als voorbeeld nemen en een lang.cn.php-bestand maken. De inhoud van het bestand is een simpele PHP-array, waarbij de keys unieke identifiers zijn en de values de bijbehorende tekststrings.

lang.cn.php voorbeeld: Keys blijven hetzelfde, values veranderen per taal

Stap 3: Betreed de vertaalwizard, O.Translator

Handmatig tientallen of honderden items vertalen? Dat is precies het soort repetitief werk waar programmeurs een hekel aan hebben. Hier komt ons geheime wapen, O.Translator, om de hoek kijken.

Het is een professioneel online vertaalplatform voor documenten dat perfect PHP-bestanden ondersteunt, waardoor het je array direct kan lezen en vertalen naar meer dan 70 talen.

Het proces is echt supersimpel:

  1. Ga naar de O.Translator homepage en upload je basistaalbestand (bijvoorbeeld lang.cn.php).
  2. Kies je doeltalen, zoals Engels en Frans.
  3. Klik op vertalen, wacht even, en je vertaalde lang.en.php en lang.fr.php bestanden zijn direct voor je beschikbaar.

Wat mij vooral opviel, is dat O.Translator je een voorbeeld van de vertaling gratis laat zien. Ben je tevreden met het resultaat? Dan kun je daarna beslissen of je voor de volledige vertaling wilt betalen. In hun eigen woorden: "Betaal nooit voor een product waar je niet blij mee bent."

Stap 4: Breng de code tot leven

Alles is klaar; we hoeven alleen nog de laatste hand te leggen. Laten we nu het hoofdbestand index.php aanpassen zodat het automatisch het juiste taalpakket laadt op basis van de keuze van de gebruiker.

<?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";

?>

In je HTML-template kun je de tekststrings dan heel makkelijk zo aanroepen:

<!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>

En daar heb je het—een simpele meertalige website is geboren!

Overwegingen en verder denken

Hoewel deze oplossing lichtgewicht is, zijn er een paar punten waar je op moet letten voordat je naar productie gaat:

  • Hoe detecteer je de taal van de gebruiker? In het voorbeeld wordt een GET-parameter gebruikt, zoals ?lang=en. In een echte applicatie kun je ook $_SESSION, $_COOKIE gebruiken, of de Accept-Language request header van de browser uitlezen voor automatische detectie.
  • Prestatie-overwegingen: Voor kleine tot middelgrote websites is de performance-overhead van require_once van een PHP-bestand per request verwaarloosbaar. Heeft je site veel verkeer? Overweeg dan bytecode caching-technologieën zoals APC of OPcache voor extra optimalisatie.
  • Schaalbaarheid: Naarmate het aantal talen of tekststrings groeit, kan het handmatig beheren van bestanden ingewikkeld worden. Op dat moment kun je meer professionele i18n-oplossingen overwegen, zoals PHP's gettext-extensie of de localisatiecomponenten die frameworks bieden.
  • Vertaalconsistentie: Om consistentie te waarborgen voor merknamen en terminologie in alle taalversies, raden we je sterk aan om de Glossary-functie van O.Translator te gebruiken.
  • Hoog-niveau strategie: Dit artikel richt zich op de technische implementatie. Wil je meer weten over de algemene strategie voor website-internationalisatie? Lees dan ons andere uitgebreide artikel.

Onderwerp

Scenario

Scenario

Gepubliceerde artikelen11

Aanbevolen lectuur