In the Phoenix app at {{ web_dir }}, refactor all hardcoded text strings to use gettext with domain-based translation logic. Specifically:
Tasks
-
Convert hardcoded strings in templates, views, and controllers to use gettext functions
-
Organize translations by domain/context:
user- user account, profile, authentication related textadmin- admin panel, management, settings texterrors- error messages, validations, warningsnavigation- menus, links, breadcrumbs, page titlescommon- shared/general purpose text, buttons, actions
-
Use appropriate gettext functions:
- Use
dgettext/2for domain-specific translations - Use
dgettext/3when interpolation is needed - Use
dngettext/4for pluralization
- Use
- Extract strings from:
- All
.exfiles (controllers, views, live views, components) - All
.heextemplates - Any JavaScript/TypeScript with user-facing text
- All
Conventions
- msgids: Keep in English as the default language
- Imports: Add
import <AppName>Web.Gettextto modules that need it - Context comments: Add comments for ambiguous translations
- Interpolation: Use named parameters for dynamic content
Example Transformations
Templates (.heex)
# Before
<h1>Welcome to our app</h1>
<p>You have 5 messages</p>
# After
<h1><%= dgettext("navigation", "Welcome to our app") %></h1>
<p><%= dngettext("user", "You have 1 message", "You have %{count} messages", @message_count) %></p>
Controllers
# Before
conn
|> put_flash(:info, "User created successfully")
|> redirect(to: ~p"/users")
# After
conn
|> put_flash(:info, dgettext("user", "User created successfully"))
|> redirect(to: ~p"/users")
Views/Components
# Before
def error_message, do: "Something went wrong"
# After
def error_message, do: dgettext("errors", "Something went wrong")
LiveViews
# Before
{:noreply, put_flash(socket, :error, "Invalid input")}
# After
{:noreply, put_flash(socket, :error, dgettext("errors", "Invalid input"))}
Additional Requirements
- Maintain structure: Preserve existing code formatting and functionality
- Ensure imports: Verify Gettext module is imported where needed
- Check configuration: Ensure the Gettext module is properly configured in the app
- Handle edge cases:
- Don't translate attribute names, IDs, or technical values
- Don't translate log messages unless user-facing
- Keep email addresses, URLs, and code examples untranslated
Focus Area
Work only within the {{ web_dir }} directory and its subdirectories.