Symfony翻译不起作用

Mic*_*ael 15 translation symfony twig

我做了以下清单:

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

虽然在我的twig模板文件中,

{{ 'message'|trans }}
Run Code Online (Sandbox Code Playgroud)

从不翻译.

我可以在哪里查看下载以使翻译有效?

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

小智 23

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

framework:
    translator: { fallback: en }
Run Code Online (Sandbox Code Playgroud)

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

你尝试过在你的控制器中翻译吗?

$translatedMessage = $this->get('translator')->trans('message');
Run Code Online (Sandbox Code Playgroud)


zuz*_*nen 23

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

php bin/console cache:clear
Run Code Online (Sandbox Code Playgroud)

我看到你已经这样做了,也许它有助于像我这样的其他人.


Ale*_* B. 15

尝试指定域名.如果您没有默认指定域,则为消息.

{{ 'message'|trans({}, 'some_domain') }} 
Run Code Online (Sandbox Code Playgroud)

然后可以找到翻译

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

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

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

  • `cache:clear`对我不起作用,我不得不做`rm -r var / cache / dev / translations`(Symfony 4) (3认同)
  • `console cache:clear`为我做了诀窍,谢谢 (2认同)

小智 7

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

首先,标准清单:

  • 确保您已启用并配置了翻译器.
  • 确保转换位置正确并遵循正确的命名约定(域(默认情况下为message).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错误,因为它会在文件的第一部分添加几个不可见的字符.

顺便说一句,调试你的翻译也可能非常有帮助.


Pmp*_*mpr 6

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

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

  2. 抽象字符串(即"消息")通过将它们包装在对转换器的调用中(" 基本翻译 ").

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

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

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

      翻译文件名

      转换文件的文件名也很重要:每个消息文件必须根据以下路径命名: domain.现场.loader(例如filename :) navigation.en.xlf:

      • domain:将消息组织成组的可选方法(例如admin,navigation或默认messages) - 请参阅使用消息域 ;

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

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

        • xlf:XLIFF文件;
        • php:PHP文件;
        • yml:YAML文件.

          选择使用哪种装载机完全取决于您,这是一个品味问题.推荐的选项是xlf用于翻译.

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

  5. 清除缓存:

    php bin/console c:c
    
    Run Code Online (Sandbox Code Playgroud)

翻译过程

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

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