Сопоставьте код языка со странами, где этот язык является официальным или широко используемым языком.

Есть ли какая-нибудь библиотека Python для получения списка стран для определенного языкового кода, где он является официальным или широко используемым языком?

Например, языковой код «fr» связан с 29 странами, где французский язык является официальным, а также с 8 странами, где он широко используется.


person jack    schedule 21.04.2010    source источник


Ответы (5)


Пикантри (серьезно). Вы можете получить его из указатель пакетов.

person doug    schedule 21.04.2010
comment
Я только что просмотрел документацию по нему, и не похоже, что вы можете указать код языка и получить список всех стран, которые используют этот язык. - person a_m0d; 21.04.2010
comment
возможно, стоит проверить еще раз - причина, по которой я говорю это, заключается в том, что я использовал этот пакет для аналогичной цели (валюты) - но я не смог использовать интерфейс. Вместо этого мне пришлось работать напрямую с пятью базами данных XML, входящими в пакет. - person doug; 21.04.2010

Несмотря на принятый ответ, насколько я могу судить, ни один из 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
comment
Я не могу получить доступ к предоставленному xml. Не могли бы вы дать мне какие-либо предложения о том, как я могу скачать его? - person Nuzhdin Vladimir; 29.07.2020
comment
похоже, что URL-адрес изменился, я обновил ответ новым URL-адресом (и для Python 3) - person Anentropic; 29.07.2020

Ищите пакет Babel. У него есть файл рассола для каждой поддерживаемой локали. См. функцию list() в модуле localedata для получения списка ВСЕХ локалей. Затем напишите код для разделения локалей на (язык, страну) и т.д.

person John Machin    schedule 05.06.2010
comment
Очень просто использовать babel.languages.get_territory_language_info() - person Rmatt; 03.01.2017
comment
@Rmatt Удивительно, насколько проще стало пользоваться пакетом за шесть лет :-) - person John Machin; 04.01.2017
comment
Конечно, именно поэтому я также проголосовал за ваш ответ! Вы привели достойный путь, просто сделали его более точным для новичков ;) - person Rmatt; 06.01.2017
comment
@Rmatt, ты должен добавить это как ответ. Это самый простой способ! - person Noah Santacruz; 10.06.2021
comment
@NoahSantacruz готово ;-) - person Rmatt; 11.06.2021

По просьбе @NoahSantacruz я добавляю это как отдельный ответ, чтобы его было легче подобрать. По крайней мере, с 2017 года самый простой способ издалека:

babel.languages.get_territory_language_info()

См. документы http://babel.pocoo.org/en/latest/api/languages.html#babel.languages.get_territory_language_info

person Rmatt    schedule 11.06.2021

Посетите Ethnologue.

Будьте осторожны, хотя...

В Индии множество официальных языков.

person NinjaCat    schedule 23.07.2010