2020-06-07 17:00:56 +03:00

147 lines
3.0 KiB
Elixir
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 "<consonant>е", that should be mapped as "<translited consonant>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