Add new isoLangs and change isoLangs generation

- Add new isoLangs to src/js/common.js.
- Generated isoLangs now only have the first nativeName entry defined in
  tools/langs/isoLangs.json (for instance, instead of "euskara, euskera"
  now the generated nativeName only includes "euskara").
- In the options page, the languages in the select element when adding a
  new language are ordered by language name. This change was needed
  because now the generated isoLangs variable is ordered by key and not
  by name.

Change-Id: Ic0c528b2e0382341700e2ac96cc61186471fe508
diff --git a/src/js/common.js b/src/js/common.js
index 8289ced..31914e8 100644
--- a/src/js/common.js
+++ b/src/js/common.js
@@ -1,106 +1,111 @@
 var isoLangs = {
   'af': {'name': 'Afrikaans', 'nativeName': 'Afrikaans'},
-  'sq': {'name': 'Albanian', 'nativeName': 'Shqip'},
   'am': {'name': 'Amharic', 'nativeName': 'አማርኛ'},
   'ar': {'name': 'Arabic', 'nativeName': 'العربية'},
-  'hy': {'name': 'Armenian', 'nativeName': 'Հայերեն'},
   'az': {'name': 'Azerbaijani', 'nativeName': 'azərbaycan dili'},
-  'eu': {'name': 'Basque', 'nativeName': 'euskara'},
   'be': {'name': 'Belarusian', 'nativeName': 'Беларуская'},
+  'bg': {'name': 'Bulgarian', 'nativeName': 'български език'},
   'bn': {'name': 'Bengali', 'nativeName': 'বাংলা'},
   'bs': {'name': 'Bosnian', 'nativeName': 'bosanski jezik'},
-  'bg': {'name': 'Bulgarian', 'nativeName': 'български език'},
   'ca': {'name': 'Catalan', 'nativeName': 'Català'},
-  'ceb': {'name': 'Cebuano', 'nativeName': 'Bisaya'},
-  'ny': {'name': 'Chichewa', 'nativeName': 'chiCheŵa'},
-  'zh': {'name': 'Chinese', 'nativeName': '中文 (Zhōngwén)'},
+  'ceb': {'name': 'Cebuano', 'nativeName': 'Binisaya'},
   'co': {'name': 'Corsican', 'nativeName': 'corsu'},
-  'hr': {'name': 'Croatian', 'nativeName': 'hrvatski'},
   'cs': {'name': 'Czech', 'nativeName': 'česky'},
+  'cy': {'name': 'Welsh', 'nativeName': 'Cymraeg'},
   'da': {'name': 'Danish', 'nativeName': 'dansk'},
-  'nl': {'name': 'Dutch', 'nativeName': 'Nederlands'},
+  'de': {'name': 'German', 'nativeName': 'Deutsch'},
+  'el': {'name': 'Greek', 'nativeName': 'Ελληνικά'},
   'en': {'name': 'English', 'nativeName': 'English'},
   'eo': {'name': 'Esperanto', 'nativeName': 'Esperanto'},
+  'es': {'name': 'Spanish', 'nativeName': 'español'},
   'et': {'name': 'Estonian', 'nativeName': 'eesti'},
-  'tl': {'name': 'Filipino', 'nativeName': 'Pilipino'},
+  'eu': {'name': 'Basque', 'nativeName': 'euskara'},
+  'fa': {'name': 'Persian', 'nativeName': 'فارسی'},
   'fi': {'name': 'Finnish', 'nativeName': 'suomi'},
   'fr': {'name': 'French', 'nativeName': 'français'},
   'fy': {'name': 'Frisian', 'nativeName': 'Frysk'},
-  'gl': {'name': 'Galician', 'nativeName': 'Galego'},
-  'ka': {'name': 'Georgian', 'nativeName': 'ქართული'},
-  'de': {'name': 'German', 'nativeName': 'Deutsch'},
-  'el': {'name': 'Greek', 'nativeName': 'Ελληνικά'},
-  'gu': {'name': 'Gujarati', 'nativeName': 'ગુજરાતી'},
-  'ht': {'name': 'Haitian Creole', 'nativeName': 'Kreyòl ayisyen'},
-  'ha': {'name': 'Hausa', 'nativeName': 'Hausa'},
-  'haw': {'name': 'Hawaiian', 'nativeName': 'Hausa'},
-  'iw': {'name': 'Hebrew', 'nativeName': 'עברית'},
-  'hi': {'name': 'Hindi', 'nativeName': 'हिन्दी, हिंदी'},
-  'hmn': {'name': 'Hmong', 'nativeName': 'lus Hmoob'},
-  'hu': {'name': 'Hungarian', 'nativeName': 'Magyar'},
-  'is': {'name': 'Icelandic', 'nativeName': 'Íslenska'},
-  'ig': {'name': 'Igbo', 'nativeName': 'Asụsụ Igbo'},
-  'id': {'name': 'Indonesian', 'nativeName': 'Bahasa Indonesia'},
   'ga': {'name': 'Irish', 'nativeName': 'Gaeilge'},
+  'gd': {'name': 'Scots Gaelic', 'nativeName': 'Gàidhlig'},
+  'gl': {'name': 'Galician', 'nativeName': 'Galego'},
+  'gu': {'name': 'Gujarati', 'nativeName': 'ગુજરાતી'},
+  'ha': {'name': 'Hausa', 'nativeName': 'Hausa'},
+  'haw': {'name': 'Hawaiian', 'nativeName': 'ʻŌlelo Hawaiʻi'},
+  'hi': {'name': 'Hindi', 'nativeName': 'हिन्दी'},
+  'hmn': {'name': 'Hmong', 'nativeName': 'Hmoob'},
+  'hr': {'name': 'Croatian', 'nativeName': 'hrvatski'},
+  'ht': {'name': 'Haitian Creole', 'nativeName': 'Kreyòl ayisyen'},
+  'hu': {'name': 'Hungarian', 'nativeName': 'Magyar'},
+  'hy': {'name': 'Armenian', 'nativeName': 'Հայերեն'},
+  'id': {'name': 'Indonesian', 'nativeName': 'Bahasa Indonesia'},
+  'ig': {'name': 'Igbo', 'nativeName': 'Asụsụ Igbo'},
+  'is': {'name': 'Icelandic', 'nativeName': 'Íslenska'},
   'it': {'name': 'Italian', 'nativeName': 'Italiano'},
+  'iw': {'name': 'Hebrew', 'nativeName': 'עברית'},
   'ja': {'name': 'Japanese', 'nativeName': '日本語 (にほんご/にっぽんご)'},
-  'jv': {'name': 'Javanese', 'nativeName': 'basa Jawa'},
-  'kn': {'name': 'Kannada', 'nativeName': 'ಕನ್ನಡ'},
+  'jw': {'name': 'Javanese', 'nativeName': 'basa Jawa'},
+  'ka': {'name': 'Georgian', 'nativeName': 'ქართული'},
   'kk': {'name': 'Kazakh', 'nativeName': 'Қазақ тілі'},
   'km': {'name': 'Khmer', 'nativeName': 'ភាសាខ្មែរ'},
+  'kn': {'name': 'Kannada', 'nativeName': 'ಕನ್ನಡ'},
   'ko': {'name': 'Korean', 'nativeName': '한국어 (韓國語)'},
   'ku': {'name': 'Kurdish (Kurmanji)', 'nativeName': 'Kurdî'},
   'ky': {'name': 'Kyrgyz', 'nativeName': 'кыргыз тили'},
-  'lo': {'name': 'Lao', 'nativeName': 'ພາສາລາວ'},
   'la': {'name': 'Latin', 'nativeName': 'latine'},
-  'lv': {'name': 'Latvian', 'nativeName': 'latviešu valoda'},
-  'lt': {'name': 'Lithuanian', 'nativeName': 'lietuvių kalba'},
   'lb': {'name': 'Luxembourgish', 'nativeName': 'Lëtzebuergesch'},
-  'mk': {'name': 'Macedonian', 'nativeName': 'македонски јазик'},
+  'lo': {'name': 'Lao', 'nativeName': 'ພາສາລາວ'},
+  'lt': {'name': 'Lithuanian', 'nativeName': 'lietuvių kalba'},
+  'lv': {'name': 'Latvian', 'nativeName': 'latviešu valoda'},
   'mg': {'name': 'Malagasy', 'nativeName': 'Malagasy fiteny'},
-  'ms': {'name': 'Malay', 'nativeName': 'bahasa Melayu'},
+  'mi': {'name': 'Maori', 'nativeName': 'te reo Māori'},
+  'mk': {'name': 'Macedonian', 'nativeName': 'македонски јазик'},
   'ml': {'name': 'Malayalam', 'nativeName': 'മലയാളം'},
-  'mt': {'name': 'Maltese', 'nativeName': 'Malti'},
-  'mi': {'name': 'Māori', 'nativeName': 'te reo Māori'},
-  'mr': {'name': 'Marathi', 'nativeName': 'मराठी'},
   'mn': {'name': 'Mongolian', 'nativeName': 'монгол'},
-  'my': {'name': 'Myanmar', 'nativeName': 'ဗမာစာ'},
+  'mr': {'name': 'Marathi', 'nativeName': 'मराठी'},
+  'ms': {'name': 'Malay', 'nativeName': 'bahasa Melayu'},
+  'mt': {'name': 'Maltese', 'nativeName': 'Malti'},
+  'my': {'name': 'Myanmar (Burmese)', 'nativeName': 'ဗမာစာ'},
   'ne': {'name': 'Nepali', 'nativeName': 'नेपाली'},
+  'nl': {'name': 'Dutch', 'nativeName': 'Nederlands'},
   'no': {'name': 'Norwegian', 'nativeName': 'Norsk'},
-  'ps': {'name': 'Pashto', 'nativeName': 'پښتو'},
-  'fa': {'name': 'Persian', 'nativeName': 'فارسی'},
+  'ny': {'name': 'Chichewa', 'nativeName': 'chiCheŵa'},
+  'or': {'name': 'Odia (Oriya)', 'nativeName': 'ଓଡ଼ିଆ'},
+  'pa': {'name': 'Punjabi', 'nativeName': 'ਪੰਜਾਬੀ'},
   'pl': {'name': 'Polish', 'nativeName': 'polski'},
+  'ps': {'name': 'Pashto', 'nativeName': 'پښتو'},
   'pt': {'name': 'Portuguese', 'nativeName': 'Português'},
-  'pa': {'name': 'Punjabi', 'nativeName': 'ਪੰਜਾਬ'},
   'ro': {'name': 'Romanian', 'nativeName': 'română'},
   'ru': {'name': 'Russian', 'nativeName': 'русский язык'},
-  'sm': {'name': 'Samoan', 'nativeName': 'gagana faa Samoa'},
-  'gd': {'name': 'Scots Gaelic', 'nativeName': 'Gàidhlig'},
-  'sr': {'name': 'Serbian', 'nativeName': 'српски језик'},
-  'st': {'name': 'Sesotho', 'nativeName': 'Sesotho'},
-  'sn': {'name': 'Shona', 'nativeName': 'chiShona'},
+  'rw': {'name': 'Kinyarwanda', 'nativeName': 'Ikinyarwanda'},
   'sd': {'name': 'Sindhi', 'nativeName': 'सिन्धी'},
   'si': {'name': 'Sinhala', 'nativeName': 'සිංහල'},
   'sk': {'name': 'Slovak', 'nativeName': 'slovenčina'},
   'sl': {'name': 'Slovenian', 'nativeName': 'slovenščina'},
+  'sm': {'name': 'Samoan', 'nativeName': 'gagana faa Samoa'},
+  'sn': {'name': 'Shona', 'nativeName': 'chiShona'},
   'so': {'name': 'Somali', 'nativeName': 'Soomaaliga'},
-  'es': {'name': 'Spanish', 'nativeName': 'español'},
+  'sq': {'name': 'Albanian', 'nativeName': 'Shqip'},
+  'sr': {'name': 'Serbian', 'nativeName': 'српски језик'},
+  'st': {'name': 'Sesotho', 'nativeName': 'Sesotho'},
   'su': {'name': 'Sundanese', 'nativeName': 'Basa Sunda'},
-  'sw': {'name': 'Swahili', 'nativeName': 'Kiswahili'},
   'sv': {'name': 'Swedish', 'nativeName': 'svenska'},
-  'tg': {'name': 'Tajik', 'nativeName': 'тоҷикӣ'},
+  'sw': {'name': 'Swahili', 'nativeName': 'Kiswahili'},
   'ta': {'name': 'Tamil', 'nativeName': 'தமிழ்'},
   'te': {'name': 'Telugu', 'nativeName': 'తెలుగు'},
+  'tg': {'name': 'Tajik', 'nativeName': 'тоҷикӣ'},
   'th': {'name': 'Thai', 'nativeName': 'ไทย'},
+  'tk': {'name': 'Turkmen', 'nativeName': 'Türkmen'},
+  'tl': {'name': 'Filipino', 'nativeName': 'Wikang Tagalog'},
   'tr': {'name': 'Turkish', 'nativeName': 'Türkçe'},
+  'tt': {'name': 'Tatar', 'nativeName': 'татарча'},
+  'ug': {'name': 'Uyghur', 'nativeName': 'Uyƣurqə'},
   'uk': {'name': 'Ukrainian', 'nativeName': 'українська'},
   'ur': {'name': 'Urdu', 'nativeName': 'اردو'},
   'uz': {'name': 'Uzbek', 'nativeName': 'zbek'},
   'vi': {'name': 'Vietnamese', 'nativeName': 'Tiếng Việt'},
-  'cy': {'name': 'Welsh', 'nativeName': 'Cymraeg'},
   'xh': {'name': 'Xhosa', 'nativeName': 'isiXhosa'},
   'yi': {'name': 'Yiddish', 'nativeName': 'ייִדיש'},
   'yo': {'name': 'Yoruba', 'nativeName': 'Yorùbá'},
-  'za': {'name': 'Zhuang, Chuang', 'nativeName': 'Saɯ cueŋƅ'},
+  'zh-CN': {'name': 'Chinese (Simplified)', 'nativeName': '汉语'},
+  'zh-TW': {'name': 'Chinese (Traditional)', 'nativeName': '漢語'},
   'zu': {'name': 'Zulu', 'nativeName': 'isiZulu'}
 };
