All supported frameworks
Phoenix workflow

Translate and validate Phoenix Gettext catalogs

Keep Gettext catalogs in priv/gettext and interpolation intact. Forthwith translates only new and changed messages, validates target catalogs, and writes PO updates ready for normal review.

priv/gettext/default.pot

$ forthwith check

[ERROR] Placeholder mismatch · Welcome, %{name}

priv/gettext/es/LC_MESSAGES/default.po:118 missing %{name}

Local scan · no account · no upload
Native Gettext PO catalogs
Elixir interpolation stays intact
Catalog-aware plural output

Install path

Check the repository you already have

Install Forthwith and run the local check from the umbrella or application root. It inspects supported Gettext catalogs without adding a Mix dependency or requiring a Forthwith project config.

  1. 1

    Install the Forthwith CLI

    Use Homebrew on macOS, the install script on Linux, or Scoop on Windows.

  2. 2

    Open the repository root

    Keep the check beside your source code and existing localization resources.

  3. 3

    Run forthwith check

    Review actionable findings locally before creating an account or changing a file.

macOS quick start

No configuration required
brew install Forthwith-LLC/forthwith/forthwith
cd path/to/your-project
forthwith check
Linux and Windows install options The first check never changes files.

Framework-aware validation

Protect Gettext message contracts

Validate the catalog details that can compile cleanly yet produce incomplete or broken localized output at runtime.

Interpolation values

Keep named Elixir interpolation values aligned with the msgid.

Plural slots

Check the plural forms the target Gettext catalog can persist in its msgstr slots.

Missing messages

Find untranslated entries, empty msgstr values, and missing target messages.

Catalog structure

Surface malformed PO syntax and duplicate messages with file locations.

Sample diff

Review localization like any other code change

Generated translations remain in the locale catalog alongside source references and interpolation syntax. No separate translation runtime or delivery layer is introduced.

  • Native files stay in their expected location.
  • Placeholders remain visible to reviewers.
  • Only new, changed, or repaired entries appear in the diff.
priv/gettext/es/LC_MESSAGES/default.po Generated change
--- a/priv/gettext/es/LC_MESSAGES/default.po+++ b/priv/gettext/es/LC_MESSAGES/default.po@@ -116,3 +116,3 @@ #: lib/example_web/live/account_live.ex:42 msgid "Welcome, %{name}"-msgstr ""+msgstr "Te damos la bienvenida, %{name}"

CI recipe

Validate Gettext catalogs in pull requests

Run the local check beside compilation and tests to catch missing translations and interpolation drift with catalog-specific locations.

Validation needs no Forthwith token. Exit code 1 fails the job when errors are found; --warnings-as-errors also treats warnings as release blockers.

.github/workflows/localization.yml GitHub Actions
name: Phoenix Gettext localization

on: pull_request

jobs:
  localization:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Forthwith
        run: curl -fsSL https://raw.githubusercontent.com/Forthwith-LLC/forthwith-releases/main/install.sh | bash
      - name: Validate localization files
        run: forthwith check --warnings-as-errors

When you are ready to translate

Move from a local report to a reviewable locale update

After extracting messages with your normal Gettext workflow, initialize Forthwith and translate only new, changed, and missing entries. The resulting PO files stay ready for compilation and review.