codezero / browser-locale
从访客浏览器中获取最优先的区域设置。
Requires
- php: ^7.0|^8.0
Requires (Dev)
- mockery/mockery: ^1.3.3
- phpunit/phpunit: ^6.0|^7.0|^8.0|^9.0
README
从访客浏览器中获取最优先的区域设置。
每个浏览器都有一个首选网站区域的设置。
这可以通过PHP读取,通常使用$_SERVER["HTTP_ACCEPT_LANGUAGE"]
变量。
$_SERVER["HTTP_ACCEPT_LANGUAGE"]
将返回一个由逗号分隔的语言代码列表。每个语言代码可能附加一个"相对质量因子"("nl;q=0.8"),它决定了优先级顺序。例如:nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
。如果没有相对质量因子,则默认值为1.0
。
BrowserLocale 解析此字符串,并让您快速轻松地访问首选区域。
要求
- PHP >= 7.0
安装
composer require codezero/browser-locale
实例化
对于纯PHP
$browser = new \CodeZero\BrowserLocale\BrowserLocale($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
对于Laravel
Laravel >= 5.5将自动注册ServiceProvider,因此您可以从IOC容器中获取BrowserLocale
。
$browser = \App::make(\CodeZero\BrowserLocale\BrowserLocale::class);
获取主要区域
$locale = $browser->getLocale();
这将返回一个\CodeZero\BrowserLocale\Locale
实例或null
,如果不存在区域。
if ($locale !== null) { $full = $locale->locale; // Example: "en-US" $language = $locale->language; // Example: "en" $country = $locale->country; // Example: "US" $weight = $locale->weight; // Example: 1.0 }
获取所有区域
$locales = $browser->getLocales();
这将返回一个按权重降序排列的\CodeZero\BrowserLocale\Locale
实例数组。因此,数组中的第一个项目是最优先的区域。
如果没有区域,将返回一个空数组。
foreach ($locales as $locale) { $full = $locale->locale; // Example: "en-US" $language = $locale->language; // Example: "en" $country = $locale->country; // Example: "US" $weight = $locale->weight; // Example: 1.0 }
过滤区域信息
您可以得到一个仅包含特定区域信息的扁平数组。这些数组始终按权重降序排列。将不会有重复的值!(例如,en
和en-US
都是语言en
)
LocaleFilter
返回输入字符串中找到的每个区域的数组。
$browser = new \CodeZero\BrowserLocale\BrowserLocale('en-US,en;q=0.8,nl-NL;q=0.6'); $filter = new \CodeZero\BrowserLocale\Filters\LocaleFilter; $locales = $browser->filter($filter); //=> Result: ['en-US', 'en', 'nl-BE']
CombinedFilter
返回输入字符串中找到的每个区域的数组,同时确保区域的两位语言版本始终存在。
$browser = new \CodeZero\BrowserLocale\BrowserLocale('en-US,nl;q=0.8'); $filter = new \CodeZero\BrowserLocale\Filters\CombinedFilter; $locales = $browser->filter($filter); //=> Result: ['en-US', 'en', 'nl']
LanguageFilter
返回输入字符串中仅包含的两位语言代码的数组。语言代码也来自完整的区域,并添加到结果数组中。
$browser = new \CodeZero\BrowserLocale\BrowserLocale('en-US,en;q=0.8,nl-NL;q=0.6'); $filter = new \CodeZero\BrowserLocale\Filters\LanguageFilter; $languages = $browser->filter($filter); //=> Result: ['en', 'nl']
CountryFilter
返回输入字符串中仅包含的两位国家代码的数组。仅包含两位语言代码的区域将被跳过。
$browser = new \CodeZero\BrowserLocale\BrowserLocale('en-US,en;q=0.8,nl-NL;q=0.6,nl;q=0.4'); $filter = new \CodeZero\BrowserLocale\Filters\CountryFilter; $countries = $browser->filter($filter); //=> Result: ['US', 'NL']
WeightFilter
返回输入字符串中找到的所有相对质量因子数组。默认的1.0
也被包括在内。
$browser = new \CodeZero\BrowserLocale\BrowserLocale('en-US,en;q=0.8,nl-NL;q=0.6,nl;q=0.4'); $filter = new \CodeZero\BrowserLocale\Filters\WeightFilter; $weights = $browser->filter($filter); //=> Result: [1.0, 0.8, 0.6, 0.4]
您可以通过实现\CodeZero\BrowserLocale\Filters\Filter
接口来创建自己的过滤器。
测试
composer test
安全性
如果您发现任何安全相关的问题,请通过电子邮件告诉我,而不是使用问题跟踪器。
变更日志
关于此包的所有显著更改的完整列表可以在发布页面找到。
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。