【发布时间】:2015-12-16 01:35:28
【问题描述】:
我需要获取ISO 639-1 code,例如en-GB,并将其转换为ISO 639-2 code,例如eng。
我查看了以下库,但没有找到在其中任何一个库中执行该转换的记录方法:
我错过了什么吗?也就是说 - 这些库中的任何一个都可以做到这一点吗?
【问题讨论】:
我需要获取ISO 639-1 code,例如en-GB,并将其转换为ISO 639-2 code,例如eng。
我查看了以下库,但没有找到在其中任何一个库中执行该转换的记录方法:
我错过了什么吗?也就是说 - 这些库中的任何一个都可以做到这一点吗?
【问题讨论】:
您可以使用pycountry 来满足您的需求。请注意,如果您想要相反的情况(ISO 639-2 到 ISO 639-1),它可能并不总是有效,因为虽然应该始终存在从 ISO 639-1 语言代码到 ISO 639-2 的映射,但反过来是不保证。
import pycountry
code = 'en-GB'
# ISO 639-1 codes are always 2-letter codes, so you have to take
# the first two characters of the code
# This is a safer way to extract the country code from something
# like en-GB (thanks ivan_pozdeev)
lang_code = code[:code.index('-')] if '-' in code else code
lang = pycountry.languages.get(iso639_1_code=lang_code)
print("ISO 639-1 code: " + lang.iso639_1_code)
print("ISO 639-2 code: " + lang.iso639_2T_code)
print("ISO 639-3 code: " + lang.iso639_3_code)
上面应该打印出来:
ISO 639-1 code: en
ISO 639-2 code: eng
ISO 639-3 code: eng
【讨论】:
en-GB 作为“ISO 639- 1 个代码”,这让我认为整个字符串是有效的 ISO 639-1 代码,而不仅仅是字符串的前两个字母。这反过来就是为什么我认为我列出的库可能无法执行我需要的转换。现在开始阅读 BCP 47!
code[:code.index('-')] 提取第一部分似乎更可靠(因此,如果不是 2 个字母,代码会阻塞)。如果已经只有一个部分,它将无法正常工作。 code[:code.index('-')] if '-' in code else code 之类的东西适用于所有情况。
List of ISO 639-2 codes 在 Wikipedia 上有一个指定对应关系的表格。由于它不是 1-1 映射,因此并非总是可以进行转换。
您确实错过了一些东西 - 很可能使用您指定的库进行转换。
内置语言转换器(alpha2、alpha3b、alpha3t、名称、范围、 类型和打开字幕):
>>> language = babelfish.Language('por', 'BR') >>> language.alpha2 'pt' <...> >>> babelfish.Language.fromalpha3b('fre') <Language [fr]>
langcodes 专为不同的任务量身定制 - 识别和匹配语言,无论标准如何。因此,您可以提取与您的初始代码相关的所有代码 - 在不同程度上 - 但它不会告诉您它们属于哪些标准。
pycountry 与babelfish 类似,被the other answer 覆盖。
【讨论】: