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
|