Packages

Erlang gettext application

Current section

Files

Jump to
t__ doc readme.html
Raw

doc/readme.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="ExDoc v0.28.5">
<meta name="project" content="t__ v0.1.0">
<title>Overview — t__ v0.1.0</title>
<link rel="stylesheet" href="dist/erlang-6d8ac4aa7a70488ac182.css" />
<script src="dist/sidebar_items-2ca01bcba3.js"></script>
<script src="docs_config.js"></script>
<script async src="dist/app-b5f3440501744dc8be3d.js"></script>
</head>
<body data-type="extras">
<script>
try {
var settings = JSON.parse(localStorage.getItem('ex_doc:settings') || '{}');
if (settings.theme === 'dark' ||
((settings.theme === 'system' || settings.theme == null) &&
window.matchMedia('(prefers-color-scheme: dark)').matches)
) {
document.body.classList.add('dark')
}
} catch (error) { }
</script>
<div class="main">
<section class="sidebar">
<button class="sidebar-button sidebar-toggle" aria-label="toggle sidebar">
<i class="ri-menu-line ri-lg" title="Collapse/expand sidebar"></i>
</button>
<form class="sidebar-search" action="search.html">
<button type="submit" class="search-button" aria-label="Submit Search">
<i class="ri-search-2-line" aria-hidden="true" title="Submit search"></i>
</button>
<button type="button" tabindex="-1" class="search-close-button" aria-label="Cancel Search">
<i class="ri-close-line ri-lg" aria-hidden="true" title="Cancel search"></i>
</button>
<label class="search-label">
<p class="sr-only">Search</p>
<input name="q" type="text" class="search-input" placeholder="Search..." aria-label="Input your search terms" autocomplete="off" />
</label>
</form>
<div class="autocomplete">
<div class="autocomplete-results">
</div>
</div>
<div class="sidebar-header">
<div class="sidebar-projectDetails">
<a href="https://github.com/ergenius/t__" class="sidebar-projectName" translate="no">
t__
</a>
<strong class="sidebar-projectVersion" translate="no">
v0.1.0
</strong>
</div>
<ul class="sidebar-listNav">
<li><a id="extras-list-link" href="#full-list">Pages</a></li>
<li><a id="modules-list-link" href="#full-list">Modules</a></li>
</ul>
</div>
<div class="gradient"></div>
<ul id="full-list" class="sidebar-fullList"></ul>
</section>
<section class="content">
<output role="status" id="toast"></output>
<div class="content-outer">
<div id="content" class="content-inner">
<h1>
<button class="settings display-settings">
<i class="ri-settings-3-line"></i>
<span class="sr-only">Settings</span>
</button>
<a href="https://github.com/ergenius/t__/blob/v0.1.0/README.md#L1" title="View Source" class="view-source" rel="help">
<i class="ri-code-s-slash-line" aria-hidden="true"></i>
<span class="sr-only">View Source</span>
</a>
<span>t__</span>
</h1>
<p>Erlang gettext</p><p>t__ is an implementation of the Gettext system in Erlang. </p><p>gettext is an internationalization and localization system commonly used for writing multilingual programs on Unix-like computer operating systems. </p><p><a href="https://github.com/ergenius/t__/actions/workflows/erlang.yml"><img src="https://github.com/ergenius/t__/actions/workflows/erlang.yml/badge.svg" alt="Erlang CI"/></a></p><p>t__ is also available on <a href="https://hex.pm/packages/t&lowbar;&lowbar;/">HEX</a></p><h2 id="features" class="section-heading">
<a href="#features" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">features</p>
</a>
Features
</h2>
<ul><li>?T__(&quot;I have a joke about Erlang, but it requires a prologue.&quot;)</li><li>Fast.</li><li>Simple. Reading this file should be enough for understanding most use case scenarios.</li><li>Documented source code with comments and specs.</li><li>Highly configurable with multiple PO sources and languages per Erlang application or process.</li><li>Supports contexts.</li><li>Supports interpolation using familiar Erlang format control sequences (from io:format).</li><li>Supports translating singular term with or without interpolation and with or without context.</li><li>Supports translating plural term with or without interpolation and with or without context.</li><li>Supports all plural terms formulas defined by UNICODE CLDR.</li><li>Supports ETS tables based caching.</li></ul><h2 id="alternatives" class="section-heading">
<a href="#alternatives" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">alternatives</p>
</a>
Alternatives
</h2>
<ul><li>Erlang Gettext tools for multi-lingual capabilities: <a href="https://github.com/etnt/gettext">https://github.com/etnt/gettext</a></li></ul><h3 id="quick-comparison-with-erlang-gettext" class="section-heading">
<a href="#quick-comparison-with-erlang-gettext" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">quick-comparison-with-erlang-gettext</p>
</a>
Quick comparison with Erlang Gettext
</h3>
<table><thead><tr><th style="text-align: left;">#</th><th style="text-align: left;">Feature</th><th style="text-align: left;">t__</th><th style="text-align: left;">gettext</th></tr></thead><tbody><tr><td style="text-align: left;">1</td><td style="text-align: left;">Single macro that handles everything</td><td style="text-align: left;">YES: T__</td><td style="text-align: left;">NO: TXT &amp; TXT2</td></tr><tr><td style="text-align: left;">2</td><td style="text-align: left;">gettext contexts</td><td style="text-align: left;">YES</td><td style="text-align: left;">NO</td></tr><tr><td style="text-align: left;">3</td><td style="text-align: left;">gettext plural terms</td><td style="text-align: left;">YES</td><td style="text-align: left;">NO</td></tr><tr><td style="text-align: left;">4</td><td style="text-align: left;">Separate configurations for each application started at the same node</td><td style="text-align: left;">YES</td><td style="text-align: left;">NO</td></tr><tr><td style="text-align: left;">5</td><td style="text-align: left;">Diffrent language sources</td><td style="text-align: left;">YES: using application 'repositories'</td><td style="text-align: left;">YES: using diffrent languages servers</td></tr><tr><td style="text-align: left;">6</td><td style="text-align: left;">Developer mode/monitoring PO file changes</td><td style="text-align: left;">YES: automatically detecting PO changes</td><td style="text-align: left;">NO: requires manual reloading of the PO files</td></tr><tr><td style="text-align: left;">7</td><td style="text-align: left;">Cache</td><td style="text-align: left;">YES: ETS reads/writes on the calling process (faster)</td><td style="text-align: left;">YES: ETS reads/writes inside the translation gen_server</td></tr></tbody></table><h2 id="limitations" class="section-heading">
<a href="#limitations" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">limitations</p>
</a>
Limitations
</h2>
<ul><li>Gettext plural-forms formulas are hardcoded using a database. Work is underway to bypass this limitation and provide a full interpretor of any arbitrary gettext C formula.</li></ul><h2 id="documentation" class="section-heading">
<a href="#documentation" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">documentation</p>
</a>
Documentation
</h2>
<ul><li>Github pages: <a href="https://ergenius.github.io/t__/">https://ergenius.github.io/t__/</a></li><li>'/doc' subdirectory (generated by ex_doc)</li></ul><h2 id="usage" class="section-heading">
<a href="#usage" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">usage</p>
</a>
Usage
</h2>
<h3 id="full-demo-application-provided" class="section-heading">
<a href="#full-demo-application-provided" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">full-demo-application-provided</p>
</a>
Full demo application provided
</h3>
<p>You can find a full demo application on <a href="https://github.com/ergenius/t__/tree/main/demoapp">Github t__ demoapp</a>.
The application demonstrate most functionalities, including using multiple repositories and t__ being able to monitor repositories PO changes and reload them in real time.
You can test this feature by modifying any PO files used by the demoapp while you run the application in console mode. A gen_server constinously translating strings on a timer is provided, so you can easily check the updates. </p><h3 id="set-get-the-calling-process-language" class="section-heading">
<a href="#set-get-the-calling-process-language" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">set-get-the-calling-process-language</p>
</a>
Set/get the calling process language
</h3>
<h4>Set the language</h4><p>It is higly recommended to set the calling process language in order to avoid specifying the language for each ?T<strong> macro call.
The specified language will be used by all ?T</strong> macros and functions for the current process if no explicit language is specified as a macro or function parameter.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__LANGUAGE</span><span class="p" data-group-id="5024230367-1">(</span><span class="s">&quot;en&quot;</span><span class="p" data-group-id="5024230367-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__LANGUAGE</span><span class="p" data-group-id="5024230367-2">(</span><span class="s">&quot;en_GB&quot;</span><span class="p" data-group-id="5024230367-2">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__LANGUAGE</span><span class="p" data-group-id="5024230367-3">(</span><span class="s">&quot;ro&quot;</span><span class="p" data-group-id="5024230367-3">)</span><span class="p">.</span></code></pre><h4>Get the language</h4><p>Get the calling process language.</p><p>When you properly setup the language for the process, the expected time complexity for the current implementation
of this macro is O(1) and the worst case time complexity is O(N), where N is the number of items in the process dictionary.</p><p>The function will perform the following steps in order to determine the default language:</p><ul><li>call erlang:get(t__language)</li><li>call application:get_env(t__language)</li><li>call application:get<em>env(t_</em>, t__language)</li><li>if no t<strong>language environment key was set for both the current application or the t</strong> application
we return t<strong> default language defined in t</strong>.hrl file (wich is &quot;en&quot;).</li></ul><pre><code class="makeup erlang" translate="no"><span class="n">Language</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">?</span><span class="n">T__LANGUAGE</span><span class="p" data-group-id="6999002392-1">(</span><span class="p" data-group-id="6999002392-1">)</span><span class="p">.</span></code></pre><h3 id="t__-macro-examples" class="section-heading">
<a href="#t__-macro-examples" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">t__-macro-examples</p>
</a>
T__ macro examples
</h3>
<h4>Singular terms</h4><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="3515604699-1">(</span><span class="s">&quot;I have a joke about Erlang, but it requires a prologue.&quot;</span><span class="p" data-group-id="3515604699-1">)</span><span class="p">.</span></code></pre><p>You can use binaries and atoms, however it is not recommended.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="1555919305-1">(</span><span class="p">&lt;&lt;</span><span class="s">&quot;Erlang is user-friendly, it’s just picky about its friends!&quot;</span><span class="p">&gt;&gt;</span><span class="p" data-group-id="1555919305-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="1555919305-2">(</span><span class="ss">&#39;Why can\&#39;t you trust atoms? Because they make up everything!&#39;</span><span class="p" data-group-id="1555919305-2">)</span><span class="p">.</span></code></pre><h4>Singular with context</h4><p>Context is useful for the translators to distinguish in between identical strings.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="9020409955-1">(</span><span class="p" data-group-id="9020409955-2">{</span><span class="s">&quot;menu&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Save&quot;</span><span class="p" data-group-id="9020409955-2">}</span><span class="p" data-group-id="9020409955-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="9020409955-3">(</span><span class="p" data-group-id="9020409955-4">{</span><span class="s">&quot;menu&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Quit&quot;</span><span class="p" data-group-id="9020409955-4">}</span><span class="p" data-group-id="9020409955-3">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="9020409955-5">(</span><span class="p" data-group-id="9020409955-6">{</span><span class="s">&quot;button&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Save&quot;</span><span class="p" data-group-id="9020409955-6">}</span><span class="p" data-group-id="9020409955-5">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="9020409955-7">(</span><span class="p" data-group-id="9020409955-8">{</span><span class="s">&quot;button&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Cancel&quot;</span><span class="p" data-group-id="9020409955-8">}</span><span class="p" data-group-id="9020409955-7">)</span><span class="p">.</span></code></pre><p>Context can also be used to create proper translations based on grammatical gender.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="0616336131-1">(</span><span class="p" data-group-id="0616336131-2">{</span><span class="s">&quot;female&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;The cat belong to him/her&quot;</span><span class="p" data-group-id="0616336131-2">}</span><span class="p" data-group-id="0616336131-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="0616336131-3">(</span><span class="p" data-group-id="0616336131-4">{</span><span class="s">&quot;male&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;The cat belong to him/her&quot;</span><span class="p" data-group-id="0616336131-4">}</span><span class="p" data-group-id="0616336131-3">)</span><span class="p">.</span></code></pre><h4>Singular with repository</h4><p>Repositories are used to have different translations sources directories for the same application.
For example let's assume your application has many HTML templates, each with his own translation directory.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="2531783473-1">(</span><span class="p" data-group-id="2531783473-2">{</span><span class="s">&quot;template1&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2531783473-3">{</span><span class="s">&quot;Simple term from repository template1&quot;</span><span class="p" data-group-id="2531783473-3">}</span><span class="p" data-group-id="2531783473-2">}</span><span class="p" data-group-id="2531783473-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="2531783473-4">(</span><span class="p" data-group-id="2531783473-5">{</span><span class="s">&quot;template2&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="2531783473-6">{</span><span class="s">&quot;Simple term from repository template2&quot;</span><span class="p" data-group-id="2531783473-6">}</span><span class="p" data-group-id="2531783473-5">}</span><span class="p" data-group-id="2531783473-4">)</span><span class="p">.</span></code></pre><p>Repository can be combined with context also.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="6696452425-1">(</span><span class="p" data-group-id="6696452425-2">{</span><span class="s">&quot;template1&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6696452425-3">{</span><span class="s">&quot;menu&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Save&quot;</span><span class="p" data-group-id="6696452425-3">}</span><span class="p" data-group-id="6696452425-2">}</span><span class="p" data-group-id="6696452425-1">)</span><span class="p">.</span></code></pre><h4>Singular terms with interpolation</h4><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="6521403281-1">(</span><span class="s">&quot;~4.2f&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6521403281-2">[</span><span class="mf">3.56</span><span class="p" data-group-id="6521403281-2">]</span><span class="p" data-group-id="6521403281-1">)</span><span class="p">.</span><span class="w"> </span></code></pre><h4>Context for gramatical gender with interpolation</h4><p>Context can also be used to create the proper translation based on grammatical gender combined with interpolation:</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="6698704747-1">(</span><span class="p" data-group-id="6698704747-2">{</span><span class="s">&quot;female&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Her/his name is </span><span class="si">~s</span><span class="s">&quot;</span><span class="p" data-group-id="6698704747-2">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6698704747-3">[</span><span class="s">&quot;Marry&quot;</span><span class="p" data-group-id="6698704747-3">]</span><span class="p" data-group-id="6698704747-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="6698704747-4">(</span><span class="p" data-group-id="6698704747-5">{</span><span class="s">&quot;male&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Her/his name is </span><span class="si">~s</span><span class="s">&quot;</span><span class="p" data-group-id="6698704747-5">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="6698704747-6">[</span><span class="s">&quot;John&quot;</span><span class="p" data-group-id="6698704747-6">]</span><span class="p" data-group-id="6698704747-4">)</span><span class="p">.</span></code></pre><h4>Plural terms with interpolation:</h4><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="5910435943-1">(</span><span class="p" data-group-id="5910435943-2">[</span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> user&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> users&quot;</span><span class="p" data-group-id="5910435943-2">]</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="5910435943-3">[</span><span class="mi">3</span><span class="p" data-group-id="5910435943-3">]</span><span class="p" data-group-id="5910435943-1">)</span><span class="p">.</span></code></pre><h4>Plural terms with context and interpolation</h4><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="3707147139-1">(</span><span class="p" data-group-id="3707147139-2">{</span><span class="s">&quot;female&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3707147139-3">[</span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> file belongs to her/him&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> files belong to her/him&quot;</span><span class="p" data-group-id="3707147139-3">]</span><span class="p" data-group-id="3707147139-2">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3707147139-4">[</span><span class="mi">3</span><span class="p" data-group-id="3707147139-4">]</span><span class="p" data-group-id="3707147139-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="3707147139-5">(</span><span class="p" data-group-id="3707147139-6">{</span><span class="s">&quot;male&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3707147139-7">[</span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> file belongs to her/him&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> files belong to her/him&quot;</span><span class="p" data-group-id="3707147139-7">]</span><span class="p" data-group-id="3707147139-6">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3707147139-8">[</span><span class="mi">3</span><span class="p" data-group-id="3707147139-8">]</span><span class="p" data-group-id="3707147139-5">)</span><span class="p">.</span></code></pre><h4>Plural terms with context, interpolation and repositories</h4><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="3487537116-1">(</span><span class="p" data-group-id="3487537116-2">{</span><span class="s">&quot;template1&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3487537116-3">{</span><span class="s">&quot;female&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3487537116-4">[</span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> file belongs to her/him&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> files belong to her/him&quot;</span><span class="p" data-group-id="3487537116-4">]</span><span class="p" data-group-id="3487537116-3">}</span><span class="p" data-group-id="3487537116-2">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3487537116-5">[</span><span class="mi">3</span><span class="p" data-group-id="3487537116-5">]</span><span class="p" data-group-id="3487537116-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="3487537116-6">(</span><span class="p" data-group-id="3487537116-7">{</span><span class="s">&quot;template1&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3487537116-8">{</span><span class="s">&quot;male&quot;</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3487537116-9">[</span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> file belongs to her/him&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;</span><span class="si">~B</span><span class="s"> files belong to her/him&quot;</span><span class="p" data-group-id="3487537116-9">]</span><span class="p" data-group-id="3487537116-8">}</span><span class="p" data-group-id="3487537116-7">}</span><span class="p">,</span><span class="w"> </span><span class="p" data-group-id="3487537116-10">[</span><span class="mi">3</span><span class="p" data-group-id="3487537116-10">]</span><span class="p" data-group-id="3487537116-6">)</span><span class="p">.</span></code></pre><h4>Translate using #t__p{} record</h4><p>You can also specify everything using the #t<strong>p{} record as a single parameter to the T</strong> macro.
This is actually the performance wise way of doing it. You will save some extra functions calls necessary
to understand your tuples. All #t__p{} fields except msg are optional.</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="7693603225-1">(</span><span class="o">#</span><span class="ss">t__p</span><span class="p" data-group-id="7693603225-2">{</span><span class="ss">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;Hello world&quot;</span><span class="p" data-group-id="7693603225-2">}</span><span class="p" data-group-id="7693603225-1">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="7693603225-3">(</span><span class="o">#</span><span class="ss">t__p</span><span class="p" data-group-id="7693603225-4">{</span><span class="ss">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;Her name is </span><span class="si">~s</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7693603225-5">[</span><span class="s">&quot;Marry&quot;</span><span class="p" data-group-id="7693603225-5">]</span><span class="p" data-group-id="7693603225-4">}</span><span class="p" data-group-id="7693603225-3">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="7693603225-6">(</span><span class="o">#</span><span class="ss">t__p</span><span class="p" data-group-id="7693603225-7">{</span><span class="ss">language</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;ro&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">context</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;female&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;Her/his name is </span><span class="si">~s</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7693603225-8">[</span><span class="s">&quot;Marry&quot;</span><span class="p" data-group-id="7693603225-8">]</span><span class="p" data-group-id="7693603225-7">}</span><span class="p" data-group-id="7693603225-6">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="7693603225-9">(</span><span class="o">#</span><span class="ss">t__p</span><span class="p" data-group-id="7693603225-10">{</span><span class="ss">repository</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;module1&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">language</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;ro&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">context</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;male&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;Her/his name is </span><span class="si">~s</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7693603225-11">[</span><span class="s">&quot;John&quot;</span><span class="p" data-group-id="7693603225-11">]</span><span class="p" data-group-id="7693603225-10">}</span><span class="p" data-group-id="7693603225-9">)</span><span class="p">.</span><span class="w">
</span><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="7693603225-12">(</span><span class="o">#</span><span class="ss">t__p</span><span class="p" data-group-id="7693603225-13">{</span><span class="ss">application</span><span class="o">=</span><span class="ss">myapp</span><span class="p">,</span><span class="w"> </span><span class="ss">repository</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;module1&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">language</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;ro&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">context</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;female&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">msg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;Her/his name is </span><span class="si">~s</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="ss">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p" data-group-id="7693603225-14">[</span><span class="s">&quot;Marry&quot;</span><span class="p" data-group-id="7693603225-14">]</span><span class="p" data-group-id="7693603225-13">}</span><span class="p" data-group-id="7693603225-12">)</span><span class="p">.</span></code></pre><h4>Macro with all possible parameters separated</h4><p>For your convenience a macro also exists with all possible parameters:</p><pre><code class="makeup erlang" translate="no"><span class="o">?</span><span class="n">T__</span><span class="p" data-group-id="1902967575-1">(</span><span class="n">Application</span><span class="p">,</span><span class="w"> </span><span class="n">Repository</span><span class="p">,</span><span class="w"> </span><span class="n">Language</span><span class="p">,</span><span class="w"> </span><span class="n">Context</span><span class="p">,</span><span class="w"> </span><span class="n">Msg</span><span class="p">,</span><span class="w"> </span><span class="n">Data</span><span class="p" data-group-id="1902967575-1">)</span><span class="p">.</span></code></pre><h2 id="plural-formulas" class="section-heading">
<a href="#plural-formulas" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">plural-formulas</p>
</a>
Plural formulas
</h2>
<h3 id="is-plural-formula-data-correct" class="section-heading">
<a href="#is-plural-formula-data-correct" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">is-plural-formula-data-correct</p>
</a>
Is plural formula data correct?
</h3>
<p>Short answer: Yes, if you trust CLDR Project.</p><h3 id="how-plural-formulas-where-generated-from-cldr" class="section-heading">
<a href="#how-plural-formulas-where-generated-from-cldr" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">how-plural-formulas-where-generated-from-cldr</p>
</a>
How plural formulas where generated from CLDR?
</h3>
<p>For mantaining plural formulas database we started another project here: <a href="https://github.com/ergenius/gettext-po-samples">gettext-po-samples</a></p><p>We use the following sources and tools for compiling the database:</p><ul><li><a href="https://cldr.unicode.org/">cldr.unicode.org</a></li><li><a href="https://github.com/php-gettext/Languages">PHP gettext language list</a></li><li><a href="http://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html">TranslateHouse</a></li></ul><p>Formulas are automated generated by <a href="https://github.com/php-gettext/Languages">PHP gettext language list</a> from CLDR. Each new release is manually checked and compared with the sources mentioned above. Data is compiled into <a href="https://github.com/ergenius/gettext-po-samples/blob/main/data/plural-forms.eterm">plural-forms.eterm</a> file.
The same <a href="https://github.com/ergenius/gettext-po-samples/blob/main/data/plural-forms.eterm">plural-forms.eterm</a> file is used to generate <a href="src/t__plural.erl">src/t__plural.erl</a> file.</p><h2 id="project-roadmap" class="section-heading">
<a href="#project-roadmap" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">project-roadmap</p>
</a>
Project roadmap
</h2>
<ol><li>Continuously fixing bugs and tuning performance.</li><li>Writing more testing units.</li><li>Add more features.</li></ol><h2 id="erlang-versions-supported" class="section-heading">
<a href="#erlang-versions-supported" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">erlang-versions-supported</p>
</a>
Erlang versions supported
</h2>
<p>t__ officially supports OTP release 20 and later.</p><p>Development takes place using OTP 25 release and tests are done on:</p><ul><li>25.0.3</li><li>24.3.4</li><li>23.3.4</li><li>22.3.4</li><li>21.3.8</li><li>20.3.8</li></ul><p>Unofficially, you may be able to use t__ with older Erlang versions. No guarantee included.</p><h2 id="dependencies" class="section-heading">
<a href="#dependencies" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">dependencies</p>
</a>
Dependencies
</h2>
<p>None.</p><h2 id="authors" class="section-heading">
<a href="#authors" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">authors</p>
</a>
Authors
</h2>
<ul><li>Madalin Grigore-Enescu (ergenius) - <a href="https://github.com/ergenius">Github</a> <a href="<https://ergenius.com>">ergenius.com</a></li></ul><h2 id="license" class="section-heading">
<a href="#license" class="hover-link"><i class="ri-link-m" aria-hidden="true"></i>
<p class="sr-only">license</p>
</a>
License
</h2>
<p>t__ is available under the MIT license (see <code class="inline">LICENSE</code>).</p>
<div class="bottom-actions">
<div class="bottom-actions-item">
<a href="api-reference.html" class="bottom-actions-button" rel="prev">
<span class="subheader">
← Previous Page
</span>
<span class="title">
API Reference
</span>
</a>
</div>
<div class="bottom-actions-item">
<a href="changelog.html" class="bottom-actions-button" rel="next">
<span class="subheader">
Next Page →
</span>
<span class="title">
Changelog
</span>
</a>
</div>
</div>
<footer class="footer">
<p>
On Hex.pm:
<span class="line">
<a href="https://hex.pm/packages/t__/0.1.0" class="line footer-hex-package">Package</a>
<a href="https://preview.hex.pm/preview/t__/0.1.0" class="line">Preview</a>
<a href="https://preview.hex.pm/preview/t__/0.1.0/show/README.md">(current file)</a>
</span>
<button class="line footer-button display-quick-switch">
Search
</button>
</p>
<p>
Built using
<a href="https://github.com/elixir-lang/ex_doc" title="ExDoc" target="_blank" rel="help noopener" translate="no">ExDoc</a> (v0.28.5) for the
<a href="https://erlang.org" title="Erlang" target="_blank" translate="no">Erlang programming language</a>
</p>
</footer>
</div>
</div>
</section>
</div>
</body>
</html>