Kanta.PoFiles.POFileParser (kanta v0.5.1)

Shared logic for parsing PO files and extracting message data. Used by both sync (MessagesExtractor) and stale detection.

Summary

Functions

Extracts just the message keys for stale detection.

Extracts message keys for a single locale only.

Finds all PO files in the given base directory.

Parses all PO files and returns messages with metadata.

Functions

extract_message_keys(base_path, allowed_locales \\ nil)

Extracts just the message keys for stale detection.

Returns a MapSet of tuples: {msgid, domain, context}

Arguments

  • base_path - Base directory to search for PO files
  • allowed_locales - Optional list of locale codes to filter by

Examples

iex> POFileParser.extract_message_keys("/path/to/priv/gettext")
#MapSet<[
  {"Welcome", "default", "default"},
  {"Hello %{name}", "default", "greetings"},
  {"Error occurred", "errors", "default"}
]>

extract_message_keys_for_locale(base_path, locale_code)

Extracts message keys for a single locale only.

Convenience wrapper around extract_message_keys/2 for per-locale detection.

Arguments

  • base_path - Base directory to search for PO files
  • locale_code - Single locale code (e.g., "en", "it")

Examples

iex> POFileParser.extract_message_keys_for_locale("/path/to/priv/gettext", "en")
#MapSet<[
  {"Welcome", "default", "default"},
  {"Hello %{name}", "default", "greetings"}
]>

find_po_files(base_path, allowed_locales \\ nil)

Finds all PO files in the given base directory.

Arguments

  • base_path - Base directory to search for PO files (e.g., "/path/to/priv/gettext" or "test/fixtures")
  • allowed_locales - Optional list of locale codes to filter by (e.g., ["en", "pl"])

Returns

List of maps with keys:

  • :path - Full path to the PO file
  • :locale - Locale code (e.g., "en", "pl")
  • :domain - Domain name (e.g., "default", "errors")

Examples

iex> POFileParser.find_po_files("/path/to/priv/gettext")
[
  %{path: "/path/to/priv/gettext/en/LC_MESSAGES/default.po", locale: "en", domain: "default"},
  %{path: "/path/to/priv/gettext/pl/LC_MESSAGES/default.po", locale: "pl", domain: "default"}
]

iex> POFileParser.find_po_files("/path/to/priv/gettext", ["en"])
[
  %{path: "/path/to/priv/gettext/en/LC_MESSAGES/default.po", locale: "en", domain: "default"}
]

parse_all_po_files(base_path, allowed_locales \\ nil)

Parses all PO files and returns messages with metadata.

Arguments

  • base_path - Base directory to search for PO files
  • allowed_locales - Optional list of locale codes to filter by

Returns

List of maps with keys:

  • :path - Full path to the PO file
  • :locale - Locale code
  • :domain - Domain name
  • :messages - List of Expo.Message structs

Examples

iex> POFileParser.parse_all_po_files("/path/to/priv/gettext")
[
  %{
    path: "/path/to/en/default.po",
    locale: "en",
    domain: "default",
    messages: [%Expo.Message.Singular{...}, ...]
  }
]