147 lines
3.0 KiB
Elixir
147 lines
3.0 KiB
Elixir
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
|