
TL;DR
You are working on a Phoenix application that uses Elixir Gettext for translations. As all team members are doing changes on translation files, you have a lot of merging conflicts on those files. In the end, you sometimes lose some translations in msgstr variable from translation files.
Elixir Gettext
Elixir Gettext is a library for managing translations in your web application. Workflow is very simple:
-
- use
gettext("Welcome Back") in your source code. - sync code with translation files using
mix gettext.extract --merge - Add translation to
.pofile, here is a German example:priv/gettext/de/LC_MESSAGES/default.po
- use
msgid "Welcome Back"
msgstr "Herzlich Willkommen"
gettext knows which string to use based on locale assign in session, eg. en or de
Teamwork
You will probably work in a team where each member pushes to main branch new code through feature branch. Your po files are getting bigger and bigger, and there is 100% for merge conflict on those files. You will try to resolve to merge conflict (you must break the first rule of gettext, do not edit po files by hand). You start you mix phx.server`and you get gettext the error:
duplicate msgid
Good luck with that!
Solution
The solution is very simple, use dgettext("domain_1", "Welcome Back")which will put translation to domain_1 po files. Let each team member has its own domain for translations. No more merge conflicts and long hours resolving them (and losing translations in msgstr).