在我的应用中,我有两种翻译:
我使用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不缓存动态添加的措辞? 或者另一种更适合翻译动态添加的翻译方法?
答案 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));
}
}
}