Symfony翻译不起作用

时间:2013-10-02 21:41:38

标签: symfony twig translation

我做了以下清单:

  1. 创建了尊重格式domain.lang.loader
  2. 的翻译文件
  3. 清除缓存
  4. 检查了语言目录是否在缓存文件夹中创建
  5. 虽然在我的树枝模板文件中,

    {{ 'message'|trans }}
    

    从不翻译。

    为了使翻译有效,我可以在哪里查看?

    我使用的 Doctrine Translatable Extension 是否有可能产生某种冲突?

8 个答案:

答案 0 :(得分:22)

您是否在配置文件中启用了转换程序服务?

framework:
    translator: { fallback: en }

无论您的翻译是否已启用,都会在缓存文件夹中创建语言目录。

您是否尝试在控制器中进行翻译?

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

答案 1 :(得分:20)

在Symfony 3.0中,我必须清除缓存:

php bin/console cache:clear

我看到你已经这样做了,也许它对我这样的其他人有帮助。

答案 2 :(得分:14)

尝试specify domain。如果您没有默认指定域,则为消息。

{{ 'message'|trans({}, 'some_domain') }} 

然后可以在

中找到翻译
  • 内核根目录/ Resources / translations目录;
  • 内核根目录/ Resources / bundle name / translations 目录;
  • 捆绑包的Res​​ources / translations /目录。

例如some_domain.fr.yml。最后一步是配置您的语言环境。您可以使用$request->getLocale()

从请求中获取当前区域设置

P.S。尝试rm -r app/cache以确保删除缓存

答案 3 :(得分:7)

我可以使用其中一种翻译,但不能使用其他翻译,并且不知道为什么。如果您也有翻译问题,请阅读此内容。

首先,标准清单:

  • 确保you enabled and configured translator
  • 确保translation is in proper place并遵循proper naming convenction(域(默认情况下为邮件).lang_code.file_format)。
  • 使用php app/console cache:clear命令清除缓存。
  • 尝试在Controller中手动调用$this->getRequest()->setLocale('en');,也可以尝试直接在控制器中使用$this->get('translator')->trans('Some message');
  • 如果仍然无效,请确保BOM不在翻译文件中。那是我的理由。

在翻译文件中留意BOM。翻译yml文件的翻译人员使用UTF8,这是好的,但编辑他在文件的开头使用了留空BOM。这很危险,可能是因为PHP's UTF8 BOM bug,因为它会在文件的第一部分添加几个不可见的字符。

顺便说一下,debugging your translations也可能非常有帮助。

答案 4 :(得分:6)

根据Symfony Translations Documentation page,如果您没有使用Service Container进行翻译,请执行以下步骤:

  1. Enable and configure Symfony的翻译服务。

    • YAML

      framework:
          translator: { fallbacks: [en] }
      
    • PHP

      $container->loadFromExtension('framework', array(
          'translator' => array('fallbacks' => array('en')),
      ));
      
  2. 抽象字符串(即“消息”)通过将它们包装在对转换程序(“Basic Translation”)的调用中。

    public function indexAction()
    {
        $translated = $this->get('translator')->trans('Symfony is great');
    
        return new Response($translated);
    }
    
  3. Create translation resources/files用于翻译应用程序中每条消息的每个受支持的语言环境。

    Symfony在以下默认位置查找消息文件(即翻译):

    • app/Resources/translations目录;
    • app/Resources/<bundle name>/translations目录;
    • 任何捆绑包内的Resources/translations/目录。

      翻译文件名

      翻译文件的文件名也很重要:每个消息文件必须按照以下路径命名:区域设置装载程序(例如文件名:navigation.en.xlf):

      • 域:将消息组织成组的可选方式(例如adminnavigation或默认messages) - 请参阅Using Message Domains;

      • locale:翻译所针对的语言环境(例如en_GB,en等); loader:Symfony如何加载和解析文件(例如xlf,php,yml等)。

      • 加载程序可以是任何已注册加载程序的名称。默认情况下,Symfony提供了许多加载器,包括:

        • xlf XLIFF 文件;
        • php PHP 文件;
        • yml YAML 文件。

          选择使用哪种装载机完全取决于您,这是一个品味问题。 建议的选项是使用xlf进行翻译

  4. 为请求确定set and manage the user's locale可选 on the user's entire session

  5. 清除缓存:

    php bin/console c:c
    
  6. 翻译流程

    要实际翻译消息,Symfony使用一个简单的过程:

    • 确定当前用户的区域设置,该区域设置存储在请求中;
    • 从为语言环境定义的翻译资源(例如fr_FR)加载翻译消息的目录(例如,大集合)。来自回退区域设置的消息也会加载并添加到目录中(如果它们尚不存在)。最终结果是翻译的大型“字典”。
    • 如果邮件位于目录中,则返回翻译。如果没有,翻译者将返回原始消息。

答案 5 :(得分:0)

我已经可以回答你的两个问题了:

1:你可以看看

https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L97 https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.php https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Translation/Translator.php#L174

2:如果你在谈论gedmo教义扩展或Knplabs DoctrineBehaviors,不,它与symfonys的翻译器没有任何冲突。这些是2个独立的部分。

答案 6 :(得分:0)

刚刚遇到同样的问题,并在控制器操作中通过$this->get('translator')->setLocale('fr');修复了它。我通过在路径路径中添加{_locale}来修复它。

答案 7 :(得分:0)

这有助于我使其正常工作,因为清除缓存也无济于事。

Symfony 4.6.2:

尝试以下命令来更新翻译文件:

php bin/console translation:update --dump-messages --force de

(来源:https://symfony.com/doc/current/translation.html#configuration