<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>I18n | The .NET Blog</title><link>https://thedotnetblog.com/tags/i18n/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>en</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Fri, 14 Feb 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/tags/i18n/index.xml" rel="self" type="application/rss+xml"/><item><title>We Added Multi-Language Support</title><link>https://thedotnetblog.com/posts/emiliano-montesdeoca/we-added-multi-language-support/</link><pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/posts/emiliano-montesdeoca/we-added-multi-language-support/</guid><description>The .NET Blog now publishes every post in 17 languages using automated translation — and here's how we built it into the Hugo workflow.</description><content:encoded>&lt;p&gt;As of today, every new post on The .NET Blog is automatically translated into 16 additional languages.&lt;/p&gt;
&lt;p&gt;We support: English, Spanish, Catalan, German, French, Portuguese, Italian, Japanese, Chinese, Korean, Russian, Hindi, Polish, Turkish, Arabic, Indonesian, and Dutch.&lt;/p&gt;
&lt;h2 id="why-bother"&gt;Why bother?&lt;/h2&gt;
&lt;p&gt;The .NET ecosystem is global. A large chunk of our readers are not native English speakers, and while most developers &lt;em&gt;can&lt;/em&gt; read technical English, reading in your first language is faster and less fatiguing. If we want the blog to actually be useful to the wider .NET community, we had to solve this.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;Each post lives in a &lt;strong&gt;leaf bundle&lt;/strong&gt; — a folder with an &lt;code&gt;index.md&lt;/code&gt; and language-specific variants like &lt;code&gt;index.es.md&lt;/code&gt;, &lt;code&gt;index.ja.md&lt;/code&gt;, etc. Hugo&amp;rsquo;s multilingual mode handles routing: &lt;code&gt;/posts/my-post/&lt;/code&gt; serves English, &lt;code&gt;/es/posts/my-post/&lt;/code&gt; serves Spanish, and so on.&lt;/p&gt;
&lt;p&gt;Translation is handled as part of the content pipeline. When a new post is merged, a workflow generates the translated variants and commits them alongside the original.&lt;/p&gt;
&lt;h2 id="what-we-didnt-want"&gt;What we didn&amp;rsquo;t want&lt;/h2&gt;
&lt;p&gt;We specifically didn&amp;rsquo;t want a &amp;ldquo;translated version&amp;rdquo; to feel like a second-class page. Every translated page has the same layout, the same code examples, and the same SEO treatment as the English original.&lt;/p&gt;
&lt;p&gt;The language switcher in the header lets readers jump between languages on any page — it links to the same content, not the home page.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;Right-to-left layout support for Arabic is on the list. The CSS foundation is in place (&lt;code&gt;dir=&amp;quot;rtl&amp;quot;&lt;/code&gt; on the &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt; element), but there are a few edge cases in the post layout to sort out first.&lt;/p&gt;</content:encoded></item></channel></rss>