View Source Expo.Po (expo v0.1.0-beta.3)

.po / .pot file handler

Link to this section Summary

Functions

Dumps a Expo.Translations struct as iodata.

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

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

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

Parses a string into a Expo.Translations struct.

Link to this section Types

Link to this type

duplicate_translations_error()

View Source
@type duplicate_translations_error() ::
  {:error,
   {:duplicate_translations,
    [
      {message :: String.t(), new_line :: pos_integer(),
       old_line :: pos_integer()}
    ]}}
@type file_error() :: {:error, File.posix()}
@type parse_error() ::
  {:error,
   {:parse_error, message :: String.t(), context :: String.t(),
    line :: pos_integer()}}

Link to this section Functions

@spec compose(translations :: Expo.Translations.t()) :: iodata()

Dumps a Expo.Translations struct as iodata.

This function dumps a Expo.Translations 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

Examples

After running the following code:

iodata = Expo.Po.compose %Expo.Translations{
  headers: ["Last-Translator: Jane Doe"],
  translations: [
    %Expo.Translation.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"
@spec parse_file!(Path.t()) :: Expo.Translations.t() | no_return()

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

Works like parse_file/1, except that it raises a Expo.Po.SyntaxError exception if there's a syntax error in the file or a File.Error error if there's an error with reading the file.

examples

Examples

Expo.Po.parse_file! "nonexistent.po"
#=> ** (File.Error) could not parse "nonexistent.po": no such file or directory
@spec parse_file(path :: Path.t()) ::
  {:ok, Expo.Translations.t()}
  | parse_error()
  | duplicate_translations_error()
  | file_error()

Parses the contents of a file into a Expo.Translations 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}
  • {:error, line, reason} if there is an error with the contents of the .po file (for example, a syntax error)
  • {: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

Examples

{:ok, po} = Expo.Po.parse_file "translations.po"
po.file
#=> "translations.po"

Expo.Po.parse_file "nonexistent"
#=> {:error, :enoent}
@spec parse_string!(content :: String.t()) :: Expo.Translations.t() | no_return()

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

Works exactly like parse_string/1, but returns a Expo.Translations struct if there are no errors or raises a Expo.Po.SyntaxError error if there are.

examples

Examples

iex> po = Expo.Po.parse_string! """
...> msgid "foo"
...> msgstr "bar"
...> """
iex> [t] = po.translations
iex> t.msgid
["foo"]
iex> t.msgstr
["bar"]
iex> po.headers
[]

iex> Expo.Po.parse_string!("msgid")
** (Expo.Po.SyntaxError) 1: expected whitespace while processing msgid followed by strings inside plural translation inside singular translation or plural translation

iex> Expo.Po.parse_string!("""
...> msgid "test"
...> msgstr ""
...>
...> msgid "test"
...> msgstr ""
...> """)
** (Expo.Po.DuplicateTranslationsError) 4: found duplicate on line 4 for msgid: 'test'
@spec parse_string(content :: binary()) ::
  {:ok, Expo.Translations.t()} | parse_error() | duplicate_translations_error()

Parses a string into a Expo.Translations struct.

This function parses a given str into a Expo.Translations struct. It returns {:ok, po} if there are no errors, otherwise {:error, line, reason}.

examples

Examples

iex> {:ok, po} = Expo.Po.parse_string """
...> msgid "foo"
...> msgstr "bar"
...> """
iex> [t] = po.translations
iex> t.msgid
["foo"]
iex> t.msgstr
["bar"]
iex> po.headers
[]

iex> Expo.Po.parse_string "foo"
{:error, {:parse_error, "expected msgid followed by strings while processing plural translation inside singular translation or plural translation", "foo", 1}}