PHPackages                             codezero/browser-locale - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Localization &amp; i18n](/categories/localization)
4. /
5. codezero/browser-locale

ActiveLibrary[Localization &amp; i18n](/categories/localization)

codezero/browser-locale
=======================

Get the most preferred locales from your visitor's browser.

3.4.0(2y ago)161.4M—8.5%5[1 PRs](https://github.com/codezero-be/browser-locale/pulls)10MITPHPPHP ^7.0|^8.0CI failing

Since Dec 15Pushed 2y ago2 watchersCompare

[ Source](https://github.com/codezero-be/browser-locale)[ Packagist](https://packagist.org/packages/codezero/browser-locale)[ Fund](https://paypal.me/ivanvermeyen)[ Fund](https://ko-fi.com/ivanvermeyen)[ RSS](/packages/codezero-browser-locale/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (9)Dependencies (2)Versions (10)Used By (10)

BrowserLocale
=============

[](#browserlocale)

[![GitHub release](https://camo.githubusercontent.com/aaeaceb26f759caa90e500b9a7b4df30012ae197ae020b558eae03dbdd7670ae/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f72656c656173652f636f64657a65726f2d62652f62726f777365722d6c6f63616c652e7376673f7374796c653d666c61742d737175617265)](https://github.com/codezero-be/browser-locale/releases)[![License](https://camo.githubusercontent.com/71865d2202ad6d75f6afcd10878b40a2991d4cf47059072e047829b33c7656f0/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f636f64657a65726f2f62726f777365722d6c6f63616c652e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)[![Build Status](https://camo.githubusercontent.com/d4c36ad12394b910e1f7181bbce043ff68dc647fb1523570aad1fd25e50eeeaa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f636f64657a65726f2d62652f62726f777365722d6c6f63616c652f72756e2d74657374732e796d6c3f7374796c653d666c61742d737175617265266c6f676f3d676974687562266c6f676f436f6c6f723d7768697465266c6162656c3d7465737473)](https://github.com/codezero-be/browser-locale/actions)[![Code Coverage](https://camo.githubusercontent.com/465ce01085e741fa502c1cbe69573560a263c4a72ac1ce57fc90633e4a22edfc/68747470733a2f2f696d672e736869656c64732e696f2f636f646163792f636f7665726167652f37393438663165616565353134653437623461303766323638616663363330662f6d61737465723f7374796c653d666c61742d737175617265)](https://app.codacy.com/gh/codezero-be/browser-locale)[![Code Quality](https://camo.githubusercontent.com/57c0cc52d99652b38805c531305d7837bdd53128de47159e50c60a5318f90608/68747470733a2f2f696d672e736869656c64732e696f2f636f646163792f67726164652f37393438663165616565353134653437623461303766323638616663363330662f6d61737465723f7374796c653d666c61742d737175617265)](https://app.codacy.com/gh/codezero-be/browser-locale)[![Total Downloads](https://camo.githubusercontent.com/84eade8a509d3a16c1850df68f54b2b953c5c156c48b5a8be547d7e85ee38517/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f636f64657a65726f2f62726f777365722d6c6f63616c652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/codezero/browser-locale)

[![ko-fi](https://camo.githubusercontent.com/1fedf764fa06114b797ee53e7506df10880abed6766f854202d758df1707969d/68747470733a2f2f7777772e6b6f2d66692e636f6d2f696d672f676974687562627574746f6e5f736d2e737667)](https://ko-fi.com/R6R3UQ8V)

Get the most preferred locales from your visitor's browser.

Every browser has a setting for preferred website locales.

This can be read by PHP, usually with the `$_SERVER["HTTP_ACCEPT_LANGUAGE"]` variable.

> `$_SERVER["HTTP_ACCEPT_LANGUAGE"]` will return a comma separated list of language codes. Each language code MAY have a "relative quality factor" attached ("nl;q=0.8") which determines the order of preference. For example: `nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4`. If no relative quality factor is present, the value is by default `1.0`.

**BrowserLocale** parses this string and lets you access the preferred locales quickly and easily.

Requirements
------------

[](#requirements)

- PHP &gt;= 7.0

Install
-------

[](#install)

```
composer require codezero/browser-locale
```

Instantiate
-----------

[](#instantiate)

For vanilla PHP:

```
$browser = new \CodeZero\BrowserLocale\BrowserLocale($_SERVER["HTTP_ACCEPT_LANGUAGE"]);
```

For Laravel:

Laravel &gt;= 5.5 will automatically register the ServiceProvider so you can get `BrowserLocale` from the IOC container.

```
$browser = \App::make(\CodeZero\BrowserLocale\BrowserLocale::class);
```

Get Primary Locale
------------------

[](#get-primary-locale)

```
$locale = $browser->getLocale();
```

This will return an instance of `\CodeZero\BrowserLocale\Locale` or `null` if no locale exists.

```
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
}
```

Get All Locales
---------------

[](#get-all-locales)

```
$locales = $browser->getLocales();
```

This will return an array of `\CodeZero\BrowserLocale\Locale` instances, sorted by weight in descending order. So the first array item is the most preferred locale.

If no locales exist, an empty array will be returned.

```
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
}
```

Filter Locale Info
------------------

[](#filter-locale-info)

You can get a flattened array with only specific Locale information. These arrays will always be sorted by weight in descending order. There will be no duplicate values! (e.g. `en` and `en-US` are both the language `en`)

### LocaleFilter

[](#localefilter)

Returns an array of every locale found in the input string.

```
$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

[](#combinedfilter)

Returns an array of every locale found in the input string, while making sure the 2-letter language version of the locale is always present.

```
$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

[](#languagefilter)

Returns an array of only the 2-letter language codes found in the input string. Language codes are also extracted from full locales and added to the results array.

```
$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

[](#countryfilter)

Returns an array of only the 2-letter country codes found in the input string. Locales that only contain a 2-letter language code will be skipped.

```
$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

[](#weightfilter)

Returns an array of all relative quality factors found in the input string. The default of `1.0` is also included.

```
$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]
```

You can create your own filters by implementing the `\CodeZero\BrowserLocale\Filters\Filter` interface.

Testing
-------

[](#testing)

```
composer test
```

Security
--------

[](#security)

If you discover any security related issues, please [e-mail me](mailto:ivan@codezero.be) instead of using the issue tracker.

Changelog
---------

[](#changelog)

A complete list of all notable changes to this package can be found on the [releases page](https://github.com/codezero-be/browser-locale/releases).

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

###  Health Score

46

—

FairBetter than 93% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity50

Moderate usage in the ecosystem

Community23

Small or concentrated contributor base

Maturity74

Established project with proven stability

 Bus Factor1

Top contributor holds 96.7% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~375 days

Recently: every ~304 days

Total

9

Last Release

807d ago

Major Versions

1.0.0 → 2.0.02018-03-31

2.0.0 → 3.0.02018-03-31

PHP version history (3 changes)1.0.0PHP &gt;=5.5.9

2.0.0PHP ^7.0

3.1.0PHP ^7.0|^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/2e17b7a892452367dfb0e5c55bf04844a16bb781f356f50019332d4b9a476ec6?d=identicon)[codezero](/maintainers/codezero)

---

Top Contributors

[![ivanvermeyen](https://avatars.githubusercontent.com/u/3598622?v=4)](https://github.com/ivanvermeyen "ivanvermeyen (58 commits)")[![pascalbaljet](https://avatars.githubusercontent.com/u/8403149?v=4)](https://github.com/pascalbaljet "pascalbaljet (1 commits)")[![vjanssens](https://avatars.githubusercontent.com/u/2340997?v=4)](https://github.com/vjanssens "vjanssens (1 commits)")

---

Tags

browserdetectionlanguagelaravellocalelocalizationphppreferred-localesphpbrowserlanguagewebsitelocalecountrydetect

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/codezero-browser-locale/health.svg)

```
[![Health](https://phpackages.com/badges/codezero-browser-locale/health.svg)](https://phpackages.com/packages/codezero-browser-locale)
```

###  Alternatives

[codezero/laravel-localizer

Automatically detect and set an app locale that matches your visitor's preference.

50394.3k4](/packages/codezero-laravel-localizer)[codezero/laravel-localized-routes

A convenient way to set up, manage and use localized routes in a Laravel app.

543638.1k4](/packages/codezero-laravel-localized-routes)[lunetics/locale-bundle

A Bundle for switching Languages

1861.1M8](/packages/lunetics-locale-bundle)[opgginc/codezero-laravel-localized-routes

A convenient way to set up, manage and use localized routes in a Laravel app.

2770.1k1](/packages/opgginc-codezero-laravel-localized-routes)[awes-io/localization-helper

Package for convenient work with Laravel's localization features

3527.1k4](/packages/awes-io-localization-helper)[tigrov/yii2-country

Country data for Yii2 using Intl extension and more.

151.1k](/packages/tigrov-yii2-country)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
