我正在为 iOS 应用程序编写服务器 API。作为初始化过程的一部分,应用程序应通过 API 调用将电话界面语言发送到服务器。
问题是 Apple 使用了一种叫做 IETF BCP 47 language identifier 的东西在其 NSLocale preferredLanguages
function .
返回值有不同的长度(例如[aa, ab, ace, ach, ada, ady, ae, af, afa, afh, agq, ...]
,我发现很很少有解析器可以将此代码转换为适当的语言标识符。
我想使用更常见的 ISO-639-2 three-letters language identifier ,无处不在,有多种语言的许多解析器,并且有标准的 3 字母语言表示。
如何将 IETF BCP 47 语言标识符转换为 ISO-639-2 三字母语言标识符,最好是在 Python 中?
最佳答案
BCP 47 标识符以 2 个字母的 ISO 639-1 或 3 个字母的 639-2、639-3 或 639-5 语言代码开头;查看RFC 5646 Syntax section :
Language-Tag = langtag ; normal language tags / privateuse ; private use tag / grandfathered ; grandfathered tags langtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse] language = 2*3ALPHA ; shortest ISO 639 code ["-" extlang] ; sometimes followed by ; extended language subtags / 4ALPHA ; or reserved for future use / 5*8ALPHA ; or registered language subtag
我不希望 Apple 使用 privateuse
或 grandfathered
形式,因此您可以假设您正在查看 ISO 639-1、ISO 639-2、此处为 ISO 639-3 或 ISO 639-5 语言代码。只需将 2 个字母的 ISO-639-1 代码映射到 3 个字母的 ISO 639-* 代码。
您可以使用 pycountry
package为此:
import pycountry
lang = pycountry.languages.get(alpha2=two_letter_code)
three_letter_code = lang.terminology
演示:
>>> import pycountry
>>> lang = pycountry.languages.get(alpha2='aa')
>>> lang.terminology
u'aar'
其中术语 形式是首选的 3 字母代码;还有一个引用书目表格,只有 22 个条目不同。参见 ISO 639-2 B and T codes .但是,该软件包不包含 ISO 639-5 中的条目;该列表在某些地方与 639-2 重叠和冲突,我认为 Apple 根本不使用此类代码。
关于python - 如何将 IETF BCP 47 语言标识符转换为 ISO-639-2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26085570/