lib/iso_lang/data.ex

defmodule IsoLang.Data do
  @moduledoc """
  Builds list of language codes at compile-time.

  Data sourced from https://datahub.io/core/language-codes#resource-language-codes-full
  Native language names adapted from # https://github.com/meikidd/iso-639-1/blob/master/src/data.js
  """

  native_names = %{
    "aa" => "Afaraf",
    "ab" => "аҧсуа бызшәа",
    "ae" => "avesta",
    "af" => "Afrikaans",
    "ak" => "Akan",
    "am" => "አማርኛ",
    "an" => "aragonés",
    "ar" => "اَلْعَرَبِيَّةُ",
    "as" => "অসমীয়া",
    "av" => "авар мацӀ",
    "ay" => "aymar aru",
    "az" => "azərbaycan dili",
    "ba" => "башҡорт теле",
    "be" => "беларуская мова",
    "bg" => "български език",
    "bi" => "Bislama",
    "bm" => "bamanankan",
    "bn" => "বাংলা",
    "bo" => "བོད་ཡིག",
    "br" => "brezhoneg",
    "bs" => "bosanski jezik",
    "ca" => "Català",
    "ce" => "нохчийн мотт",
    "ch" => "Chamoru",
    "co" => "corsu",
    "cr" => "ᓀᐦᐃᔭᐍᐏᐣ",
    "cs" => "čeština",
    "cu" => "ѩзыкъ словѣньскъ",
    "cv" => "чӑваш чӗлхи",
    "cy" => "Cymraeg",
    "da" => "dansk",
    "de" => "Deutsch",
    "dv" => "ދިވެހި",
    "dz" => "རྫོང་ཁ",
    "ee" => "Eʋegbe",
    "el" => "Ελληνικά",
    "en" => "English",
    "eo" => "Esperanto",
    "es" => "Español",
    "et" => "eesti",
    "eu" => "euskara",
    "fa" => "فارسی",
    "ff" => "Fulfulde",
    "fi" => "suomi",
    "fj" => "vosa Vakaviti",
    "fo" => "føroyskt",
    "fr" => "Français",
    "fy" => "Frysk",
    "ga" => "Gaeilge",
    "gd" => "Gàidhlig",
    "gl" => "galego",
    "gn" => "Avañe'ẽ",
    "gu" => "ગુજરાતી",
    "gv" => "Gaelg",
    "ha" => "هَوُسَ",
    "he" => "עברית",
    "hi" => "हिन्दी",
    "ho" => "Hiri Motu",
    "hr" => "Hrvatski",
    "ht" => "Kreyòl ayisyen",
    "hu" => "magyar",
    "hy" => "Հայերեն",
    "hz" => "Otjiherero",
    "ia" => "Interlingua",
    "id" => "Bahasa Indonesia",
    "ie" => "Interlingue",
    "ig" => "Asụsụ Igbo",
    "ii" => "ꆈꌠ꒿ Nuosuhxop",
    "ik" => "Iñupiaq",
    "io" => "Ido",
    "is" => "Íslenska",
    "it" => "Italiano",
    "iu" => "ᐃᓄᒃᑎᑐᑦ",
    "ja" => "日本語",
    "jv" => "basa Jawa",
    "ka" => "ქართული",
    "kg" => "Kikongo",
    "ki" => "Gĩkũyũ",
    "kj" => "Kuanyama",
    "kk" => "қазақ тілі",
    "kl" => "kalaallisut",
    "km" => "ខេមរភាសា",
    "kn" => "ಕನ್ನಡ",
    "ko" => "한국어",
    "kr" => "Kanuri",
    "ks" => "कश्मीरी",
    "ku" => "Kurdî",
    "kv" => "коми кыв",
    "kw" => "Kernewek",
    "ky" => "Кыргызча",
    "la" => "latine",
    "lb" => "Lëtzebuergesch",
    "lg" => "Luganda",
    "li" => "Limburgs",
    "ln" => "Lingála",
    "lo" => "ພາສາລາວ",
    "lt" => "lietuvių kalba",
    "lu" => "Kiluba",
    "lv" => "latviešu valoda",
    "mg" => "fiteny malagasy",
    "mh" => "Kajin M̧ajeļ",
    "mi" => "te reo Māori",
    "mk" => "македонски јазик",
    "ml" => "മലയാളം",
    "mn" => "Монгол хэл",
    "mr" => "मराठी",
    "ms" => "Bahasa Melayu",
    "mt" => "Malti",
    "my" => "ဗမာစာ",
    "na" => "Dorerin Naoero",
    "nb" => "Norsk bokmål",
    "nd" => "isiNdebele",
    "ne" => "नेपाली",
    "ng" => "Owambo",
    "nl" => "Nederlands",
    "nn" => "Norsk nynorsk",
    "no" => "Norsk",
    "nr" => "isiNdebele",
    "nv" => "Diné bizaad",
    "ny" => "chiCheŵa",
    "oc" => "occitan",
    "oj" => "ᐊᓂᔑᓈᐯᒧᐎᓐ",
    "om" => "Afaan Oromoo",
    "or" => "ଓଡ଼ିଆ",
    "os" => "ирон æвзаг",
    "pa" => "ਪੰਜਾਬੀ",
    "pi" => "पाऴि",
    "pl" => "Polski",
    "ps" => "پښتو",
    "pt" => "Português",
    "qu" => "Runa Simi",
    "rm" => "rumantsch grischun",
    "rn" => "Ikirundi",
    "ro" => "Română",
    "ru" => "Русский",
    "rw" => "Ikinyarwanda",
    "sa" => "संस्कृतम्",
    "sc" => "sardu",
    "sd" => "सिन्धी",
    "se" => "Davvisámegiella",
    "sg" => "yângâ tî sängö",
    "si" => "සිංහල",
    "sk" => "slovenčina",
    "sl" => "slovenščina",
    "sm" => "gagana fa'a Samoa",
    "sn" => "chiShona",
    "so" => "Soomaaliga",
    "sq" => "Shqip",
    "sr" => "српски језик",
    "ss" => "SiSwati",
    "st" => "Sesotho",
    "su" => "Basa Sunda",
    "sv" => "Svenska",
    "sw" => "Kiswahili",
    "ta" => "தமிழ்",
    "te" => "తెలుగు",
    "tg" => "тоҷикӣ",
    "th" => "ไทย",
    "ti" => "ትግርኛ",
    "tk" => "Türkmençe",
    "tl" => "Wikang Tagalog",
    "tn" => "Setswana",
    "to" => "faka Tonga",
    "tr" => "Türkçe",
    "ts" => "Xitsonga",
    "tt" => "татар теле",
    "tw" => "Twi",
    "ty" => "Reo Tahiti",
    "ug" => "ئۇيغۇرچە‎",
    "uk" => "Українська",
    "ur" => "اردو",
    "uz" => "Ўзбек",
    "ve" => "Tshivenḓa",
    "vi" => "Tiếng Việt",
    "vo" => "Volapük",
    "wa" => "walon",
    "wo" => "Wollof",
    "xh" => "isiXhosa",
    "yi" => "ייִדיש",
    "yo" => "Yorùbá",
    "za" => "Saɯ cueŋƅ",
    "zh" => "中文",
    "zu" => "isiZulu"
  }

  lines =
    File.stream!("priv/language-codes-full.csv")
    |> Stream.drop(1)

  langs =
    Enum.map(lines, fn l ->
      [alpha3b, alpha3t, alpha2 | rest] =
        l
        |> String.trim()
        |> String.split(",")

      tail = Enum.join(rest, ",")

      # Parse up to the closing double-quote or up to the comma
      f = fn
        <<?", chunk::binary>> ->
          Regex.run(~r/(.*)"/U, chunk, capture: :all_but_first) |> Enum.at(0)

        chunk ->
          Regex.run(~r/(.*),/U, chunk, capture: :all_but_first) |> Enum.at(0)
      end

      %IsoLang{
        alpha2: alpha2,
        alpha3b: alpha3b,
        alpha3t: alpha3t,
        name: Gettext.gettext(IsoLang, f.(tail)),
        native_name: Map.get(native_names, alpha2)
      }
    end)

  def all(_opts) do
    unquote(Macro.escape(langs))
  end
end