View Source Expo.PO (expo v1.1.0)

File handling for PO (.po) and POT (.pot) files.

Summary

Types

Parsing option.

Functions

Dumps a Expo.Messages struct as iodata.

Parses the contents of a file into a Expo.Messages struct.

Parses the contents of a file into a Expo.Messages struct, raising if there are any errors.

Parses the given string into a Expo.Messages struct.

Parses string into a Expo.Messages struct, raising an exception if there are any errors.

Types

@type parse_option() :: {:file, Path.t()} | {:strip_meta, boolean()}

Parsing option.

  • :file (Path.t/0) - path to use in error messages when using parse_string/2. If not present, errors don't have a path.

  • :strip_meta (boolean/0) - include only messages (no comments and other metadata) from the .po file to reduce memory usage when meta information is not needed. Defaults to false.

Functions

@spec compose(Expo.Messages.t()) :: iodata()

Dumps a Expo.Messages struct as iodata.

This function dumps a Expo.Messages struct (representing a PO file) as iodata, which can later be written to a file or converted to a string with IO.iodata_to_binary/1.

Examples

After running the following code:

iodata =
  Expo.PO.compose(%Expo.Messages{
    headers: ["Last-Translator: Jane Doe"],
    messages: [
      %Expo.Message.Singular{msgid: ["foo"], msgstr: ["bar"], comments: "A comment"}
    ]
  })

File.write!("/tmp/test.po", iodata)

the /tmp/test.po file would look like this:

msgid ""
msgstr ""
"Last-Translator: Jane Doe"

# A comment
msgid "foo"
msgstr "bar"
Link to this function

parse_file(path, options \\ [])

View Source
@spec parse_file(Path.t(), [parse_option()]) ::
  {:ok, Expo.Messages.t()}
  | {:error,
     Expo.PO.SyntaxError.t() | Expo.PO.DuplicateMessagesError.t() | File.posix()}

Parses the contents of a file into a Expo.Messages struct.

This function works similarly to parse_string/1 except that it takes a file and parses the contents of that file. It can return:

  • {:ok, po} if the parsing is successful

  • {:error, error} if there is an error with the contents of the .po file (for example, a syntax error); error is an exception struct

  • {:error, reason} if there is an error with reading the file (this error is one of the errors that can be returned by File.read/1)

Examples

{:ok, po} = Expo.PO.parse_file("messages.po")
po.file
#=> "messages.po"

Expo.PO.parse_file("nonexistent")
#=> {:error, :enoent}
Link to this function

parse_file!(path, opts \\ [])

View Source
@spec parse_file!(Path.t(), [parse_option()]) :: Expo.Messages.t()

Parses the contents of a file into a Expo.Messages struct, raising if there are any errors.

Works like parse_file/1, except that it raises an exception if there are issues with the contents of the file or with reading the file.

Examples

Expo.PO.parse_file!("nonexistent.po")
#=> ** (File.Error) could not parse "nonexistent.po": no such file or directory
Link to this function

parse_string(string, options \\ [])

View Source
@spec parse_string(String.t(), [parse_option()]) ::
  {:ok, Expo.Messages.t()}
  | {:error, Expo.PO.SyntaxError.t() | Expo.PO.DuplicateMessagesError.t()}

Parses the given string into a Expo.Messages struct.

It returns {:ok, messages} if there are no errors, otherwise {:error, error} where error is an exception struct.

Examples

iex> {:ok, po} = Expo.PO.parse_string("""
...> msgid "foo"
...> msgstr "bar"
...> """)
iex> [message] = po.messages
iex> message.msgid
["foo"]
iex> message.msgstr
["bar"]
iex> po.headers
[]

iex> Expo.PO.parse_string("foo")
{:error, %Expo.PO.SyntaxError{line: 1, reason: "unknown keyword 'foo'"}}
Link to this function

parse_string!(string, opts \\ [])

View Source
@spec parse_string!(String.t(), [parse_option()]) :: Expo.Messages.t()

Parses string into a Expo.Messages struct, raising an exception if there are any errors.

Works exactly like parse_string/1, but returns a Expo.Messages struct if there are no errors or raises an exception if there are.

Examples

iex> po = Expo.PO.parse_string!("""
...> msgid "foo"
...> msgstr "bar"
...> """)
iex> [message] = po.messages
iex> message.msgid
["foo"]
iex> message.msgstr
["bar"]
iex> po.headers
[]

iex> Expo.PO.parse_string!("msgid")
** (Expo.PO.SyntaxError) 1: no space after 'msgid'