I&#x27;ve been using gettext for a long time, and used to think like you. But I&#x27;m slowly changing my mind.<p>The problem with gettext is that, when you change the English text, it also changes the ID of all translations. Moreover, it&#x27;s often necessary to complete the English text with a short string describing the context, to avoid any confusion between two identical strings in different contexts (for example &quot;open&quot; can have several meaning).<p>When you use a &quot;technical&quot; ID for each translation, you don&#x27;t have these problems anymore. You can fix a typo in the English translation without checking translations marked &quot;fuzzy&quot; in other languages. You can also include some context in the ID.<p>But the main advantage of using &quot;technical&quot; IDs it that you get a clear separation between the programmer and the product designer. The programmer doesn&#x27;t need to spend too much time choosing the right wording, and can focus on the code. The product designer can work on the wording independently without bothering the designer.<p>I note that the approach advocated by gettext is very popular among open source projects. It&#x27;s not a coincidence. Programmers working on open source projects are usually the ones writing the text displayed in the user interface.<p>I note that Java and .Net mainly advocate the &quot;technical&quot; ID approach. It&#x27;s not a coincidence either. In most IT projects, the text displayed in the user interface is not written by the programmer, but by some project manager or some product designer.<p>It&#x27;s perfectly possible to have a tool that scans your source code and automatically detects the calls to the translation function, even if you use &quot;technical&quot; IDs. Here is an example: <a href="http:&#x2F;&#x2F;glebm.github.io&#x2F;i18n-tasks&#x2F;" rel="nofollow">http:&#x2F;&#x2F;glebm.github.io&#x2F;i18n-tasks&#x2F;</a>