<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="385806" data-post-id="385806">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Schultzer" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Schultzer/120/4339_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Schultzer
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>You’ll lose syntax highlighting then. I would even go further and say the sigil should be ~GETTEXT</p>
<p>It would be clear to everyone reading the code what is happening here and also for other tools working on the AST.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="385806" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/42">Post #41</a>
	                </div>
	            </div>
              <div id="likers-container-385806" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385806"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #41"></div>
  </section>
</div>
    <div class="postbit" id="385865" data-post-id="385865">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="loics2" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  loics2
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Oh wow, thanks for this, I really look forward to using your library! As a French-speaking Swiss dev, the most annoying part is now to find translators <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="385865" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/43">Post #42</a>
	                </div>
	            </div>
              <div id="likers-container-385865" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="385865"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #42"></div>
  </section>
</div>
    <div class="postbit" id="386765" data-post-id="386765">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="hwuethrich" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/hwuethrich/120/33581_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  hwuethrich
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Quick update: I just released <strong>v0.5.0</strong> of this library, with support for <strong>custom modifiers</strong>!</p>
<p>In addition to the existing <code>domain</code>/<code>context</code> modifier keyword options, it is now possible to define custom modifiers as modules that implement the <a href="https://hexdocs.pm/gettext_sigils/GettextSigils.Modifier.html#t:msgid/0" rel="noopener nofollow ugc"><code>GettextSigils.Modifier</code></a> behaviour.</p>
<p>For example, custom modifiers can be used to postprocess the translated message:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyApp.MarkdownModifier do
  use GettextSigils.Modifier

  @impl true
  def postprocess(string, opts), 
    do: MDEx.to_html(string, opts)
end

defmodule MyApp.RawModifier do
  use GettextSigils.Modifier

  @impl true
  def postprocess(string, _opts) do 
    {:ok, Phoenix.HTML.raw(string)}
  end
end
</code></pre>
<p>The behaviour can also be used to implement custom pluralization rules (I recommend sticking with the default <code>N</code> modifier, though).</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">defmodule MyApp.SplitPluralModifier do
  use GettextSigils.Modifier

  @schema NimbleOptions.new!(
    separator: [
      type: :string,
      default: "|",
      doc: "Separator between singular and plural forms in the msgid."
    ]
  )

  @impl true
  def init(opts), do: NimbleOptions.validate(opts, @schema)

  @impl true
  def pluralize({msgid, bindings}, opts) do
    case Keyword.pop(bindings, :count) do
      {nil, _} -&gt;
        {:error, ~s|`n` modifier requires a "count" binding|}

      {count, remaining} -&gt;
        separator = Keyword.fetch!(opts, :separator)

        case String.split(msgid, separator, parts: 2) do
          [singular, plural] -&gt;
            {:ok, {singular, plural, count, remaining}}

          _ -&gt;
            {:error, ~s|`n` modifier requires msgid in the form "singular#{separator}plural"|}
        end
    end
  end
end
</code></pre>
<p>Then configure GettextSigils to use the modifiers:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">use GettextSigils,
  backend: MyApp.Gettext,
  sigils: [
    modifiers: [
      e: [domain: "errors"],
      r: MyApp.RawModifier,
      m: {MyApp.MarkdownModifier, extension: [strikethrough: true]},
      n: MyApp.SplitPluralModifier
    ]
  ]

~t"**One** error|**#{count}** errors"mrn
# =&gt; {:safe, "&lt;p&gt;&lt;strong&gt;5&lt;/strong&gt; errors&lt;/p&gt;"}
</code></pre>
<p>Thanks to <a class="mention" href="/u/eriknaslund" rel="nofollow">@ErikNaslund</a> for opening an <a href="https://github.com/zebbra/gettext_sigils/issues/32" rel="noopener nofollow ugc">issue</a> that eventually lead to this! <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386765" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/44">Post #43</a>
	                </div>
	            </div>
              <div id="likers-container-386765" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386765"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #43"></div>
  </section>
