PHPackages                             arraypress/wp-accept-language-utils - 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. [Utility &amp; Helpers](/categories/utility)
4. /
5. arraypress/wp-accept-language-utils

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

arraypress/wp-accept-language-utils
===================================

A lean WordPress utility for parsing and working with HTTP Accept-Language headers

067PHP

Since Jan 17Pushed 5mo agoCompare

[ Source](https://github.com/arraypress/wp-accept-language-utils)[ Packagist](https://packagist.org/packages/arraypress/wp-accept-language-utils)[ RSS](/packages/arraypress-wp-accept-language-utils/feed)WikiDiscussions main Synced today

READMEChangelogDependenciesVersions (1)Used By (0)

WordPress Accept-Language Utilities
===================================

[](#wordpress-accept-language-utilities)

A lean WordPress utility for parsing and working with HTTP Accept-Language headers. Built for multilingual sites, content negotiation, and language-based conditional functionality.

Features
--------

[](#features)

- 🌍 **Language Detection** - Parse Accept-Language header with quality values
- 🎯 **Best Match** - Find the best language from your available translations
- 🔄 **RTL Detection** - Identify right-to-left language preferences
- 📊 **Quality Values** - Access preference weights for each language
- 🛠️ **Normalization** - Consistent locale formatting (en-US, de-AT)

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

[](#requirements)

- PHP 7.4 or later
- WordPress 5.0 or later

Installation
------------

[](#installation)

```
composer require arraypress/wp-accept-language-utils
```

Usage
-----

[](#usage)

### Basic Language Detection

[](#basic-language-detection)

```
use ArrayPress\AcceptLanguageUtils\AcceptLanguage;

// Get the user's primary preferred language
$primary = AcceptLanguage::get_primary();
// Returns: "en-US", "de", "fr-CA", etc.

// Get just the language code (without region)
$language = AcceptLanguage::get_primary_language();
// Returns: "en", "de", "fr"

// Get the region code
$region = AcceptLanguage::get_primary_region();
// Returns: "US", "CA", "GB", or null
```

### Finding Best Match

[](#finding-best-match)

```
// Your site's available languages
$available = ['en', 'de', 'fr', 'es'];

// Find the best match for the user
$best = AcceptLanguage::get_best_match( $available, 'en' );
// Returns best match or 'en' as default

// WordPress integration
$locale = AcceptLanguage::get_best_match(
    get_available_languages(),
    'en_US'
);
```

### Checking Language Acceptance

[](#checking-language-acceptance)

```
// Check if user accepts a language
if ( AcceptLanguage::accepts( 'de' ) ) {
    // Show German content option
}

// Exact match only (e.g., en-US vs en-GB)
if ( AcceptLanguage::accepts( 'en-US', true ) ) {
    // US English specifically accepted
}

// Get the quality/preference value (0.0 to 1.0)
$quality = AcceptLanguage::get_quality( 'fr' );
// Returns: 0.8, 1.0, etc. or null
```

### RTL Detection

[](#rtl-detection)

```
// Check if user prefers RTL language
if ( AcceptLanguage::is_rtl() ) {
    wp_enqueue_style( 'theme-rtl', 'css/rtl.css' );
}
```

### Parsing the Full Header

[](#parsing-the-full-header)

```
// Get all languages with quality values
$languages = AcceptLanguage::parse();
// Returns: ['en-US' => 1.0, 'en' => 0.9, 'de' => 0.8]

// Get all language codes (without quality values)
$all = AcceptLanguage::get_all();
// Returns: ['en-US', 'en', 'de']

// Get unique base languages only
$unique = AcceptLanguage::get_languages();
// Returns: ['en', 'de'] (no duplicates)
```

### Utility Functions

[](#utility-functions)

```
// Normalize a language code
$normalized = AcceptLanguage::normalize( 'EN-us' );
// Returns: "en-US"

// Extract language from locale
$lang = AcceptLanguage::extract_language( 'en-US' );
// Returns: "en"

// Extract region from locale
$region = AcceptLanguage::extract_region( 'en-US' );
// Returns: "US"
```

Common Use Cases
----------------

[](#common-use-cases)

### Multilingual Content Switching

[](#multilingual-content-switching)

```
function get_user_content_language() {
    $available = [ 'en', 'de', 'fr', 'es', 'ja' ];

    // Check for user preference cookie first
    if ( isset( $_COOKIE['preferred_lang'] ) ) {
        return $_COOKIE['preferred_lang'];
    }

    // Fall back to Accept-Language header
    return AcceptLanguage::get_best_match( $available, 'en' );
}
```

### Conditional Asset Loading

[](#conditional-asset-loading)

```
function enqueue_language_assets() {
    // Load RTL stylesheet if needed
    if ( AcceptLanguage::is_rtl() ) {
        wp_enqueue_style( 'theme-rtl', get_template_directory_uri() . '/rtl.css' );
    }

    // Load language-specific scripts
    $lang = AcceptLanguage::get_primary_language();
    $script = "js/i18n/{$lang}.js";

    if ( file_exists( get_template_directory() . '/' . $script ) ) {
        wp_enqueue_script( 'theme-i18n', get_template_directory_uri() . '/' . $script );
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_language_assets' );
```

### E-commerce Localization

[](#e-commerce-localization)

```
function set_store_locale() {
    $available = [
        'en-US' => 'USD',
        'en-GB' => 'GBP',
        'de-DE' => 'EUR',
        'ja-JP' => 'JPY',
    ];

    $locale = AcceptLanguage::get_best_match( array_keys( $available ), 'en-US' );

    return [
        'locale'   => $locale,
        'currency' => $available[ $locale ],
    ];
}
```

### Language Preference Logging

[](#language-preference-logging)

```
function log_visitor_language( $order_id ) {
    $order = wc_get_order( $order_id );

    $order->update_meta_data( 'browser_language', AcceptLanguage::get_primary() );
    $order->update_meta_data( 'browser_languages', implode( ', ', AcceptLanguage::get_all() ) );
    $order->save();
}
add_action( 'woocommerce_new_order', 'log_visitor_language' );
```

Helper Functions
----------------

[](#helper-functions)

Global functions are available for common operations:

```
// Get primary language
$lang = get_accept_language();

// Find best match from available
$best = get_preferred_language( ['en', 'de', 'fr'], 'en' );

// Check if language is accepted
if ( accepts_language( 'de' ) ) {
    // ...
}

// Check RTL preference
if ( is_rtl_language() ) {
    // ...
}
```

API Reference
-------------

[](#api-reference)

MethodDescriptionReturns`get_header()`Get raw Accept-Language header`?string``get_primary()`Get preferred language code`?string``get_primary_language()`Get language without region`?string``get_primary_region()`Get region code only`?string``parse()`Parse header to array with quality`array``get_all()`Get all language codes`array``get_languages()`Get unique base languages`array``accepts( $lang, $exact )`Check if language accepted`bool``get_quality( $lang )`Get quality value for language`?float``get_best_match( $available, $default )`Find best match`?string``is_rtl()`Check if primary is RTL`bool``normalize( $code )`Normalize language code`string``extract_language( $locale )`Extract language from locale`string``extract_region( $locale )`Extract region from locale`?string``get_common_languages( $as_options )`Get language list for dropdowns`array`Supported RTL Languages
-----------------------

[](#supported-rtl-languages)

Arabic, Hebrew, Persian/Farsi, Urdu, Yiddish, Pashto, Sindhi, Uyghur, Kurdish (Sorani), Divehi

License
-------

[](#license)

GPL-2.0-or-later

Support
-------

[](#support)

- [Documentation](https://github.com/arraypress/wp-accept-language-utils)
- [Issue Tracker](https://github.com/arraypress/wp-accept-language-utils/issues)

###  Health Score

20

—

LowBetter than 13% of packages

Maintenance48

Moderate activity, may be stable

Popularity11

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity13

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% 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.

### Community

Maintainers

![](https://www.gravatar.com/avatar/cd6eb8aff0903d87eb674d1ba3c5f3653899c0d7661504eb0deb7798ed86b643?d=identicon)[arraypress](/maintainers/arraypress)

---

Top Contributors

[![arraypress](https://avatars.githubusercontent.com/u/22668877?v=4)](https://github.com/arraypress "arraypress (3 commits)")

### Embed Badge

![Health badge](/badges/arraypress-wp-accept-language-utils/health.svg)

```
[![Health](https://phpackages.com/badges/arraypress-wp-accept-language-utils/health.svg)](https://phpackages.com/packages/arraypress-wp-accept-language-utils)
```

###  Alternatives

[ttree/contentrepositoryimporter

Helper package to import data in the Neos content repository

1510.2k](/packages/ttree-contentrepositoryimporter)

PHPackages © 2026

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