{"title":"翻訳","version":"5.1","locale":"ja","docname":"topics/i18n/translation","url":"/ja/5.1/topics/i18n/translation/","canonical":"https://djangodocs.dev/ja/5.1/topics/i18n/translation/","summary":"概要 Link to this heading # Django プロジェクトを翻訳可能にするためには、Python コードやテンプレートに、多少のフックを加筆しなければなりません。このフックは 翻訳文字列 と呼ばれます。翻訳文字列は Django…","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/5.1/topics/i18n/#term-translation-string\"><span class=\"xref std std-term\">翻訳文字列</span></a> と呼ばれます。翻訳文字列は Django に「このテキストに対する翻訳が有効な場合、このテキストはエンドユーザの言語に翻訳すべきだ」ということを通知します。翻訳可能な文字列をマークすることは開発者の責任です。システムが翻訳できるのは指定された文字列だけなのです。</p>\n<p>Django は、翻訳文字列を <a class=\"reference internal\" href=\"/ja/5.1/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/5.1/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_I18N</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></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/5.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> が <a class=\"reference internal\" href=\"/ja/5.1/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.middleware.locale.LocaleMiddleware</span></code></a> を含むかどうかチェックすることです) 。まだの場合は、<a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">Django はどうやって言語の優先順位を検出するのか？</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/5.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> で指定します。入力の手間を省くため、この関数は短い別名 <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code> としてインポートするのが慣例です。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>Python の標準ライブラリ <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> モジュールは、グローバルの名前空間に <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> という名前で <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> をインストールします。 Django ではこの方法に従っていませんが、それは以下の理由からです:</p>\n<ol class=\"arabic simple\">\n<li><p>特定のファイルのデフォルトの翻訳メソッドとして <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a> を使うべき場合もあります。グローバル名前空間に <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> がないと、開発者はどれが最も適切な翻訳関数かを考えなければなりません。</p></li>\n<li><p>アンダースコア文字 (<code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>) は、 Python の対話シェルや doctest で書かれたテストの中では「直前の式の値」を表します。そのため、グローバル名前空間に <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> をインストールすると、干渉して問題を引き起こします。 <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> という名前で明示的に import すれば、この問題を回避できます。</p></li>\n</ol>\n</aside>\n<aside class=\"admonition-what-functions-may-be-aliased-as admonition\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code> として別名をつけられる関数は？</p>\n<p>(<a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> で使われる) <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> が動作する方法のせいで、単一の文字列引数を持つ関数のみが <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code> として import できます。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a></p></li>\n</ul>\n</aside>\n<p>この例では、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Welcome</span> <span class=\"pre\">to</span> <span class=\"pre\">my</span> <span class=\"pre\">site.&quot;</span></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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</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> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">gettext</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> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><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=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">words</span> <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    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot; &quot;</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">words</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</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=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">sentence</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Welcome to my site.&quot;</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"n\">sentence</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>(上の 2 つの例のように変数や計算済みの値を使う場合の注意点として、Django の翻訳文字列検出ユーティリティ <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> はこれらの文字列を検出できません。詳しくは後の <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> の節で説明します。)</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></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=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">d</span><span class=\"p\">):</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</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> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"s2\">&quot;day&quot;</span><span class=\"p\">:</span> <span class=\"n\">d</span><span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">output</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>このテクニックを使うと、言語ごとの翻訳でプレースホルダを並び替えられるようになります。例えば、英語の翻訳文 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Today</span> <span class=\"pre\">is</span> <span class=\"pre\">Nobember,</span> <span class=\"pre\">26.&quot;</span></code> に対して、スペイン語では <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Hoy</span> <span class=\"pre\">es</span> <span class=\"pre\">26</span> <span class=\"pre\">de</span> <span class=\"pre\">noviembre.&quot;</span></code> となるように、月と日のプレースホルダの位置を入れ替えることができます。</p>\n<p>この理由から、引数が複数ある場合には、固定引数を使った補完 (<code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">%d</span></code>) ではなく、名前付きの補完 (<code class=\"docutils literal notranslate\"><span class=\"pre\">%(day)s</span></code>) を使ってください。固定引数による補完を使った場合、プレースホルダを正しい順番で翻訳できない場合があります。</p>\n<p>文字列抽出は <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> コマンドで行われるため、Django がサポートするのは <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></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\"><span class=\"pre\">xgettext</span></code> でサポートされておらず、JavaScript テンプレート文字列は <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></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\"><span class=\"pre\">Translators</span></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=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Translators: This message appears on the home page only</span>\n    <span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">gettext</span><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\"><span class=\"pre\">.po</span></code> ファイル内に表示され、ほとんどの翻訳ツールで表示されます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>完全を期すために示すと、以下が結果として生成される対応する  <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></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\">テンプレートにおける翻訳者のためのコメント</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/5.1/ref/utils/#django.utils.translation.gettext_noop\" title=\"django.utils.translation.gettext_noop\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.gettext_noop()</span></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/5.1/ref/utils/#django.utils.translation.ngettext\" title=\"django.utils.translation.ngettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.ngettext()</span></code></a> を使ってください。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></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\"><span class=\"pre\">count</span></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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">hello_world</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">count</span><span class=\"p\">):</span>\n    <span class=\"n\">page</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><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        <span class=\"n\">count</span><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> <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"n\">page</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>この例では、オブジェクトの数値は <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> 変数として翻訳言語に渡されます。</p>\n<p>複数形は、複雑で言語によって異なる動作をすることに注意してください。<code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></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=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Report</span>\n\n<span class=\"n\">count</span> <span class=\"o\">=</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">()</span>\n<span class=\"k\">if</span> <span class=\"n\">count</span> <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span>\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name_plural</span>\n\n<span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><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    <span class=\"n\">count</span><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> <span class=\"n\">count</span><span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">name</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=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><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    <span class=\"n\">count</span><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> <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span><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\"><span class=\"pre\">ngettext()</span></code> を使うときは、リテラルで挿入される全ての変数に対して単一の名前を使うようにしてください。以下の例で、2 つの翻訳文字列でどのように <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></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><span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">ngettext</span><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    <span class=\"n\">count</span><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> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">count</span><span class=\"p\">(),</span>\n    <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;plural_name&quot;</span><span class=\"p\">:</span> <span class=\"n\">Report</span><span class=\"o\">.</span><span class=\"n\">_meta</span><span class=\"o\">.</span><span class=\"n\">verbose_name_plural</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></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\"><span class=\"pre\">&quot;May&quot;</span></code> は、月名と動詞を指します。翻訳者が異なる文脈でこれらの単語を正しく翻訳できるようにするには、<a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.pgettext()</span></code></a> 関数、もしくは文字列が複数形を必要とする場合は  <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.npgettext()</span></code></a> 関数を使うことができます。両方とも、第 1 変数として文脈文字列を取ります。</p>\n<p>結果の <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルで、文字列は同じ文字列に対する異なる文脈マーカーがあるのと同じ頻度で出現し (コンテキストは <code class=\"docutils literal notranslate\"><span class=\"pre\">msgctxt</span></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=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">pgettext</span>\n\n<span class=\"n\">month</span> <span class=\"o\">=</span> <span class=\"n\">pgettext</span><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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">pgettext_lazy</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span>\n        <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">pgettext_lazy</span><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\"><span class=\"pre\">.po</span></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\"><span class=\"pre\">translate</span></code></a> と <a class=\"reference internal\" href=\"#std-templatetag-blocktranslate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></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/5.1/ref/utils/#module-django.utils.translation\" title=\"django.utils.translation: Internationalization support.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.translation</span></code></a> (名前の <code class=\"docutils literal notranslate\"><span class=\"pre\">lazy</span></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\"><span class=\"pre\">verbose_name</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">_</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/5.1/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\"><span class=\"pre\">verbose_name</span></code></a> オプションを使えば、<a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ForeignKey</span></code></a>、<a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyField</span></code></a> や <a class=\"reference internal\" href=\"/ja/5.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OneToOneField</span></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=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">kind</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">ThingKind</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;kinds&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">verbose_name</span><span class=\"o\">=</span><span class=\"n\">_</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/5.1/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\"><span class=\"pre\">verbose_name</span></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/5.1/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\"><span class=\"pre\">verbose_name</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.1/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\"><span class=\"pre\">verbose_name_plural</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">),</span> <span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">_</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=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">verbose_name</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;my thing&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">verbose_name_plural</span> <span class=\"o\">=</span> <span class=\"n\">_</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>モデルメソッド <code class=\"docutils literal notranslate\"><span class=\"pre\">description</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">&#64;display</span></code> デコレーターに渡す。<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/5.1/ref/contrib/admin/#django.contrib.admin.display\" title=\"django.contrib.admin.display\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">display()</span></code></a> デコレータの <code class=\"docutils literal notranslate\"><span class=\"pre\">short_description</span></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=\"w\"> </span><span class=\"nn\">django.contrib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">kind</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span>\n        <span class=\"n\">ThingKind</span><span class=\"p\">,</span>\n        <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">,</span>\n        <span class=\"n\">related_name</span><span class=\"o\">=</span><span class=\"s2\">&quot;kinds&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">verbose_name</span><span class=\"o\">=</span><span class=\"n\">_</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><span class=\"n\">display</span><span class=\"p\">(</span><span class=\"n\">description</span><span class=\"o\">=</span><span class=\"n\">_</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=\"w\"> </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><span class=\"n\">kind</span><span class=\"o\">.</span><span class=\"n\">type</span> <span class=\"o\">==</span> <span class=\"n\">MOUSE_TYPE</span>\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\"><span class=\"pre\">gettext_lazy()</span></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\"><span class=\"pre\">str</span></code></a> オブジェクト) を使うときはいつでも使うことができますが、気まぐれな Python コードでうまく動作しないかもしれません。例えば、<a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/requests/\">requests</a> ライブラリが <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy</span></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=\"n\">body</span> <span class=\"o\">=</span> <span class=\"n\">gettext_lazy</span><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>\n<span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://example.com/send&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;body&quot;</span><span class=\"p\">:</span> <span class=\"n\">body</span><span class=\"p\">})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></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><span class=\"n\">requests</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s2\">&quot;https://example.com/send&quot;</span><span class=\"p\">,</span> <span class=\"n\">data</span><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><span class=\"n\">body</span><span class=\"p\">)})</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy</span></code> という長い名前を使いたくない場合は、次のように <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></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=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyThing</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">help_text</span><span class=\"o\">=</span><span class=\"n\">_</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>モデルやユーティリティ関数内で文字列に <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext_lazy()</span></code> を使用してマークすることはよく行われます。これらのオブジェクトをコードの他の場所で扱う際には、誤って文字列に変換しないよう注意する必要があります。なぜなら、これらの変換は可能な限り遅延されるべきだからです（正しいロケールが効果を発揮するため）。これには、次に説明するヘルパー関数の使用が必要です。</p>\n<section id=\"lazy-translations-and-plural\">\n<span id=\"lazy-plural-translations\"></span><h4>遅延翻訳と複数形<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>複数の文字列に対して遅延翻訳 (<code class=\"docutils literal notranslate\"><span class=\"pre\">n[p]gettext_lazy</span></code>) を使用する場合、一般的に文字列を定義する時点では <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> 引数を知りません。そのため、 <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> 引数に整数ではなくキー名を渡すことが許可されています。そうすると、文字列の補間時に <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></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=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.exceptions</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ValidationError</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext_lazy</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">error_message</span> <span class=\"o\">=</span> <span class=\"n\">ngettext_lazy</span><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=\"w\"> </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> <span class=\"n\">error</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">error_message</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s2\">&quot;num&quot;</span><span class=\"p\">:</span> <span class=\"n\">number</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>文字列の中に名前のないプレースホルダが1つだけ含まれている場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></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\">class</span><span class=\"w\"> </span><span class=\"nc\">MyForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">error_message</span> <span class=\"o\">=</span> <span class=\"n\">ngettext_lazy</span><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=\"w\"> </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> <span class=\"n\">error</span><span class=\"p\">:</span>\n            <span class=\"k\">raise</span> <span class=\"n\">ValidationError</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">error_message</span> <span class=\"o\">%</span> <span class=\"n\">number</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"formatting-strings-format-lazy\">\n<h4>文字列のフォーマット: <code class=\"docutils literal notranslate\"><span class=\"pre\">format_lazy()</span></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 の <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\"><span class=\"pre\">str.format()</span></code></a> メソッドは <code class=\"docutils literal notranslate\"><span class=\"pre\">format_string</span></code> や <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\"><span class=\"pre\">str.format()</span></code></a> の引数に遅延 (lazy) 翻訳オブジェクトが含まれている場合には動作しません。その代わりに <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.text.format_lazy\" title=\"django.utils.text.format_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.text.format_lazy()</span></code></a> を使うことができます。これは結果が文字列に含まれるときだけ <code class=\"docutils literal notranslate\"><span class=\"pre\">str.format()</span></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=\"w\"> </span><span class=\"nn\">django.utils.text</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">format_lazy</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span>\n\n<span class=\"o\">...</span>\n<span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">gettext_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;John Lennon&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">instrument</span> <span class=\"o\">=</span> <span class=\"n\">gettext_lazy</span><span class=\"p\">(</span><span class=\"s2\">&quot;guitar&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">format_lazy</span><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> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">name</span><span class=\"p\">,</span> <span class=\"n\">instrument</span><span class=\"o\">=</span><span class=\"n\">instrument</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>この場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> 内の遅延翻訳は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> 自体が文字列で使用されるとき（通常はテンプレートのレンダリング時）にだけ文字列に変換されます。</p>\n</section>\n<section id=\"other-uses-of-lazy-in-delayed-translations\">\n<h4>その他の遅延翻訳の使い方<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>翻訳を遅らせたいが、翻訳可能な文字列を別の関数の引数として渡さなければならない場合、この関数を遅延 (Lazy) 呼び出しでラップできます。たとえば次のようにします:</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=\"w\"> </span><span class=\"nn\">django.utils.functional</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">lazy</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">to_lower</span><span class=\"p\">(</span><span class=\"n\">string</span><span class=\"p\">):</span>\n    <span class=\"k\">return</span> <span class=\"n\">string</span><span class=\"o\">.</span><span class=\"n\">lower</span><span class=\"p\">()</span>\n\n\n<span class=\"n\">to_lower_lazy</span> <span class=\"o\">=</span> <span class=\"n\">lazy</span><span class=\"p\">(</span><span class=\"n\">to_lower</span><span class=\"p\">,</span> <span class=\"nb\">str</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=\"n\">lazy_string</span> <span class=\"o\">=</span> <span class=\"n\">to_lower_lazy</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;My STRING!&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\"><span class=\"pre\">get_language_info</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">lang_code</span></span></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><code class=\"docutils literal notranslate\"><span class=\"pre\">get_language_info()</span></code> 関数は、言語について詳細な情報を提供します:</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=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">activate</span><span class=\"p\">,</span> <span class=\"n\">get_language_info</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;fr&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">li</span> <span class=\"o\">=</span> <span class=\"n\">get_language_info</span><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><span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;name_local&quot;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s2\">&quot;name_translated&quot;</span><span class=\"p\">],</span> <span class=\"n\">li</span><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\"><span class=\"pre\">name</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">name_local</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">name_translated</span></code> 属性は、言語の英語名、言語自体、カレントのアクティブ言語をそれぞれ含んでいます。<code class=\"docutils literal notranslate\"><span class=\"pre\">bidi</span></code> 属性は双方向性の言語に対してのみ True です。</p>\n<p>言語情報のソースは <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.locale</span></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/5.1/ref/templates/language/\"><span class=\"doc\">Django テンプレート</span></a> 内での翻訳は 2 つのテンプレートタグと Pthon コードとはやや異なるシンタックスを使います。テンプレートでこれらのタグを使えるようにするには、<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">i18n</span> <span class=\"pre\">%}</span></code> をテンプレートの先頭に対して設置してください。全てのテンプレートタグと同じように、すでに <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code> をロードしているテンプレートを extend している場合であっても、翻訳を使用する全てのテンプレートでロードする必要があります。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>翻訳された文字列はテンプレートでレンダリングされるときにエスケープされません。これにより、たとえば強調のために HTML を翻訳に含めることができますが、潜在的に危険な文字 (<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;</span></code> など) も変更されずにレンダリングされます。</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\"><span class=\"pre\">translate</span></code> テンプレートタグ<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><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">translate</span> <span class=\"pre\">%}</span></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=\"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><code class=\"docutils literal notranslate\"><span class=\"pre\">noop</span></code> オプションが存在する場合、変数はそのままですが翻訳の対象外となります。将来的に翻訳を必要とするコンテンツを &quot;もみ消している&quot; ときに役立ちます:</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>内部的には、インラインの翻訳は <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> 呼び出しを使っています。</p>\n<p>テンプレート var (上記の <code class=\"docutils literal notranslate\"><span class=\"pre\">myvar</span></code>) がタグに渡された場合、最初にランタイムで変数から文字列へと解決し、それからメッセージカタログ内でその文字列をルックアップします。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">translate</span> <span class=\"pre\">%}</span></code> 内の文字列でテンプレート変数を混ぜることはできません。翻訳が変数 (プレースホルダ) とともに文字列を必要とする場合は、代わりに <a class=\"reference internal\" href=\"#std-templatetag-blocktranslate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code></a> を使ってください。</p>\n<p>翻訳された文字列を表示させずに取り出したい場合は、以下の構文が使用できます:</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>実際には、テンプレート内の複数の場所で使用できる文字列を取得したり、他のテンプレートタグやフィルタリングするための引数として出力を使用したりする目的でこれを使うことになるでしょう:</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\"><span class=\"pre\">{%</span> <span class=\"pre\">translate</span> <span class=\"pre\">%}</span></code> は、<code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> キーワードを使う <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">文脈マーカー</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=\"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\"><span class=\"pre\">blocktranslate</span></code> テンプレートタグ<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><a class=\"reference internal\" href=\"#std-templatetag-translate\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">translate</span></code></a> タグとは対照的に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></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\">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>オブジェクトの <code class=\"docutils literal notranslate\"><span class=\"pre\">object</span></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\">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>単一の <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></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\">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>次のような、冗長な古い書式もまだサポートされています: <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">with</span> <span class=\"pre\">book|title</span> <span class=\"pre\">as</span> <span class=\"pre\">book_t</span> <span class=\"pre\">and</span> <span class=\"pre\">author|title</span> <span class=\"pre\">as</span> <span class=\"pre\">author_t</span> <span class=\"pre\">%}</span></code></p>\n</aside>\n<p>他のブロックタグ (例えば <a class=\"reference internal\" href=\"/ja/5.1/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code></a> や <a class=\"reference internal\" href=\"/ja/5.1/ref/templates/builtins/#std-templatetag-if\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">if</span> <span class=\"pre\">%}</span></code></a>) は <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> タグの中では使えません。</p>\n<p>ブロック引数の解決に失敗した場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> は <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.deactivate_all\" title=\"django.utils.translation.deactivate_all\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">deactivate_all()</span></code></a> 関数を用いて、現在アクティブな言語を一時的に非アクティブにすることで、デフォルトの言語にフォールバックします。</p>\n<p>このタグは複数形にも対応しています。使用するには:</p>\n<ul class=\"simple\">\n<li><p>カウンタの値を <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> という名前で指定し結び付けます。この値は正しい複数形の選択に使用されます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endblocktranslate</span> <span class=\"pre\">%}</span></code> のタグの中で単数形と複数形を <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">plural</span> <span class=\"pre\">%}</span></code> タグで区切って指定してください。</p></li>\n</ul>\n<p>例:</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>より複雑な例:</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>カウンターの値の追加に複数化機能とローカル変数への値のバインドの両方を使用する場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></code> 構文は内部的に <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code> 呼び出しに変換されることに注意してください。つまり、 <a class=\"reference internal\" href=\"#pluralization-var-notes\"><span class=\"std std-ref\">ngettext 変数に関する注意事項</span></a> と同じことに気を付ける必要があります。</p>\n<p>URLの逆引きは <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktranslate</span></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\">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>翻訳された文字列を表示させずに取り出したい場合は、以下の構文が使用できます:</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>実際には、テンプレート内の複数の場所で使用できる文字列を取得したり、他のテンプレートタグやフィルタリングするための引数として出力を使用したりする目的でこれを使うことになるでしょう:</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> は、<code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> キーワードを使う <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">文脈マーカー</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=\"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><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> タグのもう1つの機能は、<code class=\"docutils literal notranslate\"><span class=\"pre\">trimmed</span></code> オプションです。このオプションは、<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> タグのコンテンツの先頭と末尾から改行文字を削除し、行の先頭と末尾の空白を置き換え、すべての行を空白文字で区切って1行に結合します。これは、<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></code> タグのコンテンツをインデントしても、インデント文字が対応する <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルのエントリに含まれないようにするのに非常に便利で、翻訳作業が簡単になります。</p>\n<p>例えば、次の <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktranslate</span> <span class=\"pre\">%}</span></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\">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>の出力結果は <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイル内では <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;First</span> <span class=\"pre\">sentence.</span> <span class=\"pre\">Second</span> <span class=\"pre\">paragraph.&quot;</span></code> となります。対照に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">trimmed</span></code> オプションが指定されていない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;\\n</span> <span class=\"pre\">First</span> <span class=\"pre\">sentence.\\n</span> <span class=\"pre\">Second</span> <span class=\"pre\">paragraph.\\n&quot;</span></code> となります。</p>\n</section>\n<section id=\"string-literals-passed-to-tags-and-filters\">\n<h3>タグとフィルタに渡される文字列リテラル<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>タグやフィルタの引数として渡された文字列リテラルは、見慣れた <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></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\">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>この場合、タグもフィルタも翻訳された文字列を見るので、翻訳を意識する必要はありません。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>この例では、個々の文字列 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes&quot;</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;no&quot;</span></code> ではなく、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes,no&quot;</span></code> という文字列が翻訳基盤に渡されます。翻訳された文字列は、フィルタをパースするコードが引数をどう分割するかを知るために、カンマを含む必要があります。たとえば、ドイツ語の翻訳者は文字列 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes,no&quot;</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;ja,nein&quot;</span></code> (カンマはそのまま) と翻訳するでしょう。</p>\n</aside>\n</section>\n<section id=\"comments-for-translators-in-templates\">\n<span id=\"translator-comments-in-templates\"></span><h3>テンプレートにおける翻訳者のためのコメント<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><a class=\"reference internal\" href=\"#translator-comments\"><span class=\"std std-ref\">Pythonコード</span></a> の場合と同様に、これらの翻訳者向けのメモはコメントを使用して指定できます。<a class=\"reference internal\" href=\"/ja/5.1/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">comment</span></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\">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>または <a class=\"reference internal\" href=\"/ja/5.1/ref/templates/language/#template-comments\"><span class=\"std std-ref\">一行コメント構文</span></a> <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span></code> ... ... <code class=\"docutils literal notranslate\"><span class=\"pre\">#}</span></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=\"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>完全を期すために示すと、以下が結果として生成される対応する  <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></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: 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>テンプレートで言語を切り替える<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>テンプレートの中で言語を選択したい場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">language</span></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=\"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>&quot;Welcome to our page&quot; は、1つめのコードでは現在の言語を使って表示されますが、2つめのコードでは常に英語になります。</p>\n</section>\n<section id=\"other-tags\">\n<span id=\"i18n-template-tags\"></span><h3>その他のタグ<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>これらのタグには同時に <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">i18n</span> <span class=\"pre\">%}</span></code> が必要です。</p>\n<section id=\"get-available-languages\">\n<span id=\"std-templatetag-get_available_languages\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_available_languages</span></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\"><span class=\"pre\">{%</span> <span class=\"pre\">get_available_languages</span> <span class=\"pre\">as</span> <span class=\"pre\">LANGUAGES</span> <span class=\"pre\">%}</span></code> はタプルのリストを返します。最初の要素は言語コード <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language code</span></a> で、2番目の要素は言語名 (現在アクティブなロケールに翻訳されたもの) です。</p>\n</section>\n<section id=\"get-current-language\">\n<span id=\"std-templatetag-get_current_language\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_current_language</span></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\"><span class=\"pre\">{%</span> <span class=\"pre\">get_current_language</span> <span class=\"pre\">as</span> <span class=\"pre\">LANGUAGE_CODE</span> <span class=\"pre\">%}</span></code> は現在のユーザの優先言語を文字列として返します。たとえば <code class=\"docutils literal notranslate\"><span class=\"pre\">en-us</span></code> です。 <a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">Django はどうやって言語の優先順位を検出するのか？</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\"><span class=\"pre\">get_current_language_bidi</span></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\"><span class=\"pre\">{%</span> <span class=\"pre\">get_current_language_bidi</span> <span class=\"pre\">as</span> <span class=\"pre\">LANGUAGE_BIDI</span> <span class=\"pre\">%}</span></code> は現在のロケールの文章を書く方向を返します。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> なら、ヘブライ語やアラビア語などの右から左へ書く言語です。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> なら、英語、フランス語、ドイツ語などの左から右へ書く言語です。</p>\n</section>\n<section id=\"i18n-context-processor\">\n<span id=\"template-translation-vars\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code> コンテキストプロセッサ<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>もし <a class=\"reference internal\" href=\"/ja/5.1/ref/templates/api/#django.template.context_processors.i18n\" title=\"django.template.context_processors.i18n\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.template.context_processors.i18n</span></code></a> コンテキストプロセッサを有効にすると、各 <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code> は上で定義した <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_BIDI</span></code> にアクセスできるようになります。</p>\n</section>\n<section id=\"get-language-info\">\n<span id=\"std-templatetag-get_language_info\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_language_info</span></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>また、提供されているテンプレートタグとフィルタを使えば、利用可能な言語の情報を取得することもできます。一つの言語に関する情報を取得するには <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info</span> <span class=\"pre\">%}</span></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\">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>その後、下記のように情報にアクセスできます:</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\"><span class=\"pre\">get_language_info_list</span></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>また、<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> のテンプレートタグを使えば、言語のリスト(例えば <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> で指定されたアクティブな言語)の情報を取得できます。<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> を使って言語セレクタを表示する方法の例は <a class=\"reference internal\" href=\"#set-language-redirect-view\"><span class=\"std std-ref\">set_language リダイレクトビューのセクション</span></a> を参照してください。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> 形式のタプルのリストに加え、<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> は言語コードのリストをサポートしています。これをビューで実行すると:</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><span class=\"n\">context</span> <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> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s2\">&quot;mytemplate.html&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>を使用すると、テンプレート内でそれらの言語のリストをイテレートできます:</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>いくつかの便利なフィルタが使えます:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_name</span> <span class=\"pre\">}}</span></code> (&quot;German&quot;)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_name_local</span> <span class=\"pre\">}}</span></code> (&quot;Deutsch&quot;)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_bidi</span> <span class=\"pre\">}}</span></code> (False)</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">LANGUAGE_CODE|language_name_translated</span> <span class=\"pre\">}}</span></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\"><span class=\"pre\">gettext</span></code> 実行にアクセスできません。</p></li>\n<li><p>JavaScript コードは <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> ファイルにアクセスできません; サーバーによって配布される必要があります。</p></li>\n<li><p>JavaScript 用の翻訳カタログはできる限り小さくなければなりません。</p></li>\n</ul>\n<p>Django には、これらの問題に対する総合的な解決策が用意されています: 翻訳を JavaScript に渡し、<code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> などを JavaScript 内から呼び出せるようにする方法です。</p>\n<p>主な解決策は以下の <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> ビューです。これは、<code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> を擬似的に再現する関数と翻訳文字列の配列で JavaScript コードライブラリを生成します。</p>\n<section id=\"module-django.views.i18n\">\n<span id=\"the-javascriptcatalog-view\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">JavaScriptCatalog</span></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\"><span class=\"pre\">gettext</span></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\"><span class=\"pre\">domain</span></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\"><span class=\"pre\">'djangojs'</span></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\"><span class=\"pre\">packages</span></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/5.1/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">application</span> <span class=\"pre\">names</span></code></a> のリストです。これらのアプリケーションは <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> ディレクトリを含んでいる必要があります。これらのカタログに加えて  (常に含まれている) <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> 内で見つかった全てのカタログは、1 つのカタログに統合されます。デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> で、全ての <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></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=\"w\"> </span><span class=\"nn\">django.views.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">JavaScriptCatalog</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span> <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><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><span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/myapp/&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(</span><span class=\"n\">packages</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;your.app.label&quot;</span><span class=\"p\">]),</span>\n        <span class=\"n\">name</span><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\"><span class=\"pre\">i18n_patterns()</span></code></a>、<code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> を使っている場合、カタログが正しく生成されるように <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code> によるラップも必要となります。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></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=\"w\"> </span><span class=\"nn\">django.conf.urls.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">i18n_patterns</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"n\">i18n_patterns</span><span class=\"p\">(</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span> <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">(),</span> <span class=\"n\">name</span><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\"><span class=\"pre\">packages</span></code> 引数で後に現れるパッケージの方が、最初に現れるものよりも高くなります。これは、同じリテラルに対する翻訳が衝突する場合に重要です。</p>\n<p>サイト上で複数の <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></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>カタログを使うには、以下のように動的に生成されたスクリプトを参照してください:</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\"><span class=\"pre\">gettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_noop</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pgettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">npgettext</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">pluralidx</span></code></p></li>\n</ul>\n<section id=\"gettext\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></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\"><span class=\"pre\">gettext</span></code> 関数は、Python コード内の標準の <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></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=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">gettext</span><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\"><span class=\"pre\">ngettext</span></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><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code> 関数は単語やフレーズを複数形にするインターフェースを提供します:</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=\"w\"> </span><span class=\"nx\">objectCount</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"mf\">1</span><span class=\"w\"> </span><span class=\"c1\">// or 0, or 2, or 3, ...</span>\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;literal for the singular case&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;literal for the plural case&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><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\"><span class=\"pre\">interpolate</span></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\"><span class=\"pre\">interpolate</span></code> 関数は表示形式の文字列の動的な記入をサポートします。補完の構文は  Python を模しているので、<code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code> 関数は位置および名前付きの補完の両方をサポートします。</p>\n<ul>\n<li><p>位置による補完: <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> は、表示されるのと同じ順番で要素の値が一致する <code class=\"docutils literal notranslate\"><span class=\"pre\">fmt</span></code> プレースホルダ内で連続的に補完される JavaScript Array オブジェクトを含んでいます。例えば:</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=\"w\"> </span><span class=\"nx\">formats</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n<span class=\"w\">  </span><span class=\"s1\">&#39;There is %s object. Remaining: %s&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"s1\">&#39;There are %s objects. Remaining: %s&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"mf\">11</span>\n<span class=\"p\">);</span>\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">formats</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"mf\">11</span><span class=\"p\">,</span><span class=\"w\"> </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>名前付きの補完: このモードは <code class=\"docutils literal notranslate\"><span class=\"pre\">named</span></code> パラメータを <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> として渡すことで選択されます。<code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> は JavaScript オブジェクトや結合配列を含みます。例えば:</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=\"w\"> </span><span class=\"nx\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">  </span><span class=\"nx\">count</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"mf\">10</span><span class=\"p\">,</span>\n<span class=\"w\">  </span><span class=\"nx\">total</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"mf\">50</span>\n<span class=\"p\">};</span>\n\n<span class=\"kd\">const</span><span class=\"w\"> </span><span class=\"nx\">formats</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;Total: %(total)s, there is %(count)s object&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"s1\">&#39;there are %(count)s of a total of %(total)s objects&#39;</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><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=\"w\"> </span><span class=\"nx\">string</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">formats</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nx\">data</span><span class=\"p\">,</span><span class=\"w\"> </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\"><span class=\"pre\">ngettext</span></code> と組み合わせて適切な複数形を生成する場合など）に限定してください。</p>\n</section>\n<section id=\"get-format\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></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><code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></code> 関数は設定済みの i18n 表示形式設定にアクセスでき、与えられた設定名に対して表示形式文字列を取り出します:</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/5.1/ref/settings/#std-setting-DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATE_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATE_INPUT_FORMATS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATETIME_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-DATETIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATETIME_INPUT_FORMATS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-DECIMAL_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DECIMAL_SEPARATOR</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-FIRST_DAY_OF_WEEK\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FIRST_DAY_OF_WEEK</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-MONTH_DAY_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MONTH_DAY_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-NUMBER_GROUPING\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NUMBER_GROUPING</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-SHORT_DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SHORT_DATE_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-SHORT_DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">SHORT_DATETIME_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-THOUSAND_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">THOUSAND_SEPARATOR</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-TIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_FORMAT</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-TIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_INPUT_FORMATS</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-YEAR_MONTH_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">YEAR_MONTH_FORMAT</span></code></a></p></li>\n</ul>\n<p>これは、Python によってレンダリングされる値と一貫性を持った表示形式を保守するために役立ちます。</p>\n</section>\n<section id=\"gettext-noop\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_noop</span></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\"><span class=\"pre\">gettext</span></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=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">gettext_noop</span><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\"><span class=\"pre\">pgettext</span></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\"><span class=\"pre\">pgettext</span></code> 関数は Python の変数 (<a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">pgettext()</span></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=\"n\">document</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">pgettext</span><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\"><span class=\"pre\">npgettext</span></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><code class=\"docutils literal notranslate\"><span class=\"pre\">npgettext</span></code> 関数も Python 変数 (<a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">npgettext()</span></code></a>) のように動作し、<strong>複数形の</strong> 文脈的に翻訳される単語を提供します:</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=\"w\"> </span><span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span><span class=\"w\"> </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=\"w\"> </span><span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span><span class=\"w\"> </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\"><span class=\"pre\">pluralidx</span></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><code class=\"docutils literal notranslate\"><span class=\"pre\">pluralidx</span></code> 関数は <a class=\"reference internal\" href=\"/ja/5.1/ref/templates/builtins/#std-templatefilter-pluralize\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">pluralize</span></code></a> テンプレートフィルタと同じように動作し、与えられた <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> が単語の複数形を使うべきかどうかを決めます:</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\"><span class=\"pre\">1</span></code> に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">false</span></code> を返し、他の数に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> を返します。</p>\n<p>ただし、複数形は全ての言語でこのようにシンプルではありません。言語が複数形をサポートしていない場合、空の値が渡されます。</p>\n<p>加えて、複数形に関して複雑なルールが存在する場合、カタログビューは条件付きの表現をレンダリングします。これは、値を <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> (複数形) と <code class=\"docutils literal notranslate\"><span class=\"pre\">false</span></code> (複数形 <strong>ではない</strong> ) のどちらにするかを評価します。</p>\n</section>\n</section>\n<section id=\"the-jsoncatalog-view\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">JSONCatalog</span></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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">JSONCatalog</span></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\"><span class=\"pre\">JSONCatalog</span></code> を利用するのがいいでしょう。<a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></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\"><span class=\"pre\">JavaScriptCatalog</span></code></a> を参照してください。また、<code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">packages</span></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\"><span class=\"pre\">.mo</span></code> ファイルからカタログを生成します。出力は一定なので、少なくとも与えられたサイトのバージョンに対しては、キャッシュが有力な選択肢となります。</p>\n<p>サーバーサイドのキャッシシュは CPU の負担を軽減します。 <a class=\"reference internal\" href=\"/ja/5.1/topics/cache/#django.views.decorators.cache.cache_page\" title=\"django.views.decorators.cache.cache_page\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">cache_page()</span></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=\"w\"> </span><span class=\"nn\">django.views.decorators.cache</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">cache_page</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">JavaScriptCatalog</span>\n\n<span class=\"c1\"># The value returned by get_version() must change when translations change.</span>\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">cache_page</span><span class=\"p\">(</span><span class=\"mi\">86400</span><span class=\"p\">,</span> <span class=\"n\">key_prefix</span><span class=\"o\">=</span><span class=\"s2\">&quot;jsi18n-</span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">get_version</span><span class=\"p\">())(</span>\n            <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()</span>\n        <span class=\"p\">),</span>\n        <span class=\"n\">name</span><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>クライアントサイドのキャッシュは帯域を節約し、サイトの読み込みを速くします。ETags (<a class=\"reference internal\" href=\"/ja/5.1/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ConditionalGetMiddleware</span></code></a>) を使っている場合、すでに適用済みです。それ以外の場合は、<a class=\"reference internal\" href=\"/ja/5.1/topics/conditional-view-processing/#conditional-decorators\"><span class=\"std std-ref\">条件付きデコレータ</span></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=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">timezone</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">last_modified</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">JavaScriptCatalog</span>\n\n<span class=\"n\">last_modified_date</span> <span class=\"o\">=</span> <span class=\"n\">timezone</span><span class=\"o\">.</span><span class=\"n\">now</span><span class=\"p\">()</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span>\n        <span class=\"s2\">&quot;jsi18n/&quot;</span><span class=\"p\">,</span>\n        <span class=\"n\">last_modified</span><span class=\"p\">(</span><span class=\"k\">lambda</span> <span class=\"n\">req</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kw</span><span class=\"p\">:</span> <span class=\"n\">last_modified_date</span><span class=\"p\">)(</span>\n            <span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()</span>\n        <span class=\"p\">),</span>\n        <span class=\"n\">name</span><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=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-statici18n/\">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/5.1/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code></a> が、リクエストされた URL からアクティブにする言語を検出できるようにするため、URL パターンのルートに言語のプレフィックスを追加します。</p></li>\n<li><p>URL パターン自体を <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.gettext_lazy()</span></code></a> 関数を通じて翻訳可能にする。</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/5.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 設定内に <a class=\"reference internal\" href=\"/ja/5.1/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.middleware.locale.LocaleMiddleware</span></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\"><span class=\"pre\">i18n_patterns</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">urls</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">prefix_default_language</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></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\"><span class=\"pre\">i18n_patterns()</span></code></a> で定義された全ての URL パターンの先頭に追加します。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">prefix_default_language</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> にセットすると、デフォルト言語 (<a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></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=\"w\"> </span><span class=\"nn\">django.conf.urls.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">i18n_patterns</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">include</span><span class=\"p\">,</span> <span class=\"n\">path</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">about</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">about_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">news_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">sitemap.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sitemap</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">sitemap</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\n<span class=\"n\">news_patterns</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;category/&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">category</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">details</span><span class=\"p\">,</span> <span class=\"n\">name</span><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\n<span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"n\">i18n_patterns</span><span class=\"p\">(</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">,</span> <span class=\"n\">about_views</span><span class=\"o\">.</span><span class=\"n\">main</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;news/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"n\">news_patterns</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><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>これらの URL パターンを定義すると、Django は自動的に <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns</span></code> 関数で追加された URL パターンに言語プレフィックスを追加します。例:</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=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">activate</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><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><span class=\"n\">reverse</span><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><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:detail&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><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><code class=\"docutils literal notranslate\"><span class=\"pre\">prefix_default_language=False</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE='en'</span></code> を使うと、URL は以下のようになります:</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=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><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><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><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\"><span class=\"pre\">i18n_patterns()</span></code></a> はルートの URLconf のみで使うことができます。インクルードされた URLconf で使うと <a class=\"reference internal\" href=\"/ja/5.1/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></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 パターンは、<a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></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=\"w\"> </span><span class=\"nn\">django.conf.urls.i18n</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">i18n_patterns</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">include</span><span class=\"p\">,</span> <span class=\"n\">path</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">about</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">about_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">news</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">views</span> <span class=\"k\">as</span> <span class=\"n\">news_views</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">sitemaps.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">sitemap</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;sitemap.xml&quot;</span><span class=\"p\">,</span> <span class=\"n\">sitemap</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;sitemap-xml&quot;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\n<span class=\"n\">news_patterns</span> <span class=\"o\">=</span> <span class=\"p\">(</span>\n    <span class=\"p\">[</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">index</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;index&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;category/&lt;slug:slug&gt;/&quot;</span><span class=\"p\">),</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">category</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;category&quot;</span><span class=\"p\">),</span>\n        <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;slug:slug&gt;/&quot;</span><span class=\"p\">,</span> <span class=\"n\">news_views</span><span class=\"o\">.</span><span class=\"n\">details</span><span class=\"p\">,</span> <span class=\"n\">name</span><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\n<span class=\"n\">urlpatterns</span> <span class=\"o\">+=</span> <span class=\"n\">i18n_patterns</span><span class=\"p\">(</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;about/&quot;</span><span class=\"p\">),</span> <span class=\"n\">about_views</span><span class=\"o\">.</span><span class=\"n\">main</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;about&quot;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;news/&quot;</span><span class=\"p\">),</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"n\">news_patterns</span><span class=\"p\">,</span> <span class=\"n\">namespace</span><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>翻訳を作成した後に、<a class=\"reference internal\" href=\"/ja/5.1/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">reverse()</span></code></a> 関数はアクティブな言語で URL を返します。例えば:</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=\"w\"> </span><span class=\"nn\">django.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">reverse</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">activate</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;en&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:category&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><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><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s2\">&quot;nl&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s2\">&quot;news:category&quot;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><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>ほとんどの場合、（ <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\"><span class=\"pre\">i18n_patterns()</span></code></a> を使用して）翻訳されたURLは、言語コードが接頭辞として付けられたパターンのブロック内でのみ使用することが最も良い選択です。不用意に翻訳された URL が翻訳されていない URL パターンと衝突するのを避けるためです。</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\"><span class=\"pre\">language</span></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\"><span class=\"pre\">language</span></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/5.1/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message file</span></a> を作成することです。メッセージファイルはプレーンテキストファイルで、単一の言語を記述します。このファイルは、全ての翻訳可能な文字列とそれらがどのように与えられた言語で表示されるかを含みます。メッセージファイルは <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイル拡張子を持ちます。</p>\n<p>Djangoには <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> というツールが用意してあり、これらのファイルの作成と保全を自動化します。</p>\n<aside class=\"admonition-gettext-utilities admonition\">\n<p class=\"admonition-title\">Gettext ユーティリティ</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code> コマンド (と後述する <code class=\"docutils literal notranslate\"><span class=\"pre\">compilemessages</span></code>) は、GNU gettext ツールセットからのコマンドを使用します: <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">msgfmt</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">msgmerge</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">msguniq</span></code> です。</p>\n<p>サポートされている <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ユーティリティの最小バージョンは 0.15 です。</p>\n</aside>\n<p>メッセージファイルを作成または更新するには、以下のコマンドを実行してください:</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<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>de\n</code></pre></div>\n<p>...ここでの <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> は作成したいメッセージファイルに対するロケール名 <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> です。例えば、ブラジル系のポルトガル語に対する <code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code>、オーストリア系のドイツ語に対する <code class=\"docutils literal notranslate\"><span class=\"pre\">de_AT</span></code>、インドネシアに対する <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> などです。</p>\n<p>スクリプトは、2 つの場所のうち 1 つから実行する必要があります:</p>\n<ul class=\"simple\">\n<li><p>Django プロジェクトのルートディレクトリ (<code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></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\">Djangoはどうやって翻訳を見つけるのか？</span></a> を参照して <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> を正しく設定してください) を抽出します。ディレクトリ <code class=\"docutils literal notranslate\"><span class=\"pre\">locale/LANG/LC_MESSAGES</span></code> にメッセージファイルを作成 (もしくは更新) します。<code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> の例では、ファイルは <code class=\"docutils literal notranslate\"><span class=\"pre\">locale/de/LC_MESSAGES/django.po</span></code> となります。</p>\n<p>プロジェクトのルートディレクトリから <code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code> を実行したとき、抽出された文字列は自動的に適切なメッセージファイルへと分配されます。つまり、<code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> ディレクトリを含むアプリケーションのファイルから抽出された文字列は、そのディレクトリ下のメッセージファイルに格納されます。<code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> ディレクトリがないアプリケーションのファイルから抽出された文字列は、<a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> 内に最初にリストアップされたディレクトリ下にあるメッセージファイルか、もしくは <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> が空の場合はエラーを生成します。</p>\n<p>デフォルトでは <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> は <code class=\"docutils literal notranslate\"><span class=\"pre\">.html</span></code> 、 <code class=\"docutils literal notranslate\"><span class=\"pre\">.txt</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">py</span></code> のファイル拡張子を持つファイルを全て検査します。このデフォルトの動作をオーバーライドしたい場合は、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#cmdoption-makemessages-extension\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--extension</span></code></a> か <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span></code> オプションを使って検査するファイル拡張子を指定します:</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<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>de<span class=\"w\"> </span>-e<span class=\"w\"> </span>txt\n</code></pre></div>\n<p>複数の拡張子をカンマで区切るか、<code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">--extension</span></code> を複数回使用してください:</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<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-l<span class=\"w\"> </span>de<span class=\"w\"> </span>-e<span class=\"w\"> </span>html,txt<span class=\"w\"> </span>-e<span class=\"w\"> </span>xml\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=\"#creating-message-files-from-js-code\"><span class=\"std std-ref\">JavaScript のソースコードからメッセージファイルを作成する</span></a> とき、 <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span> <span class=\"pre\">js</span></code> <strong>ではなく</strong> 、特別な <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code> ドメインを使用する必要があります。</p>\n</aside>\n<aside class=\"admonition-using-jinja2-templates admonition\">\n<p class=\"admonition-title\">Jinja2 テンプレートを使う？</p>\n<p><a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> はJinja2テンプレートの構文を理解しません。Jinja2テンプレートを含むプロジェクトから文字列を抽出するには、代わりに <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/\">Babel</a> の <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/messages.html#message-extraction\">Message Extracting</a> を使ってください。</p>\n<p>以下は <code class=\"docutils literal notranslate\"><span class=\"pre\">babel.cfg</span></code> 設定ファイルの例です:</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=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">jinja2.ext.with_</span>\n</code></pre></div>\n<p>使用しているすべての拡張機能をリストアップしてください！そうしないと、Babel はこれらの拡張機能によって定義されたタグを認識せず、それらを含む Jinja2 テンプレートを完全に無視します。</p>\n<p>Babel は <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> と似たような機能を提供し、一般的に置き換えることができ、 <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> に依存しません。より詳しい情報は <a class=\"reference external\" href=\"https://babel.pocoo.org/en/latest/messages.html\">メッセージカタログの操作</a> に関するドキュメントを参照してください。</p>\n</aside>\n<aside class=\"admonition-no-gettext admonition\">\n<p class=\"admonition-title\">gettext がない？</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ユーティリティがインストールされていない場合、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> は空のファイルを作成します。そのような場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ユーティリティをインストールするか、英語のメッセージファイル (<code class=\"docutils literal notranslate\"><span class=\"pre\">locale/ja/LC_MESSAGES/django.po</span></code>) があれば、それをコピーして、空の翻訳ファイルから始めてください。</p>\n</aside>\n<aside class=\"admonition-working-on-windows admonition\">\n<p class=\"admonition-title\">Windows で動作する？</p>\n<p>あなたが Windows を使っていて、<a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></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>各 <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルは、翻訳保守者の連絡先情報などのわずかなメタデータを含みますが、大部分は <strong>メッセージ</strong> のリストです。これは、特定の言語に対する、翻訳文字列と実際の翻訳済みテキストのマッピングです。</p>\n<p>例えば以下のように、Django アプリケーションが <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Welcome</span> <span class=\"pre\">to</span> <span class=\"pre\">my</span> <span class=\"pre\">site.&quot;</span></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=\"n\">_</span><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/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> は <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></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\"><span class=\"pre\">msgid</span></code> は翻訳文字列で、ソース内に存在します。変更しないでください。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">msgstr</span></code> はあなたが言語に対応する翻訳を記述する場所です。これは空の状態から始まるので、変更するのはあなたの役割です。翻訳をクオートで囲むようにしてください。</p></li>\n<li><p>利便性のため、各メッセージは、<code class=\"docutils literal notranslate\"><span class=\"pre\">#</span></code> でプレフィックスされ <code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code> 行の直前に位置するコメント行の形式の中に、翻訳文字列がどこから拾い集められたかを示すファイル名と行数を含みます。</p></li>\n</ul>\n<p>長いメッセージは特殊なケースです。そこでは、<code class=\"docutils literal notranslate\"><span class=\"pre\">msgstr</span></code> (もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code>) 直後の最初の文字列は空の文字列です。それからコンテンツ自身が行ごとに 1 つの文字列として次の数行にわたって記述されます。これらの文字列は直接連結されます。文字列内で最後のスペースを忘れないでください; さもなくば、空白スペースなしで接合されることになります！</p>\n<aside class=\"admonition-mind-your-charset admonition\">\n<p class=\"admonition-title\">文字コードを気にしてください</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> ツールが内部的に動作する方法および非 ASCII ソースの文字列を Django のコアとあなたのアプリケーション内で許容するために、 <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルに対するエンコーディングとして UTF-8 ( <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルが生成される際のデフォルトです) を <strong>使わなければなりません</strong>。これは、全員が同じエンコーディングを使用することを意味し、Django が <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルを処理する際に重要となります。</p>\n</aside>\n<aside class=\"admonition-fuzzy-entries admonition\">\n<p class=\"admonition-title\">Fuzzy（あいまいな）エントリー</p>\n<p><a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> は翻訳が以前に翻訳された文字列から推測される場合などに、あいまい (fuzzy) としてマークされた翻訳エントリーを生成することがあります。デフォルトでは、あいまいなエントリは <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">compilemessages</span></code></a> によって処理されません。</p>\n</aside>\n<p>新しい翻訳文字列に対して全てのコードとテンプレートを再検査して <strong>全ての</strong> 言語に対する全てのメッセージファイルを更新するには、以下を実行してください:</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<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-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\"><span class=\"pre\">gettext</span></code> による使用のために、より効率的な形式にコンパイルする必要があります。<a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a> ユーティリティを利用してください。</p>\n<p>このツールは、全ての有効な <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルを通じて動作し、<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> ファイルを生成します。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> による使用のために最適化されたバイナリファイルです。<a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> を実行した同じディレクトリで、以下のように <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a> を実行してください:</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<span class=\"w\"> </span>compilemessages\n</code></pre></div>\n<p>これで終わりです。翻訳は使う準備ができました。</p>\n<aside class=\"admonition-working-on-windows admonition\">\n<p class=\"admonition-title\">Windows で動作する？</p>\n<p>あなたが Windows を使っていて、<a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></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\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイル: エンコーディングと BOM の使用</p>\n<p>Django は、UTF-8 でエンコードされ BOM (Byte Order Mark) を持たない <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> ファイルのみをサポートします。そのため、テキストエディタがデフォルトでこれらのマークをファイルの最初に追加した場合、再構成する必要があります。</p>\n</aside>\n</section>\n<section id=\"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\">\n<h3>トラブルシューティング: <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> がパーセント文字を伴う文字列内で <code class=\"docutils literal notranslate\"><span class=\"pre\">python-format</span></code> を誤って見つけてしまう<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>例えば、パーセント記号に続いて空白と <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\">文字列変換タイプ</span></a> がある文字列（例: <code class=\"docutils literal notranslate\"><span class=\"pre\">_(&quot;10%</span> <span class=\"pre\">interest&quot;)</span></code>）などに、<a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> は誤って <code class=\"docutils literal notranslate\"><span class=\"pre\">python-format</span></code> で文字列をフラグ付けすることがあります。</p>\n<p>誤ってフラグが立てられた文字列でメッセージファイルをコンパイルしようとすると、<code class=\"docutils literal notranslate\"><span class=\"pre\">number</span> <span class=\"pre\">of</span> <span class=\"pre\">format</span> <span class=\"pre\">specifications</span> <span class=\"pre\">in</span> <span class=\"pre\">'msgid'</span> <span class=\"pre\">and</span> <span class=\"pre\">'msgstr'</span> <span class=\"pre\">does</span> <span class=\"pre\">not</span> <span class=\"pre\">match</span></code> もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">'msgstr'</span> <span class=\"pre\">is</span> <span class=\"pre\">not</span> <span class=\"pre\">a</span> <span class=\"pre\">valid</span> <span class=\"pre\">Python</span> <span class=\"pre\">format</span> <span class=\"pre\">string,</span> <span class=\"pre\">unlike</span> <span class=\"pre\">'msgid'</span></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=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</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\"><span class=\"pre\">no-python-format</span></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>\n<span class=\"n\">output</span> <span class=\"o\">=</span> <span class=\"n\">_</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>他の Django メッセージファイルと同じ方法で (<a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> ツールを使って) 作成や更新を行います。唯一の違いは、<code class=\"docutils literal notranslate\"><span class=\"pre\">-d</span> <span class=\"pre\">djangojs</span></code> パラメータを提供することによって、gettext 用語がドメインであること (このケースでは <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code> ドメイン) を、以下のように明示的に指定する必要があることです:</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<span class=\"w\"> </span>makemessages<span class=\"w\"> </span>-d<span class=\"w\"> </span>djangojs<span class=\"w\"> </span>-l<span class=\"w\"> </span>de\n</code></pre></div>\n<p>これは、ドイツ語に対して JavaScript 用のメッセージファイルを作成または更新します。メッセージファイルの更新後、通常の Django ファイルと同様の方法で <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a> を実行してください。</p>\n</section>\n<section id=\"gettext-on-windows\">\n<span id=\"id3\"></span><h3>Windows での <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></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>これはメッセージ ID を抽出したり、メッセージファイル(<code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>)をコンパイルしたい人だけが必要です。翻訳作業そのものは既存のこの種類のファイルを編集することになりますが、独自のメッセージファイルを作成したい場合や、変更したメッセージファイルをテストしたりコンパイルしたりしたい場合は、 <a class=\"reference external\" href=\"https://mlocati.github.io/articles/gettext-iconv-windows.html\">コンパイル済みのバイナリインストーラ</a> をダウンロードしてください。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span> <span class=\"pre\">--version</span></code> コマンドが正しく動作する限り、他の場所で入手した <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> バイナリを使うこともできます。Windows のコマンドプロンプトでコマンド <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span> <span class=\"pre\">--version</span></code> を入力すると、ポップアップウィンドウに &quot;<code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext.exe</span></code> has generated errors and will be closed by Windows&quot; と表示される場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> パッケージを使って Django の翻訳ユーティリティを使おうとしないでください。</p>\n</section>\n<section id=\"customizing-the-makemessages-command\">\n<span id=\"customizing-makemessages\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></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\"><span class=\"pre\">xgettext</span></code> に追加のパラメータを渡したい場合、独自の <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> コマンドを作成して、その <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext_options</span></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=\"w\"> </span><span class=\"nn\">django.core.management.commands</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">makemessages</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"p\">):</span>\n    <span class=\"n\">xgettext_options</span> <span class=\"o\">=</span> <span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"o\">.</span><span class=\"n\">xgettext_options</span> <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/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></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=\"w\"> </span><span class=\"nn\">django.core.management.commands</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">makemessages</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Command</span><span class=\"p\">(</span><span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">add_arguments</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">parser</span><span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">add_arguments</span><span class=\"p\">(</span><span class=\"n\">parser</span><span class=\"p\">)</span>\n        <span class=\"n\">parser</span><span class=\"o\">.</span><span class=\"n\">add_argument</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;--extra-keyword&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">dest</span><span class=\"o\">=</span><span class=\"s2\">&quot;xgettext_keywords&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">action</span><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=\"w\"> </span><span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><span class=\"p\">):</span>\n        <span class=\"n\">xgettext_keywords</span> <span class=\"o\">=</span> <span class=\"n\">options</span><span class=\"o\">.</span><span class=\"n\">pop</span><span class=\"p\">(</span><span class=\"s2\">&quot;xgettext_keywords&quot;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">xgettext_keywords</span><span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">xgettext_options</span> <span class=\"o\">=</span> <span class=\"n\">makemessages</span><span class=\"o\">.</span><span class=\"n\">Command</span><span class=\"o\">.</span><span class=\"n\">xgettext_options</span><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> <span class=\"n\">kwd</span> <span class=\"k\">for</span> <span class=\"n\">kwd</span> <span class=\"ow\">in</span> <span class=\"n\">xgettext_keywords</span>\n            <span class=\"p\">]</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">handle</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">options</span><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><code class=\"docutils literal notranslate\"><span class=\"pre\">set_language</span></code> リダイレクトビュー<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\"><span class=\"pre\">set_language</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">request</span></span></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>利便性のために、 Django にはビュー <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\"><span class=\"pre\">django.views.i18n.set_language()</span></code></a> が付属しており、 ユーザの言語設定を行い、指定された URL にリダイレクトします。デフォルトでは前のページに戻ります。</p>\n<p>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><span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s2\">&quot;i18n/&quot;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s2\">&quot;django.conf.urls.i18n&quot;</span><span class=\"p\">)),</span>\n</code></pre></div>\n<p>(この例では <code class=\"docutils literal notranslate\"><span class=\"pre\">/i18n/setlang/</span></code> でビューを利用できるようにしていることに注意してください)。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>上記の URL を <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\"><span class=\"pre\">i18n_patterns()</span></code></a> 内に含めないようにしてください。正しく動作するためには、それ自身が言語に依存せず独立している必要があります。</p>\n</aside>\n<p>このビューは <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> メソッドで呼び出され、 <code class=\"docutils literal notranslate\"><span class=\"pre\">language</span></code> パラメータがリクエストに設定されることを想定しています。セッションサポートが有効な場合、ビューは言語選択をユーザのセッションに保存します。また、デフォルトでは <code class=\"docutils literal notranslate\"><span class=\"pre\">django_language</span></code> という名前のクッキーにも言語選択を保存します。(この名前は <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a> 設定で変更できます)。</p>\n<p>言語選択を設定した後、Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> データの <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> パラメータを探します。もしそれが見つかり、 Django が安全な URL (つまり、別のホストを指しておらず、安全なスキームを使っている) と判断した場合、その URL へのリダイレクトが実行されます。そうでない場合、 Django はリクエストの性質に応じて、 <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> ヘッダの URL にリダイレクトしたり、ヘッダが設定されていない場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">/</span></code> にリダイレクトしたりします:</p>\n<ul class=\"simple\">\n<li><p>リクエストが(<code class=\"docutils literal notranslate\"><span class=\"pre\">Accept</span></code> HTTPヘッダに基づいて)HTMLコンテンツを受け入れる場合、フォールバックは常に実行されます。</p></li>\n<li><p>リクエストがHTMLを受け付けない場合、 <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> パラメータが指定されている場合のみフォールバックが実行されます。そうでない場合はステータスコード 204 (No Content) が返されます。</p></li>\n</ul>\n<p>以下はHTMLテンプレートコードの例です:</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>この例では、 Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_to</span></code> コンテキスト変数で、ユーザがリダイレクトされるページの URL を調べます。</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>明示的に、現在のセッションに対して、アクティブな言語をセットしたくなるかもしれません。例えば、他のシステムを活用すれば、ユーザの言語設定を取得できます。<a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.activate()</span></code></a> はすでに紹介済みですね。これは現在のスレッドに対してのみ適用されます。セッション全体の言語をクッキーに恒久的に保持するには、レスポンスに <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></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=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n<span class=\"n\">user_language</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;fr&quot;</span>\n<span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">user_language</span><span class=\"p\">)</span>\n<span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">HttpResponse</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">set_cookie</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">LANGUAGE_COOKIE_NAME</span><span class=\"p\">,</span> <span class=\"n\">user_language</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>通常、両方を使う必要があるでしょう: <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.activate()</span></code></a> はこのスレッドに対して言語を変更します。そして、クッキーをセットするとこの設定が将来のリクエストに恒久的に反映されます。</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>Django はビューやテンプレートで使うための豊富な国際化ツールセットを提供していますが、Django 固有のコードに使い方を限定しているわけではありません。Django の翻訳システムを使えば、任意のテキストを Django がサポートしている任意の言語に翻訳できます (もちろん、適切な翻訳カタログが存在する場合に限ります)。翻訳カタログを読み込んで有効にし、テキストを好きな言語に翻訳することも可能ですが、元の言語に戻すことを忘れないでください。翻訳カタログの有効化はスレッド単位で行われ、そのような変更は同じスレッドで実行されているコードに影響するからです。</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=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">welcome_translated</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">):</span>\n    <span class=\"n\">cur_language</span> <span class=\"o\">=</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">get_language</span><span class=\"p\">()</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">)</span>\n        <span class=\"n\">text</span> <span class=\"o\">=</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">gettext</span><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        <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"n\">cur_language</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> <span class=\"n\">text</span>\n</code></pre></div>\n<p>この関数を <code class=\"docutils literal notranslate\"><span class=\"pre\">'de'</span></code> という値で呼び出すと、 <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> やミドルウェアで設定されている言語に関係なく、 <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Willkommen&quot;</span></code> が返されます。</p>\n<p>特に注目すべき関数は、現在のスレッドで使われている言語を返す <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.get_language\" title=\"django.utils.translation.get_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.get_language()</span></code></a> 、現在のスレッドの翻訳カタログを有効にする <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.activate()</span></code></a> 、与えられた言語が Django でサポートされているかどうかをチェックする <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.check_for_language\" title=\"django.utils.translation.check_for_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.check_for_language()</span></code></a> です。</p>\n<p>より簡潔なコードを書くために、コンテキストマネージャ <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.override\" title=\"django.utils.translation.override\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.utils.translation.override()</span></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=\"w\"> </span><span class=\"nn\">django.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">translation</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">welcome_translated</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">override</span><span class=\"p\">(</span><span class=\"n\">language</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">gettext</span><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>言語クッキー<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>言語クッキーのオプションを調整するには、多くの設定が使用できます:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_AGE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_DOMAIN</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_HTTPONLY\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_HTTPONLY</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_PATH</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_SAMESITE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_SAMESITE</span></code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_SECURE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_SECURE</span></code></a></p></li>\n</ul>\n</section>\n</section>\n<section id=\"implementation-notes\">\n<h2>実装時のためのノート<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>Djangoの翻訳の特徴<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 の翻訳システムは Python に付属している標準の <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> モジュールを使います。 <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> を知っていれば、Django が翻訳を行う方法について、以下のような特徴があることに気づくかもしれません:</p>\n<ul class=\"simple\">\n<li><p>文字列ドメインは <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code> です。この文字列ドメインは、共通のメッセージファイルライブラリ (通常は <code class=\"docutils literal notranslate\"><span class=\"pre\">/usr/share/locale/</span></code>) にデータを保存する異なるプログラムを区別するために使用されます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> ドメインは Python とテンプレートの翻訳文字列に使われ、グローバル翻訳カタログに読み込まれます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code> ドメインはできるだけ小さくなるように、 JavaScript の翻訳カタログにだけ使われます。</p></li>\n<li><p>Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> だけを使っているわけではありません。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">msgfmt</span></code> を Python でラップしたものです。これは主に利便性のためです。</p></li>\n</ul>\n</section>\n<section id=\"how-django-discovers-language-preference\">\n<span id=\"id5\"></span><h3>Django はどうやって言語の優先順位を検出するのか？<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>翻訳を準備したら、あるいは Django に付属している翻訳を使いたい場合は、アプリの設定で翻訳を有効にする必要があります。</p>\n<p>Djangoは、インストール全体、特定のユーザー、またはその両方に対して、使用する言語を決定する非常に柔軟なモデルを持っています。</p>\n<p>インストール全体の優先言語を設定するには、 <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> を設定してください。Django はこの言語をデフォルトの翻訳として使います。ロケールミドルウェアが採用するメソッド (下記参照) を使って、より適切な翻訳が見つからなかった場合の最終的な翻訳です。</p>\n<p>Django を母国語で動かしたいだけなら、 <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> を設定し、対応する <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">メッセージファイル</span></a> とそのコンパイルバージョン (<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>) が存在することを確認するだけです。</p>\n<p>各ユーザに好きな言語を指定させたい場合は、 <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> を使用する必要があります。ロケール ミドルウェア <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> はリクエストのデータに基づいて言語を選択できるようにします。これは各ユーザのためにコンテンツをカスタマイズします。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> を使うには、<code class=\"docutils literal notranslate\"><span class=\"pre\">django.middleware.locale.LocaleMiddleware'</span></code> を <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> 設定に追加します。ミドルウェアの順番は重要なので、以下のガイドラインに従ってください:</p>\n<ul class=\"simple\">\n<li><p>最初にインストールされるミドルウェアの1つであることを確認してください。</p></li>\n<li><p>なぜなら <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> はセッションデータを利用するからです。また、 <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code> はリクエストされたURLを解決するために有効な言語を必要とするので、 <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code> の前に来る必要があります。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">CacheMiddleware</span></code> を使用する場合は、その後ろに <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> を記述してください。</p></li>\n</ul>\n<p>たとえば、<a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></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=\"n\">MIDDLEWARE</span> <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>(ミドルウェアについては <a class=\"reference internal\" href=\"/ja/5.1/topics/http/middleware/\"><span class=\"doc\">ミドルウェアのドキュメント</span></a> を参照してください)。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> は以下のアルゴリズムに従ってユーザーの言語設定を決定しようとします:</p>\n<ul>\n<li><p>最初に、リクエストされたURLの言語プレフィックスを探します。 これはルートの URLconf で <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns</span></code> 関数を使用している場合にだけ実行されます。言語プレフィックスとURLパターンの国際化方法についての詳細は <a class=\"reference internal\" href=\"#url-internationalization\"><span class=\"std std-ref\">国際化: URL パターン内</span></a> を参照してください。</p></li>\n<li><p>それに失敗すれば、クッキーを探します。</p>\n<p>使用されるクッキーの名前は <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_COOKIE_NAME</span></code></a> 設定によって設定されます。(デフォルトの名前は <code class=\"docutils literal notranslate\"><span class=\"pre\">django_language</span></code> です)。</p>\n</li>\n<li><p>それに失敗した場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Language</span></code> HTTPヘッダを調べます。このヘッダはブラウザから送られ、サーバにどの言語を優先するのかを伝えます。Django は、翻訳可能な言語が見つかるまで、ヘッダの各言語を試します。</p></li>\n<li><p>それに失敗すると、グローバルな <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> 設定を使用します。</p></li>\n</ul>\n<p id=\"locale-middleware-notes\">メモ:</p>\n<ul>\n<li><p>これらの場所では、言語設定は標準の <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">言語コード</span></a> 文字列で指定します。たとえば、ブラジルポルトガル語は <code class=\"docutils literal notranslate\"><span class=\"pre\">pt-br</span></code> です。</p></li>\n<li><p>ベース言語が利用可能で、指定されたサブ言語が利用できない場合、 Django はベース言語を使います。たとえば、ユーザが <code class=\"docutils literal notranslate\"><span class=\"pre\">de-at</span></code> (オーストリアのドイツ語) を指定したが、 Django には <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> しかない場合、 Django は <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> を使います。</p></li>\n<li><p>選択できるのは <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> 設定にリストされている言語だけです。言語選択を提供されている言語のサブセットに制限したい場合(アプリケーションがすべての言語を提供していないため)、 <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></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=\"n\">LANGUAGES</span> <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=\"n\">_</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=\"n\">_</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>この例では、自動選択できる言語をドイツ語と英語（および <code class=\"docutils literal notranslate\"><span class=\"pre\">de-ch</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">en-us</span></code> のようなサブ言語）に制限しています。</p>\n</li>\n<li><p>前の箇所で説明したように、カスタムの <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> 設定を定義すれば、言語名を翻訳文字列としてマークできます。ただし、循環インポートを避けるために、 <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext()</span></code></a> の代わりに <a class=\"reference internal\" href=\"/ja/5.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code></a> を使ってください。</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=\"w\"> </span><span class=\"nn\">django.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">gettext_lazy</span> <span class=\"k\">as</span> <span class=\"n\">_</span>\n\n<span class=\"n\">LANGUAGES</span> <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=\"n\">_</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=\"n\">_</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><code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> がユーザの設定を決定すると、その設定を <a class=\"reference internal\" href=\"/ja/5.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">HttpRequest</span></code></a> の <code class=\"docutils literal notranslate\"><span class=\"pre\">request.LANGUAGE_CODE</span></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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponse</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">hello_world</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">count</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">LANGUAGE_CODE</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;de-at&quot;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> <span class=\"n\">HttpResponse</span><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> <span class=\"n\">HttpResponse</span><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>静的な(ミドルウェアを使わない)翻訳では、言語は <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.LANGUAGE_CODE</span></code> にあり、動的な(ミドルウェアを使った)翻訳では <code class=\"docutils literal notranslate\"><span class=\"pre\">request.LANGUAGE_CODE</span></code> にあることに注意してください。</p>\n</section>\n<section id=\"how-django-discovers-translations\">\n<span id=\"id6\"></span><h3>Djangoはどうやって翻訳を見つけるのか？<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>実行時に、 Django はリテラルと翻訳の統合カタログをメモリ内に構築します。これを実現するために、コンパイルされた <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">メッセージファイル</span></a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>) を読み込むために異なるファイルパスを調べる順序と、同じリテラルに対して複数の翻訳がある場合の優先順位について、以下のアルゴリズムに従って翻訳を探します:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> に列挙されているディレクトリが最も優先され、最初に記述されているものが後に記述されているものよりも優先されます。</p></li>\n<li><p>次に、 <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> に列挙されている各インストール済みアプリの <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> ディレクトリを探し、存在すればそれを使用します。 このとき、最初に指定されたものが後に指定されたものよりも優先されます。</p></li>\n<li><p>最後に、 <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.1.x/django/conf/locale\">django/conf/locale</a> にある Django が提供する基本翻訳がフォールバックとして使われます。</p></li>\n</ol>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">参考</p>\n<p>JavaScriptアセットに含まれるリテラルの翻訳は同じようなアルゴリズムで検索されますが、同じではありません。詳細は <a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code></a> を参照してください。</p>\n<p>また、 <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-FORMAT_MODULE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FORMAT_MODULE_PATH</span></code></a> を設定すれば、 <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/formatting/#custom-format-files\"><span class=\"std std-ref\">カスタムフォーマットファイル</span></a> を <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> ディレクトリに置くこともできます。</p>\n</aside>\n<p>すべての場合において、翻訳を含むディレクトリの名前は <a class=\"reference internal\" href=\"/ja/5.1/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> 表記で指定します。例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">es_AR</span></code> などです。地域言語バリアントの未翻訳の文字列は一般言語の翻訳を使用します。たとえば、未翻訳の <code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code> 文字列は <code class=\"docutils literal notranslate\"><span class=\"pre\">pt</span></code> の翻訳を使用します。</p>\n<p>こうすることで、独自の翻訳を含むアプリケーションを書くことができ、プロジェクトでベースとなる翻訳を上書きできます。あるいは、いくつかのアプリから大きなプロジェクトを作り、すべての翻訳を、作成中のプロジェクトに特化した1つの大きな共通メッセージファイルにまとめることもできます。選択肢はあなたの自由です。</p>\n<p>メッセージ・ファイルのリポジトリはすべて同じ構造になっています。それらは下記のようなものです:</p>\n<ul class=\"simple\">\n<li><p>設定ファイルの <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> にリストされているすべてのパスは、<code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;language&gt;/LC_MESSAGES/django.(po|mo)</span></code> で検索されます。</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">$APPPATH/locale/&lt;language&gt;/LC_MESSAGES/django.(po|mo)</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">$PYTHONPATH/django/conf/locale/&lt;language&gt;/LC_MESSAGES/django.(po|mo)</span></code></p></li>\n</ul>\n<p>メッセージファイルを作成するには <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span></code></a> ツールを使用します。また、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span></code></a> を使って、 <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> が使用するバイナリファイル <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> を作成します。</p>\n<p>また、 <a class=\"reference internal\" href=\"/ja/5.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span> <span class=\"pre\">--settings=path.to.settings</span></code></a> を実行すると、コンパイラが <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> 設定にあるすべてのディレクトリを処理するようになります。</p>\n</section>\n<section id=\"using-a-non-english-base-language\">\n<h3>英語以外の言語をベース言語として使う<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 は、翻訳可能なプロジェクト内の元の文字列は英語で書かれているという一般的な前提に立っています。他の言語を選ぶこともできますが、ある制限に注意する必要があります:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> はオリジナルのメッセージに対して2つの複数形しか提供しないので、もしベース言語の複数形のルールが英語と異なる場合は、すべての複数形を含むようにベース言語の翻訳も提供する必要があります。</p></li>\n<li><p>英語のバージョンが有効になっていて、英語の文字列がない場合、フォールバック言語はプロジェクトの <a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> ではなく、オリジナルの文字列になります。たとえば、<a class=\"reference internal\" href=\"/ja/5.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> がスペイン語に設定されていて、元の文字列がロシア語で書かれているサイトを訪れた英語のユーザは、スペイン語ではなくロシア語のテキストを見ることになります。</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":"モデルメソッド description を @display デコレーターに渡す。","anchor":"model-methods-description-argument-to-the-display-decorator","children":[]}]},{"title":"遅延 (Lazyな) 翻訳オブジェクトの使用方法","anchor":"working-with-lazy-translation-objects","children":[{"title":"遅延翻訳と複数形","anchor":"lazy-translations-and-plural","children":[]},{"title":"文字列のフォーマット: format_lazy()","anchor":"formatting-strings-format-lazy","children":[]},{"title":"その他の遅延翻訳の使い方","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 テンプレートタグ","anchor":"translate-template-tag","children":[]},{"title":"blocktranslate テンプレートタグ","anchor":"blocktranslate-template-tag","children":[]},{"title":"タグとフィルタに渡される文字列リテラル","anchor":"string-literals-passed-to-tags-and-filters","children":[]},{"title":"テンプレートにおける翻訳者のためのコメント","anchor":"comments-for-translators-in-templates","children":[]},{"title":"テンプレートで言語を切り替える","anchor":"switching-language-in-templates","children":[]},{"title":"その他のタグ","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 コンテキストプロセッサ","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":"トラブルシューティング: gettext() がパーセント文字を伴う文字列内で python-format を誤って見つけてしまう","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":"set_language リダイレクトビュー","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":"言語クッキー","anchor":"language-cookie","children":[]}]},{"title":"実装時のためのノート","anchor":"implementation-notes","children":[{"title":"Djangoの翻訳の特徴","anchor":"specialties-of-django-translation","children":[]},{"title":"Django はどうやって言語の優先順位を検出するのか？","anchor":"how-django-discovers-language-preference","children":[]},{"title":"Djangoはどうやって翻訳を見つけるのか？","anchor":"how-django-discovers-translations","children":[]},{"title":"英語以外の言語をベース言語として使う","anchor":"using-a-non-english-base-language","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.1/topics/"},{"docname":"topics/i18n/index","title":"国際化とローカライズ","url":"/ja/5.1/topics/i18n/"}],"prev":{"docname":"topics/i18n/index","title":"国際化とローカライズ","url":"/ja/5.1/topics/i18n/"},"next":{"docname":"topics/i18n/formatting","title":"表示形式のローカライズ","url":"/ja/5.1/topics/i18n/formatting/"},"formats":{"html":"/ja/5.1/topics/i18n/translation/","markdown":"/ja/5.1/topics/i18n/translation.md","json":"/ja/5.1/topics/i18n/translation.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/topics/i18n/translation.txt","official":"https://docs.djangoproject.com/ja/5.1/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"]}