Migrates gettext calls and PO translations to ~t
Rewrites gettext/1,2 (and dgettext/2,3 with the "default" domain)
in Elixir code, ~H templates and .heex files into ~t, moves their
translations from priv/gettext/*/LC_MESSAGES/default.po into
priv/translations/default/*.json and removes the migrated messages
from the PO and POT files.
gettext("Hello %{name}", name: @user.name)
# becomes
~t"Hello #{@user.name}"
# msgid "Hello %{user_name}", placeholders in translations renamed to matchngettext/3,4 becomes tn/2 with its PO plural forms mapped to CLDR
categories:
ngettext("1 file", "%{count} files", length(files))
# becomes
tn(length(files), one: "1 file", other: "%{count} files")Bindings that are not a variable, assign or field keep their Gettext name:
gettext("Hi %{name}", name: String.upcase(u)) becomes
~t"Hi #{name = String.upcase(u)}".
Projects using gettext_sigils get use GettextSigils replaced and the
dependency removed. Their ~t sigils produce the same msgids, so
mix verified_translations.extract imports the existing translations.
Domains and contexts become ~t modifiers (dgettext("errors", "x") ->
~t"x"e), defined in the use VerifiedTranslations that gives the module
~t; plural ones become tn(n, domain: "errors", ...).
Calls that cannot be expressed are left alone and listed: dynamic msgids,
and domains or contexts without a use VerifiedTranslations to define a
modifier in.
Only modules that can use ~t are rewritten (use VerifiedTranslations
or use MyAppWeb, ...). Run with --dry-run to review the diff.
Example
mix verified_translations.migrate --locales en,fi,sv
Options
--locales- comma separated locales, source locale first. Defaults toenplus the locale directories inpriv/gettext.--gettext- Gettext priv directory, defaultpriv/gettext--path- translations directory, defaultpriv/translations