defmodule Localizator.Translitor.UK do @moduledoc """ Translit module for Ukrainian language. """ @locale "uk" @table %{ "А" => "A", "Б" => "B", "В" => "V", "Г" => "H", "Ґ" => "G", "Д" => "D", "Е" => "E", "Є" => "Ye", "Ж" => "Zh", "З" => "Z", "И" => "Y", "І" => "I", "Ї" => "Yi", "Й" => "Y", "К" => "K", "Л" => "L", "М" => "M", "Н" => "N", "О" => "O", "П" => "P", "Р" => "R", "С" => "S", "Т" => "T", "У" => "U", "Ф" => "F", "Х" => "Kh", "Ц" => "Ts", "Ч" => "Ch", "Ш" => "Sh", "Щ" => "Shch", "Ю" => "Yu", "Я" => "Ya", "а" => "a", "б" => "b", "в" => "v", "г" => "h", "ґ" => "g", "д" => "d", "е" => "e", "є" => "ie", "ж" => "zh", "з" => "z", "и" => "y", "і" => "i", "ї" => "i", "й" => "i", "к" => "k", "л" => "l", "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "kh", "ц" => "ts", "ч" => "ch", "ш" => "sh", "щ" => "shch", "ю" => "iu", "я" => "ia" } @typedoc """ Plain Text """ @type text :: String.t() @typedoc """ Locale """ @type locale :: String.t() @behaviour Localizator.Translitor.Base @impl true @spec locale() :: {:ok, locale} def locale(), do: @locale @doc """ A ukrainian to english transliteration ## Example ``elixir iex> Localizator.Translitor.UK.convert("Данило Негрієнко") "Danylo Nehriienko" `` """ @impl true @spec convert(text) :: text def convert(text) when is_binary(text) do text |> String.graphemes() |> Enum.reduce([], &convert_letter/2) |> Enum.join() end # special case for "Зг", that should be mapped as "zgh" defp convert_letter(letter, [last_letter] = acc) when letter in ~w(Г г) and last_letter in ~w(z Z) do acc ++ [convert_gh(letter)] end # special case for "зг", that should be mapped as "zgh" defp convert_letter(letter, acc) when letter in ~w(Г г) do case List.last(acc) do last_letter when last_letter in ~w(z Z) -> acc ++ [convert_gh(letter)] _ -> acc ++ [convert_letter(letter)] end end defp convert_letter(letter, acc) do acc ++ [convert_letter(letter)] end defp convert_letter(" "), do: " " defp convert_letter("ь"), do: "" defp convert_letter("Ь"), do: "" defp convert_letter("'"), do: "" defp convert_letter("’"), do: "" defp convert_letter(letter) do case Map.get(@table, letter) do nil -> letter latin -> latin end end defp convert_gh("Г"), do: "Gh" defp convert_gh("г"), do: "gh" end