140 lines
2.8 KiB
Elixir
140 lines
2.8 KiB
Elixir
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
|