symfony中的翻译文件不存在

时间:2016-06-07 10:12:04

标签: php symfony translation

我正在使用symfony 3,我想在我的应用程序中将某些东西翻译成西班牙语 我通过这种方式启用了翻译:

<configuration>
    <timestamp key="byDay" datePattern="yyyy-MM-dd"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logging-${byDay}.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

默认情况下调用的文件“messages.fr.xlf”应该出现在/ app / resources / translation或/ src / BundleName / resources / translation中,但是在搜索完所有文件夹结构后,没有“消息” .fr.xlf“文件,没有”翻译“文件夹,所以我决定自己创建它,我在所有文件夹中尝试了这个文件应该存在。

所以我的“消息”文件包含以下代码:

framework:
#esi:             ~
#translator:      { fallbacks: ["%locale%"] }
translator:      { fallbacks: en }
secret:          "%secret%"
router:
    resource: "%kernel.root_dir%/config/routing.yml"
    strict_requirements: ~
form:            ~
csrf_protection: ~
validation:      { enable_annotations: true }
#serializer:      { enable_annotations: true }
templating:
    engines: ['twig']
#default_locale:  "%locale%"
default_locale:  es
trusted_hosts:   ~
trusted_proxies: ~
session:

但它不起作用,似乎symfony无法找到翻译文件,因为我收到此错误:“这些消息不适用于给定的语言环境,并且无法在后备语言环境中找到。将它们添加到翻译中目录,以避免Symfony输出未翻译的内容。“

1 个答案:

答案 0 :(得分:3)

消息文件需要存在于app / Resources / translations文件夹中。这些文件应该命名为[bundle]。[language_code]。[format]。假设您正在使用默认捆绑包&#34; AppBundle&#34;,西班牙语代码&#34; es&#34;和&#34; xlf&#34;格式,您的文件将命名为&#34; AppBundle.es.xlf&#34;。

要测试您的翻译,请在控制器中创建一个操作,执行以下操作:

/**
 * @Route("/controller/test/{_locale}", name="cont_test")
 */
public function testAction(Request $request, $_locale="en")
{
    return $this->render('sometemplate.html.twig'));
}

然后您只需转到http://domain.com/controller/test/es来测试您的翻译(请参阅下面的twig模板)。

我注意到你的例子的另一件事是你的跨单位ID是不正确的。您正在使用的ID类似于自动生成的mysql id's。 Symfony手册建议对id使用关键字方法。例如,如果你有一个&#34;名称&#34;表单上的字段,您可以使用关键字&#34; form.name&#34;。所以你的消息文件看起来像这样:

<trans-unit id="form.name">
    <source>name</source>
    <target>Nombre</target>

除非您为可能会聘请翻译人员的大公司编写代码,否则XLF格式并不像使用YAML版本那样令人满意,因为YAML版本更加缩写并且具有使用我的许多优点,我不会在这里讨论。 YAML版本可能如下所示:

form:
    name: 'Nombre'
    price: 'Precio'

在你的twig模板中,你可以翻译这样的id:

{% trans_default_domain 'AppBundle' %}
Please provide your {{'form.name'|trans}}

请注意,模板中的第一行是告诉翻译者在退回之前默认先在您的包中查找翻译。

关于使用翻译的另一个要点是,您需要确保为您默认使用的语言创建一个消息翻译文件(对于大多数语言是英语(en))。否则,在选择其他语言时,您的ID将被正常翻译,但在恢复默认语言时,他们不会。因此,如果您的默认语言是英语,我的示例模板将翻译我的句子:

Please provide your form.name

希望这有帮助。