defmodule Localizator.Translitor.BE do @moduledoc """ Translit module for Belorussian language. """ @locale "be" @table %{ "А" => "A", "Б" => "B", "В" => "V", "Г" => "G", "Д" => "D", "Ж" => "Zh", "З" => "Z", "И" => "I", "І" => "I", "Й" => "J", "К" => "K", "Л" => "L", "М" => "M", "Н" => "N", "О" => "O", "П" => "P", "Р" => "R", "С" => "S", "Т" => "T", "У" => "U", "Ф" => "F", "Х" => "Kh", "Ц" => "Ts", "Ч" => "Ch", "Ш" => "Sh", "Щ" => "Shch", "Ы" => "Y", "Э" => "E", "Ь" => "", "Ъ" => "", "Ў" => "W", "а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d", "ж" => "zh", "з" => "z", "и" => "i", "і" => "i", "й" => "j", "к" => "k", "л" => "l", "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "kh", "ц" => "ts", "ч" => "ch", "ш" => "sh", "щ" => "shch", "ы" => "y", "э" => "e", "ў" => "w", "ь" => "", "ъ" => "", "'" => "", "’" => "" } @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 belorussian to english transliteration ## Example ``elixir iex> Localizator.Translitor.BE.convert("Ева Салаўёва") "Jeva Salawjova" `` """ @impl true @spec convert(text) :: text def convert(text) when is_bitstring(text) do text |> String.graphemes() |> Enum.reduce([], &convert_letter/2) |> Enum.join() end # special case for "е", that should be mapped as "ie" defp convert_letter(letter, acc) when letter in ~w(Е е Ё ё Ю ю Я я) do cond do List.last(acc) in ~w(B V G D Zh Z K L M N P R S T F Kh Ts Ch Sh Shch b v g d zh z k l m n p r s t f kh ts ch sh shch) -> acc ++ [convert_i(letter)] List.last(acc) in (~w(A I J O U Y E W a i j o u y e w) ++ ["", " ", nil]) -> acc ++ [convert_j(letter)] end end defp convert_letter(letter, acc) do acc ++ [convert_letter(letter)] end defp convert_letter(letter) do case Map.get(@table, letter) do nil -> letter latin -> latin end end defp convert_i("Е"), do: "Ie" defp convert_i("е"), do: "ie" defp convert_i("Ё"), do: "Io" defp convert_i("ё"), do: "io" defp convert_i("Ю"), do: "Iu" defp convert_i("ю"), do: "iu" defp convert_i("Я"), do: "Ia" defp convert_i("я"), do: "ia" defp convert_j("Е"), do: "Je" defp convert_j("е"), do: "je" defp convert_j("Ё"), do: "Jo" defp convert_j("ё"), do: "jo" defp convert_j("Ю"), do: "Ju" defp convert_j("ю"), do: "ju" defp convert_j("Я"), do: "Ja" defp convert_j("я"), do: "ja" end