{"title":"翻訳","version":"4.2","locale":"ja","docname":"topics/i18n/translation","url":"/ja/4.2/topics/i18n/translation/","canonical":"https://djangodocs.dev/ja/4.2/topics/i18n/translation/","summary":"Django プロジェクトを翻訳可能にするためには、Python コードやテンプレートに、多少のフックを加筆しなければなりません。このフックは翻訳文字列と呼ばれます。","html":"<h1>翻訳<a class=\"heading-anchor\" href=\"#translation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"overview\">\n<h2>概要<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django プロジェクトを翻訳可能にするためには、Python コードやテンプレートに、多少のフックを加筆しなければなりません。このフックは <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-translation-string\"><span class=\"xref std std-term\">翻訳文字列</span></a> と呼ばれます。翻訳文字列は Django に「このテキストに対する翻訳が有効な場合、このテキストはエンドユーザの言語に翻訳すべきだ」ということを通知します。翻訳可能な文字列をマークすることは開発者の責任です。システムが翻訳できるのは指定された文字列だけなのです。</p>\n<p>Django は、翻訳文字列を <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">メッセージファイル</span></a> に抽出するユーティリティを提供します。このファイルがあるため、翻訳者が対象の言語において翻訳文字列に対応する文字列を用意することが簡単になります。翻訳者がメッセージファイルの中身を書き終わったら、それをコンパイルしなければなりません。このプロセスは GNU gettext ツー ルキットに依存しています。</p>\n<p>これが済めば、 Django はユーザの言語設定に従って、オンザフライでアプリケーションを利用可能な言語に翻訳するようになります。</p>\n<p>Django の国際化フックはデフォルトで有効になっており、これは、フレームワークの特定の箇所で i18n に関する小さなオーバーヘッドが発生することを意味します。国際化を使わない場合は、 <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\">USE_I18N = False</code></a> を設定ファイルに記述してください。そうすれば Django は国際化の部品を読み込まないようにして多少の最適化をします。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>プロジェクトで翻訳機能が有効になっていることを確認してください (最も早いのは、 <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> が <a class=\"reference internal\" href=\"/ja/4.2/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-mod docutils literal notranslate\">django.middleware.locale.LocaleMiddleware</code></a> を含むかどうかチェックすることです) 。まだの場合は、<a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">How Django discovers language preference</span></a> を参照してください。</p>\n</aside>\n</section>\n<section id=\"internationalization-in-python-code\">\n<h2>Python コードでの国際化<a class=\"heading-anchor\" href=\"#internationalization-in-python-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"standard-translation\">\n<h3>標準的な翻訳<a class=\"heading-anchor\" href=\"#standard-translation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>翻訳対象の文字列を関数 <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> で指定します。タイプ数を減らすため、ugettext() を <code class=\"docutils literal notranslate\">_</code> という別名で import するのが慣習的なやり方です。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>Python の標準ライブラリ <code class=\"docutils literal notranslate\">gettext</code> モジュールは、グローバルの名前空間に <code class=\"docutils literal notranslate\">_()</code> とい う名前で <code class=\"docutils literal notranslate\">gettext()</code> をインストールします。 Django ではこの方法に従っていませんが、それは以下の理由からです:</p>\n<ol class=\"arabic simple\">\n<li><p>また、ファイルによっては <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a> をデフォルトの翻訳用メソッドに使った方がよい場合もあります。グローバル名前空間に <code class=\"docutils literal notranslate\">_()</code> がなければ、開発者に場合に応じて適切な翻訳用メソッドを選ぶ自由を与えられます。</p></li>\n<li><p>アンダースコア文字 (<code class=\"docutils literal notranslate\">_</code>) は、 Python の対話シェルや doctest で書かれたテストの中では「直前の式の値」を表します。そのため、グローバル名前空間に <code class=\"docutils literal notranslate\">_()</code> をインストールすると、干渉して問題を引き起こします。 <code class=\"docutils literal notranslate\">gettext()</code> を <code class=\"docutils literal notranslate\">_()</code> という名前で明示的に import すれば、この問題を回避できます。</p></li>\n</ol>\n</aside>\n<aside class=\"admonition-what-functions-may-be-aliased-as admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">_</code> として別名をつけられる関数は？</p>\n<p>(<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> で使われる) <code class=\"docutils literal notranslate\">xgettext</code> が動作する方法のせいで、単一の文字列引数を持つ関数のみが <code class=\"docutils literal notranslate\">_</code> として import できます。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a></p></li>\n</ul>\n</aside>\n<p>この例では、<code class=\"docutils literal notranslate\">&quot;Welcome to my site.&quot;</code> というテキストが翻訳文字列としてマークされています:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext <span class=\"k\">as</span> _\n\n\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>別名を付けなくても同じコードを書くことができます。次の例は、上の例とまったく同一です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext\n\n\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    output <span class=\"o\">=</span> gettext<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>翻訳は、計算済みの値に適用されます。次の例は、上の2つの例とまったく同一です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    words <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;Welcome&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;to&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;my&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;site.&quot;</span><span class=\"p\">]</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot; &quot;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>words<span class=\"p\">))</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>翻訳は変数にも適用されます。次の例もまた、上の例とまったく同一です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    sentence <span class=\"o\">=</span> <span class=\"s2\">&quot;Welcome to my site.&quot;</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span>sentence<span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>(上の 2 つの例のように変数や計算済みの値を使う場合の注意点として、Django の翻訳文字列検出ユーティリティ <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> はこれらの文字列を検出できません。詳しくは後の <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> の節で説明します。)</p>\n<p><code class=\"docutils literal notranslate\">_()</code> や <code class=\"docutils literal notranslate\">gettext()</code> に渡す文字列には、Pyton の標準の名前付き補完構文によるプレースホルダを使えます。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">,</span> m<span class=\"p\">,</span> d<span class=\"p\">):</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;Today is </span><span class=\"si\">%(month)s</span><span class=\"s2\"> </span><span class=\"si\">%(day)s</span><span class=\"s2\">.&quot;</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;month&quot;</span><span class=\"p\">:</span> m<span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">:</span> d<span class=\"p\">}</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>このテクニックを使うと、言語ごとの翻訳でプレースホルダを並び替えられるようになります。例えば、英語の翻訳文 <code class=\"docutils literal notranslate\">&quot;Today is Nobember, 26.&quot;</code> に対して、スペイン語では <code class=\"docutils literal notranslate\">&quot;Hoy es 26 de noviembre.&quot;</code> となるように、月と日のプレースホルダの位置を入れ替えることができます。</p>\n<p>この理由から、引数が複数ある場合には、固定引数を使った補完 (<code class=\"docutils literal notranslate\">%s</code> や <code class=\"docutils literal notranslate\">%d</code>) ではなく、名前付きの補完 (<code class=\"docutils literal notranslate\">%(day)s</code>) を使ってください。固定引数による補完を使った場合、プレースホルダを正しい順番で翻訳できない場合があります。</p>\n<p>文字列抽出は <code class=\"docutils literal notranslate\">xgettext</code> コマンドで行われるため、Django がサポートするのは <code class=\"docutils literal notranslate\">gettext</code> がサポートする構文のみです。特に、Python の <a class=\"reference external\" href=\"https://docs.python.org/3/reference/lexical_analysis.html#f-strings\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">f-strings</span></a> はまだ <code class=\"docutils literal notranslate\">xgettext</code> でサポートされておらず、JavaScript テンプレート文字列は <code class=\"docutils literal notranslate\">gettext</code> 0.21+ が必要です。</p>\n</section>\n<section id=\"comments-for-translators\">\n<span id=\"translator-comments\"></span><h3>翻訳者へのコメント<a class=\"heading-anchor\" href=\"#comments-for-translators\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>翻訳可能な文字列についてのヒントを翻訳者に示したい場合、文字列の直前の行で <code class=\"docutils literal notranslate\">Translators</code> キーワードでプレフィックスされたコメントを追加できます。例えば:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># Translators: This message appears on the home page only</span>\n    output <span class=\"o\">=</span> gettext<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>コメントは、後に記述された翻訳可能な文章に関連付けられた、結果の <code class=\"docutils literal notranslate\">.po</code> ファイル内に表示され、ほとんどの翻訳ツールで表示されます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>完全を期すために示すと、以下が結果として生成される対応する  <code class=\"docutils literal notranslate\">.po</code> ファイルの断片です。</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"c1\">#. Translators: This message appears on the home page only</span>\n<span class=\"c1\"># path/to/python/file.py:123</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Welcome to my site.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n</aside>\n<p>これはテンプレート内でも動作します。詳しくは <a class=\"reference internal\" href=\"#translator-comments-in-templates\"><span class=\"std std-ref\">Comments for translators in templates</span></a> を参照してください。</p>\n</section>\n<section id=\"marking-strings-as-no-op\">\n<h3>no-op として文字列をマークする<a class=\"heading-anchor\" href=\"#marking-strings-as-no-op\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>翻訳しない文字列としてマークするためには、<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext_noop\" title=\"django.utils.translation.gettext_noop\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.gettext_noop()</code></a> を使ってください。文字列は、変数より後で翻訳されます。</p>\n<p>ソース言語内に保持すべき構成文字列がある場合、これを使ってください。これは、システムやユーザー (たとえばデータベース内の文字列) を介して交換される一方で、最後の時点 (たとえばユーザに文字列が表示されるとき) で翻訳される必要があるからです。</p>\n</section>\n<section id=\"pluralization\">\n<h3>複数形<a class=\"heading-anchor\" href=\"#pluralization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>複数形のメッセージを指定するには、関数 <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.ngettext\" title=\"django.utils.translation.ngettext\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.ngettext()</code></a> を使ってください。</p>\n<p><code class=\"docutils literal notranslate\">ngettext</code> は 3 つの引数を取ります: 単数形の文字列、複数形の文字列、オブジェクトの数です。</p>\n<p>この関数は、Django アプリケーションを数と <a class=\"reference external\" href=\"https://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms\">複数形</a> の複雑さが英語で 2 より大きい (その値にかかわらず、単数には 'object'、そして <code class=\"docutils literal notranslate\">count</code> が 1 ではない全ての場合に 'objects' となります。) 言語にローカル化させる必要がある場合に役立ちます。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext\n\n\n<span class=\"k\">def</span> <span class=\"nf\">hello_world</span><span class=\"p\">(</span>request<span class=\"p\">,</span> count<span class=\"p\">):</span>\n    page <span class=\"o\">=</span> ngettext<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;there is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> object&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;there are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> objects&quot;</span><span class=\"p\">,</span>\n        count<span class=\"p\">,</span>\n    <span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> count<span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>page<span class=\"p\">)</span>\n</code></pre></div>\n<p>この例では、オブジェクトの数値は <code class=\"docutils literal notranslate\">count</code> 変数として翻訳言語に渡されます。</p>\n<p>複数形は、複雑で言語によって異なる動作をすることに注意してください。<code class=\"docutils literal notranslate\">count</code> と 1 の比較は正しいルールではないことがあります。以下のコードは洗練されて見えますが、いくつかの言語に対しては誤った結果を生み出します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Report\n\ncount <span class=\"o\">=</span> Report<span class=\"o\">.</span>objects<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"k\">if</span> count <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    name <span class=\"o\">=</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    name <span class=\"o\">=</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name_plural\n\ntext <span class=\"o\">=</span> ngettext<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;There is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;There are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    count<span class=\"p\">,</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> count<span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> name<span class=\"p\">}</span>\n</code></pre></div>\n<p>あなた自身の単数複数ロジックを実装しないでください。おそらく正しくなりません。このようなケースでは、以下のようなコードを考えてみてください。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>text <span class=\"o\">=</span> ngettext<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;There is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> object available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;There are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> objects available.&quot;</span><span class=\"p\">,</span>\n    count<span class=\"p\">,</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> count<span class=\"p\">,</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name<span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" id=\"pluralization-var-notes\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\">ngettext()</code> を使うときは、リテラルで挿入される全ての変数に対して単一の名前を使うようにしてください。以下の例で、2 つの翻訳文字列でどのように <code class=\"docutils literal notranslate\">name</code> Python 変数が使われるかに注意してください。この例は、上述した通りいくつかの言語で間違っている以外に、失敗するでしょう:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>text <span class=\"o\">=</span> ngettext<span class=\"p\">(</span>\n    <span class=\"s2\">&quot;There is </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;There are </span><span class=\"si\">%(count)d</span><span class=\"s2\"> </span><span class=\"si\">%(plural_name)s</span><span class=\"s2\"> available.&quot;</span><span class=\"p\">,</span>\n    count<span class=\"p\">,</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;count&quot;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>objects<span class=\"o\">.</span>count<span class=\"p\">(),</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name<span class=\"p\">,</span>\n    <span class=\"s2\">&quot;plural_name&quot;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name_plural<span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> を実行すると、以下のエラーが発生するでしょう。</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Pytb code\"><code><span class=\"x\">a format specification for argument &#39;name&#39;, as in &#39;msgstr[0]&#39;, doesn&#39;t exist in &#39;msgid&#39;</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"contextual-markers\">\n<span id=\"id1\"></span><h3>文脈マーカー<a class=\"heading-anchor\" href=\"#contextual-markers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>単語は複数の意味を持っている場合があります。例えば、英語の <code class=\"docutils literal notranslate\">&quot;May&quot;</code> は、月名と動詞を指します。翻訳者が異なる文脈でこれらの単語を正しく翻訳できるようにするには、<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.pgettext()</code></a> 関数、もしくは文字列が複数形を必要とする場合は  <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.npgettext()</code></a> 関数を使うことができます。両方とも、第 1 変数として文脈文字列を取ります。</p>\n<p>結果の <code class=\"docutils literal notranslate\">.po</code> ファイルで、文字列は同じ文字列に対する異なる文脈マーカーがあるのと同じ頻度で出現し (コンテキストは <code class=\"docutils literal notranslate\">msgctxt</code> 行に出現します)、これらそれぞれに対して翻訳者が異なる翻訳ができるようにします。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> pgettext\n\nmonth <span class=\"o\">=</span> pgettext<span class=\"p\">(</span><span class=\"s2\">&quot;month name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;May&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>もしくは:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> pgettext_lazy\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>\n        help_text<span class=\"o\">=</span>pgettext_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;help text for MyThing model&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">)</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>これは <code class=\"docutils literal notranslate\">.po</code> ファイル内に以下のように出現します:</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"nv\">msgctxt</span> <span class=\"s\">&quot;month name&quot;</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;May&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n<p>文脈マーカーは、<a class=\"reference internal\" href=\"#std-templatetag-translate\"><code class=\"xref std std-ttag docutils literal notranslate\">translate</code></a> and <a class=\"reference internal\" href=\"#std-templatetag-blocktranslate\"><code class=\"xref std std-ttag docutils literal notranslate\">blocktranslate</code></a> テンプレートタグによってもサポートされています。</p>\n</section>\n<section id=\"lazy-translation\">\n<span id=\"lazy-translations\"></span><h3>Lazy な翻訳<a class=\"heading-anchor\" href=\"#lazy-translation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lazy に -- 値が呼ばれたときではなくアクセスされたときに -- 文字列を翻訳するためには、<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#module-django.utils.translation\" title=\"django.utils.translation: Internationalization support.\"><code class=\"xref py py-mod docutils literal notranslate\">django.utils.translation</code></a> (名前の <code class=\"docutils literal notranslate\">lazy</code> 接尾辞ですぐ分かります) の翻訳関数の lazy バージョンを使ってください、</p>\n<p>これらの関数は、Lazy な文字列参照を保持します -- 実際の翻訳ではありません。翻訳自体はテンプレートレンダリング内のように、文字列が文字列コンテキスト内で使われるときに行われます。</p>\n<p>これらの関数への呼び出しがモジュールのロード時に実行されるコードパスにある場合は、これは不可欠です。</p>\n<p>これは、モデル、フォーム、モデルフォームを定義するときに簡単に発生することができるものです。これは、Django がフィールドを実際にクラスレベルの属性にするように実装するためです。 そのため、以下のような場合は lazy な翻訳を使用してください:</p>\n<section id=\"model-fields-and-relationships-verbose-name-and-help-text-option-values\">\n<h4>モデルフィールドとリレーションシップの <code class=\"docutils literal notranslate\">verbose_name</code> と <code class=\"docutils literal notranslate\">help_text</code> オプションの値<a class=\"heading-anchor\" href=\"#model-fields-and-relationships-verbose-name-and-help-text-option-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>例えば、以下のモデルの <em>name</em> フィールドのヘルプテキストを翻訳するためには、以下のようにします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>help_text<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a> オプションを使えば、<a class=\"reference internal\" href=\"/ja/4.2/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>、<a class=\"reference internal\" href=\"/ja/4.2/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> や <a class=\"reference internal\" href=\"/ja/4.2/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> リレーションシップの名前を翻訳可能にできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    kind <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        ThingKind<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s2\">&quot;kinds&quot;</span><span class=\"p\">,</span>\n        verbose_name<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;kind&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a> と同様に、必要に応じて Django が自動的にタイトルケースに直すので、リレーションシップに対する小文字の冗長な名前テキストを提供する必要があります。</p>\n</section>\n<section id=\"model-verbose-names-values\">\n<h4>モデルの冗長な名前の値<a class=\"heading-anchor\" href=\"#model-verbose-names-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>フォールバックの英語中心とモデルのクラス名を見ることによって Django が動作する冗長な名前の純粋な決定に頼るよりも、明示的な <a class=\"reference internal\" href=\"/ja/4.2/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a> と <a class=\"reference internal\" href=\"/ja/4.2/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name_plural</code></a> オプションを指定することが推奨されます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">),</span> help_text<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">))</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        verbose_name <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;my thing&quot;</span><span class=\"p\">)</span>\n        verbose_name_plural <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;my things&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"model-methods-description-argument-to-the-display-decorator\">\n<h4>Model methods <code class=\"docutils literal notranslate\">description</code> argument to the <code class=\"docutils literal notranslate\">&#64;display</code> decorator<a class=\"heading-anchor\" href=\"#model-methods-description-argument-to-the-display-decorator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>モデルメソッドに対しては、<a class=\"reference internal\" href=\"/ja/4.2/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\">display()</code></a> デコレータの <code class=\"docutils literal notranslate\">short_description</code> 引数で Djangoと admin サイトへの翻訳が提供できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    kind <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        ThingKind<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s2\">&quot;kinds&quot;</span><span class=\"p\">,</span>\n        verbose_name<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;kind&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"nd\">@admin</span><span class=\"o\">.</span>display<span class=\"p\">(</span>description<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;Is it a mouse?&quot;</span><span class=\"p\">))</span>\n    <span class=\"k\">def</span> <span class=\"nf\">is_mouse</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>kind<span class=\"o\">.</span>type <span class=\"o\">==</span> MOUSE_TYPE\n</code></pre></div>\n</section>\n</section>\n<section id=\"working-with-lazy-translation-objects\">\n<h3>Lazy 翻訳オブジェクトともに働く<a class=\"heading-anchor\" href=\"#working-with-lazy-translation-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">gettext_lazy()</code> 呼び出しの結果は、他の Django コード内で文字列 (<a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">str</code></a> オブジェクト) を使うときはいつでも使うことができますが、気まぐれな Python コードでうまく動作しないかもしれません。例えば、<a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/requests/\">requests</a> ライブラリが <code class=\"docutils literal notranslate\">gettext_lazy</code> オブジェクトを処理しないので、以下は動作しません:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>body <span class=\"o\">=</span> gettext_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;I </span><span class=\"se\">\\u2764</span><span class=\"s2\"> Django&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># (Unicode :heart:)</span>\nrequests<span class=\"o\">.</span>post<span class=\"p\">(</span><span class=\"s2\">&quot;https://example.com/send&quot;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">:</span> body<span class=\"p\">})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">gettext_lazy()</code> オブジェクトを非 Django コードに渡す前にテキスト文字列にキャストすることで、この問題を防ぐことができます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>requests<span class=\"o\">.</span>post<span class=\"p\">(</span><span class=\"s2\">&quot;https://example.com/send&quot;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">:</span> <span class=\"nb\">str</span><span class=\"p\">(</span>body<span class=\"p\">)})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">gettext_lazy</code> という長い名前を使いたくない場合は、次のように <code class=\"docutils literal notranslate\">_</code> (アンダースコア) としてエイリアスできます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>help_text<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;This is the help text&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Using <code class=\"docutils literal notranslate\">gettext_lazy()</code> and <code class=\"docutils literal notranslate\">ngettext_lazy()</code> to mark strings in models\nand utility functions is a common operation. When you're working with these\nobjects elsewhere in your code, you should ensure that you don't accidentally\nconvert them to strings, because they should be converted as late as possible\n(so that the correct locale is in effect). This necessitates the use of the\nhelper function described next.</p>\n<section id=\"lazy-translations-and-plural\">\n<span id=\"lazy-plural-translations\"></span><h4>Lazy translations and plural<a class=\"heading-anchor\" href=\"#lazy-translations-and-plural\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When using lazy translation for a plural string (<code class=\"docutils literal notranslate\">n[p]gettext_lazy</code>), you\ngenerally don't know the <code class=\"docutils literal notranslate\">number</code> argument at the time of the string\ndefinition. Therefore, you are authorized to pass a key name instead of an\ninteger as the <code class=\"docutils literal notranslate\">number</code> argument. Then <code class=\"docutils literal notranslate\">number</code> will be looked up in the\ndictionary under that key during string interpolation. Here's example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.exceptions</span> <span class=\"kn\">import</span> ValidationError\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext_lazy\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    error_message <span class=\"o\">=</span> ngettext_lazy<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;You only provided </span><span class=\"si\">%(num)d</span><span class=\"s2\"> argument&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;You only provided </span><span class=\"si\">%(num)d</span><span class=\"s2\"> arguments&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;num&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> error<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>error_message <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">:</span> number<span class=\"p\">})</span>\n</code></pre></div>\n<p>If the string contains exactly one unnamed placeholder, you can interpolate\ndirectly with the <code class=\"docutils literal notranslate\">number</code> argument:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    error_message <span class=\"o\">=</span> ngettext_lazy<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;You provided </span><span class=\"si\">%d</span><span class=\"s2\"> argument&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;You provided </span><span class=\"si\">%d</span><span class=\"s2\"> arguments&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> error<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> ValidationError<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>error_message <span class=\"o\">%</span> number<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"formatting-strings-format-lazy\">\n<h4>Formatting strings: <code class=\"docutils literal notranslate\">format_lazy()</code><a class=\"heading-anchor\" href=\"#formatting-strings-format-lazy\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Python's <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">str.format()</code></a> method will not work when either the\n<code class=\"docutils literal notranslate\">format_string</code> or any of the arguments to <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">str.format()</code></a>\ncontains lazy translation objects. Instead, you can use\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.text.format_lazy\" title=\"django.utils.text.format_lazy\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.text.format_lazy()</code></a>, which creates a lazy object\nthat runs the <code class=\"docutils literal notranslate\">str.format()</code> method only when the result is included\nin a string. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.text</span> <span class=\"kn\">import</span> format_lazy\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy\n\n<span class=\"o\">...</span>\nname <span class=\"o\">=</span> gettext_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;John Lennon&quot;</span><span class=\"p\">)</span>\ninstrument <span class=\"o\">=</span> gettext_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;guitar&quot;</span><span class=\"p\">)</span>\nresult <span class=\"o\">=</span> format_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">{name}</span><span class=\"s2\">: </span><span class=\"si\">{instrument}</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> name<span class=\"o\">=</span>name<span class=\"p\">,</span> instrument<span class=\"o\">=</span>instrument<span class=\"p\">)</span>\n</code></pre></div>\n<p>In this case, the lazy translations in <code class=\"docutils literal notranslate\">result</code> will only be converted to\nstrings when <code class=\"docutils literal notranslate\">result</code> itself is used in a string (usually at template\nrendering time).</p>\n</section>\n<section id=\"other-uses-of-lazy-in-delayed-translations\">\n<h4>Other uses of lazy in delayed translations<a class=\"heading-anchor\" href=\"#other-uses-of-lazy-in-delayed-translations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>For any other case where you would like to delay the translation, but have to\npass the translatable string as argument to another function, you can wrap\nthis function inside a lazy call yourself. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.functional</span> <span class=\"kn\">import</span> lazy\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.safestring</span> <span class=\"kn\">import</span> mark_safe\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\nmark_safe_lazy <span class=\"o\">=</span> lazy<span class=\"p\">(</span>mark_safe<span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>And then later:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>lazy_string <span class=\"o\">=</span> mark_safe_lazy<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;p&gt;My &lt;strong&gt;string!&lt;/strong&gt;&lt;/p&gt;&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"localized-names-of-languages\">\n<h3>言語のローカル化された名前<a class=\"heading-anchor\" href=\"#localized-names-of-languages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.utils.translation.get_language_info\">\n<span class=\"sig-name descname\">get_language_info</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">lang_code</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.utils.translation.get_language_info\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The <code class=\"docutils literal notranslate\">get_language_info()</code> function provides detailed information about\nlanguages:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> activate<span class=\"p\">,</span> get_language_info\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>li <span class=\"o\">=</span> get_language_info<span class=\"p\">(</span><span class=\"s2\">&quot;de&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>li<span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> li<span class=\"p\">[</span><span class=\"s2\">&quot;name_local&quot;</span><span class=\"p\">],</span> li<span class=\"p\">[</span><span class=\"s2\">&quot;name_translated&quot;</span><span class=\"p\">],</span> li<span class=\"p\">[</span><span class=\"s2\">&quot;bidi&quot;</span><span class=\"p\">])</span>\n<span class=\"go\">German Deutsch Allemand False</span>\n</code></pre></div>\n<p>ディクショナリの <code class=\"docutils literal notranslate\">name</code>、<code class=\"docutils literal notranslate\">name_local</code>、<code class=\"docutils literal notranslate\">name_translated</code> 属性は、言語の英語名、言語自体、カレントのアクティブ言語をそれぞれ含んでいます。<code class=\"docutils literal notranslate\">bidi</code> 属性は双方向性の言語に対してのみ True です。</p>\n<p>言語情報のソースは <code class=\"docutils literal notranslate\">django.conf.locale</code> モジュールです。テンプレートコードでも、この情報に対して同じようにアクセスすることができます。以下を参照してください。</p>\n</section>\n</section>\n<section id=\"internationalization-in-template-code\">\n<span id=\"specifying-translation-strings-in-template-code\"></span><h2>ローカル化: テンプレート内<a class=\"heading-anchor\" href=\"#internationalization-in-template-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/templates/language/\"><span class=\"doc\">Django テンプレート</span></a> 内での翻訳は 2 つのテンプレートタグと Pthon コードとはやや異なるシンタックスを使います。テンプレートでこれらのタグを使えるようにするには、<code class=\"docutils literal notranslate\">{% load i18n %}</code> をテンプレートの先頭に対して設置してください。全てのテンプレートタグと同じように、すでに <code class=\"docutils literal notranslate\">i18n</code> をロードしているテンプレートを extend している場合であっても、翻訳を使用する全てのテンプレートでロードする必要があります。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>Translated strings will not be escaped when rendered in a template.\nThis allows you to include HTML in translations, for example for emphasis,\nbut potentially dangerous characters (e.g. <code class=\"docutils literal notranslate\">&quot;</code>) will also be rendered\nunchanged.</p>\n</aside>\n<section id=\"translate-template-tag\">\n<span id=\"std-templatetag-translate\"></span><span id=\"std-templatetag-trans\"></span><h3><code class=\"docutils literal notranslate\">translate</code> template tag<a class=\"heading-anchor\" href=\"#translate-template-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <code class=\"docutils literal notranslate\">{% translate %}</code> template tag translates either a constant string\n(enclosed in single or double quotes) or variable content:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;This is the title.&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"nv\">myvar</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>If the <code class=\"docutils literal notranslate\">noop</code> option is present, variable lookup still takes place but the\ntranslation is skipped. This is useful when &quot;stubbing out&quot; content that will\nrequire translation in the future:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;myvar&quot;</span> <span class=\"nv\">noop</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Internally, inline translations use a\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> call.</p>\n<p>テンプレート var (上記の <code class=\"docutils literal notranslate\">myvar</code>) がタグに渡された場合、最初にランタイムで変数から文字列へと解決し、それからメッセージカタログ内でその文字列をルックアップします。</p>\n<p>It's not possible to mix a template variable inside a string within\n<code class=\"docutils literal notranslate\">{% translate %}</code>. If your translations require strings with variables\n(placeholders), use <a class=\"reference internal\" href=\"#std-templatetag-blocktranslate\"><code class=\"xref std std-ttag docutils literal notranslate\">{% blocktranslate %}</code></a> instead.</p>\n<p>If you'd like to retrieve a translated string without displaying it, you can\nuse the following syntax:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;This is the title&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">the_title</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;description&quot;</span> <span class=\"na\">content</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>In practice you'll use this to get a string you can use in multiple places in a\ntemplate or so you can use the output as an argument for other template tags or\nfilters:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;starting point&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">start</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;end point&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">end</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;La Grande Boucle&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">race</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n  <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;/&quot;</span> <span class=\"na\">title</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span><span class=\"s\">Back to &#39;</span><span class=\"cp\">{{</span> <span class=\"nv\">race</span> <span class=\"cp\">}}</span><span class=\"s\">&#39; homepage</span><span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">race</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">h1</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">stage</span> <span class=\"k\">in</span> <span class=\"nv\">tour_stages</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">cycle</span> <span class=\"nv\">start</span> <span class=\"nv\">end</span> <span class=\"cp\">%}</span>: <span class=\"cp\">{{</span> <span class=\"nv\">stage</span> <span class=\"cp\">}}{%</span> <span class=\"k\">if</span> <span class=\"nb\">forloop</span><span class=\"nv\">.counter</span><span class=\"o\">|</span><span class=\"nf\">divisibleby</span><span class=\"o\">:</span><span class=\"m\">2</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>, <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">{% translate %}</code> also supports <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">contextual markers</span></a>\nusing the <code class=\"docutils literal notranslate\">context</code> keyword:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;May&quot;</span> <span class=\"nv\">context</span> <span class=\"s2\">&quot;month name&quot;</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"blocktranslate-template-tag\">\n<span id=\"std-templatetag-blocktranslate\"></span><span id=\"std-templatetag-blocktrans\"></span><h3><code class=\"docutils literal notranslate\">blocktranslate</code> template tag<a class=\"heading-anchor\" href=\"#blocktranslate-template-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Contrarily to the <a class=\"reference internal\" href=\"#std-templatetag-translate\"><code class=\"xref std std-ttag docutils literal notranslate\">translate</code></a> tag, the <code class=\"docutils literal notranslate\">blocktranslate</code> tag allows you\nto mark complex sentences consisting of literals and variable content for\ntranslation by making use of placeholders:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>This string will have <span class=\"cp\">{{</span> <span class=\"nv\">value</span> <span class=\"cp\">}}</span> inside.<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>To translate a template expression -- say, accessing object attributes or\nusing template filters -- you need to bind the expression to a local variable\nfor use within the translation block. Examples:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">amount</span><span class=\"o\">=</span><span class=\"nv\">article.price</span> <span class=\"cp\">%}</span>\nThat will cost $ <span class=\"cp\">{{</span> <span class=\"nv\">amount</span> <span class=\"cp\">}}</span>.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">myvar</span><span class=\"o\">=</span><span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">filter</span> <span class=\"cp\">%}</span>\nThis will have <span class=\"cp\">{{</span> <span class=\"nv\">myvar</span> <span class=\"cp\">}}</span> inside.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>You can use multiple expressions inside a single <code class=\"docutils literal notranslate\">blocktranslate</code> tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">book_t</span><span class=\"o\">=</span><span class=\"nv\">book</span><span class=\"o\">|</span><span class=\"nf\">title</span> <span class=\"nv\">author_t</span><span class=\"o\">=</span><span class=\"nv\">author</span><span class=\"o\">|</span><span class=\"nf\">title</span> <span class=\"cp\">%}</span>\nThis is <span class=\"cp\">{{</span> <span class=\"nv\">book_t</span> <span class=\"cp\">}}</span> by <span class=\"cp\">{{</span> <span class=\"nv\">author_t</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>The previous more verbose format is still supported:\n<code class=\"docutils literal notranslate\">{% blocktranslate with book|title as book_t and author|title as author_t %}</code></p>\n</aside>\n<p>Other block tags (for example <a class=\"reference internal\" href=\"/ja/4.2/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\">{% for %}</code></a> or <a class=\"reference internal\" href=\"/ja/4.2/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\">{% if %}</code></a>) are\nnot allowed inside a <code class=\"docutils literal notranslate\">blocktranslate</code> tag.</p>\n<p>If resolving one of the block arguments fails, <code class=\"docutils literal notranslate\">blocktranslate</code> will fall\nback to the default language by deactivating the currently active language\ntemporarily with the <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.deactivate_all\" title=\"django.utils.translation.deactivate_all\"><code class=\"xref py py-func docutils literal notranslate\">deactivate_all()</code></a>\nfunction.</p>\n<p>This tag also provides for pluralization. To use it:</p>\n<ul class=\"simple\">\n<li><p>Designate and bind a counter value with the name <code class=\"docutils literal notranslate\">count</code>. This value will\nbe the one used to select the right plural form.</p></li>\n<li><p>Specify both the singular and plural forms separating them with the\n<code class=\"docutils literal notranslate\">{% plural %}</code> tag within the <code class=\"docutils literal notranslate\">{% blocktranslate %}</code> and\n<code class=\"docutils literal notranslate\">{% endblocktranslate %}</code> tags.</p></li>\n</ul>\n<p>An example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"nv\">count</span> <span class=\"nv\">counter</span><span class=\"o\">=</span><span class=\"nv\">list</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">%}</span>\nThere is only one <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span> object.\n<span class=\"cp\">{%</span> <span class=\"k\">plural</span> <span class=\"cp\">%}</span>\nThere are <span class=\"cp\">{{</span> <span class=\"nv\">counter</span> <span class=\"cp\">}}</span> <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}</span> objects.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>A more complex example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">amount</span><span class=\"o\">=</span><span class=\"nv\">article.price</span> <span class=\"nv\">count</span> <span class=\"nv\">years</span><span class=\"o\">=</span><span class=\"nv\">i.length</span> <span class=\"cp\">%}</span>\nThat will cost $ <span class=\"cp\">{{</span> <span class=\"nv\">amount</span> <span class=\"cp\">}}</span> per year.\n<span class=\"cp\">{%</span> <span class=\"k\">plural</span> <span class=\"cp\">%}</span>\nThat will cost $ <span class=\"cp\">{{</span> <span class=\"nv\">amount</span> <span class=\"cp\">}}</span> per <span class=\"cp\">{{</span> <span class=\"nv\">years</span> <span class=\"cp\">}}</span> years.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>When you use both the pluralization feature and bind values to local variables\nin addition to the counter value, keep in mind that the <code class=\"docutils literal notranslate\">blocktranslate</code>\nconstruct is internally converted to an <code class=\"docutils literal notranslate\">ngettext</code> call. This means the\nsame <a class=\"reference internal\" href=\"#pluralization-var-notes\"><span class=\"std std-ref\">notes regarding ngettext variables</span></a>\napply.</p>\n<p>Reverse URL lookups cannot be carried out within the <code class=\"docutils literal notranslate\">blocktranslate</code> and\nshould be retrieved (and stored) beforehand:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;path.to.view&#39;</span> <span class=\"nv\">arg</span> <span class=\"nv\">arg2</span> <span class=\"k\">as</span> <span class=\"nv\">the_url</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>\nThis is a URL: <span class=\"cp\">{{</span> <span class=\"nv\">the_url</span> <span class=\"cp\">}}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>If you'd like to retrieve a translated string without displaying it, you can\nuse the following syntax:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"nv\">asvar</span> <span class=\"nv\">the_title</span> <span class=\"cp\">%}</span>The title is <span class=\"cp\">{{</span> <span class=\"nv\">title</span> <span class=\"cp\">}}</span>.<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;description&quot;</span> <span class=\"na\">content</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>In practice you'll use this to get a string you can use in multiple places in a\ntemplate or so you can use the output as an argument for other template tags or\nfilters.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.2\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.2</p><p>In older versions, <code class=\"docutils literal notranslate\">asvar</code> instances weren't marked as safe for (HTML)\noutput purposes.</p>\n</aside>\n<p><code class=\"docutils literal notranslate\">{% blocktranslate %}</code> also supports <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">contextual\nmarkers</span></a> using the <code class=\"docutils literal notranslate\">context</code> keyword:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"k\">with</span> <span class=\"nv\">name</span><span class=\"o\">=</span><span class=\"nv\">user.username</span> <span class=\"nv\">context</span> <span class=\"s2\">&quot;greeting&quot;</span> <span class=\"cp\">%}</span>Hi <span class=\"cp\">{{</span> <span class=\"nv\">name</span> <span class=\"cp\">}}{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Another feature <code class=\"docutils literal notranslate\">{% blocktranslate %}</code> supports is the <code class=\"docutils literal notranslate\">trimmed</code> option.\nThis option will remove newline characters from the beginning and the end of\nthe content of the <code class=\"docutils literal notranslate\">{% blocktranslate %}</code> tag, replace any whitespace at the\nbeginning and end of a line and merge all lines into one using a space\ncharacter to separate them. This is quite useful for indenting the content of a\n<code class=\"docutils literal notranslate\">{% blocktranslate %}</code> tag without having the indentation characters end up\nin the corresponding entry in the <code class=\"docutils literal notranslate\">.po</code> file, which makes the translation\nprocess easier.</p>\n<p>For instance, the following <code class=\"docutils literal notranslate\">{% blocktranslate %}</code> tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"nv\">trimmed</span> <span class=\"cp\">%}</span>\n  First sentence.\n  Second paragraph.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>will result in the entry <code class=\"docutils literal notranslate\">&quot;First sentence. Second paragraph.&quot;</code> in the <code class=\"docutils literal notranslate\">.po</code>\nfile, compared to <code class=\"docutils literal notranslate\">&quot;\\n&#160; First sentence.\\n&#160; Second paragraph.\\n&quot;</code>, if the\n<code class=\"docutils literal notranslate\">trimmed</code> option had not been specified.</p>\n</section>\n<section id=\"string-literals-passed-to-tags-and-filters\">\n<h3>String literals passed to tags and filters<a class=\"heading-anchor\" href=\"#string-literals-passed-to-tags-and-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can translate string literals passed as arguments to tags and filters\nby using the familiar <code class=\"docutils literal notranslate\">_()</code> syntax:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">some_tag</span> <span class=\"kp\">_</span><span class=\"o\">(</span><span class=\"s2\">&quot;Page not found&quot;</span><span class=\"o\">)</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">yesno</span><span class=\"o\">:</span><span class=\"kp\">_</span><span class=\"o\">(</span><span class=\"s2\">&quot;yes,no&quot;</span><span class=\"o\">)</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>In this case, both the tag and the filter will see the translated string,\nso they don't need to be aware of translations.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>In this example, the translation infrastructure will be passed the string\n<code class=\"docutils literal notranslate\">&quot;yes,no&quot;</code>, not the individual strings <code class=\"docutils literal notranslate\">&quot;yes&quot;</code> and <code class=\"docutils literal notranslate\">&quot;no&quot;</code>. The\ntranslated string will need to contain the comma so that the filter\nparsing code knows how to split up the arguments. For example, a German\ntranslator might translate the string <code class=\"docutils literal notranslate\">&quot;yes,no&quot;</code> as <code class=\"docutils literal notranslate\">&quot;ja,nein&quot;</code>\n(keeping the comma intact).</p>\n</aside>\n</section>\n<section id=\"comments-for-translators-in-templates\">\n<span id=\"translator-comments-in-templates\"></span><h3>Comments for translators in templates<a class=\"heading-anchor\" href=\"#comments-for-translators-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Just like with <a class=\"reference internal\" href=\"#translator-comments\"><span class=\"std std-ref\">Python code</span></a>, these notes for\ntranslators can be specified using comments, either with the <a class=\"reference internal\" href=\"/ja/4.2/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\">comment</code></a>\ntag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">comment</span> <span class=\"cp\">%}</span><span class=\"c\">Translators: View verb</span><span class=\"cp\">{%</span> <span class=\"k\">endcomment</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;View&quot;</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">comment</span> <span class=\"cp\">%}</span><span class=\"c\">Translators: Short intro blurb</span><span class=\"cp\">{%</span> <span class=\"k\">endcomment</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>A multiline translatable\nliteral.<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>or with the <code class=\"docutils literal notranslate\">{#</code> ... <code class=\"docutils literal notranslate\">#}</code> <a class=\"reference internal\" href=\"/ja/4.2/ref/templates/language/#template-comments\"><span class=\"std std-ref\">one-line comment constructs</span></a>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"c\">{# Translators: Label of a button that triggers search #}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">button</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Go&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">button</span><span class=\"p\">&gt;</span>\n\n<span class=\"c\">{# Translators: This is a text of the base template #}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">blocktranslate</span> <span class=\"cp\">%}</span>Ambiguous translatable block of text<span class=\"cp\">{%</span> <span class=\"k\">endblocktranslate</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>Just for completeness, these are the corresponding fragments of the\nresulting <code class=\"docutils literal notranslate\">.po</code> file:</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"c1\">#. Translators: View verb</span>\n<span class=\"c1\"># path/to/template/file.html:10</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;View&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n\n<span class=\"c1\">#. Translators: Short intro blurb</span>\n<span class=\"c1\"># path/to/template/file.html:13</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;&quot;</span>\n<span class=\"s\">&quot;A multiline translatable&quot;</span>\n<span class=\"s\">&quot;literal.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n\n<span class=\"c1\"># ...</span>\n\n<span class=\"c1\">#. Translators: Label of a button that triggers search</span>\n<span class=\"c1\"># path/to/template/file.html:100</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Go&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n\n<span class=\"c1\">#. Translators: This is a text of the base template</span>\n<span class=\"c1\"># path/to/template/file.html:103</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Ambiguous translatable block of text&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"switching-language-in-templates\">\n<span id=\"std-templatetag-language\"></span><h3>Switching language in templates<a class=\"heading-anchor\" href=\"#switching-language-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>If you want to select a language within a template, you can use the\n<code class=\"docutils literal notranslate\">language</code> template tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n<span class=\"cm\">&lt;!-- Current language: </span><span class=\"cp\">{{</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">}}</span><span class=\"cm\"> --&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Welcome to our page&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">language</span> <span class=\"s1\">&#39;en&#39;</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n    <span class=\"cm\">&lt;!-- Current language: </span><span class=\"cp\">{{</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">}}</span><span class=\"cm\"> --&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;Welcome to our page&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endlanguage</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>While the first occurrence of &quot;Welcome to our page&quot; uses the current language,\nthe second will always be in English.</p>\n</section>\n<section id=\"other-tags\">\n<span id=\"i18n-template-tags\"></span><h3>Other tags<a class=\"heading-anchor\" href=\"#other-tags\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>These tags also require a <code class=\"docutils literal notranslate\">{% load i18n %}</code>.</p>\n<section id=\"get-available-languages\">\n<span id=\"std-templatetag-get_available_languages\"></span><h4><code class=\"docutils literal notranslate\">get_available_languages</code><a class=\"heading-anchor\" href=\"#get-available-languages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">{% get_available_languages as LANGUAGES %}</code> returns a list of tuples in\nwhich the first element is the <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language code</span></a> and the second is the\nlanguage name (translated into the currently active locale).</p>\n</section>\n<section id=\"get-current-language\">\n<span id=\"std-templatetag-get_current_language\"></span><h4><code class=\"docutils literal notranslate\">get_current_language</code><a class=\"heading-anchor\" href=\"#get-current-language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">{% get_current_language as LANGUAGE_CODE %}</code> returns the current user's\npreferred language as a string. Example: <code class=\"docutils literal notranslate\">en-us</code>. See\n<a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">How Django discovers language preference</span></a>.</p>\n</section>\n<section id=\"get-current-language-bidi\">\n<span id=\"std-templatetag-get_current_language_bidi\"></span><h4><code class=\"docutils literal notranslate\">get_current_language_bidi</code><a class=\"heading-anchor\" href=\"#get-current-language-bidi\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">{% get_current_language_bidi as LANGUAGE_BIDI %}</code> returns the current\nlocale's direction. If <code class=\"docutils literal notranslate\">True</code>, it's a right-to-left language, e.g. Hebrew,\nArabic. If <code class=\"docutils literal notranslate\">False</code> it's a left-to-right language, e.g. English, French,\nGerman, etc.</p>\n</section>\n<section id=\"i18n-context-processor\">\n<span id=\"template-translation-vars\"></span><h4><code class=\"docutils literal notranslate\">i18n</code> context processor<a class=\"heading-anchor\" href=\"#i18n-context-processor\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>If you enable the <a class=\"reference internal\" href=\"/ja/4.2/ref/templates/api/#django.template.context_processors.i18n\" title=\"django.template.context_processors.i18n\"><code class=\"xref py py-class docutils literal notranslate\">django.template.context_processors.i18n</code></a> context\nprocessor, then each <code class=\"docutils literal notranslate\">RequestContext</code> will have access to <code class=\"docutils literal notranslate\">LANGUAGES</code>,\n<code class=\"docutils literal notranslate\">LANGUAGE_CODE</code>, and <code class=\"docutils literal notranslate\">LANGUAGE_BIDI</code> as defined above.</p>\n</section>\n<section id=\"get-language-info\">\n<span id=\"std-templatetag-get_language_info\"></span><h4><code class=\"docutils literal notranslate\">get_language_info</code><a class=\"heading-anchor\" href=\"#get-language-info\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>You can also retrieve information about any of the available languages using\nprovided template tags and filters. To get information about a single language,\nuse the <code class=\"docutils literal notranslate\">{% get_language_info %}</code> tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"s2\">&quot;pl&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>You can then access the information:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code>Language code: <span class=\"cp\">{{</span> <span class=\"nv\">lang.code</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span>\nName of language: <span class=\"cp\">{{</span> <span class=\"nv\">lang.name_local</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span>\nName in English: <span class=\"cp\">{{</span> <span class=\"nv\">lang.name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;</span><span class=\"nt\">br</span><span class=\"p\">&gt;</span>\nBi-directional: <span class=\"cp\">{{</span> <span class=\"nv\">lang.bidi</span> <span class=\"cp\">}}</span>\nName in the active language: <span class=\"cp\">{{</span> <span class=\"nv\">lang.name_translated</span> <span class=\"cp\">}}</span>\n</code></pre></div>\n</section>\n<section id=\"get-language-info-list\">\n<span id=\"std-templatetag-get_language_info_list\"></span><h4><code class=\"docutils literal notranslate\">get_language_info_list</code><a class=\"heading-anchor\" href=\"#get-language-info-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>You can also use the <code class=\"docutils literal notranslate\">{% get_language_info_list %}</code> template tag to retrieve\ninformation for a list of languages (e.g. active languages as specified in\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a>). See <a class=\"reference internal\" href=\"#set-language-redirect-view\"><span class=\"std std-ref\">the section about the set_language redirect\nview</span></a> for an example of how to display a language\nselector using <code class=\"docutils literal notranslate\">{% get_language_info_list %}</code>.</p>\n<p>In addition to <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> style list of tuples,\n<code class=\"docutils literal notranslate\">{% get_language_info_list %}</code> supports lists of language codes.\nIf you do this in your view:</p>\n<div class=\"code-block\" data-language=\"python\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code>context <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;available_languages&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;es&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">]}</span>\n<span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;mytemplate.html&quot;</span><span class=\"p\">,</span> context<span class=\"p\">)</span>\n</code></pre></div>\n<p>you can iterate over those languages in the template:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_language_info_list</span> <span class=\"nv\">for</span> <span class=\"nv\">available_languages</span> <span class=\"k\">as</span> <span class=\"nv\">langs</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">lang</span> <span class=\"k\">in</span> <span class=\"nv\">langs</span> <span class=\"cp\">%}</span> ... <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n</section>\n<section id=\"template-filters\">\n<span id=\"std-templatefilter-language_name_translated\"></span><span id=\"std-templatefilter-language_bidi\"></span><span id=\"std-templatefilter-language_name_local\"></span><span id=\"std-templatefilter-language_name\"></span><h4>テンプレートフィルタ<a class=\"heading-anchor\" href=\"#template-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>There are also some filters available for convenience:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_name }}</code> (&quot;German&quot;)</p></li>\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_name_local }}</code> (&quot;Deutsch&quot;)</p></li>\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_bidi }}</code> (False)</p></li>\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_name_translated }}</code> (&quot;německy&quot;, when active language is Czech)</p></li>\n</ul>\n</section>\n</section>\n</section>\n<section id=\"internationalization-in-javascript-code\">\n<h2>国際化: JavaScript コード内<a class=\"heading-anchor\" href=\"#internationalization-in-javascript-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>JavaScript に対する翻訳には、いくつか問題があります:</p>\n<ul class=\"simple\">\n<li><p>JavaScript コードは <code class=\"docutils literal notranslate\">gettext</code> 実行にアクセスできません。</p></li>\n<li><p>JavaScript コードは <code class=\"docutils literal notranslate\">.po</code> や <code class=\"docutils literal notranslate\">.mo</code> ファイルにアクセスできません; サーバーによって配布される必要があります。</p></li>\n<li><p>JavaScript 用の翻訳カタログはできる限り小さくなければなりません。</p></li>\n</ul>\n<p>Django には、これらの問題に対する総合的な解決策が用意されています: 翻訳を JavaScript に渡し、<code class=\"docutils literal notranslate\">gettext</code> などを JavaScript 内から呼び出せるようにする方法です。</p>\n<p>主な解決策は以下の <code class=\"docutils literal notranslate\">JavaScriptCatalog</code> ビューです。これは、<code class=\"docutils literal notranslate\">gettext</code> を擬似的に再現する関数と翻訳文字列の配列で JavaScript コードライブラリを生成します。</p>\n<section id=\"module-django.views.i18n\">\n<span id=\"the-javascriptcatalog-view\"></span><h3><code class=\"docutils literal notranslate\">JavaScriptCatalog</code> ビュー<a class=\"heading-anchor\" href=\"#module-django.views.i18n\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">JavaScriptCatalog</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">gettext</code> インターフェイスを擬似的に再現する関数と翻訳文字列の配列で、JavaScriptのコードライブラリを生成するビューです。</p>\n<p><strong>属性</strong></p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog.domain\">\n<span class=\"sig-name descname\">domain</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog.domain\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>ビューの出力に追加する文字列を含む翻訳ドメインです。デフォルトは <code class=\"docutils literal notranslate\">'djangojs'</code> です。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog.packages\">\n<span class=\"sig-name descname\">packages</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog.packages\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>インストールされたアプリケーション間の <a class=\"reference internal\" href=\"/ja/4.2/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\">application names</code></a> のリストです。これらのアプリケーションは <code class=\"docutils literal notranslate\">locale</code> ディレクトリを含んでいる必要があります。これらのカタログに加えて  (常に含まれている) <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> 内で見つかった全てのカタログは、1 つのカタログに統合されます。デフォルトは <code class=\"docutils literal notranslate\">None</code> で、全ての <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> からの利用可能な翻訳は JavaScript の出力に渡されることを意味します。</p>\n</dd></dl>\n\n<p><strong>デフォルト値を使った例</strong>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.i18n</span> <span class=\"kn\">import</span> JavaScriptCatalog\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span> JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><strong>独自のパッケージを使った例</strong>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>urlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/myapp/&quot;</span><span class=\"p\">,</span>\n        JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">(</span>packages<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;your.app.label&quot;</span><span class=\"p\">]),</span>\n        name<span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>ルートの URLconf が <a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\">i18n_patterns()</code></a>、<code class=\"docutils literal notranslate\">JavaScriptCatalog</code> を使っている場合、カタログが正しく生成されるように <code class=\"docutils literal notranslate\">i18n_patterns()</code> によるラップも必要となります。</p>\n<p><code class=\"docutils literal notranslate\">i18n_patterns()</code> <strong>を使った例</strong>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf.urls.i18n</span> <span class=\"kn\">import</span> i18n_patterns\n\nurlpatterns <span class=\"o\">=</span> i18n_patterns<span class=\"p\">(</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span> JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<p>翻訳の優先事項は、<code class=\"docutils literal notranslate\">packages</code> 引数内で現れるパッケージに最初に現れるものより高い優先順位を付けることです。これは、同じ利他ラルに対して翻訳がクラッシュする場合に備えて重要です。</p>\n<p>サイト上で複数の <code class=\"docutils literal notranslate\">JavaScriptCatalog</code> ビューを使っていてそのうちのいくつかが同じ文字列を定義している場合、最後にロードされたカタログ内の文字列が優先されます。</p>\n</section>\n<section id=\"using-the-javascript-translation-catalog\">\n<h3>JavaScript 翻訳カタログを使う<a class=\"heading-anchor\" href=\"#using-the-javascript-translation-catalog\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To use the catalog, pull in the dynamically generated script like this:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">script</span> <span class=\"na\">src</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;javascript-catalog&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;&lt;/</span><span class=\"nt\">script</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>これは、reverse URL を使用して、JavaScript カタログビューの URL をルックアップします。カタログがロードされると、JavaScript コードは以下のメソッドを使えるようになります:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">gettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">ngettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">interpolate</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">get_format</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">gettext_noop</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">pgettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">npgettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">pluralidx</code></p></li>\n</ul>\n<section id=\"gettext\">\n<h4><code class=\"docutils literal notranslate\">gettext</code><a class=\"heading-anchor\" href=\"#gettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">gettext</code> 関数は、Python コード内の標準の <code class=\"docutils literal notranslate\">gettext</code> インターフェースと同じように動作します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>document<span class=\"o\">.</span>write<span class=\"p\">(</span>gettext<span class=\"p\">(</span><span class=\"s2\">&quot;this is to be translated&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"ngettext\">\n<h4><code class=\"docutils literal notranslate\">ngettext</code><a class=\"heading-anchor\" href=\"#ngettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">ngettext</code> function provides an interface to pluralize words and\nphrases:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">const</span> <span class=\"nx\">objectCount</span> <span class=\"o\">=</span> <span class=\"mf\">1</span> <span class=\"c1\">// or 0, or 2, or 3, ...</span>\n<span class=\"kd\">const</span> <span class=\"nx\">string</span> <span class=\"o\">=</span> <span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n    <span class=\"s1\">&#39;literal for the singular case&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;literal for the plural case&#39;</span><span class=\"p\">,</span>\n    <span class=\"nx\">objectCount</span>\n<span class=\"p\">);</span>\n</code></pre></div>\n</section>\n<section id=\"interpolate\">\n<h4><code class=\"docutils literal notranslate\">interpolate</code><a class=\"heading-anchor\" href=\"#interpolate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">interpolate</code> 関数は表示形式の文字列の動的な記入をサポートします。補完シンタックスは  Python を模しているので、<code class=\"docutils literal notranslate\">interpolate</code> 関数は位置および名前付きの補完の両方をサポートします。</p>\n<ul>\n<li><p>Positional interpolation: <code class=\"docutils literal notranslate\">obj</code> contains a JavaScript Array object\nwhose elements values are then sequentially interpolated in their\ncorresponding <code class=\"docutils literal notranslate\">fmt</code> placeholders in the same order they appear.\nFor example:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">const</span> <span class=\"nx\">formats</span> <span class=\"o\">=</span> <span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n  <span class=\"s1\">&#39;There is %s object. Remaining: %s&#39;</span><span class=\"p\">,</span>\n  <span class=\"s1\">&#39;There are %s objects. Remaining: %s&#39;</span><span class=\"p\">,</span>\n  <span class=\"mf\">11</span>\n<span class=\"p\">);</span>\n<span class=\"kd\">const</span> <span class=\"nx\">string</span> <span class=\"o\">=</span> <span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">formats</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mf\">11</span><span class=\"p\">,</span> <span class=\"mf\">20</span><span class=\"p\">]);</span>\n<span class=\"c1\">// string is &#39;There are 11 objects. Remaining: 20&#39;</span>\n</code></pre></div>\n</li>\n<li><p>Named interpolation: This mode is selected by passing the optional\nboolean <code class=\"docutils literal notranslate\">named</code> parameter as <code class=\"docutils literal notranslate\">true</code>. <code class=\"docutils literal notranslate\">obj</code> contains a JavaScript\nobject or associative array. For example:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">const</span> <span class=\"nx\">data</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n  <span class=\"nx\">count</span><span class=\"o\">:</span> <span class=\"mf\">10</span><span class=\"p\">,</span>\n  <span class=\"nx\">total</span><span class=\"o\">:</span> <span class=\"mf\">50</span>\n<span class=\"p\">};</span>\n\n<span class=\"kd\">const</span> <span class=\"nx\">formats</span> <span class=\"o\">=</span> <span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n    <span class=\"s1\">&#39;Total: %(total)s, there is %(count)s object&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;there are %(count)s of a total of %(total)s objects&#39;</span><span class=\"p\">,</span>\n    <span class=\"nx\">data</span><span class=\"p\">.</span><span class=\"nx\">count</span>\n<span class=\"p\">);</span>\n<span class=\"kd\">const</span> <span class=\"nx\">string</span> <span class=\"o\">=</span> <span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">formats</span><span class=\"p\">,</span> <span class=\"nx\">data</span><span class=\"p\">,</span> <span class=\"kc\">true</span><span class=\"p\">);</span>\n</code></pre></div>\n</li>\n</ul>\n<p>文字列補完でトップに行ってはいけませんが: とは言えこれは JavaScript なので、コードは繰り返しの正規表現の代替を作る必要があります。これは、Python 内での補完ほど高速ではないので、本当に必要な場合のみ使用するようにしてください (例えば、適切な複数形を生成するための <code class=\"docutils literal notranslate\">ngettext</code> との結合内)。</p>\n</section>\n<section id=\"get-format\">\n<h4><code class=\"docutils literal notranslate\">get_format</code><a class=\"heading-anchor\" href=\"#get-format\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">get_format</code> function has access to the configured i18n formatting\nsettings and can retrieve the format string for a given setting name:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">get_format</span><span class=\"p\">(</span><span class=\"s1\">&#39;DATE_FORMAT&#39;</span><span class=\"p\">));</span>\n<span class=\"c1\">// &#39;N j, Y&#39;</span>\n</code></pre></div>\n<p>以下の設定に対してアクセスします:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_INPUT_FORMATS</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">DATETIME_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-DATETIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATETIME_INPUT_FORMATS</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-DECIMAL_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\">DECIMAL_SEPARATOR</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-FIRST_DAY_OF_WEEK\"><code class=\"xref std std-setting docutils literal notranslate\">FIRST_DAY_OF_WEEK</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MONTH_DAY_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">MONTH_DAY_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-NUMBER_GROUPING\"><code class=\"xref std std-setting docutils literal notranslate\">NUMBER_GROUPING</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SHORT_DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">SHORT_DATE_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-SHORT_DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">SHORT_DATETIME_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-THOUSAND_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\">THOUSAND_SEPARATOR</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-TIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-TIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_INPUT_FORMATS</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-YEAR_MONTH_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">YEAR_MONTH_FORMAT</code></a></p></li>\n</ul>\n<p>これは、Python によってレンダリングされる値と一貫性を持った表示形式を保守するために役立ちます。</p>\n</section>\n<section id=\"gettext-noop\">\n<h4><code class=\"docutils literal notranslate\">gettext_noop</code><a class=\"heading-anchor\" href=\"#gettext-noop\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>これは <code class=\"docutils literal notranslate\">gettext</code> 関数をエミュレートしますが、何もせず、渡されたものをそのまま返します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>document<span class=\"o\">.</span>write<span class=\"p\">(</span>gettext_noop<span class=\"p\">(</span><span class=\"s2\">&quot;this will not be translated&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>これは、将来的に翻訳が必要なコードの部分をもみ消しておくのに役立ちます。</p>\n</section>\n<section id=\"pgettext\">\n<h4><code class=\"docutils literal notranslate\">pgettext</code><a class=\"heading-anchor\" href=\"#pgettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">pgettext</code> 関数は Python の変数 (<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\">pgettext()</code></a>) のように動作し、文脈的に翻訳される単語を提供します:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>document<span class=\"o\">.</span>write<span class=\"p\">(</span>pgettext<span class=\"p\">(</span><span class=\"s2\">&quot;month name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;May&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"npgettext\">\n<h4><code class=\"docutils literal notranslate\">npgettext</code><a class=\"heading-anchor\" href=\"#npgettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">npgettext</code> function also behaves like the Python variant\n(<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\">npgettext()</code></a>), providing a <strong>pluralized</strong>\ncontextually translated word:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">npgettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;group&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span> <span class=\"mf\">1</span><span class=\"p\">));</span>\n<span class=\"c1\">// party</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">npgettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;group&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span> <span class=\"mf\">2</span><span class=\"p\">));</span>\n<span class=\"c1\">// parties</span>\n</code></pre></div>\n</section>\n<section id=\"pluralidx\">\n<h4><code class=\"docutils literal notranslate\">pluralidx</code><a class=\"heading-anchor\" href=\"#pluralidx\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">pluralidx</code> function works in a similar way to the <a class=\"reference internal\" href=\"/ja/4.2/ref/templates/builtins/#std-templatefilter-pluralize\"><code class=\"xref std std-tfilter docutils literal notranslate\">pluralize</code></a>\ntemplate filter, determining if a given <code class=\"docutils literal notranslate\">count</code> should use a plural form of\na word or not:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">pluralidx</span><span class=\"p\">(</span><span class=\"mf\">0</span><span class=\"p\">));</span>\n<span class=\"c1\">// true</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">pluralidx</span><span class=\"p\">(</span><span class=\"mf\">1</span><span class=\"p\">));</span>\n<span class=\"c1\">// false</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">pluralidx</span><span class=\"p\">(</span><span class=\"mf\">2</span><span class=\"p\">));</span>\n<span class=\"c1\">// true</span>\n</code></pre></div>\n<p>最も単純なケースでは、独自の複数形が必要ない場合、これは整数 <code class=\"docutils literal notranslate\">1</code> に対して <code class=\"docutils literal notranslate\">false</code> を返し、他の数に対して <code class=\"docutils literal notranslate\">true</code> を返します。</p>\n<p>ただし、複数形は全ての言語でこのようにシンプルではありません。言語が複数形をサポートしていない場合、空の値が渡されます。</p>\n<p>加えて、複数形に関して複雑なルールが存在する場合、カタログビューは条件付きの表現をレンダリングします。これは、値を <code class=\"docutils literal notranslate\">true</code> (複数形) と <code class=\"docutils literal notranslate\">false</code> (複数形 <strong>ではない</strong> ) のどちらにするかを評価します。</p>\n</section>\n</section>\n<section id=\"the-jsoncatalog-view\">\n<h3><code class=\"docutils literal notranslate\">JSONCatalog</code> ビュー<a class=\"heading-anchor\" href=\"#the-jsoncatalog-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JSONCatalog\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">JSONCatalog</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JSONCatalog\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>他のクライアントサイドのライブラリを使って翻訳を扱うためには、<code class=\"docutils literal notranslate\">JSONCatalog</code> を利用するのがいいでしょう。<a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\">JavaScriptCatalog</code></a> と似ていますが、JSON のレスポンスを返します。</p>\n<p>使える値を知るには、<a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\">JavaScriptCatalog</code></a> を参照してください。また、<code class=\"docutils literal notranslate\">domain</code> と <code class=\"docutils literal notranslate\">packages</code> 属性を使用してください。</p>\n<p>レスポンスの形式は以下の通りです:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>{\n    &quot;catalog&quot;: {\n        # Translations catalog\n    },\n    &quot;formats&quot;: {\n        # Language formats for date, time, etc.\n    },\n    &quot;plural&quot;: &quot;...&quot;  # Expression for plural forms, or null.\n}\n</code></pre></div>\n</dd></dl>\n\n</section>\n<section id=\"note-on-performance\">\n<h3>実行速度についての覚え書き<a class=\"heading-anchor\" href=\"#note-on-performance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>たくさんの JavaScript/JSON i18n ビューは全てのリクエストで <code class=\"docutils literal notranslate\">.mo</code> ファイルからカタログを生成します。出力は一定なので、少なくとも与えられたサイトのバージョンに対しては、キャッシングが有力な選択肢となります。</p>\n<p>サーバーサイトのキャッシングは CPU のロードを軽減します。<a class=\"reference internal\" href=\"/ja/4.2/topics/cache/#django.views.decorators.cache.cache_page\" title=\"django.views.decorators.cache.cache_page\"><code class=\"xref py py-func docutils literal notranslate\">cache_page()</code></a> デコレータを使うと簡単に実装できます。翻訳を変更したときにキャッシュの無効部分をトリガーするには、以下の例にあるようにバージョンに依存したキープレフィックスを使ってください。 もしくは、バージョンに依存した URL でビューをマッピングしてください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.decorators.cache</span> <span class=\"kn\">import</span> cache_page\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.i18n</span> <span class=\"kn\">import</span> JavaScriptCatalog\n\n<span class=\"c1\"># The value returned by get_version() must change when translations change.</span>\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span>\n        cache_page<span class=\"p\">(</span><span class=\"mi\">86400</span><span class=\"p\">,</span> key_prefix<span class=\"o\">=</span><span class=\"s2\">&quot;jsi18n-</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> get_version<span class=\"p\">())(</span>\n            JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">()</span>\n        <span class=\"p\">),</span>\n        name<span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Client-side caching will save bandwidth and make your site load faster. If\nyou're using ETags (<a class=\"reference internal\" href=\"/ja/4.2/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">ConditionalGetMiddleware</code></a>),\nyou're already covered. Otherwise, you can apply <a class=\"reference internal\" href=\"/ja/4.2/topics/conditional-view-processing/#conditional-decorators\"><span class=\"std std-ref\">conditional decorators</span></a>. In the following example, the cache is invalidated\nwhenever you restart your application server:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.decorators.http</span> <span class=\"kn\">import</span> last_modified\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.i18n</span> <span class=\"kn\">import</span> JavaScriptCatalog\n\nlast_modified_date <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span>\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span>\n        last_modified<span class=\"p\">(</span><span class=\"k\">lambda</span> req<span class=\"p\">,</span> <span class=\"o\">**</span>kw<span class=\"p\">:</span> last_modified_date<span class=\"p\">)(</span>\n            JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">()</span>\n        <span class=\"p\">),</span>\n        name<span class=\"o\">=</span><span class=\"s2\">&quot;javascript-catalog&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>また、開発プロシージャの一部として JavaScript カタログを事前に生成して、静的ファイルとして提供することもできます。この抜本的テクニックは <a class=\"reference external\" href=\"https://django-statici18n.readthedocs.io/\">django-statici18n</a> で実装されます。</p>\n</section>\n</section>\n<section id=\"module-django.conf.urls.i18n\">\n<span id=\"internationalization-in-url-patterns\"></span><span id=\"url-internationalization\"></span><h2>国際化: URL パターン内<a class=\"heading-anchor\" href=\"#module-django.conf.urls.i18n\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django には、URL パターンを国際化するための 2 つの仕組みが用意されています:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">LocaleMiddleware</code></a> が、リクエストされた URL からアクティブにする言語を検出できるようにするため、URL パターンのルートに言語のプレフィックスを追加します。</p></li>\n<li><p>Making URL patterns themselves translatable via the\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.gettext_lazy()</code></a> function.</p></li>\n</ul>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>この 2 つのうちどちらを使う場合でも、各リクエストに対してアクティブな言語をセットすることが必要となります; 言い換えれば、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> 設定内に <a class=\"reference internal\" href=\"/ja/4.2/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.middleware.locale.LocaleMiddleware</code></a> を記述しておく必要があります。</p>\n</aside>\n<section id=\"language-prefix-in-url-patterns\">\n<h3>URL パターンにおける言語プレフィックス<a class=\"heading-anchor\" href=\"#language-prefix-in-url-patterns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.conf.urls.i18n.i18n_patterns\">\n<span class=\"sig-name descname\">i18n_patterns</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>urls</em>, <em class=\"sig-param\">prefix_default_language<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.conf.urls.i18n.i18n_patterns\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>この関数は、ルートの URLconf で使うことができ、Django は自動的に現在アクティブな言語のコードを <a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\">i18n_patterns()</code></a> で定義された全ての URL パターンの先頭に追加します。</p>\n<p><code class=\"docutils literal notranslate\">prefix_default_language</code> を <code class=\"docutils literal notranslate\">False</code> にセットすると、デフォルト言語 (<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a>) からプレフィックスを除去します。これは、現在の URL を変更しないよう既存のサイトに翻訳を追加するとき、役に立ちます。</p>\n<p>URL パターンの例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf.urls.i18n</span> <span class=\"kn\">import</span> i18n_patterns\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> include<span class=\"p\">,</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">about</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> about_views\n<span class=\"kn\">from</span> <span class=\"nn\">news</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> news_views\n<span class=\"kn\">from</span> <span class=\"nn\">sitemap.views</span> <span class=\"kn\">import</span> sitemap\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span> sitemap<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\nnews_patterns <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        path<span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n        path<span class=\"p\">(</span><span class=\"s2\">&quot;category/&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>category<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">),</span>\n        path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>details<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"s2\">&quot;news&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n\nurlpatterns <span class=\"o\">+=</span> i18n_patterns<span class=\"p\">(</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> about_views<span class=\"o\">.</span>main<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;news/&quot;</span><span class=\"p\">,</span> include<span class=\"p\">(</span>news_patterns<span class=\"p\">,</span> namespace<span class=\"o\">=</span><span class=\"s2\">&quot;news&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>After defining these URL patterns, Django will automatically add the\nlanguage prefix to the URL patterns that were added by the <code class=\"docutils literal notranslate\">i18n_patterns</code>\nfunction. Example:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> activate\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/sitemap.xml&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;news:index&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/en/news/&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;news:detail&quot;</span><span class=\"p\">,</span> kwargs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;news-slug&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/nl/news/news-slug/&#39;</span>\n</code></pre></div>\n<p>With <code class=\"docutils literal notranslate\">prefix_default_language=False</code> and  <code class=\"docutils literal notranslate\">LANGUAGE_CODE='en'</code>, the URLs\nwill be:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;news:index&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/news/&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;news:index&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&#39;/nl/news/&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\">i18n_patterns()</code></a> はルートの URLconf のみで使うことができます。インクルードされた URLconf で使うと <a class=\"reference internal\" href=\"/ja/4.2/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a> 例外を投げます。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>自動的に追加される言語プレフィックスと重複するようなプレフィックスを持った URL パターンにしないように注意してください。</p>\n</aside>\n</section>\n<section id=\"translating-url-patterns\">\n<span id=\"translating-urlpatterns\"></span><h3>URL パターンを翻訳する<a class=\"heading-anchor\" href=\"#translating-url-patterns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>URL patterns can also be marked translatable using the\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a> function. Example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf.urls.i18n</span> <span class=\"kn\">import</span> i18n_patterns\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> include<span class=\"p\">,</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"kn\">from</span> <span class=\"nn\">about</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> about_views\n<span class=\"kn\">from</span> <span class=\"nn\">news</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> news_views\n<span class=\"kn\">from</span> <span class=\"nn\">sitemaps.views</span> <span class=\"kn\">import</span> sitemap\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span> sitemap<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\nnews_patterns <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        path<span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n        path<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;category/&lt;slug:slug&gt;/&quot;</span><span class=\"p\">),</span> news_views<span class=\"o\">.</span>category<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">),</span>\n        path<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>details<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;detail&quot;</span><span class=\"p\">),</span>\n    <span class=\"p\">],</span>\n    <span class=\"s2\">&quot;news&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n\nurlpatterns <span class=\"o\">+=</span> i18n_patterns<span class=\"p\">(</span>\n    path<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">),</span> about_views<span class=\"o\">.</span>main<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;news/&quot;</span><span class=\"p\">),</span> include<span class=\"p\">(</span>news_patterns<span class=\"p\">,</span> namespace<span class=\"o\">=</span><span class=\"s2\">&quot;news&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>After you've created the translations, the <a class=\"reference internal\" href=\"/ja/4.2/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\">reverse()</code></a>\nfunction will return the URL in the active language. Example:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> activate\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;news:category&quot;</span><span class=\"p\">,</span> kwargs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;recent&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/en/news/category/recent/&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s2\">&quot;news:category&quot;</span><span class=\"p\">,</span> kwargs<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;slug&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;recent&quot;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/nl/nieuws/categorie/recent/&#39;</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>In most cases, it's best to use translated URLs only within a language code\nprefixed block of patterns (using\n<a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\">i18n_patterns()</code></a>), to avoid the possibility\nthat a carelessly translated URL causes a collision with a non-translated\nURL pattern.</p>\n</aside>\n</section>\n<section id=\"reversing-in-templates\">\n<span id=\"id2\"></span><h3>テンプレート内でリバースする<a class=\"heading-anchor\" href=\"#reversing-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>ローカル化された URL がテンプレート内でリバースされる場合、常に現在の言語が使用されます。他の言語の URL にリンクを貼るには、<a class=\"reference internal\" href=\"#std-templatetag-language\"><code class=\"xref std std-ttag docutils literal notranslate\">language</code></a> テンプレートタグを使ってください。これは、テンプレートの囲まれた範囲内で、指定された言語を有効化します:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">get_available_languages</span> <span class=\"k\">as</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">translate</span> <span class=\"s2\">&quot;View this category in:&quot;</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">lang_code</span><span class=\"o\">,</span> <span class=\"nv\">lang_name</span> <span class=\"k\">in</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">language</span> <span class=\"nv\">lang_code</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">a</span> <span class=\"na\">href</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;category&#39;</span> <span class=\"nv\">slug</span><span class=\"o\">=</span><span class=\"nv\">category.slug</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">lang_name</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">a</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endlanguage</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"#std-templatetag-language\"><code class=\"xref std std-ttag docutils literal notranslate\">language</code></a> タグは引数のみとして言語コードを予期します。</p>\n</section>\n</section>\n<section id=\"localization-how-to-create-language-files\">\n<span id=\"how-to-create-language-files\"></span><h2>ローカル化: 言語ファイルを作成する方法<a class=\"heading-anchor\" href=\"#localization-how-to-create-language-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>アプリケーションの文字列リテラルが後の翻訳にためにタグづけされ終わったら、翻訳自体を記述する (もしくは取得する) 必要があります。以下は、その方法です。</p>\n<section id=\"message-files\">\n<h3>メッセージファイル<a class=\"heading-anchor\" href=\"#message-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>最初のステップは、新しい言語に対する <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message file</span></a> を作成することです。メッセージファイルはプレーンテキストファイルで、単一の言語を記述します。このファイルは、全ての翻訳可能な文字列とそれらがどのように与えられた言語で表示されるかを含みます。メッセージファイルは <code class=\"docutils literal notranslate\">.po</code> ファイル拡張子を持ちます。</p>\n<p>Djangoには <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> というツールが用意してあり、これらのファイルの作成と保全を自動化します。</p>\n<aside class=\"admonition-gettext-utilities admonition\" role=\"note\">\n<p class=\"admonition-title\">Gettext ユーティリティ</p>\n<p><code class=\"docutils literal notranslate\">makemessages</code> コマンド (と後述する <code class=\"docutils literal notranslate\">compilemessages</code>) は、GNU gettext ツールセットからのコマンドを使用します: <code class=\"docutils literal notranslate\">xgettext</code>、<code class=\"docutils literal notranslate\">msgfmt</code>、<code class=\"docutils literal notranslate\">msgmerge</code>、<code class=\"docutils literal notranslate\">msguniq</code> です。</p>\n<p>サポートされている <code class=\"docutils literal notranslate\">gettext</code> ユーティリティの最小バージョンは 0.15 です。</p>\n</aside>\n<p>To create or update a message file, run this command:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin makemessages -l de\n</code></pre></div>\n<p>...ここでの <code class=\"docutils literal notranslate\">de</code> は作成したいメッセージファイルに対する <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> です。例えば、ブラジル系のポルトガル語に対する <code class=\"docutils literal notranslate\">pt_BR</code>、オーストリア系のドイツ語に対する <code class=\"docutils literal notranslate\">de_AT</code>、インドネシアに対する <code class=\"docutils literal notranslate\">id</code> などです。</p>\n<p>スクリプトは、2 つの場所のうち 1 つから実行する必要があります:</p>\n<ul class=\"simple\">\n<li><p>Django プロジェクトのルートディレクトリ (<code class=\"docutils literal notranslate\">manage.py</code> を含むところ)。</p></li>\n<li><p>Django アプリケーションのルートディレクトリ。</p></li>\n</ul>\n<p>スクリプトは、プロジェクトのソースツリーもしくはアプリケーションのソースツリーを通じて実行され、翻訳用にマークされた全ての文字列 (<a class=\"reference internal\" href=\"#how-django-discovers-translations\"><span class=\"std std-ref\">How Django discovers translations</span></a> を参照して <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> を正しく設定してください) を抽出します。ディレクトリ <code class=\"docutils literal notranslate\">locale/LANG/LC_MESSAGES</code> にメッセージファイルを作成 (もしくは更新) します。<code class=\"docutils literal notranslate\">de</code> の例では、ファイルは <code class=\"docutils literal notranslate\">locale/de/LC_MESSAGES/django.po</code> となります。</p>\n<p>プロジェクトのルートディレクトリから <code class=\"docutils literal notranslate\">makemessages</code> を実行したとき、抽出された文字列は自動的に適切なメッセージファイルへと分配されます。つまり、<code class=\"docutils literal notranslate\">locale</code> ディレクトリを含むアプリケーションのファイルから抽出された文字列は、そのディレクトリ下のメッセージファイルに格納されます。<code class=\"docutils literal notranslate\">locale</code> ディレクトリがないアプリケーションのファイルから抽出された文字列は、<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> 内に最初にリストアップされたディレクトリ下にあるメッセージファイルか、もしくは <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> が空の場合はエラーを生成します。</p>\n<p>By default <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> examines every\nfile that has the <code class=\"docutils literal notranslate\">.html</code>, <code class=\"docutils literal notranslate\">.txt</code> or <code class=\"docutils literal notranslate\">.py</code> file extension. If you want to\noverride that default, use the <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#cmdoption-makemessages-extension\"><code class=\"xref std std-option docutils literal notranslate\">--extension</code></a>\nor <code class=\"docutils literal notranslate\">-e</code> option to specify the file extensions to examine:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin makemessages -l de -e txt\n</code></pre></div>\n<p>Separate multiple extensions with commas and/or use <code class=\"docutils literal notranslate\">-e</code> or <code class=\"docutils literal notranslate\">--extension</code>\nmultiple times:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin makemessages -l de -e html,txt -e xml\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>When <a class=\"reference internal\" href=\"#creating-message-files-from-js-code\"><span class=\"std std-ref\">creating message files from JavaScript source code</span></a> you need to use the special\n<code class=\"docutils literal notranslate\">djangojs</code> domain, <strong>not</strong> <code class=\"docutils literal notranslate\">-e js</code>.</p>\n</aside>\n<aside class=\"admonition-using-jinja2-templates admonition\" role=\"note\">\n<p class=\"admonition-title\">Jinja2 テンプレートを使う？</p>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> doesn't understand the syntax of Jinja2 templates.\nTo extract strings from a project containing Jinja2 templates, use <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/messages.html#message-extraction\">Message\nExtracting</a> from <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/\">Babel</a> instead.</p>\n<p>Here's an example <code class=\"docutils literal notranslate\">babel.cfg</code> configuration file:</p>\n<div class=\"code-block\" data-language=\"ini\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Ini code\"><code><span class=\"c1\"># Extraction from Python source files</span>\n<span class=\"k\">[python: **.py]</span>\n\n<span class=\"c1\"># Extraction from Jinja2 templates</span>\n<span class=\"k\">[jinja2: **.jinja]</span>\n<span class=\"na\">extensions</span> <span class=\"o\">=</span> <span class=\"s\">jinja2.ext.with_</span>\n</code></pre></div>\n<p>Make sure you list all extensions you're using! Otherwise Babel won't\nrecognize the tags defined by these extensions and will ignore Jinja2\ntemplates containing them entirely.</p>\n<p>Babel provides similar features to <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a>, can replace it\nin general, and doesn't depend on <code class=\"docutils literal notranslate\">gettext</code>. For more information, read\nits documentation about <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/messages.html\">working with message catalogs</a>.</p>\n</aside>\n<aside class=\"admonition-no-gettext admonition\" role=\"note\">\n<p class=\"admonition-title\">gettext がない？</p>\n<p>If you don't have the <code class=\"docutils literal notranslate\">gettext</code> utilities installed,\n<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> will create empty files. If that's the case, either\ninstall the <code class=\"docutils literal notranslate\">gettext</code> utilities or copy the English message file\n(<code class=\"docutils literal notranslate\">locale/en/LC_MESSAGES/django.po</code>) if available and use it as a starting\npoint, which is an empty translation file.</p>\n</aside>\n<aside class=\"admonition-working-on-windows admonition\" role=\"note\">\n<p class=\"admonition-title\">Windows で動作する？</p>\n<p>あなたが Windows を使っていて、<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> が動作するように GNU gettext ユーティリティをインストールする必要がある場合は、<a class=\"reference internal\" href=\"#gettext-on-windows\"><span class=\"std std-ref\">Windows での gettext</span></a> で詳しい情報を参照してください。</p>\n</aside>\n<p>Each <code class=\"docutils literal notranslate\">.po</code> file contains a small bit of metadata, such as the translation\nmaintainer's contact information, but the bulk of the file is a list of\n<strong>messages</strong> -- mappings between translation strings and the actual translated\ntext for the particular language.</p>\n<p>例えば以下のように、Django アプリケーションが <code class=\"docutils literal notranslate\">&quot;Welcome to my site.&quot;</code> に対する翻訳文字列を含んでいる場合、:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>_<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...それから <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> は <code class=\"docutils literal notranslate\">.po</code> ファイルを生成し、そのファイルは以下のようなスニペットを含みます -- メッセージ:</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"kd\">#: path/to/python/module.py:23</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Welcome to my site.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n<p>簡単に説明すると:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">msgid</code> は翻訳文字列で、ソース内に存在します。変更しないでください。</p></li>\n<li><p><code class=\"docutils literal notranslate\">msgstr</code> はあなたが言語に対応する翻訳を記述する場所です。これは空の状態から始まるので、変更するのはあなたの役割です。翻訳をクオートで囲むようにしてください。</p></li>\n<li><p>利便性のため、各メッセージは、<code class=\"docutils literal notranslate\">#</code> でプレフィックスされ <code class=\"docutils literal notranslate\">msgid</code> 行の直前に位置するコメント行の形式の中に、翻訳文字列がどこから拾い集められたかを示すファイル名と行数を含みます。</p></li>\n</ul>\n<p>長いメッセージは特殊なケースです。そこでは、<code class=\"docutils literal notranslate\">msgstr</code> (もしくは <code class=\"docutils literal notranslate\">msgid</code>) 直後の最初の文字列は空の文字列です。それからコンテンツ自身が行ごとに 1 つの文字列として次の数行にわたって記述されます。これらの文字列は直接連結されます。文字列内で最後のスペースを忘れないでください; さもなくば、空白スペースなしで接合されることになります！</p>\n<aside class=\"admonition-mind-your-charset admonition\" role=\"note\">\n<p class=\"admonition-title\">文字コードを気にしてください</p>\n<p>Due to the way the <code class=\"docutils literal notranslate\">gettext</code> tools work internally and because we want to\nallow non-ASCII source strings in Django's core and your applications, you\n<strong>must</strong> use UTF-8 as the encoding for your <code class=\"docutils literal notranslate\">.po</code> files (the default when\n<code class=\"docutils literal notranslate\">.po</code> files are created).  This means that everybody will be using the\nsame encoding, which is important when Django processes the <code class=\"docutils literal notranslate\">.po</code> files.</p>\n</aside>\n<aside class=\"admonition-fuzzy-entries admonition\" role=\"note\">\n<p class=\"admonition-title\">Fuzzy entries</p>\n<p><a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> sometimes generates translation entries marked as\nfuzzy, e.g. when translations are inferred from previously translated\nstrings. By default, fuzzy entries are <strong>not</strong> processed by\n<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">compilemessages</code></a>.</p>\n</aside>\n<p>To reexamine all source code and templates for new translation strings and\nupdate all message files for <strong>all</strong> languages, run this:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin makemessages -a\n</code></pre></div>\n</section>\n<section id=\"compiling-message-files\">\n<h3>メッセージファイルをコンパイルする<a class=\"heading-anchor\" href=\"#compiling-message-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>メッセージファイルを作成した後 -- そして変更を加えたときそれぞれで -- <code class=\"docutils literal notranslate\">gettext</code> による使用のために、より効率的な形式にコンパイルする必要があります。<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> ユーティリティを利用してください。</p>\n<p>This tool runs over all available <code class=\"docutils literal notranslate\">.po</code> files and creates <code class=\"docutils literal notranslate\">.mo</code> files, which\nare binary files optimized for use by <code class=\"docutils literal notranslate\">gettext</code>. In the same directory from\nwhich you ran <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a>, run\n<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> like this:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin compilemessages\n</code></pre></div>\n<p>これで終わりです。翻訳は使う準備ができました。</p>\n<aside class=\"admonition-working-on-windows admonition\" role=\"note\">\n<p class=\"admonition-title\">Windows で動作する？</p>\n<p>あなたが Windows を使っていて、<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> が動作するように GNU gettext ユーティリティをインストールする必要がある場合は、<a class=\"reference internal\" href=\"#gettext-on-windows\"><span class=\"std std-ref\">Windows での gettext</span></a> で詳しい情報を参照してください。</p>\n</aside>\n<aside class=\"admonition-po-files-encoding-and-bom-usage admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">.po</code> files: Encoding and BOM usage.</p>\n<p>Django は、UTF-8 でエンコードされ BOM (Byte Order Mark) を持たない <code class=\"docutils literal notranslate\">.po</code> ファイルのみをサポートします。そのため、テキストエディタがデフォルトでこれらのマークをファイルの最初に追加した場合、再構成する必要があります。</p>\n</aside>\n</section>\n<section id=\"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\">\n<h3>Troubleshooting: <code class=\"docutils literal notranslate\">gettext()</code> incorrectly detects <code class=\"docutils literal notranslate\">python-format</code> in strings with percent signs<a class=\"heading-anchor\" href=\"#troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>In some cases, such as strings with a percent sign followed by a space and a\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#old-string-formatting\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">string conversion type</span></a> (e.g.\n<code class=\"docutils literal notranslate\">_(&quot;10% interest&quot;)</code>), <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> incorrectly\nflags strings with <code class=\"docutils literal notranslate\">python-format</code>.</p>\n<p>誤ってフラグが立てられた文字列でメッセージファイルをコンパイルしようとすると、<code class=\"docutils literal notranslate\">number of format specifications in 'msgid' and 'msgstr' does not match</code> もしくは <code class=\"docutils literal notranslate\">'msgstr' is not a valid Python format string, unlike 'msgid'</code>. といったエラーが発生します。</p>\n<p>これを解決するには、パーセント文字を 2 つ重ねることでエスケープすることができます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext <span class=\"k\">as</span> _\n\noutput <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;10</span><span class=\"si\">%%</span><span class=\"s2\"> interest&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>もしくは <code class=\"docutils literal notranslate\">no-python-format</code> を使ってパーセント文字がリテラルとして扱われるようにします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># xgettext:no-python-format</span>\noutput <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;10</span><span class=\"si\">% i</span><span class=\"s2\">nterest&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"creating-message-files-from-javascript-source-code\">\n<span id=\"creating-message-files-from-js-code\"></span><h3>JavaScript ソースコードからメッセージファイルを作成する<a class=\"heading-anchor\" href=\"#creating-message-files-from-javascript-source-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You create and update the message files the same way as the other Django message\nfiles -- with the <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> tool.\nThe only difference is you need to explicitly specify what in gettext parlance\nis known as a domain in this case the <code class=\"docutils literal notranslate\">djangojs</code> domain, by providing a <code class=\"docutils literal notranslate\">-d\ndjangojs</code> parameter, like this:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>django-admin makemessages -d djangojs -l de\n</code></pre></div>\n<p>This would create or update the message file for JavaScript for German. After\nupdating message files, run <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> the same way as you do with normal Django message files.</p>\n</section>\n<section id=\"gettext-on-windows\">\n<span id=\"id3\"></span><h3>Windows での <code class=\"docutils literal notranslate\">gettext</code><a class=\"heading-anchor\" href=\"#gettext-on-windows\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>This is only needed for people who either want to extract message IDs or compile\nmessage files (<code class=\"docutils literal notranslate\">.po</code>). Translation work itself involves editing existing\nfiles of this type, but if you want to create your own message files, or want\nto test or compile a changed message file, download <a class=\"reference external\" href=\"https://mlocati.github.io/articles/gettext-iconv-windows.html\">a precompiled binary\ninstaller</a>.</p>\n<p>You may also use <code class=\"docutils literal notranslate\">gettext</code> binaries you have obtained elsewhere, so long as\nthe <code class=\"docutils literal notranslate\">xgettext --version</code> command works properly. Do not attempt to use Django\ntranslation utilities with a <code class=\"docutils literal notranslate\">gettext</code> package if the command <code class=\"docutils literal notranslate\">xgettext\n--version</code> entered at a Windows command prompt causes a popup window saying\n&quot;<code class=\"docutils literal notranslate\">xgettext.exe</code> has generated errors and will be closed by Windows&quot;.</p>\n</section>\n<section id=\"customizing-the-makemessages-command\">\n<span id=\"customizing-makemessages\"></span><h3><code class=\"docutils literal notranslate\">makemessages</code> コマンドをカスタマイズする<a class=\"heading-anchor\" href=\"#customizing-the-makemessages-command\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">xgettext</code> に追加のパラメータを渡したい場合、独自の <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> コマンドを作成して、その <code class=\"docutils literal notranslate\">xgettext_options</code> 属性をオーバーライドする必要があります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.management.commands</span> <span class=\"kn\">import</span> makemessages\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Command</span><span class=\"p\">(</span>makemessages<span class=\"o\">.</span>Command<span class=\"p\">):</span>\n    xgettext_options <span class=\"o\">=</span> makemessages<span class=\"o\">.</span>Command<span class=\"o\">.</span>xgettext_options <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"s2\">&quot;--keyword=mytrans&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>もっと柔軟に使う必要があるとき場合には、<a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> コマンドに新しい引数を追加することもできます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.management.commands</span> <span class=\"kn\">import</span> makemessages\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Command</span><span class=\"p\">(</span>makemessages<span class=\"o\">.</span>Command<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">add_arguments</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> parser<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>add_arguments<span class=\"p\">(</span>parser<span class=\"p\">)</span>\n        parser<span class=\"o\">.</span>add_argument<span class=\"p\">(</span>\n            <span class=\"s2\">&quot;--extra-keyword&quot;</span><span class=\"p\">,</span>\n            dest<span class=\"o\">=</span><span class=\"s2\">&quot;xgettext_keywords&quot;</span><span class=\"p\">,</span>\n            action<span class=\"o\">=</span><span class=\"s2\">&quot;append&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>options<span class=\"p\">):</span>\n        xgettext_keywords <span class=\"o\">=</span> options<span class=\"o\">.</span>pop<span class=\"p\">(</span><span class=\"s2\">&quot;xgettext_keywords&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> xgettext_keywords<span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>xgettext_options <span class=\"o\">=</span> makemessages<span class=\"o\">.</span>Command<span class=\"o\">.</span>xgettext_options<span class=\"p\">[:]</span> <span class=\"o\">+</span> <span class=\"p\">[</span>\n                <span class=\"s2\">&quot;--keyword=</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> kwd <span class=\"k\">for</span> kwd <span class=\"ow\">in</span> xgettext_keywords\n            <span class=\"p\">]</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>handle<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>options<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"miscellaneous\">\n<h2>その他<a class=\"heading-anchor\" href=\"#miscellaneous\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"the-set-language-redirect-view\">\n<span id=\"set-language-redirect-view\"></span><h3>The <code class=\"docutils literal notranslate\">set_language</code> redirect view<a class=\"heading-anchor\" href=\"#the-set-language-redirect-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.set_language\">\n<span class=\"sig-name descname\">set_language</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.i18n.set_language\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>As a convenience, Django comes with a view, <a class=\"reference internal\" href=\"#django.views.i18n.set_language\" title=\"django.views.i18n.set_language\"><code class=\"xref py py-func docutils literal notranslate\">django.views.i18n.set_language()</code></a>,\nthat sets a user's language preference and redirects to a given URL or, by default,\nback to the previous page.</p>\n<p>Activate this view by adding the following line to your URLconf:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>path<span class=\"p\">(</span><span class=\"s2\">&quot;i18n/&quot;</span><span class=\"p\">,</span> include<span class=\"p\">(</span><span class=\"s2\">&quot;django.conf.urls.i18n&quot;</span><span class=\"p\">)),</span>\n</code></pre></div>\n<p>(Note that this example makes the view available at <code class=\"docutils literal notranslate\">/i18n/setlang/</code>.)</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>Make sure that you don't include the above URL within\n<a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\">i18n_patterns()</code></a> - it needs to be\nlanguage-independent itself to work correctly.</p>\n</aside>\n<p>The view expects to be called via the <code class=\"docutils literal notranslate\">POST</code> method, with a <code class=\"docutils literal notranslate\">language</code>\nparameter set in request. If session support is enabled, the view saves the\nlanguage choice in the user's session. It also saves the language choice in a\ncookie that is named <code class=\"docutils literal notranslate\">django_language</code> by default. (The name can be changed\nthrough the <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a> setting.)</p>\n<p>After setting the language choice, Django looks for a <code class=\"docutils literal notranslate\">next</code> parameter in the\n<code class=\"docutils literal notranslate\">POST</code> or <code class=\"docutils literal notranslate\">GET</code> data. If that is found and Django considers it to be a safe\nURL (i.e. it doesn't point to a different host and uses a safe scheme), a\nredirect to that URL will be performed. Otherwise, Django may fall back to\nredirecting the user to the URL from the <code class=\"docutils literal notranslate\">Referer</code> header or, if it is not\nset, to <code class=\"docutils literal notranslate\">/</code>, depending on the nature of the request:</p>\n<ul class=\"simple\">\n<li><p>If the request accepts HTML content (based on its <code class=\"docutils literal notranslate\">Accept</code> HTTP header),\nthe fallback will always be performed.</p></li>\n<li><p>If the request doesn't accept HTML, the fallback will be performed only if\nthe <code class=\"docutils literal notranslate\">next</code> parameter was set. Otherwise a 204 status code (No Content) will\nbe returned.</p></li>\n</ul>\n<p>Here's example HTML template code:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">load</span> <span class=\"nv\">i18n</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">form</span> <span class=\"na\">action</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;set_language&#39;</span> <span class=\"cp\">%}</span><span class=\"s\">&quot;</span> <span class=\"na\">method</span><span class=\"o\">=</span><span class=\"s\">&quot;post&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">csrf_token</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;next&quot;</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;hidden&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">redirect_to</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">select</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;language&quot;</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">get_current_language</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">get_available_languages</span> <span class=\"k\">as</span> <span class=\"nv\">LANGUAGES</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">get_language_info_list</span> <span class=\"nv\">for</span> <span class=\"nv\">LANGUAGES</span> <span class=\"k\">as</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">language</span> <span class=\"k\">in</span> <span class=\"nv\">languages</span> <span class=\"cp\">%}</span>\n            <span class=\"p\">&lt;</span><span class=\"nt\">option</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">language.code</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">language.code</span> <span class=\"o\">==</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"cp\">%}</span> <span class=\"na\">selected</span><span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span><span class=\"p\">&gt;</span>\n                <span class=\"cp\">{{</span> <span class=\"nv\">language.name_local</span> <span class=\"cp\">}}</span> (<span class=\"cp\">{{</span> <span class=\"nv\">language.code</span> <span class=\"cp\">}}</span>)\n            <span class=\"p\">&lt;/</span><span class=\"nt\">option</span><span class=\"p\">&gt;</span>\n        <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"p\">&lt;/</span><span class=\"nt\">select</span><span class=\"p\">&gt;</span>\n    <span class=\"p\">&lt;</span><span class=\"nt\">input</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span> <span class=\"na\">value</span><span class=\"o\">=</span><span class=\"s\">&quot;Go&quot;</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;/</span><span class=\"nt\">form</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>In this example, Django looks up the URL of the page to which the user will be\nredirected in the <code class=\"docutils literal notranslate\">redirect_to</code> context variable.</p>\n</section>\n<section id=\"explicitly-setting-the-active-language\">\n<span id=\"id4\"></span><h3>明示的にアクティブな言語をセットする<a class=\"heading-anchor\" href=\"#explicitly-setting-the-active-language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You may want to set the active language for the current session explicitly. Perhaps\na user's language preference is retrieved from another system, for example.\nYou've already been introduced to <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.activate()</code></a>. That\napplies to the current thread only. To persist the language for the entire\nsession in a cookie, set the <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a> cookie on the\nresponse:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.conf</span> <span class=\"kn\">import</span> settings\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\n\nuser_language <span class=\"o\">=</span> <span class=\"s2\">&quot;fr&quot;</span>\ntranslation<span class=\"o\">.</span>activate<span class=\"p\">(</span>user_language<span class=\"p\">)</span>\nresponse <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\nresponse<span class=\"o\">.</span>set_cookie<span class=\"p\">(</span>settings<span class=\"o\">.</span>LANGUAGE_COOKIE_NAME<span class=\"p\">,</span> user_language<span class=\"p\">)</span>\n</code></pre></div>\n<p>You would typically want to use both: <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.activate()</code></a>\nchanges the language for this thread, and setting the cookie makes this\npreference persist in future requests.</p>\n</section>\n<section id=\"using-translations-outside-views-and-templates\">\n<h3>ビューやテンプレートの外で翻訳を使う<a class=\"heading-anchor\" href=\"#using-translations-outside-views-and-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>While Django provides a rich set of i18n tools for use in views and templates,\nit does not restrict the usage to Django-specific code. The Django translation\nmechanisms can be used to translate arbitrary texts to any language that is\nsupported by Django (as long as an appropriate translation catalog exists, of\ncourse). You can load a translation catalog, activate it and translate text to\nlanguage of your choice, but remember to switch back to original language, as\nactivating a translation catalog is done on per-thread basis and such change\nwill affect code running in the same thread.</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\n\n\n<span class=\"k\">def</span> <span class=\"nf\">welcome_translated</span><span class=\"p\">(</span>language<span class=\"p\">):</span>\n    cur_language <span class=\"o\">=</span> translation<span class=\"o\">.</span>get_language<span class=\"p\">()</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        translation<span class=\"o\">.</span>activate<span class=\"p\">(</span>language<span class=\"p\">)</span>\n        text <span class=\"o\">=</span> translation<span class=\"o\">.</span>gettext<span class=\"p\">(</span><span class=\"s2\">&quot;welcome&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">finally</span><span class=\"p\">:</span>\n        translation<span class=\"o\">.</span>activate<span class=\"p\">(</span>cur_language<span class=\"p\">)</span>\n    <span class=\"k\">return</span> text\n</code></pre></div>\n<p>Calling this function with the value <code class=\"docutils literal notranslate\">'de'</code> will give you <code class=\"docutils literal notranslate\">&quot;Willkommen&quot;</code>,\nregardless of <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> and language set by middleware.</p>\n<p>Functions of particular interest are\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.get_language\" title=\"django.utils.translation.get_language\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.get_language()</code></a> which returns the language used\nin the current thread, <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.activate()</code></a> which\nactivates a translation catalog for the current thread, and\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.check_for_language\" title=\"django.utils.translation.check_for_language\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.check_for_language()</code></a>\nwhich checks if the given language is supported by Django.</p>\n<p>To help write more concise code, there is also a context manager\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.override\" title=\"django.utils.translation.override\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.override()</code></a> that stores the current language on\nenter and restores it on exit. With it, the above example becomes:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\n\n\n<span class=\"k\">def</span> <span class=\"nf\">welcome_translated</span><span class=\"p\">(</span>language<span class=\"p\">):</span>\n    <span class=\"k\">with</span> translation<span class=\"o\">.</span>override<span class=\"p\">(</span>language<span class=\"p\">):</span>\n        <span class=\"k\">return</span> translation<span class=\"o\">.</span>gettext<span class=\"p\">(</span><span class=\"s2\">&quot;welcome&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"language-cookie\">\n<h3>Language cookie<a class=\"heading-anchor\" href=\"#language-cookie\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>A number of settings can be used to adjust language cookie options:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_AGE</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_DOMAIN</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_HTTPONLY\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_HTTPONLY</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_PATH</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_SAMESITE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_SAMESITE</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_SECURE</code></a></p></li>\n</ul>\n</section>\n</section>\n<section id=\"implementation-notes\">\n<h2>Implementation notes<a class=\"heading-anchor\" href=\"#implementation-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"specialties-of-django-translation\">\n<span id=\"specialties-of-django-i18n\"></span><h3>Specialties of Django translation<a class=\"heading-anchor\" href=\"#specialties-of-django-translation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django's translation machinery uses the standard <code class=\"docutils literal notranslate\">gettext</code> module that comes\nwith Python. If you know <code class=\"docutils literal notranslate\">gettext</code>, you might note these specialties in the\nway Django does translation:</p>\n<ul class=\"simple\">\n<li><p>The string domain is <code class=\"docutils literal notranslate\">django</code> or <code class=\"docutils literal notranslate\">djangojs</code>. This string domain is\nused to differentiate between different programs that store their data\nin a common message-file library (usually <code class=\"docutils literal notranslate\">/usr/share/locale/</code>). The\n<code class=\"docutils literal notranslate\">django</code> domain is used for Python and template translation strings\nand is loaded into the global translation catalogs. The <code class=\"docutils literal notranslate\">djangojs</code>\ndomain is only used for JavaScript translation catalogs to make sure\nthat those are as small as possible.</p></li>\n<li><p>Django doesn't use <code class=\"docutils literal notranslate\">xgettext</code> alone. It uses Python wrappers around\n<code class=\"docutils literal notranslate\">xgettext</code> and <code class=\"docutils literal notranslate\">msgfmt</code>. This is mostly for convenience.</p></li>\n</ul>\n</section>\n<section id=\"how-django-discovers-language-preference\">\n<span id=\"id5\"></span><h3>How Django discovers language preference<a class=\"heading-anchor\" href=\"#how-django-discovers-language-preference\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Once you've prepared your translations -- or, if you want to use the\ntranslations that come with Django -- you'll need to activate translation for\nyour app.</p>\n<p>Behind the scenes, Django has a very flexible model of deciding which language\nshould be used -- installation-wide, for a particular user, or both.</p>\n<p>To set an installation-wide language preference, set <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a>.\nDjango uses this language as the default translation -- the final attempt if no\nbetter matching translation is found through one of the methods employed by the\nlocale middleware (see below).</p>\n<p>If all you want is to run Django with your native language all you need to do\nis set <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> and make sure the corresponding <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message\nfiles</span></a> and their compiled versions (<code class=\"docutils literal notranslate\">.mo</code>) exist.</p>\n<p>If you want to let each individual user specify which language they\nprefer, then you also need to use the <code class=\"docutils literal notranslate\">LocaleMiddleware</code>.\n<code class=\"docutils literal notranslate\">LocaleMiddleware</code> enables language selection based on data from the request.\nIt customizes content for each user.</p>\n<p>To use <code class=\"docutils literal notranslate\">LocaleMiddleware</code>, add <code class=\"docutils literal notranslate\">'django.middleware.locale.LocaleMiddleware'</code>\nto your <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> setting. Because middleware order matters, follow\nthese guidelines:</p>\n<ul class=\"simple\">\n<li><p>Make sure it's one of the first middleware installed.</p></li>\n<li><p>It should come after <code class=\"docutils literal notranslate\">SessionMiddleware</code>, because <code class=\"docutils literal notranslate\">LocaleMiddleware</code>\nmakes use of session data. And it should come before <code class=\"docutils literal notranslate\">CommonMiddleware</code>\nbecause <code class=\"docutils literal notranslate\">CommonMiddleware</code> needs an activated language in order\nto resolve the requested URL.</p></li>\n<li><p>If you use <code class=\"docutils literal notranslate\">CacheMiddleware</code>, put <code class=\"docutils literal notranslate\">LocaleMiddleware</code> after it.</p></li>\n</ul>\n<p>For example, your <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> might look like this:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>MIDDLEWARE <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.contrib.sessions.middleware.SessionMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.locale.LocaleMiddleware&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.middleware.common.CommonMiddleware&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>(For more on middleware, see the <a class=\"reference internal\" href=\"/ja/4.2/topics/http/middleware/\"><span class=\"doc\">middleware documentation</span></a>.)</p>\n<p><code class=\"docutils literal notranslate\">LocaleMiddleware</code> tries to determine the user's language preference by\nfollowing this algorithm:</p>\n<ul>\n<li><p>First, it looks for the language prefix in the requested URL.  This is\nonly performed when you are using the <code class=\"docutils literal notranslate\">i18n_patterns</code> function in your\nroot URLconf. See <a class=\"reference internal\" href=\"#url-internationalization\"><span class=\"std std-ref\">国際化: URL パターン内</span></a> for more information\nabout the language prefix and how to internationalize URL patterns.</p></li>\n<li><p>Failing that, it looks for a cookie.</p>\n<p>The name of the cookie used is set by the <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a>\nsetting. (The default name is <code class=\"docutils literal notranslate\">django_language</code>.)</p>\n</li>\n<li><p>Failing that, it looks at the <code class=\"docutils literal notranslate\">Accept-Language</code> HTTP header. This\nheader is sent by your browser and tells the server which language(s) you\nprefer, in order by priority. Django tries each language in the header\nuntil it finds one with available translations.</p></li>\n<li><p>Failing that, it uses the global <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> setting.</p></li>\n</ul>\n<p id=\"locale-middleware-notes\">メモ:</p>\n<ul>\n<li><p>In each of these places, the language preference is expected to be in the\nstandard <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language format</span></a>, as a string. For example,\nBrazilian Portuguese is <code class=\"docutils literal notranslate\">pt-br</code>.</p></li>\n<li><p>If a base language is available but the sublanguage specified is not,\nDjango uses the base language. For example, if a user specifies <code class=\"docutils literal notranslate\">de-at</code>\n(Austrian German) but Django only has <code class=\"docutils literal notranslate\">de</code> available, Django uses\n<code class=\"docutils literal notranslate\">de</code>.</p></li>\n<li><p>Only languages listed in the <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> setting can be selected.\nIf you want to restrict the language selection to a subset of provided\nlanguages (because your application doesn't provide all those languages),\nset <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> to a list of languages. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>LANGUAGES <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;de&quot;</span><span class=\"p\">,</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;German&quot;</span><span class=\"p\">)),</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;English&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>This example restricts languages that are available for automatic\nselection to German and English (and any sublanguage, like <code class=\"docutils literal notranslate\">de-ch</code> or\n<code class=\"docutils literal notranslate\">en-us</code>).</p>\n</li>\n<li><p>If you define a custom <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> setting, as explained in the\nprevious bullet, you can mark the language names as translation strings\n-- but use <a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a> instead of\n<a class=\"reference internal\" href=\"/ja/4.2/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> to avoid a circular import.</p>\n<p>以下はサンプルの設定ファイルです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\nLANGUAGES <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;de&quot;</span><span class=\"p\">,</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;German&quot;</span><span class=\"p\">)),</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">,</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;English&quot;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Once <code class=\"docutils literal notranslate\">LocaleMiddleware</code> determines the user's preference, it makes this\npreference available as <code class=\"docutils literal notranslate\">request.LANGUAGE_CODE</code> for each\n<a class=\"reference internal\" href=\"/ja/4.2/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a>. Feel free to read this value in your view\ncode. Here's an example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n\n\n<span class=\"k\">def</span> <span class=\"nf\">hello_world</span><span class=\"p\">(</span>request<span class=\"p\">,</span> count<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>LANGUAGE_CODE <span class=\"o\">==</span> <span class=\"s2\">&quot;de-at&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;You prefer to read Austrian German.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;You prefer to read another language.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note that, with static (middleware-less) translation, the language is in\n<code class=\"docutils literal notranslate\">settings.LANGUAGE_CODE</code>, while with dynamic (middleware) translation, it's\nin <code class=\"docutils literal notranslate\">request.LANGUAGE_CODE</code>.</p>\n</section>\n<section id=\"how-django-discovers-translations\">\n<span id=\"id6\"></span><h3>How Django discovers translations<a class=\"heading-anchor\" href=\"#how-django-discovers-translations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>At runtime, Django builds an in-memory unified catalog of literals-translations.\nTo achieve this it looks for translations by following this algorithm regarding\nthe order in which it examines the different file paths to load the compiled\n<a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message files</span></a> (<code class=\"docutils literal notranslate\">.mo</code>) and the precedence of multiple\ntranslations for the same literal:</p>\n<ol class=\"arabic simple\">\n<li><p>The directories listed in <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> have the highest\nprecedence, with the ones appearing first having higher precedence than\nthe ones appearing later.</p></li>\n<li><p>Then, it looks for and uses if it exists a <code class=\"docutils literal notranslate\">locale</code> directory in each\nof the installed apps listed in <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>.  The ones\nappearing first have higher precedence than the ones appearing later.</p></li>\n<li><p>Finally, the Django-provided base translation in <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/4.2.x/django/conf/locale\">django/conf/locale</a>\nis used as a fallback.</p></li>\n</ol>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<p>The translations for literals included in JavaScript assets are looked up\nfollowing a similar but not identical algorithm. See\n<a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\">JavaScriptCatalog</code></a> for more details.</p>\n<p>You can also put <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/formatting/#custom-format-files\"><span class=\"std std-ref\">custom format files</span></a> in the\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> directories if you also set\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-FORMAT_MODULE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\">FORMAT_MODULE_PATH</code></a>.</p>\n</aside>\n<p>In all cases the name of the directory containing the translation is expected to\nbe named using <a class=\"reference internal\" href=\"/ja/4.2/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> notation. E.g. <code class=\"docutils literal notranslate\">de</code>, <code class=\"docutils literal notranslate\">pt_BR</code>, <code class=\"docutils literal notranslate\">es_AR</code>,\netc. Untranslated strings for territorial language variants use the translations\nof the generic language. For example, untranslated <code class=\"docutils literal notranslate\">pt_BR</code> strings use <code class=\"docutils literal notranslate\">pt</code>\ntranslations.</p>\n<p>This way, you can write applications that include their own translations, and\nyou can override base translations in your project. Or, you can build a big\nproject out of several apps and put all translations into one big common\nmessage file specific to the project you are composing. The choice is yours.</p>\n<p>All message file repositories are structured the same way. They are:</p>\n<ul class=\"simple\">\n<li><p>All paths listed in <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> in your settings file are\nsearched for <code class=\"docutils literal notranslate\">&lt;language&gt;/LC_MESSAGES/django.(po|mo)</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">$APPPATH/locale/&lt;language&gt;/LC_MESSAGES/django.(po|mo)</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">$PYTHONPATH/django/conf/locale/&lt;language&gt;/LC_MESSAGES/django.(po|mo)</code></p></li>\n</ul>\n<p>To create message files, you use the <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a>\ntool. And you use <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a>\nto produce the binary <code class=\"docutils literal notranslate\">.mo</code> files that are used by <code class=\"docutils literal notranslate\">gettext</code>.</p>\n<p>You can also run <a class=\"reference internal\" href=\"/ja/4.2/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages\n--settings=path.to.settings</code></a> to make the compiler process all\nthe directories in your <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> setting.</p>\n</section>\n<section id=\"using-a-non-english-base-language\">\n<h3>Using a non-English base language<a class=\"heading-anchor\" href=\"#using-a-non-english-base-language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django makes the general assumption that the original strings in a translatable\nproject are written in English. You can choose another language, but you must be\naware of certain limitations:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">gettext</code> only provides two plural forms for the original messages, so you\nwill also need to provide a translation for the base language to include all\nplural forms if the plural rules for the base language are different from\nEnglish.</p></li>\n<li><p>When an English variant is activated and English strings are missing, the\nfallback language will not be the <a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> of the project,\nbut the original strings. For example, an English user visiting a site with\n<a class=\"reference internal\" href=\"/ja/4.2/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> set to Spanish and original strings written in\nRussian will see Russian text rather than Spanish.</p></li>\n</ul>\n</section>\n</section>","rootId":"translation","toc":[{"title":"概要","anchor":"overview","children":[]},{"title":"Python コードでの国際化","anchor":"internationalization-in-python-code","children":[{"title":"標準的な翻訳","anchor":"standard-translation","children":[]},{"title":"翻訳者へのコメント","anchor":"comments-for-translators","children":[]},{"title":"no-op として文字列をマークする","anchor":"marking-strings-as-no-op","children":[]},{"title":"複数形","anchor":"pluralization","children":[]},{"title":"文脈マーカー","anchor":"contextual-markers","children":[]},{"title":"Lazy な翻訳","anchor":"lazy-translation","children":[{"title":"モデルフィールドとリレーションシップの verbose_name と help_text オプションの値","anchor":"model-fields-and-relationships-verbose-name-and-help-text-option-values","children":[]},{"title":"モデルの冗長な名前の値","anchor":"model-verbose-names-values","children":[]},{"title":"Model methods description argument to the @display decorator","anchor":"model-methods-description-argument-to-the-display-decorator","children":[]}]},{"title":"Lazy 翻訳オブジェクトともに働く","anchor":"working-with-lazy-translation-objects","children":[{"title":"Lazy translations and plural","anchor":"lazy-translations-and-plural","children":[]},{"title":"Formatting strings: format_lazy()","anchor":"formatting-strings-format-lazy","children":[]},{"title":"Other uses of lazy in delayed translations","anchor":"other-uses-of-lazy-in-delayed-translations","children":[]}]},{"title":"言語のローカル化された名前","anchor":"localized-names-of-languages","children":[]}]},{"title":"ローカル化: テンプレート内","anchor":"internationalization-in-template-code","children":[{"title":"translate template tag","anchor":"translate-template-tag","children":[]},{"title":"blocktranslate template tag","anchor":"blocktranslate-template-tag","children":[]},{"title":"String literals passed to tags and filters","anchor":"string-literals-passed-to-tags-and-filters","children":[]},{"title":"Comments for translators in templates","anchor":"comments-for-translators-in-templates","children":[]},{"title":"Switching language in templates","anchor":"switching-language-in-templates","children":[]},{"title":"Other tags","anchor":"other-tags","children":[{"title":"get_available_languages","anchor":"get-available-languages","children":[]},{"title":"get_current_language","anchor":"get-current-language","children":[]},{"title":"get_current_language_bidi","anchor":"get-current-language-bidi","children":[]},{"title":"i18n context processor","anchor":"i18n-context-processor","children":[]},{"title":"get_language_info","anchor":"get-language-info","children":[]},{"title":"get_language_info_list","anchor":"get-language-info-list","children":[]},{"title":"テンプレートフィルタ","anchor":"template-filters","children":[]}]}]},{"title":"国際化: JavaScript コード内","anchor":"internationalization-in-javascript-code","children":[{"title":"JavaScriptCatalog ビュー","anchor":"module-django.views.i18n","children":[]},{"title":"JavaScript 翻訳カタログを使う","anchor":"using-the-javascript-translation-catalog","children":[{"title":"gettext","anchor":"gettext","children":[]},{"title":"ngettext","anchor":"ngettext","children":[]},{"title":"interpolate","anchor":"interpolate","children":[]},{"title":"get_format","anchor":"get-format","children":[]},{"title":"gettext_noop","anchor":"gettext-noop","children":[]},{"title":"pgettext","anchor":"pgettext","children":[]},{"title":"npgettext","anchor":"npgettext","children":[]},{"title":"pluralidx","anchor":"pluralidx","children":[]}]},{"title":"JSONCatalog ビュー","anchor":"the-jsoncatalog-view","children":[]},{"title":"実行速度についての覚え書き","anchor":"note-on-performance","children":[]}]},{"title":"国際化: URL パターン内","anchor":"module-django.conf.urls.i18n","children":[{"title":"URL パターンにおける言語プレフィックス","anchor":"language-prefix-in-url-patterns","children":[]},{"title":"URL パターンを翻訳する","anchor":"translating-url-patterns","children":[]},{"title":"テンプレート内でリバースする","anchor":"reversing-in-templates","children":[]}]},{"title":"ローカル化: 言語ファイルを作成する方法","anchor":"localization-how-to-create-language-files","children":[{"title":"メッセージファイル","anchor":"message-files","children":[]},{"title":"メッセージファイルをコンパイルする","anchor":"compiling-message-files","children":[]},{"title":"Troubleshooting: gettext() incorrectly detects python-format in strings with percent signs","anchor":"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs","children":[]},{"title":"JavaScript ソースコードからメッセージファイルを作成する","anchor":"creating-message-files-from-javascript-source-code","children":[]},{"title":"Windows での gettext","anchor":"gettext-on-windows","children":[]},{"title":"makemessages コマンドをカスタマイズする","anchor":"customizing-the-makemessages-command","children":[]}]},{"title":"その他","anchor":"miscellaneous","children":[{"title":"The set_language redirect view","anchor":"the-set-language-redirect-view","children":[]},{"title":"明示的にアクティブな言語をセットする","anchor":"explicitly-setting-the-active-language","children":[]},{"title":"ビューやテンプレートの外で翻訳を使う","anchor":"using-translations-outside-views-and-templates","children":[]},{"title":"Language cookie","anchor":"language-cookie","children":[]}]},{"title":"Implementation notes","anchor":"implementation-notes","children":[{"title":"Specialties of Django translation","anchor":"specialties-of-django-translation","children":[]},{"title":"How Django discovers language preference","anchor":"how-django-discovers-language-preference","children":[]},{"title":"How Django discovers translations","anchor":"how-django-discovers-translations","children":[]},{"title":"Using a non-English base language","anchor":"using-a-non-english-base-language","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/4.2/topics/"},{"docname":"topics/i18n/index","title":"国際化とローカル化","url":"/ja/4.2/topics/i18n/"}],"prev":{"docname":"topics/i18n/index","title":"国際化とローカル化","url":"/ja/4.2/topics/i18n/"},"next":{"docname":"topics/i18n/formatting","title":"表示形式のローカル化","url":"/ja/4.2/topics/i18n/formatting/"},"formats":{"html":"/ja/4.2/topics/i18n/translation/","markdown":"/ja/4.2/topics/i18n/translation.md","json":"/ja/4.2/topics/i18n/translation.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/topics/i18n/translation.txt","official":"https://docs.djangoproject.com/ja/4.2/topics/i18n/translation/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}