symfony - 如何从 Symfony4 中的数据库加载翻译?
问题描述
根据这篇 symfony 文档文章,应该可以加载您自己的翻译格式。所以我试图从数据库中加载它们。
但无论我试图使这项工作。它只是没有。
使用数据库加载器是正确的方法还是我应该做其他事情来从数据库加载翻译?
App\Translation\Loader\DatabaseLoader.php:
namespace App\Translation\Loader;
use App\Entity\Translation;
use App\Domain\TranslationManagerInterface;
use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;
/**
* Database Loader
*/
class DatabaseLoader implements LoaderInterface
{
/**
* Translation Manager
*
* @var TranslationManagerInterface
*/
private $_translationManager;
/**
* Constructor
*
* @param TranslationManagerInterface $translationManager
*/
public function __construct(TranslationManagerInterface $translationManager)
{
$this->_translationManager = $translationManager;
}
/**
* {@inheritDoc}
*/
public function load($resource, $locale, $domain = 'general')
{
$translations = $this->_translationManager->findByLocaleAndDomain($locale, $domain);
$catalogue = new MessageCatalogue($locale);
/* @var Translation $translation */
foreach($translations as $translation)
{
$catalogue->set(
$translation->getToken(),
$translation->getContent(),
$translation->getDomain()()
);
}
}
}
配置/服务.yaml:
# database loader
translation.loader.database:
class: 'App\Translation\Loader\DatabaseLoader'
arguments: [ 'App\Domain\TranslationManager' ]
tags:
- { name: translation.loader, alias: database, priority: 100 }
我什至尝试使用内核请求上的事件侦听器手动将加载程序添加到翻译器。我不想使用完整的捆绑包,因为我已经是一个充满翻译的数据库
解决方案
用 Symfony 4.2.4 测试: 也许这个答案来的有点晚,但我想帮助其他和我一样绝望的有同样问题的访问者。
您的类 DatabaseLoader 中有一个小错误。您必须在函数 load() 中返回 $catalogue 。
public function load($resource, $locale, $domain = 'general') { $translations = $this->_translationManager->findByLocaleAndDomain($locale, $domain); $catalogue = new MessageCatalogue($locale); /* @var Translation $translation */ foreach($translations as $translation) { $catalogue->set( $translation->getToken(), $translation->getContent(), $translation->getDomain()() ); } // you must return $catalogue here return $catalogue; }
您必须创建“假”翻译文件才能触发加载程序。见这里: https ://stackoverflow.com/a/33300593/6709953
示例:对于翻译域“messages”和语言环境“en”,必须有一个空文件translations/messages.en.database
(小提示:在config/services.yaml中设置了“alias:database”,意思是翻译文件的后缀必须是.database)
如果文件夹translation/中存在旧的竞争翻译文件,您必须删除它们。因此,例如,如果还有文件translations/messages.en.yaml,则必须将其删除。
推荐阅读
- c++ - 用不同的基类值初始化继承类中的成员
- github - 克隆成功,但由于路径无效,签出失败
- javascript - 在多个地方使用的组件都在同时更新
- reactjs - 使用 React 组件的嵌套路由
- windows - 用 bullet3 编译程序
- javascript - 是否可以在 JavaScript 中从(CORS)iframe 中监听按键事件?
- django - django_microsoft_auth 回复 URL 问题和其他问题
- c# - 将数据从视图模型添加到模型
- sql-server - 我有这个子查询的问题
- google-analytics - 如果用户登录,在 GTM 中触发事件?