defmodule ISO6391 do
@moduledoc """
A toolkit for working with ISO 639-1 language codes.
ISO6391 offers functionality to:
- Convert a language name into its respective ISO 639-1 code.
- Fetch the language name(s) corresponding to a particular ISO 639-1 code.
ISO 639-1 codes serve as standardized two-letter abbreviations for languages.
## Examples
iex> ISO6391.to_code("French")
"fr"
iex> ISO6391.from_code("fr")
"French"
"""
@doc """
Translates a language name into the corresponding ISO 639-1 code.
Returns the associated ISO 639-1 code for a supplied `language_name` if available, or `nil` otherwise.
## Parameters
- `language_name`: A binary representing the language name.
## Examples
iex> ISO6391.to_code("Spanish")
"es"
iex> ISO6391.to_code("UnrecognizedLanguage")
nil
"""
def to_code(language_name) when language_name |> is_binary do
ISO6391.Codes.list()
|> Enum.find(fn %{name: code_name} ->
code_name |> String.downcase() == language_name |> String.downcase()
end)
|> case do
%{iso_639_1: code} -> code
_ -> nil
end
end
def to_code(_) do
nil
end
@doc """
Retrieves language name(s) mapped to a particular ISO 639-1 code.
Returns a language name or names corresponding to the provided `code`, or `nil` if no match is found.
## Parameters
- `code`: A binary representing the ISO 639-1 code.
## Examples
iex> ISO6391.from_code("pt")
"Portuguese"
iex> ISO6391.from_code("undefined_code")
nil
## Notes
Some ISO 639-1 codes may map to multiple language names.
In such instances, this function delivers a string, concatenating all correlated language names, separated by commas.
"""
def from_code(code) when code |> is_binary do
ISO6391.Codes.list()
|> Enum.filter(fn %{iso_639_1: iso_code} -> iso_code == code end)
|> case do
[%{name: name}] ->
name
[_ | _] = list ->
list
|> Enum.reduce(nil, fn
%{name: name}, nil -> name
%{name: name}, acc -> acc <> "," <> name
end)
[] ->
nil
end
end
def from_code(_) do
nil
end
end