首页 > 解决方案 > 如何正确管理数据库中的 Symfony 翻译

问题描述

我实际上正在开发一个 Symfony 4.4 项目,我需要能够从管理界面更新 Twig 模板翻译。

这是我第一次尝试实现基于数据库的翻译系统,所以我遵循了这个教程:https ://medium.com/@andrew72ru/store-translation-messages-in-database-in-symfony-3f12e579df74

这时,我做了一个简单的类,它MessageCatalogue从我的数据库中加载一个:

<?php

namespace App\Service;

use App\Entity\Translation;
use App\Repository\TranslationRepository;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ObjectRepository;
use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;

class DatabaseTranslationManager implements LoaderInterface
{    
    private EntityManagerInterface $entityManager;

    public function __construct(EntityManagerInterface $doctrine)
    {
        $this->entityManager = $doctrine;
    }

    /**
     * @param mixed  $resource
     * @param string $locale
     * @param string $domain
     */
    public function load($resource, $locale, $domain = 'messages'): MessageCatalogue
    {
        $translationRepository = $this->getRepository();
        if (false === $translationRepository instanceof TranslationRepository) {
            return new MessageCatalogue($locale);
        }
        $messages = $translationRepository->findByDomainAndLocale($domain, $locale);
        $values = array_map(
            static function (Translation $entity) {
                return $entity->getTranslation();
            },
            $messages
        );

        return new MessageCatalogue(
            $locale, [
                $domain => $values,
            ]
        );
    }

    /**
     * @return ObjectRepository<Translation>
     */
    public function getRepository(): ObjectRepository
    {
        return $this->entityManager->getRepository(Translation::class);
    }
}

在我的服务中注册:

translation.loader.db:
    class: App\Service\DatabaseTranslationManager
    arguments:
        - '@doctrine.orm.entity_manager'
    tags:
        - { name: translation.loader, alias: db }

关联Translation实体非常简单:

<?php

namespace App\Entity;

use App\Repository\TranslationRepository;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=TranslationRepository::class)
 */
class Translation
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private ?int $id = null;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private string $domain;

    /**
     * @ORM\Column(type="string", length=2)
     */
    private string $locale;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private string $key;

    /**
     * @ORM\Column(type="text")
     */
    private string $translation;

    public function __construct(string $domain, string $locale, string $key, string $translation)
    {
        $this->domain = $domain;
        $this->locale = $locale;
        $this->key = $key;
        $this->translation = $translation;
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getDomain(): string
    {
        return $this->domain;
    }

    public function setDomain(string $domain): self
    {
        $this->domain = $domain;

        return $this;
    }

    public function getLocale(): string
    {
        return $this->locale;
    }

    public function setLocale(string $locale): self
    {
        $this->locale = $locale;

        return $this;
    }

    public function getKey(): string
    {
        return $this->key;
    }

    public function setKey(string $key): self
    {
        $this->key = $key;

        return $this;
    }

    public function getTranslation(): string
    {
        return $this->translation;
    }

    public function setTranslation(string $translation): self
    {
        $this->translation = $translation;

        return $this;
    }
}

在这一点上它工作得很好,但我仍然面临一些问题:

由于目前我找不到任何更好的解决方案,我正在寻找有关如何实现这样一个翻译系统的建议。

标签: phpsymfonysymfony4

解决方案


推荐阅读