Python 将语言代码与该语言为官方语言或常用语言的国家/地区匹配

Python 将语言代码与该语言为官方语言或常用语言的国家/地区匹配,python,localization,country-codes,Python,Localization,Country Codes,是否有任何python库可以获取特定语言代码的国家/地区列表,这些国家/地区是官方语言还是常用语言 例如,“fr”的语言代码与29个法语为官方语言的国家以及8个常用法语的国家相关联。pycountry(严重)。您可以从。查找Babel软件包。对于每个支持的区域设置,它都有一个pickle文件。请参阅localedata模块中的list()函数,以获取所有区域设置的列表。然后编写一些代码将区域划分为(语言、国家)等 不过要小心 印度有。尽管有公认的答案,但据我所知,pycountry的xml文件中

是否有任何python库可以获取特定语言代码的国家/地区列表,这些国家/地区是官方语言还是常用语言


例如,“fr”的语言代码与29个法语为官方语言的国家以及8个常用法语的国家相关联。

pycountry(严重)。您可以从。

查找Babel软件包。对于每个支持的区域设置,它都有一个pickle文件。请参阅localedata模块中的list()函数,以获取所有区域设置的列表。然后编写一些代码将区域划分为(语言、国家)等

不过要小心


印度有。

尽管有公认的答案,但据我所知,pycountry的xml文件中没有一个包含将语言映射到国家的方法。它包含语言及其iso代码的列表,国家及其iso代码的列表,以及其他有用的东西,但不是这些

类似地,Babel软件包也很棒,但经过一段时间的挖掘,我找不到任何方法列出特定国家的所有语言。你能做的最好的事情就是使用“最有可能”的语言:

所以我必须自己去拿

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
您可能希望将结果存储在一个文件中,而不是在每次需要时通过web调用它

此数据集还包含“非官方”语言,您可能不想包含这些语言,下面是一些示例代码:

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']

按照@NoahSantacruz的要求,我将此作为一个单独的答案添加进来,以便更容易地获取它。至少自2017年以来,最简单的方法是:

babel.languages.get\u territory\u language\u info()


查看文档

我刚刚查看了它的文档,似乎您无法提供语言代码,并获得使用该语言的所有国家的列表可能值得再次检查——我之所以这么说,是因为我使用该软件包的目的类似(货币)——但我无法使用该接口。相反,我必须直接使用软件包中提供的五个XML数据库。使用
babel.languages.get_territory\u language\u info()
@rmat非常简单,一个软件包在六年内可以变得更容易使用:-)当然,这就是为什么我还高估了你的答案!你带来了一条体面的道路,只是让新来者走得更精确;)@嗯,你应该加上这个作为答案。这是迄今为止最简单的方法@诺哈桑塔克鲁斯完成;-)我无法访问提供的“xml”。你能不能给我一些关于如何下载的建议?看起来url已经改变了,我已经用新的url更新了答案(对于Python 3)