# Laminas InputFilter does not translate some validator messages

**URL:** <https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768>\
**Category:** Components & MVC\
**Tags:** laminas-validator, laminas-i18n\
**Created:** [August 1, 2020, 6:43pm UTC](https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768 "2020-08-01T18:43:48Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![eguvenc](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/eguvenc/32/265_2.png) [@eguvenc](https://discourse.laminas.dev/u/eguvenc)\
**Post date:** [August 1, 2020, 6:43pm UTC](https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768/1 "2020-08-01T18:43:48Z")

</div>

I have some code like below. I set the data[‘password’] = ‘’ input filter translate the error message well.  
But when i set it as data[‘password’] = ‘123’ translator does not translate the error message.  
i appreciate any help.

```php
error_reporting(E_ALL);
ini_set('display_erros', 1);

include 'vendor/autoload.php';

use Laminas\I18n\Translator\Translator;
use Laminas\I18n\Translator\Resources;
use Laminas\InputFilter\InputFilter;
use Laminas\Filter\StringTrim;
use Laminas\Filter\StripTags;
use Laminas\Validator\StringLength;

$translator = new Translator;
$translator->setLocale('es');
$translator->addTranslationFilePattern(
    'phpArray',
    Resources::getBasePath(),
    Resources::getPatternForValidator()
);
// $data['password'] = ''; // Se requiere un valor y éste no puede estar vacío
$data['password'] = 123; // The input is less than 6 characters long

$inputFilter = new InputFilter();
$inputFilter->add([
    'name' => 'password',
    'required' => true,
    'filters' => [
        ['name' => StripTags::class],
        ['name' => StringTrim::class],
    ],
    'validators' => [
        [
            'name' => StringLength::class,
            'options' => [
                'encoding' => 'UTF-8',
                'min' => 6,
                'max' => 24,
            ],
        ],
    ],
]);
$inputFilter->setData($data);

if (! $inputFilter->isValid()) {
    foreach ($inputFilter->getInvalidInput() as $field => $error) {
        foreach (array_values($error->getMessages()) as $message) {
        	echo $translator->translate($message).PHP_EOL;
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![thbenda](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/thbenda/32/735_2.png) [@thbenda](https://discourse.laminas.dev/u/thbenda)\
**Post date:** [August 2, 2020, 9:18am UTC](https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768/2 "2020-08-02T09:18:27Z")

</div>

Hello,

Maybe you must configure specific error messages in your field for that validator.  
Global messages are a precious first step to i18n your application. But they are only a starting point.

Verify you have set your namespace too. Very often, you are query some module scope related translations : `$this->translate($message, __NAMESPACE__ );`

In a full webapplication, I have a full i18n system working very well without any problem, so components are working well. Check your configuration :

> ```
> 'translator' => [
> 'locale' => [
> 'fr_FR', // default locale
> 'en_GB' // fallback locale
> ],
> 'translation_file_patterns' => [
> [
> 'type' => PhpArray::class,
> 'base_dir' => getcwd() . '/data/i18n',
> 'pattern' => 'lang-%s.php'
> ],
> [
> 'type' => PhpArray::class,
> 'base_dir' => __DIR__. '/../languages',
> 'pattern' => 'lang4module-%s.php'
> ],
> ],
> ],
> 
> ```

If you want to translate your routes, do not forget :

> ```
> 'router' => [
> 'router_class' => TranslatorAwareTreeRouteStack::class,
> 'routes' => [
> 
> ```

And of course add aliases to resolve some services :

> ```
> 'service_manager' => [
> 'factories' => [
> 'MvcTranslator' => TranslatorServiceFactory::class,
> ],
> 'aliases' => [
> 'translator' => 'MvcTranslator',
> ],
> ],
> 
> ```

---

<div class="post-metadata">

**Author:** ![eguvenc](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/eguvenc/32/265_2.png) [@eguvenc](https://discourse.laminas.dev/u/eguvenc)\
**Post date:** [August 3, 2020, 4:20pm UTC](https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768/3 "2020-08-03T16:20:07Z")

</div>

hello thanks for your reply i know that it works properly in mvc but this is not a mvc application, it is just a standalone script that i created and i added the service manager to the application as below but i couldn’t find a solution.

```php
<?php

require 'vendor/autoload.php';

use Laminas\ServiceManager\ServiceManager;
use Laminas\I18n\Translator\TranslatorServiceFactory;
use Laminas\ModuleManager\Listener\ServiceListener;
use Laminas\I18n\Translator\Resources;
use Laminas\InputFilter\InputFilter;
use Laminas\InputFilter\InputFilterPluginManager;
use Laminas\InputFilter\InputFilterPluginManagerFactory;

$appConfig = [
    // Additional modules to include when in development mode
    'modules' => [
		'Laminas\I18n',
        'Laminas\InputFilter',
    ],
    // Configuration overrides during development mode
    'module_listener_options' => [
        // 'config_glob_paths' => [realpath( __DIR__ ) . '/config/autoload/{,*.}{global,local}-development.php'],
        'config_glob_paths' => [realpath( __DIR__ ) . '/config/autoload/*.php'],

        // Whether or not to enable a configuration cache.
        // If enabled, the merged configuration will be cached and used in
        // subsequent requests.
        // 
        'config_cache_enabled' => true,
        // Whether or not to enable a module class map cache.
        // If enabled, creates a module class map cache which will be used
        // by in future requests, to reduce the autoloading process.
        // 
        'module_map_cache_enabled' => false,
        // The path in which to cache merged configuration.
        // 
        'cache_dir' => 'data/cache/',
    ],
];
$container = new ServiceManager;
$container->setFactory('MvcTranslator', TranslatorServiceFactory::class);
$container->setFactory('InputFilterPluginManager', InputFilterPluginManagerFactory::class);
$container->setFactory(Laminas\Config\Config::class, 'App\Factory\ConfigFactory');
$container->setFactory(Laminas\ModuleManager\ModuleManager::class, 'App\Factory\ModuleManagerFactory');
$container->setAlias('config', Laminas\Config\Config::class);
$container->setAlias('translator', 'MvcTranslator');
$container->setService('ServiceListener', new ServiceListener($container));
$container->setService('appConfig', $appConfig);

$translator = $container->get('translator');
$translator->setLocale('es');
$translator->addTranslationFilePattern(
    'phpArray',
    Resources::getBasePath(),
    Resources::getPatternForValidator()
);
$inputFilter = new InputFilter();
$inputFilter->add([
    'name' => 'password',
    'required' => true,
    'filters' => [
        ['name' => StripTags::class],
        ['name' => StringTrim::class],
    ],
    'validators' => [
        [
            'name' => StringLength::class,
            'options' => [
                'encoding' => 'UTF-8',
                'min' => 6,
                'max' => 24,
            ],
        ],
    ],
]);
$pluginManager = $container->get('InputFilterPluginManager');
$pluginManager->setService('my_filter', $inputFilter);

$myFilter = $pluginManager->get('my_filter');

// $data['password'] = ''; // Se requiere un valor y éste no puede estar vacío
$data['password'] = 123; // The input is less than 6 characters long
$myFilter->setData($data);

if (! $myFilter->isValid()) {
    foreach ($myFilter->getInvalidInput() as $field => $error) {
        foreach (array_values($error->getMessages()) as $message) {
            echo $translator->translate($message).PHP_EOL;
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![froschdesign](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/froschdesign/32/38_2.png) [@froschdesign](https://discourse.laminas.dev/u/froschdesign)\
**Post date:** [August 4, 2020, 6:37am UTC](https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768/4 "2020-08-04T06:37:44Z")

</div>

> [@eguvenc](#):
>
> I set the data[‘password’] = ‘’ input filter translate the error message well.  
> But when i set it as data[‘password’] = ‘123’ translator does not translate the error message.

This is all correct because if the value is empty then the [message](https://github.com/laminas/laminas-i18n-resources/blob/a7cbc750d3890617338da059cdcf82e7623a3fa6/languages/es/Laminas_Validate.php#L252) can be found with the translator:

```auto
"Value is required and can't be empty" => "Se requiere un valor y éste no puede estar vacío",

```

But then you try to find: “The input is less than 6 characters long” – this message is not included in any translation file. Only this [one](https://github.com/laminas/laminas-i18n-resources/blob/a7cbc750d3890617338da059cdcf82e7623a3fa6/languages/es/Laminas_Validate.php#L282):

```auto
"The input is less than %min% characters long" => "El valor especificado tiene menos de '%min%' caracteres",

```

Extend your setup:

```php
$translator = new Laminas\I18n\Translator\Translator;
$translator->setLocale('es');
$translator->addTranslationFilePattern(
    Laminas\I18n\Translator\Loader\PhpArray::class,
    Laminas\I18n\Translator\Resources::getBasePath(),
    Laminas\I18n\Translator\Resources::getPatternForValidator()
);

// Set default translator for validators 
Laminas\Validator\AbstractValidator::setDefaultTranslator(
    new Laminas\Mvc\I18n\Translator($translator)
);

$inputFilter = new Laminas\InputFilter\InputFilter();
$inputFilter->add(
    [
        'name' => 'password',
        'required' => true,
        'filters' => [
            ['name' => Laminas\Filter\StripTags::class],
            ['name' => Laminas\Filter\StringTrim::class],
        ],
        'validators' => [
            [
                'name' => Laminas\Validator\StringLength::class,
                'options' => [
                    'encoding' => 'UTF-8',
                    'min' => 6,
                    'max' => 24,
                ],
            ],
        ],
    ]
);
$inputFilter->setData(['password' => 123]);

if (! $inputFilter->isValid()) {
    foreach ($inputFilter->getInvalidInput() as $field => $error) {
        foreach (array_values($error->getMessages()) as $message) {
            echo $message . PHP_EOL;
        }
    }
}

```

> [@eguvenc](#):
>
> it is just a standalone script that i created and i added the service manager to the application as below but i couldn’t find a solution.

This all is not needed and you should not do this way. Don’t try to rebuild a laminas-mvc application.

---

<div class="post-metadata">

**Author:** ![eguvenc](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/eguvenc/32/265_2.png) [@eguvenc](https://discourse.laminas.dev/u/eguvenc)\
**Post date:** [August 4, 2020, 5:12pm UTC](https://discourse.laminas.dev/t/laminas-inputfilter-does-not-translate-some-validator-messages/1768/5 "2020-08-04T17:12:34Z")

</div>

This is exactly what I wanted. Thanks. 😊. Sometimes i need small scripts which does not requires mvc . 🍻
