使用 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'
这是我的解决方案,在性能方面还有很多需要改进的地方,但它确实有效。
输入是
- 某种语言的国家名称
- 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"
希望对您有所帮助!
我试图让我的用户按国家/地区搜索数据。用户将以他们的母语输入国家名称。 但是我的数据库只包含每个国家/地区的 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'
这是我的解决方案,在性能方面还有很多需要改进的地方,但它确实有效。 输入是
- 某种语言的国家名称
- 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"
希望对您有所帮助!