Skip to content

Latest commit



80 lines (62 loc) · 2.43 KB

File metadata and controls

80 lines (62 loc) · 2.43 KB

Custom Locale Adapter

In most cases there is no need of a custom adapter since both default adapters are sufficient for your daily business. If you're using complex zones, however, you may want to deliver different data for each zone.

1. Create a Service

# config/services.yaml
    parent: I18nBundle\Adapter\LocaleProvider\AbstractLocale
    decorates: I18nBundle\Adapter\LocaleProvider\SystemLocaleProvider # use a decorator
    public: false
        - '@App\Services\I18nBundle\LocaleAdapter\SpecialLocaleProvider.inner'
        - { name: i18n.adapter.locale, alias: special }

2. Set Locale Adapter in your Configuration

# config/packages/i18n.yaml
    locale_adapter: special

3. Create a class

Create a class, extend it from AbstractLocale. In this example, we'll remove some locales if we're in a different zone (example code below). We're also using the system adapter as a decorator, so we don't have to implement all methods again.


namespace App\Services\I18nBundle\LocaleAdapter;

use I18nBundle\Adapter\LocaleProvider\AbstractLocaleProvider;
use I18nBundle\Adapter\LocaleProvider\SystemLocaleProvider;

class SpecialLocaleProvider extends AbstractLocale
    protected SystemLocaleProvider $systemLocaleProvider;

    public function __construct(SystemLocaleProvider $systemLocaleProvider)
        $this->systemLocaleProvider = $systemLocaleProvider;

    public function getDefaultLocale(array $zoneDefinition): ?string
        return $this->systemLocaleProvider->getDefaultLocale($zoneDefinition);

    public function getActiveLocales(array $zoneDefinition): array
        // get default locales
        $validLocales = $this->systemLocaleProvider->getActiveLocales($zoneDefinition);

        // remove some locales in zone 4
        if ($this->currentZoneId === 4) {

        return $validLocales;

    public function getLocaleData(array $zoneDefinition, $locale = '', $field = null, $keyIdentifier = 'locale'): mixed
        return $this->systemLocaleProvider->getLocaleData($zoneDefinition, $locale, $field, $keyIdentifier);

    public function getGlobalInfo(array $zoneDefinition): array
        return $this->systemLocaleProvider->getGlobalInfo($zoneDefinition);