Section author: Vedran Miletić

Višejezičnost u jeziku PHP

HTTP zaglavlje Accept-Language u zahtjevu oglašava koje jezike klijent može razumijeti i koja lokalna varijanta jezika je preferirana (više detalja o HTTP zaglavlju Accept-Language na MDN-u). Jezici se navode odvojeni zarezom znak zvjezdice (*) označava sve jezike, a opcionalno se može navesti i kvaliteta razumijevanja pojedinih jezika (vrijednost između 0 i 1) dodavanjem ;q=, npr. Accept-Language: hr, en;q=0.9, de;q=0.7, *;q=0.5 znači da klijent razumije hrvatski, engleski s kvalitetom 0.9, njemački s kvalitetom 0.7, a ostale jezike s kvalitetom 0.5. U PHP-u nam je sadržaj tog zaglavlja dostupan u polju $_SERVER, konkretno kao $_SERVER["HTTP_ACCEPT_LANGUAGE"].

HTTP zaglavlje Content-Language u odgovoru navodi u kojem je jeziku napisan sadržaj koji se šalje (više detalja o HTTP zaglavlju Content-Language na MDN-u). Primjerice, Content-Language: de-AT znači da je sadržaj na njemačkom jeziku kakav se govori u Austriji. Najčešće se koristi za tekstualni sadržaj (čisti tekst i HTML), ali može se koristiti za bilo koji medij.

Odabir jezika

Implementirajmo jednostavan odabir jezika koji bira prvi jezik naveden u zaglavlju Accept-Language i specijalno podržava odgovor na hrvatskom, a u svim ostalim slučajevima odgovara na engleskom. Kako bismo po znaku zareza razdvojili dobiveni popis jezika, trebat će nam funkcija explode(). Naravno, ostat će nam razmaci; cijepanjem po zarezu znakovnog niza "en, hr" dobivamo polje ["en", " hr"]. Stoga ćemo na dobivenom polju funkcijom array_map() (dokumentacija) primijeniti funkciju trim() (dokumentacija) kako bismo očistili znak razmaka s početka i kraja svakog elementa polja. Naposlijetku ćemo funkcijom in_array() (dokumentacija) provjeriti nalazi li se neka vrijednost za hrvatski jezik u polju:

<?php

$lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
$lang_split = explode(",", $lang);
$lang_trimmed = array_map("trim", $lang_split);

if (in_array("hr", $lang_trimmed)) {
    header("Content-Language: hr");
    echo "<p>Pozdrav svijetu!</p>\n";
} else {
    header("Content-Language: en");
    echo "<p>Hello, world!</p>\n";
}

Isprobajmo odabir jezika:

$ curl -v -H "Accept-Language: en, de" http://localhost:8000/
*   Trying ::1:8000...
* Connected to localhost (::1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.72.0
> Accept: */*
> Accept-Language: en, de
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Host: localhost:8000
< Date: Fri, 01 Jan 2021 20:14:25 GMT
< Connection: close
< X-Powered-By: PHP/8.0.0
< Content-Language: en
< Content-type: text/html; charset=UTF-8
<
<p>Hello, world!</p>
* Closing connection 0

$ curl -v -H "Accept-Language: hr, ru" http://localhost:8000/
*   Trying ::1:8000...
* Connected to localhost (::1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.72.0
> Accept: */*
> Accept-Language: hr, ru
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Host: localhost:8000
< Date: Fri, 01 Jan 2021 20:14:31 GMT
< Connection: close
< X-Powered-By: PHP/8.0.0
< Content-Language: hr
< Content-type: text/html; charset=UTF-8
<
<p>Pozdrav svijetu!</p>
* Closing connection 0

Dobit ćemo odogovor na hrvatskom čak i u slučaju da je hrvatski jezik naveden u Accept-Language na nekom mjestu osim prvog:

$ curl -v -H "Accept-Language: de, hr" http://localhost:8000/
*   Trying ::1:8000...
* Connected to localhost (::1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.72.0
> Accept: */*
> Accept-Language: de, hr
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Host: localhost:8000
< Date: Fri, 01 Jan 2021 20:17:18 GMT
< Connection: close
< X-Powered-By: PHP/8.0.0
< Content-Language: hr
< Content-type: text/html; charset=UTF-8
<
<p>Pozdrav svijetu!</p>
* Closing connection 0

Prevođenje teksta

Funkcije gettext() (dokumentacija) i setlocale() (dokumentacija) omogućuju prevođenje teksta.

Todo

Ovaj dio treba napisati.