It's good to mention that if user browser will not send HTTP_ACCEPT_LANGUAGE, the output from:
Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
Will be null.
So remember to set up a fail over scenario!(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL intl >= 1.0.0)
Locale::acceptFromHttp -- locale_accept_from_http β ΠΠΎΠΏΡΡΠ°ΡΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π½Π°ΠΈΠ»ΡΡΡΡΡ Π»ΠΎΠΊΠ°Π»Ρ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡΡ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ HTTP "Accept-Language"
ΠΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΡΠΈΠ»Ρ
ΠΡΠΎΡΠ΅Π΄ΡΡΠ½ΡΠΉ ΡΡΠΈΠ»Ρ
ΠΡΡΠ°Π΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π»ΠΎΠΊΠ°Π»Ρ, ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΡΡ ΡΠΏΠΈΡΠΊΡ ΡΠ·ΡΠΊΠΎΠ², Π·Π°ΠΏΡΠΎΡΠ΅Π½Π½ΠΎΠΌΡ Π² HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ "Accept-Language".
headerΠ‘ΡΡΠΎΠΊΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ "Accept-Language" Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΡΠΎΡΠΌΠ°ΡΠΎΠΌ RFC 2616.
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π»ΠΎΠΊΠ°Π»ΠΈ.
ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ false, Π΅ΡΠ»ΠΈ Π΄Π»ΠΈΠ½Π° header ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ INTL_MAX_LOCALE_LEN.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ locale_accept_from_http()
<?php
$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>ΠΡΠΈΠΌΠ΅Ρ #2 ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΡΠΈΠ»Π΅
<?php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale;
?>Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
en_US
It's good to mention that if user browser will not send HTTP_ACCEPT_LANGUAGE, the output from:
Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
Will be null.
So remember to set up a fail over scenario!If you're struggling to figure out how to use this function in a project that only supports certain languages, move along.
Unfortunately, this function doesn't let you specify languages supported by your project - and since the internal header parsing and negotiation logic isn't exposed in any other way, you'll most likely want to ditch this function and go for a custom implementation of the same thing:
https://github.com/willdurand/NegotiationDidn't see this being documented anywhere and the bug hasn't been addressed yet, so to save headache for otherS, this method does a little weird thing with these different locales:
php > echo locale_accept_from_http("zh_TW");
zh
php > echo locale_accept_from_http("zh_CN");
zhA nice way to detect humans. Bots usually dont have this HTTP_ACCEPT_LANGUAGE set.Please note that this method can throw IntlException in some cases when the passed header string is invalid AND you have enabled exceptions. For example:
<?php
ini_set('intl.use_exceptions', 1);
$header = 'fr-FR,fr;q=0.9,fr;q=0.9;q=0.8,en-gb;q=0.8;q=0.7,en;q=0.6,en;q=0.7;q=0.5,*;q=0.5;q=0.4';
var_dump(locale_accept_from_http($header));
?>
Returns:
PHP Warning: Uncaught IntlException: locale_accept_from_http: failed to find acceptable locale in ...