Index: binaries/data/mods/public/gui/credits/texts/translators.json =================================================================== --- binaries/data/mods/public/gui/credits/texts/translators.json +++ binaries/data/mods/public/gui/credits/texts/translators.json @@ -1,6 +1,8 @@ { + "Title": "Translators", "Content": [ { + "LangName": "Asturianu", "List": [ { "name": "David Sowa" @@ -11,10 +13,10 @@ { "name": "Nicolas Auvray" } - ], - "LangName": "Asturianu" + ] }, { + "LangName": "\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438", "List": [ { "name": "AccountKiller" @@ -53,20 +55,35 @@ "name": "Radoslav Mitev" }, { + "name": "Yordan Grigorov (yoreei)" + }, + { + "name": "\u041a\u0440\u0430\u0441\u0438\u043c\u0438\u0440 \u041c\u0438\u043a\u043e\u0432" + }, + { "name": "\u041b\u044e\u0431\u043e\u043c\u0438\u0440 \u0412\u0430\u0441\u0438\u043b\u0435\u0432" + }, + { + "name": "\u0421\u0438\u043c\u043e\u043d\u044a\u2013\u0421\u0435\u0432\u0430\u0440\u044a \u0421. \u0411\u043e\u043b\u043e\u043a\u0430\u043d\u043e\u0432\u044a" } - ], - "LangName": "\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438" + ] }, { + "LangName": "Catal\u00e0", "List": [ { "name": "Adri\u00e0 Palouzi\u00e9" }, { + "name": "Albert F." + }, + { "name": "Alex Ruiz Garc\u00eda" }, { + "name": "Ambar Gorretas-Aymerich" + }, + { "name": "Arnau Barrabeig" }, { @@ -106,6 +123,9 @@ "name": "Jorge Romero" }, { + "name": "Josep A.P" + }, + { "name": "josu torres" }, { @@ -124,12 +144,18 @@ "name": "marc kjahgrt ksrgha" }, { + "name": "Marc Masip Compte" + }, + { "name": "Marc Mir\u00f3" }, { "name": "Marco tom Suden" }, { + "name": "Maria Acero-Allo" + }, + { "name": "Miguel Molina" }, { @@ -150,10 +176,10 @@ { "name": "Toni GL" } - ], - "LangName": "Catal\u00e0" + ] }, { + "LangName": "\u010ce\u0161tina", "List": [ { "name": "Ardenlax" @@ -183,9 +209,6 @@ "name": "ike20" }, { - "name": "J D" - }, - { "name": "Jakub Jelen" }, { @@ -278,15 +301,24 @@ { "name": "Wesalius" } - ], - "LangName": "\u010ce\u0161tina" + ] }, { + "LangName": "Deutsch", "List": [ { + "name": "... ..." + }, + { + "name": "4c905de7e2c9950b7d83273a8070b072" + }, + { "name": "A L" }, { + "name": "a5b84b8b47542d2028ccbc37f3b2b10d" + }, + { "name": "Aldicek" }, { @@ -353,6 +385,9 @@ "name": "Florian Graefe" }, { + "name": "Glorfindel Of Gondolin" + }, + { "name": "Hedaja" }, { @@ -371,6 +406,9 @@ "name": "Jakob Gahde" }, { + "name": "Jakob Raidt" + }, + { "name": "James Jakubczyk" }, { @@ -389,6 +427,9 @@ "name": "jonnius" }, { + "name": "Kilian Seizinger" + }, + { "name": "Larson M\u00e4rz" }, { @@ -401,7 +442,7 @@ "name": "Lukas Gienapp" }, { - "name": "Lukas Kruse" + "name": "Lukas Heiniger" }, { "name": "Lukas N" @@ -410,6 +451,9 @@ "name": "Luksoft" }, { + "name": "M C" + }, + { "name": "Mansent" }, { @@ -434,6 +478,9 @@ "name": "MartinusMagnus" }, { + "name": "mathias.n.graf" + }, + { "name": "Matthias Kerk" }, { @@ -455,6 +502,9 @@ "name": "Michael Vetter" }, { + "name": "MineplayerHD Youtube" + }, + { "name": "nautilusx" }, { @@ -494,9 +544,6 @@ "name": "Peter Gasse" }, { - "name": "Philipp Mysz" - }, - { "name": "pilino1234" }, { @@ -563,9 +610,6 @@ "name": "these" }, { - "name": "Thomas Steinert" - }, - { "name": "Till Wendland" }, { @@ -613,10 +657,10 @@ { "name": "Yves_G" } - ], - "LangName": "Deutsch" + ] }, { + "LangName": "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac", "List": [ { "name": "Adrian Pappas" @@ -673,6 +717,9 @@ "name": "Ilias Giannaros" }, { + "name": "Jim Chr" + }, + { "name": "Lampros Lampreas" }, { @@ -691,6 +738,9 @@ "name": "Marinus Savoritias" }, { + "name": "Markos G." + }, + { "name": "MasterWord" }, { @@ -706,6 +756,9 @@ "name": "Natalia V" }, { + "name": "Nea Retrogamer (nearetrogamer)" + }, + { "name": "Nianios Romanos" }, { @@ -736,12 +789,18 @@ "name": "Sotiris K" }, { + "name": "Stephanos C. Siopoulos" + }, + { "name": "Steven Gikas" }, { "name": "subdee" }, { + "name": "Tasos Grv." + }, + { "name": "Thanasis Mousiolis" }, { @@ -786,10 +845,10 @@ { "name": "\u03a7\u03a1\u0397\u03a3\u03a4\u039f\u03a3 \u03a3\u039a\u0399\u0391\u0394\u0391\u03a3" } - ], - "LangName": "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac" + ] }, { + "LangName": "English (UK)", "List": [ { "name": "Adam Jones" @@ -830,10 +889,10 @@ { "name": "Tanksy" } - ], - "LangName": "English (UK)" + ] }, { + "LangName": "Espa\u00f1ol", "List": [ { "name": "Aber Wagen" @@ -857,6 +916,9 @@ "name": "Alexis Arcos" }, { + "name": "Alfredo C" + }, + { "name": "Ancel0" }, { @@ -914,9 +976,6 @@ "name": "Eduardo Jaramillo" }, { - "name": "Efra\u00edn Manzano" - }, - { "name": "Emilio Romero" }, { @@ -929,9 +988,15 @@ "name": "espanengo" }, { + "name": "Esteban A. Mina" + }, + { "name": "Esteban de Jesus Rodriguez Bujaidar" }, { + "name": "Fahed Stanic' Loayza" + }, + { "name": "fca1970" }, { @@ -977,6 +1042,9 @@ "name": "Jesus A" }, { + "name": "Jesus Covo" + }, + { "name": "Jesus Tamarit" }, { @@ -998,9 +1066,21 @@ "name": "Joaqu\u00edn" }, { + "name": "Jose Manuel" + }, + { + "name": "Jose Raul Cruz R." + }, + { "name": "Jos\u00e9 Javier Dom\u00ednguez Reina" }, { + "name": "Juan Carlos Gonzalez" + }, + { + "name": "Juan Carlos| Cervantes NG" + }, + { "name": "juanda097" }, { @@ -1055,6 +1135,9 @@ "name": "OJankano" }, { + "name": "Oriol Duarri" + }, + { "name": "Pablo Rodr\u00edguez" }, { @@ -1067,6 +1150,9 @@ "name": "Pedro Luis" }, { + "name": "peter Galleta" + }, + { "name": "Pretorg" }, { @@ -1085,6 +1171,12 @@ "name": "Ramiro Garay" }, { + "name": "Ra\u00fal Fdez." + }, + { + "name": "Rodrigo Vegas S\u00e1nchez-Ferrero" + }, + { "name": "Roger Vasquez" }, { @@ -1094,6 +1186,12 @@ "name": "Sander Deryckere" }, { + "name": "Santiago Andres Ahumada ballen" + }, + { + "name": "Saul Axel Mart\u00ednez Ortiz" + }, + { "name": "Sebastian David Tamayo" }, { @@ -1126,12 +1224,15 @@ { "name": "wsnlndr lndr" } - ], - "LangName": "Espa\u00f1ol" + ] }, { + "LangName": "Euskara", "List": [ { + "name": "Gontzal M. Pujana" + }, + { "name": "Ibai Oihanguren Sala" }, { @@ -1149,10 +1250,10 @@ { "name": "Urtzi Odriozola" } - ], - "LangName": "Euskara" + ] }, { + "LangName": "Fran\u00e7ais", "List": [ { "name": "A W" @@ -1227,6 +1328,9 @@ "name": "Const Ance" }, { + "name": "curieux de l'\u00eatre" + }, + { "name": "Cyril" }, { @@ -1245,6 +1349,9 @@ "name": "ernest olory" }, { + "name": "Est\u00e9bastien Robespi" + }, + { "name": "Florent Fraysse" }, { @@ -1257,6 +1364,9 @@ "name": "Fran\u00e7ois Poirotte" }, { + "name": "Glorfindel Of Gondolin" + }, + { "name": "gorius" }, { @@ -1314,6 +1424,9 @@ "name": "Laetitia Atlan" }, { + "name": "lelapin ." + }, + { "name": "lemiaou" }, { @@ -1380,6 +1493,9 @@ "name": "Nikolaos Vidalis" }, { + "name": "Nolan Dartois" + }, + { "name": "Oimat" }, { @@ -1422,10 +1538,10 @@ "name": "Ross1396" }, { - "name": "R\u00e9mi Letot" + "name": "R\u00e9mi Verschelde" }, { - "name": "R\u00e9mi Verschelde" + "name": "R\u00e9my J." }, { "name": "Sacha Vrand" @@ -1470,6 +1586,9 @@ "name": "Thierry Vignaud" }, { + "name": "Tiber7 - Danilo B. Guttadauria" + }, + { "name": "Timothee KNOBLOCH" }, { @@ -1502,10 +1621,10 @@ { "name": "Yannick Heintz" } - ], - "LangName": "Fran\u00e7ais" + ] }, { + "LangName": "G\u00e0idhlig", "List": [ { "name": "GunChleoc" @@ -1519,15 +1638,18 @@ { "name": "Sg\u00e0ire Uallas" } - ], - "LangName": "G\u00e0idhlig" + ] }, { + "LangName": "Galego", "List": [ { "name": "Adrian Chaves" }, { + "name": "Adri\u00e1n Chaves (Gallaecio)" + }, + { "name": "Adri\u00e1n Chaves Fern\u00e1ndez" }, { @@ -1545,12 +1667,15 @@ { "name": "Nicolas Auvray" } - ], - "LangName": "Galego" + ] }, { + "LangName": "Magyar", "List": [ { + "name": "271a73fe325823f2941533b778424ef0" + }, + { "name": "Aqualung" }, { @@ -1620,6 +1745,9 @@ "name": "M\u00e1ty\u00e1s Demeter" }, { + "name": "M\u00f3r K\u00e1rp\u00e1ty" + }, + { "name": "Nagy Andr\u00e1s" }, { @@ -1644,18 +1772,15 @@ "name": "Stew Den" }, { - "name": "S\u00e1ndor Uszkai" - }, - { "name": "Tam\u00e1s Zolnai" }, { "name": "Tibor Buz\u00e1si" } - ], - "LangName": "Magyar" + ] }, { + "LangName": "Bahasa Indonesia", "List": [ { "name": "Adhika Setya Pramudita" @@ -1685,6 +1810,9 @@ "name": "Dedi Wahyudi" }, { + "name": "Dhemas E. Rilian N." + }, + { "name": "Dito Kurnia Pratama" }, { @@ -1718,6 +1846,9 @@ "name": "Kholil Pasaribu" }, { + "name": "La Ode Muh. Fadlun Akbar" + }, + { "name": "Muhammad Furqon Abrori" }, { @@ -1729,10 +1860,10 @@ { "name": "Yusufabdiauzan" } - ], - "LangName": "Bahasa Indonesia" + ] }, { + "LangName": "Italiano", "List": [ { "name": "Adri\u00e1n Chaves Fern\u00e1ndez" @@ -1759,6 +1890,9 @@ "name": "Antonio Buonomo" }, { + "name": "Birkebeiner ." + }, + { "name": "Camilo Zuluaga" }, { @@ -1795,6 +1929,9 @@ "name": "Davide Redana" }, { + "name": "Elissa Dell'Aera" + }, + { "name": "Emanuele Ricci" }, { @@ -1810,6 +1947,9 @@ "name": "Fabrizio Morotti" }, { + "name": "Federico D'Alessio" + }, + { "name": "francescogramazio" }, { @@ -1930,15 +2070,18 @@ "name": "The_Blinded" }, { + "name": "Tiber7 - Danilo B. Guttadauria" + }, + { "name": "Vaschetto Marco" }, { "name": "Zioninja" } - ], - "LangName": "Italiano" + ] }, { + "LangName": "Bahasa Melayu", "List": [ { "name": "abuyop" @@ -1951,11 +2094,14 @@ }, { "name": "Nicolas Auvray" + }, + { + "name": "Timothy \u201cGlash\u201d Wong" } - ], - "LangName": "Bahasa Melayu" + ] }, { + "LangName": "Norsk bokm\u00e5l", "List": [ { "name": "Allan Nordh\u00f8y" @@ -1982,7 +2128,10 @@ "name": "Johan Reitan" }, { - "name": "joharei" + "name": "Kalmon Habi" + }, + { + "name": "Kurt-H\u00e5kon Eilertsen" }, { "name": "Lene Raastad" @@ -2008,18 +2157,27 @@ { "name": "Thach Thao Nguyen" } - ], - "LangName": "Norsk bokm\u00e5l" + ] }, { + "LangName": "Nederlands", "List": [ { + "name": "05a0224220b7eaac7e017feaa81ae85c" + }, + { "name": "477f07d437f0da0e33ec4ecd7b8e2b62" }, { + "name": "Andreas I" + }, + { "name": "Anique van Berne" }, { + "name": "annihilator solar" + }, + { "name": "Bart Groeneveld" }, { @@ -2056,6 +2214,9 @@ "name": "Dig Dug" }, { + "name": "echotangoecho ." + }, + { "name": "Ellen Roels" }, { @@ -2074,6 +2235,9 @@ "name": "Ismail Sahin" }, { + "name": "Jan Jasper de Kroon" + }, + { "name": "Jana Valcke" }, { @@ -2098,9 +2262,6 @@ "name": "Mark Lemmens" }, { - "name": "Mark Martines" - }, - { "name": "Martijn De Jongh" }, { @@ -2143,6 +2304,9 @@ "name": "Pieter Eikelboom" }, { + "name": "Reginas -" + }, + { "name": "Reinout De Geest" }, { @@ -2211,12 +2375,21 @@ { "name": "\u9b54\u5927\u519c" } - ], - "LangName": "Nederlands" + ] }, { + "LangName": "Polski", "List": [ { + "name": "9Cube-dpustula" + }, + { + "name": "Adam Kol" + }, + { + "name": "Adam Rabiega" + }, + { "name": "Adam Stachowicz" }, { @@ -2307,12 +2480,18 @@ "name": "Jakub Kaszycki" }, { + "name": "Jakub Rosi\u0144ski" + }, + { "name": "Jakub Szyd\u0142o" }, { "name": "Jarek Kokoci\u0144ski" }, { + "name": "Kamil Gawelek" + }, + { "name": "Kamil Grela" }, { @@ -2469,9 +2648,6 @@ "name": "Robert Wolniak" }, { - "name": "RosiakPL" - }, - { "name": "slodki12341" }, { @@ -2498,10 +2674,10 @@ { "name": "zyxist" } - ], - "LangName": "Polski" + ] }, { + "LangName": "Portugu\u00eas (Brasil)", "List": [ { "name": "Adriano Ramos" @@ -2558,6 +2734,9 @@ "name": "dexmendonca" }, { + "name": "Diana K. Cury" + }, + { "name": "Elisa Silva Ramos" }, { @@ -2612,6 +2791,9 @@ "name": "Igor Aleixo" }, { + "name": "J. P. Lacerda" + }, + { "name": "Jefferson Gomes" }, { @@ -2621,10 +2803,10 @@ "name": "Jorno Jornade" }, { - "name": "Jose Bentivi" + "name": "jose" }, { - "name": "Jose Victor" + "name": "Jose Bentivi" }, { "name": "Jos\u00e9 Hild\u00eb" @@ -2663,6 +2845,9 @@ "name": "Lucas Zenaro Pereira Lima" }, { + "name": "mac.edgar" + }, + { "name": "magalidade" }, { @@ -2699,6 +2884,9 @@ "name": "Monstro Socialista" }, { + "name": "nerijunior" + }, + { "name": "Nicolas Auvray" }, { @@ -2761,15 +2949,18 @@ { "name": "yurids" } - ], - "LangName": "Portugu\u00eas (Brasil)" + ] }, { + "LangName": "Portugu\u00eas (Portugal)", "List": [ { "name": "Alexandre Arranhado" }, { + "name": "alfalb.as" + }, + { "name": "Andr\u00e9 Gomes" }, { @@ -2871,10 +3062,10 @@ { "name": "Tiago Martins" } - ], - "LangName": "Portugu\u00eas (Portugal)" + ] }, { + "LangName": "\u0420\u0443\u0441\u0441\u043a\u0438\u0439", "List": [ { "name": "_Arkan0ID_" @@ -2901,12 +3092,18 @@ "name": "Alexey Solodovnikov" }, { + "name": "Alp Arslan" + }, + { "name": "Andrew" }, { "name": "Anton Khabarov" }, { + "name": "anton.tsyganenko" + }, + { "name": "Armen Dzhagaryan" }, { @@ -2982,6 +3179,9 @@ "name": "John Smith" }, { + "name": "Kirill Ptukha" + }, + { "name": "Konstantin" }, { @@ -3021,9 +3221,6 @@ "name": "Oleg Ekhlakov" }, { - "name": "Olli Tviks" - }, - { "name": "Pavel Kyzmin" }, { @@ -3033,6 +3230,9 @@ "name": "Prince Moth" }, { + "name": "Roman M. Yagodin" + }, + { "name": "Rudeboy1988" }, { @@ -3048,6 +3248,9 @@ "name": "Stanislav G" }, { + "name": "under.quol" + }, + { "name": "utyf05" }, { @@ -3149,12 +3352,15 @@ { "name": "\u0427\u0443\u0432\u0430\u043a" } - ], - "LangName": "\u0420\u0443\u0441\u0441\u043a\u0438\u0439" + ] }, { + "LangName": "Sloven\u010dina", "List": [ { + "name": "Adam Furman" + }, + { "name": "Adri\u00e1n Chaves Fern\u00e1ndez" }, { @@ -3203,18 +3409,24 @@ "name": "Patrik Loch" }, { + "name": "Peto (wt-ts)" + }, + { "name": "Radovan Stancel" }, { + "name": "Roman 'Kaktuxista' Benji" + }, + { "name": "Roman Be\u0148o" }, { "name": "SuroX" } - ], - "LangName": "Sloven\u010dina" + ] }, { + "LangName": "Svenska", "List": [ { "name": "13975" @@ -3238,6 +3450,9 @@ "name": "Felix H\u00e4uslmann" }, { + "name": "Henrik Mattsson-M\u00e5rn" + }, + { "name": "Jacob Carlsson" }, { @@ -3262,6 +3477,9 @@ "name": "Marco tom Suden" }, { + "name": "Mattias M\u00fcnster" + }, + { "name": "Nicolas Auvray" }, { @@ -3285,10 +3503,10 @@ { "name": "Ulrika Uddeborg" } - ], - "LangName": "Svenska" + ] }, { + "LangName": "T\u00fcrk\u00e7e", "List": [ { "name": "61stylo" @@ -3315,9 +3533,6 @@ "name": "ArmanH" }, { - "name": "Ata Atatan\u0131r" - }, - { "name": "Atakan Kara\u00e7engel" }, { @@ -3348,6 +3563,9 @@ "name": "Ege Arda An\u0131lan" }, { + "name": "Emir \u00d6ks\u00fcz" + }, + { "name": "Emre AYTA\u00c7" }, { @@ -3384,6 +3602,12 @@ "name": "Furkan \u00c7evik" }, { + "name": "Gokhan\" Colpan" + }, + { + "name": "G\u00fcnay Y\u0131lmaz" + }, + { "name": "Hasan Baran K\u0131rm\u0131z\u0131" }, { @@ -3450,6 +3674,9 @@ "name": "reprezalio" }, { + "name": "Rwe ass" + }, + { "name": "R\u0131za Han Y\u0131lmaz" }, { @@ -3480,13 +3707,13 @@ "name": "Taha Karado\u011fan" }, { - "name": "TurkishPower" + "name": "Tayfun Toprakc\u0131o\u011flu" }, { - "name": "Tu\u011fberk Korkut" + "name": "TurkishPower" }, { - "name": "Typhoon das" + "name": "Tu\u011fberk Korkut" }, { "name": "ubuntuki" @@ -3527,10 +3754,10 @@ { "name": "Yunus Emre \u00c7akmak" } - ], - "LangName": "T\u00fcrk\u00e7e" + ] }, { + "LangName": "\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430", "List": [ { "name": "Alexander Olkhovskiy" @@ -3554,6 +3781,9 @@ "name": "Dimaver" }, { + "name": "Dmytro Ryl'kov" + }, + { "name": "Igor Marchuk" }, { @@ -3607,10 +3837,8 @@ { "name": "\u042f\u0440\u043e\u0441\u043b\u0430\u0432 \u0421\u043c\u0443\u043a" } - ], - "LangName": "\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430" + ] } - ], - "Title": "Translators" + ] } Index: source/tools/i18n/creditTranslators.py =================================================================== --- source/tools/i18n/creditTranslators.py +++ source/tools/i18n/creditTranslators.py @@ -1,7 +1,7 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # -*- coding:utf-8 -*- # -# Copyright (C) 2018 Wildfire Games. +# Copyright (C) 2019 Wildfire Games. # This file is part of 0 A.D. # # 0 A.D. is free software: you can redistribute it and/or modify @@ -18,16 +18,17 @@ # along with 0 A.D. If not, see . """ -This file imports the translators credits located in the public mod GUI files and -runs through .po files to add possible new translators to it. -It only appends new people, so it is possible to manually add names in the credits -file and they won't be overwritten by running this script. +This file updates the translators credits located in the public mod GUI files, using +translators names from the .po files. -Translatable strings will be extracted from the generated file, so this should be ran -before updateTemplates.py. -""" +If translators change their names on Transifex, the script will remove the old names. +TODO: It should be possible to add people in the list manually, and protect them against +automatic deletion. This has not been needed so far. A possibility would be to add an +optional boolean entry to the dictionary containing the name. -from __future__ import absolute_import, division, print_function, unicode_literals +Translatable strings will be extracted from the generated file, so this should be run +once before updateTemplates.py. +""" import json, os, glob, re @@ -69,35 +70,17 @@ creditsLocation = 'binaries/data/mods/public/gui/credits/texts/translators.json' -# Load JSON data -creditsFile = open(root + creditsLocation) -JSONData = json.load(creditsFile) -creditsFile.close() - # This dictionnary will hold creditors lists for each language, indexed by code langsLists = {} # Create the new JSON data newJSONData = {'Title': 'Translators', 'Content': []} -# First get the already existing lists. If they correspond with some of the credited languages, -# add them to the new data after processing, else add them immediately. -# NB: All of this is quite inefficient -for element in JSONData['Content']: - if 'LangName' not in element or element['LangName'] not in langs.values(): - newJSONData['Content'].append(element) - continue - - for (langCode, langName) in langs.items(): - if element['LangName'] == langName: - langsLists[langCode] = element['List'] - break - -# Now actually go through the list of languages and search the .po files for people +# Now go through the list of languages and search the .po files for people # Prepare some regexes commentMatch = re.compile('#.*') -translatorMatch = re.compile('# ([\w\s]*)(?: <.*>)?, [0-9-]', re.UNICODE) +translatorMatch = re.compile('# ([^,<]*)(?: <.*>)?, [0-9,-]{4,9}') # Search for lang in langs.keys(): @@ -110,7 +93,6 @@ poFile = open(file.replace('\\', '/')) reached = False for line in poFile: - line = line.decode('utf8') if reached: if not commentMatch.match(line): break @@ -123,7 +105,7 @@ # Sort and remove duplicates # Sorting should ignore case to have a neat credits list - langsLists[lang] = sorted(set(langsLists[lang]), cmp=lambda x,y: cmp(x.lower(), y.lower())) + langsLists[lang] = sorted(set(langsLists[lang]), key=lambda s: s.lower()) # Now insert the new data into the new JSON file for (langCode, langList) in sorted(langsLists.items()):