使用 pycountry 和 gettext 将翻译后的国家名称转换为 alpha2

convert translated country-names to alpha2 with pycountry and gettext

我试图让我的用户按国家/地区搜索数据。用户将以他们的母语输入国家名称。 但是我的数据库只包含每个国家/地区的 alpha2 代码。

我目前的做法:

user_input = "France"
country_code = pycountry.countries.get(name=user_input).alpha2 # u'FR'

如果用户输入的是英文,则此方法工作正常。由于数据以用户首选语言显示,因此她也希望以她的首选语言搜索它。

通过将 gettext 与 pycountry 的语言环境一起使用,我能够以用户首选语言显示国家/地区名称:

# example for a German user
gettext.translation('iso3166', pycountry.LOCALES_DIR, languages=['de']).install()
country_code = 'FR'
country = _(pycountry.countries.get(alpha2=country_code).name) # 'Frankreich'

现在我正在寻找一种方法将用户输入的内容翻译回英语(假设没有拼写错误)并从中获取国家/地区代码:

user_input = "Frankreich"
translated_user_input = ??? # 'France'
country_code = pycountry.countries.get(name=translated_user_input).alpha2 # u'FR'

有没有好主意,如何实现这个?理想情况下仅使用 gettext 和 pycountry?

我找到了一个解决方案,它可能没有完全优化性能,但有效且不太难看:

user_input = "Frankreich"
country_code = ''.join([country.alpha2 for country in pycountry.countries if _(country.name) == user_input]) # u'FR'

这是我的解决方案,在性能方面还有很多需要改进的地方,但它确实有效。 输入是

  1. 某种语言的国家名称
  2. pycountry 中的语言标识符
import pycountry
import gettext

    def map_country_code(self, country_name, language):
        try:
            # todo:  when languages = en the program fails!
            # todo: this methode takes to much time, is it o(n2) have to think on a better system+
            if country_name is None:
                return None
            german = gettext.translation('iso3166', pycountry.LOCALES_DIR, languages=[language])
            german.install()
            _ = german.gettext
            for english_country in pycountry.countries:
                country_name = country_name.lower()
                german_country = _(english_country.name).lower()
                if german_country == country_name:
                    return english_country.alpha_3
        except Exception as e:
            self.log.error(e, exc_info=True)
            return False

似乎 gettext 没有本机支持 (!?) 来反转翻译(我真的希望我错了,这似乎是一个正常的功能)。

我的解决方案是创建一个新的 gettext 对象并切换翻译。所有翻译对象都在 ._catalog 词典中找到。所以我交换条目的密钥。

import pycountry
import gettext
import copy
eng_to_german = gettext.translation('iso3166', pycountry.LOCALES_DIR,languages=['de'])
eng_to_german.install()
german_to_eng = copy.copy(eng_to_german) #Make a copy
german_to_eng._catalog = {} #Remove the catalog

for key in eng_to_german._catalog.keys():
    german_to_eng._catalog[eng_to_german._catalog[key]] = key #replace the key with the entry and vice versa

#Verify
_ = german_to_eng.gettext
translated_string = _("Frankreich")
print(translated_string) #This should print "France"

希望对您有所帮助!