{"title":"Terjemahan","version":"2.0","locale":"id","docname":"topics/i18n/translation","url":"/id/2.0/topics/i18n/translation/","canonical":"https://djangodocs.dev/id/2.0/topics/i18n/translation/","summary":"Ikhtisar Link to this heading # In order to make a Django project translatable, you have to add a minimal number of hooks to your Python code and templates. These…","html":"<span id=\"translation\"></span><h1>Terjemahan<a class=\"heading-anchor\" href=\"#module-django.utils.translation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"overview\">\n<h2>Ikhtisar<a class=\"heading-anchor\" href=\"#overview\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>In order to make a Django project translatable, you have to add a minimal\nnumber of hooks to your Python code and templates. These hooks are called\n<a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-translation-string\"><span class=\"xref std std-term\">translation strings</span></a>. They tell Django: &quot;This text\nshould be translated into the end user's language, if a translation for this\ntext is available in that language.&quot; It's your responsibility to mark\ntranslatable strings; the system can only translate strings it knows about.</p>\n<p>Django then provides utilities to extract the translation strings into a\n<a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message file</span></a>. This file is a convenient way for translators to provide\nthe equivalent of the translation strings in the target language. Once the\ntranslators have filled in the message file, it must be compiled. This process\nrelies on the GNU gettext toolset.</p>\n<p>Once this is done, Django takes care of translating Web apps on the fly in each\navailable language, according to users' language preferences.</p>\n<p>Django's internationalization hooks are on by default, and that means there's a\nbit of i18n-related overhead in certain places of the framework. If you don't\nuse internationalization, you should take the two seconds to set\n<a class=\"reference internal\" href=\"/id/2.0/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> in your settings file. Then Django will\nmake some optimizations so as not to load the internationalization machinery.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>There is also an independent but related <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-USE_L10N\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_L10N</span></code></a> setting that\ncontrols if Django should implement format localization. See\n<a class=\"reference internal\" href=\"/id/2.0/topics/i18n/formatting/\"><span class=\"doc\">Format localization</span></a> for more details.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Make sure you've activated translation for your project (the fastest way is\nto check if <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> includes\n<a class=\"reference internal\" href=\"/id/2.0/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>). If you haven't yet,\nsee <a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">Bagaimana Django menemukan pilihan bahasa</span></a>.</p>\n</aside>\n</section>\n<section id=\"internationalization-in-python-code\">\n<h2>Internationalization: in Python code<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>Terjemahan standar<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>Specify a translation string by using the function\n<a class=\"reference internal\" href=\"/id/2.0/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>. It's convention to import this\nas a shorter alias, <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>, to save typing.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">u</span></code> prefixing of <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> functions was originally to distinguish\nusage between unicode strings and bytestrings on Python 2. For code that\nsupports only Python 3, they can be used interchangeably. A deprecation for\nthe prefixed functions may happen in a future Django release.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Python's standard library <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> module installs <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> into the\nglobal namespace, as an alias for <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code>. In Django, we have chosen\nnot to follow this practice, for a couple of reasons:</p>\n<ol class=\"arabic simple\">\n<li><p>Sometimes, you should use <a class=\"reference internal\" href=\"/id/2.0/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>\nas the default translation method for a particular file. Without <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code>\nin the global namespace, the developer has to think about which is the\nmost appropriate translation function.</p></li>\n<li><p>The underscore character (<code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>) is used to represent &quot;the previous\nresult&quot; in Python's interactive shell and doctest tests. Installing a\nglobal <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> function causes interference. Explicitly importing\n<code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> as <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> avoids this problem.</p></li>\n</ol>\n</aside>\n<aside class=\"admonition-what-functions-may-be-aliased-as admonition\">\n<p class=\"admonition-title\">Fungsi-fungsi apa mungkin dinama lainkan sebagai <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>?</p>\n<p>Because of how <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> (used by <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a>) works, only\nfunctions that take a single string argument can be imported as <code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code>:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/2.0/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=\"/id/2.0/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>Di contoh ini, teks <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> ditandai sebagai deretan karakter terjemahan:</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<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>Obviously, you could code this without using the alias. This example is\nidentical to the previous one:</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<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>Translation works on computed values. This example is identical to the previous\ntwo:</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=\"s1\">&#39;Welcome&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;to&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;my&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;site.&#39;</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=\"s1\">&#39; &#39;</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>Terjemahan bekerja pada variabel. Kembali, ini adalah contoh yang mirip:</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=\"s1\">&#39;Welcome to my site.&#39;</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>(The caveat with using variables or computed values, as in the previous two\nexamples, is that Django's translation-string-detecting utility,\n<a class=\"reference internal\" href=\"/id/2.0/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>, won't be able to find\nthese strings. More on <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> later.)</p>\n<p>The strings you pass to <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> can take placeholders,\nspecified with Python's standard named-string interpolation syntax. Example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"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=\"s1\">&#39;Today is </span><span class=\"si\">%(month)s</span><span class=\"s1\"> </span><span class=\"si\">%(day)s</span><span class=\"s1\">.&#39;</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s1\">&#39;month&#39;</span><span class=\"p\">:</span> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"s1\">&#39;day&#39;</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>This technique lets language-specific translations reorder the placeholder\ntext. For example, an English translation may be <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Today</span> <span class=\"pre\">is</span> <span class=\"pre\">November</span> <span class=\"pre\">26.&quot;</span></code>,\nwhile a Spanish translation may be <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> -- with the\nmonth and the day placeholders swapped.</p>\n<p>For this reason, you should use named-string interpolation (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">%(day)s</span></code>)\ninstead of positional interpolation (e.g., <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">%d</span></code>) whenever you\nhave more than a single parameter. If you used positional interpolation,\ntranslations wouldn't be able to reorder placeholder text.</p>\n<p>Since string extraction is done by the <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> command, only syntaxes\nsupported by <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> are supported by Django. Python <a class=\"reference external\" href=\"https://docs.python.org/3/reference/lexical_analysis.html#f-strings\">f-strings</a> and\n<a class=\"reference external\" href=\"https://savannah.gnu.org/bugs/?50920\">JavaScript template strings</a> are not yet supported by <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>.</p>\n</section>\n<section id=\"comments-for-translators\">\n<span id=\"translator-comments\"></span><h3>Komentar untuk penterjemah<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>If you would like to give translators hints about a translatable string, you\ncan add a comment prefixed with the <code class=\"docutils literal notranslate\"><span class=\"pre\">Translators</span></code> keyword on the line\npreceding the string, e.g.:</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>The comment will then appear in the resulting <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> file associated with the\ntranslatable construct located below it and should also be displayed by most\ntranslation tools.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Hanya untuk kelengkapan, ini adalah fragmen sesuai dari menghasikan berkas <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>This also works in templates. See <a class=\"reference internal\" href=\"#translator-comments-in-templates\"><span class=\"std std-ref\">Komentar untuk penterjemah dalam cetakan</span></a> for\nmore details.</p>\n</section>\n<section id=\"marking-strings-as-no-op\">\n<h3>Marking strings as 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>Use the function <a class=\"reference internal\" href=\"/id/2.0/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> to mark a\nstring as a translation string without translating it. The string is later\ntranslated from a variable.</p>\n<p>Use this if you have constant strings that should be stored in the source\nlanguage because they are exchanged over systems or users -- such as strings\nin a database -- but should be translated at the last possible point in time,\nsuch as when the string is presented to the user.</p>\n</section>\n<section id=\"pluralization\">\n<h3>Pluralization<a class=\"heading-anchor\" href=\"#pluralization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Use the function <a class=\"reference internal\" href=\"/id/2.0/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> to specify\npluralized messages.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext()</span></code> takes three arguments: the singular translation string, the\nplural translation string and the number of objects.</p>\n<p>This function is useful when you need your Django application to be localizable\nto languages where the number and complexity of <a class=\"reference external\" href=\"https://www.gnu.org/software/gettext/manual/gettext.html#Plural-forms\">plural forms</a> is\ngreater than the two forms used in English ('object' for the singular and\n'objects' for all the cases where <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> is different from one, irrespective\nof its value.)</p>\n<p>Sebagai contoh:</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<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=\"s1\">&#39;there is </span><span class=\"si\">%(count)d</span><span class=\"s1\"> object&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;there are </span><span class=\"si\">%(count)d</span><span class=\"s1\"> objects&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span><span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;count&#39;</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>In this example the number of objects is passed to the translation\nlanguages as the <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> variable.</p>\n<p>Note that pluralization is complicated and works differently in each language.\nComparing <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> to 1 isn't always the correct rule. This code looks\nsophisticated, but will produce incorrect results for some languages:</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=\"s1\">&#39;There is </span><span class=\"si\">%(count)d</span><span class=\"s1\"> </span><span class=\"si\">%(name)s</span><span class=\"s1\"> available.&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;There are </span><span class=\"si\">%(count)d</span><span class=\"s1\"> </span><span class=\"si\">%(name)s</span><span class=\"s1\"> available.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;count&#39;</span><span class=\"p\">:</span> <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> <span class=\"n\">name</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Don't try to implement your own singular-or-plural logic, it won't be correct.\nIn a case like this, consider something like the following:</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=\"s1\">&#39;There is </span><span class=\"si\">%(count)d</span><span class=\"s1\"> </span><span class=\"si\">%(name)s</span><span class=\"s1\"> object available.&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;There are </span><span class=\"si\">%(count)d</span><span class=\"s1\"> </span><span class=\"si\">%(name)s</span><span class=\"s1\"> objects available.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;count&#39;</span><span class=\"p\">:</span> <span class=\"n\">count</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;name&#39;</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\">Catatan</p>\n<p>When using <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext()</span></code>, make sure you use a single name for every\nextrapolated variable included in the literal. In the examples above, note\nhow we used the <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> Python variable in both translation strings. This\nexample, besides being incorrect in some languages as noted above, would\nfail:</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=\"s1\">&#39;There is </span><span class=\"si\">%(count)d</span><span class=\"s1\"> </span><span class=\"si\">%(name)s</span><span class=\"s1\"> available.&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;There are </span><span class=\"si\">%(count)d</span><span class=\"s1\"> </span><span class=\"si\">%(plural_name)s</span><span class=\"s1\"> available.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">count</span>\n<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;count&#39;</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=\"s1\">&#39;name&#39;</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=\"s1\">&#39;plural_name&#39;</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>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Anda akan mendapatkan sebuah kesalahan ketika menjalankan <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span> <span class=\"pre\">1</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\">a</span> <span class=\"nb\">format</span> <span class=\"n\">specification</span> <span class=\"k\">for</span> <span class=\"n\">argument</span> <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"k\">as</span> <span class=\"ow\">in</span> <span class=\"s1\">&#39;msgstr[0]&#39;</span><span class=\"p\">,</span> <span class=\"n\">doesn</span><span class=\"s1\">&#39;t exist in &#39;</span><span class=\"n\">msgid</span><span class=\"s1\">&#39;</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Plural form and po files</p>\n<p>Django does not support custom plural equations in po files. As all\ntranslation catalogs are merged, only the plural form for the main Django po\nfile (in <code class=\"docutils literal notranslate\"><span class=\"pre\">django/conf/locale/&lt;lang_code&gt;/LC_MESSAGES/django.po</span></code>) is\nconsidered. Plural forms in all other po files are ignored. Therefore, you\nshould not use different plural equations in your project or application po\nfiles.</p>\n</aside>\n</section>\n<section id=\"contextual-markers\">\n<span id=\"id1\"></span><h3>Contextual markers<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>Sometimes words have several meanings, such as <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;May&quot;</span></code> in English, which\nrefers to a month name and to a verb. To enable translators to translate\nthese words correctly in different contexts, you can use the\n<a class=\"reference internal\" href=\"/id/2.0/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> function, or the\n<a class=\"reference internal\" href=\"/id/2.0/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> function if the string needs\npluralization. Both take a context string as the first variable.</p>\n<p>In the resulting <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> file, the string will then appear as often as there are\ndifferent contextual markers for the same string (the context will appear on the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">msgctxt</span></code> line), allowing the translator to give a different translation for\neach of them.</p>\n<p>Sebagai contoh:</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>atau:</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<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\">pgettext_lazy</span><span class=\"p\">(</span>\n        <span class=\"s1\">&#39;help text for MyThing model&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;This is the help text&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>akan muncul di berkas  <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> sebagai:</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>Contextual markers are also supported by the <a class=\"reference internal\" href=\"#std-templatetag-trans\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">trans</span></code></a> and\n<a class=\"reference internal\" href=\"#std-templatetag-blocktrans\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code></a> template tags.</p>\n</section>\n<section id=\"lazy-translation\">\n<span id=\"lazy-translations\"></span><h3>Terjemahan 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>Use the lazy versions of translation functions in\n<a class=\"reference internal\" href=\"#module-django.utils.translation\" title=\"django.utils.translation\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.utils.translation</span></code></a> (easily recognizable by the <code class=\"docutils literal notranslate\"><span class=\"pre\">lazy</span></code> suffix in\ntheir names) to translate strings lazily -- when the value is accessed rather\nthan when they're called.</p>\n<p>These functions store a lazy reference to the string -- not the actual\ntranslation. The translation itself will be done when the string is used in a\nstring context, such as in template rendering.</p>\n<p>This is essential when calls to these functions are located in code paths that\nare executed at module load time.</p>\n<p>This is something that can easily happen when defining models, forms and\nmodel forms, because Django implements these such that their fields are\nactually class-level attributes. For that reason, make sure to use lazy\ntranslations in the following cases:</p>\n<section id=\"model-fields-and-relationships-verbose-name-and-help-text-option-values\">\n<h4>Model fields and relationships <code class=\"docutils literal notranslate\"><span class=\"pre\">verbose_name</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">help_text</span></code> option values<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>For example, to translate the help text of the <em>name</em> field in the following\nmodel, do the following:</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<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=\"s1\">&#39;This is the help text&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>You can mark names of <a class=\"reference internal\" href=\"/id/2.0/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>,\n<a class=\"reference internal\" href=\"/id/2.0/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> or\n<a class=\"reference internal\" href=\"/id/2.0/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> relationship as translatable by using\ntheir <a class=\"reference internal\" href=\"/id/2.0/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> options:</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=\"s1\">&#39;kinds&#39;</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=\"s1\">&#39;kind&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n</code></pre></div>\n<p>Just like you would do in <a class=\"reference internal\" href=\"/id/2.0/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> you\nshould provide a lowercase verbose name text for the relation as Django will\nautomatically titlecase it when required.</p>\n</section>\n<section id=\"model-verbose-names-values\">\n<h4>Model verbose names values<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>It is recommended to always provide explicit\n<a class=\"reference internal\" href=\"/id/2.0/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> and\n<a class=\"reference internal\" href=\"/id/2.0/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> options rather than\nrelying on the fallback English-centric and somewhat naïve determination of\nverbose names Django performs by looking at the model's class name:</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<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=\"s1\">&#39;name&#39;</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=\"s1\">&#39;This is the help text&#39;</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=\"s1\">&#39;my thing&#39;</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=\"s1\">&#39;my things&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"model-methods-short-description-attribute-values\">\n<h4>Model methods <code class=\"docutils literal notranslate\"><span class=\"pre\">short_description</span></code> attribute values<a class=\"heading-anchor\" href=\"#model-methods-short-description-attribute-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>For model methods, you can provide translations to Django and the admin site\nwith the <code class=\"docutils literal notranslate\"><span class=\"pre\">short_description</span></code> attribute:</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<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=\"s1\">&#39;kinds&#39;</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=\"s1\">&#39;kind&#39;</span><span class=\"p\">),</span>\n    <span class=\"p\">)</span>\n\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    <span class=\"n\">is_mouse</span><span class=\"o\">.</span><span class=\"n\">short_description</span> <span class=\"o\">=</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;Is it a mouse?&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"working-with-lazy-translation-objects\">\n<h3>Working with lazy translation objects<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>The result of a <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> call can be used wherever you would use a\nstring (a <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str\" title=\"(di Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">str</span></code></a> object) in other Django code, but it may not work with\narbitrary Python code. For example, the following won't work because the\n<a class=\"reference external\" href=\"https://pypi.org/project/requests/\">requests</a> library doesn't handle\n<code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy</span></code> objects:</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=\"s1\">&#39;https://example.com/send&#39;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;body&#39;</span><span class=\"p\">:</span> <span class=\"n\">body</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>You can avoid such problems by casting <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> objects to text\nstrings before passing them to non-Django 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\">requests</span><span class=\"o\">.</span><span class=\"n\">post</span><span class=\"p\">(</span><span class=\"s1\">&#39;https://example.com/send&#39;</span><span class=\"p\">,</span> <span class=\"n\">data</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;body&#39;</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>If you don't like the long <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy</span></code> name, you can just alias it as\n<code class=\"docutils literal notranslate\"><span class=\"pre\">_</span></code> (underscore), like so:</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<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=\"s1\">&#39;This is the help text&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Using <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext_lazy()</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext_lazy()</span></code> to mark strings in models\nand utility functions is a common operation. When you're working with these\nobjects elsewhere in your code, you should ensure that you don't accidentally\nconvert them to strings, because they should be converted as late as possible\n(so that the correct locale is in effect). This necessitates the use of the\nhelper function described next.</p>\n<section id=\"lazy-translations-and-plural\">\n<span id=\"lazy-plural-translations\"></span><h4>Lazy translations and plural<a class=\"heading-anchor\" href=\"#lazy-translations-and-plural\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When using lazy translation for a plural string (<code class=\"docutils literal notranslate\"><span class=\"pre\">[u]n[p]gettext_lazy</span></code>), you\ngenerally don't know the <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> argument at the time of the string\ndefinition. Therefore, you are authorized to pass a key name instead of an\ninteger as the <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> argument. Then <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> will be looked up in the\ndictionary under that key during string interpolation. Here's example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"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.utils.translation</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ngettext_lazy</span>\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><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> <span class=\"s1\">&#39;num&#39;</span><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\">forms</span><span class=\"o\">.</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=\"s1\">&#39;num&#39;</span><span class=\"p\">:</span> <span class=\"n\">number</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>If the string contains exactly one unnamed placeholder, you can interpolate\ndirectly with the <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> argument:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"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\">forms</span><span class=\"o\">.</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>Membentuk string: <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's <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(di Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a> method will not work when either the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">format_string</span></code> or any of the arguments to <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(di Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">str.format()</span></code></a>\ncontains lazy translation objects. Instead, you can use\n<a class=\"reference internal\" href=\"/id/2.0/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>, which creates a lazy object\nthat runs the <code class=\"docutils literal notranslate\"><span class=\"pre\">str.format()</span></code> method only when the result is included\nin a string. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"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<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=\"s1\">&#39;John Lennon&#39;</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=\"s1\">&#39;guitar&#39;</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=\"s1\">&#39;</span><span class=\"si\">{name}</span><span class=\"s1\">: </span><span class=\"si\">{instrument}</span><span class=\"s1\">&#39;</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>In this case, the lazy translations in <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> will only be converted to\nstrings when <code class=\"docutils literal notranslate\"><span class=\"pre\">result</span></code> itself is used in a string (usually at template\nrendering time).</p>\n</section>\n<section id=\"other-uses-of-lazy-in-delayed-translations\">\n<h4>Other uses of lazy in delayed translations<a class=\"heading-anchor\" href=\"#other-uses-of-lazy-in-delayed-translations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>For any other case where you would like to delay the translation, but have to\npass the translatable string as argument to another function, you can wrap\nthis function inside a lazy call yourself. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"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.safestring</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">mark_safe</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=\"n\">mark_safe_lazy</span> <span class=\"o\">=</span> <span class=\"n\">lazy</span><span class=\"p\">(</span><span class=\"n\">mark_safe</span><span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Dan lalu kemudian:</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\">mark_safe_lazy</span><span class=\"p\">(</span><span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s2\">&quot;&lt;p&gt;My &lt;strong&gt;string!&lt;/strong&gt;&lt;/p&gt;&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"localized-names-of-languages\">\n<h3>Localized names of languages<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><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>Fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">get_language_info()</span></code> menyediakan informasi rinci tentang bahasa:</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=\"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=\"s1\">&#39;fr&#39;</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=\"s1\">&#39;de&#39;</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=\"s1\">&#39;name&#39;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s1\">&#39;name_local&#39;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s1\">&#39;name_translated&#39;</span><span class=\"p\">],</span> <span class=\"n\">li</span><span class=\"p\">[</span><span class=\"s1\">&#39;bidi&#39;</span><span class=\"p\">])</span>\n<span class=\"go\">German Deutsch Allemand False</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">name_local</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">name_translated</span></code> attributes of the\ndictionary contain the name of the language in English, in the language\nitself, and in your current active language respectively.  The <code class=\"docutils literal notranslate\"><span class=\"pre\">bidi</span></code>\nattribute is True only for bi-directional languages.</p>\n<p>The source of the language information is the <code class=\"docutils literal notranslate\"><span class=\"pre\">django.conf.locale</span></code> module.\nSimilar access to this information is available for template code. See below.</p>\n</section>\n</section>\n<section id=\"internationalization-in-template-code\">\n<span id=\"specifying-translation-strings-in-template-code\"></span><h2>Internationalization: in template code<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>Translations in <a class=\"reference internal\" href=\"/id/2.0/ref/templates/language/\"><span class=\"doc\">Django templates</span></a> uses two template\ntags and a slightly different syntax than in Python code. To give your template\naccess to these tags, put <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">load</span> <span class=\"pre\">i18n</span> <span class=\"pre\">%}</span></code> toward the top of your template.\nAs with all template tags, this tag needs to be loaded in all templates which\nuse translations, even those templates that extend from other templates which\nhave already loaded the <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n</span></code> tag.</p>\n<section id=\"trans-template-tag\">\n<span id=\"std-templatetag-trans\"></span><h3>Etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">trans</span></code><a class=\"heading-anchor\" href=\"#trans-template-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">trans</span> <span class=\"pre\">%}</span></code> template tag translates either a constant string\n(enclosed in single or double quotes) or variable content:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">trans</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\">trans</span> <span class=\"nv\">myvar</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>If the <code class=\"docutils literal notranslate\"><span class=\"pre\">noop</span></code> option is present, variable lookup still takes place but the\ntranslation is skipped. This is useful when &quot;stubbing out&quot; content that will\nrequire translation in the future:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">trans</span> <span class=\"s2\">&quot;myvar&quot;</span> <span class=\"nv\">noop</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>Internally, inline translations use an\n<a class=\"reference internal\" href=\"/id/2.0/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> call.</p>\n<p>In case a template var (<code class=\"docutils literal notranslate\"><span class=\"pre\">myvar</span></code> above) is passed to the tag, the tag will\nfirst resolve such variable to a string at run-time and then look up that\nstring in the message catalogs.</p>\n<p>It's not possible to mix a template variable inside a string within <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">trans</span>\n<span class=\"pre\">%}</span></code>. If your translations require strings with variables (placeholders), use\n<a class=\"reference internal\" href=\"#std-templatetag-blocktrans\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code></a> instead.</p>\n<p>If you'd like to retrieve a translated string without displaying it, you can\nuse the following syntax:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">trans</span> <span class=\"s2\">&quot;This is the title&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">the_title</span> <span class=\"cp\">%}</span>\n\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;description&quot;</span> <span class=\"na\">content</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>In practice you'll use this to get a string you can use in multiple places in a\ntemplate or so you can use the output as an argument for other template tags or\nfilters:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">trans</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\">trans</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\">trans</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\">blocktrans</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\">endblocktrans</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\">trans</span> <span class=\"pre\">%}</span></code> also supports <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">contextual markers</span></a>\nusing the <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> keyword:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">trans</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=\"blocktrans-template-tag\">\n<span id=\"std-templatetag-blocktrans\"></span><h3>Etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code><a class=\"heading-anchor\" href=\"#blocktrans-template-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Contrarily to the <a class=\"reference internal\" href=\"#std-templatetag-trans\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">trans</span></code></a> tag, the <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code> tag allows you to mark\ncomplex sentences consisting of literals and variable content for translation\nby making use of placeholders:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>To translate a template expression -- say, accessing object attributes or\nusing template filters -- you need to bind the expression to a local variable\nfor use within the translation block. Examples:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>You can use multiple expressions inside a single <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code> tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>The previous more verbose format is still supported:\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</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>Other block tags (for example <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">for</span> <span class=\"pre\">%}</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">if</span> <span class=\"pre\">%}</span></code>) are not allowed\ninside a <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code> tag.</p>\n<p>If resolving one of the block arguments fails, blocktrans will fall back to\nthe default language by deactivating the currently active language\ntemporarily with the <a class=\"reference internal\" href=\"/id/2.0/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>\nfunction.</p>\n<p>This tag also provides for pluralization. To use it:</p>\n<ul class=\"simple\">\n<li><p>Designate and bind a counter value with the name <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code>. This value will\nbe the one used to select the right plural form.</p></li>\n<li><p>Specify both the singular and plural forms separating them with the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">plural</span> <span class=\"pre\">%}</span></code> tag within the <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">endblocktrans</span> <span class=\"pre\">%}</span></code> tags.</p></li>\n</ul>\n<p>Sebuah contoh:</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\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>A more complex example:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>When you use both the pluralization feature and bind values to local variables\nin addition to the counter value, keep in mind that the <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code>\nconstruct is internally converted to an <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code> call. This means the\nsame <a class=\"reference internal\" href=\"#pluralization-var-notes\"><span class=\"std std-ref\">notes regarding ngettext variables</span></a>\napply.</p>\n<p>Reverse URL lookups cannot be carried out within the <code class=\"docutils literal notranslate\"><span class=\"pre\">blocktrans</span></code> and should\nbe retrieved (and stored) beforehand:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">url</span> <span class=\"s1\">&#39;path.to.view&#39;</span> <span class=\"nv\">arg</span> <span class=\"nv\">arg2</span> <span class=\"k\">as</span> <span class=\"nv\">the_url</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>If you'd like to retrieve a translated string without displaying it, you can\nuse the following syntax:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">meta</span> <span class=\"na\">name</span><span class=\"o\">=</span><span class=\"s\">&quot;description&quot;</span> <span class=\"na\">content</span><span class=\"o\">=</span><span class=\"s\">&quot;</span><span class=\"cp\">{{</span> <span class=\"nv\">the_title</span> <span class=\"cp\">}}</span><span class=\"s\">&quot;</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>In practice you'll use this to get a string you can use in multiple places in a\ntemplate or so you can use the output as an argument for other template tags or\nfilters.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code> also supports <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">contextual\nmarkers</span></a> using the <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> keyword:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">blocktrans</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\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Dukungan <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code> fitur lain adalah pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">trimmed</span></code>. Pilihan ini akan memindahkan karakter baris baru dari awal dan akhir dari isi dari etiket <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code>, ganti setiap ruang kosong pada awal dan akhir dari sebuah baris dan menggabungkan semua baris kedalam satu menggunakan karakter ruang kosong untuk memisahkan mereka. Ini sangat berguna untuk melekukkan isi dari etiket <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code> tanpa memiliki karakter lekukan terakhir di masukan yang sesuai di berkas PO, yang membuat pengolahan terjemahan lebih mudah.</p>\n<p>Untuk contoh, etiket <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">blocktrans</span> <span class=\"pre\">%}</span></code> berikut:</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\">blocktrans</span> <span class=\"nv\">trimmed</span> <span class=\"cp\">%}</span>\n  First sentence.\n  Second paragraph.\n<span class=\"cp\">{%</span> <span class=\"k\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>will result in the entry <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> in the PO file,\ncompared to <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;\\n</span>&#160; <span class=\"pre\">First</span> <span class=\"pre\">sentence.\\n</span>&#160; <span class=\"pre\">Second</span> <span class=\"pre\">sentence.\\n&quot;</span></code>, if the <code class=\"docutils literal notranslate\"><span class=\"pre\">trimmed</span></code>\noption had not been specified.</p>\n</section>\n<section id=\"string-literals-passed-to-tags-and-filters\">\n<h3>String literals passed to tags and filters<a class=\"heading-anchor\" href=\"#string-literals-passed-to-tags-and-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can translate string literals passed as arguments to tags and filters\nby using the familiar <code class=\"docutils literal notranslate\"><span class=\"pre\">_()</span></code> syntax:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">some_tag</span> <span class=\"kp\">_</span><span class=\"o\">(</span><span class=\"s2\">&quot;Page not found&quot;</span><span class=\"o\">)</span> <span class=\"nv\">value</span><span class=\"o\">|</span><span class=\"nf\">yesno</span><span class=\"o\">:</span><span class=\"kp\">_</span><span class=\"o\">(</span><span class=\"s2\">&quot;yes,no&quot;</span><span class=\"o\">)</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>In this case, both the tag and the filter will see the translated string,\nso they don't need to be aware of translations.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>In this example, the translation infrastructure will be passed the string\n<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes,no&quot;</span></code>, not the individual strings <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes&quot;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;no&quot;</span></code>. The\ntranslated string will need to contain the comma so that the filter\nparsing code knows how to split up the arguments. For example, a German\ntranslator might translate the string <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;yes,no&quot;</span></code> as <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;ja,nein&quot;</span></code>\n(keeping the comma intact).</p>\n</aside>\n</section>\n<section id=\"comments-for-translators-in-templates\">\n<span id=\"translator-comments-in-templates\"></span><h3>Komentar untuk penterjemah dalam cetakan<a class=\"heading-anchor\" href=\"#comments-for-translators-in-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Just like with <a class=\"reference internal\" href=\"#translator-comments\"><span class=\"std std-ref\">Python code</span></a>, these notes for\ntranslators can be specified using comments, either with the <a class=\"reference internal\" href=\"/id/2.0/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">comment</span></code></a>\ntag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">comment</span> <span class=\"cp\">%}</span><span class=\"c\">Translators: View verb</span><span class=\"cp\">{%</span> <span class=\"k\">endcomment</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">trans</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\">blocktrans</span> <span class=\"cp\">%}</span>A multiline translatable\nliteral.<span class=\"cp\">{%</span> <span class=\"k\">endblocktrans</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n</code></pre></div>\n<p>or with the <code class=\"docutils literal notranslate\"><span class=\"pre\">{#</span></code> ... <code class=\"docutils literal notranslate\"><span class=\"pre\">#}</span></code> <a class=\"reference internal\" href=\"/id/2.0/ref/templates/language/#template-comments\"><span class=\"std std-ref\">one-line comment constructs</span></a>:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"c\">{# Translators: Label of a button that triggers search #}</span>\n<span class=\"p\">&lt;</span><span class=\"nt\">button</span> <span class=\"na\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;submit&quot;</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">trans</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\">blocktrans</span> <span class=\"cp\">%}</span>Ambiguous translatable block of text<span class=\"cp\">{%</span> <span class=\"k\">endblocktrans</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Hanya untuk kelengkapan, ini semua adalah fragmen sesuai dari menghasikan berkas <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>Mengganti bahasa dalam cetakan<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>Jika anda ingin memilih sebuah bahasa dalam sebuah cetakan, anda dapat menggunakan etiket cetakan <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\">trans</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\">trans</span> <span class=\"s2\">&quot;Welcome to our page&quot;</span> <span class=\"cp\">%}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endlanguage</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>While the first occurrence of &quot;Welcome to our page&quot; uses the current language,\nthe second will always be in English.</p>\n</section>\n<section id=\"other-tags\">\n<span id=\"template-translation-vars\"></span><h3>Etiket lain<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>Etiket ini juga membutuhkan sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">memuat</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> returns a list of tuples in\nwhich the first element is the <a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language code</span></a> and the second is the\nlanguage name (translated into the currently active locale).</p>\n</section>\n<section id=\"get-current-language\">\n<span id=\"std-templatetag-get_current_language\"></span><h4><code class=\"docutils literal notranslate\"><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> returns the current user's\npreferred language as a string. Example: <code class=\"docutils literal notranslate\"><span class=\"pre\">en-us</span></code>. See\n<a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">Bagaimana Django menemukan pilihan bahasa</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> returns the current\nlocale's direction. If <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, it's a right-to-left language, e.g. Hebrew,\nArabic. If <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> it's a left-to-right language, e.g. English, French,\nGerman, etc.</p>\n<p>If you enable the <code class=\"docutils literal notranslate\"><span class=\"pre\">django.template.context_processors.i18n</span></code> context processor\nthen each <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestContext</span></code> will have access to <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_BIDI</span></code> as defined above.</p>\n</section>\n<section id=\"get-language-info\">\n<span id=\"std-templatetag-get_language_info\"></span><h4><code class=\"docutils literal notranslate\"><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>You can also retrieve information about any of the available languages using\nprovided template tags and filters. To get information about a single language,\nuse the <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info</span> <span class=\"pre\">%}</span></code> tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"s2\">&quot;pl&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>Anda dapat kemudian mengakses informasi:</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>You can also use the <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> template tag to retrieve\ninformation for a list of languages (e.g. active languages as specified in\n<a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a>). See <a class=\"reference internal\" href=\"#set-language-redirect-view\"><span class=\"std std-ref\">the section about the set_language redirect\nview</span></a> for an example of how to display a language\nselector using <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code>.</p>\n<p>Dalam tambahan pada daftar gaya <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> dari tuple, <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">get_language_info_list</span> <span class=\"pre\">%}</span></code> mendukung daftar sederhana dari kode bahasa. Jika anda melakukan ini dalam tampilan anda:</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=\"s1\">&#39;available_languages&#39;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;es&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;fr&#39;</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=\"s1\">&#39;mytemplate.html&#39;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>anda dapat mengulangi terhadap bahasa-bahasa tersebut dalam cetakan:</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>Filter templat<a class=\"heading-anchor\" href=\"#template-filters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>There are also simple filters available for convenience:</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;, ketika bahasa aktif adalah Ceko)</p></li>\n</ul>\n</section>\n</section>\n</section>\n<section id=\"internationalization-in-javascript-code\">\n<h2>Internasionalisasi: dalam kode 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>Menambahkan terjemahan ke JavaScript menimbulkan beberapa masalah:</p>\n<ul class=\"simple\">\n<li><p>Kode JavaScript  tidak mempunyai akses ke penerapan <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>.</p></li>\n<li><p>Kode JavaScript tidak mempunyai akses ke berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>; mereka butuh untuk dikirimkan oleh peladen.</p></li>\n<li><p>Katalog terjemahan untuk JavaScript harus disimpan sekecil mungkin.</p></li>\n</ul>\n<p>Django provides an integrated solution for these problems: It passes the\ntranslations into JavaScript, so you can call <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, etc., from within\nJavaScript.</p>\n<p>The main solution to these problems is the following <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> view,\nwhich generates a JavaScript code library with functions that mimic the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> interface, plus an array of translation strings.</p>\n<section id=\"module-django.views.i18n\">\n<span id=\"the-javascriptcatalog-view\"></span><h3>Tampilan <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>A view that produces a JavaScript code library with functions that mimic\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> interface, plus an array of translation strings.</p>\n<p><strong>Attributes</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>Translation domain containing strings to add in the view output.\nDefaults to <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 list of <a class=\"reference internal\" href=\"/id/2.0/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> among\ninstalled applications. Those apps should contain a <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code>\ndirectory. All those catalogs plus all catalogs found in\n<a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> (which are always included) are merged into one\ncatalog. Defaults to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, which means that all available\ntranslations from all <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> are provided in the\nJavaScript output.</p>\n</dd></dl>\n\n<p><strong>Example with default values</strong>:</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=\"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=\"s1\">&#39;jsi18n/&#39;</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=\"s1\">&#39;javascript-catalog&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><strong>Example with custom packages</strong>:</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\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;jsi18n/myapp/&#39;</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=\"s1\">&#39;your.app.label&#39;</span><span class=\"p\">]),</span>\n         <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;javascript-catalog&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>If your root URLconf uses <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>,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> must also be wrapped by <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</span></code> for the\ncatalog to be correctly generated.</p>\n<p><strong>Example with</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns()</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=\"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=\"s1\">&#39;jsi18n/&#39;</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=\"s1\">&#39;javascript-catalog&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</dd></dl>\n\n<p>The precedence of translations is such that the packages appearing later in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">packages</span></code> argument have higher precedence than the ones appearing at the\nbeginning. This is important in the case of clashing translations for the same\nliteral.</p>\n<p>If you use more than one <code class=\"docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code> view on a site and some of them\ndefine the same strings, the strings in the catalog that was loaded last take\nprecedence.</p>\n</section>\n<section id=\"using-the-javascript-translation-catalog\">\n<h3>Menggunakan katalog terjemahan 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>Untuk menggunakan katalog, cukup tarik di tulisan dibangkitkan dinamis seperti ini:</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\">type</span><span class=\"o\">=</span><span class=\"s\">&quot;text/javascript&quot;</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>This uses reverse URL lookup to find the URL of the JavaScript catalog view.\nWhen the catalog is loaded, your JavaScript code can use the following methods:</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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> function behaves similarly to the standard <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>\ninterface within your Python 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\">gettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;this is to be translated&#39;</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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code> function provides an interface to pluralize words and\nphrases:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">var</span><span class=\"w\"> </span><span class=\"nx\">object_count</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=\"nx\">s</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</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><span class=\"w\"> </span><span class=\"nx\">object_count</span><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>The <code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code> function supports dynamically populating a format string.\nThe interpolation syntax is borrowed from Python, so the <code class=\"docutils literal notranslate\"><span class=\"pre\">interpolate</span></code>\nfunction supports both positional and named interpolation:</p>\n<ul>\n<li><p>Penempatan penambahan: <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> mengandung obyek Senarai JavaScript yang unsur-unsurnya kemudian berurutan ditambahkan dalam palceholder <code class=\"docutils literal notranslate\"><span class=\"pre\">fmt</span></code> mereka yang sesuai dalam urutan sama mereka muncul. Sebagai contoh:</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=\"nx\">fmts</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</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><span class=\"w\"> </span><span class=\"mf\">11</span><span class=\"p\">);</span>\n<span class=\"nx\">s</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\">fmts</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\">// s is &#39;There are 11 objects. Remaining: 20&#39;</span>\n</code></pre></div>\n</li>\n<li><p>Named interpolation: This mode is selected by passing the optional\nboolean <code class=\"docutils literal notranslate\"><span class=\"pre\">named</span></code> parameter as <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">obj</span></code> contains a JavaScript\nobject or associative array. For example:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nx\">d</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=\"nx\">fmts</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">ngettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;Total: %(total)s, there is %(count)s object&#39;</span><span class=\"p\">,</span>\n<span class=\"s1\">&#39;there are %(count)s of a total of %(total)s objects&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nx\">d</span><span class=\"p\">.</span><span class=\"nx\">count</span><span class=\"p\">);</span>\n<span class=\"nx\">s</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\">fmts</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nx\">d</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>You shouldn't go over the top with string interpolation, though: this is still\nJavaScript, so the code has to make repeated regular-expression substitutions.\nThis isn't as fast as string interpolation in Python, so keep it to those\ncases where you really need it (for example, in conjunction with <code class=\"docutils literal notranslate\"><span class=\"pre\">ngettext</span></code>\nto produce proper pluralizations).</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>Fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">get_format</span></code> mempunyai akses ke pengaturan pembentukan i18n terkonfigurasi dan dapat mengambil bentuk string untuk nama pengaturan yang diberikan:</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>Itu mempunyai akses pada pengaturan berikut:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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>Ini berguna untuk merawat ketetapan pembentukan dengan nilai-nilai dibangun-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>Ini menandingin fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> tetapi tidak melakukan apapun, mengembalikan apapun dilewatkan ke itu:</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\">gettext_noop</span><span class=\"p\">(</span><span class=\"s1\">&#39;this will not be translated&#39;</span><span class=\"p\">));</span>\n</code></pre></div>\n<p>Ini adalah berguna untuk memberhentikan bagian-bagian dari kode akan butuh diterjemahkan di masa akan datang.</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>Fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">pgettext</span></code> berperilaku seperti ragam Python (<a class=\"reference internal\" href=\"/id/2.0/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>), menyediakan kata terjemahan kontekstual:</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\">pgettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;month name&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">&#39;May&#39;</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>Fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">npgettext</span></code> juga berperilaku seperti ragam Python (<a class=\"reference internal\" href=\"/id/2.0/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>), menyediakan <strong>menjamakkan</strong> kata terjemahan kontekstual:</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>Fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">pluralidx</span></code> bekerja dalam cara sama pada penyaring cetakan <a class=\"reference internal\" href=\"/id/2.0/ref/templates/builtins/#std-templatefilter-pluralize\"><code class=\"xref std std-tfilter docutils literal notranslate\"><span class=\"pre\">pluralize</span></code></a>, menentukan jika <code class=\"docutils literal notranslate\"><span class=\"pre\">count</span></code> diberikan harus menggunakan bentuk jamak dari sebuah kata atau tidak:</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>Dalam kasis paling sederhana, jika tidak ada penyesuaian penjamakan dibutuhkan, ini mengembalikan <code class=\"docutils literal notranslate\"><span class=\"pre\">false</span></code> untuk integer <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">true</span></code> untuk semua angka-angka lain.</p>\n<p>Bagaimanapun, penjamakan tidak sesederhana ini dalam semua bahasa. Jika bahasa tidak mendukung penjamakan, sebuah nilai kosong disediakan.</p>\n<p>Tambahannya, jika ada aturan-aturan rumit sekitar penjamakan, tampilan katalog akan membangun sebuah penyataan bersyarat. Ini akan menilai salah satu nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> (harus jamak) atau <code class=\"docutils literal notranslate\"><span class=\"pre\">false</span></code> (harus <strong>tidak</strong> jamak).</p>\n</section>\n</section>\n<section id=\"the-jsoncatalog-view\">\n<h3>Tampilan <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>Untuk menggunakan pustaka sisi-klien lain untuk menangani terjemahan, anda mungkin ingin mengambil keuntungan dari tampilan <code class=\"docutils literal notranslate\"><span class=\"pre\">JSONCatalog</span></code>. Itu mirip pada <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> tetapi mengembalikan sebuah tanggapan JSON.</p>\n<p>Lihat dokumentasi untuk <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> untuk belajar tentang kemungkinan nilai-nilai dan penggunaan dari atribut-atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">domain</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">packages</span></code>.</p>\n<p>Bentuk tanggapan sebagai berikut:</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>Catatan pada penampilan<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>Tampilan beragam i18n JavaScript/JSON membangkitkan katalog dari berkas-berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> pada setiap permintaan. Sejak itu mengeluarkan sebuah ketetapan, setidaknya untuk versi diberikan dari sebuah situs, itu adalah calon bagus untuk caching.</p>\n<p>Caching sisi-peladen akan mengurangi beban CPU. Itu sangat mudah diterapkan dengan penghias <a class=\"reference internal\" href=\"/id/2.0/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>. Untuk memicu ketidakabsahan cache ketika terjemahan anda berubah, sediakan awalan kunci versi-berdiri-sendiri, seperti ditunjukkan dalam contoh dibawah atau tampilan peta pada URL versi-berdiri-sendiri:</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=\"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><span class=\"s1\">&#39;jsi18n/&#39;</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=\"s1\">&#39;js18n-</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> <span class=\"n\">get_version</span><span class=\"p\">())(</span><span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n         <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;javascript-catalog&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Caching sisi-klien akan menyimpan lebar pita dan membuat situs anda dimuat lebih cepat. Jika anda sedang menggunakan ETag (<a class=\"reference internal\" href=\"/id/2.0/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>), anda siap dicakupi. Sebaliknya, anda dapat memberlakukan <span class=\"xref std std-ref\">conditional decorators 1</span>. Dalam contoh berikut, cache tidak berlaku ketika anda memulai kembali peladen aplikasi anda:</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=\"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><span class=\"s1\">&#39;jsi18n/&#39;</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><span class=\"n\">JavaScriptCatalog</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()),</span>\n         <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;javascript-catalog&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Anda dapat bahkan pra-membangkitkan katalog JavaScript sebagai bagian dari prosedur pegembangan anda dan melayani itu sebagai berkas tetap. Teknik radikal ini adalah diterapkan dalam <a class=\"reference external\" href=\"https://django-statici18n.readthedocs.io/en/latest/\">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>Internasionalisasi: dalam pola 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 menyediakan dua mekanisme pada pola URL internasionalisasi:</p>\n<ul class=\"simple\">\n<li><p>Menambahkan awalan bahasa pada akar dari pola URL untuk membuat itu memungkinkan untuk <a class=\"reference internal\" href=\"/id/2.0/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> untuk mengenali bahasa untuk diaktifkan dari URL diminta.</p></li>\n<li><p>Membuat pola URL mereka sendiri dapat diterjemahkan melalui fungsi <a class=\"reference internal\" href=\"/id/2.0/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\">Peringatan</p>\n<p>Menggunakan salah satu dari fitur-fitur ini membutuhkan itu sebuah bahasa aktif untuk disetel untuk setiap permintaan; dengan kata lain, anda butuh harus <a class=\"reference internal\" href=\"/id/2.0/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> dalam pengaturan <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> setting anda.</p>\n</aside>\n<section id=\"language-prefix-in-url-patterns\">\n<h3>Awalan bahasa dalam pola 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>Fungsi ini dapat digunakan dalam URLconf akar dan Django akan otomatis menambahkan kode bahasa aktif saat ini pada semua pola URL ditentukan dalam <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<p>Mengatur <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix_default_language</span></code> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> memindahkan awalan dari bahasa awalan (<a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>). Ini dapat berguna ketika menambahkan terjemahan pada situs yang ada sehingga URL saat ini tidak akan berubah.</p>\n<p>Contoh pola URL:</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=\"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\">url</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=\"s1\">&#39;sitemap.xml&#39;</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=\"s1\">&#39;sitemap-xml&#39;</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=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</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=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;category/&lt;slug:slug&gt;/&#39;</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=\"s1\">&#39;category&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;slug:slug&gt;/&#39;</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=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">],</span> <span class=\"s1\">&#39;news&#39;</span><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=\"s1\">&#39;about/&#39;</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=\"s1\">&#39;about&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;news/&#39;</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=\"s1\">&#39;news&#39;</span><span class=\"p\">)),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Setelah menentukan pola URL ini, Django akan otomatis menambahkan awalan bahasa ke pola URL yang telah ditambahkan oleh fungsi <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns</span></code>. Contoh:</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=\"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=\"s1\">&#39;en&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;sitemap-xml&#39;</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=\"s1\">&#39;news:index&#39;</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=\"s1\">&#39;nl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;news:detail&#39;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;news-slug&#39;</span><span class=\"p\">})</span>\n<span class=\"go\">&#39;/nl/news/news-slug/&#39;</span>\n</code></pre></div>\n<p>Dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">prefix_default_language=False</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE='en'</span></code>, URL akan menjadi:</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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">activate</span><span class=\"p\">(</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;news:index&#39;</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=\"s1\">&#39;nl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;news:index&#39;</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\">Peringatan</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> hanya diizinkan dalam akar URLconf. Menggunakan itu dalam sebuah URLconf disertakan akan melempar pengecualian <a class=\"reference internal\" href=\"/id/2.0/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\">Peringatan</p>\n<p>Memastikan bahwa anda tidak mempunyai pola URL bukan-awalan yang mungkin bertabrakan dengan awalan bahasa otomatis-ditambahkan.</p>\n</aside>\n</section>\n<section id=\"translating-url-patterns\">\n<span id=\"translating-urlpatterns\"></span><h3>Menterjemahkan pola 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>Pola URL dapat juga ditandai dapat diterjemahkan menggunakan fungsi <a class=\"reference internal\" href=\"/id/2.0/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>. Contoh:</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=\"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=\"s1\">&#39;sitemap.xml&#39;</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=\"s1\">&#39;sitemap-xml&#39;</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=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</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=\"s1\">&#39;index&#39;</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=\"s1\">&#39;category/&lt;slug:slug&gt;/&#39;</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=\"s1\">&#39;category&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;slug:slug&gt;/&#39;</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=\"s1\">&#39;detail&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">],</span> <span class=\"s1\">&#39;news&#39;</span><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=\"s1\">&#39;about/&#39;</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=\"s1\">&#39;about&#39;</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=\"s1\">&#39;news/&#39;</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=\"s1\">&#39;news&#39;</span><span class=\"p\">)),</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>Setelah anda telah membuat terjemahan, fungsi <a class=\"reference internal\" href=\"/id/2.0/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> akan mengembalikan URL dalam bahasa aktif. Contoh:</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=\"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=\"s1\">&#39;en&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;news:category&#39;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;recent&#39;</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=\"s1\">&#39;nl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">reverse</span><span class=\"p\">(</span><span class=\"s1\">&#39;news:category&#39;</span><span class=\"p\">,</span> <span class=\"n\">kwargs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;slug&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;recent&#39;</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\">Peringatan</p>\n<p>Dalam kebanyakan kasus, itu adalah terbaik menggunakan hanya URL terjemahan dalam blok awalan-kode-bahasa dari pola (menggunakan <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>), untuk menghindari kemungkinan bahwa sembarangan URL terjemahan menyebabkan tabrakan dengan pola URL bukan-terjemahan.</p>\n</aside>\n</section>\n<section id=\"reversing-in-templates\">\n<span id=\"id2\"></span><h3>Membalikkan dalam cetakan-cetakan<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>Jika URL lokal mendapatkan terbalik dalam cetakan mereka selalu menggunakan bahasa saat ini. Untuk menautkan ke sebuah URL dalam bahasa lain gunakan etiket cetakan <a class=\"reference internal\" href=\"#std-templatetag-language\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">language</span></code></a>. Itu mengadakan bahasa yang diberikan dalam bagian cetakan tertutup:</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\">trans</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>Etiket <a class=\"reference internal\" href=\"#std-templatetag-language\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">language</span></code></a> mengharapkan kode bahasa sebagai hanya argumen.</p>\n</section>\n</section>\n<section id=\"localization-how-to-create-language-files\">\n<span id=\"how-to-create-language-files\"></span><h2>Lokalisasi: bagaimana membuat berkas-berkas bahasa<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>Setelah harfiah string dari sebuah aplikasi telah dietiketkan untuk terjemahan akhir, terjemahan itu sendiri butuh ditulis (atau diambil). Ini adalah bagaimana itu bekerja.</p>\n<section id=\"message-files\">\n<h3>Berkas pesan<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>langkah pertama adalah membuat sebuah <a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message file</span></a> untuk bahasa baru. Sebuah berkas pesan adalah sebuah berkas teks-polos, mewakili bahasa tunggal, yang mengandung semua string terjemahan tersedia dan bagaimana mereka harus dibawakan dalam bahasa diberikan. Berkas-berkas pesan mempunyai ekstensi berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>.</p>\n<p>Django datang dengan sebuah alat, <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span> <span class=\"pre\">1</span></code>, yang mengotomatiskan pembuatan dan perawatan dari berkas-berkas ini.</p>\n<aside class=\"admonition-gettext-utilities admonition\">\n<p class=\"admonition-title\">Utilitas gettext</p>\n<p>Perintah <code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code> (dan <code class=\"docutils literal notranslate\"><span class=\"pre\">compilemessages</span></code> diobrolkan kemudian) menggunakan perintah dari kumpulan alat gettext GNU: <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> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">msguniq</span></code>.</p>\n<p>Versi minimal dari utilitas <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> didukung adalah 0.15.</p>\n</aside>\n<p>Untuk membuat atau memperbaharui sebuah berkas pesan, jalankan perintah ini:</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\">django</span><span class=\"o\">-</span><span class=\"n\">admin</span> <span class=\"n\">makemessages</span> <span class=\"o\">-</span><span class=\"n\">l</span> <span class=\"n\">de</span>\n</code></pre></div>\n<p>...dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> adalah <a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> untuk berkas pesan anda ingin buat. Sebagai contoh, <code class=\"docutils literal notranslate\"><span class=\"pre\">pt_BR</span></code> untuk Brasil Portugis, <code class=\"docutils literal notranslate\"><span class=\"pre\">de_AT</span></code> untuk Austria Jerman atau <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> untuk Indonesia.</p>\n<p>Tulisan ini harus berjalan dari satu atau dua tempat:</p>\n<ul class=\"simple\">\n<li><p>Direktori akar untuk proyek Django anda (satu yang mengandung <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>).</p></li>\n<li><p>Direktori akar dari satu dari aplikasi Django anda.</p></li>\n</ul>\n<p>Tulisan berjalan terhadap pohon sumber proyek anda atau pohon sumber aplikasi anda dan menarik semua string ditandai untuk terjemahan (lihat <a class=\"reference internal\" href=\"#how-django-discovers-translations\"><span class=\"std std-ref\">Bagaimana Django menemukan terjemahan</span></a> dan pastikan <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> dikonfigurasi dengan benar). Itu membuat (atau memperbaharui) sebuah berkas pesan dalam direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">locale/LANG/LC_MESSAGES</span></code>. Dalam contoh <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code>, berkas akan berupa <code class=\"docutils literal notranslate\"><span class=\"pre\">locale/de/LC_MESSAGES/django.po</span></code>.</p>\n<p>Ketika anda menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">makemessages</span></code> dari direktori akar dari proyek anda, string dikeluarkan akan secara otomatis disebarkan pada berkas-berkas pesan yang sesuai. Yaitu, string dikeluarkan dari sebuah berkas dari sebuah aplikasi mengandung direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> akan masuk dalam berkas pesan dibawah direktori itu. Sebuah string dikeluarkan dari sebuah berkas dari sebuah aplikasi tanpa direktori <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> akan salah satu masuk dalam berkas pesan dibawah direktori didaftar pertama dalam <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> atau akan membangkitkan sebuah kesalahan jika <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> adalah kosong.</p>\n<p>Secara awalan <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span> <span class=\"pre\">1</span></code> menguji setiap berkas yang mempunyai ekstensi berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.html</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">.txt</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">.py</span></code>. Jika anda ingin menimpa awalan itu, gunakan pilihan <code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--extension</span> <span class=\"pre\">2</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span></code> untuk menentukan ekstensi berkas untuk diuji:</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\">django</span><span class=\"o\">-</span><span class=\"n\">admin</span> <span class=\"n\">makemessages</span> <span class=\"o\">-</span><span class=\"n\">l</span> <span class=\"n\">de</span> <span class=\"o\">-</span><span class=\"n\">e</span> <span class=\"n\">txt</span>\n</code></pre></div>\n<p>Mmeisahkan banyak ekstensi dengan koma dan/atau menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">--extension</span></code> berkali-kali:</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\">django</span><span class=\"o\">-</span><span class=\"n\">admin</span> <span class=\"n\">makemessages</span> <span class=\"o\">-</span><span class=\"n\">l</span> <span class=\"n\">de</span> <span class=\"o\">-</span><span class=\"n\">e</span> <span class=\"n\">html</span><span class=\"p\">,</span><span class=\"n\">txt</span> <span class=\"o\">-</span><span class=\"n\">e</span> <span class=\"n\">xml</span>\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Ketika <span class=\"xref std std-ref\">creating message files from JavaScript source code 1</span> anda butuh menggunakan ranah 'djangojs' khusus, <strong>bukan</strong> <code class=\"docutils literal notranslate\"><span class=\"pre\">-e</span> <span class=\"pre\">js</span></code>.</p>\n</aside>\n<aside class=\"admonition-using-jinja2-templates admonition\">\n<p class=\"admonition-title\">Menggunakan cetakan Jinja2?</p>\n<p><a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> tidak memahami sintaksis dari cetakan-cetakan Jinja2. Untuk mengeluarkan string dari sebuah proyek mengandung cetakan-cetakan Jinja2, gunakan <a class=\"reference external\" href=\"http://babel.pocoo.org/en/latest/messages.html#message-extraction\">Message Extracting</a> dari <a class=\"reference external\" href=\"http://babel.pocoo.org/\">Babel</a> sebagai gantinya.</p>\n<p>Ini adalah contoh berkas konfigurasi <code class=\"docutils literal notranslate\"><span class=\"pre\">babel.cfg</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=\"c1\"># Extraction from Python source files</span>\n<span class=\"p\">[</span><span class=\"n\">python</span><span class=\"p\">:</span> <span class=\"o\">**.</span><span class=\"n\">py</span><span class=\"p\">]</span>\n\n<span class=\"c1\"># Extraction from Jinja2 templates</span>\n<span class=\"p\">[</span><span class=\"n\">jinja2</span><span class=\"p\">:</span> <span class=\"o\">**.</span><span class=\"n\">jinja</span><span class=\"p\">]</span>\n<span class=\"n\">extensions</span> <span class=\"o\">=</span> <span class=\"n\">jinja2</span><span class=\"o\">.</span><span class=\"n\">ext</span><span class=\"o\">.</span><span class=\"n\">with_</span>\n</code></pre></div>\n<p>Pastikan anda mendaftarkan semua ekstensi anda sedang gunakan! Sebaliknya Babel tidak akan mengenali etiket-etiket ditentukan oleh ekstensi-ekstensi ini dan akan mengabaikan cetakan-cetakan Jinja2 mengandung mereka sepenuhnya.</p>\n<p>Babel menyediakan fitur-fitur mirip pada <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a>, dapat mengganti itu secara umum, dan tidak bergantung pada <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>. Untuk informasi lebih, baca dokumentasinya tentang <a class=\"reference external\" href=\"http://babel.pocoo.org/en/latest/messages.html\">working with message catalogs</a>.</p>\n</aside>\n<aside class=\"admonition-no-gettext admonition\">\n<p class=\"admonition-title\">Tidak ada gettext?</p>\n<p>Jika anda tidak mempunyai utilitas <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> terpasang, <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> akan membuat berkas-berkas kosong. Jika itu adalah kasus, salah satu pasang utilitas <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> atau cukup salin berkas pesan Inggris (<code class=\"docutils literal notranslate\"><span class=\"pre\">locale/en/LC_MESSAGES/django.po</span></code>) jika tersedia dan menggunakan itu sebagai titik permulaan; itu hanya sebuah berkas terjemahan kosong.</p>\n</aside>\n<aside class=\"admonition-working-on-windows admonition\">\n<p class=\"admonition-title\">Bekerja pada WIndows?</p>\n<p>Jika anda sedang menggunakan Windows dan butuh memasang utilitas gettext GNU sehingga <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> bekerja, lihat <a class=\"reference internal\" href=\"#gettext-on-windows\"><span class=\"std std-ref\">gettext pada Windows</span></a> untuk informasi lebih.</p>\n</aside>\n<p>The format of <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> files is straightforward. Each <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> file contains a\nsmall bit of metadata, such as the translation maintainer's contact\ninformation, but the bulk of the file is a list of <strong>messages</strong> -- simple\nmappings between translation strings and the actual translated text for the\nparticular language.</p>\n<p>Sebagai contoh, jika aplikasi Django anda mengandung string terjemahan untuk teks <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>, seperti itu:</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\">_</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>...kemudian <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span> <span class=\"pre\">1</span></code> akan membuat sebuah berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> mengandung potongan berikut -- sebuah pesan:</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>Penjelasan cepat:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code> adalah string terjemahan, yang muncul dalam sumber. Jangan rubah itu.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">msgstr</span></code> adalah dimana anda menaruh terjemahan bahasa-khusus. Itu mulai kosong, jadi itu adalah tanggungjawab anda merubah itu. pastikan anda menjaga kutipan disekitar terjemahan anda.</p></li>\n<li><p>Sebagai sebuah kenyamanan, setiap pesan termasuk, dalam bentuk dari baris komentar diawali dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">#</span></code> dan bertempat diatas baris <code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code>, nama berkas dan nomor baris dari mana string terjemahan telah dikumpulkan sedikit demi sedikit.</p></li>\n</ul>\n<p>Pesan-pesan panjang adalah kasus khusus. Ada, string pertama secara langsung setelah <code class=\"docutils literal notranslate\"><span class=\"pre\">msgstr</span></code> (atau <code class=\"docutils literal notranslate\"><span class=\"pre\">msgid</span></code>) adalah string kosong. Kemudian isi itu sendiri akan ditulis terhadap sedikit baris selanjutnya sebagai satu string per baris. String-string tersebut secara langsung disatukan. Jangan lupa buntutan ruang kosong dalam string; jika tidak, mereka akan dilekatkan bersama-sama tanpa ruang kosong!</p>\n<aside class=\"admonition-mind-your-charset admonition\">\n<p class=\"admonition-title\">Pikirkan charset anda</p>\n<p>Due to the way the <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> tools work internally and because we want to\nallow non-ASCII source strings in Django's core and your applications, you\n<strong>must</strong> use UTF-8 as the encoding for your PO files (the default when PO\nfiles are created).  This means that everybody will be using the same\nencoding, which is important when Django processes the PO files.</p>\n</aside>\n<p>Untuk menguji kembali semua kode sumber da cetakan untuk string terjemahan baru dan memperbaharui semua berkas pesan untuk <em>semua</em> bahasa, jalankan ini:</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\">django</span><span class=\"o\">-</span><span class=\"n\">admin</span> <span class=\"n\">makemessages</span> <span class=\"o\">-</span><span class=\"n\">a</span>\n</code></pre></div>\n</section>\n<section id=\"compiling-message-files\">\n<h3>Menyusun berkas-berkas pesan<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>Setelah anda membuat berkas pesan anda -- dan setiap kali anda membuat perubahan ke itu -- anda akan butuh menyusun itu menjadi bentuk lebih efesien, untuk digunakan oleh <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>. Lakukan ini dengan alat <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span> <span class=\"pre\">1</span></code>.</p>\n<p>Alat ini berjalan terhadap semua berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> tersedia dan membuat berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>, yang adalah berkas biner dioptimalkan untu digunakan oleh <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>. Dalam direktori sama dari mana anda menjalankan <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">makemessages</span> <span class=\"pre\">1</span></code>, jalankan <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span> <span class=\"pre\">2</span></code> seperti ini:</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\">django</span><span class=\"o\">-</span><span class=\"n\">admin</span> <span class=\"n\">compilemessages</span>\n</code></pre></div>\n<p>Itu dia, terjemahan anda siap digunakan.</p>\n<aside class=\"admonition-working-on-windows admonition\">\n<p class=\"admonition-title\">Bekerja pada WIndows?</p>\n<p>Jika anda sedang menggunakan Windows dan butuh memasang alat gettext GNU sehingga <code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">django-admin</span> <span class=\"pre\">compilemessages</span> <span class=\"pre\">1</span></code> bekerja lihat <a class=\"reference internal\" href=\"#gettext-on-windows\"><span class=\"std std-ref\">gettext pada Windows</span></a> untuk informasi lebih.</p>\n</aside>\n<aside class=\"admonition-po-files-encoding-and-bom-usage admonition\">\n<p class=\"admonition-title\">berkas-berkas .po: Penggunaan penyandian dan BOM.</p>\n<p>Django only supports <code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code> files encoded in UTF-8 and without any BOM\n(Byte Order Mark) so if your text editor adds such marks to the beginning of\nfiles by default then you will need to reconfigure it.</p>\n</aside>\n</section>\n<section id=\"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\">\n<h3>Pemecahan masalah: <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext()</span></code> tidak benar mengenali <code class=\"docutils literal notranslate\"><span class=\"pre\">python-format</span></code> dalam string-string dengan tanda persen<a class=\"heading-anchor\" href=\"#troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>In some cases, such as strings with a percent sign followed by a space and a\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#old-string-formatting\" title=\"(di Python v3.14)\"><span class=\"xref std std-ref\">string conversion type</span></a> (e.g.\n<code class=\"docutils literal notranslate\"><span class=\"pre\">_(&quot;10%</span> <span class=\"pre\">interest&quot;)</span></code>), <a class=\"reference internal\" href=\"/id/2.0/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> incorrectly\nflags strings with <code class=\"docutils literal notranslate\"><span class=\"pre\">python-format</span></code>.</p>\n<p>If you try to compile message files with incorrectly flagged strings, you'll\nget an error message like <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>\n<span class=\"pre\">'msgstr'</span> <span class=\"pre\">does</span> <span class=\"pre\">not</span> <span class=\"pre\">match</span></code> or <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>\n<span class=\"pre\">unlike</span> <span class=\"pre\">'msgid'</span></code>.</p>\n<p>Untuk memecahkan ini, anda dapat meloloskan tanda persen dengan menambahkan tanda persen kedua:</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=\"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<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>Atau anda dapat menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">no-python-format</span></code> sehingga semua tanda persen diperlakukan sebagai harfiah.</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=\"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>Membuat berkas pesan dari kode sumber JavaScript<a class=\"heading-anchor\" href=\"#creating-message-files-from-javascript-source-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You create and update the message files the same way as the other Django message\nfiles -- with the <a class=\"reference internal\" href=\"/id/2.0/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> tool.\nThe only difference is you need to explicitly specify what in gettext parlance\nis known as a domain in this case the <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code> domain, by providing a <code class=\"docutils literal notranslate\"><span class=\"pre\">-d</span>\n<span class=\"pre\">djangojs</span></code> parameter, like this:</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\">django</span><span class=\"o\">-</span><span class=\"n\">admin</span> <span class=\"n\">makemessages</span> <span class=\"o\">-</span><span class=\"n\">d</span> <span class=\"n\">djangojs</span> <span class=\"o\">-</span><span class=\"n\">l</span> <span class=\"n\">de</span>\n</code></pre></div>\n<p>This would create or update the message file for JavaScript for German. After\nupdating message files, just run <a class=\"reference internal\" href=\"/id/2.0/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> the same way as you do with normal Django message files.</p>\n</section>\n<section id=\"gettext-on-windows\">\n<span id=\"id3\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> pada Windows<a class=\"heading-anchor\" href=\"#gettext-on-windows\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>This is only needed for people who either want to extract message IDs or compile\nmessage files (<code class=\"docutils literal notranslate\"><span class=\"pre\">.po</span></code>). Translation work itself just involves editing existing\nfiles of this type, but if you want to create your own message files, or want to\ntest or compile a changed message file, download <a class=\"reference external\" href=\"https://mlocati.github.io/articles/gettext-iconv-windows.html\">a precompiled binary\ninstaller</a>.</p>\n<p>You may also use <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> binaries you have obtained elsewhere, so long as\nthe <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span> <span class=\"pre\">--version</span></code> command works properly. Do not attempt to use Django\ntranslation utilities with a <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> package if the command <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span>\n<span class=\"pre\">--version</span></code> entered at a Windows command prompt causes a popup window saying\n&quot;xgettext.exe has generated errors and will be closed by Windows&quot;.</p>\n</section>\n<section id=\"customizing-the-makemessages-command\">\n<span id=\"customizing-makemessages\"></span><h3>Menyesuaikan perintah <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>Jika anda ingin melewatkan parameter tambahan pada <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code>, anda butuh membuat perintah <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a> penyesuaian dan menimpa atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext_options</span></code> nya:</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=\"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<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=\"s1\">&#39;--keyword=mytrans&#39;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Jika anda butuh lebih keluwesan, anda dapat juga menambahkan argumen baru ke perintah perintah <a class=\"reference internal\" href=\"/id/2.0/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">makemessages</span></code></a>  anda:</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=\"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<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\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=\"s1\">&#39;--extra-keyword&#39;</span><span class=\"p\">,</span>\n            <span class=\"n\">dest</span><span class=\"o\">=</span><span class=\"s1\">&#39;xgettext_keywords&#39;</span><span class=\"p\">,</span>\n            <span class=\"n\">action</span><span class=\"o\">=</span><span class=\"s1\">&#39;append&#39;</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=\"s1\">&#39;xgettext_keywords&#39;</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=\"p\">(</span>\n                <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>\n                <span class=\"p\">[</span><span class=\"s1\">&#39;--keyword=</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</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><span class=\"p\">]</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>Bermacam-macam<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>Tampilan mengalihkan <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>As a convenience, Django comes with a view, <a class=\"reference internal\" href=\"#django.views.i18n.set_language\" title=\"django.views.i18n.set_language\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">django.views.i18n.set_language()</span></code></a>,\nthat sets a user's language preference and redirects to a given URL or, by default,\nback to the previous page.</p>\n<p>Aktifkan tampilan ini dengan menambahkan baris berikut ke URLconf anda:</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\">path</span><span class=\"p\">(</span><span class=\"s1\">&#39;i18n/&#39;</span><span class=\"p\">,</span> <span class=\"n\">include</span><span class=\"p\">(</span><span class=\"s1\">&#39;django.conf.urls.i18n&#39;</span><span class=\"p\">)),</span>\n</code></pre></div>\n<p>(Catat bahwa contoh ini membuat tampilan tersedia pada <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\">Peringatan</p>\n<p>pastikan bahwa anda tidak menyertakan URL diatas dalam <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> - itu butuh menjadi bahasa-berdiri-sendiri untuk bekerja dengan benar.</p>\n</aside>\n<p>The view expects to be called via the <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> method, with a <code class=\"docutils literal notranslate\"><span class=\"pre\">language</span></code>\nparameter set in request. If session support is enabled, the view\nsaves the language choice in the user's session. Otherwise, it saves the\nlanguage choice in a cookie that is by default named <code class=\"docutils literal notranslate\"><span class=\"pre\">django_language</span></code>.\n(The name can be changed through the <a class=\"reference internal\" href=\"/id/2.0/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> setting.)</p>\n<p>After setting the language choice, Django looks for a <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> parameter in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">GET</span></code> data. If that is found and Django considers it to be a safe\nURL (i.e. it doesn't point to a different host and uses a safe scheme), a\nredirect to that URL will be performed. Otherwise, Django may fall back to\nredirecting the user to the URL from the <code class=\"docutils literal notranslate\"><span class=\"pre\">Referer</span></code> header or, if it is not\nset, to <code class=\"docutils literal notranslate\"><span class=\"pre\">/</span></code>, depending on the nature of the request:</p>\n<ul class=\"simple\">\n<li><p>Untuk permintaan AJAX, fallback akan dialkukan hanya jika parameter <code class=\"docutils literal notranslate\"><span class=\"pre\">next</span></code> telah disetel. Sebaliknya sebuah kode keadaan 204 (Tidak ada Isi) akan dikembalikan.</p></li>\n<li><p>Untuk permintaan bukan-AJAX, fallback akan selalu dilakukan.</p></li>\n</ul>\n<p>Ini adalah contoh kode cetakan 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>Dalam contoh ini, Django mencari URL dari halaman pada dimana pengguna akan dialihkan dalam variabel konteks <code class=\"docutils literal notranslate\"><span class=\"pre\">redirect_to</span></code>.</p>\n</section>\n<section id=\"explicitly-setting-the-active-language\">\n<span id=\"id4\"></span><h3>Secara jelas mengatur bahasa aktif<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>Anda mungkin ingin menyetel bahasa aktif untuk sesi saat ini secara jelas. Mungkin pilihan bahasa pengguna diambil dari sistem lain, sebagai contoh. Anda telah diperkenalkan pada <a class=\"reference internal\" href=\"/id/2.0/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>. Yang memberlakukan ke hanya rangkaian saat ini. Untuk bertahan bahasa untuk seluruh sesi, juga rubah <a class=\"reference internal\" href=\"/id/2.0/ref/utils/#django.utils.translation.LANGUAGE_SESSION_KEY\" title=\"django.utils.translation.LANGUAGE_SESSION_KEY\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">LANGUAGE_SESSION_KEY</span></code></a> dalam sesi:</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=\"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<span class=\"n\">user_language</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;fr&#39;</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\">request</span><span class=\"o\">.</span><span class=\"n\">session</span><span class=\"p\">[</span><span class=\"n\">translation</span><span class=\"o\">.</span><span class=\"n\">LANGUAGE_SESSION_KEY</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">user_language</span>\n</code></pre></div>\n<p>Anda biasaya ingin melakukan menggunakan kedua: <a class=\"reference internal\" href=\"/id/2.0/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> akan merubah bahasa ke rangkaian ini, dan merubah sesi membuat pilihan ini tetap ada di permintaan akan datang.</p>\n<p>Jika anda tidak menggunakan sesi, bahasa akan terus ada dalam sebuah cookie, yang namanya dikonfigurasi dalam <a class=\"reference internal\" href=\"/id/2.0/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>. Sebagai contoh:</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=\"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<span class=\"n\">user_language</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;fr&#39;</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</section>\n<section id=\"using-translations-outside-views-and-templates\">\n<h3>Menggunakan terjemahan diluar tampilan dan cetakan<a class=\"heading-anchor\" href=\"#using-translations-outside-views-and-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>While Django provides a rich set of i18n tools for use in views and templates,\nit does not restrict the usage to Django-specific code. The Django translation\nmechanisms can be used to translate arbitrary texts to any language that is\nsupported by Django (as long as an appropriate translation catalog exists, of\ncourse). You can load a translation catalog, activate it and translate text to\nlanguage of your choice, but remember to switch back to original language, as\nactivating a translation catalog is done on per-thread basis and such change\nwill affect code running in the same thread.</p>\n<p>Sebagai contoh:</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=\"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=\"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=\"s1\">&#39;welcome&#39;</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>Memanggil fungsi ini dengan nilai 'de' akan memberikan anda <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Willkommen&quot;</span></code>, tanpa memperhatikan dari <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> dan bahasa disetel oleh middleware.</p>\n<p>Fungsi-fungsi untuk minat tertentu adalah <a class=\"reference internal\" href=\"/id/2.0/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> yang mengembalikan bahasa digunakan dalam thread saat ini, <a class=\"reference internal\" href=\"/id/2.0/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> yang mengaktifkan sebuah katalog terjemahan untuk thread saat ini, dan <a class=\"reference internal\" href=\"/id/2.0/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> yang akan memeriksa jika bahasa diberikan adalah didukung oleh Django.</p>\n<p>Untuk membantu menulis lebih kode ringkas, ada juga sebuah pengelola konteks <a class=\"reference internal\" href=\"/id/2.0/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> yang menyimpan bahasa sat ini pada saat masuk dan menyimpan kembali itu pada saat keluar. Dengan itu, contoh diatas menjadi:</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=\"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=\"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=\"s1\">&#39;welcome&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"language-cookie\">\n<h3>Cookie bahasa<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>Sejumlah pengatuan dapat digunakan untuk menyesuaikan pilihan cookie bahasa:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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=\"/id/2.0/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</ul>\n</section>\n</section>\n<section id=\"implementation-notes\">\n<h2>Catatan penerapan<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>Keahlian khusus dari terjemahan 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's translation machinery uses the standard <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> module that comes\nwith Python. If you know <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>, you might note these specialties in the\nway Django does translation:</p>\n<ul class=\"simple\">\n<li><p>The string domain is <code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code>. This string domain is\nused to differentiate between different programs that store their data\nin a common message-file library (usually <code class=\"docutils literal notranslate\"><span class=\"pre\">/usr/share/locale/</span></code>). The\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django</span></code> domain is used for Python and template translation strings\nand is loaded into the global translation catalogs. The <code class=\"docutils literal notranslate\"><span class=\"pre\">djangojs</span></code>\ndomain is only used for JavaScript translation catalogs to make sure\nthat those are as small as possible.</p></li>\n<li><p>Django tidak menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> sendiri. Itu menggunakan Python dibungkus disekitar <code class=\"docutils literal notranslate\"><span class=\"pre\">xgettext</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">msgfmt</span></code>. Ini kebanyakan untuk kenyamanan.</p></li>\n</ul>\n</section>\n<section id=\"how-django-discovers-language-preference\">\n<span id=\"id5\"></span><h3>Bagaimana Django menemukan pilihan bahasa<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>Ketika anda telah menyiapkan terjemahan anda -- atau, jika anda hanya ingin menggunakan terjemahan yang datang dengan Django -- anda hanya butuh mengaktifkan terjemahan untuk aplikasi anda.</p>\n<p>Dbelakang layar, Django mempunyai model yang sagat elastis dari memutuskan bahasa mana harus digunakan -- pemasangan-lebar, untuk pengguna tertentu, atau keduanya.</p>\n<p>Untuk menyetel sebuah pilihan bahasa pemasangan-luas, setel <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a>. Django menggunakan bahasa ini sebagai terjemahan awalan -- usaha akhir jika tidak ada terjemahan yang cocok ditemukan melalui satu dari metode-metode dengan middleware lokal (lihat dibawah).</p>\n<p>Jika yang anda inginkan adalah menjalankan Django dengan bahasa asli anda semua anda butuhkan untuk lakukan adalah menyetel <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> dan memastikan <span class=\"xref std std-term\">message files 1</span> sesuai dan versi tersusun mereka (<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>) ada.</p>\n<p>Jika anda ingin membiarkan setiap pengguna perorangan  menentukan bahasa mana mereka pilih, kemudian anda juga butuh menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>. <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> mengadakan pilihan bahasa berdasarkan pada data dari permintaan. Itu menyesuaikan isi untuk setiap pengguna.</p>\n<p>Untuk menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>, tambah <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.middleware.locale.LocaleMiddleware'</span></code>  ke pengaturan <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> anda. Karena  urutan middleware penting, ikuti panduan berikut:</p>\n<ul class=\"simple\">\n<li><p>Pastikan itu adalah satu dari middleware pertama dipasang.</p></li>\n<li><p>It should come after <code class=\"docutils literal notranslate\"><span class=\"pre\">SessionMiddleware</span></code>, because <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code>\nmakes use of session data. And it should come before <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code>\nbecause <code class=\"docutils literal notranslate\"><span class=\"pre\">CommonMiddleware</span></code> needs an activated language in order\nto resolve the requested URL.</p></li>\n<li><p>Jika anda menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">CacheMiddleware</span></code>, taruh <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> setelah itu.</p></li>\n</ul>\n<p>Sebagai contoh, <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIDDLEWARE</span></code></a> anda mungkin terlihat seperti ini:</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\">MIDDLEWARE</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n   <span class=\"s1\">&#39;django.contrib.sessions.middleware.SessionMiddleware&#39;</span><span class=\"p\">,</span>\n   <span class=\"s1\">&#39;django.middleware.locale.LocaleMiddleware&#39;</span><span class=\"p\">,</span>\n   <span class=\"s1\">&#39;django.middleware.common.CommonMiddleware&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>(Untuk lebih pada middleware, lihat <span class=\"xref std std-doc\">middleware documentation 1</span>.)</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> mencoba menentukan pilihan bahasa pengguna dengan mengikuti algoritma ini:</p>\n<ul>\n<li><p>First, it looks for the language prefix in the requested URL.  This is\nonly performed when you are using the <code class=\"docutils literal notranslate\"><span class=\"pre\">i18n_patterns</span></code> function in your\nroot URLconf. See <a class=\"reference internal\" href=\"#url-internationalization\"><span class=\"std std-ref\">Internasionalisasi: dalam pola URL</span></a> for more information\nabout the language prefix and how to internationalize URL patterns.</p></li>\n<li><p>Failing that, it looks for the <a class=\"reference internal\" href=\"/id/2.0/ref/utils/#django.utils.translation.LANGUAGE_SESSION_KEY\" title=\"django.utils.translation.LANGUAGE_SESSION_KEY\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">LANGUAGE_SESSION_KEY</span></code></a>\nkey in the current user's session.</p></li>\n<li><p>Failing that, it looks for a cookie.</p>\n<p>Nama dari cookie digunakan adalah disetel oleh pengaturan <a class=\"reference internal\" href=\"/id/2.0/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>. (Nama awalan adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">django_language</span></code>.)</p>\n</li>\n<li><p>Failing that, it looks at the <code class=\"docutils literal notranslate\"><span class=\"pre\">Accept-Language</span></code> HTTP header. This\nheader is sent by your browser and tells the server which language(s) you\nprefer, in order by priority. Django tries each language in the header\nuntil it finds one with available translations.</p></li>\n<li><p>Failing that, it uses the global <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> setting.</p></li>\n</ul>\n<p id=\"locale-middleware-notes\">Catatan:</p>\n<ul>\n<li><p>In each of these places, the language preference is expected to be in the\nstandard <a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language format</span></a>, as a string. For example,\nBrazilian Portuguese is <code class=\"docutils literal notranslate\"><span class=\"pre\">pt-br</span></code>.</p></li>\n<li><p>If a base language is available but the sublanguage specified is not,\nDjango uses the base language. For example, if a user specifies <code class=\"docutils literal notranslate\"><span class=\"pre\">de-at</span></code>\n(Austrian German) but Django only has <code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code> available, Django uses\n<code class=\"docutils literal notranslate\"><span class=\"pre\">de</span></code>.</p></li>\n<li><p>Only languages listed in the <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> setting can be selected.\nIf you want to restrict the language selection to a subset of provided\nlanguages (because your application doesn't provide all those languages),\nset <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> to a list of languages. For example:</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\">LANGUAGES</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n  <span class=\"p\">(</span><span class=\"s1\">&#39;de&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;German&#39;</span><span class=\"p\">)),</span>\n  <span class=\"p\">(</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;English&#39;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Contoh-contoh ini membatasi bahasa-bahasa yang tersedia untuk pemilihan otomatis pada Jerman dan Inggris (dan subbahasa apapun, seperti de-ch atau en-us).</p>\n</li>\n<li><p>If you define a custom <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGES</span></code></a> setting, as explained in the\nprevious bullet, you can mark the language names as translation strings\n-- but use <a class=\"reference internal\" href=\"/id/2.0/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> instead of\n<a class=\"reference internal\" href=\"/id/2.0/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> to avoid a circular import.</p>\n<p>Ini adalah contoh sebuah berkas pengaturan:</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=\"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=\"s1\">&#39;de&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;German&#39;</span><span class=\"p\">)),</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">,</span> <span class=\"n\">_</span><span class=\"p\">(</span><span class=\"s1\">&#39;English&#39;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</li>\n</ul>\n<p>Once <code class=\"docutils literal notranslate\"><span class=\"pre\">LocaleMiddleware</span></code> determines the user's preference, it makes this\npreference available as <code class=\"docutils literal notranslate\"><span class=\"pre\">request.LANGUAGE_CODE</span></code> for each\n<a class=\"reference internal\" href=\"/id/2.0/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>. Feel free to read this value in your view\ncode. Here's a simple example:</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=\"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<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=\"s1\">&#39;de-at&#39;</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>Catat bahwa, dengan terjemahan tetap (tanpa-middleware), bahasa di <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.LANGUAGE_CODE</span></code>, selagi dengan terjemahan dinamis (middleware), itu di <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>Bagaimana Django menemukan terjemahan<a class=\"heading-anchor\" href=\"#how-django-discovers-translations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>At runtime, Django builds an in-memory unified catalog of literals-translations.\nTo achieve this it looks for translations by following this algorithm regarding\nthe order in which it examines the different file paths to load the compiled\n<a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message files</span></a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code>) and the precedence of multiple\ntranslations for the same literal:</p>\n<ol class=\"arabic simple\">\n<li><p>The directories listed in <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> have the highest\nprecedence, with the ones appearing first having higher precedence than\nthe ones appearing later.</p></li>\n<li><p>Then, it looks for and uses if it exists a <code class=\"docutils literal notranslate\"><span class=\"pre\">locale</span></code> directory in each\nof the installed apps listed in <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.  The ones\nappearing first have higher precedence than the ones appearing later.</p></li>\n<li><p>Akhirnya, terjemahan dasar disediakan-Django dalam <code class=\"docutils literal notranslate\"><span class=\"pre\">django/conf/locale</span></code> digunakan sebagai sebuah fallback.</p></li>\n</ol>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Lihat juga</p>\n<p>The translations for literals included in JavaScript assets are looked up\nfollowing a similar but not identical algorithm. See\n<a class=\"reference internal\" href=\"#django.views.i18n.JavaScriptCatalog\" title=\"django.views.i18n.JavaScriptCatalog\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JavaScriptCatalog</span></code></a> for more details.</p>\n<p>You can also put <a class=\"reference internal\" href=\"/id/2.0/topics/i18n/formatting/#custom-format-files\"><span class=\"std std-ref\">custom format files</span></a> in the\n<a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> directories if you also set\n<a class=\"reference internal\" href=\"/id/2.0/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>.</p>\n</aside>\n<p>In all cases the name of the directory containing the translation is expected to\nbe named using <a class=\"reference internal\" href=\"/id/2.0/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> notation. E.g. <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>,\netc.</p>\n<p>Cara ini, anda dapat menulis aplikasi yang menyertakan terjemahan mereka sendiri, dan anda dapat menimpa terjemahan dasar dalam proyek anda. Atau, anda dapat cukup membangun proyek besar dari beberapa aplikasi dan menaruh semua terjemahan kedalam berkas pesan umum besar ke proyek anda susun. Pilihan ada di anda.</p>\n<p>Semua gudang berkas pesan tersusun cara sama. Mereka adalah:</p>\n<ul class=\"simple\">\n<li><p>Semua jalur-jalur terdaftar dalam <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> di berkas pengaturan anda adalah dicari untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">1/LC_MESSAGES/django.(po|mo)</span></code></p></li>\n<li><p>$APPPATH/locale/&lt;language&gt;/LC_MESSAGES/django.(po|mo)``</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>Untuk membuat berkas pesan, anda menggunakan , anda menggunakan alat <a class=\"reference internal\" href=\"/id/2.0/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> . Dan anda menggunakan <a class=\"reference internal\" href=\"/id/2.0/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> untuk menghasilkan berkas-berkas biner <code class=\"docutils literal notranslate\"><span class=\"pre\">.mo</span></code> yang digunakan oleh <code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code>.</p>\n<p>Anda dapat juga menjalankan <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> <span class=\"pre\">1</span></code> untuk membuat penyusun mengolah semua direktori dalam pengaturan <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LOCALE_PATHS</span></code></a> anda.</p>\n</section>\n<section id=\"using-a-non-english-base-language\">\n<h3>Menggunakan bahasa dasar bukan-Inggris<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 membuat anggapan umum bahwa string asli dalam proyek terjemahan ditulis dalam Inggris. Anda dapat memilih bahasa lain, tetapi harus waspada dari batasan tertentu:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">gettext</span></code> only provides two plural forms for the original messages, so you\nwill also need to provide a translation for the base language to include all\nplural forms if the plural rules for the base language are different from\nEnglish.</p></li>\n<li><p>When an English variant is activated and English strings are missing, the\nfallback language will not be the <a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> of the project,\nbut the original strings. For example, an English user visiting a site with\n<a class=\"reference internal\" href=\"/id/2.0/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">LANGUAGE_CODE</span></code></a> set to Spanish and original strings written in\nRussian will see Russian text rather than Spanish.</p></li>\n</ul>\n</section>\n</section>","rootId":"module-django.utils.translation","toc":[{"title":"Ikhtisar","anchor":"overview","children":[]},{"title":"Internationalization: in Python code","anchor":"internationalization-in-python-code","children":[{"title":"Terjemahan standar","anchor":"standard-translation","children":[]},{"title":"Komentar untuk penterjemah","anchor":"comments-for-translators","children":[]},{"title":"Marking strings as no-op","anchor":"marking-strings-as-no-op","children":[]},{"title":"Pluralization","anchor":"pluralization","children":[]},{"title":"Contextual markers","anchor":"contextual-markers","children":[]},{"title":"Terjemahan lazy","anchor":"lazy-translation","children":[{"title":"Model fields and relationships verbose_name and help_text option values","anchor":"model-fields-and-relationships-verbose-name-and-help-text-option-values","children":[]},{"title":"Model verbose names values","anchor":"model-verbose-names-values","children":[]},{"title":"Model methods short_description attribute values","anchor":"model-methods-short-description-attribute-values","children":[]}]},{"title":"Working with lazy translation objects","anchor":"working-with-lazy-translation-objects","children":[{"title":"Lazy translations and plural","anchor":"lazy-translations-and-plural","children":[]},{"title":"Membentuk string: format_lazy()","anchor":"formatting-strings-format-lazy","children":[]},{"title":"Other uses of lazy in delayed translations","anchor":"other-uses-of-lazy-in-delayed-translations","children":[]}]},{"title":"Localized names of languages","anchor":"localized-names-of-languages","children":[]}]},{"title":"Internationalization: in template code","anchor":"internationalization-in-template-code","children":[{"title":"Etiket cetakan trans","anchor":"trans-template-tag","children":[]},{"title":"Etiket cetakan blocktrans","anchor":"blocktrans-template-tag","children":[]},{"title":"String literals passed to tags and filters","anchor":"string-literals-passed-to-tags-and-filters","children":[]},{"title":"Komentar untuk penterjemah dalam cetakan","anchor":"comments-for-translators-in-templates","children":[]},{"title":"Mengganti bahasa dalam cetakan","anchor":"switching-language-in-templates","children":[]},{"title":"Etiket lain","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":"get_language_info","anchor":"get-language-info","children":[]},{"title":"get_language_info_list","anchor":"get-language-info-list","children":[]},{"title":"Filter templat","anchor":"template-filters","children":[]}]}]},{"title":"Internasionalisasi: dalam kode JavaScript","anchor":"internationalization-in-javascript-code","children":[{"title":"Tampilan JavaScriptCatalog","anchor":"module-django.views.i18n","children":[]},{"title":"Menggunakan katalog terjemahan 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":"Tampilan JSONCatalog","anchor":"the-jsoncatalog-view","children":[]},{"title":"Catatan pada penampilan","anchor":"note-on-performance","children":[]}]},{"title":"Internasionalisasi: dalam pola URL","anchor":"module-django.conf.urls.i18n","children":[{"title":"Awalan bahasa dalam pola URL","anchor":"language-prefix-in-url-patterns","children":[]},{"title":"Menterjemahkan pola URL","anchor":"translating-url-patterns","children":[]},{"title":"Membalikkan dalam cetakan-cetakan","anchor":"reversing-in-templates","children":[]}]},{"title":"Lokalisasi: bagaimana membuat berkas-berkas bahasa","anchor":"localization-how-to-create-language-files","children":[{"title":"Berkas pesan","anchor":"message-files","children":[]},{"title":"Menyusun berkas-berkas pesan","anchor":"compiling-message-files","children":[]},{"title":"Pemecahan masalah: gettext() tidak benar mengenali python-format dalam string-string dengan tanda persen","anchor":"troubleshooting-gettext-incorrectly-detects-python-format-in-strings-with-percent-signs","children":[]},{"title":"Membuat berkas pesan dari kode sumber JavaScript","anchor":"creating-message-files-from-javascript-source-code","children":[]},{"title":"gettext pada Windows","anchor":"gettext-on-windows","children":[]},{"title":"Menyesuaikan perintah makemessages","anchor":"customizing-the-makemessages-command","children":[]}]},{"title":"Bermacam-macam","anchor":"miscellaneous","children":[{"title":"Tampilan mengalihkan set_language","anchor":"the-set-language-redirect-view","children":[]},{"title":"Secara jelas mengatur bahasa aktif","anchor":"explicitly-setting-the-active-language","children":[]},{"title":"Menggunakan terjemahan diluar tampilan dan cetakan","anchor":"using-translations-outside-views-and-templates","children":[]},{"title":"Cookie bahasa","anchor":"language-cookie","children":[]}]},{"title":"Catatan penerapan","anchor":"implementation-notes","children":[{"title":"Keahlian khusus dari terjemahan Django","anchor":"specialties-of-django-translation","children":[]},{"title":"Bagaimana Django menemukan pilihan bahasa","anchor":"how-django-discovers-language-preference","children":[]},{"title":"Bagaimana Django menemukan terjemahan","anchor":"how-django-discovers-translations","children":[]},{"title":"Menggunakan bahasa dasar bukan-Inggris","anchor":"using-a-non-english-base-language","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/2.0/topics/"},{"docname":"topics/i18n/index","title":"Internasionalisasi dan lokalisasi","url":"/id/2.0/topics/i18n/"}],"prev":{"docname":"topics/i18n/index","title":"Internasionalisasi dan lokalisasi","url":"/id/2.0/topics/i18n/"},"next":{"docname":"topics/i18n/formatting","title":"Format localization","url":"/id/2.0/topics/i18n/formatting/"},"formats":{"html":"/id/2.0/topics/i18n/translation/","markdown":"/id/2.0/topics/i18n/translation.md","json":"/id/2.0/topics/i18n/translation.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/topics/i18n/translation.txt","official":"https://docs.djangoproject.com/id/2.0/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","pt-br","ko","es","el","pl"]}