Skip to content

Symfony Translation Component

Symfony translation.AI localization for YAML & XLIFF files.

Translate the words. Keep the contract. Translate Symfony YAML catalogs, XLIFF files and PHP message arrays with human-level AI accuracy. Every parameter, choice boundary and translation domain stays protected.

  • 100% token protection
  • 100+ languages
  • No runtime changes
Illustrated Symfony catalog pipeline. English YAML and XLIFF files leave the repository and pass through Qopywriter.ai. The integrity monitor checks schemas, choice boundaries, parameters and domains while message text is translated. French resources return to the application, where the Symfony Profiler and terminal change from a compilation exception to Catalogue Compiled - 0 Errors.
Fits your PHP stack Symfony Translation Twig trans YAML · XLIFF · PHP Legacy choices + ICU

A string is part of your application

One changed token.
One broken release.

A generic AI translator turns %name% into %nom%. A bracket disappears from a plural rule. YAML indentation shifts. The French reads well; the application doesn’t.

That’s how a localization task becomes an InvalidMessageCatalogueException, a failed container or cache compilation, or a Twig view that prints a raw placeholder. Someone on your team ends up tracing a production bug back to a translation file.

Your Symfony translation tool should know the difference between language and logic.

PARAMETER CONTRACT domain: messages
Source message
welcome: 'Hello %name%'
Generic text translation: renamed variable
welcome: 'Bonjour %nom%'
Qopywriter.ai: original variable protected
welcome: 'Bonjour %name%'

Syntax protection, before translation

Translate inside the rules. Never through them.

Percent signs and range brackets aren’t punctuation to clean up. They’re executable meaning. Qopywriter’s Symfony localization AI separates translatable text from protected syntax, then checks the exported catalog against the original contract.

  • Lock the rule boundaries. Choice selectors, pipe separators and interval notation stay exactly as supplied in the source dialect.
  • Protect every parameter. %count% and %name% keep their spelling and case. Their position follows the translated sentence’s grammar.
  • Keep application identifiers out of the model’s editing scope. Message IDs, translation domains and resource schemas are not translation targets.
