Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Translateable] missing translation table entry when string is same as in default locale #2849

Open
klemens-u opened this issue Aug 2, 2024 · 2 comments

Comments

@klemens-u
Copy link

klemens-u commented Aug 2, 2024

Environment

Symfony 7 / DoctrineExtension v3.16.1 (Version details are below)

Translateable does not create a database entry in the translation table when the string is the same as in the default locale. Example in symfony7:

        $studyField = new StudyField();
        // Make sure we're on default locale English
        $studyField->setTranslatableLocale('en');
        $studyField->setName('Software Engineering');
        $em->persist($studyField);
        $em->flush();

        // Fail: does not create an entry in translation table due to similar name (But we want this name)
        // Switch to German
        $studyField->setTranslatableLocale('de');
        $studyField->setName('Software Engineering');
        $em->persist($studyField);
        $em->flush();

        // Ok: for a non-similar string value a proper entry in translation table for "de" is created
//        $studyField->setTranslatableLocale('de');
//        $studyField->setName('Software Foo');
//        $em->persist($studyField);
//        $em->flush();

This is a problem for our custom auto translation. We don't see a valid German entry, and therefore the autotranslation creates entry "Software Entwicklung", which is not what we want.

It's counter-intuitive in other regards as well.

Why does it happen? Is there a specific reason for it? Can I deactivate this behavior?

I also appreciate hints from where in the code this behavior originates.

Thanks!

Configuration

# config/packages/stof_doctrine_extensions.yaml

stof_doctrine_extensions:
    default_locale: en
    #  If you want your application to fall back to the default locale’s translation when a specific locale’s translation is not available, you should set this to true. It's not necessary if you expect every locale to have its own complete set of translations or if you handle missing translations at the application logic level.
    translation_fallback: true
    # true: when saving $foo->setName('bar') also creates a row in ext_translations for default locale, otherwise not
    persist_default_translation: true
    orm:
      default:
        # Enable behaviors
        translatable: true
        sluggable: true
        timestampable: true

Package

$ composer show --latest gedmo/doctrine-extensions

name     : gedmo/doctrine-extensions
descrip. : Doctrine behavioral extensions
keywords : Blameable, behaviors, doctrine, extensions, gedmo, loggable, nestedset, odm, orm, sluggable, sortable, timestampable, translatable, tree, uploadable
versions : * v3.16.1
released : 2024-06-25, 1 month ago
latest   : v3.16.1 released 2024-06-25, 1 month ago
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
homepage : http://gediminasm.org/
source   : [git] https://github.com/doctrine-extensions/DoctrineExtensions.git e85560ed96f977b8c29428a99222cb2ef2f0e80d
dist     : [zip] https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/e85560ed96f977b8c29428a99222cb2ef2f0e80d e85560ed96f977b8c29428a99222cb2ef2f0e80d
path     : /var/www/app/vendor/gedmo/doctrine-extensions
names    : gedmo/doctrine-extensions

support
email : [email protected]
issues : https://github.com/doctrine-extensions/DoctrineExtensions/issues
source : https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.16.1
wiki : https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc

autoload
psr-4
Gedmo\ => src/

requires
behat/transliterator ^1.2
doctrine/collections ^1.2 || ^2.0
doctrine/common ^2.13 || ^3.0
doctrine/deprecations ^1.0
doctrine/event-manager ^1.2 || ^2.0
doctrine/persistence ^2.2 || ^3.0
php ^7.4 || ^8.0
psr/cache ^1 || ^2 || ^3
psr/clock ^1
symfony/cache ^5.4 || ^6.0 || ^7.0

requires (dev)
doctrine/annotations ^1.13 || ^2.0
doctrine/cache ^1.11 || ^2.0
doctrine/dbal ^3.2
doctrine/doctrine-bundle ^2.3
doctrine/mongodb-odm ^2.3
doctrine/orm ^2.14.0 || ^3.0
friendsofphp/php-cs-fixer ^3.14.0
nesbot/carbon ^2.71 || ^3.0
phpstan/phpstan ^1.11
phpstan/phpstan-doctrine ^1.4
phpstan/phpstan-phpunit ^1.4
phpunit/phpunit ^9.6
rector/rector ^1.1
symfony/console ^5.4 || ^6.0 || ^7.0
symfony/doctrine-bridge ^5.4 || ^6.0 || ^7.0
symfony/phpunit-bridge ^6.0 || ^7.0
symfony/uid ^5.4 || ^6.0 || ^7.0
symfony/yaml ^5.4 || ^6.0 || ^7.0

suggests
doctrine/mongodb-odm to use the extensions with the MongoDB ODM
doctrine/orm to use the extensions with the ORM

conflicts
doctrine/annotations <1.13 || >=3.0
doctrine/dbal <3.2 || >=4.0
doctrine/mongodb-odm <2.3 || >=3.0
doctrine/orm <2.14.0 || 2.16.0 || 2.16.1 || >=4.0

Doctrine packages

$ composer show --latest 'doctrine/*'

Color legend:
- patch or minor release available - update recommended
- major release available - update possible
- up to date version

Direct dependencies required in composer.json:
doctrine/doctrine-bundle            2.12.0 2.12.0 Symfony DoctrineBundle
doctrine/doctrine-migrations-bundle 3.3.1  3.3.1  Symfony DoctrineMigrationsBundle
doctrine/orm                        3.2.1  3.2.1  Object-Relational-Mapper for PHP

Transitive dependencies not required in composer.json:
doctrine/cache                      2.2.0  2.2.0  PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, m...
doctrine/collections                2.2.2  2.2.2  PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.
doctrine/common                     3.4.4  3.4.4  PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depen...
doctrine/dbal                       3.8.6  4.0.4  Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.
doctrine/deprecations               1.1.3  1.1.3  A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations...
doctrine/event-manager              2.0.1  2.0.1  The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.
doctrine/inflector                  2.0.10 2.0.10 PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and...
doctrine/instantiator               2.0.0  2.0.0  A small, lightweight utility to instantiate objects in PHP without invoking their constructors
doctrine/lexer                      3.0.1  3.0.1  PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.
doctrine/migrations                 3.8.0  3.8.0  PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for...
doctrine/persistence                3.3.3  3.3.3  The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine objec...
doctrine/sql-formatter              1.4.0  1.4.0  a PHP SQL highlighting library

PHP version

$ php -v

PHP 8.3.8 (cli) (built: Jun  6 2024 19:58:09) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.8, Copyright (c) Zend Technologies
    with Zend OPcache v8.3.8, Copyright (c), by Zend Technologies
@klemens-u
Copy link
Author

I'd appreciate any insights and hints on this issue. Thank you!

@klemens-u
Copy link
Author

Maybe this helps someone else:

The problem is Doctrine itself. After changing to the second locale, for Doctrine, the name remains the same and does not trigger a change in the entity. Therefore no translated database entry is created.

Workaround: create a dummy field that will mark the entity dirty in case of a locale change. This will then trigger an update:

    #[ORM\Column(type: 'string', length: 5, nullable: true)]
    private $dummyLocale;
    
    public function setTranslatableLocale($locale) : self
    {
        $this->locale = $locale;

        $this->dummyLocale = $locale; // This will trigger a change

        return $this;
    }    

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant