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()
(dokumentacija). 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.