</div>
    <div class="postbit" id="386805" data-post-id="386805">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ErikNaslund" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ErikNaslund/120/26390_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ErikNaslund
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I just updated to 0.5.0 and rewrote my project to use my <code>RawModifier</code> and <code>StylingModifier</code> (markdown-like), instead of <code>raw/1</code> and custom gettext interpolations. Works like a charm and was really easy to do. Great work <a class="mention" href="/u/hwuethrich" rel="nofollow">@hwuethrich</a> !</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386805" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/45">Post #44</a>
	                </div>
	            </div>
              <div id="likers-container-386805" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386805"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #44"></div>
  </section>
</div>
    <div class="postbit" id="386830" data-post-id="386830">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="BartOtten" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/BartOtten/120/25440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  BartOtten
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Nah, its mostly a probleem with tags in tags.</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">
&lt;div&gt;This should be &lt;b&gt;one&lt;/&gt; translatable string&lt;/div&gt;
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386830" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/46">Post #45</a>
	                </div>
	            </div>
              <div id="likers-container-386830" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386830"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #45"></div>
  </section>
</div>
    <div class="postbit" id="386975" data-post-id="386975">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="hwuethrich" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/hwuethrich/120/33581_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  hwuethrich
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for your feedback!</p>
<p>Just to be clear, the behaviour was added to give users the option to implement what they think works best for them. Some probably prefer using <code>raw(~t"...")</code> vs. a modifier that does the same. Others would probably make the case that markdown is easier to understand by a translator than raw HTML. The library now supports both.</p>
<p>The behaviour is also used internally for keyword-based modifiers (domain/context) and pluralization, but the library will probably not ship with anything that goes beyond that.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386975" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/47">Post #46</a>
	                </div>
	            </div>
              <div id="likers-container-386975" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386975"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #46"></div>
  </section>
</div>
    <div class="postbit" id="387007" data-post-id="387007">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="BartOtten" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/BartOtten/120/25440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  BartOtten
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thanks for your reply.</p>
<p>I was referring to my own proof of concept-attempt you responded to, not the current library. The explicitness is a key factor to keep things sane but it <em>would</em> be super if you could just set a HEEX-flag and all text in the HEEX tempates would become translatable (this would need some serious work, but everyone is free to be inspired…)</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="387007" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/48">Post #47</a>
	                </div>
	            </div>
              <div id="likers-container-387007" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="387007"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #47"></div>
  </section>
</div>
    <div class="postbit" id="387011" data-post-id="387011">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="kip" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kip/120/1440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  kip
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>ex_cldr Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<blockquote>
<p>if you could just set a HEEX-flag and all text in the HEEX tempates</p>
</blockquote>
<p><a href="https://messageformat.unicode.org" rel="nofollow">Unicode Message Format 2</a> attempts to solve part of this by having <a href="https://messageformat.unicode.org/docs/reference/markup/" rel="nofollow">structured markup in the message</a> format. The idea being it should be HTML safe, understandable and editable by translators, and reasonably easy to render back to raw HTML.</p>
<p>The markup syntax is parsed correctly by <a href="https://hexdocs.pm/localize/message_formatting.html#markup" rel="nofollow">Localize.Message</a> and it can be emitted as a <a href="https://hexdocs.pm/localize/Localize.Message.html#format_to_safe_list/3" rel="nofollow">list of kind-of-AST</a> with the interpolations done.</p>
<p>The next step will be to design the best way to integrate the HTML rendering into a HEEX/LiveView environment - and thats not my skill. Collaboration would be very welcome.</p>
<p>And for sure I will spend some time seeing how <code>Localize.Message</code> can integrate with  <code>gettext_sigils</code>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="387011" data-batch-url="/posts/batch_likers">
                        3
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/49">Post #48</a>
	                </div>
	            </div>
              <div id="likers-container-387011" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="387011"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #48"></div>
  </section>
</div>
    <div class="postbit" id="387023" data-post-id="387023">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="hwuethrich" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/hwuethrich/120/33581_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  hwuethrich
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Sorry, I misunderstood your reply! <img src="https://forum.elixirforum.com/images/emoji/apple/+1.png?v=15" title=":+1:" class="emoji" alt=":+1:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="387023" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/gettext-sigils-a-sigil-for-using-gettext-with-less-boilerplate-and-better-readability/74645/50">Post #49</a>
	                </div>
	            </div>
              <div id="likers-container-387023" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="387023"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>