parameters:
    oro_locale.entity.localization.class: Oro\Bundle\LocaleBundle\Entity\Localization
    oro_locale.entity.localized_fallback_value.class: Oro\Bundle\LocaleBundle\Entity\LocalizedFallbackValue

    oro_locale.settings.class: Oro\Bundle\LocaleBundle\Model\LocaleSettings
    oro_locale.calendar.class: Oro\Bundle\LocaleBundle\Model\Calendar
    oro_locale.calendar_factory.class: Oro\Bundle\LocaleBundle\Model\CalendarFactory

    oro_locale.format_converter.date_time.registry.class: Oro\Bundle\LocaleBundle\Converter\DateTimeFormatConverterRegistry
    oro_locale.format_converter.date_time.intl.class: Oro\Bundle\LocaleBundle\Converter\IntlDateTimeFormatConverter
    oro_locale.format_converter.date_time.moment.class: Oro\Bundle\LocaleBundle\Converter\MomentDateTimeFormatConverter
    oro_locale.format_converter.date_time.php.class: Oro\Bundle\LocaleBundle\Converter\PhpDateTimeFormatConverter

    oro_locale.formatter.name.class:      Oro\Bundle\LocaleBundle\Formatter\NameFormatter
    oro_locale.formatter.address.class:   Oro\Bundle\LocaleBundle\Formatter\AddressFormatter
    oro_locale.formatter.date_time.class: Oro\Bundle\LocaleBundle\Formatter\DateTimeFormatter
    oro_locale.formatter.number.class:    Oro\Bundle\LocaleBundle\Formatter\NumberFormatter

    oro_locale.dql.formatter.name.class:  Oro\Bundle\LocaleBundle\DQL\DQLNameFormatter

    oro_locale.entity_name_provider.class: Oro\Bundle\LocaleBundle\Provider\EntityNameProvider

    oro_locale.locale_listener.class:   Oro\Bundle\LocaleBundle\EventListener\LocaleListener

    oro_locale.twig.date_format.class: Oro\Bundle\LocaleBundle\Twig\DateFormatExtension
    oro_locale.twig.locale.class: Oro\Bundle\LocaleBundle\Twig\LocaleExtension
    oro_locale.twig.calendar.class: Oro\Bundle\LocaleBundle\Twig\CalendarExtension
    oro_locale.twig.date_time.class: Oro\Bundle\LocaleBundle\Twig\DateTimeExtension
    oro_locale.twig.name.class: Oro\Bundle\LocaleBundle\Twig\NameExtension
    oro_locale.twig.address.class: Oro\Bundle\LocaleBundle\Twig\AddressExtension
    oro_locale.twig.number.class: Oro\Bundle\LocaleBundle\Twig\NumberExtension

    oro_locale.formatter.datetime.class: Oro\Bundle\LocaleBundle\Formatter\DateTimeValueFormatter
    oro_locale.formatter.date.class: Oro\Bundle\LocaleBundle\Formatter\DateValueFormatter

    oro_locale.entity_generator.extension.class: Oro\Bundle\LocaleBundle\Tools\GeneratorExtensions\DefaultFallbackGeneratorExtension

