codezero/browser-locale

从访客浏览器中获取最优先的区域设置。

3.4.0 2024-03-02 12:51 UTC

This package is auto-updated.

Last update: 2024-08-31 00:26:20 UTC


README

GitHub release License Build Status Code Coverage Code Quality Total Downloads

ko-fi

从访客浏览器中获取最优先的区域设置。

每个浏览器都有一个首选网站区域的设置。

这可以通过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  
}

过滤区域信息

您可以得到一个仅包含特定区域信息的扁平数组。这些数组始终按权重降序排列。将不会有重复的值!(例如,enen-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)。有关更多信息,请参阅许可文件