diff --git a/src/js/options.js b/src/js/options.js
index 0f79b2d..a639c56 100644
--- a/src/js/options.js
+++ b/src/js/options.js
@@ -20,15 +20,22 @@
 function printListModal() {
   $('#select_language').textContent = '';
   var heysortable = sortable.toArray();
-  for (var language in isoLangs) {
-    if (!inArray(language, heysortable)) {
+  var languages = [];
+  for (var langCode of Object.keys(isoLangs)) {
+    var l = isoLangs[langCode];
+    l['code'] = langCode;
+    languages.push(l);
+  }
+
+  languages.sort((a, b) => a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
+  languages.forEach(language => {
+    if (!inArray(language['code'], heysortable)) {
       var el = document.createElement('option');
-      el.setAttribute('value', language);
-      el.innerText = isoLangs[language]['name'] + ' (' +
-          isoLangs[language]['nativeName'] + ')';
+      el.setAttribute('value', language['code']);
+      el.textContent = language['name'] + ' (' + language['nativeName'] + ')';
       $('#select_language').appendChild(el);
     }
-  }
+  });
 }
 
 function init() {
diff --git a/tools/langs/langs.go b/tools/langs/langs.go
index c1bbe90..acfb811 100644
--- a/tools/langs/langs.go
+++ b/tools/langs/langs.go
@@ -7,6 +7,7 @@
 	"log"
 	"net/http"
 	"os"
+	"strings"
 )
 
 const isoLangsFileName = "isoLangs.json"
@@ -21,6 +22,12 @@
 	for currLangCode, currLang := range isoLangs {
 		if currLangCode == lang {
 			currLang.CodeName = lang
+
+			// Only consider the first entry of the list (e.g. "a, b, c" --> "a")
+			if index := strings.Index(currLang.NativeName, ","); index > 0 {
+				currLang.NativeName = currLang.NativeName[:index]
+			}
+
 			return currLang, nil
 		}
 	}