Skip to content

Inconsistency between code and doc translation of modules #2148

Description

@sandra2n

Prerequisites

Describe the bug and add attachments

Hello,
I tried to use the documentation way of translating in a module (in php files), using variables like %name%, but got an error when trying to translate "You must specify as many arguments (%d, %s ...) as the original string."

If instead of doing "The %name% does not exists" I do "The %s does not exists" it works.

Steps to reproduce

  1. Create a translation like that "$this->trans('The %name% does not exists', ['%name%' => $name], 'Modules.Mymodule.Admin');"
  2. Try to translate by something like "Le nom %name% n'existe pas"
  3. Save. It will display a success but will not actually save it.
  4. In Prestashop logs you will see the error "You must specify as many arguments (%d, %s ...) as the original string."

Expected behavior

The expected behavior would be to either fix the code to make it works like the doc says it should, or fix the doc to the way the code works.

Actual Result

The issue seem to come from the file "src\PrestaShopBundle\Translation\Constraints\PassVsprintfValidator.php" in the validate() function, where the test on the numbers of argument from original string and translated string return something different.

If we go in the function returning those numbers (same file function countArgumentsOfTranslation()) and display what is found by the regex used there, we can see that the original string will have one argument "% d" while the translated string will have no argument. That is because the regex seems to get "%" + optional number+ authorized letter in a list.
Since "n" is not in the list of authorized letter, the first "%" is ignored in both string and the second of the translated string to as it is followed by " n'existe", but since "d" is authorized, the second "%" of the original string is considered a variable as it is followed by " does".

Using codes like in sprintf seems to works as the list of authorized letters is mostly similar to what is found in the PHP doc of sprintf.
The used regex is in file "src\PrestaShopBundle\Translation\PrestaShopTranslatorTrait.php" and look like this: "#(?:%%|%(?:[0-9]+$)?[+-]?(?:[ 0]|'.)?-?[0-9]*(?:.[0-9]+)?[bcdeufFosxX])#"

PrestaShop version where the bug happens

9.0.0

Module version where the bug happens

1.0.0

PHP version(s) where the bug happened

8.3

Your company or customer's name goes here (if applicable).

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Fields

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions