{"title":"Terjemahan","version":"2.1","locale":"id","docname":"topics/i18n/translation","url":"/id/2.1/topics/i18n/translation/","canonical":"https://djangodocs.dev/id/2.1/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.1/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.1/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>Setelah ini selesai, Django mengambil aplikasi Jaringan terjemahan dengan cepat dalam setiap bahasa tersedia, menurut pada pilihan bahasa pengguna.</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.1/ref/settings/#std-setting-USE_I18N\"><code class=\"xref std std-setting docutils literal notranslate\">USE_I18N = False</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>Ada juga berdiri sendiri tetapi terkait pengaturan <code class=\"xref std std-setting docutils literal notranslate\">USE_I10N</code> yang mengendalikan jika Django harus  menerapkan bentuk lokalisasi. Lihat <a class=\"reference internal\" href=\"/id/2.1/topics/i18n/formatting/\"><span class=\"doc\">Format localization</span></a> untuk rincian lebih.</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.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</code></a> includes\n<a class=\"reference internal\" href=\"/id/2.1/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-mod docutils literal notranslate\">django.middleware.locale.LocaleMiddleware</code></a>). 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>Internasionalisasi: dalam kode Python<a class=\"heading-anchor\" href=\"#internationalization-in-python-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"standard-translation\">\n<h3>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.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a>. It's convention to import this\nas a shorter alias, <code class=\"docutils literal notranslate\">_</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\">u</code> prefixing of <code class=\"docutils literal notranslate\">gettext</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\">gettext</code> module installs <code class=\"docutils literal notranslate\">_()</code> into the\nglobal namespace, as an alias for <code class=\"docutils literal notranslate\">gettext()</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.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a>\nas the default translation method for a particular file. Without <code class=\"docutils literal notranslate\">_()</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\">_</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\">_()</code> function causes interference. Explicitly importing\n<code class=\"docutils literal notranslate\">gettext()</code> as <code class=\"docutils literal notranslate\">_()</code> avoids this problem.</p></li>\n</ol>\n</aside>\n<aside class=\"admonition-what-functions-may-be-aliased-as admonition\" role=\"note\">\n<p class=\"admonition-title\">Fungsi-fungsi apa mungkin dinama lainkan sebagai <code class=\"docutils literal notranslate\">_</code>?</p>\n<p>Because of how <code class=\"docutils literal notranslate\">xgettext</code> (used by <a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a>) works, only\nfunctions that take a single string argument can be imported as <code class=\"docutils literal notranslate\">_</code>:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a></p></li>\n</ul>\n</aside>\n<p>Di contoh ini, teks <code class=\"docutils literal notranslate\">&quot;Welcome to my site.&quot;</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext <span class=\"k\">as</span> _\n\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>Jelas, anda dapat mengkodekan ini tanpa menggunakan nama lain. Contoh ini mirip pada satu sebelumnya:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext\n\n<span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    output <span class=\"o\">=</span> gettext<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>Terjemahan bekerja pada nilai terhitung. Contoh ini adalah mirip pada dua sebelumnya:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    words <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"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    output <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s1\">&#39; &#39;</span><span class=\"o\">.</span>join<span class=\"p\">(</span>words<span class=\"p\">))</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>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=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    sentence <span class=\"o\">=</span> <span class=\"s1\">&#39;Welcome to my site.&#39;</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span>sentence<span class=\"p\">)</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>(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.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a>, won't be able to find\nthese strings. More on <a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> later.)</p>\n<p>The strings you pass to <code class=\"docutils literal notranslate\">_()</code> or <code class=\"docutils literal notranslate\">gettext()</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=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">,</span> m<span class=\"p\">,</span> d<span class=\"p\">):</span>\n    output <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"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> m<span class=\"p\">,</span> <span class=\"s1\">&#39;day&#39;</span><span class=\"p\">:</span> d<span class=\"p\">}</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>output<span class=\"p\">)</span>\n</code></pre></div>\n<p>This technique lets language-specific translations reorder the placeholder\ntext. For example, an English translation may be <code class=\"docutils literal notranslate\">&quot;Today is November 26.&quot;</code>,\nwhile a Spanish translation may be <code class=\"docutils literal notranslate\">&quot;Hoy es 26 de Noviembre.&quot;</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\">%(day)s</code>)\ninstead of positional interpolation (e.g., <code class=\"docutils literal notranslate\">%s</code> or <code class=\"docutils literal notranslate\">%d</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\">xgettext</code> command, only syntaxes\nsupported by <code class=\"docutils literal notranslate\">gettext</code> are supported by Django. Python <a class=\"reference external\" href=\"https://docs.python.org/3/reference/lexical_analysis.html#f-strings\" title=\"(di Python v3.14)\"><span class=\"xref std std-ref\">f-strings</span></a> and <a class=\"reference external\" href=\"https://savannah.gnu.org/bugs/?50920\">JavaScript template strings</a> are not yet supported by\n<code class=\"docutils literal notranslate\">xgettext</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>Jika anda ingin membeirkan petunjuk penterjemah mengenai string dapat diterjemahkan, anda dapat menambahkan awalan komentar dengan kata kunci <code class=\"docutils literal notranslate\">Translators</code> pada baris mendahului string, misalnya:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">my_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># Translators: This message appears on the home page only</span>\n    output <span class=\"o\">=</span> gettext<span class=\"p\">(</span><span class=\"s2\">&quot;Welcome to my site.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>The comment will then appear in the resulting <code class=\"docutils literal notranslate\">.po</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\">.po</code>:</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"c1\">#. Translators: This message appears on the home page only</span>\n<span class=\"c1\"># path/to/python/file.py:123</span>\n<span class=\"nv\">msgid</span> <span class=\"s\">&quot;Welcome to my site.&quot;</span>\n<span class=\"nv\">msgstr</span> <span class=\"s\">&quot;&quot;</span>\n</code></pre></div>\n</aside>\n<p>Ini juga bekerja dalam cetakan. Lihat <a class=\"reference internal\" href=\"#translator-comments-in-templates\"><span class=\"std std-ref\">Komentar untuk penterjemah dalam cetakan</span></a> untuk rincian lebih.</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.1/ref/utils/#django.utils.translation.gettext_noop\" title=\"django.utils.translation.gettext_noop\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.gettext_noop()</code></a> 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>Pluralisasi<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.1/ref/utils/#django.utils.translation.ngettext\" title=\"django.utils.translation.ngettext\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.ngettext()</code></a> to specify\npluralized messages.</p>\n<p><code class=\"docutils literal notranslate\">ngettext()</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\">count</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext\n\n<span class=\"k\">def</span> <span class=\"nf\">hello_world</span><span class=\"p\">(</span>request<span class=\"p\">,</span> count<span class=\"p\">):</span>\n    page <span class=\"o\">=</span> ngettext<span class=\"p\">(</span>\n        <span class=\"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    count<span class=\"p\">)</span> <span class=\"o\">%</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;count&#39;</span><span class=\"p\">:</span> count<span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span>page<span class=\"p\">)</span>\n</code></pre></div>\n<p>Dalam contoh ini sejumlah obyek dilewatkan ke bahasa terjemahan sebagai variabel <code class=\"docutils literal notranslate\">count</code>.</p>\n<p>Note that pluralization is complicated and works differently in each language.\nComparing <code class=\"docutils literal notranslate\">count</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=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Report\n\ncount <span class=\"o\">=</span> Report<span class=\"o\">.</span>objects<span class=\"o\">.</span>count<span class=\"p\">()</span>\n<span class=\"k\">if</span> count <span class=\"o\">==</span> <span class=\"mi\">1</span><span class=\"p\">:</span>\n    name <span class=\"o\">=</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name\n<span class=\"k\">else</span><span class=\"p\">:</span>\n    name <span class=\"o\">=</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name_plural\n\ntext <span class=\"o\">=</span> ngettext<span class=\"p\">(</span>\n    <span class=\"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    count\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> count<span class=\"p\">,</span>\n    <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> name\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>text <span class=\"o\">=</span> ngettext<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    count\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> count<span class=\"p\">,</span>\n    <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name<span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" id=\"pluralization-var-notes\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>When using <code class=\"docutils literal notranslate\">ngettext()</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\">name</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>text <span class=\"o\">=</span> ngettext<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    count\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> Report<span class=\"o\">.</span>objects<span class=\"o\">.</span>count<span class=\"p\">(),</span>\n    <span class=\"s1\">&#39;name&#39;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name<span class=\"p\">,</span>\n    <span class=\"s1\">&#39;plural_name&#39;</span><span class=\"p\">:</span> Report<span class=\"o\">.</span>_meta<span class=\"o\">.</span>verbose_name_plural\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\">django-admin compilemessages 1</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>a <span class=\"nb\">format</span> specification <span class=\"k\">for</span> argument <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> doesn<span class=\"s1\">&#39;t exist in &#39;</span>msgid<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>Formulir jamak dan berkas-berkas po</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\">django/conf/locale/&lt;lang_code&gt;/LC_MESSAGES/django.po</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\">&quot;May&quot;</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.1/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.pgettext()</code></a> function, or the\n<a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.npgettext()</code></a> 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\">.po</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\">msgctxt</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=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> pgettext\n\nmonth <span class=\"o\">=</span> pgettext<span class=\"p\">(</span><span class=\"s2\">&quot;month name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;May&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> pgettext_lazy\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>help_text<span class=\"o\">=</span>pgettext_lazy<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\">.po</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\">trans</code></a> and\n<a class=\"reference internal\" href=\"#std-templatetag-blocktrans\"><code class=\"xref std std-ttag docutils literal notranslate\">blocktrans</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\">django.utils.translation</code></a> (easily recognizable by the <code class=\"docutils literal notranslate\">lazy</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>Bidang-bidang model dan hubungan nilai pilihan <code class=\"docutils literal notranslate\">verbose_name</code> dan <code class=\"docutils literal notranslate\">help_text</code><a class=\"heading-anchor\" href=\"#model-fields-and-relationships-verbose-name-and-help-text-option-values\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Seabgai contoh, untuk menterjemahkan teks bantuan dari bidang <em>name</em> dalam model berikut, lakukan berikut:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>help_text<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"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.1/ref/models/fields/#django.db.models.ForeignKey\" title=\"django.db.models.ForeignKey\"><code class=\"xref py py-class docutils literal notranslate\">ForeignKey</code></a>,\n<a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\">ManyToManyField</code></a> or\n<a class=\"reference internal\" href=\"/id/2.1/ref/models/fields/#django.db.models.OneToOneField\" title=\"django.db.models.OneToOneField\"><code class=\"xref py py-class docutils literal notranslate\">OneToOneField</code></a> relationship as translatable by using\ntheir <a class=\"reference internal\" href=\"/id/2.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</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=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    kind <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        ThingKind<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s1\">&#39;kinds&#39;</span><span class=\"p\">,</span>\n        verbose_name<span class=\"o\">=</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.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</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.1/ref/models/options/#django.db.models.Options.verbose_name\" title=\"django.db.models.Options.verbose_name\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name</code></a> and\n<a class=\"reference internal\" href=\"/id/2.1/ref/models/options/#django.db.models.Options.verbose_name_plural\" title=\"django.db.models.Options.verbose_name_plural\"><code class=\"xref py py-attr docutils literal notranslate\">verbose_name_plural</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">),</span> help_text<span class=\"o\">=</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=\"nc\">Meta</span><span class=\"p\">:</span>\n        verbose_name <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s1\">&#39;my thing&#39;</span><span class=\"p\">)</span>\n        verbose_name_plural <span class=\"o\">=</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\">short_description</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>Untuk metode model, anda dapat menyediakan terjemahan pada Django dan situs admin dengan atribut <code class=\"docutils literal notranslate\">short_description</code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    kind <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span>\n        ThingKind<span class=\"p\">,</span>\n        on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">,</span>\n        related_name<span class=\"o\">=</span><span class=\"s1\">&#39;kinds&#39;</span><span class=\"p\">,</span>\n        verbose_name<span class=\"o\">=</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=\"nf\">is_mouse</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>kind<span class=\"o\">.</span>type <span class=\"o\">==</span> MOUSE_TYPE\n    is_mouse<span class=\"o\">.</span>short_description <span class=\"o\">=</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>Bekerja dengan obyek-obyek terjemahan lazy<a class=\"heading-anchor\" href=\"#working-with-lazy-translation-objects\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The result of a <code class=\"docutils literal notranslate\">gettext_lazy()</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\">str</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\">gettext_lazy</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>body <span class=\"o\">=</span> gettext_lazy<span class=\"p\">(</span><span class=\"s2\">&quot;I </span><span class=\"se\">\\u2764</span><span class=\"s2\"> Django&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># (unicode :heart:)</span>\nrequests<span class=\"o\">.</span>post<span class=\"p\">(</span><span class=\"s1\">&#39;https://example.com/send&#39;</span><span class=\"p\">,</span> data<span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;body&#39;</span><span class=\"p\">:</span> body<span class=\"p\">})</span>\n</code></pre></div>\n<p>You can avoid such problems by casting <code class=\"docutils literal notranslate\">gettext_lazy()</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>requests<span class=\"o\">.</span>post<span class=\"p\">(</span><span class=\"s1\">&#39;https://example.com/send&#39;</span><span class=\"p\">,</span> data<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>body<span class=\"p\">)})</span>\n</code></pre></div>\n<p>If you don't like the long <code class=\"docutils literal notranslate\">gettext_lazy</code> name, you can just alias it as\n<code class=\"docutils literal notranslate\">_</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=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"k\">class</span> <span class=\"nc\">MyThing</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>help_text<span class=\"o\">=</span>_<span class=\"p\">(</span><span class=\"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\">gettext_lazy()</code> and <code class=\"docutils literal notranslate\">ngettext_lazy()</code> to mark strings in models\nand utility functions is a common operation. When you're working with these\nobjects elsewhere in your code, you should ensure that you don't accidentally\nconvert them to strings, because they should be converted as late as possible\n(so that the correct locale is in effect). This necessitates the use of the\nhelper function described next.</p>\n<section id=\"lazy-translations-and-plural\">\n<span id=\"lazy-plural-translations\"></span><h4>Lazy translations and plural<a class=\"heading-anchor\" href=\"#lazy-translations-and-plural\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>When using lazy translation for a plural string (<code class=\"docutils literal notranslate\">[u]n[p]gettext_lazy</code>), you\ngenerally don't know the <code class=\"docutils literal notranslate\">number</code> argument at the time of the string\ndefinition. Therefore, you are authorized to pass a key name instead of an\ninteger as the <code class=\"docutils literal notranslate\">number</code> argument. Then <code class=\"docutils literal notranslate\">number</code> will be looked up in the\ndictionary under that key during string interpolation. Here's example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> ngettext_lazy\n\n<span class=\"k\">class</span> <span class=\"nc\">MyForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    error_message <span class=\"o\">=</span> ngettext_lazy<span class=\"p\">(</span><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=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> error<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> forms<span class=\"o\">.</span>ValidationError<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>error_message <span class=\"o\">%</span> <span class=\"p\">{</span><span class=\"s1\">&#39;num&#39;</span><span class=\"p\">:</span> number<span class=\"p\">})</span>\n</code></pre></div>\n<p>If the string contains exactly one unnamed placeholder, you can interpolate\ndirectly with the <code class=\"docutils literal notranslate\">number</code> argument:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    error_message <span class=\"o\">=</span> ngettext_lazy<span class=\"p\">(</span>\n        <span class=\"s2\">&quot;You provided </span><span class=\"si\">%d</span><span class=\"s2\"> argument&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;You provided </span><span class=\"si\">%d</span><span class=\"s2\"> arguments&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"k\">if</span> error<span class=\"p\">:</span>\n            <span class=\"k\">raise</span> forms<span class=\"o\">.</span>ValidationError<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>error_message <span class=\"o\">%</span> number<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"formatting-strings-format-lazy\">\n<h4>Membentuk string: <code class=\"docutils literal notranslate\">format_lazy()</code><a class=\"heading-anchor\" href=\"#formatting-strings-format-lazy\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Python's <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(di Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">str.format()</code></a> method will not work when either the\n<code class=\"docutils literal notranslate\">format_string</code> or any of the arguments to <a class=\"reference external\" href=\"https://docs.python.org/3/library/stdtypes.html#str.format\" title=\"(di Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">str.format()</code></a>\ncontains lazy translation objects. Instead, you can use\n<a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.text.format_lazy\" title=\"django.utils.text.format_lazy\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.text.format_lazy()</code></a>, which creates a lazy object\nthat runs the <code class=\"docutils literal notranslate\">str.format()</code> method only when the result is included\nin a string. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.text</span> <span class=\"kn\">import</span> format_lazy\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy\n<span class=\"o\">...</span>\nname <span class=\"o\">=</span> gettext_lazy<span class=\"p\">(</span><span class=\"s1\">&#39;John Lennon&#39;</span><span class=\"p\">)</span>\ninstrument <span class=\"o\">=</span> gettext_lazy<span class=\"p\">(</span><span class=\"s1\">&#39;guitar&#39;</span><span class=\"p\">)</span>\nresult <span class=\"o\">=</span> format_lazy<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> name<span class=\"o\">=</span>name<span class=\"p\">,</span> instrument<span class=\"o\">=</span>instrument<span class=\"p\">)</span>\n</code></pre></div>\n<p>In this case, the lazy translations in <code class=\"docutils literal notranslate\">result</code> will only be converted to\nstrings when <code class=\"docutils literal notranslate\">result</code> itself is used in a string (usually at template\nrendering time).</p>\n</section>\n<section id=\"other-uses-of-lazy-in-delayed-translations\">\n<h4>Lainnya menggunakan lazy dalam terjemahan tertunda<a class=\"heading-anchor\" href=\"#other-uses-of-lazy-in-delayed-translations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>For any other case where you would like to delay the translation, but have to\npass the translatable string as argument to another function, you can wrap\nthis function inside a lazy call yourself. For example:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.functional</span> <span class=\"kn\">import</span> lazy\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.safestring</span> <span class=\"kn\">import</span> mark_safe\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\nmark_safe_lazy <span class=\"o\">=</span> lazy<span class=\"p\">(</span>mark_safe<span class=\"p\">,</span> <span class=\"nb\">str</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>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>lazy_string <span class=\"o\">=</span> mark_safe_lazy<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s2\">&quot;&lt;p&gt;My &lt;strong&gt;string!&lt;/strong&gt;&lt;/p&gt;&quot;</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"localized-names-of-languages\">\n<h3>Lokalisasi nama-nama dari bahasa<a class=\"heading-anchor\" href=\"#localized-names-of-languages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.utils.translation.get_language_info\">\n<span class=\"sig-name descname\">get_language_info</span><span class=\"sig-paren\">(</span><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\">get_language_info()</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=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> activate<span class=\"p\">,</span> get_language_info\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s1\">&#39;fr&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>li <span class=\"o\">=</span> get_language_info<span class=\"p\">(</span><span class=\"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>li<span class=\"p\">[</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">],</span> li<span class=\"p\">[</span><span class=\"s1\">&#39;name_local&#39;</span><span class=\"p\">],</span> li<span class=\"p\">[</span><span class=\"s1\">&#39;name_translated&#39;</span><span class=\"p\">],</span> li<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\">name</code>, <code class=\"docutils literal notranslate\">name_local</code>, and <code class=\"docutils literal notranslate\">name_translated</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\">bidi</code>\nattribute is True only for bi-directional languages.</p>\n<p>Sumber dari informasi bahasa adalah modul <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>django.conf.locale`. Akses mirip pada informasi ini tersedia untuk kode cetakan. Lihat dibawah.</p>\n</section>\n</section>\n<section id=\"internationalization-in-template-code\">\n<span id=\"specifying-translation-strings-in-template-code\"></span><h2>Internasionalisasi: dalam kode cetakan<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.1/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\">{% load i18n %}</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\">i18n</code> tag.</p>\n<section id=\"trans-template-tag\">\n<span id=\"std-templatetag-trans\"></span><h3>Etiket cetakan <code class=\"docutils literal notranslate\">trans</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\">{% trans %}</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\">noop</code> option is present, variable lookup still takes place but the\ntranslation is skipped. This is useful when &quot;stubbing out&quot; content that will\nrequire translation in the future:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"p\">&lt;</span><span class=\"nt\">title</span><span class=\"p\">&gt;</span><span class=\"cp\">{%</span> <span class=\"k\">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.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> call.</p>\n<p>In case a template var (<code class=\"docutils literal notranslate\">myvar</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\">{% trans\n%}</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\">{% blocktrans %}</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\">{% trans %}</code> also supports <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">contextual markers</span></a>\nusing the <code class=\"docutils literal notranslate\">context</code> keyword:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">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\">blocktrans</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\">trans</code></a> tag, the <code class=\"docutils literal notranslate\">blocktrans</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>Anda dapat menggunakanbanyak pernyataan dalam etiket <code class=\"docutils literal notranslate\">blocktrans</code> tunggal:</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\">{% blocktrans with book|title as book_t and author|title as author_t %}</code></p>\n</aside>\n<p>Other block tags (for example <code class=\"docutils literal notranslate\">{% for %}</code> or <code class=\"docutils literal notranslate\">{% if %}</code>) are not allowed\ninside a <code class=\"docutils literal notranslate\">blocktrans</code> tag.</p>\n<p>If resolving one of the block arguments fails, <code class=\"docutils literal notranslate\">blocktrans</code> will fall back to\nthe default language by deactivating the currently active language\ntemporarily with the <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.deactivate_all\" title=\"django.utils.translation.deactivate_all\"><code class=\"xref py py-func docutils literal notranslate\">deactivate_all()</code></a>\nfunction.</p>\n<p>This tag also provides for pluralization. To use it:</p>\n<ul class=\"simple\">\n<li><p>Designate and bind a counter value with the name <code class=\"docutils literal notranslate\">count</code>. This value will\nbe the one used to select the right plural form.</p></li>\n<li><p>Specify both the singular and plural forms separating them with the\n<code class=\"docutils literal notranslate\">{% plural %}</code> tag within the <code class=\"docutils literal notranslate\">{% blocktrans %}</code> and\n<code class=\"docutils literal notranslate\">{% endblocktrans %}</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>Sebuah contoh lebih rumit:</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\">blocktrans</code>\nconstruct is internally converted to an <code class=\"docutils literal notranslate\">ngettext</code> call. This means the\nsame <a class=\"reference internal\" href=\"#pluralization-var-notes\"><span class=\"std std-ref\">notes regarding ngettext variables</span></a>\napply.</p>\n<p>Reverse URL lookups cannot be carried out within the <code class=\"docutils literal notranslate\">blocktrans</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\">{% blocktrans %}</code> juga mendukung <a class=\"reference internal\" href=\"#contextual-markers\"><span class=\"std std-ref\">contextual markers</span></a> menggunakan kata kunci <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>context`:</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\">{% blocktrans %}</code> fitur lain adalah pilihan <code class=\"docutils literal notranslate\">trimmed</code>. Pilihan ini akan memindahkan karakter baris baru dari awal dan akhir dari isi dari etiket <code class=\"docutils literal notranslate\">{% blocktrans %}</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\">{% blocktrans %}</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\">{% blocktrans %}</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\">&quot;First sentence. Second paragraph.&quot;</code> in the PO file,\ncompared to <code class=\"docutils literal notranslate\">&quot;\\n&#160; First sentence.\\n&#160; Second sentence.\\n&quot;</code>, if the <code class=\"docutils literal notranslate\">trimmed</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\">_()</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\">&quot;yes,no&quot;</code>, not the individual strings <code class=\"docutils literal notranslate\">&quot;yes&quot;</code> and <code class=\"docutils literal notranslate\">&quot;no&quot;</code>. The\ntranslated string will need to contain the comma so that the filter\nparsing code knows how to split up the arguments. For example, a German\ntranslator might translate the string <code class=\"docutils literal notranslate\">&quot;yes,no&quot;</code> as <code class=\"docutils literal notranslate\">&quot;ja,nein&quot;</code>\n(keeping the comma intact).</p>\n</aside>\n</section>\n<section id=\"comments-for-translators-in-templates\">\n<span id=\"translator-comments-in-templates\"></span><h3>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.1/ref/templates/builtins/#std-templatetag-comment\"><code class=\"xref std std-ttag docutils literal notranslate\">comment</code></a>\ntag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">comment</span> <span class=\"cp\">%}</span><span class=\"c\">Translators: View verb</span><span class=\"cp\">{%</span> <span class=\"k\">endcomment</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">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>atau dengan <code class=\"docutils literal notranslate\">{#</code> ... <code class=\"docutils literal notranslate\">#}</code> <a class=\"reference internal\" href=\"/id/2.1/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\">.po</code>:</p>\n<div class=\"code-block\" data-language=\"po\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Po</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Po code\"><code><span class=\"c1\">#. Translators: 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\">language</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=\"i18n-template-tags\"></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\">{% memuat i18n %}</code>.</p>\n<section id=\"get-available-languages\">\n<span id=\"std-templatetag-get_available_languages\"></span><h4><code class=\"docutils literal notranslate\">get_available_languages</code><a class=\"heading-anchor\" href=\"#get-available-languages\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">{% get_available_languages as LANGUAGES %}</code> returns a list of tuples in\nwhich the first element is the <a class=\"reference internal\" href=\"/id/2.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language code</span></a> and the second is the\nlanguage name (translated into the currently active locale).</p>\n</section>\n<section id=\"get-current-language\">\n<span id=\"std-templatetag-get_current_language\"></span><h4><code class=\"docutils literal notranslate\">get_current_language</code><a class=\"heading-anchor\" href=\"#get-current-language\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">{% get_current_language as LANGUAGE_CODE %}</code> returns the current user's\npreferred language as a string. Example: <code class=\"docutils literal notranslate\">en-us</code>. See\n<a class=\"reference internal\" href=\"#how-django-discovers-language-preference\"><span class=\"std std-ref\">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\">get_current_language_bidi</code><a class=\"heading-anchor\" href=\"#get-current-language-bidi\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\">{% get_current_language_bidi as LANGUAGE_BIDI %}</code> returns the current\nlocale's direction. If <code class=\"docutils literal notranslate\">True</code>, it's a right-to-left language, e.g. Hebrew,\nArabic. If <code class=\"docutils literal notranslate\">False</code> it's a left-to-right language, e.g. English, French,\nGerman, etc.</p>\n</section>\n<section id=\"i18n-context-processor\">\n<span id=\"template-translation-vars\"></span><h4><code class=\"docutils literal notranslate\">i18n</code> context processor<a class=\"heading-anchor\" href=\"#i18n-context-processor\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>If you enable the <a class=\"reference internal\" href=\"/id/2.1/ref/templates/api/#django.template.context_processors.i18n\" title=\"django.template.context_processors.i18n\"><code class=\"xref py py-class docutils literal notranslate\">django.template.context_processors.i18n</code></a> context\nprocessor, then each <code class=\"docutils literal notranslate\">RequestContext</code> will have access to <code class=\"docutils literal notranslate\">LANGUAGES</code>,\n<code class=\"docutils literal notranslate\">LANGUAGE_CODE</code>, and <code class=\"docutils literal notranslate\">LANGUAGE_BIDI</code> as defined above.</p>\n</section>\n<section id=\"get-language-info\">\n<span id=\"std-templatetag-get_language_info\"></span><h4><code class=\"docutils literal notranslate\">get_language_info</code><a class=\"heading-anchor\" href=\"#get-language-info\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>You can also retrieve information about any of the available languages using\nprovided template tags and filters. To get information about a single language,\nuse the <code class=\"docutils literal notranslate\">{% get_language_info %}</code> tag:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"nv\">LANGUAGE_CODE</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">get_language_info</span> <span class=\"nv\">for</span> <span class=\"s2\">&quot;pl&quot;</span> <span class=\"k\">as</span> <span class=\"nv\">lang</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>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\">get_language_info_list</code><a class=\"heading-anchor\" href=\"#get-language-info-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>You can also use the <code class=\"docutils literal notranslate\">{% get_language_info_list %}</code> template tag to retrieve\ninformation for a list of languages (e.g. active languages as specified in\n<a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a>). See <a class=\"reference internal\" href=\"#set-language-redirect-view\"><span class=\"std std-ref\">the section about the set_language redirect\nview</span></a> for an example of how to display a language\nselector using <code class=\"docutils literal notranslate\">{% get_language_info_list %}</code>.</p>\n<p>Dalam tambahan pada daftar gaya <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> dari tuple, <code class=\"docutils literal notranslate\">{% get_language_info_list %}</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>context <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> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s1\">&#39;mytemplate.html&#39;</span><span class=\"p\">,</span> context<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>Ada juga penyaring sederhana tersedia untuk kenyamanan:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_name }}</code> (&quot;German&quot;)</p></li>\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_name_local }}</code> (&quot;Deutsch&quot;)</p></li>\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_bidi }}</code> (False)</p></li>\n<li><p><code class=\"docutils literal notranslate\">{{ LANGUAGE_CODE|language_name_translated }}</code> (&quot;německy&quot;, 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\">gettext</code>.</p></li>\n<li><p>Kode JavaScript tidak mempunyai akses ke berkas <code class=\"docutils literal notranslate\">.po</code> or <code class=\"docutils literal notranslate\">.mo</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\">gettext</code>, etc., from within\nJavaScript.</p>\n<p>The main solution to these problems is the following <code class=\"docutils literal notranslate\">JavaScriptCatalog</code> view,\nwhich generates a JavaScript code library with functions that mimic the\n<code class=\"docutils literal notranslate\">gettext</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\">JavaScriptCatalog</code><a class=\"heading-anchor\" href=\"#module-django.views.i18n\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">JavaScriptCatalog</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A view that produces a JavaScript code library with functions that mimic\nthe <code class=\"docutils literal notranslate\">gettext</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\">domain</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog.domain\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Translation domain containing strings to add in the view output.\nDefaults to <code class=\"docutils literal notranslate\">'djangojs'</code>.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JavaScriptCatalog.packages\">\n<span class=\"sig-name descname\">packages</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JavaScriptCatalog.packages\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>A list of <a class=\"reference internal\" href=\"/id/2.1/ref/applications/#django.apps.AppConfig.name\" title=\"django.apps.AppConfig.name\"><code class=\"xref py py-attr docutils literal notranslate\">application names</code></a> among\ninstalled applications. Those apps should contain a <code class=\"docutils literal notranslate\">locale</code>\ndirectory. All those catalogs plus all catalogs found in\n<a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> (which are always included) are merged into one\ncatalog. Defaults to <code class=\"docutils literal notranslate\">None</code>, which means that all available\ntranslations from all <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</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=\"nn\">django.views.i18n</span> <span class=\"kn\">import</span> JavaScriptCatalog\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;jsi18n/&#39;</span><span class=\"p\">,</span> JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<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>urlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;jsi18n/myapp/&#39;</span><span class=\"p\">,</span>\n         JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">(</span>packages<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;your.app.label&#39;</span><span class=\"p\">]),</span>\n         name<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\">i18n_patterns()</code></a>,\n<code class=\"docutils literal notranslate\">JavaScriptCatalog</code> must also be wrapped by <code class=\"docutils literal notranslate\">i18n_patterns()</code> for the\ncatalog to be correctly generated.</p>\n<p><strong>Example with</strong> <code class=\"docutils literal notranslate\">i18n_patterns()</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=\"nn\">django.conf.urls.i18n</span> <span class=\"kn\">import</span> i18n_patterns\n\nurlpatterns <span class=\"o\">=</span> i18n_patterns<span class=\"p\">(</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;jsi18n/&#39;</span><span class=\"p\">,</span> JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">(),</span> name<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\">packages</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\">JavaScriptCatalog</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\">gettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">ngettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">interpolate</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">get_format</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">gettext_noop</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">pgettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">npgettext</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">pluralidx</code></p></li>\n</ul>\n<section id=\"gettext\">\n<h4><code class=\"docutils literal notranslate\">gettext</code><a class=\"heading-anchor\" href=\"#gettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">gettext</code> function behaves similarly to the standard <code class=\"docutils literal notranslate\">gettext</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\">ngettext</code><a class=\"heading-anchor\" href=\"#ngettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">ngettext</code> function provides an interface to pluralize words and\nphrases:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"kd\">var</span> <span class=\"nx\">object_count</span> <span class=\"o\">=</span> <span class=\"mf\">1</span> <span class=\"c1\">// or 0, or 2, or 3, ...</span>\n<span class=\"nx\">s</span> <span class=\"o\">=</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=\"s1\">&#39;literal for the plural case&#39;</span><span class=\"p\">,</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\">interpolate</code><a class=\"heading-anchor\" href=\"#interpolate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The <code class=\"docutils literal notranslate\">interpolate</code> function supports dynamically populating a format string.\nThe interpolation syntax is borrowed from Python, so the <code class=\"docutils literal notranslate\">interpolate</code>\nfunction supports both positional and named interpolation:</p>\n<ul>\n<li><p>Penempatan penambahan: <code class=\"docutils literal notranslate\">obj</code> mengandung obyek Senarai JavaScript yang unsur-unsurnya kemudian berurutan ditambahkan dalam palceholder <code class=\"docutils literal notranslate\">fmt</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=\"o\">=</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=\"s1\">&#39;There are %s objects. Remaining: %s&#39;</span><span class=\"p\">,</span> <span class=\"mf\">11</span><span class=\"p\">);</span>\n<span class=\"nx\">s</span> <span class=\"o\">=</span> <span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">fmts</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mf\">11</span><span class=\"p\">,</span> <span class=\"mf\">20</span><span class=\"p\">]);</span>\n<span class=\"c1\">// 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\">named</code> parameter as <code class=\"docutils literal notranslate\">true</code>. <code class=\"docutils literal notranslate\">obj</code> contains a JavaScript\nobject or associative array. For example:</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nx\">d</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"nx\">count</span><span class=\"o\">:</span> <span class=\"mf\">10</span><span class=\"p\">,</span>\n    <span class=\"nx\">total</span><span class=\"o\">:</span> <span class=\"mf\">50</span>\n<span class=\"p\">};</span>\n\n<span class=\"nx\">fmts</span> <span class=\"o\">=</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=\"nx\">d</span><span class=\"p\">.</span><span class=\"nx\">count</span><span class=\"p\">);</span>\n<span class=\"nx\">s</span> <span class=\"o\">=</span> <span class=\"nx\">interpolate</span><span class=\"p\">(</span><span class=\"nx\">fmts</span><span class=\"p\">,</span> <span class=\"nx\">d</span><span class=\"p\">,</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\">ngettext</code>\nto produce proper pluralizations).</p>\n</section>\n<section id=\"get-format\">\n<h4><code class=\"docutils literal notranslate\">get_format</code><a class=\"heading-anchor\" href=\"#get-format\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Fungsi <code class=\"docutils literal notranslate\">get_format</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.1/ref/settings/#std-setting-DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-DATE_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATE_INPUT_FORMATS</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">DATETIME_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-DATETIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">DATETIME_INPUT_FORMATS</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-DECIMAL_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\">DECIMAL_SEPARATOR</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-FIRST_DAY_OF_WEEK\"><code class=\"xref std std-setting docutils literal notranslate\">FIRST_DAY_OF_WEEK</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-MONTH_DAY_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">MONTH_DAY_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-NUMBER_GROUPING\"><code class=\"xref std std-setting docutils literal notranslate\">NUMBER_GROUPING</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-SHORT_DATE_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">SHORT_DATE_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-SHORT_DATETIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">SHORT_DATETIME_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-THOUSAND_SEPARATOR\"><code class=\"xref std std-setting docutils literal notranslate\">THOUSAND_SEPARATOR</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-TIME_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_FORMAT</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-TIME_INPUT_FORMATS\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_INPUT_FORMATS</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-YEAR_MONTH_FORMAT\"><code class=\"xref std std-setting docutils literal notranslate\">YEAR_MONTH_FORMAT</code></a></p></li>\n</ul>\n<p>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\">gettext_noop</code><a class=\"heading-anchor\" href=\"#gettext-noop\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Ini menandingin fungsi <code class=\"docutils literal notranslate\">gettext</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\">pgettext</code><a class=\"heading-anchor\" href=\"#pgettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Fungsi <code class=\"docutils literal notranslate\">pgettext</code> berperilaku seperti ragam Python (<a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.pgettext\" title=\"django.utils.translation.pgettext\"><code class=\"xref py py-func docutils literal notranslate\">pgettext()</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=\"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\">npgettext</code><a class=\"heading-anchor\" href=\"#npgettext\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Fungsi <code class=\"docutils literal notranslate\">npgettext</code> juga berperilaku seperti ragam Python (<a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.npgettext\" title=\"django.utils.translation.npgettext\"><code class=\"xref py py-func docutils literal notranslate\">npgettext()</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=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span> <span class=\"mf\">1</span><span class=\"p\">));</span>\n<span class=\"c1\">// party</span>\n<span class=\"nb\">document</span><span class=\"p\">.</span><span class=\"nx\">write</span><span class=\"p\">(</span><span class=\"nx\">npgettext</span><span class=\"p\">(</span><span class=\"s1\">&#39;group&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;party&#39;</span><span class=\"p\">,</span> <span class=\"mf\">2</span><span class=\"p\">));</span>\n<span class=\"c1\">// parties</span>\n</code></pre></div>\n</section>\n<section id=\"pluralidx\">\n<h4><code class=\"docutils literal notranslate\">pluralidx</code><a class=\"heading-anchor\" href=\"#pluralidx\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Fungsi <code class=\"docutils literal notranslate\">pluralidx</code> bekerja dalam cara sama pada penyaring cetakan <a class=\"reference internal\" href=\"/id/2.1/ref/templates/builtins/#std-templatefilter-pluralize\"><code class=\"xref std std-tfilter docutils literal notranslate\">pluralize</code></a>, menentukan jika <code class=\"docutils literal notranslate\">count</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\">false</code> untuk integer <code class=\"docutils literal notranslate\">1</code> dan <code class=\"docutils literal notranslate\">true</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\">True</code> (harus jamak) atau <code class=\"docutils literal notranslate\">false</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\">JSONCatalog</code><a class=\"heading-anchor\" href=\"#the-jsoncatalog-view\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.views.i18n.JSONCatalog\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">JSONCatalog</span><a class=\"heading-anchor\" href=\"#django.views.i18n.JSONCatalog\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Untuk menggunakan pustaka sisi-klien lain untuk menangani terjemahan, anda mungkin ingin mengambil keuntungan dari tampilan <code class=\"docutils literal notranslate\">JSONCatalog</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\">JavaScriptCatalog</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\">JavaScriptCatalog</code></a> untuk belajar tentang kemungkinan nilai-nilai dan penggunaan dari atribut-atribut <code class=\"docutils literal notranslate\">domain</code> dan <code class=\"docutils literal notranslate\">packages</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\">.mo</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.1/topics/cache/#django.views.decorators.cache.cache_page\" title=\"django.views.decorators.cache.cache_page\"><code class=\"xref py py-func docutils literal notranslate\">cache_page()</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=\"nn\">django.views.decorators.cache</span> <span class=\"kn\">import</span> cache_page\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.i18n</span> <span class=\"kn\">import</span> JavaScriptCatalog\n\n<span class=\"c1\"># The value returned by get_version() must change when translations change.</span>\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;jsi18n/&#39;</span><span class=\"p\">,</span>\n         cache_page<span class=\"p\">(</span><span class=\"mi\">86400</span><span class=\"p\">,</span> key_prefix<span class=\"o\">=</span><span class=\"s1\">&#39;js18n-</span><span class=\"si\">%s</span><span class=\"s1\">&#39;</span> <span class=\"o\">%</span> get_version<span class=\"p\">())(</span>JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">()),</span>\n         name<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.1/ref/middleware/#django.middleware.http.ConditionalGetMiddleware\" title=\"django.middleware.http.ConditionalGetMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">ConditionalGetMiddleware</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=\"nn\">django.utils</span> <span class=\"kn\">import</span> timezone\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.decorators.http</span> <span class=\"kn\">import</span> last_modified\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.i18n</span> <span class=\"kn\">import</span> JavaScriptCatalog\n\nlast_modified_date <span class=\"o\">=</span> timezone<span class=\"o\">.</span>now<span class=\"p\">()</span>\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;jsi18n/&#39;</span><span class=\"p\">,</span>\n         last_modified<span class=\"p\">(</span><span class=\"k\">lambda</span> req<span class=\"p\">,</span> <span class=\"o\">**</span>kw<span class=\"p\">:</span> last_modified_date<span class=\"p\">)(</span>JavaScriptCatalog<span class=\"o\">.</span>as_view<span class=\"p\">()),</span>\n         name<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.1/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">LocaleMiddleware</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.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.gettext_lazy()</code></a>.</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.1/ref/middleware/#django.middleware.locale.LocaleMiddleware\" title=\"django.middleware.locale.LocaleMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">django.middleware.locale.LocaleMiddleware</code></a> dalam pengaturan <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</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\">i18n_patterns</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>urls</em>, <em class=\"sig-param\">prefix_default_language<span class=\"o\">=</span><span class=\"default_value\">True</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.conf.urls.i18n.i18n_patterns\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>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\">i18n_patterns()</code></a>.</p>\n<p>Mengatur <code class=\"docutils literal notranslate\">prefix_default_language</code> menjadi <code class=\"docutils literal notranslate\">False</code> memindahkan awalan dari bahasa awalan (<a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</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=\"nn\">django.conf.urls.i18n</span> <span class=\"kn\">import</span> i18n_patterns\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> include<span class=\"p\">,</span> path\n\n<span class=\"kn\">from</span> <span class=\"nn\">about</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> about_views\n<span class=\"kn\">from</span> <span class=\"nn\">news</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> news_views\n<span class=\"kn\">from</span> <span class=\"nn\">sitemap.views</span> <span class=\"kn\">import</span> sitemap\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;sitemap.xml&#39;</span><span class=\"p\">,</span> sitemap<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;sitemap-xml&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\nnews_patterns <span class=\"o\">=</span> <span class=\"p\">([</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;category/&lt;slug:slug&gt;/&#39;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>category<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;category&#39;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;&lt;slug:slug&gt;/&#39;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>details<span class=\"p\">,</span> name<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\nurlpatterns <span class=\"o\">+=</span> i18n_patterns<span class=\"p\">(</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;about/&#39;</span><span class=\"p\">,</span> about_views<span class=\"o\">.</span>main<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;about&#39;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;news/&#39;</span><span class=\"p\">,</span> include<span class=\"p\">(</span>news_patterns<span class=\"p\">,</span> namespace<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\">i18n_patterns</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> activate\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<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>reverse<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>activate<span class=\"p\">(</span><span class=\"s1\">&#39;nl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s1\">&#39;news:detail&#39;</span><span class=\"p\">,</span> kwargs<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\">prefix_default_language=False</code> dan <code class=\"docutils literal notranslate\">LANGUAGE_CODE='en'</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>activate<span class=\"p\">(</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<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>activate<span class=\"p\">(</span><span class=\"s1\">&#39;nl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<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\">i18n_patterns()</code></a> hanya diizinkan dalam akar URLconf. Menggunakan itu dalam sebuah URLconf disertakan akan melempar pengecualian <a class=\"reference internal\" href=\"/id/2.1/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\">ImproperlyConfigured</code></a>.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">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.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a>. 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=\"nn\">django.conf.urls.i18n</span> <span class=\"kn\">import</span> i18n_patterns\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> include<span class=\"p\">,</span> path\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\n<span class=\"kn\">from</span> <span class=\"nn\">about</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> about_views\n<span class=\"kn\">from</span> <span class=\"nn\">news</span> <span class=\"kn\">import</span> views <span class=\"k\">as</span> news_views\n<span class=\"kn\">from</span> <span class=\"nn\">sitemaps.views</span> <span class=\"kn\">import</span> sitemap\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;sitemap.xml&#39;</span><span class=\"p\">,</span> sitemap<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;sitemap-xml&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n\nnews_patterns <span class=\"o\">=</span> <span class=\"p\">([</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>index<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;index&#39;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;category/&lt;slug:slug&gt;/&#39;</span><span class=\"p\">),</span> news_views<span class=\"o\">.</span>category<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;category&#39;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;&lt;slug:slug&gt;/&#39;</span><span class=\"p\">,</span> news_views<span class=\"o\">.</span>details<span class=\"p\">,</span> name<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\nurlpatterns <span class=\"o\">+=</span> i18n_patterns<span class=\"p\">(</span>\n    path<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;about/&#39;</span><span class=\"p\">),</span> about_views<span class=\"o\">.</span>main<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s1\">&#39;about&#39;</span><span class=\"p\">),</span>\n    path<span class=\"p\">(</span>_<span class=\"p\">(</span><span class=\"s1\">&#39;news/&#39;</span><span class=\"p\">),</span> include<span class=\"p\">(</span>news_patterns<span class=\"p\">,</span> namespace<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.1/ref/urlresolvers/#django.urls.reverse\" title=\"django.urls.reverse\"><code class=\"xref py py-func docutils literal notranslate\">reverse()</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=\"nn\">django.urls</span> <span class=\"kn\">import</span> reverse\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> activate\n\n<span class=\"gp\">&gt;&gt;&gt; </span>activate<span class=\"p\">(</span><span class=\"s1\">&#39;en&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s1\">&#39;news:category&#39;</span><span class=\"p\">,</span> kwargs<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>activate<span class=\"p\">(</span><span class=\"s1\">&#39;nl&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>reverse<span class=\"p\">(</span><span class=\"s1\">&#39;news:category&#39;</span><span class=\"p\">,</span> kwargs<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>In most cases, it's best to use translated URLs only within a language code\nprefixed block of patterns (using\n<a class=\"reference internal\" href=\"#django.conf.urls.i18n.i18n_patterns\" title=\"django.conf.urls.i18n.i18n_patterns\"><code class=\"xref py py-func docutils literal notranslate\">i18n_patterns()</code></a>), to avoid the possibility\nthat a carelessly translated URL causes a collision with a non-translated\nURL pattern.</p>\n</aside>\n</section>\n<section id=\"reversing-in-templates\">\n<span id=\"id2\"></span><h3>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\">language</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\">language</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.1/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\">.po</code>.</p>\n<p>Django datang dengan sebuah alat, <code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages 1</code>, yang mengotomatiskan pembuatan dan perawatan dari berkas-berkas ini.</p>\n<aside class=\"admonition-gettext-utilities admonition\" role=\"note\">\n<p class=\"admonition-title\">Utilitas gettext</p>\n<p>Perintah <code class=\"docutils literal notranslate\">makemessages</code> (dan <code class=\"docutils literal notranslate\">compilemessages</code> diobrolkan kemudian) menggunakan perintah dari kumpulan alat gettext GNU: <code class=\"docutils literal notranslate\">xgettext</code>, <code class=\"docutils literal notranslate\">msgfmt</code>, <code class=\"docutils literal notranslate\">msgmerge</code> dan <code class=\"docutils literal notranslate\">msguniq</code>.</p>\n<p>Versi minimal dari utilitas <code class=\"docutils literal notranslate\">gettext</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>django<span class=\"o\">-</span>admin makemessages <span class=\"o\">-</span>l de\n</code></pre></div>\n<p>...dimana <code class=\"docutils literal notranslate\">de</code> adalah <a class=\"reference internal\" href=\"/id/2.1/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\">pt_BR</code> untuk Brasil Portugis, <code class=\"docutils literal notranslate\">de_AT</code> untuk Austria Jerman atau <code class=\"docutils literal notranslate\">id</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\">manage.py</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.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> dikonfigurasi dengan benar). Itu membuat (atau memperbaharui) sebuah berkas pesan dalam direktori <code class=\"docutils literal notranslate\">locale/LANG/LC_MESSAGES</code>. Dalam contoh <code class=\"docutils literal notranslate\">de</code>, berkas akan berupa <code class=\"docutils literal notranslate\">locale/de/LC_MESSAGES/django.po</code>.</p>\n<p>Ketika anda menjalankan <code class=\"docutils literal notranslate\">makemessages</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\">locale</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\">locale</code> akan salah satu masuk dalam berkas pesan dibawah direktori didaftar pertama dalam <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> atau akan membangkitkan sebuah kesalahan jika <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> adalah kosong.</p>\n<p>Secara awalan <code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages 1</code> menguji setiap berkas yang mempunyai ekstensi berkas <code class=\"docutils literal notranslate\">.html</code>, <code class=\"docutils literal notranslate\">.txt</code> atau <code class=\"docutils literal notranslate\">.py</code>. Jika anda ingin menimpa awalan itu, gunakan pilihan <code class=\"xref std std-option docutils literal notranslate\">--extension 2</code> atau <code class=\"docutils literal notranslate\">-e</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>django<span class=\"o\">-</span>admin makemessages <span class=\"o\">-</span>l de <span class=\"o\">-</span>e txt\n</code></pre></div>\n<p>Mmeisahkan banyak ekstensi dengan koma dan/atau menggunakan <code class=\"docutils literal notranslate\">-e</code> atau <code class=\"docutils literal notranslate\">--extension</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>django<span class=\"o\">-</span>admin makemessages <span class=\"o\">-</span>l de <span class=\"o\">-</span>e html<span class=\"p\">,</span>txt <span class=\"o\">-</span>e xml\n</code></pre></div>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>When <a class=\"reference internal\" href=\"#creating-message-files-from-js-code\"><span class=\"std std-ref\">creating message files from JavaScript source code</span></a> you need to use the special\n<code class=\"docutils literal notranslate\">djangojs</code> domain, <strong>not</strong> <code class=\"docutils literal notranslate\">-e js</code>.</p>\n</aside>\n<aside class=\"admonition-using-jinja2-templates admonition\" role=\"note\">\n<p class=\"admonition-title\">Menggunakan cetakan Jinja2?</p>\n<p><a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</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\">babel.cfg</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>python<span class=\"p\">:</span> <span class=\"o\">**.</span>py<span class=\"p\">]</span>\n\n<span class=\"c1\"># Extraction from Jinja2 templates</span>\n<span class=\"p\">[</span>jinja2<span class=\"p\">:</span> <span class=\"o\">**.</span>jinja<span class=\"p\">]</span>\nextensions <span class=\"o\">=</span> jinja2<span class=\"o\">.</span>ext<span class=\"o\">.</span>with_\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.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a>, dapat mengganti itu secara umum, dan tidak bergantung pada <code class=\"docutils literal notranslate\">gettext</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\" role=\"note\">\n<p class=\"admonition-title\">Tidak ada gettext?</p>\n<p>Jika anda tidak mempunyai utilitas <code class=\"docutils literal notranslate\">gettext</code> terpasang, <a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> akan membuat berkas-berkas kosong. Jika itu adalah kasus, salah satu pasang utilitas <code class=\"docutils literal notranslate\">gettext</code> atau cukup salin berkas pesan Inggris (<code class=\"docutils literal notranslate\">locale/en/LC_MESSAGES/django.po</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\" role=\"note\">\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.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</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\">.po</code> files is straightforward. Each <code class=\"docutils literal notranslate\">.po</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\">&quot;Welcome to my site.&quot;</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=\"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\">django-admin makemessages 1</code> akan membuat sebuah berkas <code class=\"docutils literal notranslate\">.po</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\">msgid</code> adalah string terjemahan, yang muncul dalam sumber. Jangan rubah itu.</p></li>\n<li><p><code class=\"docutils literal notranslate\">msgstr</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\">#</code> dan bertempat diatas baris <code class=\"docutils literal notranslate\">msgid</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\">msgstr</code> (atau <code class=\"docutils literal notranslate\">msgid</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\" role=\"note\">\n<p class=\"admonition-title\">Pikirkan charset anda</p>\n<p>Due to the way the <code class=\"docutils literal notranslate\">gettext</code> tools work internally and because we want to\nallow non-ASCII source strings in Django's core and your applications, you\n<strong>must</strong> use UTF-8 as the encoding for your 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>django<span class=\"o\">-</span>admin makemessages <span class=\"o\">-</span>a\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\">gettext</code>. Lakukan ini dengan alat <code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages 1</code>.</p>\n<p>Alat ini berjalan terhadap semua berkas <code class=\"docutils literal notranslate\">.po</code> tersedia dan membuat berkas <code class=\"docutils literal notranslate\">.mo</code>, yang adalah berkas biner dioptimalkan untu digunakan oleh <code class=\"docutils literal notranslate\">gettext</code>. Dalam direktori sama dari mana anda menjalankan <code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages 1</code>, jalankan <code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages 2</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>django<span class=\"o\">-</span>admin compilemessages\n</code></pre></div>\n<p>Itu dia, terjemahan anda siap digunakan.</p>\n<aside class=\"admonition-working-on-windows admonition\" role=\"note\">\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\">django-admin compilemessages 1</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\" role=\"note\">\n<p class=\"admonition-title\">berkas-berkas .po: Penggunaan penyandian dan BOM.</p>\n<p>Django only supports <code class=\"docutils literal notranslate\">.po</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\">gettext()</code> tidak benar mengenali <code class=\"docutils literal notranslate\">python-format</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\">_(&quot;10% interest&quot;)</code>), <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> incorrectly\nflags strings with <code class=\"docutils literal notranslate\">python-format</code>.</p>\n<p>If you try to compile message files with incorrectly flagged strings, you'll\nget an error message like <code class=\"docutils literal notranslate\">number of format specifications in 'msgid' and\n'msgstr' does not match</code> or <code class=\"docutils literal notranslate\">'msgstr' is not a valid Python format string,\nunlike 'msgid'</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=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext <span class=\"k\">as</span> _\noutput <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;10</span><span class=\"si\">%%</span><span class=\"s2\"> interest&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Atau anda dapat menggunakan <code class=\"docutils literal notranslate\">no-python-format</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>\noutput <span class=\"o\">=</span> _<span class=\"p\">(</span><span class=\"s2\">&quot;10</span><span class=\"si\">% i</span><span class=\"s2\">nterest&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"creating-message-files-from-javascript-source-code\">\n<span id=\"creating-message-files-from-js-code\"></span><h3>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.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> tool.\nThe only difference is you need to explicitly specify what in gettext parlance\nis known as a domain in this case the <code class=\"docutils literal notranslate\">djangojs</code> domain, by providing a <code class=\"docutils literal notranslate\">-d\ndjangojs</code> parameter, like this:</p>\n<div class=\"code-block\" data-language=\"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>django<span class=\"o\">-</span>admin makemessages <span class=\"o\">-</span>d djangojs <span class=\"o\">-</span>l de\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.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> the same way as you do with normal Django message files.</p>\n</section>\n<section id=\"gettext-on-windows\">\n<span id=\"id3\"></span><h3><code class=\"docutils literal notranslate\">gettext</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\">.po</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\">gettext</code> binaries you have obtained elsewhere, so long as\nthe <code class=\"docutils literal notranslate\">xgettext --version</code> command works properly. Do not attempt to use Django\ntranslation utilities with a <code class=\"docutils literal notranslate\">gettext</code> package if the command <code class=\"docutils literal notranslate\">xgettext\n--version</code> entered at a Windows command prompt causes a popup window saying\n&quot;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\">makemessages</code><a class=\"heading-anchor\" href=\"#customizing-the-makemessages-command\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda ingin melewatkan parameter tambahan pada <code class=\"docutils literal notranslate\">xgettext</code>, anda butuh membuat perintah <a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</code></a> penyesuaian dan menimpa atribut <code class=\"docutils literal notranslate\">xgettext_options</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=\"nn\">django.core.management.commands</span> <span class=\"kn\">import</span> makemessages\n\n<span class=\"k\">class</span> <span class=\"nc\">Command</span><span class=\"p\">(</span>makemessages<span class=\"o\">.</span>Command<span class=\"p\">):</span>\n    xgettext_options <span class=\"o\">=</span> makemessages<span class=\"o\">.</span>Command<span class=\"o\">.</span>xgettext_options <span class=\"o\">+</span> <span class=\"p\">[</span><span class=\"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.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemessages</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=\"nn\">django.core.management.commands</span> <span class=\"kn\">import</span> makemessages\n\n<span class=\"k\">class</span> <span class=\"nc\">Command</span><span class=\"p\">(</span>makemessages<span class=\"o\">.</span>Command<span class=\"p\">):</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">add_arguments</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> parser<span class=\"p\">):</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>add_arguments<span class=\"p\">(</span>parser<span class=\"p\">)</span>\n        parser<span class=\"o\">.</span>add_argument<span class=\"p\">(</span>\n            <span class=\"s1\">&#39;--extra-keyword&#39;</span><span class=\"p\">,</span>\n            dest<span class=\"o\">=</span><span class=\"s1\">&#39;xgettext_keywords&#39;</span><span class=\"p\">,</span>\n            action<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=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>options<span class=\"p\">):</span>\n        xgettext_keywords <span class=\"o\">=</span> options<span class=\"o\">.</span>pop<span class=\"p\">(</span><span class=\"s1\">&#39;xgettext_keywords&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> xgettext_keywords<span class=\"p\">:</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span>xgettext_options <span class=\"o\">=</span> <span class=\"p\">(</span>\n                makemessages<span class=\"o\">.</span>Command<span class=\"o\">.</span>xgettext_options<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> kwd <span class=\"k\">for</span> kwd <span class=\"ow\">in</span> xgettext_keywords<span class=\"p\">]</span>\n            <span class=\"p\">)</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>handle<span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>options<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"miscellaneous\">\n<h2>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\">set_language</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\">set_language</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">request</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.views.i18n.set_language\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>As a convenience, Django comes with a view, <a class=\"reference internal\" href=\"#django.views.i18n.set_language\" title=\"django.views.i18n.set_language\"><code class=\"xref py py-func docutils literal notranslate\">django.views.i18n.set_language()</code></a>,\nthat sets a user's language preference and redirects to a given URL or, by default,\nback to the previous page.</p>\n<p>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>path<span class=\"p\">(</span><span class=\"s1\">&#39;i18n/&#39;</span><span class=\"p\">,</span> include<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\">/i18n/setlang/</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\">i18n_patterns()</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\">POST</code> method, with a <code class=\"docutils literal notranslate\">language</code>\nparameter set in request. If session support is enabled, the view saves the\nlanguage choice in the user's session. It also saves the language choice in a\ncookie that is named <code class=\"docutils literal notranslate\">django_language</code> by default. (The name can be changed\nthrough the <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a> setting.)</p>\n<aside class=\"version-note version-changed\" data-version=\"2.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 2.1</p><p>In older versions, the cookie is only set if session support isn't enabled.</p>\n</aside>\n<p>After setting the language choice, Django looks for a <code class=\"docutils literal notranslate\">next</code> parameter in the\n<code class=\"docutils literal notranslate\">POST</code> or <code class=\"docutils literal notranslate\">GET</code> data. If that is found and Django considers it to be a safe\nURL (i.e. it doesn't point to a different host and uses a safe scheme), a\nredirect to that URL will be performed. Otherwise, Django may fall back to\nredirecting the user to the URL from the <code class=\"docutils literal notranslate\">Referer</code> header or, if it is not\nset, to <code class=\"docutils literal notranslate\">/</code>, depending on the nature of the request:</p>\n<ul class=\"simple\">\n<li><p>Untuk permintaan AJAX, fallback akan dialkukan hanya jika parameter <code class=\"docutils literal notranslate\">next</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\">redirect_to</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.1/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.activate()</code></a>. Yang memberlakukan ke hanya rangkaian saat ini. Untuk bertahan bahasa untuk seluruh sesi, juga rubah <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.LANGUAGE_SESSION_KEY\" title=\"django.utils.translation.LANGUAGE_SESSION_KEY\"><code class=\"xref py py-data docutils literal notranslate\">LANGUAGE_SESSION_KEY</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=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\nuser_language <span class=\"o\">=</span> <span class=\"s1\">&#39;fr&#39;</span>\ntranslation<span class=\"o\">.</span>activate<span class=\"p\">(</span>user_language<span class=\"p\">)</span>\nrequest<span class=\"o\">.</span>session<span class=\"p\">[</span>translation<span class=\"o\">.</span>LANGUAGE_SESSION_KEY<span class=\"p\">]</span> <span class=\"o\">=</span> user_language\n</code></pre></div>\n<p>Anda biasaya ingin melakukan menggunakan kedua: <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.activate()</code></a> 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.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</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=\"nn\">django.conf</span> <span class=\"kn\">import</span> settings\n<span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n<span class=\"kn\">from</span> <span class=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\nuser_language <span class=\"o\">=</span> <span class=\"s1\">&#39;fr&#39;</span>\ntranslation<span class=\"o\">.</span>activate<span class=\"p\">(</span>user_language<span class=\"p\">)</span>\nresponse <span class=\"o\">=</span> HttpResponse<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\nresponse<span class=\"o\">.</span>set_cookie<span class=\"p\">(</span>settings<span class=\"o\">.</span>LANGUAGE_COOKIE_NAME<span class=\"p\">,</span> user_language<span class=\"p\">)</span>\n</code></pre></div>\n</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=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\n\n<span class=\"k\">def</span> <span class=\"nf\">welcome_translated</span><span class=\"p\">(</span>language<span class=\"p\">):</span>\n    cur_language <span class=\"o\">=</span> translation<span class=\"o\">.</span>get_language<span class=\"p\">()</span>\n    <span class=\"k\">try</span><span class=\"p\">:</span>\n        translation<span class=\"o\">.</span>activate<span class=\"p\">(</span>language<span class=\"p\">)</span>\n        text <span class=\"o\">=</span> translation<span class=\"o\">.</span>gettext<span class=\"p\">(</span><span class=\"s1\">&#39;welcome&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">finally</span><span class=\"p\">:</span>\n        translation<span class=\"o\">.</span>activate<span class=\"p\">(</span>cur_language<span class=\"p\">)</span>\n    <span class=\"k\">return</span> text\n</code></pre></div>\n<p>Calling this function with the value <code class=\"docutils literal notranslate\">'de'</code> will give you <code class=\"docutils literal notranslate\">&quot;Willkommen&quot;</code>,\nregardless of <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> and language set by middleware.</p>\n<p>Fungsi-fungsi untuk minat tertentu adalah <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.get_language\" title=\"django.utils.translation.get_language\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.get_language()</code></a> yang mengembalikan bahasa digunakan dalam thread saat ini, <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.activate\" title=\"django.utils.translation.activate\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.activate()</code></a> yang mengaktifkan sebuah katalog terjemahan untuk thread saat ini, dan <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.check_for_language\" title=\"django.utils.translation.check_for_language\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.check_for_language()</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.1/ref/utils/#django.utils.translation.override\" title=\"django.utils.translation.override\"><code class=\"xref py py-func docutils literal notranslate\">django.utils.translation.override()</code></a> 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=\"nn\">django.utils</span> <span class=\"kn\">import</span> translation\n\n<span class=\"k\">def</span> <span class=\"nf\">welcome_translated</span><span class=\"p\">(</span>language<span class=\"p\">):</span>\n    <span class=\"k\">with</span> translation<span class=\"o\">.</span>override<span class=\"p\">(</span>language<span class=\"p\">):</span>\n        <span class=\"k\">return</span> translation<span class=\"o\">.</span>gettext<span class=\"p\">(</span><span class=\"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.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_COOKIE_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_AGE</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_COOKIE_DOMAIN\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_DOMAIN</code></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_COOKIE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_PATH</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\">gettext</code> module that comes\nwith Python. If you know <code class=\"docutils literal notranslate\">gettext</code>, you might note these specialties in the\nway Django does translation:</p>\n<ul class=\"simple\">\n<li><p>The string domain is <code class=\"docutils literal notranslate\">django</code> or <code class=\"docutils literal notranslate\">djangojs</code>. This string domain is\nused to differentiate between different programs that store their data\nin a common message-file library (usually <code class=\"docutils literal notranslate\">/usr/share/locale/</code>). The\n<code class=\"docutils literal notranslate\">django</code> domain is used for Python and template translation strings\nand is loaded into the global translation catalogs. The <code class=\"docutils literal notranslate\">djangojs</code>\ndomain is only used for JavaScript translation catalogs to make sure\nthat those are as small as possible.</p></li>\n<li><p>Django tidak menggunakan <code class=\"docutils literal notranslate\">xgettext</code> sendiri. Itu menggunakan Python dibungkus disekitar <code class=\"docutils literal notranslate\">xgettext</code> dan <code class=\"docutils literal notranslate\">msgfmt</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.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</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.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> dan memastikan <span class=\"xref std std-term\">message files 1</span> sesuai dan versi tersusun mereka (<code class=\"docutils literal notranslate\">.mo</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\">LocaleMiddleware</code>. <code class=\"docutils literal notranslate\">LocaleMiddleware</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\">LocaleMiddleware</code>, tambah <code class=\"docutils literal notranslate\">'django.middleware.locale.LocaleMiddleware'</code>  ke pengaturan <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</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\">SessionMiddleware</code>, because <code class=\"docutils literal notranslate\">LocaleMiddleware</code>\nmakes use of session data. And it should come before <code class=\"docutils literal notranslate\">CommonMiddleware</code>\nbecause <code class=\"docutils literal notranslate\">CommonMiddleware</code> needs an activated language in order\nto resolve the requested URL.</p></li>\n<li><p>Jika anda menggunakan <code class=\"docutils literal notranslate\">CacheMiddleware</code>, taruh <code class=\"docutils literal notranslate\">LocaleMiddleware</code> setelah itu.</p></li>\n</ul>\n<p>Sebagai contoh, <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-MIDDLEWARE\"><code class=\"xref std std-setting docutils literal notranslate\">MIDDLEWARE</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>MIDDLEWARE <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\">LocaleMiddleware</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\">i18n_patterns</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.1/ref/utils/#django.utils.translation.LANGUAGE_SESSION_KEY\" title=\"django.utils.translation.LANGUAGE_SESSION_KEY\"><code class=\"xref py py-data docutils literal notranslate\">LANGUAGE_SESSION_KEY</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.1/ref/settings/#std-setting-LANGUAGE_COOKIE_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_COOKIE_NAME</code></a>. (Nama awalan adalah <code class=\"docutils literal notranslate\">django_language</code>.)</p>\n</li>\n<li><p>Failing that, it looks at the <code class=\"docutils literal notranslate\">Accept-Language</code> HTTP header. This\nheader is sent by your browser and tells the server which language(s) you\nprefer, in order by priority. Django tries each language in the header\nuntil it finds one with available translations.</p></li>\n<li><p>Failing that, it uses the global <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> setting.</p></li>\n</ul>\n<p id=\"locale-middleware-notes\">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.1/topics/i18n/#term-language-code\"><span class=\"xref std std-term\">language format</span></a>, as a string. For example,\nBrazilian Portuguese is <code class=\"docutils literal notranslate\">pt-br</code>.</p></li>\n<li><p>If a base language is available but the sublanguage specified is not,\nDjango uses the base language. For example, if a user specifies <code class=\"docutils literal notranslate\">de-at</code>\n(Austrian German) but Django only has <code class=\"docutils literal notranslate\">de</code> available, Django uses\n<code class=\"docutils literal notranslate\">de</code>.</p></li>\n<li><p>Only languages listed in the <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> setting can be selected.\nIf you want to restrict the language selection to a subset of provided\nlanguages (because your application doesn't provide all those languages),\nset <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> to a list of languages. For example:</p>\n<div class=\"code-block\" data-language=\"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>LANGUAGES <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=\"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=\"p\">(</span><span class=\"s1\">&#39;English&#39;</span><span class=\"p\">)),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>This example restricts languages that are available for automatic\nselection to German and English (and any sublanguage, like <code class=\"docutils literal notranslate\">de-ch</code> or\n<code class=\"docutils literal notranslate\">en-us</code>).</p>\n</li>\n<li><p>If you define a custom <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGES\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGES</code></a> setting, as explained in the\nprevious bullet, you can mark the language names as translation strings\n-- but use <a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.gettext_lazy\" title=\"django.utils.translation.gettext_lazy\"><code class=\"xref py py-func docutils literal notranslate\">gettext_lazy()</code></a> instead of\n<a class=\"reference internal\" href=\"/id/2.1/ref/utils/#django.utils.translation.gettext\" title=\"django.utils.translation.gettext\"><code class=\"xref py py-func docutils literal notranslate\">gettext()</code></a> to avoid a circular import.</p>\n<p>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=\"nn\">django.utils.translation</span> <span class=\"kn\">import</span> gettext_lazy <span class=\"k\">as</span> _\n\nLANGUAGES <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s1\">&#39;de&#39;</span><span class=\"p\">,</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=\"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\">LocaleMiddleware</code> determines the user's preference, it makes this\npreference available as <code class=\"docutils literal notranslate\">request.LANGUAGE_CODE</code> for each\n<a class=\"reference internal\" href=\"/id/2.1/ref/request-response/#django.http.HttpRequest\" title=\"django.http.HttpRequest\"><code class=\"xref py py-class docutils literal notranslate\">HttpRequest</code></a>. Feel free to read this value in your view\ncode. Here's 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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponse\n\n<span class=\"k\">def</span> <span class=\"nf\">hello_world</span><span class=\"p\">(</span>request<span class=\"p\">,</span> count<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>LANGUAGE_CODE <span class=\"o\">==</span> <span class=\"s1\">&#39;de-at&#39;</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;You prefer to read Austrian German.&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"k\">return</span> HttpResponse<span class=\"p\">(</span><span class=\"s2\">&quot;You prefer to read another language.&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Catat bahwa, dengan terjemahan tetap (tanpa-middleware), bahasa di <code class=\"docutils literal notranslate\">settings.LANGUAGE_CODE</code>, selagi dengan terjemahan dinamis (middleware), itu di <code class=\"docutils literal notranslate\">request.LANGUAGE_CODE</code>.</p>\n</section>\n<section id=\"how-django-discovers-translations\">\n<span id=\"id6\"></span><h3>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.1/topics/i18n/#term-message-file\"><span class=\"xref std std-term\">message files</span></a> (<code class=\"docutils literal notranslate\">.mo</code>) and the precedence of multiple\ntranslations for the same literal:</p>\n<ol class=\"arabic simple\">\n<li><p>The directories listed in <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> have the highest\nprecedence, with the ones appearing first having higher precedence than\nthe ones appearing later.</p></li>\n<li><p>Then, it looks for and uses if it exists a <code class=\"docutils literal notranslate\">locale</code> directory in each\nof the installed apps listed in <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>.  The ones\nappearing first have higher precedence than the ones appearing later.</p></li>\n<li><p>Akhirnya, terjemahan dasar disediakan-Django dalam <code class=\"docutils literal notranslate\">django/conf/locale</code> digunakan sebagai sebuah fallback.</p></li>\n</ol>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\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\">JavaScriptCatalog</code></a> for more details.</p>\n<p>You can also put <a class=\"reference internal\" href=\"/id/2.1/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.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> directories if you also set\n<a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-FORMAT_MODULE_PATH\"><code class=\"xref std std-setting docutils literal notranslate\">FORMAT_MODULE_PATH</code></a>.</p>\n</aside>\n<p>In all cases the name of the directory containing the translation is expected to\nbe named using <a class=\"reference internal\" href=\"/id/2.1/topics/i18n/#term-locale-name\"><span class=\"xref std std-term\">locale name</span></a> notation. E.g. <code class=\"docutils literal notranslate\">de</code>, <code class=\"docutils literal notranslate\">pt_BR</code>, <code class=\"docutils literal notranslate\">es_AR</code>,\netc. Untranslated strings for territorial language variants use the translations\nof the generic language. For example, untranslated <code class=\"docutils literal notranslate\">pt_BR</code> strings use <code class=\"docutils literal notranslate\">pt</code>\ntranslations.</p>\n<aside class=\"version-note version-changed\" data-version=\"2.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 2.1</p><p>Fallback to the generic language as described above was added.</p>\n</aside>\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.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</code></a> di berkas pengaturan anda adalah dicari untuk <code class=\"docutils literal notranslate\">1/LC_MESSAGES/django.(po|mo)</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\">$PYTHONPATH/django/conf/locale/&lt;language&gt;/LC_MESSAGES/django.(po|mo)</code></p></li>\n</ul>\n<p>Untuk membuat berkas pesan, anda menggunakan , anda menggunakan alat <a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-makemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin makemessages</code></a> . Dan anda menggunakan <a class=\"reference internal\" href=\"/id/2.1/ref/django-admin/#django-admin-compilemessages\"><code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages</code></a> untuk menghasilkan berkas-berkas biner <code class=\"docutils literal notranslate\">.mo</code> yang digunakan oleh <code class=\"docutils literal notranslate\">gettext</code>.</p>\n<p>Anda dapat juga menjalankan <code class=\"xref std std-djadmin docutils literal notranslate\">django-admin compilemessages --settings=path.to.settings 1</code> untuk membuat penyusun mengolah semua direktori dalam pengaturan <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LOCALE_PATHS\"><code class=\"xref std std-setting docutils literal notranslate\">LOCALE_PATHS</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\">gettext</code> only provides two plural forms for the original messages, so you\nwill also need to provide a translation for the base language to include all\nplural forms if the plural rules for the base language are different from\nEnglish.</p></li>\n<li><p>When an English variant is activated and English strings are missing, the\nfallback language will not be the <a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> of the project,\nbut the original strings. For example, an English user visiting a site with\n<a class=\"reference internal\" href=\"/id/2.1/ref/settings/#std-setting-LANGUAGE_CODE\"><code class=\"xref std std-setting docutils literal notranslate\">LANGUAGE_CODE</code></a> set to Spanish and original strings written in\nRussian will see Russian text rather than Spanish.</p></li>\n</ul>\n</section>\n</section>","rootId":"module-django.utils.translation","toc":[{"title":"Ikhtisar","anchor":"overview","children":[]},{"title":"Internasionalisasi: dalam kode Python","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":"Pluralisasi","anchor":"pluralization","children":[]},{"title":"Contextual markers","anchor":"contextual-markers","children":[]},{"title":"Terjemahan lazy","anchor":"lazy-translation","children":[{"title":"Bidang-bidang model dan hubungan nilai pilihan verbose_name dan help_text","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":"Bekerja dengan obyek-obyek terjemahan lazy","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":"Lainnya menggunakan lazy dalam terjemahan tertunda","anchor":"other-uses-of-lazy-in-delayed-translations","children":[]}]},{"title":"Lokalisasi nama-nama dari bahasa","anchor":"localized-names-of-languages","children":[]}]},{"title":"Internasionalisasi: dalam kode cetakan","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":"i18n context processor","anchor":"i18n-context-processor","children":[]},{"title":"get_language_info","anchor":"get-language-info","children":[]},{"title":"get_language_info_list","anchor":"get-language-info-list","children":[]},{"title":"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.1/topics/"},{"docname":"topics/i18n/index","title":"Internasionalisasi dan lokalisasi","url":"/id/2.1/topics/i18n/"}],"prev":{"docname":"topics/i18n/index","title":"Internasionalisasi dan lokalisasi","url":"/id/2.1/topics/i18n/"},"next":{"docname":"topics/i18n/formatting","title":"Format localization","url":"/id/2.1/topics/i18n/formatting/"},"formats":{"html":"/id/2.1/topics/i18n/translation/","markdown":"/id/2.1/topics/i18n/translation.md","json":"/id/2.1/topics/i18n/translation.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/i18n/translation.txt","official":"https://docs.djangoproject.com/id/2.1/topics/i18n/translation/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}