github.com/System-Glitch/goyave/v2@v2.10.3-0.20200819142921-51011e75d504/docs/guide/advanced/localization.html (about)

     1  <!DOCTYPE html>
     2  <html lang="en-US">
     3    <head>
     4      <meta charset="utf-8">
     5      <meta name="viewport" content="width=device-width,initial-scale=1">
     6      <title>Localization | Goyave</title>
     7      <meta name="generator" content="VuePress 1.5.3">
     8      <link rel="icon" type="image/png" sizes="16x16" href="/goyave/goyave_16.png">
     9      <link rel="icon" type="image/png" sizes="32x32" href="/goyave/goyave_32.png">
    10      <link rel="icon" type="image/png" sizes="64x64" href="/goyave/goyave_64.png">
    11      <link rel="icon" type="image/png" sizes="128x128" href="/goyave/goyave_128.png">
    12      <link rel="icon" type="image/png" sizes="256x256" href="/goyave/goyave_256.png">
    13      <link rel="icon" type="image/png" sizes="512x512" href="/goyave/goyave_512.png">
    14      <meta name="description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power.">
    15      <meta name="og:title" content="Localization - Goyave">
    16      <meta name="twitter:title" content="Localization - Goyave">
    17      <meta name="title" content="Localization - Goyave">
    18      <meta property="twitter:description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power.">
    19      <meta property="twitter:image:src" content="https://system-glitch.github.io/goyave/goyave_banner.png">
    20      <meta property="twitter:card" content="summary_large_image">
    21      <meta property="og:type" content="website">
    22      <meta property="og:description" content="Goyave is a Golang web API framework aiming at cleanliness, fast development and power.">
    23      <meta property="og:image" content="https://system-glitch.github.io/goyave/goyave_banner.png">
    24      <meta property="og:site_name" content="Goyave">
    25      <link rel="preload" href="/goyave/assets/css/0.styles.589fd562.css" as="style"><link rel="preload" href="/goyave/assets/js/app.092490a7.js" as="script"><link rel="preload" href="/goyave/assets/js/4.75a9cc68.js" as="script"><link rel="preload" href="/goyave/assets/js/1.121dd9ed.js" as="script"><link rel="preload" href="/goyave/assets/js/11.2d66fdef.js" as="script"><link rel="prefetch" href="/goyave/assets/js/10.2f07bbf5.js"><link rel="prefetch" href="/goyave/assets/js/12.63171b15.js"><link rel="prefetch" href="/goyave/assets/js/13.770050f3.js"><link rel="prefetch" href="/goyave/assets/js/14.b933d8cf.js"><link rel="prefetch" href="/goyave/assets/js/15.36df2a66.js"><link rel="prefetch" href="/goyave/assets/js/16.ed66719e.js"><link rel="prefetch" href="/goyave/assets/js/17.7bef5f05.js"><link rel="prefetch" href="/goyave/assets/js/18.470b55ed.js"><link rel="prefetch" href="/goyave/assets/js/19.90e0dab8.js"><link rel="prefetch" href="/goyave/assets/js/20.3a300ca3.js"><link rel="prefetch" href="/goyave/assets/js/21.c3fd6053.js"><link rel="prefetch" href="/goyave/assets/js/22.d5569617.js"><link rel="prefetch" href="/goyave/assets/js/23.931b2034.js"><link rel="prefetch" href="/goyave/assets/js/24.1a4755e7.js"><link rel="prefetch" href="/goyave/assets/js/25.0d463913.js"><link rel="prefetch" href="/goyave/assets/js/26.3c173a7a.js"><link rel="prefetch" href="/goyave/assets/js/27.9c5b36f2.js"><link rel="prefetch" href="/goyave/assets/js/28.41e055b7.js"><link rel="prefetch" href="/goyave/assets/js/29.b87adf4a.js"><link rel="prefetch" href="/goyave/assets/js/3.ef71e77d.js"><link rel="prefetch" href="/goyave/assets/js/5.c83f1192.js"><link rel="prefetch" href="/goyave/assets/js/6.2336bf0c.js"><link rel="prefetch" href="/goyave/assets/js/7.d60e55c1.js"><link rel="prefetch" href="/goyave/assets/js/8.2ee33a42.js"><link rel="prefetch" href="/goyave/assets/js/9.8e043d60.js">
    26      <link rel="stylesheet" href="/goyave/assets/css/0.styles.589fd562.css">
    27    </head>
    28    <body>
    29      <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/goyave/" class="home-link router-link-active"><img src="/goyave/goyave_64.png" alt="Goyave" class="logo"> <span class="site-name can-hide">Goyave</span></a> <div class="links"><div class="user-settings"><a title="Dark theme" href="#" class="settings-button"><svg aria-hidden="true" data-prefix="fas" data-icon="cog" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" class="svg-inline--fa fa-cog fa-w-16 settings-icon"><path fill="currentColor" d="M8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zM8 15c-3.9 0-7-3.1-7-7 0-2.4 1.2-4.6 3.2-5.9-0.1 0.6-0.2 1.3-0.2 1.9 0 4.9 4 8.9 8.9 9-1.3 1.3-3 2-4.9 2z"></path></svg></a></div> <div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/goyave/guide/" class="nav-link router-link-active">
    30    Guide
    31  </a></div><div class="nav-item"><a href="https://pkg.go.dev/github.com/System-Glitch/goyave/v2" target="_blank" rel="noopener noreferrer" class="nav-link external">
    32    pkg.go.dev
    33    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <a href="https://github.com/System-Glitch/goyave" target="_blank" rel="noopener noreferrer" class="repo-link">
    34      GitHub
    35      <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/goyave/guide/" class="nav-link router-link-active">
    36    Guide
    37  </a></div><div class="nav-item"><a href="https://pkg.go.dev/github.com/System-Glitch/goyave/v2" target="_blank" rel="noopener noreferrer" class="nav-link external">
    38    pkg.go.dev
    39    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <a href="https://github.com/System-Glitch/goyave" target="_blank" rel="noopener noreferrer" class="repo-link">
    40      GitHub
    41      <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav>  <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>Guide</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading"><span>The Basics</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>Advanced</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/goyave/guide/advanced/helpers.html" class="sidebar-link">Helpers</a></li><li><a href="/goyave/guide/advanced/authentication.html" class="sidebar-link">Authentication</a></li><li><a href="/goyave/guide/advanced/localization.html" aria-current="page" class="active sidebar-link">Localization</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/goyave/guide/advanced/localization.html#introduction" class="sidebar-link">Introduction</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/advanced/localization.html#writing-language-files" class="sidebar-link">Writing language files</a></li><li class="sidebar-sub-header"><a href="/goyave/guide/advanced/localization.html#using-localization" class="sidebar-link">Using localization</a></li></ul></li><li><a href="/goyave/guide/advanced/testing.html" class="sidebar-link">Testing</a></li><li><a href="/goyave/guide/advanced/multi-services.html" class="sidebar-link">Multi-services</a></li><li><a href="/goyave/guide/advanced/cors.html" class="sidebar-link">CORS</a></li><li><a href="/goyave/guide/advanced/status-handlers.html" class="sidebar-link">Status Handlers</a></li><li><a href="/goyave/guide/advanced/logging.html" class="sidebar-link">Logging</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="localization"><a href="#localization" class="header-anchor">#</a> Localization</h1> <p></p><div class="table-of-contents"><ul><li><a href="#introduction">Introduction</a></li><li><a href="#writing-language-files">Writing language files</a><ul><li><a href="#fields">Fields</a></li><li><a href="#locale">Locale</a></li><li><a href="#rules">Rules</a></li><li><a href="#overrides">Overrides</a></li></ul></li><li><a href="#using-localization">Using localization</a><ul><li><a href="#placeholders">Placeholders</a></li><li><a href="#localization-reference">Localization reference</a></li></ul></li></ul></div><p></p> <h2 id="introduction"><a href="#introduction" class="header-anchor">#</a> Introduction</h2> <p>The Goyave framework provides a convenient way to support multiple languages within your application. Out of the box, Goyave only provides the <code>en-US</code> language.</p> <h2 id="writing-language-files"><a href="#writing-language-files" class="header-anchor">#</a> Writing language files</h2> <p>Language files are stored in the <code>resources/lang</code> directory.</p> <pre class="vue-container"><code><p>.
    42  └── resources
    43     └── lang
    44         └── en-US (<em>language name</em>)
    45             ├── fields.json (<em>optional</em>)
    46             ├── locale.json (<em>optional</em>)
    47             └── rules.json (<em>optional</em>)</p>
    48  </code></pre><p>Each language has its own directory and should be named with an <a href="https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes" target="_blank" rel="noopener noreferrer">ISO 639-1<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a> language code. You can also append a variant to your languages: <code>en-US</code>, <code>en-UK</code>, <code>fr-FR</code>, <code>fr-CA</code>, ... <strong>Case is important.</strong></p> <p>Each language directory contains three files. Each file is <strong>optional</strong>.</p> <ul><li><code>fields.json</code>: field names translations and field-specific rule messages.</li> <li><code>locale.json</code>: all other language lines.</li> <li><code>rules.json</code>: validation rules messages.</li></ul> <div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>All directories in the <code>resources/lang</code> directory are automatically loaded when the server starts.</p></div> <h3 id="fields"><a href="#fields" class="header-anchor">#</a> Fields</h3> <p>The <code>fields.json</code> file contains the field names translations and their rule-specific messages. Translating field names helps making more expressive messages instead of showing the technical field name to the user. Rule-specific messages let you override a validation rule message for a specific field.</p> <p><strong>Example:</strong></p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token punctuation">{</span>
    49      <span class="token property">&quot;email&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    50          <span class="token property">&quot;name&quot;</span><span class="token operator">:</span> <span class="token string">&quot;email address&quot;</span><span class="token punctuation">,</span>
    51          <span class="token property">&quot;rules&quot;</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    52              <span class="token property">&quot;required&quot;</span><span class="token operator">:</span> <span class="token string">&quot;You must provide an :field.&quot;</span>
    53          <span class="token punctuation">}</span>
    54      <span class="token punctuation">}</span>
    55  <span class="token punctuation">}</span>
    56  </code></pre></div><p>This <code>fields.json</code> file will change the validation message of the <code>required</code> validation rule to <code>You must provide an email address</code>.</p> <div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>Learn more about validation messages placeholders in the <a href="/goyave/guide/basics/validation.html">validation</a> section.</p></div> <h3 id="locale"><a href="#locale" class="header-anchor">#</a> Locale</h3> <p>The <code>locale.json</code> file contains all language lines that are not related to validation. This is the place where you should write the language lines for your user interface or for the messages returned by your controllers.</p> <p><strong>Example:</strong></p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token punctuation">{</span>
    57      <span class="token property">&quot;product.created&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The product have been created with success.&quot;</span><span class="token punctuation">,</span>
    58      <span class="token property">&quot;product.deleted&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The product have been deleted with success.&quot;</span>
    59  <span class="token punctuation">}</span>
    60  </code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>It is a good practice to use <strong>dot-separated</strong> names for language lines to help making them clearer and more expressive.</p></div> <h3 id="rules"><a href="#rules" class="header-anchor">#</a> Rules</h3> <p>The <code>rules.json</code> file contains the validation rules messages. These messages can have <strong><a href="/goyave/guide/basics/validation.html#placeholders">placeholders</a></strong>, which will be automatically replaced by the validator with dynamic values. If you write custom validation rules, their messages shall be written in this file.</p> <p><strong>Example:</strong></p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token punctuation">{</span>
    61      <span class="token property">&quot;integer&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field must be an integer.&quot;</span><span class="token punctuation">,</span>
    62      <span class="token property">&quot;starts_with&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field must start with one of the following values: :values.&quot;</span><span class="token punctuation">,</span>
    63      <span class="token property">&quot;same&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field and the :other must match.&quot;</span>
    64  <span class="token punctuation">}</span>
    65  </code></pre></div><h4 id="type-dependent-rules"><a href="#type-dependent-rules" class="header-anchor">#</a> Type-dependent rules</h4> <p>The following rules have <strong>type-dependent</strong> messages. That means that their message is different depending on the type of the validated data.</p> <ul><li><code>min</code></li> <li><code>max</code></li> <li><code>size</code></li> <li><code>greater_than</code></li> <li><code>greater_than_equal</code></li> <li><code>lower_than</code></li> <li><code>lower_than_equal</code></li></ul> <p>Type-dependent rules must have a language line for the four following types:</p> <ul><li><code>string</code></li> <li><code>numeric</code></li> <li><code>array</code></li> <li><code>file</code></li></ul> <p><strong>Example:</strong></p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token punctuation">{</span>
    66      <span class="token property">&quot;min.string&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field must be at least :min characters.&quot;</span><span class="token punctuation">,</span>
    67      <span class="token property">&quot;min.numeric&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field must be at least :min.&quot;</span><span class="token punctuation">,</span>
    68      <span class="token property">&quot;min.array&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field must have at least :min items.&quot;</span><span class="token punctuation">,</span>
    69      <span class="token property">&quot;min.file&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field must be at least :min KiB.&quot;</span>
    70  <span class="token punctuation">}</span>
    71  </code></pre></div><h4 id="array-validation"><a href="#array-validation" class="header-anchor">#</a> Array validation</h4> <p>Each rule, except the file-related rules and the <code>confirmed</code> rule, can be used to validate array values. If a rule is used to validate an array value and doesn't pass, the rule message <code>validation.rules.&lt;rule_name&gt;.array</code> (or <code>validation.rules.&lt;rule_name&gt;.&lt;type&gt;.array</code> if the rule is type-dependent) is returned.</p> <p><strong>Example:</strong></p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token punctuation">{</span>
    72      <span class="token property">&quot;min.string.array&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field values must be at least :min characters.&quot;</span><span class="token punctuation">,</span>
    73      <span class="token property">&quot;min.numeric.array&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field values must be at least :min.&quot;</span><span class="token punctuation">,</span>
    74      <span class="token property">&quot;min.array.array&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field values must have at least :min items.&quot;</span><span class="token punctuation">,</span>
    75      <span class="token property">&quot;digits.array&quot;</span><span class="token operator">:</span> <span class="token string">&quot;The :field values must be digits only.&quot;</span>
    76  <span class="token punctuation">}</span>
    77  </code></pre></div><h3 id="overrides"><a href="#overrides" class="header-anchor">#</a> Overrides</h3> <p>If you define the <code>en-US</code>  language in your application, the default language lines will be overridden by the ones in your language files, and all the undefined ones will be kept.</p> <p>It is possible to load a language directory manually from another location than the stardard <code>resources/lang</code> using the <code>lang.Load()</code> function. If the loaded language is already available in your application, the newly loaded one will override the previous in the same manner.</p> <h2 id="using-localization"><a href="#using-localization" class="header-anchor">#</a> Using localization</h2> <p>When an incoming request enters your application, the core language middleware checks if the <code>Accept-Language</code> header is set, and set the <code>goyave.Request</code>'s <code>Lang</code> attribute accordingly. Localization is handled automatically by the validator.</p> <p>To use the localization feature, import the <code>lang</code> package:</p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">import</span> <span class="token string">&quot;github.com/System-Glitch/goyave/v2/lang&quot;</span>
    78  </code></pre></div><p>The main function of the localization feature is <code>lang.Get(language, line string)</code>. This function lets you retrieve a language entry.</p> <p>For validation rules and attributes messages, use the following dot-separated paths:</p> <ul><li><code>validation.rules.&lt;rule_name&gt;</code></li> <li><code>validation.rules.&lt;rule_name&gt;.string</code></li> <li><code>validation.rules.&lt;rule_name&gt;.numeric</code></li> <li><code>validation.rules.&lt;rule_name&gt;.array</code></li> <li><code>validation.rules.&lt;rule_name&gt;.file</code></li> <li><code>validation.fields.&lt;field_name&gt;</code></li> <li><code>validation.fields.&lt;field_name&gt;.&lt;rule_name&gt;</code></li></ul> <p>For normal lines, just use the name of the line. Note that if you have a line called &quot;validation&quot;, it won't conflict with the dot-separated paths. If the line cannot be found, or the requested language is not available, the function will return the exact <code>line</code> attribute.</p> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code><span class="token keyword">func</span> <span class="token function">ControllerHandler</span><span class="token punctuation">(</span>response <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Response<span class="token punctuation">,</span> request <span class="token operator">*</span>goyave<span class="token punctuation">.</span>Request<span class="token punctuation">)</span> <span class="token punctuation">{</span>
    79      response<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span>http<span class="token punctuation">.</span>StatusOK<span class="token punctuation">,</span> lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span>request<span class="token punctuation">.</span>Lang<span class="token punctuation">,</span> <span class="token string">&quot;my-custom-message&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
    80  <span class="token punctuation">}</span>
    81  </code></pre></div><h3 id="placeholders"><a href="#placeholders" class="header-anchor">#</a> Placeholders</h3> <p>Language lines can contain <strong>placeholders</strong>. Placeholders are identified by a colon directly followed by the placeholder name:</p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token property">&quot;greetings&quot;</span><span class="token operator">:</span> <span class="token string">&quot;Greetings, :username!&quot;</span>
    82  </code></pre></div><p>The last parameter of the <code>lang.Get()</code> method is a variadic associative slice of placeholders and their replacement. In the following example, the placeholder <code>:username</code> will be replaced with the Name field in the user struct.</p> <div class="language-go extra-class"><pre class="language-go"><code>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;greetings&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;:username&quot;</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Name<span class="token punctuation">)</span> <span class="token comment">// &quot;Greetings, Taylor!&quot;</span>
    83  </code></pre></div><p>You can provide as many as you want:</p> <div class="language-go extra-class"><pre class="language-go"><code>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;greetings-with-date&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;:username&quot;</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Name<span class="token punctuation">,</span> <span class="token string">&quot;:day&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;Monday&quot;</span><span class="token punctuation">)</span> <span class="token comment">// &quot;Greetings, Taylor! Today is Monday&quot;</span>
    84  </code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>When a placeholder is given, <strong>all occurrences</strong> are replaced.</p> <div class="language-json extra-class"><pre class="language-json"><code><span class="token property">&quot;popular&quot;</span><span class="token operator">:</span> <span class="token string">&quot;:product are very popular. :product sales exceeded 1000 last week.&quot;</span>
    85  </code></pre></div><div class="language-go extra-class"><pre class="language-go"><code>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;popular&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;:product&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;Lawnmowers&quot;</span><span class="token punctuation">)</span>
    86  <span class="token comment">// &quot;Lawnmowers are very popular. Lawnmowers sales exceeded 1000 last week.&quot;</span>
    87  </code></pre></div></div> <h3 id="localization-reference"><a href="#localization-reference" class="header-anchor">#</a> Localization reference</h3> <div class="table"><p><a href="#lang-get">Get</a> <a href="#lang-load">Load</a> <a href="#lang-isavailable">IsAvailable</a> <a href="#lang-getavailablelanguages">GetAvailableLanguages</a> <a href="#lang-detectlanguage">DetectLanguage</a></p></div><h4 id="lang-get"><a href="#lang-get" class="header-anchor">#</a> lang.Get</h4> <p>Get a language line.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>lang string</code></td> <td><code>string</code></td></tr> <tr><td><code>line string</code></td> <td></td></tr> <tr><td><code>placeholders ...string</code></td> <td></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;my-custom-message&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// &quot;my message&quot;</span>
    88  fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;validation.rules.greater_than.string&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// &quot;The :field must be longer than the :other.&quot;</span>
    89  fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;validation.fields.email&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// &quot;email address&quot;</span>
    90  fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span><span class="token string">&quot;en-US&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;greetings&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;:username&quot;</span><span class="token punctuation">,</span> user<span class="token punctuation">.</span>Name<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// &quot;Greetings, Taylor!&quot;</span>
    91  </code></pre></div><h4 id="lang-load"><a href="#lang-load" class="header-anchor">#</a> lang.Load</h4> <p>Load a language directory.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>language string</code></td> <td><code>void</code></td></tr> <tr><td><code>path string</code></td> <td></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>lang<span class="token punctuation">.</span><span class="token function">Load</span><span class="token punctuation">(</span><span class="token string">&quot;zh&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;/path/to/chinese-lang&quot;</span><span class="token punctuation">)</span>
    92  </code></pre></div><h4 id="lang-isavailable"><a href="#lang-isavailable" class="header-anchor">#</a> lang.IsAvailable</h4> <p>Returns true if the language is available.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>lang string</code></td> <td><code>bool</code></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">IsAvailable</span><span class="token punctuation">(</span><span class="token string">&quot;zh&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// true</span>
    93  </code></pre></div><h4 id="lang-getavailablelanguages"><a href="#lang-getavailablelanguages" class="header-anchor">#</a> lang.GetAvailableLanguages</h4> <p>Returns a slice of all loaded languages.</p> <p>This can be used to generate different routes for all languages supported by your applications such as:</p> <div class="language- extra-class"><pre class="language-text"><code>/en/products
    94  /fr/produits
    95  ...
    96  </code></pre></div><table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>lang string</code></td> <td><code>bool</code></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">GetAvailableLanguages</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// [en-US zh]</span>
    97  </code></pre></div><h4 id="lang-detectlanguage"><a href="#lang-detectlanguage" class="header-anchor">#</a> lang.DetectLanguage</h4> <p>DetectLanguage detects the language to use based on the given lang string.
    98  The given lang string can use the HTTP &quot;Accept-Language&quot; header format.</p> <ul><li>If <code>*</code> is provided, the default language will be used.</li> <li>If multiple languages are given, the first available language will be used, and if none are available, the default language will be used.</li> <li>If no variant is given (for example &quot;en&quot;), the first available variant will be used.</li></ul> <p>For example, if <code>en-US</code> and <code>en-UK</code> are available and the request accepts <code>en</code>, <code>en-US</code> will be used.</p> <table><thead><tr><th>Parameters</th> <th>Return</th></tr></thead> <tbody><tr><td><code>lang string</code></td> <td><code>string</code></td></tr></tbody></table> <p><strong>Example:</strong></p> <div class="language-go extra-class"><pre class="language-go"><code>fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>lang<span class="token punctuation">.</span><span class="token function">DetectLanguage</span><span class="token punctuation">(</span><span class="token string">&quot;en, fr-FR;q=0.9&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token comment">// &quot;en-US&quot;</span>
    99  </code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/System-Glitch/goyave/edit/master/docs_src/src/guide/advanced/localization.md" target="_blank" rel="noopener noreferrer">Edit this page on GitHub</a> <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
   100        ←
   101        <a href="/goyave/guide/advanced/authentication.html" class="prev">
   102          Authentication
   103        </a></span> <span class="next"><a href="/goyave/guide/advanced/testing.html">
   104          Testing
   105        </a>
   106        →
   107      </span></p></div> </main></div><div class="global-ui"><!----></div></div>
   108      <script src="/goyave/assets/js/app.092490a7.js" defer></script><script src="/goyave/assets/js/4.75a9cc68.js" defer></script><script src="/goyave/assets/js/1.121dd9ed.js" defer></script><script src="/goyave/assets/js/11.2d66fdef.js" defer></script>
   109    </body>
   110  </html>