2017-04-12 55 views
0

缓存在我的应用程序的翻译,我有两类译文:添加不应该从控制器

  • 静态字眼是模板布局(如“上一页”,“取消”的一部分。 ..)
  • 动态字眼正在从数据库中提取,并可以为每个请求改变(如博客文章标题,可以在数据库中会发生变化)

我用Symfony的翻译小号请在我的树枝模板中使用静态措辞,使用过滤器。它可以很好地处理静态文字,但动态文字变得越来越困难。

添加我动态字眼这样,一个控制器动作中:

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

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

    // ... 

    return new Response(); 

然后,我在前端应用与跨在我的模板或与BazingaJsTranslationBundle使用它。

我想我有一个缓存问题:对于动态措辞,我经常会在页面上得到旧的字词或翻译键 - 即使在返回响应之前在控制器上完成添加。

但是,当我清除缓存(应用程序/控制台清除:缓存)并重新加载页面时,我得到正确的措辞。

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

回答

1

Symfony的文档:

翻译数据库内容

的数据库内容的翻译应该由杨兴华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)); 
     } 
    } 
}