/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.i18n;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public enum Language {
   Abkhaz("ab"),
   Afar("aa"),
   Afrikaans("af"),
   Akan("ak"),
   Albanian("sq"),
   Amharic("am"),
   Arabic("ar"),
   Aragonese("an"),
   Armenian("hy"),
   Assamese("as"),
   Avaric("av"),
   Avestan("ae"),
   Aymara("ay"),
   Azerbaijani("az"),
   Bambara("bm"),
   Bashkir("ba"),
   Basque("eu"),
   Belarusian("be"),
   Bengali("bn"),
   Bihari("bh"),
   Bislama("bi"),
   Bosnian("bs"),
   Breton("br"),
   Bulgarian("bg"),
   Burmese("my"),
   Catalan_Valencian("ca"),
   Chamorro("ch"),
   Chechen("ce"),
   Chichewa_Chewa_Nyanja("ny"),
   Chinese("zh"),
   Chuvash("cv"),
   Cornish("kw"),
   Corsican("co"),
   Cree("cr"),
   Croatian("hr"),
   Czech("cs"),
   Danish("da"),
   Divehi_Dhivehi_Maldivian("dv"),
   Dutch("nl"),
   Dzongkha("dz"),
   English("en"),
   Esperanto("eo"),
   Estonian("et"),
   Ewe("ee"),
   Faroese("fo"),
   Fijian("fj"),
   Finnish("fi", "Suomi"),
   French("fr"),
   Fula_Fulah_Pulaar_Pular("ff"),
   Galician("gl"),
   Georgian("ka"),
   German("de"),
   Greek_Modern("el"),
   Guarani("gn"),
   Gujarati("gu"),
   Haitian_Haitian_Creole("ht"),
   Hausa("ha"),
   Hebrew_modern("he"),
   Herero("hz"),
   Hindi("hi"),
   Hiri_Motu("ho"),
   Hungarian("hu"),
   Interlingua("ia"),
   Indonesian("id"),
   Interlingue("ie"),
   Irish("ga"),
   Igbo("ig"),
   Inupiaq("ik"),
   Ido("io"),
   Icelandic("is"),
   Italian("it"),
   Inuktitut("iu"),
   Japanese("ja"),
   Javanese("jv"),
   Kalaallisut_Greenlandic("kl"),
   Kannada("kn"),
   Kanuri("kr"),
   Kashmiri("ks"),
   Kazakh("kk"),
   Khmer("km"),
   Kikuyu_Gikuyu("ki"),
   Kinyarwanda("rw"),
   Kirghiz_Kyrgyz("ky"),
   Komi("kv"),
   Kongo("kg"),
   Korean("ko"),
   Kurdish("ku"),
   Kwanyama_Kuanyama("kj"),
   Latin("la"),
   Luxembourgish_Letzeburgesch("lb"),
   Luganda("lg"),
   Limburgish_Limburgan_Limburger("li"),
   Lingala("ln"),
   Lao("lo"),
   Lithuanian("lt"),
   Luba_Katanga("lu"),
   Latvian("lv"),
   Manx("gv"),
   Macedonian("mk"),
   Malagasy("mg"),
   Malay("ms"),
   Malayalam("ml"),
   Maltese("mt"),
   Maori("mi"),
   Marathi("mr"),
   Marshallese("mh"),
   Mongolian("mn"),
   Nauru("na"),
   Navajo_Navaho("nv"),
   Norwegian_Bokmål("nb"),
   North_Ndebele("nd"),
   Nepali("ne"),
   Ndonga("ng"),
   Norwegian_Nynorsk("nn"),
   Norwegian("no"),
   Nuosu("ii"),
   South_Ndebele("nr"),
   Occitan_after_1500("oc"),
   Ojibwa("oj"),
   Old_Church_Slavonic_Church_Slavic_Church_Slavonic_Old_Bulgarian_Old_Slavonic("cu"),
   Oromo("om"),
   Oriya("or"),
   Ossetian_Ossetic("os"),
   Panjabi_Punjabi("pa"),
   Pali("pi"),
   Persian("fa"),
   Polish("pl"),
   Pashto_Pushto("ps"),
   Portuguese("pt"),
   Quechua("qu"),
   Romansh("rm"),
   Kirundi("rn"),
   Romanian_Moldavian_Moldovan("ro"),
   Russian("ru"),
   Sanskrit("sa"),
   Sardinian("sc"),
   Sindhi("sd"),
   Northern_Sami("se"),
   Samoan("sm"),
   Sango("sg"),
   Serbian("sr"),
   Scottish_Gaelic_Gaelic("gd"),
   Shona("sn"),
   Sinhala_Sinhalese("si"),
   Slovak("sk"),
   Slovene("sl"),
   Somali("so"),
   Southern_Sotho("st"),
   Spanish_Castilian("es"),
   Sundanese("su"),
   Swahili("sw"),
   Swati("ss"),
   Swedish("sv", "Svenska"),
   Tamil("ta"),
   Telugu("te"),
   Tajik("tg"),
   Thai("th"),
   Tigrinya("ti"),
   Tibetan_Standard_Tibetan_Central("bo"),
   Turkmen("tk"),
   Tagalog("tl"),
   Tswana("tn"),
   Tonga_Tonga_Islands("to"),
   Turkish("tr"),
   Tsonga("ts"),
   Tatar("tt"),
   Twi("tw"),
   Tahitian("ty"),
   Uighur_Uyghur("ug"),
   Ukrainian("uk"),
   Urdu("ur"),
   Uzbek("uz"),
   Venda("ve"),
   Vietnamese("vi"),
   Volapk("vo"),
   Walloon("wa"),
   Welsh("cy"),
   Wolof("wo"),
   Western_Frisian("fy"),
   Xhosa("xh"),
   Yiddish("yi"),
   Yoruba("yo"),
   Zhuang_Chuang("za"),
   Zulu("zu");

   private final String code;
   private final String localName;

   Language(String code) {

      this(code, null);
   }

   Language(String code, String localName) {

      this.code = code;
      this.localName = localName;
   }

   public String getLanguageCode() {

      return this.code;
   }

   /**
    * Returns the Language from its corresponding language code
    *
    * @param code
    * @return Language
    */
   public static Language getLanguage(String code) {

      for (Language language : Language.values()) {
         if (language.code.equals(code)) {
            return language;
         }
      }
      return null;
   }

   public Node toXML(Document doc) {

      Element languageElement = doc.createElement("language");
      Element nameElement = doc.createElement("name");
      nameElement.setTextContent(this.name());

      Element codeElement = doc.createElement("code");
      codeElement.setTextContent(this.code);

      Element localNameElement = doc.createElement("localName");
      localNameElement.setTextContent(this.localName == null ? this.name() : this.localName);

      languageElement.appendChild(nameElement);
      languageElement.appendChild(codeElement);
      languageElement.appendChild(localNameElement);

      return languageElement;
   }
}
