Несмотря на принятый ответ, насколько я могу судить, ни один из XML-файлов, лежащих в основе pycountry, не содержит способа сопоставления языков со странами. Он содержит списки языков и их изокоды, а также списки стран и их изокоды, а также другие полезные вещи, но не это.
Точно так же пакет Babel великолепен, но после некоторого поиска я не смог найти способ перечислить все языки для конкретной страны. Лучшее, что вы можете сделать, это «наиболее вероятный» язык: https://stackoverflow.com/a/22199367/202168
Так что пришлось брать самому...
import lxml.etree
import urllib.request
def get_territory_languages():
url = "https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/supplementalData.xml"
langxml = urllib.request.urlopen(url)
langtree = lxml.etree.XML(langxml.read())
territory_languages = {}
for t in langtree.find('territoryInfo').findall('territory'):
langs = {}
for l in t.findall('languagePopulation'):
langs[l.get('type')] = {
'percent': float(l.get('populationPercent')),
'official': bool(l.get('officialStatus'))
}
territory_languages[t.get('type')] = langs
return territory_languages
Вы, вероятно, захотите сохранить результат этого в файле, а не вызывать через Интернет каждый раз, когда вам это нужно.
Этот набор данных также содержит «неофициальные» языки, которые вы можете не включать, вот еще пример кода:
TERRITORY_LANGUAGES = get_territory_languages()
def get_official_locale_ids(country_code):
country_code = country_code.upper()
langs = TERRITORY_LANGUAGES[country_code].items()
# most widely-spoken first:
langs.sort(key=lambda l: l[1]['percent'], reverse=True)
return [
'{lang}_{terr}'.format(lang=lang, terr=country_code)
for lang, spec in langs if spec['official']
]
get_official_locale_ids('es')
>>> ['es_ES', 'ca_ES', 'gl_ES', 'eu_ES', 'ast_ES']
person
Anentropic
schedule
05.03.2014