See the supported catalog formats
The choice pattern '0 No items|1 One item|]1,Inf[ %count% items' becomes '0 Aucun article|1 Un article|]1,Inf[ %count% articles'. Shield plates cover 0, 1, ]1,Inf[ and %count% while a translation scanner passes behind them. Only the English words change; the selectors, separators and parameter remain unchanged.

Native resources, not flattened text

Your files. Your domains. Same Symfony loaders.

Translate Symfony messages files without rebuilding your translation setup. Qopywriter preserves the resource format, message keys and domain boundaries your PHP application already relies on.

YAML hierarchy
Nested keys, indentation, quoting and escaped characters stay valid.
XLIFF schemas
Translate XLIFF translation files in versions 1.2 and 2.0 while preserving namespaces, unit IDs and inline code references.
PHP message arrays
Keep array keys and PHP syntax. Translate message values with the correct string escaping.
Your Twig stays the same {{ 'account.welcome'|trans({'%name%': name}, 'messages') }}
translations/ OUTPUT EXAMPLES · EN → FR
messages.fr.yaml
account:
  welcome: 'Bonjour %name%'

billing:
  issue_invoice: 'Émettre une facture'

cart:
  quantity: 'Quantité : %count%'
messages.fr.xliff · XLIFF 1.2
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2"
  xmlns="urn:oasis:names:tc:xliff:document:1.2">
  <file source-language="en" target-language="fr"
        datatype="plaintext" original="messages">
    <body>
      <trans-unit id="account.welcome"
                  resname="account.welcome">
        <source>Hello %name%</source>
        <target>Bonjour %name%</target>
      </trans-unit>
    </body>
  </file>
</xliff>
messages.fr.php
<?php

return [
    'account.welcome' =>
        'Bonjour %name%',
    'billing.issue_invoice' =>
        'Émettre une facture',
    'cart.quantity' =>
        'Quantité : %count%',
];

Language quality, beyond a valid schema

Correct syntax is the floor. Fluent language is the point.

Your billing screen isn’t a dictionary exercise. “Issue” is a verb on an invoice button, not a support problem. Qopywriter reads message context and enterprise PHP terminology to deliver human-level linguistic accuracy across your application.

Short labels stay sharp. Validation messages explain the fix. And localized sentences follow the target language’s word order, gender and plural forms, without renaming the variables that drive them. The result sounds like one product, not a collection of unrelated translations.

Enterprise terminology Consistent UI tone Locale-aware grammar
Context changes the translation. Billing workspace / action label
billing.issue_invoice
EN
English · source Issue invoice
FR
Français Émettre une facture
DE
Deutsch Rechnung ausstellen
One action. Three natural expressions.

PHP translation management for Symfony teams

From translations/ to your next release.

File-based localization. No extra translator service in your runtime, and no new Twig conventions to teach the team.

Upload the source catalogs

Choose YAML, XLIFF or PHP resources from translations/. Keep messages, validators, security and custom domains separate, just as they are in your repository.

Choose locales. Translate values.

Select the target language. The AI reads message context, protects parameters and pluralization rules, then validates the serialized resource. Human-readable text changes. Your application contract does not.

Review the diff. Compile.

Return localized files to translations/. Keep Symfony’s domain.locale.loader naming, review the changed values and run your application checks before merging.

A release check, not a leap of faith

Keep the checks in CI.

Lint the resources, inspect missing messages and warm the production cache. Then exercise your Twig views with zero, one and many values. Your existing Symfony pipeline remains the final release gate.

Symfony Translation component docs
release-checks.sh / French catalog example
# Validate resource syntax
php bin/console lint:yaml translations/
php bin/console lint:xliff translations/
php -l translations/messages.fr.php

# Inspect catalog coverage and compile the cache
php bin/console debug:translation fr --domain=messages
APP_ENV=prod APP_DEBUG=0 php bin/console cache:warmup

Catalog translation, predictable pricing

Start with one locale. Scale with your release cycle.

Every plan includes AI translation, parameter shielding and catalog structure protection. Test a real Symfony catalog with the free trial.

Lite

For a focused application.

$9/ month

400,000characters per month

  • AI catalog translation
  • Parameter & choice protection
  • 100+ languages
Start free trial

Starter

For regular release cycles.

$19/ month

1,000,000characters per month

  • AI catalog translation
  • Parameter & choice protection
  • 100+ languages
Start free trial

Yearly

For a full year of localization.

$169/ year

12,000,000characters per year

  • Unlimited team collaboration
  • All catalog protections
  • Priority support
Start free trial

Developer questions

Symfony localization, down to the brackets.

File formats, plural rules, translation domains. Here’s what stays under your control.

Ask about your Symfony workflow
Which Symfony translation files can I translate?

Translate YAML (.yaml and .yml), XLIFF (.xliff and .xlf) and PHP array catalogs. That includes messages.fr.yaml, validators.de.xliff and security.es.php. Message keys, resource structure and translation domains stay protected; human-readable values are localized.

Are %name% and %count% ever translated?

No. Their spelling, case and percent delimiters are locked. A translated sentence can move the same token to fit the target language's word order, but %name% never becomes %nom%. The exported message retains the original parameter set.

How do you handle legacy choices and ICU pluralization?

The two grammars stay separate. Symfony’s legacy MessageSelector uses patterns such as {0} No items|{1} One item|]1,Inf[ %count% items. Current ICU resources use {count, plural, =0 {No items} one {One item} other {# items}} in a catalog such as messages+intl-icu.fr.yaml.

Qopywriter protects the selectors, delimiters and parameter names in each format. It preserves your pluralization system without converting legacy choices into ICU. See Symfony’s ICU MessageFormat reference for the current formatter grammar.

Does this prevent InvalidMessageCatalogueException errors?

The tool prevents translation-induced catalog damage: malformed resource structure, altered interpolation tokens and broken choice delimiters. Schema and syntax protection keep these regressions out of the exported resource.

Your application’s checks validate that resource against its configured loaders and formatter. Run lint:yaml or lint:xliff, inspect debug:translation and warm the production cache before merging. This catches application-level configuration problems as well as missing messages.

Will translation domains, fallback locales and Twig views still work?

Yes. Message IDs and domains stay unchanged. Keep filenames in domain.locale.loader form and place the translated resources in translations/. Existing trans() calls and Twig trans filters resolve the same keys.

Your Symfony application continues to control locale selection and fallback configuration. This is a file-based Symfony i18n localization tool, not a replacement for the Translation component.

What makes the language better than a generic AI translation?

Context does the work. Message keys, neighboring strings and available translation context help distinguish an invoice action from a support issue, or an application role from a job title. The AI maintains consistent enterprise terminology and UI tone while handling the target language’s grammar.

Technical protection and linguistic quality are separate jobs. Qopywriter handles both: natural message values inside a protected catalog structure.

Can I translate both XLIFF 1.2 and XLIFF 2.0?

Yes. Each version keeps its own schema. Namespaces, unit IDs and inline code references remain protected while target text is translated. Source segments stay available for review, and target-language metadata identifies the output locale.

Can my team test a Symfony catalog before paying?

Yes. Start with the free trial and a representative catalog containing parameters, plural messages and your own domains. Compare the translated file, load it in your application and run your release checks. Paid plans start at $9 per month.

messages.en.yaml messages.fr.yaml

Your next locale.
Not your next production bug.

Start with one catalog. Translate a target locale, inspect the diff and run your cache warmup. Ship language your customers understand, with syntax your application still recognizes.