16

我已经完成了以下清单:

  1. 创建了符合格式 domain.lang.loader 的翻译文件
  2. 清除缓存
  3. 检查是否在缓存文件夹中创建了语言目录

虽然在我的树枝模板文件中,

{{ 'message'|trans }}

从不翻译。

为了使翻译工作,我下一步该看哪里?

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

4

8 回答 8

25

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

php bin/console cache:clear

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

于 2016-03-05T10:48:21.047 回答
24

您是否在配置文件中启用了翻译服务?

framework:
    translator: { fallbacks: en }

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

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

$trans = $this->get('translator')->trans('message');
于 2013-10-03T08:08:38.837 回答
17

尝试指定域。如果您未指定域,则默认情况下它是一条消息。

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

然后翻译可以在

  • 内核根目录/Resources/translations 目录;
  • 内核根目录/Resources/bundle name/translations 目录;
  • 包的 Resources/translations/ 目录。

例如some_domain.fr.yml. 最后一步是配置您的语言环境。您可以从请求中获取当前语言环境$request->getLocale()

PS尝试rm -r app/cache确保缓存被删除

于 2013-10-08T03:45:54.973 回答
7

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

一、标准清单:

  • 确保您启用并配置了翻译器
  • 确保翻译在正确的位置并遵循正确的命名约定( domain(messages by default).lang_code.file_format )。
  • php app/console cache:clear使用命令清除缓存。
  • 尝试手动调用$this->getRequest()->setLocale('en');Controller,也可以尝试$this->get('translator')->trans('Some message');直接在Controller中使用。
  • 如果它仍然不起作用,请确保 BOM 不在您的翻译文件中。那是我的情况。

注意BOM翻译文件中的内容。翻译 yml 文件的译者使用了 UTF8,这还可以,但他使用的编辑器在文件开头留下了 BOM。这很危险,可能是因为PHP 的 UTF8 BOM 错误,因为它在文件的第一部分添加了一些不可见的字符。

顺便说一句,调试您的翻译可能也很有帮助。

于 2015-03-10T21:53:20.770 回答
6

根据Symfony 翻译文档页面,如果您没有使用服务容器进行翻译,这些是简单的步骤:

  1. 启用和配置Symfony 的翻译服务。

    • YAML

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

      $container->loadFromExtension('framework', array(
          'translator' => array('fallbacks' => array('en')),
      ));
      
  2. 通过将它们包装在对 Translator 的调用中来抽象字符串(即“消息”)(“基本翻译”)。

    public function indexAction()
    {
        $translated = $this->get('translator')->trans('Symfony is great');
    
        return new Response($translated);
    }
    
  3. 为翻译应用程序中的每条消息的每个受支持的语言环境创建翻译资源/文件

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

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

      翻译文件名

      翻译文件的文件名也很重要:每个消息文件必须根据以下路径命名: domain语言环境加载程序(例如文件名:)navigation.en.xlf

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

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

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

        • xlfXLIFF文件;
        • phpPHP文件;
        • yml: YAML文件。

          选择使用哪种装载机完全取决于您,而且是个人喜好问题。推荐的选项是xlf用于翻译

  4. 为请求确定、设置和管理用户的区域设置,并且可以选择 在用户的整个会话中。

  5. 清除缓存:

    php bin/console c:c
    

翻译过程

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

  • 确定存储在请求中的当前用户的语言环境;
  • 翻译消息的目录(例如大集合)从为区域设置(例如 fr_FR)定义的翻译资源中加载。如果来自后备语言环境的消息不存在,它们也会被加载并添加到目录中。最终结果是一个庞大的翻译“词典”。
  • 如果消息位于目录中,则返回翻译。如果不是,则翻译器返回原始消息。
于 2016-12-31T08:05:10.817 回答
1

这帮助我让它工作,因为清除缓存也没有帮助。

Symfony 4.6.2:

试试这个命令来更新翻译文件:

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

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

于 2019-08-03T07:22:38.167 回答
0

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

于 2015-01-30T17:35:27.333 回答
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 个独立的部分。

于 2013-10-09T07:37:04.477 回答