Translate a Symfony app into Japanese
Upload your translations/messages.en.xlf or .yaml file and Manuce returns the same file with Japanese values, ready to become messages.ja.xlf or messages.ja.yaml. Every %name% and {name} placeholder is checked, and a report lists each string left untouched and why.
What it costs
For the language files of a Symfony app totalling about 3,000 words, into Japanese:
To understand, internal use.
Ready to send, by the technical specialist.
Cross-checked. For documents that commit you.
Price for one language, original layout included. VAT not applicable — article 293 B of the French General Tax Code (CGI). The exact quote, based on your file's word count, is shown before you pay.
What Japanese changes in Symfony translation files
Japanese has a single CLDR plural category: other. An ICU string such as {count, plural, one {# order} other {# orders}} becomes {count, plural, other {#件の注文}}. The other branch is mandatory in ICU, so that is the one to look for in the Japanese file. With the older pipe syntax (%count% order|%count% orders), Symfony uses only one form for Japanese.
Plurals go, but counter words arrive: 件 for orders or results, 人 or 名 for people, 個 for objects. %count% users becomes, for instance, %count%人のユーザー.
- Word order: placeholders move.
Welcome, %name%becomes%name%様、ようこそ, with the honorific 様 after the name. - No spaces between words or around placeholders.
- Full-width punctuation: 、 and 。 instead of comma and full stop, brackets as ( ).
- Register: in a business interface, messages use the polite です/ます form, while buttons stay as short nouns: 保存, 削除, ログイン.
What Manuce returns, and what it does not do
Both Symfony formats, XLIFF and YAML, are supported. You get back the same file: indentation, key order, quotes, comments, line endings, encoding and BOM are preserved; only the values change. In XLIFF, your IDs and notes stay where they were.
Each translated value is compared with the source. If the Japanese output loses a placeholder, say %name% turned into %名前%, or drops a <b> tag, and the mismatch persists, the source value is kept and the report says so. A visible source-language string is better than a rendering error.
Not translated: keys, empty values, URLs, email addresses, numbers, colours, date formats, identifiers and anything you have marked as non-translatable. Pricing is based on the words in the values, excluding keys and tags; Japanese is a surcharged language (×1.6 coefficient).
Manuce does not touch your configuration, Twig templates or stylesheets, and does not translate text hard-coded in PHP or Twig. Nor does it produce certified (sworn) translations: terms and conditions intended for legal use in Japan should be reviewed by a qualified professional.
Preparing the source file
- Extract every string:
php bin/console translation:extract --force enfills the source file with keys used in your templates and controllers. A string missing from the file will not be translated. - Cover each domain:
messagesplus any custom domains. Messages for built-in constraints and the Security component already ship in Japanese with Symfony; only your custom validation messages need translating. - Keep the ICU suffix:
messages+intl-icu.en.xlfmust becomemessages+intl-icu.ja.xlf, otherwise Symfony will not parse{count, plural, …}. - Add context: an XLIFF note or YAML comment such as "button label, max 10 characters" helps choose between 送信 and 送信する.
- Mark what must stay: product names, acronyms, internal codes.
Check the encoding too: UTF-8 is essential for kanji and kana.
Checking the Japanese inside the app
Once the file is renamed messages.ja.xlf or messages.ja.yaml, add ja to enabled_locales and check:
- Syntax:
php bin/console lint:xliff translationsorlint:yaml translations. In YAML, a half-width colon in an unquoted value breaks the file; the full-width : does not. - Gaps:
php bin/console debug:translation jalists missing keys or values identical to the source; compare them with Manuce's report. - Fonts: use a font stack that covers Japanese (Noto Sans JP or system fonts), or some characters will render as boxes.
- Line breaks: without spaces, browsers break between characters. The CSS rule
line-break: strictstops lines starting with 。 or ー. - Width: Japanese strings often have fewer characters, but each is wider. A Twig
|u.truncate(20)may overflow; test buttons and table columns. - Dates:
format_datewith thejalocale gives 2025年3月5日. Do not hand-translate date formats.
In practice
- Run translation:extract to get a complete source file, domain by domain.
- Upload messages.xx.xlf or .yaml, choose Japanese and a level, and read the free sample.
- Rename the returned file messages.ja.xlf (or +intl-icu.ja.xlf) and place it in translations/.
- Read the report, run lint and debug:translation ja, then test fonts, line breaks and widths.
Frequently asked questions
What happens to my plural strings?
Japanese has one form only, the other category. In an ICU string, the other branch carries the translation, often with a counter such as 件 or 人. Check on review that this branch is present, as ICU requires it.
Do %name% and {count} survive the change in word order?
Yes, they may move within the sentence, which is normal in Japanese. Every value is compared with the source: if a placeholder is missing or altered and the mismatch persists, the source value is kept and the report flags it.
Which politeness level is used?
For a business interface, the polite です/ます form is standard in messages, with short labels for buttons. Add a comment if a string addresses a customer and needs 様 or a more formal register. The Professional level is designed for text ready to hand over.
Do I need to translate Symfony's own validators and security files?
Not for the built-in messages: Symfony already provides them in Japanese. Only your custom constraint messages, in your own validators files, need to be sent.
Does Japanese cost more?
Japanese carries a ×1.6 coefficient on the per-word price. The count covers the words in the source file's values, excluding keys and tags, and the quote appears as soon as you upload.
The specialist in charge
This subject goes to Dédale, the technical specialist. See how it works.
The same file, into another language
Into Japanese, other files
See also
Try it on your own file, free
A sample of your file translated at the level you choose, before any payment. You judge, then you decide.