Translate a Django app into Japanese
Translating a Django app into Japanese means translating the <code>locale/ja/LC_MESSAGES/django.po</code> file generated by <code>makemessages</code>, then compiling it. Manuce returns that same file with <code>%(name)s</code> and <code>{name}</code> placeholders checked, plus a report of any strings left untouched. Japanese brings its own constraints: verb-final word order, a single plural form, full-width punctuation and a polite register.
What it costs
For the language files of a Django 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.
From makemessages to a Japanese catalogue
Everything starts with django-admin makemessages -l ja, which writes locale/ja/LC_MESSAGES/django.po. It gathers the strings you have marked in templates ({% translate %}, {% blocktranslate %}), in Python code (gettext, and gettext_lazy for model verbose_name values and form labels) and in validation messages. That is the file to translate: once filled in, compilemessages turns it into django.mo, which Django loads at runtime.
For the language to be served, ja must appear in LANGUAGES, for instance ('ja', '日本語'), and LocaleMiddleware must be enabled if the language is picked from the browser or from a /ja/ URL prefix.
Worth knowing before you count words: the admin and the django.contrib apps already ship with Japanese translations. Only your own strings need translating. JavaScript strings are extracted separately into djangojs.po with makemessages -d djangojs, so do not overlook them.
What Japanese changes in your strings
Word order. Japanese puts the verb last, so ‘Delete %(name)s?’ becomes 「%(name)s」を削除しますか?. The placeholder moves, which is fine with named placeholders. Several anonymous %s in one string cannot be reordered, and Django warns about them during extraction. Switch to %(name)s or {name} before you extract.
Plurals. Japanese has one form only (CLDR category other). The header should read Plural-Forms: nplurals=1; plural=0; and every msgid_plural entry has a single msgstr[0]. Quantity is carried by a counter word: ‘%(count)s results’ becomes %(count)s 件の結果, ‘%(count)s members’ %(count)s 人のメンバー.
Punctuation. No spaces between words, full-width comma 、 and full stop 。, a full-width ? with no space, and 「」 as quotation marks. Check that the suffix Django adds to form labels (label_suffix) does not double up with a full-width colon : already in the translated label.
Register. Professional interfaces address users in the polite です/ます form (保存しました for ‘Saved’), while buttons stay short nouns: 保存, 送信, キャンセル. Loanwords are written in katakana: ログイン, パスワード.
What Manuce returns, and what it does not do
You upload django.po and get the same file back: #: reference comments, entry order, quotation marks, line endings, encoding and BOM are preserved; only the values change. It is ready to drop back into locale/ja/LC_MESSAGES/ and compile with compilemessages.
%(name)s and {name} placeholders are checked: every Japanese value is compared with its source, placeholders and tags included. If a translation loses or mangles a placeholder and the mismatch persists, the source value is kept and the report says so, rather than shipping a string that would break compilation or rendering.
Not translated: keys, identifiers, URLs, email addresses, numbers, colours, date formats, empty values and anything marked as non-translatable. The report lists the strings translated and those left as they were, with the reason.
What Manuce does not do: it does not edit your settings.py, templates or stylesheets, and it does not run makemessages or compilemessages for you. Nor does it produce sworn or certified translations: if your Japanese terms of service must be certified, you will need an accredited translator.
Pricing is based on the words in the values, keys and tags excluded; Japanese carries a ×1.6 language coefficient. A free sample lets you judge the register before paying.
Preparing the file and checking the result
Before uploading:
- Replace multiple
%swith named placeholders, then runmakemessages -l jaagain. - Give short, ambiguous words a context with
pgettext: ‘Order’ as a purchase (注文) and ‘Order’ as sorting (並べ替え) translate differently. - Add comments starting with
Translators:above the calls, such as# Translators: checkout confirmation button; Django copies them into the .po file. - Check the header:
charset=UTF-8andPlural-Forms: nplurals=1; plural=0;.
After delivery:
- Remove leftover
#, fuzzyflags once you have reviewed those entries:compilemessagesskips fuzzy entries. - Make sure
<html lang>reflects the active language ({% get_current_language %}): withoutlang='ja', some browsers render kanji with Chinese glyph shapes. - Add a Japanese fallback font to your CSS, for example
'Hiragino Sans', 'Noto Sans JP', sans-serif. - Without spaces, long strings can break at any character: check buttons, menus and narrow columns.
- Let Django format dates and numbers to Japanese conventions (
2025年3月14日) instead of hard-coding them in strings.
In practice
- Run makemessages -l ja to generate locale/ja/LC_MESSAGES/django.po.
- Upload the file to Manuce, choose a level and read the free sample.
- Download the translated django.po and the report of strings left unchanged.
- Put the file back, run compilemessages and test the interface in Japanese.
Frequently asked questions
How does ngettext work in Japanese?
Japanese has a single plural form: the .po header should say nplurals=1; plural=0; and each plural entry has only msgstr[0]. Quantity is expressed with a counter word such as 件 or 人 after the number. Check the header before compiling.
Do I need to translate the Django admin?
No. The admin and the django.contrib apps already ship with Japanese translations. Only your project's own strings, collected in your django.po, need translating, which keeps the word count down.
My placeholders move around in the Japanese sentence. Is that a problem?
Not if they are named, like %(name)s or {name}. Manuce compares each translated value with its source; if a placeholder is missing or altered and the mismatch persists, the source value is kept and the report flags it. Multiple anonymous %s should be replaced before extraction.
Which level of politeness suits an app interface?
In a professional setting, sentences address the user in the polite です/ます form, while buttons remain short nouns such as 保存 or 送信. The free sample lets you check the tone before paying; the Professional level is handled by the domain specialist.
Why does Japanese cost more than other languages?
Japanese is a surcharged language: a ×1.6 coefficient applies to the per-word rate. The quote is calculated as soon as you upload, on the words in the file's values, keys and tags excluded.
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.