services:
    oro_locale.settings:
        class: %oro_locale.settings.class%
        arguments:
            - '@oro_config.user'
            - '@oro_locale.calendar_factory'
        calls:
            - [addNameFormats, [%oro_locale.format.name%]]
            - [addAddressFormats, [%oro_locale.format.address%]]
            - [addLocaleData, [%oro_locale.locale_data%]]
            - [addCurrencyData, [%oro_locale.currency_data%]]

    oro_locale.helper.localization:
        class: 'Oro\Bundle\LocaleBundle\Helper\LocalizationHelper'
        arguments:
            - '@oro_locale.manager.localization'
            - '@oro_locale.provider.current_localization'

    oro_locale.listener.orm.localization_listener:
        class: 'Oro\Bundle\LocaleBundle\EventListener\ORM\LocalizationListener'
        public: false
        arguments:
            - '@oro_locale.translation.strategy.localization_fallback_strategy'
        tags:
            - { name: doctrine.orm.entity_listener, entity: '%oro_locale.entity.localization.class%', event: postPersist }
            - { name: doctrine.orm.entity_listener, entity: '%oro_locale.entity.localization.class%', event: postUpdate }
            - { name: doctrine.orm.entity_listener, entity: '%oro_locale.entity.localization.class%', event: postRemove }

    oro_locale.datagrid.extension.localized_value:
        class: 'Oro\Bundle\LocaleBundle\Datagrid\Extension\LocalizedValueExtension'
        arguments:
            - '@oro_entity.doctrine_helper'
            - '@oro_locale.helper.localization'
        tags:
            - { name: oro_datagrid.extension }

    oro_locale.datagird.formatter.localized_value_property:
        class: 'Oro\Bundle\LocaleBundle\Datagrid\Formatter\Property\LocalizedValueProperty'
        tags:
            - { name:  oro_datagrid.extension.formatter.property, type: localized_value }

    oro_locale.translation.strategy.localization_fallback_strategy:
        class: 'Oro\Bundle\LocaleBundle\Translation\Strategy\LocalizationFallbackStrategy'
        public: false
        arguments:
            - '@doctrine'
            - '@oro_locale.cache.provider.tree_fallback_strategy'
        calls:
            - [setEntityClass, ['%oro_locale.entity.localization.class%']]

    # Calendar
    oro_locale.calendar:
        scope: prototype
        class: %oro_locale.calendar.class%

    oro_locale.calendar_factory:
        class: %oro_locale.calendar_factory.class%
        arguments:
            - '@service_container'

    # Converters
    oro_locale.format_converter.date_time.registry:
        class: %oro_locale.format_converter.date_time.registry.class%

    oro_locale.format_converter.date_time.intl:
        class: %oro_locale.format_converter.date_time.intl.class%
        arguments:
            - '@oro_locale.formatter.date_time'
            - '@translator'
        tags:
            - { name: oro_locale.format_converter.date_time, alias: intl }

    oro_locale.format_converter.date_time.moment:
        class: %oro_locale.format_converter.date_time.moment.class%
        arguments:
            - '@oro_locale.formatter.date_time'
            - '@translator'
        tags:
            - { name: oro_locale.format_converter.date_time, alias: moment }

    oro_locale.format_converter.date_time.php:
        class: %oro_locale.format_converter.date_time.php.class%
        arguments:
            - '@oro_locale.formatter.date_time'
            - '@translator'
        tags:
            - { name: oro_locale.format_converter.date_time, alias: php }

    # event listeners
    oro_locale.locale_listener:
        class: %oro_locale.locale_listener.class%
        arguments:
            - '@service_container'
        tags:
            - { name: kernel.event_subscriber }

    # Formatters
    oro_locale.formatter.name:
        class: %oro_locale.formatter.name.class%
        arguments:
            - '@oro_locale.settings'

    oro_locale.formatter.name.link:
        tags:
            - { name: oro_service_link, service: oro_locale.formatter.name }

    oro_locale.formatter.address:
        class: %oro_locale.formatter.address.class%
        arguments:
            - '@oro_locale.settings'
            - '@oro_locale.formatter.name'

    oro_locale.formatter.date_time:
        class: %oro_locale.formatter.date_time.class%
        arguments:
            - '@oro_locale.settings'
            - '@translator'

    oro_locale.formatter.number:
        class: %oro_locale.formatter.number.class%
        arguments:
            - '@oro_locale.settings'

    # DQL formatter
    oro_locale.dql.formatter.name:
        class: %oro_locale.dql.formatter.name.class%
        arguments:
            - '@oro_locale.formatter.name'

    oro_locale.dql.formatter.name.link:
        tags:
            - { name: oro_service_link, service: oro_locale.dql.formatter.name }

    oro_locale.formatter.language_code:
        class: 'Oro\Bundle\LocaleBundle\Formatter\LanguageCodeFormatter'
        arguments:
            - '@translator'
            - '@oro_config.global'

    oro_locale.formatter.formatting_code:
        class: 'Oro\Bundle\LocaleBundle\Formatter\FormattingCodeFormatter'
        arguments:
            - '@translator'
            - '@oro_config.global'

    # Twig extensions
    oro_locale.twig.date_format:
        class: %oro_locale.twig.date_format.class%
        arguments:
            - '@oro_locale.format_converter.date_time.registry'
        tags:
            - { name: twig.extension }

    oro_locale.twig.locale:
        class: %oro_locale.twig.locale.class%
        arguments:
            - '@oro_locale.settings'
        tags:
            - { name: twig.extension }

    oro_locale.twig.calendar:
        class: %oro_locale.twig.calendar.class%
        arguments:
            - '@oro_locale.settings'
        tags:
            - { name: twig.extension }

    oro_locale.twig.date_time:
        class: %oro_locale.twig.date_time.class%
        arguments:
            - '@oro_locale.formatter.date_time'
        tags:
            - { name: twig.extension }

    oro_locale.twig.name:
        class: %oro_locale.twig.name.class%
        arguments:
            - '@oro_entity.twig.extension.entity'

    oro_locale.twig.address:
        class: %oro_locale.twig.address.class%
        arguments:
            - '@oro_locale.formatter.address'
        tags:
            - { name: twig.extension }

    oro_locale.twig.number:
        class: %oro_locale.twig.number.class%
        arguments:
            - '@oro_locale.formatter.number'
        tags:
            - { name: twig.extension }

    oro_locale.twig.localization:
        class: 'Oro\Bundle\LocaleBundle\Twig\LocalizationExtension'
        arguments:
            - '@oro_locale.formatter.language_code'
            - '@oro_locale.formatter.formatting_code'
            - '@oro_locale.helper.localization'
        tags:
            - { name: twig.extension }

    oro_locale.format.datetime:
        class: %oro_locale.formatter.datetime.class%
        arguments:
            - '@oro_locale.formatter.date_time'
            - '@translator'
        tags:
            - { name: oro_formatter, formatter: datetime }

    oro_locale.format.date:
        class: %oro_locale.formatter.date.class%
        arguments:
            - '@oro_locale.formatter.date_time'
            - '@translator'
        tags:
            - { name: oro_formatter, formatter: date }

    oro_locale.format.currency:
        class: Oro\Bundle\LocaleBundle\Formatter\CurrencyFormatter
        arguments:
            - '@oro_locale.twig.number'
        tags:
            - { name: oro_formatter, formatter: currency }

    oro_locale.entity_name_provider:
        class: %oro_locale.entity_name_provider.class%
        public: false
        arguments:
            - '@oro_locale.formatter.name.link'
            - '@oro_locale.dql.formatter.name.link'
        tags:
            - { name: oro_entity.name_provider, priority: -90 }

    oro_locale.validator.localization:
        class: 'Oro\Bundle\LocaleBundle\Validator\Constraints\LocalizationValidator'
        public: true
        tags:
            - { name: validator.constraint_validator, alias: oro_locale.localization_validator }

    oro_locale.validator.default_localization:
        class: 'Oro\Bundle\LocaleBundle\Validator\Constraints\DefaultLocalizationValidator'
        arguments:
            - '@oro_locale.manager.localization'
        tags:
            - { name: validator.constraint_validator, alias: oro_locale.default_localization_validator }

    oro_locale.acl.voter.localization:
        class: 'Oro\Bundle\LocaleBundle\Acl\Voter\LocalizationVoter'
        arguments:
            - '@oro_entity.doctrine_helper'
        calls:
            - [setClassName, ['%oro_locale.entity.localization.class%']]
        tags:
            - { name: security.voter }

    oro_locale.repository.localization:
        class: 'Oro\Bundle\LocaleBundle\Entity\Repository\LocalizationRepository'
        parent: oro_entity.abstract_repository
        arguments:
            - '%oro_locale.entity.localization.class%'

    oro_locale.provider.localization_choices:
        class: 'Oro\Bundle\LocaleBundle\Provider\LocalizationChoicesProvider'
        arguments:
            - '@oro_config.manager'
            - '@oro_locale.formatter.language_code'
            - '@oro_locale.formatter.formatting_code'
            - '@oro_locale.manager.localization'

    oro_locale.manager.localization:
        class: 'Oro\Bundle\LocaleBundle\Manager\LocalizationManager'
        arguments:
            - '@oro_locale.repository.localization'
            - '@oro_config.global'

    oro_locale.provider.current_localization:
        class: 'Oro\Bundle\LocaleBundle\Provider\CurrentLocalizationProvider'

    oro_locale.entity_generator.extension:
        class: %oro_locale.entity_generator.extension.class%
        tags:
            - { name: oro_entity_extend.entity_generator_extension, priority: 255 }

    oro_locale.twig.date_time_organization:
        class: Oro\Bundle\LocaleBundle\Twig\DateTimeOrganizationExtension
        parent: oro_locale.twig.date_time
        deprecated: The "%service_id%" service is deprecated since 1.11, will be removed after 1.13.
        calls:
            - [setConfigManager, ['@oro_config.global']]
        tags:
            - { name: twig.extension }

    oro_locale.layout.data_provider.locale:
        class: Oro\Bundle\LocaleBundle\Layout\LocaleProvider
        arguments:
            - '@oro_locale.helper.localization'
        tags:
            - { name: layout.data_provider, alias: locale }
