添加不应从Controller缓存的翻译

时间:2017-04-12 14:38:45

标签: symfony caching symfony-2.8

在我的应用中,我有两种翻译:

  • 静态字词是模板布局的一部分(例如"上一页","取消" ...)
  • 从数据库中提取的动态字词,可以针对每个请求进行更改(例如可以在数据库中更改的博客文章标题)

我使用Symfony翻译服务在我的树枝模板中使用静态措辞,使用 trans 过滤器。它使用静态措辞很好,但是使用动态措辞时,事情变得越来越困难。

我在控制器操作中添加了动态这样的措辞:

    $trans = $this->get( 'translator' );

    $trans->addLoader('array', new ArrayLoader());
    $trans->addResource('array', array('BLOG_ARTICLE_TITLE'=>$article->getTitle('french')), 'fr', 'messages');

    // ...

    return new Response();

然后,我在我的模板上使用trans或在我的前端应用程序中使用BazingaJsTranslationBundle。

我想我的缓存存在问题:对于动态措辞,我经常在页面上获得旧的措辞或翻译键 - 即使在返回响应之前在控制器上完成添加也是如此。

但是当我清除缓存(app / console clear:cache)并重新加载页面时,我得到了正确的措辞。

有没有办法告诉Symfony不缓存动态添加的措辞? 或者另一种更适合翻译动态添加的翻译方法?

1 个答案:

答案 0 :(得分:1)

Symfony文档:

  

翻译数据库内容

     

数据库内容的翻译应由Doctrine通过the Translatable Extension或可翻译行为来处理   (PHP 5.4+)。有关更多信息,请参阅这些文档   库。

使用方法如下:

use Gedmo\Translatable\Translatable;

// [...]
class Article implements Translatable
{
    /** @ODM\Id */
    private $id;

    /**
     * @Gedmo\Translatable
     * @ODM\String
     */
    private $title;

    /**
     * @Gedmo\Translatable
     * @ODM\String
     */
    private $content;

    /**
     * @Gedmo\Locale
     * Used locale to override Translation listener`s locale
     * this is not a mapped field of entity metadata, just a simple property
     */
    private $locale;

针对您的具体问题:

您可以手动删除缓存文件 Lexik翻译包使用此系统。 see their Translator.php class below

public function removeLocalesCacheFiles(array $locales)
{
    foreach ($locales as $locale) {
        $this->removeCacheFile($locale);
    }
    // also remove database.resources.php cache file
    $file = sprintf('%s/database.resources.php', $this->options['cache_dir']);
    if (file_exists($file)) {
        $this->invalidateSystemCacheForFile($file);
        unlink($file);
    }
    $metadata = $file.'.meta';
    if (file_exists($metadata)) {
        $this->invalidateSystemCacheForFile($metadata);
        unlink($metadata);
    }
}
/**
 * @param string $path
 *
 * @throws \RuntimeException
 */
protected function invalidateSystemCacheForFile($path)
{
    if (ini_get('apc.enabled')) {
        if (apc_exists($path) && !apc_delete_file($path)) {
            throw new \RuntimeException(sprintf('Failed to clear APC Cache for file %s', $path));
        }
    } elseif ('cli' === php_sapi_name() ? ini_get('opcache.enable_cli') : ini_get('opcache.enable')) {
        if (!opcache_invalidate($path, true)) {
            throw new \RuntimeException(sprintf('Failed to clear OPCache for file %s', $path));
        }
    }
}